diff --git a/муром_1.1.0.html b/муром_1.1.0.html
index e517d90..086307b 100644
--- a/муром_1.1.0.html
+++ b/муром_1.1.0.html
@@ -134,28 +134,23 @@ var модули = [
],
[
-"левая-область",
-"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDRgdC+0LfQtNCw0YLRjNCb0LXQstGD0Y7QntCx0LvQsNGB0YLRjCgpCiAgICB7CiAgICAgICAgdmFyINC70LXQstCw0Y/QntCx0LvQsNGB0YLRjCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgINC70LXQstCw0Y/QntCx0LvQsNGB0YLRjC5pZD0i0LvQtdCy0LDRjy3QvtCx0LvQsNGB0YLRjCI7CiAgICAgICAg0LvQtdCy0LDRj9Ce0LHQu9Cw0YHRgtGMLnN0eWxlLmNzc1RleHQgPSBgCiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgdG9wOiAwOwogICAgICAgICAgICBib3R0b206IDA7CiAgICAgICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYDsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKNC70LXQstCw0Y/QntCx0LvQsNGB0YLRjCk7CiAgICB9CiAgICDQvNGD0YDQvtC8LtGB0YLQsNGA0YIu0L/QvtC00L/QuNGB0LDRgtGMKNGB0L7Qt9C00LDRgtGM0JvQtdCy0YPRjtCe0LHQu9Cw0YHRgtGMKTsKfQo=",
-],
-
-[
-"правая-область",
-"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDRgdC+0LfQtNCw0YLRjNCf0YDQsNCy0YPRjtCe0LHQu9Cw0YHRgtGMKCkKICAgIHsKICAgICAgICB2YXIg0L7QsdC70LDRgdGC0YwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICDQvtCx0LvQsNGB0YLRjC5pZD0i0L/RgNCw0LLQsNGPLdC+0LHQu9Cw0YHRgtGMIjsKICAgICAgICDQvtCx0LvQsNGB0YLRjC5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIHJpZ2h0OiAwOwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIGJvdHRvbTogMDsKICAgICAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBgOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQo0L7QsdC70LDRgdGC0YwpOwogICAgfQogICAg0LzRg9GA0L7QvC7RgdGC0LDRgNGCLtC/0L7QtNC/0LjRgdCw0YLRjCjRgdC+0LfQtNCw0YLRjNCf0YDQsNCy0YPRjtCe0LHQu9Cw0YHRgtGMKTsKfQ==",
+"левая-правая-область",
+"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICAvLyDQm9C10LLQsNGPINC+0LHQu9Cw0YHRgtGMLgogICAgdmFyINC70L4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgINC70L4uaWQ9ItC70LXQstCw0Y8t0L7QsdC70LDRgdGC0YwiOwogICAg0LvQvi5zdHlsZS5jc3NUZXh0ID0KICAgICAgICAicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IDUwJTsiOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCjQu9C+KTsKICAgIAogICAgLy8g0J/RgNCw0LLQsNGPINC+0LHQu9Cw0YHRgtGMLgogICAgdmFyINC/0L4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgINC/0L4uaWQ9ItC/0YDQsNCy0LDRjy3QvtCx0LvQsNGB0YLRjCI7CiAgICDQv9C+LnN0eWxlLmNzc1RleHQgPQogICAgICAgICJwb3NpdGlvbjogZml4ZWQ7IHJpZ2h0OiAwOyB0b3A6IDA7IGJvdHRvbTogMDsgd2lkdGg6IDUwJTsiOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCjQv9C+KTsKfQ==",
],
[
"ace",
-"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LhBQ0UoKQogICAgewogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hamF4b3JnL2FjZS1idWlsZHMvYmxvYi9tYXN0ZXIvc3JjLW1pbi1ub2NvbmZsaWN0L2FjZS5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBvKG4pe3ZhciBpPWU7biYmKGVbbl18fChlW25dPXt9KSxpPWVbbl0pO2lmKCFpLmRlZmluZXx8IWkuZGVmaW5lLnBhY2thZ2VkKXQub3JpZ2luYWw9aS5kZWZpbmUsaS5kZWZpbmU9dCxpLmRlZmluZS5wYWNrYWdlZD0hMDtpZighaS5yZXF1aXJlfHwhaS5yZXF1aXJlLnBhY2thZ2VkKXIub3JpZ2luYWw9aS5yZXF1aXJlLGkucmVxdWlyZT1yLGkucmVxdWlyZS5wYWNrYWdlZD0hMH12YXIgQUNFX05BTUVTUEFDRSA9ICJhY2UiLGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTshZSYmdHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJihlPXdpbmRvdyk7aWYoIUFDRV9OQU1FU1BBQ0UmJnR5cGVvZiByZXF1aXJlanMhPSJ1bmRlZmluZWQiKXJldHVybjt2YXIgdD1mdW5jdGlvbihlLG4scil7aWYodHlwZW9mIGUhPSJzdHJpbmciKXt0Lm9yaWdpbmFsP3Qub3JpZ2luYWwuYXBwbHkodGhpcyxhcmd1bWVudHMpOihjb25zb2xlLmVycm9yKCJkcm9wcGluZyBtb2R1bGUgYmVjYXVzZSBkZWZpbmUgd2Fzbid0IGEgc3RyaW5nLiIpLGNvbnNvbGUudHJhY2UoKSk7cmV0dXJufWFyZ3VtZW50cy5sZW5ndGg9PTImJihyPW4pLHQubW9kdWxlc1tlXXx8KHQucGF5bG9hZHNbZV09cix0Lm1vZHVsZXNbZV09bnVsbCl9O3QubW9kdWxlcz17fSx0LnBheWxvYWRzPXt9O3ZhciBuPWZ1bmN0aW9uKGUsdCxuKXtpZih0eXBlb2YgdD09InN0cmluZyIpe3ZhciBpPXMoZSx0KTtpZihpIT11bmRlZmluZWQpcmV0dXJuIG4mJm4oKSxpfWVsc2UgaWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpPT09IltvYmplY3QgQXJyYXldIil7dmFyIG89W107Zm9yKHZhciB1PTAsYT10Lmxlbmd0aDt1PGE7Kyt1KXt2YXIgZj1zKGUsdFt1XSk7aWYoZj09dW5kZWZpbmVkJiZyLm9yaWdpbmFsKXJldHVybjtvLnB1c2goZil9cmV0dXJuIG4mJm4uYXBwbHkobnVsbCxvKXx8ITB9fSxyPWZ1bmN0aW9uKGUsdCl7dmFyIGk9bigiIixlLHQpO3JldHVybiBpPT11bmRlZmluZWQmJnIub3JpZ2luYWw/ci5vcmlnaW5hbC5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aX0saT1mdW5jdGlvbihlLHQpe2lmKHQuaW5kZXhPZigiISIpIT09LTEpe3ZhciBuPXQuc3BsaXQoIiEiKTtyZXR1cm4gaShlLG5bMF0pKyIhIitpKGUsblsxXSl9aWYodC5jaGFyQXQoMCk9PSIuIil7dmFyIHI9ZS5zcGxpdCgiLyIpLnNsaWNlKDAsLTEpLmpvaW4oIi8iKTt0PXIrIi8iK3Q7d2hpbGUodC5pbmRleE9mKCIuIikhPT0tMSYmcyE9dCl7dmFyIHM9dDt0PXQucmVwbGFjZSgvXC9cLlwvLywiLyIpLnJlcGxhY2UoL1teXC9dK1wvXC5cLlwvLywiIil9fXJldHVybiB0fSxzPWZ1bmN0aW9uKGUscil7cj1pKGUscik7dmFyIHM9dC5tb2R1bGVzW3JdO2lmKCFzKXtzPXQucGF5bG9hZHNbcl07aWYodHlwZW9mIHM9PSJmdW5jdGlvbiIpe3ZhciBvPXt9LHU9e2lkOnIsdXJpOiIiLGV4cG9ydHM6byxwYWNrYWdlZDohMH0sYT1mdW5jdGlvbihlLHQpe3JldHVybiBuKHIsZSx0KX0sZj1zKGEsbyx1KTtvPWZ8fHUuZXhwb3J0cyx0Lm1vZHVsZXNbcl09byxkZWxldGUgdC5wYXlsb2Fkc1tyXX1zPXQubW9kdWxlc1tyXT1vfHxzfXJldHVybiBzfTtvKEFDRV9OQU1FU1BBQ0UpfSkoKSxhY2UuZGVmaW5lKCJhY2UvbGliL3JlZ2V4cCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXtyZXR1cm4oZS5nbG9iYWw/ImciOiIiKSsoZS5pZ25vcmVDYXNlPyJpIjoiIikrKGUubXVsdGlsaW5lPyJtIjoiIikrKGUuZXh0ZW5kZWQ/IngiOiIiKSsoZS5zdGlja3k/InkiOiIiKX1mdW5jdGlvbiB1KGUsdCxuKXtpZihBcnJheS5wcm90b3R5cGUuaW5kZXhPZilyZXR1cm4gZS5pbmRleE9mKHQsbik7Zm9yKHZhciByPW58fDA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXT09PXQpcmV0dXJuIHI7cmV0dXJuLTF9dmFyIHI9e2V4ZWM6UmVnRXhwLnByb3RvdHlwZS5leGVjLHRlc3Q6UmVnRXhwLnByb3RvdHlwZS50ZXN0LG1hdGNoOlN0cmluZy5wcm90b3R5cGUubWF0Y2gscmVwbGFjZTpTdHJpbmcucHJvdG90eXBlLnJlcGxhY2Usc3BsaXQ6U3RyaW5nLnByb3RvdHlwZS5zcGxpdH0saT1yLmV4ZWMuY2FsbCgvKCk/Py8sIiIpWzFdPT09dW5kZWZpbmVkLHM9ZnVuY3Rpb24oKXt2YXIgZT0vXi9nO3JldHVybiByLnRlc3QuY2FsbChlLCIiKSwhZS5sYXN0SW5kZXh9KCk7aWYocyYmaSlyZXR1cm47UmVnRXhwLnByb3RvdHlwZS5leGVjPWZ1bmN0aW9uKGUpe3ZhciB0PXIuZXhlYy5hcHBseSh0aGlzLGFyZ3VtZW50cyksbixhO2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmdCl7IWkmJnQubGVuZ3RoPjEmJnUodCwiIik+LTEmJihhPVJlZ0V4cCh0aGlzLnNvdXJjZSxyLnJlcGxhY2UuY2FsbChvKHRoaXMpLCJnIiwiIikpLHIucmVwbGFjZS5jYWxsKGUuc2xpY2UodC5pbmRleCksYSxmdW5jdGlvbigpe2Zvcih2YXIgZT0xO2U8YXJndW1lbnRzLmxlbmd0aC0yO2UrKylhcmd1bWVudHNbZV09PT11bmRlZmluZWQmJih0W2VdPXVuZGVmaW5lZCl9KSk7aWYodGhpcy5feHJlZ2V4cCYmdGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXMpZm9yKHZhciBmPTE7Zjx0Lmxlbmd0aDtmKyspbj10aGlzLl94cmVnZXhwLmNhcHR1cmVOYW1lc1tmLTFdLG4mJih0W25dPXRbZl0pOyFzJiZ0aGlzLmdsb2JhbCYmIXRbMF0ubGVuZ3RoJiZ0aGlzLmxhc3RJbmRleD50LmluZGV4JiZ0aGlzLmxhc3RJbmRleC0tfXJldHVybiB0fSxzfHwoUmVnRXhwLnByb3RvdHlwZS50ZXN0PWZ1bmN0aW9uKGUpe3ZhciB0PXIuZXhlYy5jYWxsKHRoaXMsZSk7cmV0dXJuIHQmJnRoaXMuZ2xvYmFsJiYhdFswXS5sZW5ndGgmJnRoaXMubGFzdEluZGV4PnQuaW5kZXgmJnRoaXMubGFzdEluZGV4LS0sISF0fSl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2VzNS1zaGltIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt9ZnVuY3Rpb24gdyhlKXt0cnl7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJzZW50aW5lbCIse30pLCJzZW50aW5lbCJpbiBlfWNhdGNoKHQpe319ZnVuY3Rpb24gSChlKXtyZXR1cm4gZT0rZSxlIT09ZT9lPTA6ZSE9PTAmJmUhPT0xLzAmJmUhPT0tMS8wJiYoZT0oZT4wfHwtMSkqTWF0aC5mbG9vcihNYXRoLmFicyhlKSkpLGV9ZnVuY3Rpb24gQihlKXt2YXIgdD10eXBlb2YgZTtyZXR1cm4gZT09PW51bGx8fHQ9PT0idW5kZWZpbmVkInx8dD09PSJib29sZWFuInx8dD09PSJudW1iZXIifHx0PT09InN0cmluZyJ9ZnVuY3Rpb24gaihlKXt2YXIgdCxuLHI7aWYoQihlKSlyZXR1cm4gZTtuPWUudmFsdWVPZjtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil7dD1uLmNhbGwoZSk7aWYoQih0KSlyZXR1cm4gdH1yPWUudG9TdHJpbmc7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3Q9ci5jYWxsKGUpO2lmKEIodCkpcmV0dXJuIHR9dGhyb3cgbmV3IFR5cGVFcnJvcn1GdW5jdGlvbi5wcm90b3R5cGUuYmluZHx8KEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7aWYodHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAiK24pO3ZhciBpPXUuY2FsbChhcmd1bWVudHMsMSkscz1mdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBzKXt2YXIgZT1uLmFwcGx5KHRoaXMsaS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKTtyZXR1cm4gT2JqZWN0KGUpPT09ZT9lOnRoaXN9cmV0dXJuIG4uYXBwbHkodCxpLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzKSkpfTtyZXR1cm4gbi5wcm90b3R5cGUmJihyLnByb3RvdHlwZT1uLnByb3RvdHlwZSxzLnByb3RvdHlwZT1uZXcgcixyLnByb3RvdHlwZT1udWxsKSxzfSk7dmFyIGk9RnVuY3Rpb24ucHJvdG90eXBlLmNhbGwscz1BcnJheS5wcm90b3R5cGUsbz1PYmplY3QucHJvdG90eXBlLHU9cy5zbGljZSxhPWkuYmluZChvLnRvU3RyaW5nKSxmPWkuYmluZChvLmhhc093blByb3BlcnR5KSxsLGMsaCxwLGQ7aWYoZD1mKG8sIl9fZGVmaW5lR2V0dGVyX18iKSlsPWkuYmluZChvLl9fZGVmaW5lR2V0dGVyX18pLGM9aS5iaW5kKG8uX19kZWZpbmVTZXR0ZXJfXyksaD1pLmJpbmQoby5fX2xvb2t1cEdldHRlcl9fKSxwPWkuYmluZChvLl9fbG9va3VwU2V0dGVyX18pO2lmKFsxLDJdLnNwbGljZSgwKS5sZW5ndGghPTIpaWYoIWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2YXIgdD1uZXcgQXJyYXkoZSsyKTtyZXR1cm4gdFswXT10WzFdPTAsdH12YXIgdD1bXSxuO3Quc3BsaWNlLmFwcGx5KHQsZSgyMCkpLHQuc3BsaWNlLmFwcGx5KHQsZSgyNikpLG49dC5sZW5ndGgsdC5zcGxpY2UoNSwwLCJYWFgiKSxuKzE9PXQubGVuZ3RoO2lmKG4rMT09dC5sZW5ndGgpcmV0dXJuITB9KCkpQXJyYXkucHJvdG90eXBlLnNwbGljZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMubGVuZ3RoO2U+MD9lPm4mJihlPW4pOmU9PXZvaWQgMD9lPTA6ZTwwJiYoZT1NYXRoLm1heChuK2UsMCkpLGUrdDxufHwodD1uLWUpO3ZhciByPXRoaXMuc2xpY2UoZSxlK3QpLGk9dS5jYWxsKGFyZ3VtZW50cywyKSxzPWkubGVuZ3RoO2lmKGU9PT1uKXMmJnRoaXMucHVzaC5hcHBseSh0aGlzLGkpO2Vsc2V7dmFyIG89TWF0aC5taW4odCxuLWUpLGE9ZStvLGY9YStzLW8sbD1uLWEsYz1uLW87aWYoZjxhKWZvcih2YXIgaD0wO2g8bDsrK2gpdGhpc1tmK2hdPXRoaXNbYStoXTtlbHNlIGlmKGY+YSlmb3IoaD1sO2gtLTspdGhpc1tmK2hdPXRoaXNbYStoXTtpZihzJiZlPT09Yyl0aGlzLmxlbmd0aD1jLHRoaXMucHVzaC5hcHBseSh0aGlzLGkpO2Vsc2V7dGhpcy5sZW5ndGg9YytzO2ZvcihoPTA7aDxzOysraCl0aGlzW2UraF09aVtoXX19cmV0dXJuIHJ9O2Vsc2V7dmFyIHY9QXJyYXkucHJvdG90eXBlLnNwbGljZTtBcnJheS5wcm90b3R5cGUuc3BsaWNlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/di5hcHBseSh0aGlzLFtlPT09dm9pZCAwPzA6ZSx0PT09dm9pZCAwP3RoaXMubGVuZ3RoLWU6dF0uY29uY2F0KHUuY2FsbChhcmd1bWVudHMsMikpKTpbXX19QXJyYXkuaXNBcnJheXx8KEFycmF5LmlzQXJyYXk9ZnVuY3Rpb24odCl7cmV0dXJuIGEodCk9PSJbb2JqZWN0IEFycmF5XSJ9KTt2YXIgbT1PYmplY3QoImEiKSxnPW1bMF0hPSJhInx8ISgwIGluIG0pO0FycmF5LnByb3RvdHlwZS5mb3JFYWNofHwoQXJyYXkucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1hcmd1bWVudHNbMV0scz0tMSxvPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3I7d2hpbGUoKytzPG8pcyBpbiByJiZ0LmNhbGwoaSxyW3NdLHMsbil9KSxBcnJheS5wcm90b3R5cGUubWFwfHwoQXJyYXkucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPUFycmF5KGkpLG89YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIHU9MDt1PGk7dSsrKXUgaW4gciYmKHNbdV09dC5jYWxsKG8sclt1XSx1LG4pKTtyZXR1cm4gc30pLEFycmF5LnByb3RvdHlwZS5maWx0ZXJ8fChBcnJheS5wcm90b3R5cGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9W10sbyx1PWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBmPTA7ZjxpO2YrKylmIGluIHImJihvPXJbZl0sdC5jYWxsKHUsbyxmLG4pJiZzLnB1c2gobykpO3JldHVybiBzfSksQXJyYXkucHJvdG90eXBlLmV2ZXJ5fHwoQXJyYXkucHJvdG90eXBlLmV2ZXJ5PWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIG89MDtvPGk7bysrKWlmKG8gaW4gciYmIXQuY2FsbChzLHJbb10sbyxuKSlyZXR1cm4hMTtyZXR1cm4hMH0pLEFycmF5LnByb3RvdHlwZS5zb21lfHwoQXJyYXkucHJvdG90eXBlLnNvbWU9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgbz0wO288aTtvKyspaWYobyBpbiByJiZ0LmNhbGwocyxyW29dLG8sbikpcmV0dXJuITA7cmV0dXJuITF9KSxBcnJheS5wcm90b3R5cGUucmVkdWNlfHwoQXJyYXkucHJvdG90eXBlLnJlZHVjZT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoIWkmJmFyZ3VtZW50cy5sZW5ndGg9PTEpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpO3ZhciBzPTAsbztpZihhcmd1bWVudHMubGVuZ3RoPj0yKW89YXJndW1lbnRzWzFdO2Vsc2UgZG97aWYocyBpbiByKXtvPXJbcysrXTticmVha31pZigrK3M+PWkpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfXdoaWxlKCEwKTtmb3IoO3M8aTtzKyspcyBpbiByJiYobz10LmNhbGwodm9pZCAwLG8scltzXSxzLG4pKTtyZXR1cm4gb30pLEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodHx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodD1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MDtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7aWYoIWkmJmFyZ3VtZW50cy5sZW5ndGg9PTEpdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIik7dmFyIHMsbz1pLTE7aWYoYXJndW1lbnRzLmxlbmd0aD49MilzPWFyZ3VtZW50c1sxXTtlbHNlIGRve2lmKG8gaW4gcil7cz1yW28tLV07YnJlYWt9aWYoLS1vPDApdGhyb3cgbmV3IFR5cGVFcnJvcigicmVkdWNlUmlnaHQgb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlIil9d2hpbGUoITApO2RvIG8gaW4gdGhpcyYmKHM9dC5jYWxsKHZvaWQgMCxzLHJbb10sbyxuKSk7d2hpbGUoby0tKTtyZXR1cm4gc30pO2lmKCFBcnJheS5wcm90b3R5cGUuaW5kZXhPZnx8WzAsMV0uaW5kZXhPZigxLDIpIT0tMSlBcnJheS5wcm90b3R5cGUuaW5kZXhPZj1mdW5jdGlvbih0KXt2YXIgbj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpGKHRoaXMpLHI9bi5sZW5ndGg+Pj4wO2lmKCFyKXJldHVybi0xO3ZhciBpPTA7YXJndW1lbnRzLmxlbmd0aD4xJiYoaT1IKGFyZ3VtZW50c1sxXSkpLGk9aT49MD9pOk1hdGgubWF4KDAscitpKTtmb3IoO2k8cjtpKyspaWYoaSBpbiBuJiZuW2ldPT09dClyZXR1cm4gaTtyZXR1cm4tMX07aWYoIUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZnx8WzAsMV0ubGFzdEluZGV4T2YoMCwtMykhPS0xKUFycmF5LnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0KXt2YXIgbj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpGKHRoaXMpLHI9bi5sZW5ndGg+Pj4wO2lmKCFyKXJldHVybi0xO3ZhciBpPXItMTthcmd1bWVudHMubGVuZ3RoPjEmJihpPU1hdGgubWluKGksSChhcmd1bWVudHNbMV0pKSksaT1pPj0wP2k6ci1NYXRoLmFicyhpKTtmb3IoO2k+PTA7aS0tKWlmKGkgaW4gbiYmdD09PW5baV0pcmV0dXJuIGk7cmV0dXJuLTF9O09iamVjdC5nZXRQcm90b3R5cGVPZnx8KE9iamVjdC5nZXRQcm90b3R5cGVPZj1mdW5jdGlvbih0KXtyZXR1cm4gdC5fX3Byb3RvX198fCh0LmNvbnN0cnVjdG9yP3QuY29uc3RydWN0b3IucHJvdG90eXBlOm8pfSk7aWYoIU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ipe3ZhciB5PSJPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIGNhbGxlZCBvbiBhIG5vbi1vYmplY3Q6ICI7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcj1mdW5jdGlvbih0LG4pe2lmKHR5cGVvZiB0IT0ib2JqZWN0IiYmdHlwZW9mIHQhPSJmdW5jdGlvbiJ8fHQ9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoeSt0KTtpZighZih0LG4pKXJldHVybjt2YXIgcixpLHM7cj17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9O2lmKGQpe3ZhciB1PXQuX19wcm90b19fO3QuX19wcm90b19fPW87dmFyIGk9aCh0LG4pLHM9cCh0LG4pO3QuX19wcm90b19fPXU7aWYoaXx8cylyZXR1cm4gaSYmKHIuZ2V0PWkpLHMmJihyLnNldD1zKSxyfXJldHVybiByLnZhbHVlPXRbbl0scn19T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmtleXModCl9KTtpZighT2JqZWN0LmNyZWF0ZSl7dmFyIGI7T2JqZWN0LnByb3RvdHlwZS5fX3Byb3RvX189PT1udWxsP2I9ZnVuY3Rpb24oKXtyZXR1cm57X19wcm90b19fOm51bGx9fTpiPWZ1bmN0aW9uKCl7dmFyIGU9e307Zm9yKHZhciB0IGluIGUpZVt0XT1udWxsO3JldHVybiBlLmNvbnN0cnVjdG9yPWUuaGFzT3duUHJvcGVydHk9ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZT1lLmlzUHJvdG90eXBlT2Y9ZS50b0xvY2FsZVN0cmluZz1lLnRvU3RyaW5nPWUudmFsdWVPZj1lLl9fcHJvdG9fXz1udWxsLGV9LE9iamVjdC5jcmVhdGU9ZnVuY3Rpb24odCxuKXt2YXIgcjtpZih0PT09bnVsbClyPWIoKTtlbHNle2lmKHR5cGVvZiB0IT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCJ0eXBlb2YgcHJvdG90eXBlWyIrdHlwZW9mIHQrIl0gIT0gJ29iamVjdCciKTt2YXIgaT1mdW5jdGlvbigpe307aS5wcm90b3R5cGU9dCxyPW5ldyBpLHIuX19wcm90b19fPXR9cmV0dXJuIG4hPT12b2lkIDAmJk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHIsbikscn19aWYoT2JqZWN0LmRlZmluZVByb3BlcnR5KXt2YXIgRT13KHt9KSxTPXR5cGVvZiBkb2N1bWVudD09InVuZGVmaW5lZCJ8fHcoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO2lmKCFFfHwhUyl2YXIgeD1PYmplY3QuZGVmaW5lUHJvcGVydHl9aWYoIU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8eCl7dmFyIFQ9IlByb3BlcnR5IGRlc2NyaXB0aW9uIG11c3QgYmUgYW4gb2JqZWN0OiAiLE49Ik9iamVjdC5kZWZpbmVQcm9wZXJ0eSBjYWxsZWQgb24gbm9uLW9iamVjdDogIixDPSJnZXR0ZXJzICYgc2V0dGVycyBjYW4gbm90IGJlIGRlZmluZWQgb24gdGhpcyBqYXZhc2NyaXB0IGVuZ2luZSI7T2JqZWN0LmRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKHQsbixyKXtpZih0eXBlb2YgdCE9Im9iamVjdCImJnR5cGVvZiB0IT0iZnVuY3Rpb24ifHx0PT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKE4rdCk7aWYodHlwZW9mIHIhPSJvYmplY3QiJiZ0eXBlb2YgciE9ImZ1bmN0aW9uInx8cj09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihUK3IpO2lmKHgpdHJ5e3JldHVybiB4LmNhbGwoT2JqZWN0LHQsbixyKX1jYXRjaChpKXt9aWYoZihyLCJ2YWx1ZSIpKWlmKGQmJihoKHQsbil8fHAodCxuKSkpe3ZhciBzPXQuX19wcm90b19fO3QuX19wcm90b19fPW8sZGVsZXRlIHRbbl0sdFtuXT1yLnZhbHVlLHQuX19wcm90b19fPXN9ZWxzZSB0W25dPXIudmFsdWU7ZWxzZXtpZighZCl0aHJvdyBuZXcgVHlwZUVycm9yKEMpO2YociwiZ2V0IikmJmwodCxuLHIuZ2V0KSxmKHIsInNldCIpJiZjKHQsbixyLnNldCl9cmV0dXJuIHR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzfHwoT2JqZWN0LmRlZmluZVByb3BlcnRpZXM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIHIgaW4gbilmKG4scikmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LHIsbltyXSk7cmV0dXJuIHR9KSxPYmplY3Quc2VhbHx8KE9iamVjdC5zZWFsPWZ1bmN0aW9uKHQpe3JldHVybiB0fSksT2JqZWN0LmZyZWV6ZXx8KE9iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KTt0cnl7T2JqZWN0LmZyZWV6ZShmdW5jdGlvbigpe30pfWNhdGNoKGspe09iamVjdC5mcmVlemU9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uIj9uOnQobil9fShPYmplY3QuZnJlZXplKX1PYmplY3QucHJldmVudEV4dGVuc2lvbnN8fChPYmplY3QucHJldmVudEV4dGVuc2lvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHR9KSxPYmplY3QuaXNTZWFsZWR8fChPYmplY3QuaXNTZWFsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuITF9KSxPYmplY3QuaXNGcm96ZW58fChPYmplY3QuaXNGcm96ZW49ZnVuY3Rpb24odCl7cmV0dXJuITF9KSxPYmplY3QuaXNFeHRlbnNpYmxlfHwoT2JqZWN0LmlzRXh0ZW5zaWJsZT1mdW5jdGlvbih0KXtpZihPYmplY3QodCk9PT10KXRocm93IG5ldyBUeXBlRXJyb3I7dmFyIG49IiI7d2hpbGUoZih0LG4pKW4rPSI/Ijt0W25dPSEwO3ZhciByPWYodCxuKTtyZXR1cm4gZGVsZXRlIHRbbl0scn0pO2lmKCFPYmplY3Qua2V5cyl7dmFyIEw9ITAsQT1bInRvU3RyaW5nIiwidG9Mb2NhbGVTdHJpbmciLCJ2YWx1ZU9mIiwiaGFzT3duUHJvcGVydHkiLCJpc1Byb3RvdHlwZU9mIiwicHJvcGVydHlJc0VudW1lcmFibGUiLCJjb25zdHJ1Y3RvciJdLE89QS5sZW5ndGg7Zm9yKHZhciBNIGlue3RvU3RyaW5nOm51bGx9KUw9ITE7T2JqZWN0LmtleXM9ZnVuY3Rpb24gSShlKXtpZih0eXBlb2YgZSE9Im9iamVjdCImJnR5cGVvZiBlIT0iZnVuY3Rpb24ifHxlPT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3Qua2V5cyBjYWxsZWQgb24gYSBub24tb2JqZWN0Iik7dmFyIEk9W107Zm9yKHZhciB0IGluIGUpZihlLHQpJiZJLnB1c2godCk7aWYoTClmb3IodmFyIG49MCxyPU87bjxyO24rKyl7dmFyIGk9QVtuXTtmKGUsaSkmJkkucHVzaChpKX1yZXR1cm4gSX19RGF0ZS5ub3d8fChEYXRlLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSk7dmFyIF89Iglcblx4MGJcZlxyIFx1MDBhMFx1MTY4MFx1MTgwZVx1MjAwMFx1MjAwMVx1MjAwMlx1MjAwM1x1MjAwNFx1MjAwNVx1MjAwNlx1MjAwN1x1MjAwOFx1MjAwOVx1MjAwYVx1MjAyZlx1MjA1Zlx1MzAwMFx1MjAyOFx1MjAyOVx1ZmVmZiI7aWYoIVN0cmluZy5wcm90b3R5cGUudHJpbXx8Xy50cmltKCkpe189IlsiK18rIl0iO3ZhciBEPW5ldyBSZWdFeHAoIl4iK18rXysiKiIpLFA9bmV3IFJlZ0V4cChfK18rIiokIik7U3RyaW5nLnByb3RvdHlwZS50cmltPWZ1bmN0aW9uKCl7cmV0dXJuIFN0cmluZyh0aGlzKS5yZXBsYWNlKEQsIiIpLnJlcGxhY2UoUCwiIil9fXZhciBGPWZ1bmN0aW9uKGUpe2lmKGU9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FuJ3QgY29udmVydCAiK2UrIiB0byBvYmplY3QiKTtyZXR1cm4gT2JqZWN0KGUpfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3JlZ2V4cCIsImFjZS9saWIvZXM1LXNoaW0iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vcmVnZXhwIiksZSgiLi9lczUtc2hpbSIpLHR5cGVvZiBFbGVtZW50IT0idW5kZWZpbmVkIiYmIUVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmUiLHtlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpfX0pfSksYWNlLmRlZmluZSgiYWNlL2xpYi91c2VyYWdlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuT1M9e0xJTlVYOiJMSU5VWCIsTUFDOiJNQUMiLFdJTkRPV1M6IldJTkRPV1MifSx0LmdldE9TPWZ1bmN0aW9uKCl7cmV0dXJuIHQuaXNNYWM/dC5PUy5NQUM6dC5pc0xpbnV4P3QuT1MuTElOVVg6dC5PUy5XSU5ET1dTfTt2YXIgcj10eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0Ij9uYXZpZ2F0b3I6e30saT0oL21hY3x3aW58bGludXgvaS5leGVjKHIucGxhdGZvcm0pfHxbIm90aGVyIl0pWzBdLnRvTG93ZXJDYXNlKCkscz1yLnVzZXJBZ2VudHx8IiIsbz1yLmFwcE5hbWV8fCIiO3QuaXNXaW49aT09IndpbiIsdC5pc01hYz1pPT0ibWFjIix0LmlzTGludXg9aT09ImxpbnV4Iix0LmlzSUU9bz09Ik1pY3Jvc29mdCBJbnRlcm5ldCBFeHBsb3JlciJ8fG8uaW5kZXhPZigiTVNBcHBIb3N0Iik+PTA/cGFyc2VGbG9hdCgocy5tYXRjaCgvKD86TVNJRSB8VHJpZGVudFwvWzAtOV0rW1wuMC05XSs7LipydjopKFswLTldK1tcLjAtOV0rKS8pfHxbXSlbMV0pOnBhcnNlRmxvYXQoKHMubWF0Y2goLyg/OlRyaWRlbnRcL1swLTldK1tcLjAtOV0rOy4qcnY6KShbMC05XStbXC4wLTldKykvKXx8W10pWzFdKSx0LmlzT2xkSUU9dC5pc0lFJiZ0LmlzSUU8OSx0LmlzR2Vja289dC5pc01vemlsbGE9cy5tYXRjaCgvIEdlY2tvXC9cZCsvKSx0LmlzT3BlcmE9dHlwZW9mIG9wZXJhPT0ib2JqZWN0IiYmT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHdpbmRvdy5vcGVyYSk9PSJbb2JqZWN0IE9wZXJhXSIsdC5pc1dlYktpdD1wYXJzZUZsb2F0KHMuc3BsaXQoIldlYktpdC8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzQ2hyb21lPXBhcnNlRmxvYXQocy5zcGxpdCgiIENocm9tZS8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzRWRnZT1wYXJzZUZsb2F0KHMuc3BsaXQoIiBFZGdlLyIpWzFdKXx8dW5kZWZpbmVkLHQuaXNBSVI9cy5pbmRleE9mKCJBZG9iZUFJUiIpPj0wLHQuaXNBbmRyb2lkPXMuaW5kZXhPZigiQW5kcm9pZCIpPj0wLHQuaXNDaHJvbWVPUz1zLmluZGV4T2YoIiBDck9TICIpPj0wLHQuaXNJT1M9L2lQYWR8aVBob25lfGlQb2QvLnRlc3QocykmJiF3aW5kb3cuTVNTdHJlYW0sdC5pc0lPUyYmKHQuaXNNYWM9ITApLHQuaXNNb2JpbGU9dC5pc0lPU3x8dC5pc0FuZHJvaWR9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2RvbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3VzZXJhZ2VudCIpLGk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiO3QuYnVpbGREb209ZnVuY3Rpb24gbyhlLHQsbil7aWYodHlwZW9mIGU9PSJzdHJpbmciJiZlKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKTtyZXR1cm4gdCYmdC5hcHBlbmRDaGlsZChyKSxyfWlmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiBlO2lmKHR5cGVvZiBlWzBdIT0ic3RyaW5nInx8IWVbMF0pe3ZhciBpPVtdO2Zvcih2YXIgcz0wO3M8ZS5sZW5ndGg7cysrKXt2YXIgdT1vKGVbc10sdCxuKTt1JiZpLnB1c2godSl9cmV0dXJuIGl9dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlWzBdKSxmPWVbMV0sbD0xO2YmJnR5cGVvZiBmPT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkoZikmJihsPTIpO2Zvcih2YXIgcz1sO3M8ZS5sZW5ndGg7cysrKW8oZVtzXSxhLG4pO3JldHVybiBsPT0yJiZPYmplY3Qua2V5cyhmKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWZbZV07ZT09PSJjbGFzcyI/YS5jbGFzc05hbWU9QXJyYXkuaXNBcnJheSh0KT90LmpvaW4oIiAiKTp0OnR5cGVvZiB0PT0iZnVuY3Rpb24ifHxlPT0idmFsdWUiP2FbZV09dDplPT09InJlZiI/biYmKG5bdF09YSk6dCE9bnVsbCYmYS5zZXRBdHRyaWJ1dGUoZSx0KX0pLHQmJnQuYXBwZW5kQ2hpbGQoYSksYX0sdC5nZXREb2N1bWVudEhlYWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fChlPWRvY3VtZW50KSxlLmhlYWR8fGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZS5kb2N1bWVudEVsZW1lbnR9LHQuY3JlYXRlRWxlbWVudD1mdW5jdGlvbihlLHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlM/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHR8fGksZSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKX0sdC5yZW1vdmVDaGlsZHJlbj1mdW5jdGlvbihlKXtlLmlubmVySFRNTD0iIn0sdC5jcmVhdGVUZXh0Tm9kZT1mdW5jdGlvbihlLHQpe3ZhciBuPXQ/dC5vd25lckRvY3VtZW50OmRvY3VtZW50O3JldHVybiBuLmNyZWF0ZVRleHROb2RlKGUpfSx0LmNyZWF0ZUZyYWdtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PWU/ZS5vd25lckRvY3VtZW50OmRvY3VtZW50O3JldHVybiB0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKX0sdC5oYXNDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPShlLmNsYXNzTmFtZSsiIikuc3BsaXQoL1xzKy9nKTtyZXR1cm4gbi5pbmRleE9mKHQpIT09LTF9LHQuYWRkQ3NzQ2xhc3M9ZnVuY3Rpb24oZSxuKXt0Lmhhc0Nzc0NsYXNzKGUsbil8fChlLmNsYXNzTmFtZSs9IiAiK24pfSx0LnJlbW92ZUNzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKTtmb3IoOzspe3ZhciByPW4uaW5kZXhPZih0KTtpZihyPT0tMSlicmVhaztuLnNwbGljZShyLDEpfWUuY2xhc3NOYW1lPW4uam9pbigiICIpfSx0LnRvZ2dsZUNzc0NsYXNzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jbGFzc05hbWUuc3BsaXQoL1xzKy9nKSxyPSEwO2Zvcig7Oyl7dmFyIGk9bi5pbmRleE9mKHQpO2lmKGk9PS0xKWJyZWFrO3I9ITEsbi5zcGxpY2UoaSwxKX1yZXR1cm4gciYmbi5wdXNoKHQpLGUuY2xhc3NOYW1lPW4uam9pbigiICIpLHJ9LHQuc2V0Q3NzQ2xhc3M9ZnVuY3Rpb24oZSxuLHIpe3I/dC5hZGRDc3NDbGFzcyhlLG4pOnQucmVtb3ZlQ3NzQ2xhc3MoZSxuKX0sdC5oYXNDc3NTdHJpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI7dD10fHxkb2N1bWVudDtpZihyPXQucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSl3aGlsZShuPHIubGVuZ3RoKWlmKHJbbisrXS5pZD09PWUpcmV0dXJuITB9LHQuaW1wb3J0Q3NzU3RyaW5nPWZ1bmN0aW9uKG4scixpKXt2YXIgcz1pO2lmKCFpfHwhaS5nZXRSb290Tm9kZSlzPWRvY3VtZW50O2Vsc2V7cz1pLmdldFJvb3ROb2RlKCk7aWYoIXN8fHM9PWkpcz1kb2N1bWVudH12YXIgbz1zLm93bmVyRG9jdW1lbnR8fHM7aWYociYmdC5oYXNDc3NTdHJpbmcocixzKSlyZXR1cm4gbnVsbDtyJiYobis9IlxuLyojIHNvdXJjZVVSTD1hY2UvY3NzLyIrcisiICovIik7dmFyIHU9dC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3UuYXBwZW5kQ2hpbGQoby5jcmVhdGVUZXh0Tm9kZShuKSksciYmKHUuaWQ9cikscz09byYmKHM9dC5nZXREb2N1bWVudEhlYWQobykpLHMuaW5zZXJ0QmVmb3JlKHUscy5maXJzdENoaWxkKX0sdC5pbXBvcnRDc3NTdHlsc2hlZXQ9ZnVuY3Rpb24oZSxuKXt0LmJ1aWxkRG9tKFsibGluayIse3JlbDoic3R5bGVzaGVldCIsaHJlZjplfV0sdC5nZXREb2N1bWVudEhlYWQobikpfSx0LnNjcm9sbGJhcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY3JlYXRlRWxlbWVudCgiYWNlX2lubmVyIik7bi5zdHlsZS53aWR0aD0iMTAwJSIsbi5zdHlsZS5taW5XaWR0aD0iMHB4IixuLnN0eWxlLmhlaWdodD0iMjAwcHgiLG4uc3R5bGUuZGlzcGxheT0iYmxvY2siO3ZhciByPXQuY3JlYXRlRWxlbWVudCgiYWNlX291dGVyIiksaT1yLnN0eWxlO2kucG9zaXRpb249ImFic29sdXRlIixpLmxlZnQ9Ii0xMDAwMHB4IixpLm92ZXJmbG93PSJoaWRkZW4iLGkud2lkdGg9IjIwMHB4IixpLm1pbldpZHRoPSIwcHgiLGkuaGVpZ2h0PSIxNTBweCIsaS5kaXNwbGF5PSJibG9jayIsci5hcHBlbmRDaGlsZChuKTt2YXIgcz1lLmRvY3VtZW50RWxlbWVudDtzLmFwcGVuZENoaWxkKHIpO3ZhciBvPW4ub2Zmc2V0V2lkdGg7aS5vdmVyZmxvdz0ic2Nyb2xsIjt2YXIgdT1uLm9mZnNldFdpZHRoO3JldHVybiBvPT11JiYodT1yLmNsaWVudFdpZHRoKSxzLnJlbW92ZUNoaWxkKHIpLG8tdX0sdHlwZW9mIGRvY3VtZW50PT0idW5kZWZpbmVkIiYmKHQuaW1wb3J0Q3NzU3RyaW5nPWZ1bmN0aW9uKCl7fSksdC5jb21wdXRlZFN0eWxlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsIiIpfHx7fX0sdC5zZXRTdHlsZT1mdW5jdGlvbihlLHQsbil7ZVt0XSE9PW4mJihlW3RdPW4pfSx0LkhBU19DU1NfQU5JTUFUSU9OPSExLHQuSEFTX0NTU19UUkFOU0ZPUk1TPSExLHQuSElfRFBJPXIuaXNXaW4/dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvdy5kZXZpY2VQaXhlbFJhdGlvPj0xLjU6ITA7aWYodHlwZW9mIGRvY3VtZW50IT0idW5kZWZpbmVkIil7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5ISV9EUEkmJnMuc3R5bGUudHJhbnNmb3JtIT09dW5kZWZpbmVkJiYodC5IQVNfQ1NTX1RSQU5TRk9STVM9ITApLCFyLmlzRWRnZSYmdHlwZW9mIHMuc3R5bGUuYW5pbWF0aW9uTmFtZSE9InVuZGVmaW5lZCImJih0LkhBU19DU1NfQU5JTUFUSU9OPSEwKSxzPW51bGx9dC5IQVNfQ1NTX1RSQU5TRk9STVM/dC50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2Uuc3R5bGUudHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitNYXRoLnJvdW5kKHQpKyJweCwgIitNYXRoLnJvdW5kKG4pKyJweCkifTp0LnRyYW5zbGF0ZT1mdW5jdGlvbihlLHQsbil7ZS5zdHlsZS50b3A9TWF0aC5yb3VuZChuKSsicHgiLGUuc3R5bGUubGVmdD1NYXRoLnJvdW5kKHQpKyJweCJ9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9vb3AiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuaW5oZXJpdHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfSx0Lm1peGluPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfSx0LmltcGxlbWVudD1mdW5jdGlvbihlLG4pe3QubWl4aW4oZSxuKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2tleXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9vb3AiKSxpPWZ1bmN0aW9uKCl7dmFyIGU9e01PRElGSUVSX0tFWVM6ezE2OiJTaGlmdCIsMTc6IkN0cmwiLDE4OiJBbHQiLDIyNDoiTWV0YSIsOTE6Ik1ldGFMZWZ0Iiw5MjoiTWV0YVJpZ2h0Iiw5MzoiQ29udGV4dE1lbnUifSxLRVlfTU9EUzp7Y3RybDoxLGFsdDoyLG9wdGlvbjoyLHNoaWZ0OjQsInN1cGVyIjo4LG1ldGE6OCxjb21tYW5kOjgsY21kOjh9LEZVTkNUSU9OX0tFWVM6ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMzoiUmV0dXJuIiwxOToiUGF1c2UiLDI3OiJFc2MiLDMyOiJTcGFjZSIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkxlZnQiLDM4OiJVcCIsMzk6IlJpZ2h0Iiw0MDoiRG93biIsNDQ6IlByaW50Iiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiw5NjoiTnVtcGFkMCIsOTc6Ik51bXBhZDEiLDk4OiJOdW1wYWQyIiw5OToiTnVtcGFkMyIsMTAwOiJOdW1wYWQ0IiwxMDE6Ik51bXBhZDUiLDEwMjoiTnVtcGFkNiIsMTAzOiJOdW1wYWQ3IiwxMDQ6Ik51bXBhZDgiLDEwNToiTnVtcGFkOSIsIi0xMyI6Ik51bXBhZEVudGVyIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bWxvY2siLDE0NToiU2Nyb2xsbG9jayJ9LFBSSU5UQUJMRV9LRVlTOnszMjoiICIsNDg6IjAiLDQ5OiIxIiw1MDoiMiIsNTE6IjMiLDUyOiI0Iiw1MzoiNSIsNTQ6IjYiLDU1OiI3Iiw1NjoiOCIsNTc6IjkiLDU5OiI7Iiw2MToiPSIsNjU6ImEiLDY2OiJiIiw2NzoiYyIsNjg6ImQiLDY5OiJlIiw3MDoiZiIsNzE6ImciLDcyOiJoIiw3MzoiaSIsNzQ6ImoiLDc1OiJrIiw3NjoibCIsNzc6Im0iLDc4OiJuIiw3OToibyIsODA6InAiLDgxOiJxIiw4MjoiciIsODM6InMiLDg0OiJ0Iiw4NToidSIsODY6InYiLDg3OiJ3Iiw4ODoieCIsODk6InkiLDkwOiJ6IiwxMDc6IisiLDEwOToiLSIsMTEwOiIuIiwxODY6IjsiLDE4NzoiPSIsMTg4OiIsIiwxODk6Ii0iLDE5MDoiLiIsMTkxOiIvIiwxOTI6ImAiLDIxOToiWyIsMjIwOiJcXCIsMjIxOiJdIiwyMjI6IiciLDExMToiLyIsMTA2OiIqIn19LHQsbjtmb3IobiBpbiBlLkZVTkNUSU9OX0tFWVMpdD1lLkZVTkNUSU9OX0tFWVNbbl0udG9Mb3dlckNhc2UoKSxlW3RdPXBhcnNlSW50KG4sMTApO2ZvcihuIGluIGUuUFJJTlRBQkxFX0tFWVMpdD1lLlBSSU5UQUJMRV9LRVlTW25dLnRvTG93ZXJDYXNlKCksZVt0XT1wYXJzZUludChuLDEwKTtyZXR1cm4gci5taXhpbihlLGUuTU9ESUZJRVJfS0VZUyksci5taXhpbihlLGUuUFJJTlRBQkxFX0tFWVMpLHIubWl4aW4oZSxlLkZVTkNUSU9OX0tFWVMpLGUuZW50ZXI9ZVsicmV0dXJuIl0sZS5lc2NhcGU9ZS5lc2MsZS5kZWw9ZVsiZGVsZXRlIl0sZVsxNzNdPSItIixmdW5jdGlvbigpe3ZhciB0PVsiY21kIiwiY3RybCIsImFsdCIsInNoaWZ0Il07Zm9yKHZhciBuPU1hdGgucG93KDIsdC5sZW5ndGgpO24tLTspZS5LRVlfTU9EU1tuXT10LmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gbiZlLktFWV9NT0RTW3RdfSkuam9pbigiLSIpKyItIn0oKSxlLktFWV9NT0RTWzBdPSIiLGUuS0VZX01PRFNbLTFdPSJpbnB1dC0iLGV9KCk7ci5taXhpbih0LGkpLHQua2V5Q29kZVRvU3RyaW5nPWZ1bmN0aW9uKGUpe3ZhciB0PWlbZV07cmV0dXJuIHR5cGVvZiB0IT0ic3RyaW5nIiYmKHQ9U3RyaW5nLmZyb21DaGFyQ29kZShlKSksdC50b0xvd2VyQ2FzZSgpfX0pLGFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYShlLHQsbil7dmFyIGE9dSh0KTtpZighaS5pc01hYyYmcyl7dC5nZXRNb2RpZmllclN0YXRlJiYodC5nZXRNb2RpZmllclN0YXRlKCJPUyIpfHx0LmdldE1vZGlmaWVyU3RhdGUoIldpbiIpKSYmKGF8PTgpO2lmKHMuYWx0R3Ipe2lmKCgzJmEpPT0zKXJldHVybjtzLmFsdEdyPTB9aWYobj09PTE4fHxuPT09MTcpe3ZhciBmPSJsb2NhdGlvbiJpbiB0P3QubG9jYXRpb246dC5rZXlMb2NhdGlvbjtpZihuPT09MTcmJmY9PT0xKXNbbl09PTEmJihvPXQudGltZVN0YW1wKTtlbHNlIGlmKG49PT0xOCYmYT09PTMmJmY9PT0yKXt2YXIgbD10LnRpbWVTdGFtcC1vO2w8NTAmJihzLmFsdEdyPSEwKX19fW4gaW4gci5NT0RJRklFUl9LRVlTJiYobj0tMSk7aWYoIWEmJm49PT0xMyl7dmFyIGY9ImxvY2F0aW9uImluIHQ/dC5sb2NhdGlvbjp0LmtleUxvY2F0aW9uO2lmKGY9PT0zKXtlKHQsYSwtbik7aWYodC5kZWZhdWx0UHJldmVudGVkKXJldHVybn19aWYoaS5pc0Nocm9tZU9TJiZhJjgpe2UodCxhLG4pO2lmKHQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47YSY9LTl9cmV0dXJuISFhfHxuIGluIHIuRlVOQ1RJT05fS0VZU3x8biBpbiByLlBSSU5UQUJMRV9LRVlTP2UodCxhLG4pOiExfWZ1bmN0aW9uIGYoKXtzPU9iamVjdC5jcmVhdGUobnVsbCl9dmFyIHI9ZSgiLi9rZXlzIiksaT1lKCIuL3VzZXJhZ2VudCIpLHM9bnVsbCxvPTA7dC5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQsbil7aWYoZS5hZGRFdmVudExpc3RlbmVyKXJldHVybiBlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKTtpZihlLmF0dGFjaEV2ZW50KXt2YXIgcj1mdW5jdGlvbigpe24uY2FsbChlLHdpbmRvdy5ldmVudCl9O24uX3dyYXBwZXI9cixlLmF0dGFjaEV2ZW50KCJvbiIrdCxyKX19LHQucmVtb3ZlTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKGUucmVtb3ZlRXZlbnRMaXN0ZW5lcilyZXR1cm4gZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMSk7ZS5kZXRhY2hFdmVudCYmZS5kZXRhY2hFdmVudCgib24iK3Qsbi5fd3JhcHBlcnx8bil9LHQuc3RvcEV2ZW50PWZ1bmN0aW9uKGUpe3JldHVybiB0LnN0b3BQcm9wYWdhdGlvbihlKSx0LnByZXZlbnREZWZhdWx0KGUpLCExfSx0LnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbihlKXtlLnN0b3BQcm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOmUuY2FuY2VsQnViYmxlPSEwfSx0LnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITF9LHQuZ2V0QnV0dG9uPWZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PSJkYmxjbGljayI/MDplLnR5cGU9PSJjb250ZXh0bWVudSJ8fGkuaXNNYWMmJmUuY3RybEtleSYmIWUuYWx0S2V5JiYhZS5zaGlmdEtleT8yOmUucHJldmVudERlZmF1bHQ/ZS5idXR0b246ezE6MCwyOjIsNDoxfVtlLmJ1dHRvbl19LHQuY2FwdHVyZT1mdW5jdGlvbihlLG4scil7ZnVuY3Rpb24gaShlKXtuJiZuKGUpLHImJnIoZSksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixuLCEwKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixpLCEwKSx0LnJlbW92ZUxpc3RlbmVyKGRvY3VtZW50LCJkcmFnc3RhcnQiLGksITApfXJldHVybiB0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZW1vdmUiLG4sITApLHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNldXAiLGksITApLHQuYWRkTGlzdGVuZXIoZG9jdW1lbnQsImRyYWdzdGFydCIsaSwhMCksaX0sdC5hZGRNb3VzZVdoZWVsTGlzdGVuZXI9ZnVuY3Rpb24oZSxuKXsib25tb3VzZXdoZWVsImluIGU/dC5hZGRMaXN0ZW5lcihlLCJtb3VzZXdoZWVsIixmdW5jdGlvbihlKXt2YXIgdD04O2Uud2hlZWxEZWx0YVghPT11bmRlZmluZWQ/KGUud2hlZWxYPS1lLndoZWVsRGVsdGFYL3QsZS53aGVlbFk9LWUud2hlZWxEZWx0YVkvdCk6KGUud2hlZWxYPTAsZS53aGVlbFk9LWUud2hlZWxEZWx0YS90KSxuKGUpfSk6Im9ud2hlZWwiaW4gZT90LmFkZExpc3RlbmVyKGUsIndoZWVsIixmdW5jdGlvbihlKXt2YXIgdD0uMzU7c3dpdGNoKGUuZGVsdGFNb2RlKXtjYXNlIGUuRE9NX0RFTFRBX1BJWEVMOmUud2hlZWxYPWUuZGVsdGFYKnR8fDAsZS53aGVlbFk9ZS5kZWx0YVkqdHx8MDticmVhaztjYXNlIGUuRE9NX0RFTFRBX0xJTkU6Y2FzZSBlLkRPTV9ERUxUQV9QQUdFOmUud2hlZWxYPShlLmRlbHRhWHx8MCkqNSxlLndoZWVsWT0oZS5kZWx0YVl8fDApKjV9bihlKX0pOnQuYWRkTGlzdGVuZXIoZSwiRE9NTW91c2VTY3JvbGwiLGZ1bmN0aW9uKGUpe2UuYXhpcyYmZS5heGlzPT1lLkhPUklaT05UQUxfQVhJUz8oZS53aGVlbFg9KGUuZGV0YWlsfHwwKSo1LGUud2hlZWxZPTApOihlLndoZWVsWD0wLGUud2hlZWxZPShlLmRldGFpbHx8MCkqNSksbihlKX0pfSx0LmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXI9ZnVuY3Rpb24oZSxuLHIscyl7ZnVuY3Rpb24gYyhlKXt0LmdldEJ1dHRvbihlKSE9PTA/bz0wOmUuZGV0YWlsPjE/KG8rKyxvPjQmJihvPTEpKTpvPTE7aWYoaS5pc0lFKXt2YXIgYz1NYXRoLmFicyhlLmNsaWVudFgtdSk+NXx8TWF0aC5hYnMoZS5jbGllbnRZLWEpPjU7aWYoIWZ8fGMpbz0xO2YmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LG5bby0xXXx8NjAwKSxvPT0xJiYodT1lLmNsaWVudFgsYT1lLmNsaWVudFkpfWUuX2NsaWNrcz1vLHJbc10oIm1vdXNlZG93biIsZSk7aWYobz40KW89MDtlbHNlIGlmKG8+MSlyZXR1cm4gcltzXShsW29dLGUpfWZ1bmN0aW9uIGgoZSl7bz0yLGYmJmNsZWFyVGltZW91dChmKSxmPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtmPW51bGx9LG5bby0xXXx8NjAwKSxyW3NdKCJtb3VzZWRvd24iLGUpLHJbc10obFtvXSxlKX12YXIgbz0wLHUsYSxmLGw9ezI6ImRibGNsaWNrIiwzOiJ0cmlwbGVjbGljayIsNDoicXVhZGNsaWNrIn07QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKSxlLmZvckVhY2goZnVuY3Rpb24oZSl7dC5hZGRMaXN0ZW5lcihlLCJtb3VzZWRvd24iLGMpLGkuaXNPbGRJRSYmdC5hZGRMaXN0ZW5lcihlLCJkYmxjbGljayIsaCl9KX07dmFyIHU9IWkuaXNNYWN8fCFpLmlzT3BlcmF8fCJLZXlib2FyZEV2ZW50ImluIHdpbmRvdz9mdW5jdGlvbihlKXtyZXR1cm4gMHwoZS5jdHJsS2V5PzE6MCl8KGUuYWx0S2V5PzI6MCl8KGUuc2hpZnRLZXk/NDowKXwoZS5tZXRhS2V5Pzg6MCl9OmZ1bmN0aW9uKGUpe3JldHVybiAwfChlLm1ldGFLZXk/MTowKXwoZS5hbHRLZXk/MjowKXwoZS5zaGlmdEtleT80OjApfChlLmN0cmxLZXk/ODowKX07dC5nZXRNb2RpZmllclN0cmluZz1mdW5jdGlvbihlKXtyZXR1cm4gci5LRVlfTU9EU1t1KGUpXX0sdC5hZGRDb21tYW5kS2V5TGlzdGVuZXI9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmFkZExpc3RlbmVyO2lmKGkuaXNPbGRHZWNrb3x8aS5pc09wZXJhJiYhKCJLZXlib2FyZEV2ZW50ImluIHdpbmRvdykpe3ZhciBvPW51bGw7cihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtvPWUua2V5Q29kZX0pLHIoZSwia2V5cHJlc3MiLGZ1bmN0aW9uKGUpe3JldHVybiBhKG4sZSxvKX0pfWVsc2V7dmFyIHU9bnVsbDtyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe3NbZS5rZXlDb2RlXT0oc1tlLmtleUNvZGVdfHwwKSsxO3ZhciB0PWEobixlLGUua2V5Q29kZSk7cmV0dXJuIHU9ZS5kZWZhdWx0UHJldmVudGVkLHR9KSxyKGUsImtleXByZXNzIixmdW5jdGlvbihlKXt1JiYoZS5jdHJsS2V5fHxlLmFsdEtleXx8ZS5zaGlmdEtleXx8ZS5tZXRhS2V5KSYmKHQuc3RvcEV2ZW50KGUpLHU9bnVsbCl9KSxyKGUsImtleXVwIixmdW5jdGlvbihlKXtzW2Uua2V5Q29kZV09bnVsbH0pLHN8fChmKCkscih3aW5kb3csImZvY3VzIixmKSl9fTtpZih0eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmd2luZG93LnBvc3RNZXNzYWdlJiYhaS5pc09sZElFKXt2YXIgbD0xO3QubmV4dFRpY2s9ZnVuY3Rpb24oZSxuKXtuPW58fHdpbmRvdzt2YXIgcj0iemVyby10aW1lb3V0LW1lc3NhZ2UtIitsKyssaT1mdW5jdGlvbihzKXtzLmRhdGE9PXImJih0LnN0b3BQcm9wYWdhdGlvbihzKSx0LnJlbW92ZUxpc3RlbmVyKG4sIm1lc3NhZ2UiLGkpLGUoKSl9O3QuYWRkTGlzdGVuZXIobiwibWVzc2FnZSIsaSksbi5wb3N0TWVzc2FnZShyLCIqIil9fXQuJGlkbGVCbG9ja2VkPSExLHQub25JZGxlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gcigpe3QuJGlkbGVCbG9ja2VkP3NldFRpbWVvdXQociwxMDApOmUoKX0sbil9LHQuJGlkbGVCbG9ja0lkPW51bGwsdC5ibG9ja0lkbGU9ZnVuY3Rpb24oZSl7dC4kaWRsZUJsb2NrSWQmJmNsZWFyVGltZW91dCh0LiRpZGxlQmxvY2tJZCksdC4kaWRsZUJsb2NrZWQ9ITAsdC4kaWRsZUJsb2NrSWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3QuJGlkbGVCbG9ja2VkPSExfSxlfHwxMDApfSx0Lm5leHRGcmFtZT10eXBlb2Ygd2luZG93PT0ib2JqZWN0IiYmKHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZXx8d2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUpLHQubmV4dEZyYW1lP3QubmV4dEZyYW1lPXQubmV4dEZyYW1lLmJpbmQod2luZG93KTp0Lm5leHRGcmFtZT1mdW5jdGlvbihlKXtzZXRUaW1lb3V0KGUsMTcpfX0pLGFjZS5kZWZpbmUoImFjZS9yYW5nZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yb3ctdC5yb3d8fGUuY29sdW1uLXQuY29sdW1ufSxpPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMuc3RhcnQ9e3JvdzplLGNvbHVtbjp0fSx0aGlzLmVuZD17cm93Om4sY29sdW1uOnJ9fTsoZnVuY3Rpb24oKXt0aGlzLmlzRXF1YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT09ZS5zdGFydC5yb3cmJnRoaXMuZW5kLnJvdz09PWUuZW5kLnJvdyYmdGhpcy5zdGFydC5jb2x1bW49PT1lLnN0YXJ0LmNvbHVtbiYmdGhpcy5lbmQuY29sdW1uPT09ZS5lbmQuY29sdW1ufSx0aGlzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIlJhbmdlOiBbIit0aGlzLnN0YXJ0LnJvdysiLyIrdGhpcy5zdGFydC5jb2x1bW4rIl0gLT4gWyIrdGhpcy5lbmQucm93KyIvIit0aGlzLmVuZC5jb2x1bW4rIl0ifSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wfSx0aGlzLmNvbXBhcmVSYW5nZT1mdW5jdGlvbihlKXt2YXIgdCxuPWUuZW5kLHI9ZS5zdGFydDtyZXR1cm4gdD10aGlzLmNvbXBhcmUobi5yb3csbi5jb2x1bW4pLHQ9PTE/KHQ9dGhpcy5jb21wYXJlKHIucm93LHIuY29sdW1uKSx0PT0xPzI6dD09MD8xOjApOnQ9PS0xPy0yOih0PXRoaXMuY29tcGFyZShyLnJvdyxyLmNvbHVtbiksdD09LTE/LTE6dD09MT80MjowKX0sdGhpcy5jb21wYXJlUG9pbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcGFyZShlLnJvdyxlLmNvbHVtbil9LHRoaXMuY29udGFpbnNSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jb21wYXJlUG9pbnQoZS5zdGFydCk9PTAmJnRoaXMuY29tcGFyZVBvaW50KGUuZW5kKT09MH0sdGhpcy5pbnRlcnNlY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29tcGFyZVJhbmdlKGUpO3JldHVybiB0PT0tMXx8dD09MHx8dD09MX0sdGhpcy5pc0VuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dH0sdGhpcy5pc1N0YXJ0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT1lJiZ0aGlzLnN0YXJ0LmNvbHVtbj09dH0sdGhpcy5zZXRTdGFydD1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ib2JqZWN0Ij8odGhpcy5zdGFydC5jb2x1bW49ZS5jb2x1bW4sdGhpcy5zdGFydC5yb3c9ZS5yb3cpOih0aGlzLnN0YXJ0LnJvdz1lLHRoaXMuc3RhcnQuY29sdW1uPXQpfSx0aGlzLnNldEVuZD1mdW5jdGlvbihlLHQpe3R5cGVvZiBlPT0ib2JqZWN0Ij8odGhpcy5lbmQuY29sdW1uPWUuY29sdW1uLHRoaXMuZW5kLnJvdz1lLnJvdyk6KHRoaXMuZW5kLnJvdz1lLHRoaXMuZW5kLmNvbHVtbj10KX0sdGhpcy5pbnNpZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc0VuZChlLHQpfHx0aGlzLmlzU3RhcnQoZSx0KT8hMTohMDohMX0sdGhpcy5pbnNpZGVTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzRW5kKGUsdCk/ITE6ITA6ITF9LHRoaXMuaW5zaWRlRW5kPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNTdGFydChlLHQpPyExOiEwOiExfSx0aGlzLmNvbXBhcmU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4hdGhpcy5pc011bHRpTGluZSgpJiZlPT09dGhpcy5zdGFydC5yb3c/dDx0aGlzLnN0YXJ0LmNvbHVtbj8tMTp0PnRoaXMuZW5kLmNvbHVtbj8xOjA6ZTx0aGlzLnN0YXJ0LnJvdz8tMTplPnRoaXMuZW5kLnJvdz8xOnRoaXMuc3RhcnQucm93PT09ZT90Pj10aGlzLnN0YXJ0LmNvbHVtbj8wOi0xOnRoaXMuZW5kLnJvdz09PWU/dDw9dGhpcy5lbmQuY29sdW1uPzA6MTowfSx0aGlzLmNvbXBhcmVTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXQ/LTE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY29tcGFyZUVuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVuZC5yb3c9PWUmJnRoaXMuZW5kLmNvbHVtbj09dD8xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNvbXBhcmVJbnNpZGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXQ/MTp0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXQ/LTE6dGhpcy5jb21wYXJlKGUsdCl9LHRoaXMuY2xpcFJvd3M9ZnVuY3Rpb24oZSx0KXtpZih0aGlzLmVuZC5yb3c+dCl2YXIgbj17cm93OnQrMSxjb2x1bW46MH07ZWxzZSBpZih0aGlzLmVuZC5yb3c8ZSl2YXIgbj17cm93OmUsY29sdW1uOjB9O2lmKHRoaXMuc3RhcnQucm93PnQpdmFyIHI9e3Jvdzp0KzEsY29sdW1uOjB9O2Vsc2UgaWYodGhpcy5zdGFydC5yb3c8ZSl2YXIgcj17cm93OmUsY29sdW1uOjB9O3JldHVybiBpLmZyb21Qb2ludHMocnx8dGhpcy5zdGFydCxufHx0aGlzLmVuZCl9LHRoaXMuZXh0ZW5kPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jb21wYXJlKGUsdCk7aWYobj09MClyZXR1cm4gdGhpcztpZihuPT0tMSl2YXIgcj17cm93OmUsY29sdW1uOnR9O2Vsc2UgdmFyIHM9e3JvdzplLGNvbHVtbjp0fTtyZXR1cm4gaS5mcm9tUG9pbnRzKHJ8fHRoaXMuc3RhcnQsc3x8dGhpcy5lbmQpfSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PT10aGlzLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT09dGhpcy5lbmQuY29sdW1ufSx0aGlzLmlzTXVsdGlMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQucm93IT09dGhpcy5lbmQucm93fSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIGkuZnJvbVBvaW50cyh0aGlzLnN0YXJ0LHRoaXMuZW5kKX0sdGhpcy5jb2xsYXBzZVJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbmQuY29sdW1uPT0wP25ldyBpKHRoaXMuc3RhcnQucm93LDAsTWF0aC5tYXgodGhpcy5zdGFydC5yb3csdGhpcy5lbmQucm93LTEpLDApOm5ldyBpKHRoaXMuc3RhcnQucm93LDAsdGhpcy5lbmQucm93LDApfSx0aGlzLnRvU2NyZWVuUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5zdGFydCksbj1lLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7cmV0dXJuIG5ldyBpKHQucm93LHQuY29sdW1uLG4ucm93LG4uY29sdW1uKX0sdGhpcy5tb3ZlQnk9ZnVuY3Rpb24oZSx0KXt0aGlzLnN0YXJ0LnJvdys9ZSx0aGlzLnN0YXJ0LmNvbHVtbis9dCx0aGlzLmVuZC5yb3crPWUsdGhpcy5lbmQuY29sdW1uKz10fX0pLmNhbGwoaS5wcm90b3R5cGUpLGkuZnJvbVBvaW50cz1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgaShlLnJvdyxlLmNvbHVtbix0LnJvdyx0LmNvbHVtbil9LGkuY29tcGFyZVBvaW50cz1yLGkuY29tcGFyZVBvaW50cz1mdW5jdGlvbihlLHQpe3JldHVybiBlLnJvdy10LnJvd3x8ZS5jb2x1bW4tdC5jb2x1bW59LHQuUmFuZ2U9aX0pLGFjZS5kZWZpbmUoImFjZS9saWIvbGFuZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5sYXN0PWZ1bmN0aW9uKGUpe3JldHVybiBlW2UubGVuZ3RoLTFdfSx0LnN0cmluZ1JldmVyc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoIiIpLnJldmVyc2UoKS5qb2luKCIiKX0sdC5zdHJpbmdSZXBlYXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iIjt3aGlsZSh0PjApe3QmMSYmKG4rPWUpO2lmKHQ+Pj0xKWUrPWV9cmV0dXJuIG59O3ZhciByPS9eXHNccyovLGk9L1xzXHMqJC87dC5zdHJpbmdUcmltTGVmdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHIsIiIpfSx0LnN0cmluZ1RyaW1SaWdodD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKGksIiIpfSx0LmNvcHlPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSx0LmNvcHlBcnJheT1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49MCxyPWUubGVuZ3RoO248cjtuKyspZVtuXSYmdHlwZW9mIGVbbl09PSJvYmplY3QiP3Rbbl09dGhpcy5jb3B5T2JqZWN0KGVbbl0pOnRbbl09ZVtuXTtyZXR1cm4gdH0sdC5kZWVwQ29weT1mdW5jdGlvbiBzKGUpe2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8IWUpcmV0dXJuIGU7dmFyIHQ7aWYoQXJyYXkuaXNBcnJheShlKSl7dD1bXTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W25dPXMoZVtuXSk7cmV0dXJuIHR9aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09IltvYmplY3QgT2JqZWN0XSIpcmV0dXJuIGU7dD17fTtmb3IodmFyIG4gaW4gZSl0W25dPXMoZVtuXSk7cmV0dXJuIHR9LHQuYXJyYXlUb01hcD1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0W2Vbbl1dPTE7cmV0dXJuIHR9LHQuY3JlYXRlTWFwPWZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSx0LmFycmF5UmVtb3ZlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTA7bjw9ZS5sZW5ndGg7bisrKXQ9PT1lW25dJiZlLnNwbGljZShuLDEpfSx0LmVzY2FwZVJlZ0V4cD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csIlxcJDEiKX0sdC5lc2NhcGVIVE1MPWZ1bmN0aW9uKGUpe3JldHVybigiIitlKS5yZXBsYWNlKC8mL2csIiYjMzg7IikucmVwbGFjZSgvIi9nLCImIzM0OyIpLnJlcGxhY2UoLycvZywiJiMzOTsiKS5yZXBsYWNlKC88L2csIiYjNjA7Iil9LHQuZ2V0TWF0Y2hPZmZzZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49W107cmV0dXJuIGUucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe24ucHVzaCh7b2Zmc2V0OmFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoLTJdLGxlbmd0aDplLmxlbmd0aH0pfSksbn0sdC5kZWZlcnJlZENhbGw9ZnVuY3Rpb24oZSl7dmFyIHQ9bnVsbCxuPWZ1bmN0aW9uKCl7dD1udWxsLGUoKX0scj1mdW5jdGlvbihlKXtyZXR1cm4gci5jYW5jZWwoKSx0PXNldFRpbWVvdXQobixlfHwwKSxyfTtyZXR1cm4gci5zY2hlZHVsZT1yLHIuY2FsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNhbmNlbCgpLGUoKSxyfSxyLmNhbmNlbD1mdW5jdGlvbigpe3JldHVybiBjbGVhclRpbWVvdXQodCksdD1udWxsLHJ9LHIuaXNQZW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LHJ9LHQuZGVsYXllZENhbGw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsLHI9ZnVuY3Rpb24oKXtuPW51bGwsZSgpfSxpPWZ1bmN0aW9uKGUpe249PW51bGwmJihuPXNldFRpbWVvdXQocixlfHx0KSl9O3JldHVybiBpLmRlbGF5PWZ1bmN0aW9uKGUpe24mJmNsZWFyVGltZW91dChuKSxuPXNldFRpbWVvdXQocixlfHx0KX0saS5zY2hlZHVsZT1pLGkuY2FsbD1mdW5jdGlvbigpe3RoaXMuY2FuY2VsKCksZSgpfSxpLmNhbmNlbD1mdW5jdGlvbigpe24mJmNsZWFyVGltZW91dChuKSxuPW51bGx9LGkuaXNQZW5kaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGl9fSksYWNlLmRlZmluZSgiYWNlL2NsaXBib2FyZCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI7bi5leHBvcnRzPXtsaW5lTW9kZTohMSxwYXN0ZUNhbmNlbGxlZDpmdW5jdGlvbigpe3JldHVybiByJiZyPkRhdGUubm93KCktNTA/ITA6cj0hMX0sY2FuY2VsOmZ1bmN0aW9uKCl7cj1EYXRlLm5vdygpfX19KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQvdGV4dGlucHV0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvY2xpcGJvYXJkIiwiYWNlL2xpYi9rZXlzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPWUoIi4uL2xpYi9kb20iKSxvPWUoIi4uL2xpYi9sYW5nIiksdT1lKCIuLi9jbGlwYm9hcmQiKSxhPWkuaXNDaHJvbWU8MTgsZj1pLmlzSUUsbD1pLmlzQ2hyb21lPjYzLGM9NDAwLGg9ZSgiLi4vbGliL2tleXMiKSxwPWguS0VZX01PRFMsZD1pLmlzSU9TLHY9ZD8vXHMvOi9cbi8sbT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHooKXtTPSEwLG4uYmx1cigpLG4uZm9jdXMoKSxTPSExfWZ1bmN0aW9uIFgoZSl7ZS5rZXlDb2RlPT0yNyYmbi52YWx1ZS5sZW5ndGg8bi5zZWxlY3Rpb25TdGFydCYmKHl8fCh4PW4udmFsdWUpLFQ9Tj0tMSxMKCkpLFcoKX1mdW5jdGlvbiAkKCl7Y2xlYXJUaW1lb3V0KFYpLFY9c2V0VGltZW91dChmdW5jdGlvbigpe3cmJihuLnN0eWxlLmNzc1RleHQ9dyx3PSIiKSx0LnJlbmRlcmVyLiRpc01vdXNlUHJlc3NlZD0hMSx0LnJlbmRlcmVyLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmdC5yZW5kZXJlci4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKX0sMCl9ZnVuY3Rpb24gSyhlLHQsbil7dmFyIHI9bnVsbCxpPSExO24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oZSl7ciYmY2xlYXJUaW1lb3V0KHIpLGk9ITB9LCEwKSxuLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIixmdW5jdGlvbihlKXtyPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPSExfSwxMDApfSwhMCk7dmFyIHM9ZnVuY3Rpb24oZSl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW4pcmV0dXJuO2lmKGl8fHl8fHQuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZClyZXR1cm47aWYobSlyZXR1cm47dmFyIHI9bi5zZWxlY3Rpb25TdGFydCxzPW4uc2VsZWN0aW9uRW5kLG89bnVsbCx1PTA7aWYocj09MClvPWgudXA7ZWxzZSBpZihyPT0xKW89aC5ob21lO2Vsc2UgaWYocz5OJiZ4W3NdPT0iXG4iKW89aC5lbmQ7ZWxzZSBpZihyPFQmJnhbci0xXT09IiAiKW89aC5sZWZ0LHU9cC5vcHRpb247ZWxzZSBpZihyPFR8fHI9PVQmJk4hPVQmJnI9PXMpbz1oLmxlZnQ7ZWxzZSBpZihzPk4mJnguc2xpY2UoMCxzKS5zcGxpdCgiXG4iKS5sZW5ndGg+MilvPWguZG93bjtlbHNlIGlmKHM+TiYmeFtzLTFdPT0iICIpbz1oLnJpZ2h0LHU9cC5vcHRpb247ZWxzZSBpZihzPk58fHM9PU4mJk4hPVQmJnI9PXMpbz1oLnJpZ2h0O3IhPT1zJiYodXw9cC5zaGlmdCk7aWYobyl7dmFyIGE9dC5vbkNvbW1hbmRLZXkoe30sdSxvKTtpZighYSYmdC5jb21tYW5kcyl7bz1oLmtleUNvZGVUb1N0cmluZyhvKTt2YXIgZj10LmNvbW1hbmRzLmZpbmRLZXlDb21tYW5kKHUsbyk7ZiYmdC5leGVjQ29tbWFuZChmKX1UPXIsTj1zLEwoIiIpfX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixzKSx0Lm9uKCJkZXN0cm95IixmdW5jdGlvbigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIscyl9KX12YXIgbj1zLmNyZWF0ZUVsZW1lbnQoInRleHRhcmVhIik7bi5jbGFzc05hbWU9ImFjZV90ZXh0LWlucHV0IixuLnNldEF0dHJpYnV0ZSgid3JhcCIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJhdXRvY29ycmVjdCIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsIm9mZiIpLG4uc2V0QXR0cmlidXRlKCJzcGVsbGNoZWNrIiwhMSksbi5zdHlsZS5vcGFjaXR5PSIwIixlLmluc2VydEJlZm9yZShuLGUuZmlyc3RDaGlsZCk7dmFyIG09ITEsZz0hMSx5PSExLGI9ITEsdz0iIjtpLmlzTW9iaWxlfHwobi5zdHlsZS5mb250U2l6ZT0iMXB4Iik7dmFyIEU9ITEsUz0hMSx4PSIiLFQ9MCxOPTA7dHJ5e3ZhciBDPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1ufWNhdGNoKGspe31yLmFkZExpc3RlbmVyKG4sImJsdXIiLGZ1bmN0aW9uKGUpe2lmKFMpcmV0dXJuO3Qub25CbHVyKGUpLEM9ITF9KSxyLmFkZExpc3RlbmVyKG4sImZvY3VzIixmdW5jdGlvbihlKXtpZihTKXJldHVybjtDPSEwO2lmKGkuaXNFZGdlKXRyeXtpZighZG9jdW1lbnQuaGFzRm9jdXMoKSlyZXR1cm59Y2F0Y2goZSl7fXQub25Gb2N1cyhlKSxpLmlzRWRnZT9zZXRUaW1lb3V0KEwpOkwoKX0pLHRoaXMuJGZvY3VzU2Nyb2xsPSExLHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXtpZih3fHxsfHx0aGlzLiRmb2N1c1Njcm9sbD09ImJyb3dzZXIiKXJldHVybiBuLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSk7dmFyIGU9bi5zdHlsZS50b3A7bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLG4uc3R5bGUudG9wPSIwcHgiO3RyeXt2YXIgdD1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCE9MH1jYXRjaChyKXtyZXR1cm59dmFyIGk9W107aWYodCl7dmFyIHM9bi5wYXJlbnRFbGVtZW50O3doaWxlKHMmJnMubm9kZVR5cGU9PTEpaS5wdXNoKHMpLHMuc2V0QXR0cmlidXRlKCJhY2Vfbm9jb250ZXh0IiwhMCksIXMucGFyZW50RWxlbWVudCYmcy5nZXRSb290Tm9kZT9zPXMuZ2V0Um9vdE5vZGUoKS5ob3N0OnM9cy5wYXJlbnRFbGVtZW50fW4uZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSx0JiZpLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5yZW1vdmVBdHRyaWJ1dGUoImFjZV9ub2NvbnRleHQiKX0pLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtuLnN0eWxlLnBvc2l0aW9uPSIiLG4uc3R5bGUudG9wPT0iMHB4IiYmKG4uc3R5bGUudG9wPWUpfSwwKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7bi5ibHVyKCl9LHRoaXMuaXNGb2N1c2VkPWZ1bmN0aW9uKCl7cmV0dXJuIEN9LHQub24oImJlZm9yZUVuZE9wZXJhdGlvbiIsZnVuY3Rpb24oKXtpZih0LmN1ck9wJiZ0LmN1ck9wLmNvbW1hbmQubmFtZT09Imluc2VydHN0cmluZyIpcmV0dXJuO3kmJih4PW4udmFsdWU9IiIsVSgpKSxMKCl9KTt2YXIgTD1kP2Z1bmN0aW9uKGUpe2lmKCFDfHxtJiYhZXx8YilyZXR1cm47ZXx8KGU9IiIpO3ZhciByPSJcbiBhYiIrZSsiY2RlIGZnXG4iO3IhPW4udmFsdWUmJihuLnZhbHVlPXg9cik7dmFyIGk9NCxzPTQrKGUubGVuZ3RofHwodC5zZWxlY3Rpb24uaXNFbXB0eSgpPzA6MSkpOyhUIT1pfHxOIT1zKSYmbi5zZXRTZWxlY3Rpb25SYW5nZShpLHMpLFQ9aSxOPXN9OmZ1bmN0aW9uKCl7aWYoeXx8YilyZXR1cm47aWYoIUMmJiFfKXJldHVybjt5PSEwO3ZhciBlPXQuc2VsZWN0aW9uLHI9ZS5nZXRSYW5nZSgpLGk9ZS5jdXJzb3Iucm93LHM9ci5zdGFydC5jb2x1bW4sbz1yLmVuZC5jb2x1bW4sdT10LnNlc3Npb24uZ2V0TGluZShpKTtpZihyLnN0YXJ0LnJvdyE9aSl7dmFyIGE9dC5zZXNzaW9uLmdldExpbmUoaS0xKTtzPXIuc3RhcnQucm93PGktMT8wOnMsbys9YS5sZW5ndGgrMSx1PWErIlxuIit1fWVsc2UgaWYoci5lbmQucm93IT1pKXt2YXIgZj10LnNlc3Npb24uZ2V0TGluZShpKzEpO289ci5lbmQucm93PmkrMT9mLmxlbmd0aDpvLG8rPXUubGVuZ3RoKzEsdT11KyJcbiIrZn11Lmxlbmd0aD5jJiYoczxjJiZvPGM/dT11LnNsaWNlKDAsYyk6KHU9IlxuIixzPTAsbz0xKSk7dmFyIGw9dSsiXG5cbiI7bCE9eCYmKG4udmFsdWU9eD1sLFQ9Tj1sLmxlbmd0aCksXyYmKFQ9bi5zZWxlY3Rpb25TdGFydCxOPW4uc2VsZWN0aW9uRW5kKTtpZihOIT1vfHxUIT1zfHxuLnNlbGVjdGlvbkVuZCE9Til0cnl7bi5zZXRTZWxlY3Rpb25SYW5nZShzLG8pLFQ9cyxOPW99Y2F0Y2goaCl7fXk9ITF9O0MmJnQub25Gb2N1cygpO3ZhciBBPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNlbGVjdGlvblN0YXJ0PT09MCYmZS5zZWxlY3Rpb25FbmQ+PXgubGVuZ3RoJiZlLnZhbHVlPT09eCYmeCYmZS5zZWxlY3Rpb25FbmQhPT1OfSxPPWZ1bmN0aW9uKGUpe2lmKHkpcmV0dXJuO20/bT0hMTpBKG4pJiYodC5zZWxlY3RBbGwoKSxMKCkpfSxNPW51bGw7dGhpcy5zZXRJbnB1dEhhbmRsZXI9ZnVuY3Rpb24oZSl7TT1lfSx0aGlzLmdldElucHV0SGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiBNfTt2YXIgXz0hMSxEPWZ1bmN0aW9uKGUscil7XyYmKF89ITEpO2lmKGcpcmV0dXJuIEwoKSxlJiZ0Lm9uUGFzdGUoZSksZz0hMSwiIjt2YXIgaT1uLnNlbGVjdGlvblN0YXJ0LHM9bi5zZWxlY3Rpb25FbmQsbz1ULHU9eC5sZW5ndGgtTixhPWUsZj1lLmxlbmd0aC1pLGw9ZS5sZW5ndGgtcyxjPTA7d2hpbGUobz4wJiZ4W2NdPT1lW2NdKWMrKyxvLS07YT1hLnNsaWNlKGMpLGM9MTt3aGlsZSh1PjAmJngubGVuZ3RoLWM+VC0xJiZ4W3gubGVuZ3RoLWNdPT1lW2UubGVuZ3RoLWNdKWMrKyx1LS07Zi09Yy0xLGwtPWMtMTt2YXIgaD1hLmxlbmd0aC1jKzE7cmV0dXJuIGg8MCYmKG89LWgsaD0wKSxhPWEuc2xpY2UoMCxoKSwhciYmZj09YS5sZW5ndGgmJiFvJiYhdSYmIWw/IiI6KGI9ITAsYSYmIW8mJiF1JiYhZiYmIWx8fEU/dC5vblRleHRJbnB1dChhKTp0Lm9uVGV4dElucHV0KGEse2V4dGVuZExlZnQ6byxleHRlbmRSaWdodDp1LHJlc3RvcmVTdGFydDpmLHJlc3RvcmVFbmQ6bH0pLGI9ITEseD1lLFQ9aSxOPXMsYSl9LFA9ZnVuY3Rpb24oZSl7aWYoeSlyZXR1cm4gUigpO2lmKGUmJmUuaW5wdXRUeXBlKXtpZihlLmlucHV0VHlwZT09Imhpc3RvcnlVbmRvIilyZXR1cm4gdC5leGVjQ29tbWFuZCgidW5kbyIpO2lmKGUuaW5wdXRUeXBlPT0iaGlzdG9yeVJlZG8iKXJldHVybiB0LmV4ZWNDb21tYW5kKCJyZWRvIil9dmFyIHI9bi52YWx1ZSxpPUQociwhMCk7KHIubGVuZ3RoPmMrMTAwfHx2LnRlc3QoaSkpJiZMKCl9LEg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY2xpcGJvYXJkRGF0YXx8d2luZG93LmNsaXBib2FyZERhdGE7aWYoIXJ8fGEpcmV0dXJuO3ZhciBpPWZ8fG4/IlRleHQiOiJ0ZXh0L3BsYWluIjt0cnl7cmV0dXJuIHQ/ci5zZXREYXRhKGksdCkhPT0hMTpyLmdldERhdGEoaSl9Y2F0Y2goZSl7aWYoIW4pcmV0dXJuIEgoZSx0LCEwKX19LEI9ZnVuY3Rpb24oZSxpKXt2YXIgcz10LmdldENvcHlUZXh0KCk7aWYoIXMpcmV0dXJuIHIucHJldmVudERlZmF1bHQoZSk7SChlLHMpPyhkJiYoTChzKSxtPXMsc2V0VGltZW91dChmdW5jdGlvbigpe209ITF9LDEwKSksaT90Lm9uQ3V0KCk6dC5vbkNvcHkoKSxyLnByZXZlbnREZWZhdWx0KGUpKToobT0hMCxuLnZhbHVlPXMsbi5zZWxlY3QoKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bT0hMSxMKCksaT90Lm9uQ3V0KCk6dC5vbkNvcHkoKX0pKX0saj1mdW5jdGlvbihlKXtCKGUsITApfSxGPWZ1bmN0aW9uKGUpe0IoZSwhMSl9LEk9ZnVuY3Rpb24oZSl7dmFyIHM9SChlKTtpZih1LnBhc3RlQ2FuY2VsbGVkKCkpcmV0dXJuO3R5cGVvZiBzPT0ic3RyaW5nIj8ocyYmdC5vblBhc3RlKHMsZSksaS5pc0lFJiZzZXRUaW1lb3V0KEwpLHIucHJldmVudERlZmF1bHQoZSkpOihuLnZhbHVlPSIiLGc9ITApfTtyLmFkZENvbW1hbmRLZXlMaXN0ZW5lcihuLHQub25Db21tYW5kS2V5LmJpbmQodCkpLHIuYWRkTGlzdGVuZXIobiwic2VsZWN0IixPKSxyLmFkZExpc3RlbmVyKG4sImlucHV0IixQKSxyLmFkZExpc3RlbmVyKG4sImN1dCIsaiksci5hZGRMaXN0ZW5lcihuLCJjb3B5IixGKSxyLmFkZExpc3RlbmVyKG4sInBhc3RlIixJKSwoISgib25jdXQiaW4gbil8fCEoIm9uY29weSJpbiBuKXx8ISgib25wYXN0ZSJpbiBuKSkmJnIuYWRkTGlzdGVuZXIoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7aWYoaS5pc01hYyYmIWUubWV0YUtleXx8IWUuY3RybEtleSlyZXR1cm47c3dpdGNoKGUua2V5Q29kZSl7Y2FzZSA2NzpGKGUpO2JyZWFrO2Nhc2UgODY6SShlKTticmVhaztjYXNlIDg4OmooZSl9fSk7dmFyIHE9ZnVuY3Rpb24oZSl7aWYoeXx8IXQub25Db21wb3NpdGlvblN0YXJ0fHx0LiRyZWFkT25seSlyZXR1cm47eT17fTtpZihFKXJldHVybjtzZXRUaW1lb3V0KFIsMCksdC5vbigibW91c2Vkb3duIix6KTt2YXIgcj10LmdldFNlbGVjdGlvblJhbmdlKCk7ci5lbmQucm93PXIuc3RhcnQucm93LHIuZW5kLmNvbHVtbj1yLnN0YXJ0LmNvbHVtbix5Lm1hcmtlclJhbmdlPXIseS5zZWxlY3Rpb25TdGFydD1ULHQub25Db21wb3NpdGlvblN0YXJ0KHkpLHkudXNlVGV4dGFyZWFGb3JJTUU/KG4udmFsdWU9IiIseD0iIixUPTAsTj0wKToobi5tc0dldElucHV0Q29udGV4dCYmKHkuY29udGV4dD1uLm1zR2V0SW5wdXRDb250ZXh0KCkpLG4uZ2V0SW5wdXRDb250ZXh0JiYoeS5jb250ZXh0PW4uZ2V0SW5wdXRDb250ZXh0KCkpKX0sUj1mdW5jdGlvbigpe2lmKCF5fHwhdC5vbkNvbXBvc2l0aW9uVXBkYXRlfHx0LiRyZWFkT25seSlyZXR1cm47aWYoRSlyZXR1cm4geigpO2lmKHkudXNlVGV4dGFyZWFGb3JJTUUpdC5vbkNvbXBvc2l0aW9uVXBkYXRlKG4udmFsdWUpO2Vsc2V7dmFyIGU9bi52YWx1ZTtEKGUpLHkubWFya2VyUmFuZ2UmJih5LmNvbnRleHQmJih5Lm1hcmtlclJhbmdlLnN0YXJ0LmNvbHVtbj15LnNlbGVjdGlvblN0YXJ0PXkuY29udGV4dC5jb21wb3NpdGlvblN0YXJ0T2Zmc2V0KSx5Lm1hcmtlclJhbmdlLmVuZC5jb2x1bW49eS5tYXJrZXJSYW5nZS5zdGFydC5jb2x1bW4rTi15LnNlbGVjdGlvblN0YXJ0KX19LFU9ZnVuY3Rpb24oZSl7aWYoIXQub25Db21wb3NpdGlvbkVuZHx8dC4kcmVhZE9ubHkpcmV0dXJuO3k9ITEsdC5vbkNvbXBvc2l0aW9uRW5kKCksdC5vZmYoIm1vdXNlZG93biIseiksZSYmUCgpfSxXPW8uZGVsYXllZENhbGwoUiw1MCkuc2NoZWR1bGUuYmluZChudWxsLG51bGwpO3IuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb25zdGFydCIscSksci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbnVwZGF0ZSIsUiksci5hZGRMaXN0ZW5lcihuLCJrZXl1cCIsWCksci5hZGRMaXN0ZW5lcihuLCJrZXlkb3duIixXKSxyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9uZW5kIixVKSx0aGlzLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sdGhpcy5zZXRDb21tYW5kTW9kZT1mdW5jdGlvbihlKXtFPWUsbi5yZWFkT25seT0hMX0sdGhpcy5zZXRSZWFkT25seT1mdW5jdGlvbihlKXtFfHwobi5yZWFkT25seT1lKX0sdGhpcy5zZXRDb3B5V2l0aEVtcHR5U2VsZWN0aW9uPWZ1bmN0aW9uKGUpe30sdGhpcy5vbkNvbnRleHRNZW51PWZ1bmN0aW9uKGUpe189ITAsTCgpLHQuX2VtaXQoIm5hdGl2ZWNvbnRleHRtZW51Iix7dGFyZ2V0OnQsZG9tRXZlbnQ6ZX0pLHRoaXMubW92ZVRvTW91c2UoZSwhMCl9LHRoaXMubW92ZVRvTW91c2U9ZnVuY3Rpb24oZSxvKXt3fHwodz1uLnN0eWxlLmNzc1RleHQpLG4uc3R5bGUuY3NzVGV4dD0obz8iei1pbmRleDoxMDAwMDA7IjoiIikrKGkuaXNJRT8ib3BhY2l0eTowLjE7IjoiIikrInRleHQtaW5kZW50OiAtIisoVCtOKSp0LnJlbmRlcmVyLmNoYXJhY3RlcldpZHRoKi41KyJweDsiO3ZhciB1PXQuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9cy5jb21wdXRlZFN0eWxlKHQuY29udGFpbmVyKSxmPXUudG9wKyhwYXJzZUludChhLmJvcmRlclRvcFdpZHRoKXx8MCksbD11LmxlZnQrKHBhcnNlSW50KHUuYm9yZGVyTGVmdFdpZHRoKXx8MCksYz11LmJvdHRvbS1mLW4uY2xpZW50SGVpZ2h0LTIsaD1mdW5jdGlvbihlKXtzLnRyYW5zbGF0ZShuLGUuY2xpZW50WC1sLTIsTWF0aC5taW4oZS5jbGllbnRZLWYtMixjKSl9O2goZSk7aWYoZS50eXBlIT0ibW91c2Vkb3duIilyZXR1cm47dC5yZW5kZXJlci4kaXNNb3VzZVByZXNzZWQ9ITAsY2xlYXJUaW1lb3V0KFYpLGkuaXNXaW4mJnIuY2FwdHVyZSh0LmNvbnRhaW5lcixoLCQpfSx0aGlzLm9uQ29udGV4dE1lbnVDbG9zZT0kO3ZhciBWLEo9ZnVuY3Rpb24oZSl7dC50ZXh0SW5wdXQub25Db250ZXh0TWVudShlKSwkKCl9O3IuYWRkTGlzdGVuZXIobiwibW91c2V1cCIsSiksci5hZGRMaXN0ZW5lcihuLCJtb3VzZWRvd24iLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKSwkKCl9KSxyLmFkZExpc3RlbmVyKHQucmVuZGVyZXIuc2Nyb2xsZXIsImNvbnRleHRtZW51IixKKSxyLmFkZExpc3RlbmVyKG4sImNvbnRleHRtZW51IixKKSxkJiZLKGUsdCxuKX07dC5UZXh0SW5wdXQ9bX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7ZS4kY2xpY2tTZWxlY3Rpb249bnVsbDt2YXIgdD1lLmVkaXRvcjt0LnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24uYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigiZGJsY2xpY2siLHRoaXMub25Eb3VibGVDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJ0cmlwbGVjbGljayIsdGhpcy5vblRyaXBsZUNsaWNrLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoInF1YWRjbGljayIsdGhpcy5vblF1YWRDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJtb3VzZXdoZWVsIix0aGlzLm9uTW91c2VXaGVlbC5iaW5kKGUpKTt2YXIgbj1bInNlbGVjdCIsInN0YXJ0U2VsZWN0Iiwic2VsZWN0RW5kIiwic2VsZWN0QWxsRW5kIiwic2VsZWN0QnlXb3Jkc0VuZCIsInNlbGVjdEJ5TGluZXNFbmQiLCJkcmFnV2FpdCIsImRyYWdXYWl0RW5kIiwiZm9jdXNXYWl0Il07bi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dGhpc1t0XX0sdGhpcyksZS5zZWxlY3RCeUxpbmVzPXRoaXMuZXh0ZW5kU2VsZWN0aW9uQnkuYmluZChlLCJnZXRMaW5lUmFuZ2UiKSxlLnNlbGVjdEJ5V29yZHM9dGhpcy5leHRlbmRTZWxlY3Rpb25CeS5iaW5kKGUsImdldFdvcmRSYW5nZSIpfWZ1bmN0aW9uIHUoZSx0LG4scil7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhuLWUsMikrTWF0aC5wb3coci10LDIpKX1mdW5jdGlvbiBhKGUsdCl7aWYoZS5zdGFydC5yb3c9PWUuZW5kLnJvdyl2YXIgbj0yKnQuY29sdW1uLWUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbjtlbHNlIGlmKGUuc3RhcnQucm93PT1lLmVuZC5yb3ctMSYmIWUuc3RhcnQuY29sdW1uJiYhZS5lbmQuY29sdW1uKXZhciBuPXQuY29sdW1uLTQ7ZWxzZSB2YXIgbj0yKnQucm93LWUuc3RhcnQucm93LWUuZW5kLnJvdztyZXR1cm4gbjwwP3tjdXJzb3I6ZS5zdGFydCxhbmNob3I6ZS5lbmR9OntjdXJzb3I6ZS5lbmQsYW5jaG9yOmUuc3RhcnR9fXZhciByPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxpPTAscz01NTA7KGZ1bmN0aW9uKCl7dGhpcy5vbk1vdXNlRG93bj1mdW5jdGlvbihlKXt2YXIgdD1lLmluU2VsZWN0aW9uKCksbj1lLmdldERvY3VtZW50UG9zaXRpb24oKTt0aGlzLm1vdXNlZG93bkV2ZW50PWU7dmFyIGk9dGhpcy5lZGl0b3Iscz1lLmdldEJ1dHRvbigpO2lmKHMhPT0wKXt2YXIgbz1pLmdldFNlbGVjdGlvblJhbmdlKCksdT1vLmlzRW1wdHkoKTsodXx8cz09MSkmJmkuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKG4pLHM9PTImJihpLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUuZG9tRXZlbnQpLHIuaXNNb3ppbGxhfHxlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybn10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU9RGF0ZS5ub3coKTtpZih0JiYhaS5pc0ZvY3VzZWQoKSl7aS5mb2N1cygpO2lmKHRoaXMuJGZvY3VzVGltZW91dCYmIXRoaXMuJGNsaWNrU2VsZWN0aW9uJiYhaS5pbk11bHRpU2VsZWN0TW9kZSl7dGhpcy5zZXRTdGF0ZSgiZm9jdXNXYWl0IiksdGhpcy5jYXB0dXJlTW91c2UoZSk7cmV0dXJufX1yZXR1cm4gdGhpcy5jYXB0dXJlTW91c2UoZSksdGhpcy5zdGFydFNlbGVjdChuLGUuZG9tRXZlbnQuX2NsaWNrcz4xKSxlLnByZXZlbnREZWZhdWx0KCl9LHRoaXMuc3RhcnRTZWxlY3Q9ZnVuY3Rpb24oZSx0KXtlPWV8fHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpO3ZhciBuPXRoaXMuZWRpdG9yO2lmKCF0aGlzLm1vdXNlZG93bkV2ZW50KXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50LmdldFNoaWZ0S2V5KCk/bi5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihlKTp0fHxuLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihlKSx0fHx0aGlzLnNlbGVjdCgpLG4ucmVuZGVyZXIuc2Nyb2xsZXIuc2V0Q2FwdHVyZSYmbi5yZW5kZXJlci5zY3JvbGxlci5zZXRDYXB0dXJlKCksbi5zZXRTdHlsZSgiYWNlX3NlbGVjdGluZyIpLHRoaXMuc2V0U3RhdGUoInNlbGVjdCIpfSx0aGlzLnNlbGVjdD1mdW5jdGlvbigpe3ZhciBlLHQ9dGhpcy5lZGl0b3Isbj10LnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpO2lmKHRoaXMuJGNsaWNrU2VsZWN0aW9uKXt2YXIgcj10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQobik7aWYocj09LTEpZT10aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ7ZWxzZSBpZihyPT0xKWU9dGhpcy4kY2xpY2tTZWxlY3Rpb24uc3RhcnQ7ZWxzZXt2YXIgaT1hKHRoaXMuJGNsaWNrU2VsZWN0aW9uLG4pO249aS5jdXJzb3IsZT1pLmFuY2hvcn10LnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25BbmNob3IoZS5yb3csZS5jb2x1bW4pfXQuc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24obiksdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpfSx0aGlzLmV4dGVuZFNlbGVjdGlvbkJ5PWZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5lZGl0b3Iscj1uLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMueCx0aGlzLnkpLGk9bi5zZWxlY3Rpb25bZV0oci5yb3csci5jb2x1bW4pO2lmKHRoaXMuJGNsaWNrU2VsZWN0aW9uKXt2YXIgcz10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQoaS5zdGFydCksbz10aGlzLiRjbGlja1NlbGVjdGlvbi5jb21wYXJlUG9pbnQoaS5lbmQpO2lmKHM9PS0xJiZvPD0wKXt0PXRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZDtpZihpLmVuZC5yb3chPXIucm93fHxpLmVuZC5jb2x1bW4hPXIuY29sdW1uKXI9aS5zdGFydH1lbHNlIGlmKG89PTEmJnM+PTApe3Q9dGhpcy4kY2xpY2tTZWxlY3Rpb24uc3RhcnQ7aWYoaS5zdGFydC5yb3chPXIucm93fHxpLnN0YXJ0LmNvbHVtbiE9ci5jb2x1bW4pcj1pLmVuZH1lbHNlIGlmKHM9PS0xJiZvPT0xKXI9aS5lbmQsdD1pLnN0YXJ0O2Vsc2V7dmFyIHU9YSh0aGlzLiRjbGlja1NlbGVjdGlvbixyKTtyPXUuY3Vyc29yLHQ9dS5hbmNob3J9bi5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKHQucm93LHQuY29sdW1uKX1uLnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKHIpLG4ucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKX0sdGhpcy5zZWxlY3RFbmQ9dGhpcy5zZWxlY3RBbGxFbmQ9dGhpcy5zZWxlY3RCeVdvcmRzRW5kPXRoaXMuc2VsZWN0QnlMaW5lc0VuZD1mdW5jdGlvbigpe3RoaXMuJGNsaWNrU2VsZWN0aW9uPW51bGwsdGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX3NlbGVjdGluZyIpLHRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcm9sbGVyLnJlbGVhc2VDYXB0dXJlJiZ0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JvbGxlci5yZWxlYXNlQ2FwdHVyZSgpfSx0aGlzLmZvY3VzV2FpdD1mdW5jdGlvbigpe3ZhciBlPXUodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KSx0PURhdGUubm93KCk7KGU+aXx8dC10aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU+dGhpcy4kZm9jdXNUaW1lb3V0KSYmdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSl9LHRoaXMub25Eb3VibGVDbGljaz1mdW5jdGlvbihlKXt2YXIgdD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxuPXRoaXMuZWRpdG9yLHI9bi5zZXNzaW9uLGk9ci5nZXRCcmFja2V0UmFuZ2UodCk7aT8oaS5pc0VtcHR5KCkmJihpLnN0YXJ0LmNvbHVtbi0tLGkuZW5kLmNvbHVtbisrKSx0aGlzLnNldFN0YXRlKCJzZWxlY3QiKSk6KGk9bi5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKHQucm93LHQuY29sdW1uKSx0aGlzLnNldFN0YXRlKCJzZWxlY3RCeVdvcmRzIikpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPWksdGhpcy5zZWxlY3QoKX0sdGhpcy5vblRyaXBsZUNsaWNrPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLG49dGhpcy5lZGl0b3I7dGhpcy5zZXRTdGF0ZSgic2VsZWN0QnlMaW5lcyIpO3ZhciByPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKTtyLmlzTXVsdGlMaW5lKCkmJnIuY29udGFpbnModC5yb3csdC5jb2x1bW4pPyh0aGlzLiRjbGlja1NlbGVjdGlvbj1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uoci5zdGFydC5yb3cpLHRoaXMuJGNsaWNrU2VsZWN0aW9uLmVuZD1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uoci5lbmQucm93KS5lbmQpOnRoaXMuJGNsaWNrU2VsZWN0aW9uPW4uc2VsZWN0aW9uLmdldExpbmVSYW5nZSh0LnJvdyksdGhpcy5zZWxlY3QoKX0sdGhpcy5vblF1YWRDbGljaz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvcjt0LnNlbGVjdEFsbCgpLHRoaXMuJGNsaWNrU2VsZWN0aW9uPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx0aGlzLnNldFN0YXRlKCJzZWxlY3RBbGwiKX0sdGhpcy5vbk1vdXNlV2hlZWw9ZnVuY3Rpb24oZSl7aWYoZS5nZXRBY2NlbEtleSgpKXJldHVybjtlLmdldFNoaWZ0S2V5KCkmJmUud2hlZWxZJiYhZS53aGVlbFgmJihlLndoZWVsWD1lLndoZWVsWSxlLndoZWVsWT0wKTt2YXIgdD10aGlzLmVkaXRvcjt0aGlzLiRsYXN0U2Nyb2xsfHwodGhpcy4kbGFzdFNjcm9sbD17dDowLHZ4OjAsdnk6MCxhbGxvd2VkOjB9KTt2YXIgbj10aGlzLiRsYXN0U2Nyb2xsLHI9ZS5kb21FdmVudC50aW1lU3RhbXAsaT1yLW4udCxvPWk/ZS53aGVlbFgvaTpuLnZ4LHU9aT9lLndoZWVsWS9pOm4udnk7aTxzJiYobz0obytuLnZ4KS8yLHU9KHUrbi52eSkvMik7dmFyIGE9TWF0aC5hYnMoby91KSxmPSExO2E+PTEmJnQucmVuZGVyZXIuaXNTY3JvbGxhYmxlQnkoZS53aGVlbFgqZS5zcGVlZCwwKSYmKGY9ITApLGE8PTEmJnQucmVuZGVyZXIuaXNTY3JvbGxhYmxlQnkoMCxlLndoZWVsWSplLnNwZWVkKSYmKGY9ITApO2lmKGYpbi5hbGxvd2VkPXI7ZWxzZSBpZihyLW4uYWxsb3dlZDxzKXt2YXIgbD1NYXRoLmFicyhvKTw9MS41Kk1hdGguYWJzKG4udngpJiZNYXRoLmFicyh1KTw9MS41Kk1hdGguYWJzKG4udnkpO2w/KGY9ITAsbi5hbGxvd2VkPXIpOm4uYWxsb3dlZD0wfW4udD1yLG4udng9byxuLnZ5PXU7aWYoZilyZXR1cm4gdC5yZW5kZXJlci5zY3JvbGxCeShlLndoZWVsWCplLnNwZWVkLGUud2hlZWxZKmUuc3BlZWQpLGUuc3RvcCgpfX0pLmNhbGwoby5wcm90b3R5cGUpLHQuRGVmYXVsdEhhbmRsZXJzPW99KSxhY2UuZGVmaW5lKCJhY2UvdG9vbHRpcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMoZSl7dGhpcy5pc09wZW49ITEsdGhpcy4kZWxlbWVudD1udWxsLHRoaXMuJHBhcmVudE5vZGU9ZX12YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpOyhmdW5jdGlvbigpe3RoaXMuJGluaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfdG9vbHRpcCIsdGhpcy4kZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLiRwYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMuJGVsZW1lbnQpLHRoaXMuJGVsZW1lbnR9LHRoaXMuZ2V0RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbGVtZW50fHx0aGlzLiRpbml0KCl9LHRoaXMuc2V0VGV4dD1mdW5jdGlvbihlKXt0aGlzLmdldEVsZW1lbnQoKS50ZXh0Q29udGVudD1lfSx0aGlzLnNldEh0bWw9ZnVuY3Rpb24oZSl7dGhpcy5nZXRFbGVtZW50KCkuaW5uZXJIVE1MPWV9LHRoaXMuc2V0UG9zaXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5sZWZ0PWUrInB4Iix0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS50b3A9dCsicHgifSx0aGlzLnNldENsYXNzTmFtZT1mdW5jdGlvbihlKXtpLmFkZENzc0NsYXNzKHRoaXMuZ2V0RWxlbWVudCgpLGUpfSx0aGlzLnNob3c9ZnVuY3Rpb24oZSx0LG4pe2UhPW51bGwmJnRoaXMuc2V0VGV4dChlKSx0IT1udWxsJiZuIT1udWxsJiZ0aGlzLnNldFBvc2l0aW9uKHQsbiksdGhpcy5pc09wZW58fCh0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5kaXNwbGF5PSJibG9jayIsdGhpcy5pc09wZW49ITApfSx0aGlzLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmlzT3BlbiYmKHRoaXMuZ2V0RWxlbWVudCgpLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuaXNPcGVuPSExKX0sdGhpcy5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRFbGVtZW50KCkub2Zmc2V0SGVpZ2h0fSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RWxlbWVudCgpLm9mZnNldFdpZHRofSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmlzT3Blbj0hMSx0aGlzLiRlbGVtZW50JiZ0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUmJnRoaXMuJGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLiRlbGVtZW50KX19KS5jYWxsKHMucHJvdG90eXBlKSx0LlRvb2x0aXA9c30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9kZWZhdWx0X2d1dHRlcl9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnQiLCJhY2UvdG9vbHRpcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlKXtmdW5jdGlvbiBsKCl7dmFyIHI9dS5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LHM9bi4kYW5ub3RhdGlvbnNbcl07aWYoIXMpcmV0dXJuIGMoKTt2YXIgbz10LnNlc3Npb24uZ2V0TGVuZ3RoKCk7aWYocj09byl7dmFyIGE9dC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMoMCx1LnkpLnJvdyxsPXUuJHBvcztpZihhPnQuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGwucm93LGwuY29sdW1uKSlyZXR1cm4gYygpfWlmKGY9PXMpcmV0dXJuO2Y9cy50ZXh0LmpvaW4oIjxici8+IiksaS5zZXRIdG1sKGYpLGkuc2hvdygpLHQuX3NpZ25hbCgic2hvd0d1dHRlclRvb2x0aXAiLGkpLHQub24oIm1vdXNld2hlZWwiLGMpO2lmKGUuJHRvb2x0aXBGb2xsb3dzTW91c2UpaCh1KTtlbHNle3ZhciBwPXUuZG9tRXZlbnQudGFyZ2V0LGQ9cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx2PWkuZ2V0RWxlbWVudCgpLnN0eWxlO3YubGVmdD1kLnJpZ2h0KyJweCIsdi50b3A9ZC5ib3R0b20rInB4In19ZnVuY3Rpb24gYygpe28mJihvPWNsZWFyVGltZW91dChvKSksZiYmKGkuaGlkZSgpLGY9bnVsbCx0Ll9zaWduYWwoImhpZGVHdXR0ZXJUb29sdGlwIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNld2hlZWwiLGMpKX1mdW5jdGlvbiBoKGUpe2kuc2V0UG9zaXRpb24oZS54LGUueSl9dmFyIHQ9ZS5lZGl0b3Isbj10LnJlbmRlcmVyLiRndXR0ZXJMYXllcixpPW5ldyBhKHQuY29udGFpbmVyKTtlLmVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVybW91c2Vkb3duIixmdW5jdGlvbihyKXtpZighdC5pc0ZvY3VzZWQoKXx8ci5nZXRCdXR0b24oKSE9MClyZXR1cm47dmFyIGk9bi5nZXRSZWdpb24ocik7aWYoaT09ImZvbGRXaWRnZXRzIilyZXR1cm47dmFyIHM9ci5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LG89dC5zZXNzaW9uLnNlbGVjdGlvbjtpZihyLmdldFNoaWZ0S2V5KCkpby5zZWxlY3RUbyhzLDApO2Vsc2V7aWYoci5kb21FdmVudC5kZXRhaWw9PTIpcmV0dXJuIHQuc2VsZWN0QWxsKCksci5wcmV2ZW50RGVmYXVsdCgpO2UuJGNsaWNrU2VsZWN0aW9uPXQuc2VsZWN0aW9uLmdldExpbmVSYW5nZShzKX1yZXR1cm4gZS5zZXRTdGF0ZSgic2VsZWN0QnlMaW5lcyIpLGUuY2FwdHVyZU1vdXNlKHIpLHIucHJldmVudERlZmF1bHQoKX0pO3ZhciBvLHUsZjtlLmVkaXRvci5zZXREZWZhdWx0SGFuZGxlcigiZ3V0dGVybW91c2Vtb3ZlIixmdW5jdGlvbih0KXt2YXIgbj10LmRvbUV2ZW50LnRhcmdldHx8dC5kb21FdmVudC5zcmNFbGVtZW50O2lmKHIuaGFzQ3NzQ2xhc3MobiwiYWNlX2ZvbGQtd2lkZ2V0IikpcmV0dXJuIGMoKTtmJiZlLiR0b29sdGlwRm9sbG93c01vdXNlJiZoKHQpLHU9dDtpZihvKXJldHVybjtvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsdSYmIWUuaXNNb3VzZVByZXNzZWQ/bCgpOmMoKX0sNTApfSkscy5hZGRMaXN0ZW5lcih0LnJlbmRlcmVyLiRndXR0ZXIsIm1vdXNlb3V0IixmdW5jdGlvbihlKXt1PW51bGw7aWYoIWZ8fG8pcmV0dXJuO289c2V0VGltZW91dChmdW5jdGlvbigpe289bnVsbCxjKCl9LDUwKX0pLHQub24oImNoYW5nZVNlc3Npb24iLGMpfWZ1bmN0aW9uIGEoZSl7by5jYWxsKHRoaXMsZSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL29vcCIpLHM9ZSgiLi4vbGliL2V2ZW50Iiksbz1lKCIuLi90b29sdGlwIikuVG9vbHRpcDtpLmluaGVyaXRzKGEsbyksZnVuY3Rpb24oKXt0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49d2luZG93LmlubmVyV2lkdGh8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxyPXdpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodCxpPXRoaXMuZ2V0V2lkdGgoKSxzPXRoaXMuZ2V0SGVpZ2h0KCk7ZSs9MTUsdCs9MTUsZStpPm4mJihlLT1lK2ktbiksdCtzPnImJih0LT0yMCtzKSxvLnByb3RvdHlwZS5zZXRQb3NpdGlvbi5jYWxsKHRoaXMsZSx0KX19LmNhbGwoYS5wcm90b3R5cGUpLHQuR3V0dGVySGFuZGxlcj11fSksYWNlLmRlZmluZSgiYWNlL21vdXNlL21vdXNlX2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPXQuTW91c2VFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuZG9tRXZlbnQ9ZSx0aGlzLmVkaXRvcj10LHRoaXMueD10aGlzLmNsaWVudFg9ZS5jbGllbnRYLHRoaXMueT10aGlzLmNsaWVudFk9ZS5jbGllbnRZLHRoaXMuJHBvcz1udWxsLHRoaXMuJGluU2VsZWN0aW9uPW51bGwsdGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExfTsoZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe3Iuc3RvcFByb3BhZ2F0aW9uKHRoaXMuZG9tRXZlbnQpLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSEwfSx0aGlzLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKCl7ci5wcmV2ZW50RGVmYXVsdCh0aGlzLmRvbUV2ZW50KSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLmdldERvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcG9zP3RoaXMuJHBvczoodGhpcy4kcG9zPXRoaXMuZWRpdG9yLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHRoaXMuY2xpZW50WCx0aGlzLmNsaWVudFkpLHRoaXMuJHBvcyl9LHRoaXMuaW5TZWxlY3Rpb249ZnVuY3Rpb24oKXtpZih0aGlzLiRpblNlbGVjdGlvbiE9PW51bGwpcmV0dXJuIHRoaXMuJGluU2VsZWN0aW9uO3ZhciBlPXRoaXMuZWRpdG9yLHQ9ZS5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuaXNFbXB0eSgpKXRoaXMuJGluU2VsZWN0aW9uPSExO2Vsc2V7dmFyIG49dGhpcy5nZXREb2N1bWVudFBvc2l0aW9uKCk7dGhpcy4kaW5TZWxlY3Rpb249dC5jb250YWlucyhuLnJvdyxuLmNvbHVtbil9cmV0dXJuIHRoaXMuJGluU2VsZWN0aW9ufSx0aGlzLmdldEJ1dHRvbj1mdW5jdGlvbigpe3JldHVybiByLmdldEJ1dHRvbih0aGlzLmRvbUV2ZW50KX0sdGhpcy5nZXRTaGlmdEtleT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LnNoaWZ0S2V5fSx0aGlzLmdldEFjY2VsS2V5PWkuaXNNYWM/ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5tZXRhS2V5fTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbUV2ZW50LmN0cmxLZXl9fSkuY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZHJhZ2Ryb3BfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBmKGUpe2Z1bmN0aW9uIFQoZSxuKXt2YXIgcj1EYXRlLm5vdygpLGk9IW58fGUucm93IT1uLnJvdyxzPSFufHxlLmNvbHVtbiE9bi5jb2x1bW47aWYoIVN8fGl8fHMpdC5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKSxTPXIseD17eDpwLHk6ZH07ZWxzZXt2YXIgbz1sKHgueCx4LnkscCxkKTtvPmE/Uz1udWxsOnItUz49dSYmKHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKSxTPW51bGwpfX1mdW5jdGlvbiBOKGUsbil7dmFyIHI9RGF0ZS5ub3coKSxpPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCxzPXQucmVuZGVyZXIubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgsdT10LnJlbmRlcmVyLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9e3g6e2xlZnQ6cC11LmxlZnQscmlnaHQ6dS5yaWdodC1wfSx5Ont0b3A6ZC11LnRvcCxib3R0b206dS5ib3R0b20tZH19LGY9TWF0aC5taW4oYS54LmxlZnQsYS54LnJpZ2h0KSxsPU1hdGgubWluKGEueS50b3AsYS55LmJvdHRvbSksYz17cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn07Zi9zPD0yJiYoYy5jb2x1bW4rPWEueC5sZWZ0PGEueC5yaWdodD8tMzoyKSxsL2k8PTEmJihjLnJvdys9YS55LnRvcDxhLnkuYm90dG9tPy0xOjEpO3ZhciBoPWUucm93IT1jLnJvdyx2PWUuY29sdW1uIT1jLmNvbHVtbixtPSFufHxlLnJvdyE9bi5yb3c7aHx8diYmIW0/RT9yLUU+PW8mJnQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoYyk6RT1yOkU9bnVsbH1mdW5jdGlvbiBDKCl7dmFyIGU9ZztnPXQucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMocCxkKSxUKGcsZSksTihnLGUpfWZ1bmN0aW9uIGsoKXttPXQuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLGg9dC5zZXNzaW9uLmFkZE1hcmtlcihtLCJhY2Vfc2VsZWN0aW9uIix0LmdldFNlbGVjdGlvblN0eWxlKCkpLHQuY2xlYXJTZWxlY3Rpb24oKSx0LmlzRm9jdXNlZCgpJiZ0LnJlbmRlcmVyLiRjdXJzb3JMYXllci5zZXRCbGlua2luZyghMSksY2xlYXJJbnRlcnZhbCh2KSxDKCksdj1zZXRJbnRlcnZhbChDLDIwKSx5PTAsaS5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixPKX1mdW5jdGlvbiBMKCl7Y2xlYXJJbnRlcnZhbCh2KSx0LnNlc3Npb24ucmVtb3ZlTWFya2VyKGgpLGg9bnVsbCx0LnNlbGVjdGlvbi5mcm9tT3JpZW50ZWRSYW5nZShtKSx0LmlzRm9jdXNlZCgpJiYhdyYmdC4kcmVzZXRDdXJzb3JTdHlsZSgpLG09bnVsbCxnPW51bGwseT0wLEU9bnVsbCxTPW51bGwsaS5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixPKX1mdW5jdGlvbiBPKCl7QT09bnVsbCYmKEE9c2V0VGltZW91dChmdW5jdGlvbigpe0EhPW51bGwmJmgmJkwoKX0sMjApKX1mdW5jdGlvbiBNKGUpe3ZhciB0PWUudHlwZXM7cmV0dXJuIXR8fEFycmF5LnByb3RvdHlwZS5zb21lLmNhbGwodCxmdW5jdGlvbihlKXtyZXR1cm4gZT09InRleHQvcGxhaW4ifHxlPT0iVGV4dCJ9KX1mdW5jdGlvbiBfKGUpe3ZhciB0PVsiY29weSIsImNvcHltb3ZlIiwiYWxsIiwidW5pbml0aWFsaXplZCJdLG49WyJtb3ZlIiwiY29weW1vdmUiLCJsaW5rbW92ZSIsImFsbCIsInVuaW5pdGlhbGl6ZWQiXSxyPXMuaXNNYWM/ZS5hbHRLZXk6ZS5jdHJsS2V5LGk9InVuaW5pdGlhbGl6ZWQiO3RyeXtpPWUuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQudG9Mb3dlckNhc2UoKX1jYXRjaChlKXt9dmFyIG89Im5vbmUiO3JldHVybiByJiZ0LmluZGV4T2YoaSk+PTA/bz0iY29weSI6bi5pbmRleE9mKGkpPj0wP289Im1vdmUiOnQuaW5kZXhPZihpKT49MCYmKG89ImNvcHkiKSxvfXZhciB0PWUuZWRpdG9yLG49ci5jcmVhdGVFbGVtZW50KCJpbWciKTtuLnNyYz0iZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT0iLHMuaXNPcGVyYSYmKG4uc3R5bGUuY3NzVGV4dD0id2lkdGg6MXB4O2hlaWdodDoxcHg7cG9zaXRpb246Zml4ZWQ7dG9wOjA7bGVmdDowO3otaW5kZXg6MjE0NzQ4MzY0NztvcGFjaXR5OjA7Iik7dmFyIGY9WyJkcmFnV2FpdCIsImRyYWdXYWl0RW5kIiwic3RhcnREcmFnIiwiZHJhZ1JlYWR5RW5kIiwib25Nb3VzZURyYWciXTtmLmZvckVhY2goZnVuY3Rpb24odCl7ZVt0XT10aGlzW3RdfSx0aGlzKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRG93bi5iaW5kKGUpKTt2YXIgYz10LmNvbnRhaW5lcixoLHAsZCx2LG0sZyx5PTAsYix3LEUsUyx4O3RoaXMub25EcmFnU3RhcnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5jYW5jZWxEcmFnfHwhYy5kcmFnZ2FibGUpe3ZhciByPXRoaXM7cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLnN0YXJ0U2VsZWN0KCksci5jYXB0dXJlTW91c2UoZSl9LDApLGUucHJldmVudERlZmF1bHQoKX1tPXQuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt2YXIgaT1lLmRhdGFUcmFuc2ZlcjtpLmVmZmVjdEFsbG93ZWQ9dC5nZXRSZWFkT25seSgpPyJjb3B5IjoiY29weU1vdmUiLHMuaXNPcGVyYSYmKHQuY29udGFpbmVyLmFwcGVuZENoaWxkKG4pLG4uc2Nyb2xsVG9wPTApLGkuc2V0RHJhZ0ltYWdlJiZpLnNldERyYWdJbWFnZShuLDAsMCkscy5pc09wZXJhJiZ0LmNvbnRhaW5lci5yZW1vdmVDaGlsZChuKSxpLmNsZWFyRGF0YSgpLGkuc2V0RGF0YSgiVGV4dCIsdC5zZXNzaW9uLmdldFRleHRSYW5nZSgpKSx3PSEwLHRoaXMuc2V0U3RhdGUoImRyYWciKX0sdGhpcy5vbkRyYWdFbmQ9ZnVuY3Rpb24oZSl7Yy5kcmFnZ2FibGU9ITEsdz0hMSx0aGlzLnNldFN0YXRlKG51bGwpO2lmKCF0LmdldFJlYWRPbmx5KCkpe3ZhciBuPWUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q7IWImJm49PSJtb3ZlIiYmdC5zZXNzaW9uLnJlbW92ZSh0LmdldFNlbGVjdGlvblJhbmdlKCkpLHQuJHJlc2V0Q3Vyc29yU3R5bGUoKX10aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZSgiIil9LHRoaXMub25EcmFnRW50ZXI9ZnVuY3Rpb24oZSl7aWYodC5nZXRSZWFkT25seSgpfHwhTShlLmRhdGFUcmFuc2ZlcikpcmV0dXJuO3JldHVybiBwPWUuY2xpZW50WCxkPWUuY2xpZW50WSxofHxrKCkseSsrLGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Yj1fKGUpLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25EcmFnT3Zlcj1mdW5jdGlvbihlKXtpZih0LmdldFJlYWRPbmx5KCl8fCFNKGUuZGF0YVRyYW5zZmVyKSlyZXR1cm47cmV0dXJuIHA9ZS5jbGllbnRYLGQ9ZS5jbGllbnRZLGh8fChrKCkseSsrKSxBIT09bnVsbCYmKEE9bnVsbCksZS5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdD1iPV8oZSksaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyYWdMZWF2ZT1mdW5jdGlvbihlKXt5LS07aWYoeTw9MCYmaClyZXR1cm4gTCgpLGI9bnVsbCxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJvcD1mdW5jdGlvbihlKXtpZighZylyZXR1cm47dmFyIG49ZS5kYXRhVHJhbnNmZXI7aWYodylzd2l0Y2goYil7Y2FzZSJtb3ZlIjptLmNvbnRhaW5zKGcucm93LGcuY29sdW1uKT9tPXtzdGFydDpnLGVuZDpnfTptPXQubW92ZVRleHQobSxnKTticmVhaztjYXNlImNvcHkiOm09dC5tb3ZlVGV4dChtLGcsITApfWVsc2V7dmFyIHI9bi5nZXREYXRhKCJUZXh0Iik7bT17c3RhcnQ6ZyxlbmQ6dC5zZXNzaW9uLmluc2VydChnLHIpfSx0LmZvY3VzKCksYj1udWxsfXJldHVybiBMKCksaS5wcmV2ZW50RGVmYXVsdChlKX0saS5hZGRMaXN0ZW5lcihjLCJkcmFnc3RhcnQiLHRoaXMub25EcmFnU3RhcnQuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnZW5kIix0aGlzLm9uRHJhZ0VuZC5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdlbnRlciIsdGhpcy5vbkRyYWdFbnRlci5iaW5kKGUpKSxpLmFkZExpc3RlbmVyKGMsImRyYWdvdmVyIix0aGlzLm9uRHJhZ092ZXIuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnbGVhdmUiLHRoaXMub25EcmFnTGVhdmUuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcm9wIix0aGlzLm9uRHJvcC5iaW5kKGUpKTt2YXIgQT1udWxsfWZ1bmN0aW9uIGwoZSx0LG4scil7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhuLWUsMikrTWF0aC5wb3coci10LDIpKX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvZXZlbnQiKSxzPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxvPTIwMCx1PTIwMCxhPTU7KGZ1bmN0aW9uKCl7dGhpcy5kcmFnV2FpdD1mdW5jdGlvbigpe3ZhciBlPURhdGUubm93KCktdGhpcy5tb3VzZWRvd25FdmVudC50aW1lO2U+dGhpcy5lZGl0b3IuZ2V0RHJhZ0RlbGF5KCkmJnRoaXMuc3RhcnREcmFnKCl9LHRoaXMuZHJhZ1dhaXRFbmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmVkaXRvci5jb250YWluZXI7ZS5kcmFnZ2FibGU9ITEsdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSksdGhpcy5zZWxlY3RFbmQoKX0sdGhpcy5kcmFnUmVhZHlFbmQ9ZnVuY3Rpb24oZSl7dGhpcy5lZGl0b3IuJHJlc2V0Q3Vyc29yU3R5bGUoKSx0aGlzLmVkaXRvci51bnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZSgiIiksdGhpcy5kcmFnV2FpdEVuZCgpfSx0aGlzLnN0YXJ0RHJhZz1mdW5jdGlvbigpe3RoaXMuY2FuY2VsRHJhZz0hMTt2YXIgZT10aGlzLmVkaXRvcix0PWUuY29udGFpbmVyO3QuZHJhZ2dhYmxlPSEwLGUucmVuZGVyZXIuJGN1cnNvckxheWVyLnNldEJsaW5raW5nKCExKSxlLnNldFN0eWxlKCJhY2VfZHJhZ2dpbmciKTt2YXIgbj1zLmlzV2luPyJkZWZhdWx0IjoibW92ZSI7ZS5yZW5kZXJlci5zZXRDdXJzb3JTdHlsZShuKSx0aGlzLnNldFN0YXRlKCJkcmFnUmVhZHkiKX0sdGhpcy5vbk1vdXNlRHJhZz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmVkaXRvci5jb250YWluZXI7aWYocy5pc0lFJiZ0aGlzLnN0YXRlPT0iZHJhZ1JlYWR5Iil7dmFyIG49bCh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpO24+MyYmdC5kcmFnRHJvcCgpfWlmKHRoaXMuc3RhdGU9PT0iZHJhZ1dhaXQiKXt2YXIgbj1sKHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSk7bj4wJiYodC5kcmFnZ2FibGU9ITEsdGhpcy5zdGFydFNlbGVjdCh0aGlzLm1vdXNlZG93bkV2ZW50LmdldERvY3VtZW50UG9zaXRpb24oKSkpfX0sdGhpcy5vbk1vdXNlRG93bj1mdW5jdGlvbihlKXtpZighdGhpcy4kZHJhZ0VuYWJsZWQpcmV0dXJuO3RoaXMubW91c2Vkb3duRXZlbnQ9ZTt2YXIgdD10aGlzLmVkaXRvcixuPWUuaW5TZWxlY3Rpb24oKSxyPWUuZ2V0QnV0dG9uKCksaT1lLmRvbUV2ZW50LmRldGFpbHx8MTtpZihpPT09MSYmcj09PTAmJm4pe2lmKGUuZWRpdG9yLmluTXVsdGlTZWxlY3RNb2RlJiYoZS5nZXRBY2NlbEtleSgpfHxlLmdldFNoaWZ0S2V5KCkpKXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50LnRpbWU9RGF0ZS5ub3coKTt2YXIgbz1lLmRvbUV2ZW50LnRhcmdldHx8ZS5kb21FdmVudC5zcmNFbGVtZW50OyJ1bnNlbGVjdGFibGUiaW4gbyYmKG8udW5zZWxlY3RhYmxlPSJvbiIpO2lmKHQuZ2V0RHJhZ0RlbGF5KCkpe2lmKHMuaXNXZWJLaXQpe3RoaXMuY2FuY2VsRHJhZz0hMDt2YXIgdT10LmNvbnRhaW5lcjt1LmRyYWdnYWJsZT0hMH10aGlzLnNldFN0YXRlKCJkcmFnV2FpdCIpfWVsc2UgdGhpcy5zdGFydERyYWcoKTt0aGlzLmNhcHR1cmVNb3VzZShlLHRoaXMub25Nb3VzZURyYWcuYmluZCh0aGlzKSksZS5kZWZhdWx0UHJldmVudGVkPSEwfX19KS5jYWxsKGYucHJvdG90eXBlKSx0LkRyYWdkcm9wSGFuZGxlcj1mfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL3RvdWNoX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQsaT1lKCIuLi9saWIvZG9tIik7dC5hZGRUb3VjaExpc3RlbmVycz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHkoKXt2YXIgZT13aW5kb3cubmF2aWdhdG9yJiZ3aW5kb3cubmF2aWdhdG9yLmNsaXBib2FyZCxyPSExLHM9ZnVuY3Rpb24oKXt2YXIgbj10LmdldENvcHlUZXh0KCkscz10LnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5oYXNVbmRvKCk7Zy5yZXBsYWNlQ2hpbGQoaS5idWlsZERvbShyP1sic3BhbiIsIW4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InNlbGVjdGFsbCJ9LCJTZWxlY3QgQWxsIl0sbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiY29weSJ9LCJDb3B5Il0sbiYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiY3V0In0sIkN1dCJdLGUmJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InBhc3RlIn0sIlBhc3RlIl0scyYmWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoidW5kbyJ9LCJVbmRvIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoiZmluZCJ9LCJGaW5kIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoib3BlbkNvbW1hbmRQYWxsZXRlIn0sIlBhbGxldGUiXV06WyJzcGFuIl0pLGcuZmlyc3RDaGlsZCl9LG89ZnVuY3Rpb24obil7dmFyIGk9bi50YXJnZXQuZ2V0QXR0cmlidXRlKCJhY3Rpb24iKTtpZihpPT0ibW9yZSJ8fCFyKXJldHVybiByPSFyLHMoKTtpZihpPT0icGFzdGUiKWUucmVhZFRleHQoKS50aGVuKGZ1bmN0aW9uKGUpe3QuZXhlY0NvbW1hbmQoaSxlKX0pO2Vsc2UgaWYoaSl7aWYoaT09ImN1dCJ8fGk9PSJjb3B5IillP2Uud3JpdGVUZXh0KHQuZ2V0Q29weVRleHQoKSk6ZG9jdW1lbnQuZXhlY0NvbW1hbmQoImNvcHkiKTt0LmV4ZWNDb21tYW5kKGkpfWcuZmlyc3RDaGlsZC5zdHlsZS5kaXNwbGF5PSJub25lIixyPSExLGkhPSJvcGVuQ29tbWFuZFBhbGxldGUiJiZ0LmZvY3VzKCl9O2c9aS5idWlsZERvbShbImRpdiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtbWVudSIsb250b3VjaHN0YXJ0OmZ1bmN0aW9uKGUpe249Im1lbnUiLGUuc3RvcFByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLHQudGV4dElucHV0LmZvY3VzKCl9LG9udG91Y2hlbmQ6ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbyhlKX0sb25jbGljazpvfSxbInNwYW4iXSxbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJtb3JlIn0sIi4uLiJdXSx0LmNvbnRhaW5lcil9ZnVuY3Rpb24gYigpe2d8fHkoKTt2YXIgZT10LnNlbGVjdGlvbi5jdXJzb3Isbj10LnJlbmRlcmVyLnRleHRUb1NjcmVlbkNvb3JkaW5hdGVzKGUucm93LGUuY29sdW1uKSxyPXQuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2cuc3R5bGUudG9wPW4ucGFnZVktci50b3AtMysicHgiLGcuc3R5bGUucmlnaHQ9IjEwcHgiLGcuc3R5bGUuZGlzcGxheT0iIixnLmZpcnN0Q2hpbGQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdC5vbigiaW5wdXQiLHcpfWZ1bmN0aW9uIHcoZSl7ZyYmKGcuc3R5bGUuZGlzcGxheT0ibm9uZSIpLHQub2ZmKCJpbnB1dCIsdyl9ZnVuY3Rpb24gRSgpe2Y9bnVsbCxjbGVhclRpbWVvdXQoZik7dmFyIGU9dC5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxyPWUuY29udGFpbnMoaC5yb3csaC5jb2x1bW4pO2lmKGUuaXNFbXB0eSgpfHwhcil0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKSx0LnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7bj0id2FpdCIsYigpfWZ1bmN0aW9uIFMoKXtmPW51bGwsY2xlYXJUaW1lb3V0KGYpLHQuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGgpO3ZhciBlPXA+PTI/dC5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKGgucm93KTp0LnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKGgpO2UmJiFlLmlzRW1wdHkoKT90LnNlbGVjdGlvbi5zZXRSYW5nZShlKTp0LnNlbGVjdGlvbi5zZWxlY3RXb3JkKCksbj0id2FpdCJ9ZnVuY3Rpb24geCgpe2MrPTYwLGw9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtjLS08PTAmJihjbGVhckludGVydmFsKGwpLGw9bnVsbCksTWF0aC5hYnMoZCk8LjAxJiYoZD0wKSxNYXRoLmFicyh2KTwuMDEmJih2PTApLGM8MjAmJihkPS45KmQpLGM8MjAmJih2PS45KnYpO3ZhciBlPXQuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKTt0LnJlbmRlcmVyLnNjcm9sbEJ5KDEwKmQsMTAqdiksZT09dC5zZXNzaW9uLmdldFNjcm9sbFRvcCgpJiYoYz0wKX0sMTApfXZhciBuPSJzY3JvbGwiLHMsbyx1LGEsZixsLGM9MCxoLHA9MCxkPTAsdj0wLG0sZztlLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixmdW5jdGlvbihlKXtpZighbSlyZXR1cm47dmFyIG49dC50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpO24uZm9jdXMoKX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7dmFyIGk9ZS50b3VjaGVzO2lmKGZ8fGkubGVuZ3RoPjEpe2NsZWFyVGltZW91dChmKSxmPW51bGwsdT0tMSxuPSJ6b29tIjtyZXR1cm59bT10LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQ9ITA7dmFyIGw9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LGc9dC5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0LHk9ZS50aW1lU3RhbXA7YT15O3ZhciBiPWlbMF0sdz1iLmNsaWVudFgseD1iLmNsaWVudFk7TWF0aC5hYnMocy13KStNYXRoLmFicyhvLXgpPmwmJih1PS0xKSxzPWUuY2xpZW50WD13LG89ZS5jbGllbnRZPXgsZD12PTA7dmFyIFQ9bmV3IHIoZSx0KTtoPVQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO2lmKHktdTw1MDAmJmkubGVuZ3RoPT0xJiYhYylwKyssZS5wcmV2ZW50RGVmYXVsdCgpLGUuYnV0dG9uPTAsUygpO2Vsc2V7cD0wO3ZhciBOPXQuc2VsZWN0aW9uLmN1cnNvcixDPXQuc2VsZWN0aW9uLmlzRW1wdHkoKT9OOnQuc2VsZWN0aW9uLmFuY2hvcixrPXQucmVuZGVyZXIuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oTiwhMCksTD10LnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKEMsITApLEE9dC5yZW5kZXJlci5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxPPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUvPWcsdD10L2wtLjc1LGUqZSt0KnR9O2lmKGUuY2xpZW50WDxBLmxlZnQpe249Inpvb20iO3JldHVybn12YXIgTT1PKGUuY2xpZW50WC1BLmxlZnQtay5sZWZ0LGUuY2xpZW50WS1BLnRvcC1rLnRvcCksXz1PKGUuY2xpZW50WC1BLmxlZnQtTC5sZWZ0LGUuY2xpZW50WS1BLnRvcC1MLnRvcCk7TTwzLjUmJl88My41JiYobj1NPl8/ImN1cnNvciI6ImFuY2hvciIpLF88My41P249ImFuY2hvciI6TTwzLjU/bj0iY3Vyc29yIjpuPSJzY3JvbGwiLGY9c2V0VGltZW91dChFLDQ1MCl9dT15fSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsZnVuY3Rpb24oZSl7bT10LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQ9ITEsbCYmY2xlYXJJbnRlcnZhbChsKSxuPT0iem9vbSI/KG49IiIsYz0wKTpmPyh0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKSxjPTAsYigpKTpuPT0ic2Nyb2xsIj8oeCgpLGUucHJldmVudERlZmF1bHQoKSx3KCkpOmIoKSxjbGVhclRpbWVvdXQoZiksZj1udWxsfSksZS5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGZ1bmN0aW9uKGUpe2YmJihjbGVhclRpbWVvdXQoZiksZj1udWxsKTt2YXIgaT1lLnRvdWNoZXM7aWYoaS5sZW5ndGg+MXx8bj09Inpvb20iKXJldHVybjt2YXIgdT1pWzBdLGw9cy11LmNsaWVudFgsYz1vLXUuY2xpZW50WTtpZihuPT0id2FpdCIpe2lmKCEobCpsK2MqYz40KSlyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpO249ImN1cnNvciJ9cz11LmNsaWVudFgsbz11LmNsaWVudFksZS5jbGllbnRYPXUuY2xpZW50WCxlLmNsaWVudFk9dS5jbGllbnRZO3ZhciBoPWUudGltZVN0YW1wLHA9aC1hO2E9aDtpZihuPT0ic2Nyb2xsIil7dmFyIG09bmV3IHIoZSx0KTttLnNwZWVkPTEsbS53aGVlbFg9bCxtLndoZWVsWT1jLDEwKk1hdGguYWJzKGwpPE1hdGguYWJzKGMpJiYobD0wKSwxMCpNYXRoLmFicyhjKTxNYXRoLmFicyhsKSYmKGM9MCkscCE9MCYmKGQ9bC9wLHY9Yy9wKSx0Ll9lbWl0KCJtb3VzZXdoZWVsIixtKSxtLnByb3BhZ2F0aW9uU3RvcHBlZHx8KGQ9dj0wKX1lbHNle3ZhciBnPW5ldyByKGUsdCkseT1nLmdldERvY3VtZW50UG9zaXRpb24oKTtuPT0iY3Vyc29yIj90LnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih5KTpuPT0iYW5jaG9yIiYmdC5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKHkucm93LHkuY29sdW1uKSx0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KHkpLGUucHJldmVudERlZmF1bHQoKX19KX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL25ldCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2RvbSIpO3QuZ2V0PWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IFhNTEh0dHBSZXF1ZXN0O24ub3BlbigiR0VUIixlLCEwKSxuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe24ucmVhZHlTdGF0ZT09PTQmJnQobi5yZXNwb25zZVRleHQpfSxuLnNlbmQobnVsbCl9LHQubG9hZFNjcmlwdD1mdW5jdGlvbihlLHQpe3ZhciBuPXIuZ2V0RG9jdW1lbnRIZWFkKCksaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpLnNyYz1lLG4uYXBwZW5kQ2hpbGQoaSksaS5vbmxvYWQ9aS5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oZSxuKXtpZihufHwhaS5yZWFkeVN0YXRlfHxpLnJlYWR5U3RhdGU9PSJsb2FkZWQifHxpLnJlYWR5U3RhdGU9PSJjb21wbGV0ZSIpaT1pLm9ubG9hZD1pLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLG58fHQoKX19LHQucXVhbGlmeVVSTD1mdW5jdGlvbihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7cmV0dXJuIHQuaHJlZj1lLHQuaHJlZn19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9LGk9ZnVuY3Rpb24oKXt0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0scz1mdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMH07ci5fZW1pdD1yLl9kaXNwYXRjaEV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5fZXZlbnRSZWdpc3RyeXx8KHRoaXMuX2V2ZW50UmVnaXN0cnk9e30pLHRoaXMuX2RlZmF1bHRIYW5kbGVyc3x8KHRoaXMuX2RlZmF1bHRIYW5kbGVycz17fSk7dmFyIG49dGhpcy5fZXZlbnRSZWdpc3RyeVtlXXx8W10scj10aGlzLl9kZWZhdWx0SGFuZGxlcnNbZV07aWYoIW4ubGVuZ3RoJiYhcilyZXR1cm47aWYodHlwZW9mIHQhPSJvYmplY3QifHwhdCl0PXt9O3QudHlwZXx8KHQudHlwZT1lKSx0LnN0b3BQcm9wYWdhdGlvbnx8KHQuc3RvcFByb3BhZ2F0aW9uPWkpLHQucHJldmVudERlZmF1bHR8fCh0LnByZXZlbnREZWZhdWx0PXMpLG49bi5zbGljZSgpO2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXtuW29dKHQsdGhpcyk7aWYodC5wcm9wYWdhdGlvblN0b3BwZWQpYnJlYWt9aWYociYmIXQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm4gcih0LHRoaXMpfSxyLl9zaWduYWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj0odGhpcy5fZXZlbnRSZWdpc3RyeXx8e30pW2VdO2lmKCFuKXJldHVybjtuPW4uc2xpY2UoKTtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyluW3JdKHQsdGhpcyl9LHIub25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7dGhpcy5hZGRFdmVudExpc3RlbmVyKGUsZnVuY3Rpb24gcigpe24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHIpLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7aWYoIXQpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe3Q9ZX0pfSxyLnNldERlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZGVmYXVsdEhhbmRsZXJzO258fChuPXRoaXMuX2RlZmF1bHRIYW5kbGVycz17X2Rpc2FibGVkXzp7fX0pO2lmKG5bZV0pe3ZhciByPW5bZV0saT1uLl9kaXNhYmxlZF9bZV07aXx8KG4uX2Rpc2FibGVkX1tlXT1pPVtdKSxpLnB1c2gocik7dmFyIHM9aS5pbmRleE9mKHQpO3MhPS0xJiZpLnNwbGljZShzLDEpfW5bZV09dH0sci5yZW1vdmVEZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2RlZmF1bHRIYW5kbGVycztpZighbilyZXR1cm47dmFyIHI9bi5fZGlzYWJsZWRfW2VdO2lmKG5bZV09PXQpciYmdGhpcy5zZXREZWZhdWx0SGFuZGxlcihlLHIucG9wKCkpO2Vsc2UgaWYocil7dmFyIGk9ci5pbmRleE9mKHQpO2khPS0xJiZyLnNwbGljZShpLDEpfX0sci5vbj1yLmFkZEV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIHI9dGhpcy5fZXZlbnRSZWdpc3RyeVtlXTtyZXR1cm4gcnx8KHI9dGhpcy5fZXZlbnRSZWdpc3RyeVtlXT1bXSksci5pbmRleE9mKHQpPT0tMSYmcltuPyJ1bnNoaWZ0IjoicHVzaCJdKHQpLHR9LHIub2ZmPXIucmVtb3ZlTGlzdGVuZXI9ci5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCl7dGhpcy5fZXZlbnRSZWdpc3RyeT10aGlzLl9ldmVudFJlZ2lzdHJ5fHx7fTt2YXIgbj10aGlzLl9ldmVudFJlZ2lzdHJ5W2VdO2lmKCFuKXJldHVybjt2YXIgcj1uLmluZGV4T2YodCk7ciE9PS0xJiZuLnNwbGljZShyLDEpfSxyLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt0aGlzLl9ldmVudFJlZ2lzdHJ5JiYodGhpcy5fZXZlbnRSZWdpc3RyeVtlXT1bXSl9LHQuRXZlbnRFbWl0dGVyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2FwcF9jb25maWciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsibm8gdXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuLmFwcGx5KGNvbnNvbGUsYXJndW1lbnRzKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49bmV3IEVycm9yKGUpO24uZGF0YT10LHR5cGVvZiBjb25zb2xlPT0ib2JqZWN0IiYmY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihuKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgbn0pfXZhciByPWUoIi4vb29wIiksaT1lKCIuL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz17c2V0T3B0aW9uczpmdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuc2V0T3B0aW9uKHQsZVt0XSl9LHRoaXMpfSxnZXRPcHRpb25zOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O2lmKCFlKXt2YXIgbj10aGlzLiRvcHRpb25zO2U9T2JqZWN0LmtleXMobikuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFuW2VdLmhpZGRlbn0pfWVsc2UgQXJyYXkuaXNBcnJheShlKXx8KHQ9ZSxlPU9iamVjdC5rZXlzKHQpKTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RbZV09dGhpcy5nZXRPcHRpb24oZSl9LHRoaXMpLHR9LHNldE9wdGlvbjpmdW5jdGlvbihlLHQpe2lmKHRoaXNbIiQiK2VdPT09dClyZXR1cm47dmFyIG49dGhpcy4kb3B0aW9uc1tlXTtpZighbilyZXR1cm4gbygnbWlzc3BlbGxlZCBvcHRpb24gIicrZSsnIicpO2lmKG4uZm9yd2FyZFRvKXJldHVybiB0aGlzW24uZm9yd2FyZFRvXSYmdGhpc1tuLmZvcndhcmRUb10uc2V0T3B0aW9uKGUsdCk7bi5oYW5kbGVzU2V0fHwodGhpc1siJCIrZV09dCksbiYmbi5zZXQmJm4uc2V0LmNhbGwodGhpcyx0KX0sZ2V0T3B0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnNbZV07cmV0dXJuIHQ/dC5mb3J3YXJkVG8/dGhpc1t0LmZvcndhcmRUb10mJnRoaXNbdC5mb3J3YXJkVG9dLmdldE9wdGlvbihlKTp0JiZ0LmdldD90LmdldC5jYWxsKHRoaXMpOnRoaXNbIiQiK2VdOm8oJ21pc3NwZWxsZWQgb3B0aW9uICInK2UrJyInKX19LGE9ZnVuY3Rpb24oKXt0aGlzLiRkZWZhdWx0T3B0aW9ucz17fX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLmRlZmluZU9wdGlvbnM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLiRvcHRpb25zfHwodGhpcy4kZGVmYXVsdE9wdGlvbnNbdF09ZS4kb3B0aW9ucz17fSksT2JqZWN0LmtleXMobikuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1uW3RdO3R5cGVvZiByPT0ic3RyaW5nIiYmKHI9e2ZvcndhcmRUbzpyfSksci5uYW1lfHwoci5uYW1lPXQpLGUuJG9wdGlvbnNbci5uYW1lXT1yLCJpbml0aWFsVmFsdWUiaW4gciYmKGVbIiQiK3IubmFtZV09ci5pbml0aWFsVmFsdWUpfSksci5pbXBsZW1lbnQoZSxzKSx0aGlzfSx0aGlzLnJlc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlLiRvcHRpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWUuJG9wdGlvbnNbdF07InZhbHVlImluIG4mJmUuc2V0T3B0aW9uKHQsbi52YWx1ZSl9KX0sdGhpcy5zZXREZWZhdWx0VmFsdWU9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlKXtmb3IoZSBpbiB0aGlzLiRkZWZhdWx0T3B0aW9ucylpZih0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXVt0XSlicmVhaztpZighdGhpcy4kZGVmYXVsdE9wdGlvbnNbZV1bdF0pcmV0dXJuITF9dmFyIHI9dGhpcy4kZGVmYXVsdE9wdGlvbnNbZV18fCh0aGlzLiRkZWZhdWx0T3B0aW9uc1tlXT17fSk7clt0XSYmKHIuZm9yd2FyZFRvP3RoaXMuc2V0RGVmYXVsdFZhbHVlKHIuZm9yd2FyZFRvLHQsbik6clt0XS52YWx1ZT1uKX0sdGhpcy5zZXREZWZhdWx0VmFsdWVzPWZ1bmN0aW9uKGUsdCl7T2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXt0aGlzLnNldERlZmF1bHRWYWx1ZShlLG4sdFtuXSl9LHRoaXMpfSx0aGlzLndhcm49byx0aGlzLnJlcG9ydEVycm9yPXV9KS5jYWxsKGEucHJvdG90eXBlKSx0LkFwcENvbmZpZz1hfSksYWNlLmRlZmluZSgiYWNlL2NvbmZpZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9uZXQiLCJhY2UvbGliL2FwcF9jb25maWciXSxmdW5jdGlvbihlLHQsbil7Im5vIHVzZSBzdHJpY3QiO2Z1bmN0aW9uIGwocil7aWYoIXV8fCF1LmRvY3VtZW50KXJldHVybjthLnBhY2thZ2VkPXJ8fGUucGFja2FnZWR8fG4ucGFja2FnZWR8fHUuZGVmaW5lJiZkZWZpbmUucGFja2FnZWQ7dmFyIGk9e30scz0iIixvPWRvY3VtZW50LmN1cnJlbnRTY3JpcHR8fGRvY3VtZW50Ll9jdXJyZW50U2NyaXB0LGY9byYmby5vd25lckRvY3VtZW50fHxkb2N1bWVudCxsPWYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO2Zvcih2YXIgaD0wO2g8bC5sZW5ndGg7aCsrKXt2YXIgcD1sW2hdLGQ9cC5zcmN8fHAuZ2V0QXR0cmlidXRlKCJzcmMiKTtpZighZCljb250aW51ZTt2YXIgdj1wLmF0dHJpYnV0ZXM7Zm9yKHZhciBtPTAsZz12Lmxlbmd0aDttPGc7bSsrKXt2YXIgeT12W21dO3kubmFtZS5pbmRleE9mKCJkYXRhLWFjZS0iKT09PTAmJihpW2MoeS5uYW1lLnJlcGxhY2UoL15kYXRhLWFjZS0vLCIiKSldPXkudmFsdWUpfXZhciBiPWQubWF0Y2goL14oLiopXC9hY2UoXC1cdyspP1wuanMoXD98JCkvKTtiJiYocz1iWzFdKX1zJiYoaS5iYXNlPWkuYmFzZXx8cyxpLnBhY2thZ2VkPSEwKSxpLmJhc2VQYXRoPWkuYmFzZSxpLndvcmtlclBhdGg9aS53b3JrZXJQYXRofHxpLmJhc2UsaS5tb2RlUGF0aD1pLm1vZGVQYXRofHxpLmJhc2UsaS50aGVtZVBhdGg9aS50aGVtZVBhdGh8fGkuYmFzZSxkZWxldGUgaS5iYXNlO2Zvcih2YXIgdyBpbiBpKXR5cGVvZiBpW3ddIT0idW5kZWZpbmVkIiYmdC5zZXQodyxpW3ddKX1mdW5jdGlvbiBjKGUpe3JldHVybiBlLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9KX12YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vbGliL25ldCIpLG89ZSgiLi9saWIvYXBwX2NvbmZpZyIpLkFwcENvbmZpZztuLmV4cG9ydHM9dD1uZXcgbzt2YXIgdT1mdW5jdGlvbigpe3JldHVybiB0aGlzfHx0eXBlb2Ygd2luZG93IT0idW5kZWZpbmVkIiYmd2luZG93fSgpLGE9e3BhY2thZ2VkOiExLHdvcmtlclBhdGg6bnVsbCxtb2RlUGF0aDpudWxsLHRoZW1lUGF0aDpudWxsLGJhc2VQYXRoOiIiLHN1ZmZpeDoiLmpzIiwkbW9kdWxlVXJsczp7fSxsb2FkV29ya2VyRnJvbUJsb2I6ITAsc2hhcmVkUG9wdXBzOiExfTt0LmdldD1mdW5jdGlvbihlKXtpZighYS5oYXNPd25Qcm9wZXJ0eShlKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29uZmlnIGtleTogIitlKTtyZXR1cm4gYVtlXX0sdC5zZXQ9ZnVuY3Rpb24oZSx0KXtpZihhLmhhc093blByb3BlcnR5KGUpKWFbZV09dDtlbHNlIGlmKHRoaXMuc2V0RGVmYXVsdFZhbHVlKCIiLGUsdCk9PTApdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbmZpZyBrZXk6ICIrZSl9LHQuYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHIuY29weU9iamVjdChhKX0sdC4kbW9kZXM9e30sdC5tb2R1bGVVcmw9ZnVuY3Rpb24oZSx0KXtpZihhLiRtb2R1bGVVcmxzW2VdKXJldHVybiBhLiRtb2R1bGVVcmxzW2VdO3ZhciBuPWUuc3BsaXQoIi8iKTt0PXR8fG5bbi5sZW5ndGgtMl18fCIiO3ZhciByPXQ9PSJzbmlwcGV0cyI/Ii8iOiItIixpPW5bbi5sZW5ndGgtMV07aWYodD09IndvcmtlciImJnI9PSItIil7dmFyIHM9bmV3IFJlZ0V4cCgiXiIrdCsiW1xcLV9dfFtcXC1fXSIrdCsiJCIsImciKTtpPWkucmVwbGFjZShzLCIiKX0oIWl8fGk9PXQpJiZuLmxlbmd0aD4xJiYoaT1uW24ubGVuZ3RoLTJdKTt2YXIgbz1hW3QrIlBhdGgiXTtyZXR1cm4gbz09bnVsbD9vPWEuYmFzZVBhdGg6cj09Ii8iJiYodD1yPSIiKSxvJiZvLnNsaWNlKC0xKSE9Ii8iJiYobys9Ii8iKSxvK3QrcitpK3RoaXMuZ2V0KCJzdWZmaXgiKX0sdC5zZXRNb2R1bGVVcmw9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS4kbW9kdWxlVXJsc1tlXT10fSx0LiRsb2FkaW5nPXt9LHQubG9hZE1vZHVsZT1mdW5jdGlvbihuLHIpe3ZhciBpLG87QXJyYXkuaXNBcnJheShuKSYmKG89blswXSxuPW5bMV0pO3RyeXtpPWUobil9Y2F0Y2godSl7fWlmKGkmJiF0LiRsb2FkaW5nW25dKXJldHVybiByJiZyKGkpO3QuJGxvYWRpbmdbbl18fCh0LiRsb2FkaW5nW25dPVtdKSx0LiRsb2FkaW5nW25dLnB1c2gocik7aWYodC4kbG9hZGluZ1tuXS5sZW5ndGg+MSlyZXR1cm47dmFyIGE9ZnVuY3Rpb24oKXtlKFtuXSxmdW5jdGlvbihlKXt0Ll9lbWl0KCJsb2FkLm1vZHVsZSIse25hbWU6bixtb2R1bGU6ZX0pO3ZhciByPXQuJGxvYWRpbmdbbl07dC4kbG9hZGluZ1tuXT1udWxsLHIuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0KGUpfSl9KX07aWYoIXQuZ2V0KCJwYWNrYWdlZCIpKXJldHVybiBhKCk7cy5sb2FkU2NyaXB0KHQubW9kdWxlVXJsKG4sbyksYSksZigpfTt2YXIgZj1mdW5jdGlvbigpeyFhLmJhc2VQYXRoJiYhYS53b3JrZXJQYXRoJiYhYS5tb2RlUGF0aCYmIWEudGhlbWVQYXRoJiYhT2JqZWN0LmtleXMoYS4kbW9kdWxlVXJscykubGVuZ3RoJiYoY29uc29sZS5lcnJvcigiVW5hYmxlIHRvIGluZmVyIHBhdGggdG8gYWNlIGZyb20gc2NyaXB0IHNyYywiLCJ1c2UgYWNlLmNvbmZpZy5zZXQoJ2Jhc2VQYXRoJywgJ3BhdGgnKSB0byBlbmFibGUgZHluYW1pYyBsb2FkaW5nIG9mIG1vZGVzIGFuZCB0aGVtZXMiLCJvciB3aXRoIHdlYnBhY2sgdXNlIGFjZS93ZWJwYWNrLXJlc29sdmVyIiksZj1mdW5jdGlvbigpe30pfTt0LmluaXQ9bCx0LnZlcnNpb249IjEuNC42In0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL21vdXNlL2RlZmF1bHRfaGFuZGxlcnMiLCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsImFjZS9tb3VzZS9kcmFnZHJvcF9oYW5kbGVyIiwiYWNlL21vdXNlL3RvdWNoX2hhbmRsZXIiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPWUoIi4vZGVmYXVsdF9oYW5kbGVycyIpLkRlZmF1bHRIYW5kbGVycyxvPWUoIi4vZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIpLkd1dHRlckhhbmRsZXIsdT1lKCIuL21vdXNlX2V2ZW50IikuTW91c2VFdmVudCxhPWUoIi4vZHJhZ2Ryb3BfaGFuZGxlciIpLkRyYWdkcm9wSGFuZGxlcixmPWUoIi4vdG91Y2hfaGFuZGxlciIpLmFkZFRvdWNoTGlzdGVuZXJzLGw9ZSgiLi4vY29uZmlnIiksYz1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuZWRpdG9yPWUsbmV3IHModGhpcyksbmV3IG8odGhpcyksbmV3IGEodGhpcyk7dmFyIG49ZnVuY3Rpb24odCl7dmFyIG49IWRvY3VtZW50Lmhhc0ZvY3VzfHwhZG9jdW1lbnQuaGFzRm9jdXMoKXx8IWUuaXNGb2N1c2VkKCkmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PShlLnRleHRJbnB1dCYmZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpKTtuJiZ3aW5kb3cuZm9jdXMoKSxlLmZvY3VzKCl9LHU9ZS5yZW5kZXJlci5nZXRNb3VzZUV2ZW50VGFyZ2V0KCk7ci5hZGRMaXN0ZW5lcih1LCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJjbGljayIpKSxyLmFkZExpc3RlbmVyKHUsIm1vdXNlbW92ZSIsdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMsIm1vdXNlbW92ZSIpKSxyLmFkZE11bHRpTW91c2VEb3duTGlzdGVuZXIoW3UsZS5yZW5kZXJlci5zY3JvbGxCYXJWJiZlLnJlbmRlcmVyLnNjcm9sbEJhclYuaW5uZXIsZS5yZW5kZXJlci5zY3JvbGxCYXJIJiZlLnJlbmRlcmVyLnNjcm9sbEJhckguaW5uZXIsZS50ZXh0SW5wdXQmJmUudGV4dElucHV0LmdldEVsZW1lbnQoKV0uZmlsdGVyKEJvb2xlYW4pLFs0MDAsMzAwLDI1MF0sdGhpcywib25Nb3VzZUV2ZW50Iiksci5hZGRNb3VzZVdoZWVsTGlzdGVuZXIoZS5jb250YWluZXIsdGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzLCJtb3VzZXdoZWVsIikpLGYoZS5jb250YWluZXIsZSk7dmFyIGw9ZS5yZW5kZXJlci4kZ3V0dGVyO3IuYWRkTGlzdGVuZXIobCwibW91c2Vkb3duIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcm1vdXNlZG93biIpKSxyLmFkZExpc3RlbmVyKGwsImNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmNsaWNrIikpLHIuYWRkTGlzdGVuZXIobCwiZGJsY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVyZGJsY2xpY2siKSksci5hZGRMaXN0ZW5lcihsLCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiZ3V0dGVybW91c2Vtb3ZlIikpLHIuYWRkTGlzdGVuZXIodSwibW91c2Vkb3duIixuKSxyLmFkZExpc3RlbmVyKGwsIm1vdXNlZG93biIsbiksaS5pc0lFJiZlLnJlbmRlcmVyLnNjcm9sbEJhclYmJihyLmFkZExpc3RlbmVyKGUucmVuZGVyZXIuc2Nyb2xsQmFyVi5lbGVtZW50LCJtb3VzZWRvd24iLG4pLHIuYWRkTGlzdGVuZXIoZS5yZW5kZXJlci5zY3JvbGxCYXJILmVsZW1lbnQsIm1vdXNlZG93biIsbikpLGUub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24obil7aWYodC5zdGF0ZXx8dC4kZHJhZ0RlbGF5fHwhdC4kZHJhZ0VuYWJsZWQpcmV0dXJuO3ZhciByPWUucmVuZGVyZXIuc2NyZWVuVG9UZXh0Q29vcmRpbmF0ZXMobi54LG4ueSksaT1lLnNlc3Npb24uc2VsZWN0aW9uLmdldFJhbmdlKCkscz1lLnJlbmRlcmVyOyFpLmlzRW1wdHkoKSYmaS5pbnNpZGVTdGFydChyLnJvdyxyLmNvbHVtbik/cy5zZXRDdXJzb3JTdHlsZSgiZGVmYXVsdCIpOnMuc2V0Q3Vyc29yU3R5bGUoIiIpfSl9OyhmdW5jdGlvbigpe3RoaXMub25Nb3VzZUV2ZW50PWZ1bmN0aW9uKGUsdCl7dGhpcy5lZGl0b3IuX2VtaXQoZSxuZXcgdSh0LHRoaXMuZWRpdG9yKSl9LHRoaXMub25Nb3VzZU1vdmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmVkaXRvci5fZXZlbnRSZWdpc3RyeSYmdGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkubW91c2Vtb3ZlO2lmKCFufHwhbi5sZW5ndGgpcmV0dXJuO3RoaXMuZWRpdG9yLl9lbWl0KGUsbmV3IHUodCx0aGlzLmVkaXRvcikpfSx0aGlzLm9uTW91c2VXaGVlbD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyB1KHQsdGhpcy5lZGl0b3IpO24uc3BlZWQ9dGhpcy4kc2Nyb2xsU3BlZWQqMixuLndoZWVsWD10LndoZWVsWCxuLndoZWVsWT10LndoZWVsWSx0aGlzLmVkaXRvci5fZW1pdChlLG4pfSx0aGlzLnNldFN0YXRlPWZ1bmN0aW9uKGUpe3RoaXMuc3RhdGU9ZX0sdGhpcy5jYXB0dXJlTW91c2U9ZnVuY3Rpb24oZSx0KXt0aGlzLng9ZS54LHRoaXMueT1lLnksdGhpcy5pc01vdXNlUHJlc3NlZD0hMDt2YXIgbj10aGlzLmVkaXRvcixzPXRoaXMuZWRpdG9yLnJlbmRlcmVyO3MuJGlzTW91c2VQcmVzc2VkPSEwO3ZhciBvPXRoaXMsYT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47aWYoaS5pc1dlYktpdCYmIWUud2hpY2gmJm8ucmVsZWFzZU1vdXNlKXJldHVybiBvLnJlbGVhc2VNb3VzZSgpO28ueD1lLmNsaWVudFgsby55PWUuY2xpZW50WSx0JiZ0KGUpLG8ubW91c2VFdmVudD1uZXcgdShlLG8uZWRpdG9yKSxvLiRtb3VzZU1vdmVkPSEwfSxmPWZ1bmN0aW9uKGUpe24ub2ZmKCJiZWZvcmVFbmRPcGVyYXRpb24iLGMpLGNsZWFySW50ZXJ2YWwoaCksbCgpLG9bby5zdGF0ZSsiRW5kIl0mJm9bby5zdGF0ZSsiRW5kIl0oZSksby5zdGF0ZT0iIixvLmlzTW91c2VQcmVzc2VkPXMuJGlzTW91c2VQcmVzc2VkPSExLHMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yJiZzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLG8uJG9uQ2FwdHVyZU1vdXNlTW92ZT1vLnJlbGVhc2VNb3VzZT1udWxsLGUmJm8ub25Nb3VzZUV2ZW50KCJtb3VzZXVwIixlKSxuLmVuZE9wZXJhdGlvbigpfSxsPWZ1bmN0aW9uKCl7b1tvLnN0YXRlXSYmb1tvLnN0YXRlXSgpLG8uJG1vdXNlTW92ZWQ9ITF9O2lmKGkuaXNPbGRJRSYmZS5kb21FdmVudC50eXBlPT0iZGJsY2xpY2siKXJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZihlKX0pO3ZhciBjPWZ1bmN0aW9uKGUpe2lmKCFvLnJlbGVhc2VNb3VzZSlyZXR1cm47bi5jdXJPcC5jb21tYW5kLm5hbWUmJm4uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCYmKG9bby5zdGF0ZSsiRW5kIl0mJm9bby5zdGF0ZSsiRW5kIl0oKSxvLnN0YXRlPSIiLG8ucmVsZWFzZU1vdXNlKCkpfTtuLm9uKCJiZWZvcmVFbmRPcGVyYXRpb24iLGMpLG4uc3RhcnRPcGVyYXRpb24oe2NvbW1hbmQ6e25hbWU6Im1vdXNlIn19KSxvLiRvbkNhcHR1cmVNb3VzZU1vdmU9YSxvLnJlbGVhc2VNb3VzZT1yLmNhcHR1cmUodGhpcy5lZGl0b3IuY29udGFpbmVyLGEsZik7dmFyIGg9c2V0SW50ZXJ2YWwobCwyMCl9LHRoaXMucmVsZWFzZU1vdXNlPW51bGwsdGhpcy5jYW5jZWxDb250ZXh0TWVudT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQpe2lmKHQmJnQuZG9tRXZlbnQmJnQuZG9tRXZlbnQudHlwZSE9ImNvbnRleHRtZW51IilyZXR1cm47dGhpcy5lZGl0b3Iub2ZmKCJuYXRpdmVjb250ZXh0bWVudSIsZSksdCYmdC5kb21FdmVudCYmci5zdG9wRXZlbnQodC5kb21FdmVudCl9LmJpbmQodGhpcyk7c2V0VGltZW91dChlLDEwKSx0aGlzLmVkaXRvci5vbigibmF0aXZlY29udGV4dG1lbnUiLGUpfX0pLmNhbGwoYy5wcm90b3R5cGUpLGwuZGVmaW5lT3B0aW9ucyhjLnByb3RvdHlwZSwibW91c2VIYW5kbGVyIix7c2Nyb2xsU3BlZWQ6e2luaXRpYWxWYWx1ZToyfSxkcmFnRGVsYXk6e2luaXRpYWxWYWx1ZTppLmlzTWFjPzE1MDowfSxkcmFnRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSxmb2N1c1RpbWVvdXQ6e2luaXRpYWxWYWx1ZTowfSx0b29sdGlwRm9sbG93c01vdXNlOntpbml0aWFsVmFsdWU6ITB9fSksdC5Nb3VzZUhhbmRsZXI9Y30pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlKXtlLm9uKCJjbGljayIsZnVuY3Rpb24odCl7dmFyIG49dC5nZXREb2N1bWVudFBvc2l0aW9uKCksaT1lLnNlc3Npb24scz1pLmdldEZvbGRBdChuLnJvdyxuLmNvbHVtbiwxKTtzJiYodC5nZXRBY2NlbEtleSgpP2kucmVtb3ZlRm9sZChzKTppLmV4cGFuZEZvbGQocyksdC5zdG9wKCkpO3ZhciBvPXQuZG9tRXZlbnQmJnQuZG9tRXZlbnQudGFyZ2V0O28mJnIuaGFzQ3NzQ2xhc3MobywiYWNlX2lubGluZV9idXR0b24iKSYmci5oYXNDc3NDbGFzcyhvLCJhY2VfdG9nZ2xlX3dyYXAiKSYmKGkuc2V0T3B0aW9uKCJ3cmFwIiwhaS5nZXRVc2VXcmFwTW9kZSgpKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCkpfSksZS5vbigiZ3V0dGVyY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLmdldFJlZ2lvbih0KTtpZihuPT0iZm9sZFdpZGdldHMiKXt2YXIgcj10LmdldERvY3VtZW50UG9zaXRpb24oKS5yb3csaT1lLnNlc3Npb247aS5mb2xkV2lkZ2V0cyYmaS5mb2xkV2lkZ2V0c1tyXSYmZS5zZXNzaW9uLm9uRm9sZFdpZGdldENsaWNrKHIsdCksZS5pc0ZvY3VzZWQoKXx8ZS5mb2N1cygpLHQuc3RvcCgpfX0pLGUub24oImd1dHRlcmRibGNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRSZWdpb24odCk7aWYobj09ImZvbGRXaWRnZXRzIil7dmFyIHI9dC5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LGk9ZS5zZXNzaW9uLHM9aS5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKHIsITApLG89cy5yYW5nZXx8cy5maXJzdFJhbmdlO2lmKG8pe3I9by5zdGFydC5yb3c7dmFyIHU9aS5nZXRGb2xkQXQocixpLmdldExpbmUocikubGVuZ3RoLDEpO3U/aS5yZW1vdmVGb2xkKHUpOihpLmFkZEZvbGQoIi4uLiIsbyksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyh7cm93Om8uc3RhcnQucm93LGNvbHVtbjowfSkpfXQuc3RvcCgpfX0pfXZhciByPWUoIi4uL2xpYi9kb20iKTt0LkZvbGRIYW5kbGVyPWl9KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9rZXlzIiksaT1lKCIuLi9saWIvZXZlbnQiKSxzPWZ1bmN0aW9uKGUpe3RoaXMuJGVkaXRvcj1lLHRoaXMuJGRhdGE9e2VkaXRvcjplfSx0aGlzLiRoYW5kbGVycz1bXSx0aGlzLnNldERlZmF1bHRIYW5kbGVyKGUuY29tbWFuZHMpfTsoZnVuY3Rpb24oKXt0aGlzLnNldERlZmF1bHRIYW5kbGVyPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKHRoaXMuJGRlZmF1bHRIYW5kbGVyKSx0aGlzLiRkZWZhdWx0SGFuZGxlcj1lLHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyKGUsMCl9LHRoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGhhbmRsZXJzO2lmKHRbdC5sZW5ndGgtMV09PWUpcmV0dXJuO3doaWxlKHRbdC5sZW5ndGgtMV0mJnRbdC5sZW5ndGgtMV0hPXRoaXMuJGRlZmF1bHRIYW5kbGVyKXRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKHRbdC5sZW5ndGgtMV0pO3RoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyKGUsMSl9LHRoaXMuYWRkS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7aWYoIWUpcmV0dXJuO3R5cGVvZiBlPT0iZnVuY3Rpb24iJiYhZS5oYW5kbGVLZXlib2FyZCYmKGUuaGFuZGxlS2V5Ym9hcmQ9ZSk7dmFyIG49dGhpcy4kaGFuZGxlcnMuaW5kZXhPZihlKTtuIT0tMSYmdGhpcy4kaGFuZGxlcnMuc3BsaWNlKG4sMSksdD09dW5kZWZpbmVkP3RoaXMuJGhhbmRsZXJzLnB1c2goZSk6dGhpcy4kaGFuZGxlcnMuc3BsaWNlKHQsMCxlKSxuPT0tMSYmZS5hdHRhY2gmJmUuYXR0YWNoKHRoaXMuJGVkaXRvcil9LHRoaXMucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGhhbmRsZXJzLmluZGV4T2YoZSk7cmV0dXJuIHQ9PS0xPyExOih0aGlzLiRoYW5kbGVycy5zcGxpY2UodCwxKSxlLmRldGFjaCYmZS5kZXRhY2godGhpcy4kZWRpdG9yKSwhMCl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhhbmRsZXJzW3RoaXMuJGhhbmRsZXJzLmxlbmd0aC0xXX0sdGhpcy5nZXRTdGF0dXNUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZGF0YSx0PWUuZWRpdG9yO3JldHVybiB0aGlzLiRoYW5kbGVycy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U3RhdHVzVGV4dCYmbi5nZXRTdGF0dXNUZXh0KHQsZSl8fCIifSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiAiKX0sdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIHMsbz0hMSx1PXRoaXMuJGVkaXRvci5jb21tYW5kcztmb3IodmFyIGE9dGhpcy4kaGFuZGxlcnMubGVuZ3RoO2EtLTspe3M9dGhpcy4kaGFuZGxlcnNbYV0uaGFuZGxlS2V5Ym9hcmQodGhpcy4kZGF0YSxlLHQsbixyKTtpZighc3x8IXMuY29tbWFuZCljb250aW51ZTtzLmNvbW1hbmQ9PSJudWxsIj9vPSEwOm89dS5leGVjKHMuY29tbWFuZCx0aGlzLiRlZGl0b3Iscy5hcmdzLHIpLG8mJnImJmUhPS0xJiZzLnBhc3NFdmVudCE9MSYmcy5jb21tYW5kLnBhc3NFdmVudCE9MSYmaS5zdG9wRXZlbnQocik7aWYobylicmVha31yZXR1cm4hbyYmZT09LTEmJihzPXtjb21tYW5kOiJpbnNlcnRzdHJpbmcifSxvPXUuZXhlYygiaW5zZXJ0c3RyaW5nIix0aGlzLiRlZGl0b3IsdCkpLG8mJnRoaXMuJGVkaXRvci5fc2lnbmFsJiZ0aGlzLiRlZGl0b3IuX3NpZ25hbCgia2V5Ym9hcmRBY3Rpdml0eSIscyksb30sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXIua2V5Q29kZVRvU3RyaW5nKG4pO3JldHVybiB0aGlzLiRjYWxsS2V5Ym9hcmRIYW5kbGVycyh0LGksbixlKX0sdGhpcy5vblRleHRJbnB1dD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnMoLTEsZSl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5LZXlCaW5kaW5nPXN9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2JpZGl1dGlsIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBGKGUsdCxuLHIpe3ZhciBpPXM/ZDpwLGM9bnVsbCxoPW51bGwsdj1udWxsLG09MCxnPW51bGwseT1udWxsLGI9LTEsdz1udWxsLEU9bnVsbCxUPVtdO2lmKCFyKWZvcih3PTAscj1bXTt3PG47dysrKXJbd109UihlW3ddKTtvPXMsdT0hMSxhPSExLGY9ITEsbD0hMTtmb3IoRT0wO0U8bjtFKyspe2M9bSxUW0VdPWg9cShlLHIsVCxFKSxtPWlbY11baF0sZz1tJjI0MCxtJj0xNSx0W0VdPXY9aVttXVs1XTtpZihnPjApaWYoZz09MTYpe2Zvcih3PWI7dzxFO3crKyl0W3ddPTE7Yj0tMX1lbHNlIGI9LTE7eT1pW21dWzZdO2lmKHkpYj09LTEmJihiPUUpO2Vsc2UgaWYoYj4tMSl7Zm9yKHc9Yjt3PEU7dysrKXRbd109djtiPS0xfXJbRV09PVMmJih0W0VdPTApLG98PXZ9aWYobClmb3Iodz0wO3c8bjt3KyspaWYoclt3XT09eCl7dFt3XT1zO2Zvcih2YXIgQz13LTE7Qz49MDtDLS0pe2lmKHJbQ10hPU4pYnJlYWs7dFtDXT1zfX19ZnVuY3Rpb24gSShlLHQsbil7aWYobzxlKXJldHVybjtpZihlPT0xJiZzPT1tJiYhZil7bi5yZXZlcnNlKCk7cmV0dXJufXZhciByPW4ubGVuZ3RoLGk9MCx1LGEsbCxjO3doaWxlKGk8cil7aWYodFtpXT49ZSl7dT1pKzE7d2hpbGUodTxyJiZ0W3VdPj1lKXUrKztmb3IoYT1pLGw9dS0xO2E8bDthKyssbC0tKWM9blthXSxuW2FdPW5bbF0sbltsXT1jO2k9dX1pKyt9fWZ1bmN0aW9uIHEoZSx0LG4scil7dmFyIGk9dFtyXSxvLGMsaCxwO3N3aXRjaChpKXtjYXNlIGc6Y2FzZSB5OnU9ITE7Y2FzZSBFOmNhc2UgdzpyZXR1cm4gaTtjYXNlIGI6cmV0dXJuIHU/dzpiO2Nhc2UgVDpyZXR1cm4gdT0hMCxhPSEwLHk7Y2FzZSBOOnJldHVybiBFO2Nhc2UgQzppZihyPDF8fHIrMT49dC5sZW5ndGh8fChvPW5bci0xXSkhPWImJm8hPXd8fChjPXRbcisxXSkhPWImJmMhPXcpcmV0dXJuIEU7cmV0dXJuIHUmJihjPXcpLGM9PW8/YzpFO2Nhc2UgazpvPXI+MD9uW3ItMV06UztpZihvPT1iJiZyKzE8dC5sZW5ndGgmJnRbcisxXT09YilyZXR1cm4gYjtyZXR1cm4gRTtjYXNlIEw6aWYocj4wJiZuW3ItMV09PWIpcmV0dXJuIGI7aWYodSlyZXR1cm4gRTtwPXIrMSxoPXQubGVuZ3RoO3doaWxlKHA8aCYmdFtwXT09TClwKys7aWYocDxoJiZ0W3BdPT1iKXJldHVybiBiO3JldHVybiBFO2Nhc2UgQTpoPXQubGVuZ3RoLHA9cisxO3doaWxlKHA8aCYmdFtwXT09QSlwKys7aWYocDxoKXt2YXIgZD1lW3JdLHY9ZD49MTQyNSYmZDw9MjMwM3x8ZD09NjQyODY7bz10W3BdO2lmKHYmJihvPT15fHxvPT1UKSlyZXR1cm4geX1pZihyPDF8fChvPXRbci0xXSk9PVMpcmV0dXJuIEU7cmV0dXJuIG5bci0xXTtjYXNlIFM6cmV0dXJuIHU9ITEsZj0hMCxzO2Nhc2UgeDpyZXR1cm4gbD0hMCxFO2Nhc2UgTzpjYXNlIE06Y2FzZSBEOmNhc2UgUDpjYXNlIF86dT0hMTtjYXNlIEg6cmV0dXJuIEV9fWZ1bmN0aW9uIFIoZSl7dmFyIHQ9ZS5jaGFyQ29kZUF0KDApLG49dD4+ODtyZXR1cm4gbj09MD90PjE5MT9nOkJbdF06bj09NT8vW1x1MDU5MS1cdTA1ZjRdLy50ZXN0KGUpP3k6ZzpuPT02Py9bXHUwNjEwLVx1MDYxYVx1MDY0Yi1cdTA2NWZcdTA2ZDYtXHUwNmU0XHUwNmU3LVx1MDZlZF0vLnRlc3QoZSk/QTovW1x1MDY2MC1cdTA2NjlcdTA2NmItXHUwNjZjXS8udGVzdChlKT93OnQ9PTE2NDI/TDovW1x1MDZmMC1cdTA2ZjldLy50ZXN0KGUpP2I6VDpuPT0zMiYmdDw9ODI4Nz9qW3QmMjU1XTpuPT0yNTQ/dD49NjUxMzY/VDpFOkV9ZnVuY3Rpb24gVShlKXtyZXR1cm4gZT49Ilx1MDY0YiImJmU8PSJcdTA2NTUifXZhciByPVsiXHUwNjIxIiwiXHUwNjQxIl0saT1bIlx1MDYzYSIsIlx1MDY0YSJdLHM9MCxvPTAsdT0hMSxhPSExLGY9ITEsbD0hMSxjPSExLGg9ITEscD1bWzAsMywwLDEsMCwwLDBdLFswLDMsMCwxLDIsMiwwXSxbMCwzLDAsMTcsMiwwLDFdLFswLDMsNSw1LDQsMSwwXSxbMCwzLDIxLDIxLDQsMCwxXSxbMCwzLDUsNSw0LDIsMF1dLGQ9W1syLDAsMSwxLDAsMSwwXSxbMiwwLDEsMSwwLDIsMF0sWzIsMCwyLDEsMywyLDBdLFsyLDAsMiwzMywzLDEsMV1dLHY9MCxtPTEsZz0wLHk9MSxiPTIsdz0zLEU9NCxTPTUseD02LFQ9NyxOPTgsQz05LGs9MTAsTD0xMSxBPTEyLE89MTMsTT0xNCxfPTE1LEQ9MTYsUD0xNyxIPTE4LEI9W0gsSCxILEgsSCxILEgsSCxILHgsUyx4LE4sUyxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsUyxTLFMseCxOLEUsRSxMLEwsTCxFLEUsRSxFLEUsayxDLGssQyxDLGIsYixiLGIsYixiLGIsYixiLGIsQyxFLEUsRSxFLEUsRSxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsRSxFLEUsRSxFLEUsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLEUsRSxFLEUsSCxILEgsSCxILEgsUyxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsQyxFLEwsTCxMLEwsRSxFLEUsRSxnLEUsRSxILEUsRSxMLEwsYixiLEUsZyxFLEUsRSxiLGcsRSxFLEUsRSxFXSxqPVtOLE4sTixOLE4sTixOLE4sTixOLE4sSCxILEgsZyx5LEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLE4sUyxPLE0sXyxELFAsQyxMLEwsTCxMLEwsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsQyxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsTl07dC5MPWcsdC5SPXksdC5FTj1iLHQuT05fUj0zLHQuQU49NCx0LlJfSD01LHQuQj02LHQuUkxFPTcsdC5ET1Q9Ilx1MDBiNyIsdC5kb0JpZGlSZW9yZGVyPWZ1bmN0aW9uKGUsbixyKXtpZihlLmxlbmd0aDwyKXJldHVybnt9O3ZhciBpPWUuc3BsaXQoIiIpLG89bmV3IEFycmF5KGkubGVuZ3RoKSx1PW5ldyBBcnJheShpLmxlbmd0aCksYT1bXTtzPXI/bTp2LEYoaSxhLGkubGVuZ3RoLG4pO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGg7b1tmXT1mLGYrKyk7SSgyLGEsbyksSSgxLGEsbyk7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aC0xO2YrKyluW2ZdPT09dz9hW2ZdPXQuQU46YVtmXT09PXkmJihuW2ZdPlQmJm5bZl08T3x8bltmXT09PUV8fG5bZl09PT1IKT9hW2ZdPXQuT05fUjpmPjAmJmlbZi0xXT09PSJcdTA2NDQiJiYvXHUwNjIyfFx1MDYyM3xcdTA2MjV8XHUwNjI3Ly50ZXN0KGlbZl0pJiYoYVtmLTFdPWFbZl09dC5SX0gsZisrKTtpW2kubGVuZ3RoLTFdPT09dC5ET1QmJihhW2kubGVuZ3RoLTFdPXQuQiksaVswXT09PSJcdTIwMmIiJiYoYVswXT10LlJMRSk7Zm9yKHZhciBmPTA7ZjxvLmxlbmd0aDtmKyspdVtmXT1hW29bZl1dO3JldHVybntsb2dpY2FsRnJvbVZpc3VhbDpvLGJpZGlMZXZlbHM6dX19LHQuaGFzQmlkaUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTtmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyl0W3JdPVIoZS5jaGFyQXQocikpLCFuJiYodFtyXT09eXx8dFtyXT09VHx8dFtyXT09dykmJihuPSEwKTtyZXR1cm4gbn0sdC5nZXRWaXN1YWxGcm9tTG9naWNhbElkeD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sb2dpY2FsRnJvbVZpc3VhbC5sZW5ndGg7bisrKWlmKHQubG9naWNhbEZyb21WaXN1YWxbbl09PWUpcmV0dXJuIG47cmV0dXJuIDB9fSksYWNlLmRlZmluZSgiYWNlL2JpZGloYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9iaWRpdXRpbCIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvYmlkaXV0aWwiKSxpPWUoIi4vbGliL2xhbmciKSxzPS9bXHUwNTkwLVx1MDVmNFx1MDYwMC1cdTA2ZmZcdTA3MDAtXHUwOGFjXHUyMDJCXS8sbz1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmJpZGlNYXA9e30sdGhpcy5jdXJyZW50Um93PW51bGwsdGhpcy5iaWRpVXRpbD1yLHRoaXMuY2hhcldpZHRocz1bXSx0aGlzLkVPTD0iXHUwMGFjIix0aGlzLnNob3dJbnZpc2libGVzPSEwLHRoaXMuaXNSdGxEaXI9ITEsdGhpcy4kaXNSdGw9ITEsdGhpcy5saW5lPSIiLHRoaXMud3JhcEluZGVudD0wLHRoaXMuRU9GPSJcdTAwYjYiLHRoaXMuUkxFPSJcdTIwMmIiLHRoaXMuY29udGVudFdpZHRoPTAsdGhpcy5mb250TWV0cmljcz1udWxsLHRoaXMucnRsTGluZU9mZnNldD0wLHRoaXMud3JhcE9mZnNldD0wLHRoaXMuaXNNb3ZlTGVmdE9wZXJhdGlvbj0hMSx0aGlzLnNlZW5CaWRpPXMudGVzdChlLmdldFZhbHVlKCkpfTsoZnVuY3Rpb24oKXt0aGlzLmlzQmlkaVJvdz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuc2VlbkJpZGk/KGUhPT10aGlzLmN1cnJlbnRSb3cmJih0aGlzLmN1cnJlbnRSb3c9ZSx0aGlzLnVwZGF0ZVJvd0xpbmUodCxuKSx0aGlzLnVwZGF0ZUJpZGlNYXAoKSksdGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMpOiExfSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuc2VlbkJpZGk/dGhpcy5jdXJyZW50Um93PW51bGw6ZS5hY3Rpb249PSJpbnNlcnQiJiZzLnRlc3QoZS5saW5lcy5qb2luKCJcbiIpKSYmKHRoaXMuc2VlbkJpZGk9ITAsdGhpcy5jdXJyZW50Um93PW51bGwpfSx0aGlzLmdldERvY3VtZW50Um93PWZ1bmN0aW9uKCl7dmFyIGU9MCx0PXRoaXMuc2Vzc2lvbi4kc2NyZWVuUm93Q2FjaGU7aWYodC5sZW5ndGgpe3ZhciBuPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdyk7bj49MCYmKGU9dGhpcy5zZXNzaW9uLiRkb2NSb3dDYWNoZVtuXSl9cmV0dXJuIGV9LHRoaXMuZ2V0U3BsaXRJbmRleD1mdW5jdGlvbigpe3ZhciBlPTAsdD10aGlzLnNlc3Npb24uJHNjcmVlblJvd0NhY2hlO2lmKHQubGVuZ3RoKXt2YXIgbixyPXRoaXMuc2Vzc2lvbi4kZ2V0Um93Q2FjaGVJbmRleCh0LHRoaXMuY3VycmVudFJvdyk7d2hpbGUodGhpcy5jdXJyZW50Um93LWU+MCl7bj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3ctZS0xKTtpZihuIT09cilicmVhaztyPW4sZSsrfX1lbHNlIGU9dGhpcy5jdXJyZW50Um93O3JldHVybiBlfSx0aGlzLnVwZGF0ZVJvd0xpbmU9ZnVuY3Rpb24oZSx0KXtlPT09dW5kZWZpbmVkJiYoZT10aGlzLmdldERvY3VtZW50Um93KCkpO3ZhciBuPWU9PT10aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCktMSxzPW4/dGhpcy5FT0Y6dGhpcy5FT0w7dGhpcy53cmFwSW5kZW50PTAsdGhpcy5saW5lPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLHRoaXMuaXNSdGxEaXI9dGhpcy4kaXNSdGx8fHRoaXMubGluZS5jaGFyQXQoMCk9PT10aGlzLlJMRTtpZih0aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlKXt2YXIgbz10aGlzLnNlc3Npb24uJHdyYXBEYXRhW2VdO28mJih0PT09dW5kZWZpbmVkJiYodD10aGlzLmdldFNwbGl0SW5kZXgoKSksdD4wJiZvLmxlbmd0aD8odGhpcy53cmFwSW5kZW50PW8uaW5kZW50LHRoaXMud3JhcE9mZnNldD10aGlzLndyYXBJbmRlbnQqdGhpcy5jaGFyV2lkdGhzW3IuTF0sdGhpcy5saW5lPXQ8by5sZW5ndGg/dGhpcy5saW5lLnN1YnN0cmluZyhvW3QtMV0sb1t0XSk6dGhpcy5saW5lLnN1YnN0cmluZyhvW28ubGVuZ3RoLTFdKSk6dGhpcy5saW5lPXRoaXMubGluZS5zdWJzdHJpbmcoMCxvW3RdKSksdD09by5sZW5ndGgmJih0aGlzLmxpbmUrPXRoaXMuc2hvd0ludmlzaWJsZXM/czpyLkRPVCl9ZWxzZSB0aGlzLmxpbmUrPXRoaXMuc2hvd0ludmlzaWJsZXM/czpyLkRPVDt2YXIgdT10aGlzLnNlc3Npb24sYT0wLGY7dGhpcy5saW5lPXRoaXMubGluZS5yZXBsYWNlKC9cdHxbXHUxMTAwLVx1MjAyOSwgXHUyMDJGLVx1RkZFNl0vZyxmdW5jdGlvbihlLHQpe3JldHVybiBlPT09IgkifHx1LmlzRnVsbFdpZHRoKGUuY2hhckNvZGVBdCgwKSk/KGY9ZT09PSIJIj91LmdldFNjcmVlblRhYlNpemUodCthKToyLGErPWYtMSxpLnN0cmluZ1JlcGVhdChyLkRPVCxmKSk6ZX0pLHRoaXMuaXNSdGxEaXImJih0aGlzLmZvbnRNZXRyaWNzLiRtYWluLnRleHRDb250ZW50PXRoaXMubGluZS5jaGFyQXQodGhpcy5saW5lLmxlbmd0aC0xKT09ci5ET1Q/dGhpcy5saW5lLnN1YnN0cigwLHRoaXMubGluZS5sZW5ndGgtMSk6dGhpcy5saW5lLHRoaXMucnRsTGluZU9mZnNldD10aGlzLmNvbnRlbnRXaWR0aC10aGlzLmZvbnRNZXRyaWNzLiRtYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKX0sdGhpcy51cGRhdGVCaWRpTWFwPWZ1bmN0aW9uKCl7dmFyIGU9W107ci5oYXNCaWRpQ2hhcmFjdGVycyh0aGlzLmxpbmUsZSl8fHRoaXMuaXNSdGxEaXI/dGhpcy5iaWRpTWFwPXIuZG9CaWRpUmVvcmRlcih0aGlzLmxpbmUsZSx0aGlzLmlzUnRsRGlyKTp0aGlzLmJpZGlNYXA9e319LHRoaXMubWFya0FzRGlydHk9ZnVuY3Rpb24oKXt0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy51cGRhdGVDaGFyYWN0ZXJXaWR0aHM9ZnVuY3Rpb24oZSl7aWYodGhpcy5jaGFyYWN0ZXJXaWR0aD09PWUuJGNoYXJhY3RlclNpemUud2lkdGgpcmV0dXJuO3RoaXMuZm9udE1ldHJpY3M9ZTt2YXIgdD10aGlzLmNoYXJhY3RlcldpZHRoPWUuJGNoYXJhY3RlclNpemUud2lkdGgsbj1lLiRtZWFzdXJlQ2hhcldpZHRoKCJcdTA1ZDQiKTt0aGlzLmNoYXJXaWR0aHNbci5MXT10aGlzLmNoYXJXaWR0aHNbci5FTl09dGhpcy5jaGFyV2lkdGhzW3IuT05fUl09dCx0aGlzLmNoYXJXaWR0aHNbci5SXT10aGlzLmNoYXJXaWR0aHNbci5BTl09bix0aGlzLmNoYXJXaWR0aHNbci5SX0hdPW4qLjQ1LHRoaXMuY2hhcldpZHRoc1tyLkJdPXRoaXMuY2hhcldpZHRoc1tyLlJMRV09MCx0aGlzLmN1cnJlbnRSb3c9bnVsbH0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnNob3dJbnZpc2libGVzPWUsdGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMuc2V0RW9sQ2hhcj1mdW5jdGlvbihlKXt0aGlzLkVPTD1lfSx0aGlzLnNldENvbnRlbnRXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmNvbnRlbnRXaWR0aD1lfSx0aGlzLmlzUnRsTGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kaXNSdGw/ITA6ZSE9dW5kZWZpbmVkP3RoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpLmNoYXJBdCgwKT09dGhpcy5STEU6dGhpcy5pc1J0bERpcn0sdGhpcy5zZXRSdGxEaXJlY3Rpb249ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCk7Zm9yKHZhciByPWUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpLnJvdztyPD1uLnJvdztyKyspIXQmJmUuc2Vzc2lvbi5nZXRMaW5lKHIpLmNoYXJBdCgwKT09PWUuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuUkxFP2Uuc2Vzc2lvbi5kb2MucmVtb3ZlSW5MaW5lKHIsMCwxKTp0JiZlLnNlc3Npb24uZ2V0TGluZShyKS5jaGFyQXQoMCkhPT1lLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRSYmZS5zZXNzaW9uLmRvYy5pbnNlcnQoe2NvbHVtbjowLHJvdzpyfSxlLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRSl9LHRoaXMuZ2V0UG9zTGVmdD1mdW5jdGlvbihlKXtlLT10aGlzLndyYXBJbmRlbnQ7dmFyIHQ9dGhpcy5saW5lLmNoYXJBdCgwKT09PXRoaXMuUkxFPzE6MCxuPWU+dD90aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk/ZTplLTE6dCxpPXIuZ2V0VmlzdWFsRnJvbUxvZ2ljYWxJZHgobix0aGlzLmJpZGlNYXApLHM9dGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMsbz0wOyF0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmU8PXQmJnNbaV0lMiE9PTAmJmkrKztmb3IodmFyIHU9MDt1PGk7dSsrKW8rPXRoaXMuY2hhcldpZHRoc1tzW3VdXTtyZXR1cm4hdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlPnQmJnNbaV0lMj09PTAmJihvKz10aGlzLmNoYXJXaWR0aHNbc1tpXV0pLHRoaXMud3JhcEluZGVudCYmKG8rPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCksdGhpcy5pc1J0bERpciYmKG8rPXRoaXMucnRsTGluZU9mZnNldCksb30sdGhpcy5nZXRTZWxlY3Rpb25zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iaWRpTWFwLHI9bi5iaWRpTGV2ZWxzLGkscz1bXSxvPTAsdT1NYXRoLm1pbihlLHQpLXRoaXMud3JhcEluZGVudCxhPU1hdGgubWF4KGUsdCktdGhpcy53cmFwSW5kZW50LGY9ITEsbD0hMSxjPTA7dGhpcy53cmFwSW5kZW50JiYobys9dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KTtmb3IodmFyIGgscD0wO3A8ci5sZW5ndGg7cCsrKWg9bi5sb2dpY2FsRnJvbVZpc3VhbFtwXSxpPXJbcF0sZj1oPj11JiZoPGEsZiYmIWw/Yz1vOiFmJiZsJiZzLnB1c2goe2xlZnQ6Yyx3aWR0aDpvLWN9KSxvKz10aGlzLmNoYXJXaWR0aHNbaV0sbD1mO2YmJnA9PT1yLmxlbmd0aCYmcy5wdXNoKHtsZWZ0OmMsd2lkdGg6by1jfSk7aWYodGhpcy5pc1J0bERpcilmb3IodmFyIGQ9MDtkPHMubGVuZ3RoO2QrKylzW2RdLmxlZnQrPXRoaXMucnRsTGluZU9mZnNldDtyZXR1cm4gc30sdGhpcy5vZmZzZXRUb0NvbD1mdW5jdGlvbihlKXt0aGlzLmlzUnRsRGlyJiYoZS09dGhpcy5ydGxMaW5lT2Zmc2V0KTt2YXIgdD0wLGU9TWF0aC5tYXgoZSwwKSxuPTAscj0wLGk9dGhpcy5iaWRpTWFwLmJpZGlMZXZlbHMscz10aGlzLmNoYXJXaWR0aHNbaVtyXV07dGhpcy53cmFwSW5kZW50JiYoZS09dGhpcy5pc1J0bERpcj8tMSp0aGlzLndyYXBPZmZzZXQ6dGhpcy53cmFwT2Zmc2V0KTt3aGlsZShlPm4rcy8yKXtuKz1zO2lmKHI9PT1pLmxlbmd0aC0xKXtzPTA7YnJlYWt9cz10aGlzLmNoYXJXaWR0aHNbaVsrK3JdXX1yZXR1cm4gcj4wJiZpW3ItMV0lMiE9PTAmJmlbcl0lMj09PTA/KGU8biYmci0tLHQ9dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdKTpyPjAmJmlbci0xXSUyPT09MCYmaVtyXSUyIT09MD90PTErKGU+bj90aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl06dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3ItMV0pOnRoaXMuaXNSdGxEaXImJnI9PT1pLmxlbmd0aC0xJiZzPT09MCYmaVtyLTFdJTI9PT0wfHwhdGhpcy5pc1J0bERpciYmcj09PTAmJmlbcl0lMiE9PTA/dD0xK3RoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXToocj4wJiZpW3ItMV0lMiE9PTAmJnMhPT0wJiZyLS0sdD10aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl0pLHQ9PT0wJiZ0aGlzLmlzUnRsRGlyJiZ0KyssdCt0aGlzLndyYXBJbmRlbnR9fSkuY2FsbChvLnByb3RvdHlwZSksdC5CaWRpSGFuZGxlcj1vfSksYWNlLmRlZmluZSgiYWNlL3NlbGVjdGlvbiIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2xhbmciKSxzPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuL3JhbmdlIikuUmFuZ2UsdT1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSx0aGlzLmRvYz1lLmdldERvY3VtZW50KCksdGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMuY3Vyc29yPXRoaXMubGVhZD10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKSx0aGlzLmFuY2hvcj10aGlzLmRvYy5jcmVhdGVBbmNob3IoMCwwKSx0aGlzLiRzaWxlbnQ9ITE7dmFyIHQ9dGhpczt0aGlzLmN1cnNvci5vbigiY2hhbmdlIixmdW5jdGlvbihlKXt0LiRjdXJzb3JDaGFuZ2VkPSEwLHQuJHNpbGVudHx8dC5fZW1pdCgiY2hhbmdlQ3Vyc29yIiksIXQuJGlzRW1wdHkmJiF0LiRzaWxlbnQmJnQuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpLCF0LiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlJiZlLm9sZC5jb2x1bW4hPWUudmFsdWUuY29sdW1uJiYodC4kZGVzaXJlZENvbHVtbj1udWxsKX0pLHRoaXMuYW5jaG9yLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7dC4kYW5jaG9yQ2hhbmdlZD0hMCwhdC4kaXNFbXB0eSYmIXQuJHNpbGVudCYmdC5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLmlzRW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaXNFbXB0eXx8dGhpcy5hbmNob3Iucm93PT10aGlzLmxlYWQucm93JiZ0aGlzLmFuY2hvci5jb2x1bW49PXRoaXMubGVhZC5jb2x1bW59LHRoaXMuaXNNdWx0aUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy4kaXNFbXB0eSYmdGhpcy5hbmNob3Iucm93IT10aGlzLmN1cnNvci5yb3d9LHRoaXMuZ2V0Q3Vyc29yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLnNldFNlbGVjdGlvbkFuY2hvcj1mdW5jdGlvbihlLHQpe3RoaXMuJGlzRW1wdHk9ITEsdGhpcy5hbmNob3Iuc2V0UG9zaXRpb24oZSx0KX0sdGhpcy5nZXRBbmNob3I9dGhpcy5nZXRTZWxlY3Rpb25BbmNob3I9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaXNFbXB0eT90aGlzLmdldFNlbGVjdGlvbkxlYWQoKTp0aGlzLmFuY2hvci5nZXRQb3NpdGlvbigpfSx0aGlzLmdldFNlbGVjdGlvbkxlYWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFkLmdldFBvc2l0aW9uKCl9LHRoaXMuaXNCYWNrd2FyZHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFuY2hvcix0PXRoaXMubGVhZDtyZXR1cm4gZS5yb3c+dC5yb3d8fGUucm93PT10LnJvdyYmZS5jb2x1bW4+dC5jb2x1bW59LHRoaXMuZ2V0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmFuY2hvcix0PXRoaXMubGVhZDtyZXR1cm4gdGhpcy4kaXNFbXB0eT9vLmZyb21Qb2ludHModCx0KTp0aGlzLmlzQmFja3dhcmRzKCk/by5mcm9tUG9pbnRzKHQsZSk6by5mcm9tUG9pbnRzKGUsdCl9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLiRpc0VtcHR5fHwodGhpcy4kaXNFbXB0eT0hMCx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy4kc2V0U2VsZWN0aW9uKDAsMCxOdW1iZXIuTUFYX1ZBTFVFLE51bWJlci5NQVhfVkFMVUUpfSx0aGlzLnNldFJhbmdlPXRoaXMuc2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P2UuZW5kOmUuc3RhcnQscj10P2Uuc3RhcnQ6ZS5lbmQ7dGhpcy4kc2V0U2VsZWN0aW9uKG4ucm93LG4uY29sdW1uLHIucm93LHIuY29sdW1uKX0sdGhpcy4kc2V0U2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGlzRW1wdHkscz10aGlzLmluTXVsdGlTZWxlY3RNb2RlO3RoaXMuJHNpbGVudD0hMCx0aGlzLiRjdXJzb3JDaGFuZ2VkPXRoaXMuJGFuY2hvckNoYW5nZWQ9ITEsdGhpcy5hbmNob3Iuc2V0UG9zaXRpb24oZSx0KSx0aGlzLmN1cnNvci5zZXRQb3NpdGlvbihuLHIpLHRoaXMuJGlzRW1wdHk9IW8uY29tcGFyZVBvaW50cyh0aGlzLmFuY2hvcix0aGlzLmN1cnNvciksdGhpcy4kc2lsZW50PSExLHRoaXMuJGN1cnNvckNoYW5nZWQmJnRoaXMuX2VtaXQoImNoYW5nZUN1cnNvciIpLCh0aGlzLiRjdXJzb3JDaGFuZ2VkfHx0aGlzLiRhbmNob3JDaGFuZ2VkfHxpIT10aGlzLiRpc0VtcHR5fHxzKSYmdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJG1vdmVTZWxlY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZWFkO3RoaXMuJGlzRW1wdHkmJnRoaXMuc2V0U2VsZWN0aW9uQW5jaG9yKHQucm93LHQuY29sdW1uKSxlLmNhbGwodGhpcyl9LHRoaXMuc2VsZWN0VG89ZnVuY3Rpb24oZSx0KXt0aGlzLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0pfSx0aGlzLnNlbGVjdFRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9KX0sdGhpcy5tb3ZlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy5zZWxlY3RVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yVXApfSx0aGlzLnNlbGVjdERvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckRvd24pfSx0aGlzLnNlbGVjdFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JSaWdodCl9LHRoaXMuc2VsZWN0TGVmdD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGVmdCl9LHRoaXMuc2VsZWN0TGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQpfSx0aGlzLnNlbGVjdExpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxpbmVFbmQpfSx0aGlzLnNlbGVjdEZpbGVFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVFbmQpfSx0aGlzLnNlbGVjdEZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yRmlsZVN0YXJ0KX0sdGhpcy5zZWxlY3RXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRSaWdodCl9LHRoaXMuc2VsZWN0V29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvcldvcmRMZWZ0KX0sdGhpcy5nZXRXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgdD09InVuZGVmaW5lZCIpe3ZhciBuPWV8fHRoaXMubGVhZDtlPW4ucm93LHQ9bi5jb2x1bW59cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoZSx0KX0sdGhpcy5zZWxlY3RXb3JkPWZ1bmN0aW9uKCl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLmdldFdvcmRSYW5nZSgpKX0sdGhpcy5zZWxlY3RBV29yZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q3Vyc29yKCksdD10aGlzLnNlc3Npb24uZ2V0QVdvcmRSYW5nZShlLnJvdyxlLmNvbHVtbik7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0KX0sdGhpcy5nZXRMaW5lUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZT09Im51bWJlciI/ZTp0aGlzLmxlYWQucm93LHIsaT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUobik7cmV0dXJuIGk/KG49aS5zdGFydC5yb3cscj1pLmVuZC5yb3cpOnI9bix0PT09ITA/bmV3IG8obiwwLHIsdGhpcy5zZXNzaW9uLmdldExpbmUocikubGVuZ3RoKTpuZXcgbyhuLDAscisxLDApfSx0aGlzLnNlbGVjdExpbmU9ZnVuY3Rpb24oKXt0aGlzLnNldFNlbGVjdGlvblJhbmdlKHRoaXMuZ2V0TGluZVJhbmdlKCkpfSx0aGlzLm1vdmVDdXJzb3JVcD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KC0xLDApfSx0aGlzLm1vdmVDdXJzb3JEb3duPWZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoMSwwKX0sdGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYj1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5jb2x1bW4saT1lLmNvbHVtbit0O3JldHVybiBuPDAmJihyPWUuY29sdW1uLXQsaT1lLmNvbHVtbiksdGhpcy5zZXNzaW9uLmlzVGFiU3RvcChlKSYmdGhpcy5kb2MuZ2V0TGluZShlLnJvdykuc2xpY2UocixpKS5zcGxpdCgiICIpLmxlbmd0aC0xPT10fSx0aGlzLm1vdmVDdXJzb3JMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLmdldFBvc2l0aW9uKCksdDtpZih0PXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csZS5jb2x1bW4sLTEpKXRoaXMubW92ZUN1cnNvclRvKHQuc3RhcnQucm93LHQuc3RhcnQuY29sdW1uKTtlbHNlIGlmKGUuY29sdW1uPT09MCllLnJvdz4wJiZ0aGlzLm1vdmVDdXJzb3JUbyhlLnJvdy0xLHRoaXMuZG9jLmdldExpbmUoZS5yb3ctMSkubGVuZ3RoKTtlbHNle3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCk7dGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYihlLG4sLTEpJiYhdGhpcy5zZXNzaW9uLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnMoKT90aGlzLm1vdmVDdXJzb3JCeSgwLC1uKTp0aGlzLm1vdmVDdXJzb3JCeSgwLC0xKX19LHRoaXMubW92ZUN1cnNvclJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLmdldFBvc2l0aW9uKCksdDtpZih0PXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csZS5jb2x1bW4sMSkpdGhpcy5tb3ZlQ3Vyc29yVG8odC5lbmQucm93LHQuZW5kLmNvbHVtbik7ZWxzZSBpZih0aGlzLmxlYWQuY29sdW1uPT10aGlzLmRvYy5nZXRMaW5lKHRoaXMubGVhZC5yb3cpLmxlbmd0aCl0aGlzLmxlYWQucm93PHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvclRvKHRoaXMubGVhZC5yb3crMSwwKTtlbHNle3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUYWJTaXplKCksZT10aGlzLmxlYWQ7dGhpcy53b3VsZE1vdmVJbnRvU29mdFRhYihlLG4sMSkmJiF0aGlzLnNlc3Npb24uZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicygpP3RoaXMubW92ZUN1cnNvckJ5KDAsbik6dGhpcy5tb3ZlQ3Vyc29yQnkoMCwxKX19LHRoaXMubW92ZUN1cnNvckxpbmVTdGFydD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KSxyPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24obiwwKSxpPXRoaXMuc2Vzc2lvbi5nZXREaXNwbGF5TGluZShlLG51bGwsci5yb3csci5jb2x1bW4pLHM9aS5tYXRjaCgvXlxzKi8pO3NbMF0ubGVuZ3RoIT10JiYhdGhpcy5zZXNzaW9uLiR1c2VFbWFjc1N0eWxlTGluZVN0YXJ0JiYoci5jb2x1bW4rPXNbMF0ubGVuZ3RoKSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHIpfSx0aGlzLm1vdmVDdXJzb3JMaW5lRW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLHQ9dGhpcy5zZXNzaW9uLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uKGUucm93LGUuY29sdW1uKTtpZih0aGlzLmxlYWQuY29sdW1uPT10LmNvbHVtbil7dmFyIG49dGhpcy5zZXNzaW9uLmdldExpbmUodC5yb3cpO2lmKHQuY29sdW1uPT1uLmxlbmd0aCl7dmFyIHI9bi5zZWFyY2goL1xzKyQvKTtyPjAmJih0LmNvbHVtbj1yKX19dGhpcy5tb3ZlQ3Vyc29yVG8odC5yb3csdC5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JGaWxlRW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSx0PXRoaXMuZG9jLmdldExpbmUoZSkubGVuZ3RoO3RoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvckZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKDAsMCl9LHRoaXMubW92ZUN1cnNvckxvbmdXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuZG9jLmdldExpbmUoZSkscj1uLnN1YnN0cmluZyh0KTt0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MDt2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtpZihpKXt0aGlzLm1vdmVDdXJzb3JUbyhpLmVuZC5yb3csaS5lbmQuY29sdW1uKTtyZXR1cm59dGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhyKSYmKHQrPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCxyPW4uc3Vic3RyaW5nKHQpKTtpZih0Pj1uLmxlbmd0aCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSxuLmxlbmd0aCksdGhpcy5tb3ZlQ3Vyc29yUmlnaHQoKSxlPHRoaXMuZG9jLmdldExlbmd0aCgpLTEmJnRoaXMubW92ZUN1cnNvcldvcmRSaWdodCgpO3JldHVybn10aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKHIpJiYodCs9dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JMb25nV29yZExlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuO2lmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsLTEpKXt0aGlzLm1vdmVDdXJzb3JUbyhuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbik7cmV0dXJufXZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkU3RyaW5nQXQoZSx0LC0xKTtyPT1udWxsJiYocj10aGlzLmRvYy5nZXRMaW5lKGUpLnN1YnN0cmluZygwLHQpKTt2YXIgcz1pLnN0cmluZ1JldmVyc2Uocik7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLm5vblRva2VuUmUuZXhlYyhzKSYmKHQtPXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCxzPXMuc2xpY2UodGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4KSx0aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXg9MCk7aWYodDw9MCl7dGhpcy5tb3ZlQ3Vyc29yVG8oZSwwKSx0aGlzLm1vdmVDdXJzb3JMZWZ0KCksZT4wJiZ0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCgpO3JldHVybn10aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKHMpJiYodC09dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4LHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wKSx0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLiRzaG9ydFdvcmRFbmRJbmRleD1mdW5jdGlvbihlKXt2YXIgdD0wLG4scj0vXHMvLGk9dGhpcy5zZXNzaW9uLnRva2VuUmU7aS5sYXN0SW5kZXg9MDtpZih0aGlzLnNlc3Npb24udG9rZW5SZS5leGVjKGUpKXQ9dGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4O2Vsc2V7d2hpbGUoKG49ZVt0XSkmJnIudGVzdChuKSl0Kys7aWYodDwxKXtpLmxhc3RJbmRleD0wO3doaWxlKChuPWVbdF0pJiYhaS50ZXN0KG4pKXtpLmxhc3RJbmRleD0wLHQrKztpZihyLnRlc3Qobikpe2lmKHQ+Mil7dC0tO2JyZWFrfXdoaWxlKChuPWVbdF0pJiZyLnRlc3QobikpdCsrO2lmKHQ+MilicmVha319fX1yZXR1cm4gaS5sYXN0SW5kZXg9MCx0fSx0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG49dGhpcy5kb2MuZ2V0TGluZShlKSxyPW4uc3Vic3RyaW5nKHQpLGk9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7aWYoaSlyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8oaS5lbmQucm93LGkuZW5kLmNvbHVtbik7aWYodD09bi5sZW5ndGgpe3ZhciBzPXRoaXMuZG9jLmdldExlbmd0aCgpO2RvIGUrKyxyPXRoaXMuZG9jLmdldExpbmUoZSk7d2hpbGUoZTxzJiYvXlxzKiQvLnRlc3QocikpOy9eXHMrLy50ZXN0KHIpfHwocj0iIiksdD0wfXZhciBvPXRoaXMuJHNob3J0V29yZEVuZEluZGV4KHIpO3RoaXMubW92ZUN1cnNvclRvKGUsdCtvKX0sdGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5yb3csdD10aGlzLmxlYWQuY29sdW1uLG47aWYobj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwtMSkpcmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKTt2YXIgcj10aGlzLnNlc3Npb24uZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KTtpZih0PT09MCl7ZG8gZS0tLHI9dGhpcy5kb2MuZ2V0TGluZShlKTt3aGlsZShlPjAmJi9eXHMqJC8udGVzdChyKSk7dD1yLmxlbmd0aCwvXHMrJC8udGVzdChyKXx8KHI9IiIpfXZhciBzPWkuc3RyaW5nUmV2ZXJzZShyKSxvPXRoaXMuJHNob3J0V29yZEVuZEluZGV4KHMpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhlLHQtbyl9LHRoaXMubW92ZUN1cnNvcldvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kc2VsZWN0TG9uZ1dvcmRzP3RoaXMubW92ZUN1cnNvckxvbmdXb3JkUmlnaHQoKTp0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRSaWdodCgpfSx0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kc2VsZWN0TG9uZ1dvcmRzP3RoaXMubW92ZUN1cnNvckxvbmdXb3JkTGVmdCgpOnRoaXMubW92ZUN1cnNvclNob3J0V29yZExlZnQoKX0sdGhpcy5tb3ZlQ3Vyc29yQnk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMubGVhZC5yb3csdGhpcy5sZWFkLmNvbHVtbikscjt0PT09MCYmKGUhPT0wJiYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3cobi5yb3csdGhpcy5sZWFkLnJvdyk/KHI9dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KG4uY29sdW1uKSxuLmNvbHVtbj1NYXRoLnJvdW5kKHIvdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5jaGFyV2lkdGhzWzBdKSk6cj1uLmNvbHVtbip0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmNoYXJXaWR0aHNbMF0pLHRoaXMuJGRlc2lyZWRDb2x1bW4/bi5jb2x1bW49dGhpcy4kZGVzaXJlZENvbHVtbjp0aGlzLiRkZXNpcmVkQ29sdW1uPW4uY29sdW1uKTt2YXIgaT10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4ucm93K2Usbi5jb2x1bW4scik7ZSE9PTAmJnQ9PT0wJiZpLnJvdz09PXRoaXMubGVhZC5yb3cmJmkuY29sdW1uPT09dGhpcy5sZWFkLmNvbHVtbiYmdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzJiZ0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbaS5yb3ddJiYoaS5yb3c+MHx8ZT4wKSYmaS5yb3crKyx0aGlzLm1vdmVDdXJzb3JUbyhpLnJvdyxpLmNvbHVtbit0LHQ9PT0wKX0sdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLm1vdmVDdXJzb3JUbyhlLnJvdyxlLmNvbHVtbil9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUsdCwxKTtyJiYoZT1yLnN0YXJ0LnJvdyx0PXIuc3RhcnQuY29sdW1uKSx0aGlzLiRrZWVwRGVzaXJlZENvbHVtbk9uQ2hhbmdlPSEwO3ZhciBpPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpOy9bXHVEQzAwLVx1REZGRl0vLnRlc3QoaS5jaGFyQXQodCkpJiZpLmNoYXJBdCh0LTEpJiYodGhpcy5sZWFkLnJvdz09ZSYmdGhpcy5sZWFkLmNvbHVtbj09dCsxP3QtPTE6dCs9MSksdGhpcy5sZWFkLnNldFBvc2l0aW9uKGUsdCksdGhpcy4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZT0hMSxufHwodGhpcy4kZGVzaXJlZENvbHVtbj1udWxsKX0sdGhpcy5tb3ZlQ3Vyc29yVG9TY3JlZW49ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KTt0aGlzLm1vdmVDdXJzb3JUbyhyLnJvdyxyLmNvbHVtbixuKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLmxlYWQuZGV0YWNoKCksdGhpcy5hbmNob3IuZGV0YWNoKCksdGhpcy5zZXNzaW9uPXRoaXMuZG9jPW51bGx9LHRoaXMuZnJvbU9yaWVudGVkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZShlLGUuY3Vyc29yPT1lLnN0YXJ0KSx0aGlzLiRkZXNpcmVkQ29sdW1uPWUuZGVzaXJlZENvbHVtbnx8dGhpcy4kZGVzaXJlZENvbHVtbn0sdGhpcy50b09yaWVudGVkUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRSYW5nZSgpO3JldHVybiBlPyhlLnN0YXJ0LmNvbHVtbj10LnN0YXJ0LmNvbHVtbixlLnN0YXJ0LnJvdz10LnN0YXJ0LnJvdyxlLmVuZC5jb2x1bW49dC5lbmQuY29sdW1uLGUuZW5kLnJvdz10LmVuZC5yb3cpOmU9dCxlLmN1cnNvcj10aGlzLmlzQmFja3dhcmRzKCk/ZS5zdGFydDplLmVuZCxlLmRlc2lyZWRDb2x1bW49dGhpcy4kZGVzaXJlZENvbHVtbixlfSx0aGlzLmdldFJhbmdlT2ZNb3ZlbWVudHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRDdXJzb3IoKTt0cnl7ZSh0aGlzKTt2YXIgbj10aGlzLmdldEN1cnNvcigpO3JldHVybiBvLmZyb21Qb2ludHModCxuKX1jYXRjaChyKXtyZXR1cm4gby5mcm9tUG9pbnRzKHQsdCl9ZmluYWxseXt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfX0sdGhpcy50b0pTT049ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQpdmFyIGU9dGhpcy5yYW5nZXMubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUuY2xvbmUoKTtyZXR1cm4gdC5pc0JhY2t3YXJkcz1lLmN1cnNvcj09ZS5zdGFydCx0fSk7ZWxzZXt2YXIgZT10aGlzLmdldFJhbmdlKCk7ZS5pc0JhY2t3YXJkcz10aGlzLmlzQmFja3dhcmRzKCl9cmV0dXJuIGV9LHRoaXMuZnJvbUpTT049ZnVuY3Rpb24oZSl7aWYoZS5zdGFydD09dW5kZWZpbmVkKXtpZih0aGlzLnJhbmdlTGlzdCYmZS5sZW5ndGg+MSl7dGhpcy50b1NpbmdsZVJhbmdlKGVbMF0pO2Zvcih2YXIgdD1lLmxlbmd0aDt0LS07KXt2YXIgbj1vLmZyb21Qb2ludHMoZVt0XS5zdGFydCxlW3RdLmVuZCk7ZVt0XS5pc0JhY2t3YXJkcyYmKG4uY3Vyc29yPW4uc3RhcnQpLHRoaXMuYWRkUmFuZ2UobiwhMCl9cmV0dXJufWU9ZVswXX10aGlzLnJhbmdlTGlzdCYmdGhpcy50b1NpbmdsZVJhbmdlKGUpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoZSxlLmlzQmFja3dhcmRzKX0sdGhpcy5pc0VxdWFsPWZ1bmN0aW9uKGUpe2lmKChlLmxlbmd0aHx8dGhpcy5yYW5nZUNvdW50KSYmZS5sZW5ndGghPXRoaXMucmFuZ2VDb3VudClyZXR1cm4hMTtpZighZS5sZW5ndGh8fCF0aGlzLnJhbmdlcylyZXR1cm4gdGhpcy5nZXRSYW5nZSgpLmlzRXF1YWwoZSk7Zm9yKHZhciB0PXRoaXMucmFuZ2VzLmxlbmd0aDt0LS07KWlmKCF0aGlzLnJhbmdlc1t0XS5pc0VxdWFsKGVbdF0pKXJldHVybiExO3JldHVybiEwfX0pLmNhbGwodS5wcm90b3R5cGUpLHQuU2VsZWN0aW9uPXV9KSxhY2UuZGVmaW5lKCJhY2UvdG9rZW5pemVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9jb25maWciKSxpPTJlMyxzPWZ1bmN0aW9uKGUpe3RoaXMuc3RhdGVzPWUsdGhpcy5yZWdFeHBzPXt9LHRoaXMubWF0Y2hNYXBwaW5ncz17fTtmb3IodmFyIHQgaW4gdGhpcy5zdGF0ZXMpe3ZhciBuPXRoaXMuc3RhdGVzW3RdLHI9W10saT0wLHM9dGhpcy5tYXRjaE1hcHBpbmdzW3RdPXtkZWZhdWx0VG9rZW46InRleHQifSxvPSJnIix1PVtdO2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKXt2YXIgZj1uW2FdO2YuZGVmYXVsdFRva2VuJiYocy5kZWZhdWx0VG9rZW49Zi5kZWZhdWx0VG9rZW4pLGYuY2FzZUluc2Vuc2l0aXZlJiYobz0iZ2kiKTtpZihmLnJlZ2V4PT1udWxsKWNvbnRpbnVlO2YucmVnZXggaW5zdGFuY2VvZiBSZWdFeHAmJihmLnJlZ2V4PWYucmVnZXgudG9TdHJpbmcoKS5zbGljZSgxLC0xKSk7dmFyIGw9Zi5yZWdleCxjPShuZXcgUmVnRXhwKCIoPzooIitsKyIpfCguKSkiKSkuZXhlYygiYSIpLmxlbmd0aC0yO0FycmF5LmlzQXJyYXkoZi50b2tlbik/Zi50b2tlbi5sZW5ndGg9PTF8fGM9PTE/Zi50b2tlbj1mLnRva2VuWzBdOmMtMSE9Zi50b2tlbi5sZW5ndGg/KHRoaXMucmVwb3J0RXJyb3IoIm51bWJlciBvZiBjbGFzc2VzIGFuZCByZWdleHAgZ3JvdXBzIGRvZXNuJ3QgbWF0Y2giLHtydWxlOmYsZ3JvdXBDb3VudDpjLTF9KSxmLnRva2VuPWYudG9rZW5bMF0pOihmLnRva2VuQXJyYXk9Zi50b2tlbixmLnRva2VuPW51bGwsZi5vbk1hdGNoPXRoaXMuJGFycmF5VG9rZW5zKTp0eXBlb2YgZi50b2tlbj09ImZ1bmN0aW9uIiYmIWYub25NYXRjaCYmKGM+MT9mLm9uTWF0Y2g9dGhpcy4kYXBwbHlUb2tlbjpmLm9uTWF0Y2g9Zi50b2tlbiksYz4xJiYoL1xcXGQvLnRlc3QoZi5yZWdleCk/bD1mLnJlZ2V4LnJlcGxhY2UoL1xcKFswLTldKykvZyxmdW5jdGlvbihlLHQpe3JldHVybiJcXCIrKHBhcnNlSW50KHQsMTApK2krMSl9KTooYz0xLGw9dGhpcy5yZW1vdmVDYXB0dXJpbmdHcm91cHMoZi5yZWdleCkpLCFmLnNwbGl0UmVnZXgmJnR5cGVvZiBmLnRva2VuIT0ic3RyaW5nIiYmdS5wdXNoKGYpKSxzW2ldPWEsaSs9YyxyLnB1c2gobCksZi5vbk1hdGNofHwoZi5vbk1hdGNoPW51bGwpfXIubGVuZ3RofHwoc1swXT0wLHIucHVzaCgiJCIpKSx1LmZvckVhY2goZnVuY3Rpb24oZSl7ZS5zcGxpdFJlZ2V4PXRoaXMuY3JlYXRlU3BsaXR0ZXJSZWdleHAoZS5yZWdleCxvKX0sdGhpcyksdGhpcy5yZWdFeHBzW3RdPW5ldyBSZWdFeHAoIigiK3Iuam9pbigiKXwoIikrIil8KCQpIixvKX19OyhmdW5jdGlvbigpe3RoaXMuJHNldE1heFRva2VuQ291bnQ9ZnVuY3Rpb24oZSl7aT1lfDB9LHRoaXMuJGFwcGx5VG9rZW49ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zcGxpdFJlZ2V4LmV4ZWMoZSkuc2xpY2UoMSksbj10aGlzLnRva2VuLmFwcGx5KHRoaXMsdCk7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVyblt7dHlwZTpuLHZhbHVlOmV9XTt2YXIgcj1bXTtmb3IodmFyIGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspdFtpXSYmKHJbci5sZW5ndGhdPXt0eXBlOm5baV0sdmFsdWU6dFtpXX0pO3JldHVybiByfSx0aGlzLiRhcnJheVRva2Vucz1mdW5jdGlvbihlKXtpZighZSlyZXR1cm5bXTt2YXIgdD10aGlzLnNwbGl0UmVnZXguZXhlYyhlKTtpZighdClyZXR1cm4idGV4dCI7dmFyIG49W10scj10aGlzLnRva2VuQXJyYXk7Zm9yKHZhciBpPTAscz1yLmxlbmd0aDtpPHM7aSsrKXRbaSsxXSYmKG5bbi5sZW5ndGhdPXt0eXBlOnJbaV0sdmFsdWU6dFtpKzFdfSk7cmV0dXJuIG59LHRoaXMucmVtb3ZlQ2FwdHVyaW5nR3JvdXBzPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSgvXFwufFxbKD86XFwufFteXFxcXV0pKnxcKFw/Wzo9IV18KFwoKS9nLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/Iig/OiI6ZX0pO3JldHVybiB0fSx0aGlzLmNyZWF0ZVNwbGl0dGVyUmVnZXhwPWZ1bmN0aW9uKGUsdCl7aWYoZS5pbmRleE9mKCIoPz0iKSE9LTEpe3ZhciBuPTAscj0hMSxpPXt9O2UucmVwbGFjZSgvKFxcLil8KFwoKD86XD9bPSFdKT8pfChcKSl8KFtcW1xdXSkvZyxmdW5jdGlvbihlLHQscyxvLHUsYSl7cmV0dXJuIHI/cj11IT0iXSI6dT9yPSEwOm8/KG49PWkuc3RhY2smJihpLmVuZD1hKzEsaS5zdGFjaz0tMSksbi0tKTpzJiYobisrLHMubGVuZ3RoIT0xJiYoaS5zdGFjaz1uLGkuc3RhcnQ9YSkpLGV9KSxpLmVuZCE9bnVsbCYmL15cKSokLy50ZXN0KGUuc3Vic3RyKGkuZW5kKSkmJihlPWUuc3Vic3RyaW5nKDAsaS5zdGFydCkrZS5zdWJzdHIoaS5lbmQpKX1yZXR1cm4gZS5jaGFyQXQoMCkhPSJeIiYmKGU9Il4iK2UpLGUuY2hhckF0KGUubGVuZ3RoLTEpIT0iJCImJihlKz0iJCIpLG5ldyBSZWdFeHAoZSwodHx8IiIpLnJlcGxhY2UoImciLCIiKSl9LHRoaXMuZ2V0TGluZVRva2Vucz1mdW5jdGlvbihlLHQpe2lmKHQmJnR5cGVvZiB0IT0ic3RyaW5nIil7dmFyIG49dC5zbGljZSgwKTt0PW5bMF0sdD09PSIjdG1wIiYmKG4uc2hpZnQoKSx0PW4uc2hpZnQoKSl9ZWxzZSB2YXIgbj1bXTt2YXIgcj10fHwic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl07c3x8KHI9InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdKTt2YXIgbz10aGlzLm1hdGNoTWFwcGluZ3Nbcl0sdT10aGlzLnJlZ0V4cHNbcl07dS5sYXN0SW5kZXg9MDt2YXIgYSxmPVtdLGw9MCxjPTAsaD17dHlwZTpudWxsLHZhbHVlOiIifTt3aGlsZShhPXUuZXhlYyhlKSl7dmFyIHA9by5kZWZhdWx0VG9rZW4sZD1udWxsLHY9YVswXSxtPXUubGFzdEluZGV4O2lmKG0tdi5sZW5ndGg+bCl7dmFyIGc9ZS5zdWJzdHJpbmcobCxtLXYubGVuZ3RoKTtoLnR5cGU9PXA/aC52YWx1ZSs9ZzooaC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpwLHZhbHVlOmd9KX1mb3IodmFyIHk9MDt5PGEubGVuZ3RoLTI7eSsrKXtpZihhW3krMV09PT11bmRlZmluZWQpY29udGludWU7ZD1zW29beV1dLGQub25NYXRjaD9wPWQub25NYXRjaCh2LHIsbixlKTpwPWQudG9rZW4sZC5uZXh0JiYodHlwZW9mIGQubmV4dD09InN0cmluZyI/cj1kLm5leHQ6cj1kLm5leHQocixuKSxzPXRoaXMuc3RhdGVzW3JdLHN8fCh0aGlzLnJlcG9ydEVycm9yKCJzdGF0ZSBkb2Vzbid0IGV4aXN0IixyKSxyPSJzdGFydCIscz10aGlzLnN0YXRlc1tyXSksbz10aGlzLm1hdGNoTWFwcGluZ3Nbcl0sbD1tLHU9dGhpcy5yZWdFeHBzW3JdLHUubGFzdEluZGV4PW0pLGQuY29uc3VtZUxpbmVFbmQmJihsPW0pO2JyZWFrfWlmKHYpaWYodHlwZW9mIHA9PSJzdHJpbmciKSEhZCYmZC5tZXJnZT09PSExfHxoLnR5cGUhPT1wPyhoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOnAsdmFsdWU6dn0pOmgudmFsdWUrPXY7ZWxzZSBpZihwKXtoLnR5cGUmJmYucHVzaChoKSxoPXt0eXBlOm51bGwsdmFsdWU6IiJ9O2Zvcih2YXIgeT0wO3k8cC5sZW5ndGg7eSsrKWYucHVzaChwW3ldKX1pZihsPT1lLmxlbmd0aClicmVhaztsPW07aWYoYysrPmkpe2M+MiplLmxlbmd0aCYmdGhpcy5yZXBvcnRFcnJvcigiaW5maW5pdGUgbG9vcCB3aXRoIGluIGFjZSB0b2tlbml6ZXIiLHtzdGFydFN0YXRlOnQsbGluZTplfSk7d2hpbGUobDxlLmxlbmd0aCloLnR5cGUmJmYucHVzaChoKSxoPXt2YWx1ZTplLnN1YnN0cmluZyhsLGwrPTUwMCksdHlwZToib3ZlcmZsb3cifTtyPSJzdGFydCIsbj1bXTticmVha319cmV0dXJuIGgudHlwZSYmZi5wdXNoKGgpLG4ubGVuZ3RoPjEmJm5bMF0hPT1yJiZuLnVuc2hpZnQoIiN0bXAiLHIpLHt0b2tlbnM6ZixzdGF0ZTpuLmxlbmd0aD9uOnJ9fSx0aGlzLnJlcG9ydEVycm9yPXIucmVwb3J0RXJyb3J9KS5jYWxsKHMucHJvdG90eXBlKSx0LlRva2VuaXplcj1zfSksYWNlLmRlZmluZSgiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9sYW5nIiksaT1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJlbXB0eV9saW5lIixyZWdleDoiXiQifSx7ZGVmYXVsdFRva2VuOiJ0ZXh0In1dfX07KGZ1bmN0aW9uKCl7dGhpcy5hZGRSdWxlcz1mdW5jdGlvbihlLHQpe2lmKCF0KXtmb3IodmFyIG4gaW4gZSl0aGlzLiRydWxlc1tuXT1lW25dO3JldHVybn1mb3IodmFyIG4gaW4gZSl7dmFyIHI9ZVtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXTtpZihzLm5leHR8fHMub25NYXRjaCl0eXBlb2Ygcy5uZXh0PT0ic3RyaW5nIiYmcy5uZXh0LmluZGV4T2YodCkhPT0wJiYocy5uZXh0PXQrcy5uZXh0KSxzLm5leHRTdGF0ZSYmcy5uZXh0U3RhdGUuaW5kZXhPZih0KSE9PTAmJihzLm5leHRTdGF0ZT10K3MubmV4dFN0YXRlKX10aGlzLiRydWxlc1t0K25dPXJ9fSx0aGlzLmdldFJ1bGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJ1bGVzfSx0aGlzLmVtYmVkUnVsZXM9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz10eXBlb2YgZT09ImZ1bmN0aW9uIj8obmV3IGUpLmdldFJ1bGVzKCk6ZTtpZihpKWZvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKWlbdV09dCtpW3VdO2Vsc2V7aT1bXTtmb3IodmFyIGEgaW4gbylpLnB1c2godCthKX10aGlzLmFkZFJ1bGVzKG8sdCk7aWYobil7dmFyIGY9QXJyYXkucHJvdG90eXBlW3M/InB1c2giOiJ1bnNoaWZ0Il07Zm9yKHZhciB1PTA7dTxpLmxlbmd0aDt1KyspZi5hcHBseSh0aGlzLiRydWxlc1tpW3VdXSxyLmRlZXBDb3B5KG4pKX10aGlzLiRlbWJlZHN8fCh0aGlzLiRlbWJlZHM9W10pLHRoaXMuJGVtYmVkcy5wdXNoKHQpfSx0aGlzLmdldEVtYmVkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbWJlZHN9O3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUhPSJzdGFydCJ8fHQubGVuZ3RoKSYmdC51bnNoaWZ0KHRoaXMubmV4dFN0YXRlLGUpLHRoaXMubmV4dFN0YXRlfSx0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuc2hpZnQoKSx0LnNoaWZ0KCl8fCJzdGFydCJ9O3RoaXMubm9ybWFsaXplUnVsZXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBpKHMpe3ZhciBvPXJbc107by5wcm9jZXNzZWQ9ITA7Zm9yKHZhciB1PTA7dTxvLmxlbmd0aDt1Kyspe3ZhciBhPW9bdV0sZj1udWxsO0FycmF5LmlzQXJyYXkoYSkmJihmPWEsYT17fSksIWEucmVnZXgmJmEuc3RhcnQmJihhLnJlZ2V4PWEuc3RhcnQsYS5uZXh0fHwoYS5uZXh0PVtdKSxhLm5leHQucHVzaCh7ZGVmYXVsdFRva2VuOmEudG9rZW59LHt0b2tlbjphLnRva2VuKyIuZW5kIixyZWdleDphLmVuZHx8YS5zdGFydCxuZXh0OiJwb3AifSksYS50b2tlbj1hLnRva2VuKyIuc3RhcnQiLGEucHVzaD0hMCk7dmFyIGw9YS5uZXh0fHxhLnB1c2g7aWYobCYmQXJyYXkuaXNBcnJheShsKSl7dmFyIGM9YS5zdGF0ZU5hbWU7Y3x8KGM9YS50b2tlbix0eXBlb2YgYyE9InN0cmluZyImJihjPWNbMF18fCIiKSxyW2NdJiYoYys9bisrKSkscltjXT1sLGEubmV4dD1jLGkoYyl9ZWxzZSBsPT0icG9wIiYmKGEubmV4dD10KTthLnB1c2gmJihhLm5leHRTdGF0ZT1hLm5leHR8fGEucHVzaCxhLm5leHQ9ZSxkZWxldGUgYS5wdXNoKTtpZihhLnJ1bGVzKWZvcih2YXIgaCBpbiBhLnJ1bGVzKXJbaF0/cltoXS5wdXNoJiZyW2hdLnB1c2guYXBwbHkocltoXSxhLnJ1bGVzW2hdKTpyW2hdPWEucnVsZXNbaF07dmFyIHA9dHlwZW9mIGE9PSJzdHJpbmciP2E6YS5pbmNsdWRlO3AmJihBcnJheS5pc0FycmF5KHApP2Y9cC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19KTpmPXJbcF0pO2lmKGYpe3ZhciBkPVt1LDFdLmNvbmNhdChmKTthLm5vRXNjYXBlJiYoZD1kLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5uZXh0fSkpLG8uc3BsaWNlLmFwcGx5KG8sZCksdS0tfWEua2V5d29yZE1hcCYmKGEudG9rZW49dGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyKGEua2V5d29yZE1hcCxhLmRlZmF1bHRUb2tlbnx8InRleHQiLGEuY2FzZUluc2Vuc2l0aXZlKSxkZWxldGUgYS5kZWZhdWx0VG9rZW4pfX12YXIgbj0wLHI9dGhpcy4kcnVsZXM7T2JqZWN0LmtleXMocikuZm9yRWFjaChpLHRoaXMpfSx0aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXI9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcz1lW3RdO24mJihzPXMudG9Mb3dlckNhc2UoKSk7dmFyIG89cy5zcGxpdChyfHwifCIpO2Zvcih2YXIgdT1vLmxlbmd0aDt1LS07KWlbb1t1XV09dH0pLE9iamVjdC5nZXRQcm90b3R5cGVPZihpKSYmKGkuX19wcm90b19fPW51bGwpLHRoaXMuJGtleXdvcmRMaXN0PU9iamVjdC5rZXlzKGkpLGU9bnVsbCxuP2Z1bmN0aW9uKGUpe3JldHVybiBpW2UudG9Mb3dlckNhc2UoKV18fHR9OmZ1bmN0aW9uKGUpe3JldHVybiBpW2VdfHx0fX0sdGhpcy5nZXRLZXl3b3Jkcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRrZXl3b3Jkc319KS5jYWxsKGkucHJvdG90eXBlKSx0LlRleHRIaWdobGlnaHRSdWxlcz1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1mdW5jdGlvbigpe3RoaXMuJGJlaGF2aW91cnM9e319OyhmdW5jdGlvbigpe3RoaXMuYWRkPWZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godW5kZWZpbmVkKXtjYXNlIHRoaXMuJGJlaGF2aW91cnM6dGhpcy4kYmVoYXZpb3Vycz17fTtjYXNlIHRoaXMuJGJlaGF2aW91cnNbZV06dGhpcy4kYmVoYXZpb3Vyc1tlXT17fX10aGlzLiRiZWhhdmlvdXJzW2VdW3RdPW59LHRoaXMuYWRkQmVoYXZpb3Vycz1mdW5jdGlvbihlKXtmb3IodmFyIHQgaW4gZSlmb3IodmFyIG4gaW4gZVt0XSl0aGlzLmFkZCh0LG4sZVt0XVtuXSl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3RoaXMuJGJlaGF2aW91cnMmJnRoaXMuJGJlaGF2aW91cnNbZV0mJmRlbGV0ZSB0aGlzLiRiZWhhdmlvdXJzW2VdfSx0aGlzLmluaGVyaXQ9ZnVuY3Rpb24oZSx0KXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIil2YXIgbj0obmV3IGUpLmdldEJlaGF2aW91cnModCk7ZWxzZSB2YXIgbj1lLmdldEJlaGF2aW91cnModCk7dGhpcy5hZGRCZWhhdmlvdXJzKG4pfSx0aGlzLmdldEJlaGF2aW91cnM9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuIHRoaXMuJGJlaGF2aW91cnM7dmFyIHQ9e307Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdGhpcy4kYmVoYXZpb3Vyc1tlW25dXSYmKHRbZVtuXV09dGhpcy4kYmVoYXZpb3Vyc1tlW25dXSk7cmV0dXJuIHR9fSkuY2FsbChyLnByb3RvdHlwZSksdC5CZWhhdmlvdXI9cn0pLGFjZS5kZWZpbmUoImFjZS90b2tlbl9pdGVyYXRvciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJHNlc3Npb249ZSx0aGlzLiRyb3c9dCx0aGlzLiRyb3dUb2tlbnM9ZS5nZXRUb2tlbnModCk7dmFyIHI9ZS5nZXRUb2tlbkF0KHQsbik7dGhpcy4kdG9rZW5JbmRleD1yP3IuaW5kZXg6LTF9OyhmdW5jdGlvbigpe3RoaXMuc3RlcEJhY2t3YXJkPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5JbmRleC09MTt3aGlsZSh0aGlzLiR0b2tlbkluZGV4PDApe3RoaXMuJHJvdy09MTtpZih0aGlzLiRyb3c8MClyZXR1cm4gdGhpcy4kcm93PTAsbnVsbDt0aGlzLiRyb3dUb2tlbnM9dGhpcy4kc2Vzc2lvbi5nZXRUb2tlbnModGhpcy4kcm93KSx0aGlzLiR0b2tlbkluZGV4PXRoaXMuJHJvd1Rva2Vucy5sZW5ndGgtMX1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLnN0ZXBGb3J3YXJkPWZ1bmN0aW9uKCl7dGhpcy4kdG9rZW5JbmRleCs9MTt2YXIgZTt3aGlsZSh0aGlzLiR0b2tlbkluZGV4Pj10aGlzLiRyb3dUb2tlbnMubGVuZ3RoKXt0aGlzLiRyb3crPTEsZXx8KGU9dGhpcy4kc2Vzc2lvbi5nZXRMZW5ndGgoKSk7aWYodGhpcy4kcm93Pj1lKXJldHVybiB0aGlzLiRyb3c9ZS0xLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyksdGhpcy4kdG9rZW5JbmRleD0wfXJldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5nZXRDdXJyZW50VG9rZW5Sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcm93fSx0aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHJvd1Rva2Vucyx0PXRoaXMuJHRva2VuSW5kZXgsbj1lW3RdLnN0YXJ0O2lmKG4hPT11bmRlZmluZWQpcmV0dXJuIG47bj0wO3doaWxlKHQ+MCl0LT0xLG4rPWVbdF0udmFsdWUubGVuZ3RoO3JldHVybiBufSx0aGlzLmdldEN1cnJlbnRUb2tlblBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJue3Jvdzp0aGlzLiRyb3csY29sdW1uOnRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fSx0aGlzLmdldEN1cnJlbnRUb2tlblJhbmdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdLHQ9dGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTtyZXR1cm4gbmV3IHIodGhpcy4kcm93LHQsdGhpcy4kcm93LHQrZS52YWx1ZS5sZW5ndGgpfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuVG9rZW5JdGVyYXRvcj1pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvYmVoYXZpb3VyIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi8uLi9saWIvb29wIiksaT1lKCIuLi9iZWhhdmlvdXIiKS5CZWhhdmlvdXIscz1lKCIuLi8uLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3Isbz1lKCIuLi8uLi9saWIvbGFuZyIpLHU9WyJ0ZXh0IiwicGFyZW4ucnBhcmVuIiwicnBhcmVuIiwicGFyZW4iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciJdLGE9WyJ0ZXh0IiwicGFyZW4ucnBhcmVuIiwicnBhcmVuIiwicGFyZW4iLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImNvbW1lbnQiXSxmLGw9e30sYz17JyInOiciJywiJyI6IicifSxoPWZ1bmN0aW9uKGUpe3ZhciB0PS0xO2UubXVsdGlTZWxlY3QmJih0PWUuc2VsZWN0aW9uLmluZGV4LGwucmFuZ2VDb3VudCE9ZS5tdWx0aVNlbGVjdC5yYW5nZUNvdW50JiYobD17cmFuZ2VDb3VudDplLm11bHRpU2VsZWN0LnJhbmdlQ291bnR9KSk7aWYobFt0XSlyZXR1cm4gZj1sW3RdO2Y9bFt0XT17YXV0b0luc2VydGVkQnJhY2tldHM6MCxhdXRvSW5zZXJ0ZWRSb3c6LTEsYXV0b0luc2VydGVkTGluZUVuZDoiIixtYXliZUluc2VydGVkQnJhY2tldHM6MCxtYXliZUluc2VydGVkUm93Oi0xLG1heWJlSW5zZXJ0ZWRMaW5lU3RhcnQ6IiIsbWF5YmVJbnNlcnRlZExpbmVFbmQ6IiJ9fSxwPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWUuZW5kLnJvdy1lLnN0YXJ0LnJvdztyZXR1cm57dGV4dDpuK3QrcixzZWxlY3Rpb246WzAsZS5zdGFydC5jb2x1bW4rMSxpLGUuZW5kLmNvbHVtbisoaT8wOjEpXX19LGQ9ZnVuY3Rpb24oZSl7dGhpcy5hZGQoImJyYWNlcyIsImluc2VydGlvbiIsZnVuY3Rpb24odCxuLHIsaSxzKXt2YXIgdT1yLmdldEN1cnNvclBvc2l0aW9uKCksYT1pLmRvYy5nZXRMaW5lKHUucm93KTtpZihzPT0ieyIpe2gocik7dmFyIGw9ci5nZXRTZWxlY3Rpb25SYW5nZSgpLGM9aS5kb2MuZ2V0VGV4dFJhbmdlKGwpO2lmKGMhPT0iIiYmYyE9PSJ7IiYmci5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChsLGMsInsiLCJ9Iik7aWYoZC5pc1NhbmVJbnNlcnRpb24ocixpKSlyZXR1cm4vW1xdXH1cKV0vLnRlc3QoYVt1LmNvbHVtbl0pfHxyLmluTXVsdGlTZWxlY3RNb2RlfHxlJiZlLmJyYWNlcz8oZC5yZWNvcmRBdXRvSW5zZXJ0KHIsaSwifSIpLHt0ZXh0OiJ7fSIsc2VsZWN0aW9uOlsxLDFdfSk6KGQucmVjb3JkTWF5YmVJbnNlcnQocixpLCJ7Iikse3RleHQ6InsiLHNlbGVjdGlvbjpbMSwxXX0pfWVsc2UgaWYocz09In0iKXtoKHIpO3ZhciB2PWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKHY9PSJ9Iil7dmFyIG09aS4kZmluZE9wZW5pbmdCcmFja2V0KCJ9Iix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobSE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxzKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19ZWxzZXtpZihzPT0iXG4ifHxzPT0iXHJcbiIpe2gocik7dmFyIGc9IiI7ZC5pc01heWJlSW5zZXJ0ZWRDbG9zaW5nKHUsYSkmJihnPW8uc3RyaW5nUmVwZWF0KCJ9IixmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cyksZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCkpO3ZhciB2PWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKHY9PT0ifSIpe3ZhciB5PWkuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbisxfSwifSIpO2lmKCF5KXJldHVybiBudWxsO3ZhciBiPXRoaXMuJGdldEluZGVudChpLmdldExpbmUoeS5yb3cpKX1lbHNle2lmKCFnKXtkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKTtyZXR1cm59dmFyIGI9dGhpcy4kZ2V0SW5kZW50KGEpfXZhciB3PWIraS5nZXRUYWJTdHJpbmcoKTtyZXR1cm57dGV4dDoiXG4iK3crIlxuIitiK2csc2VsZWN0aW9uOlsxLHcubGVuZ3RoLDEsdy5sZW5ndGhdfX1kLmNsZWFyTWF5YmVJbnNlcnRlZENsb3NpbmcoKX19KSx0aGlzLmFkZCgiYnJhY2VzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnM9PSJ7Iil7aChuKTt2YXIgbz1yLmRvYy5nZXRMaW5lKGkuc3RhcnQucm93KSx1PW8uc3Vic3RyaW5nKGkuZW5kLmNvbHVtbixpLmVuZC5jb2x1bW4rMSk7aWYodT09In0iKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpO2YubWF5YmVJbnNlcnRlZEJyYWNrZXRzLS19fSksdGhpcy5hZGQoInBhcmVucyIsImluc2VydGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXtpZihpPT0iKCIpe2gobik7dmFyIHM9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLG89ci5kb2MuZ2V0VGV4dFJhbmdlKHMpO2lmKG8hPT0iIiYmbi5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQoKSlyZXR1cm4gcChzLG8sIigiLCIpIik7aWYoZC5pc1NhbmVJbnNlcnRpb24obixyKSlyZXR1cm4gZC5yZWNvcmRBdXRvSW5zZXJ0KG4sciwiKSIpLHt0ZXh0OiIoKSIsc2VsZWN0aW9uOlsxLDFdfX1lbHNlIGlmKGk9PSIpIil7aChuKTt2YXIgdT1uLmdldEN1cnNvclBvc2l0aW9uKCksYT1yLmRvYy5nZXRMaW5lKHUucm93KSxmPWEuc3Vic3RyaW5nKHUuY29sdW1uLHUuY29sdW1uKzEpO2lmKGY9PSIpIil7dmFyIGw9ci4kZmluZE9wZW5pbmdCcmFja2V0KCIpIix7Y29sdW1uOnUuY29sdW1uKzEscm93OnUucm93fSk7aWYobCE9PW51bGwmJmQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHUsYSxpKSlyZXR1cm4gZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nKCkse3RleHQ6IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInBhcmVucyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0iKCIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKHU9PSIpIilyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KSx0aGlzLmFkZCgiYnJhY2tldHMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoaT09IlsiKXtoKG4pO3ZhciBzPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxvPXIuZG9jLmdldFRleHRSYW5nZShzKTtpZihvIT09IiImJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAocyxvLCJbIiwiXSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKG4scikpcmV0dXJuIGQucmVjb3JkQXV0b0luc2VydChuLHIsIl0iKSx7dGV4dDoiW10iLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihpPT0iXSIpe2gobik7dmFyIHU9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGE9ci5kb2MuZ2V0TGluZSh1LnJvdyksZj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZihmPT0iXSIpe3ZhciBsPXIuJGZpbmRPcGVuaW5nQnJhY2tldCgiXSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKGwhPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEsaSkpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJicmFja2V0cyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0iWyIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKHU9PSJdIilyZXR1cm4gaS5lbmQuY29sdW1uKyssaX19KSx0aGlzLmFkZCgic3RyaW5nX2RxdW90ZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci4kbW9kZS4kcXVvdGVzfHxjO2lmKGkubGVuZ3RoPT0xJiZzW2ldKXtpZih0aGlzLmxpbmVDb21tZW50U3RhcnQmJnRoaXMubGluZUNvbW1lbnRTdGFydC5pbmRleE9mKGkpIT0tMSlyZXR1cm47aChuKTt2YXIgbz1pLHU9bi5nZXRTZWxlY3Rpb25SYW5nZSgpLGE9ci5kb2MuZ2V0VGV4dFJhbmdlKHUpO2lmKGEhPT0iIiYmKGEubGVuZ3RoIT0xfHwhc1thXSkmJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAodSxhLG8sbyk7aWYoIWEpe3ZhciBmPW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxsPXIuZG9jLmdldExpbmUoZi5yb3cpLGQ9bC5zdWJzdHJpbmcoZi5jb2x1bW4tMSxmLmNvbHVtbiksdj1sLnN1YnN0cmluZyhmLmNvbHVtbixmLmNvbHVtbisxKSxtPXIuZ2V0VG9rZW5BdChmLnJvdyxmLmNvbHVtbiksZz1yLmdldFRva2VuQXQoZi5yb3csZi5jb2x1bW4rMSk7aWYoZD09IlxcIiYmbSYmL2VzY2FwZS8udGVzdChtLnR5cGUpKXJldHVybiBudWxsO3ZhciB5PW0mJi9zdHJpbmd8ZXNjYXBlLy50ZXN0KG0udHlwZSksYj0hZ3x8L3N0cmluZ3xlc2NhcGUvLnRlc3QoZy50eXBlKSx3O2lmKHY9PW8pdz15IT09Yix3JiYvc3RyaW5nXC5lbmQvLnRlc3QoZy50eXBlKSYmKHc9ITEpO2Vsc2V7aWYoeSYmIWIpcmV0dXJuIG51bGw7aWYoeSYmYilyZXR1cm4gbnVsbDt2YXIgRT1yLiRtb2RlLnRva2VuUmU7RS5sYXN0SW5kZXg9MDt2YXIgUz1FLnRlc3QoZCk7RS5sYXN0SW5kZXg9MDt2YXIgeD1FLnRlc3QoZCk7aWYoU3x8eClyZXR1cm4gbnVsbDtpZih2JiYhL1tcczssLn0pXF1cXF0vLnRlc3QodikpcmV0dXJuIG51bGw7dmFyIFQ9bFtmLmNvbHVtbi0yXTtpZighKGQhPW98fFQhPW8mJiFFLnRlc3QoVCkpKXJldHVybiBudWxsO3c9ITB9cmV0dXJue3RleHQ6dz9vK286IiIsc2VsZWN0aW9uOlsxLDFdfX19fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiZGVsZXRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9ci4kbW9kZS4kcXVvdGVzfHxjLG89ci5kb2MuZ2V0VGV4dFJhbmdlKGkpO2lmKCFpLmlzTXVsdGlMaW5lKCkmJnMuaGFzT3duUHJvcGVydHkobykpe2gobik7dmFyIHU9ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksYT11LnN1YnN0cmluZyhpLnN0YXJ0LmNvbHVtbisxLGkuc3RhcnQuY29sdW1uKzIpO2lmKGE9PW8pcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSl9O2QuaXNTYW5lSW5zZXJ0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHModCxuLnJvdyxuLmNvbHVtbik7aWYoIXRoaXMuJG1hdGNoVG9rZW5UeXBlKHIuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0Iix1KSl7aWYoL1spfVxdXS8udGVzdChlLnNlc3Npb24uZ2V0TGluZShuLnJvdylbbi5jb2x1bW5dKSlyZXR1cm4hMDt2YXIgaT1uZXcgcyh0LG4ucm93LG4uY29sdW1uKzEpO2lmKCF0aGlzLiRtYXRjaFRva2VuVHlwZShpLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsdSkpcmV0dXJuITF9cmV0dXJuIHIuc3RlcEZvcndhcmQoKSxyLmdldEN1cnJlbnRUb2tlblJvdygpIT09bi5yb3d8fHRoaXMuJG1hdGNoVG9rZW5UeXBlKHIuZ2V0Q3VycmVudFRva2VuKCl8fCJ0ZXh0IixhKX0sZC4kbWF0Y2hUb2tlblR5cGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC5pbmRleE9mKGUudHlwZXx8ZSk+LTF9LGQucmVjb3JkQXV0b0luc2VydD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLGk9dC5kb2MuZ2V0TGluZShyLnJvdyk7dGhpcy5pc0F1dG9JbnNlcnRlZENsb3NpbmcocixpLGYuYXV0b0luc2VydGVkTGluZUVuZFswXSl8fChmLmF1dG9JbnNlcnRlZEJyYWNrZXRzPTApLGYuYXV0b0luc2VydGVkUm93PXIucm93LGYuYXV0b0luc2VydGVkTGluZUVuZD1uK2kuc3Vic3RyKHIuY29sdW1uKSxmLmF1dG9JbnNlcnRlZEJyYWNrZXRzKyt9LGQucmVjb3JkTWF5YmVJbnNlcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPXQuZG9jLmdldExpbmUoci5yb3cpO3RoaXMuaXNNYXliZUluc2VydGVkQ2xvc2luZyhyLGkpfHwoZi5tYXliZUluc2VydGVkQnJhY2tldHM9MCksZi5tYXliZUluc2VydGVkUm93PXIucm93LGYubWF5YmVJbnNlcnRlZExpbmVTdGFydD1pLnN1YnN0cigwLHIuY29sdW1uKStuLGYubWF5YmVJbnNlcnRlZExpbmVFbmQ9aS5zdWJzdHIoci5jb2x1bW4pLGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzKyt9LGQuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cz4wJiZlLnJvdz09PWYuYXV0b0luc2VydGVkUm93JiZuPT09Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kWzBdJiZ0LnN1YnN0cihlLmNvbHVtbik9PT1mLmF1dG9JbnNlcnRlZExpbmVFbmR9LGQuaXNNYXliZUluc2VydGVkQ2xvc2luZz1mdW5jdGlvbihlLHQpe3JldHVybiBmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cz4wJiZlLnJvdz09PWYubWF5YmVJbnNlcnRlZFJvdyYmdC5zdWJzdHIoZS5jb2x1bW4pPT09Zi5tYXliZUluc2VydGVkTGluZUVuZCYmdC5zdWJzdHIoMCxlLmNvbHVtbik9PWYubWF5YmVJbnNlcnRlZExpbmVTdGFydH0sZC5wb3BBdXRvSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKCl7Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kPWYuYXV0b0luc2VydGVkTGluZUVuZC5zdWJzdHIoMSksZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cy0tfSxkLmNsZWFyTWF5YmVJbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oKXtmJiYoZi5tYXliZUluc2VydGVkQnJhY2tldHM9MCxmLm1heWJlSW5zZXJ0ZWRSb3c9LTEpfSxyLmluaGVyaXRzKGQsaSksdC5Dc3R5bGVCZWhhdmlvdXI9ZH0pLGFjZS5kZWZpbmUoImFjZS91bmljb2RlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1bNDgsOSw4LDI1LDUsMCwyLDI1LDQ4LDAsMTEsMCw1LDAsNiwyMiwyLDMwLDIsNDU3LDUsMTEsMTUsNCw4LDAsMiwwLDE4LDExNiwyLDEsMywzLDksMCwyLDIsMiwwLDIsMTksMiw4MiwyLDEzOCwyLDQsMywxNTUsMTIsMzcsMywwLDgsMzgsMTAsNDQsMiwwLDIsMSwyLDEsMiwwLDksMjYsNiwyLDMwLDEwLDcsNjEsMiw5LDUsMTAxLDIsNywzLDksMiwxOCwzLDAsMTcsNTgsMywxMDAsMTUsNTMsNSwwLDYsNDUsMjExLDU3LDMsMTgsMiw1LDMsMTEsMyw5LDIsMSw3LDYsMiwyLDIsNywzLDEsMywyMSwyLDYsMiwwLDQsMywzLDgsMywxLDMsMyw5LDAsNSwxLDIsNCwzLDExLDE2LDIsMiw1LDUsMSwzLDIxLDIsNiwyLDEsMiwxLDIsMSwzLDAsMiw0LDUsMSwzLDIsNCwwLDgsMywyLDAsOCwxNSwxMiwyLDIsOCwyLDIsMiwyMSwyLDYsMiwxLDIsNCwzLDksMiwyLDIsMiwzLDAsMTYsMywzLDksMTgsMiwyLDcsMywxLDMsMjEsMiw2LDIsMSwyLDQsMyw4LDMsMSwzLDIsOSwxLDUsMSwyLDQsMyw5LDIsMCwxNywxLDIsNSw0LDIsMiwzLDQsMSwyLDAsMiwxLDQsMSw0LDIsNCwxMSw1LDQsNCwyLDIsMywzLDAsNywwLDE1LDksMTgsMiwyLDcsMiwyLDIsMjIsMiw5LDIsNCw0LDcsMiwyLDIsMyw4LDEsMiwxLDcsMywzLDksMTksMSwyLDcsMiwyLDIsMjIsMiw5LDIsNCwzLDgsMiwyLDIsMyw4LDEsOCwwLDIsMywzLDksMTksMSwyLDcsMiwyLDIsMjIsMiwxNSw0LDcsMiwyLDIsMywxMCwwLDksMywzLDksMTEsNSwzLDEsMiwxNyw0LDIzLDIsOCwyLDAsMyw2LDQsMCw1LDUsMiwwLDIsNywxOSwxLDE0LDU3LDYsMTQsMiw5LDQwLDEsMiwwLDMsMSwyLDAsMywwLDcsMywyLDYsMiwyLDIsMCwyLDAsMywxLDIsMTIsMiwyLDMsNCwyLDAsMiw1LDMsOSwzLDEsMzUsMCwyNCwxLDcsOSwxMiwwLDIsMCwyLDAsNSw5LDIsMzUsNSwxOSwyLDUsNSw3LDIsMzUsMTAsMCw1OCw3Myw3LDc3LDMsMzcsMTEsNDIsMiwwLDQsMzI4LDIsMywzLDYsMiwwLDIsMywzLDQwLDIsMywzLDMyLDIsMywzLDYsMiwwLDIsMywzLDE0LDIsNTYsMiwzLDMsNjYsNSwwLDMzLDE1LDE3LDg0LDEzLDYxOSwzLDE2LDIsMjUsNiw3NCwyMiwxMiwyLDYsMTIsMjAsMTIsMTksMTMsMTIsMiwyLDIsMSwxMyw1MSwzLDI5LDQsMCw1LDEsMyw5LDM0LDIsMyw5LDcsODcsOSw0Miw2LDY5LDExLDI4LDQsMTEsNSwxMSwxMSwzOSwzLDQsMTIsNDMsNSwyNSw3LDEwLDM4LDI3LDUsNjIsMiwyOCwzLDEwLDcsOSwxNCwwLDg5LDc1LDUsOSwxOCw4LDEzLDQyLDQsMTEsNzEsNTUsOSw5LDQsNDgsODMsMiwyLDMwLDE0LDIzMCwyMywyODAsMyw1LDMsMzcsMyw1LDMsNywyLDAsMiwwLDIsMCwyLDMwLDMsNTIsMiw2LDIsMCw0LDIsMiw2LDQsMywzLDUsNSwxMiw2LDIsMiw2LDY3LDEsMjAsMCwyOSwwLDE0LDAsMTcsNCw2MCwxMiw1LDAsNCwxMSwxOCwwLDUsMCwzLDksMiwwLDQsNCw3LDAsMiwwLDIsMCwyLDMsMiwxMCwzLDMsNiw0LDUsMCw1MywxLDI2ODQsNDYsMiw0NiwyLDEzMiw3LDYsMTUsMzcsMTEsNTMsMTAsMCwxNywyMiwxMCw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDMxLDQ4LDAsNDcwLDEsMzYsNSwyLDQsNiwxLDUsODUsMywxLDMsMiwyLDg5LDIsMyw2LDQwLDQsOTMsMTgsMjMsNTcsMTUsNTEzLDY1ODEsNzUsMjA5MzksNTMsMTE2NCw2OCw0NSwzLDI2OCw0LDI3LDIxLDMxLDMsMTMsMTMsMSwyLDI0LDksNjksMTEsMSwzOCw4LDMsMTAyLDMsMSwxMTEsNDQsMjUsNTEsMTMsNjgsMTIsOSw3LDIzLDQsMCw1LDQ1LDMsMzUsMTMsMjgsNCw2NCwxNSwxMCwzOSw1NCwxMCwxMywzLDksNywyMiw0LDEsNSw2NiwyNSwyLDIyNyw0MiwyLDEsMyw5LDcsMTExNzEsMTMsMjIsNSw0OCw4NDUzLDMwMSwzLDYxLDMsMTA1LDM5LDYsMTMsNCw2LDExLDIsMTIsMiw0LDIsMCwyLDEsMiwxLDIsMTA3LDM0LDM2MiwxOSw2MywzLDUzLDQxLDExLDUsMTUsMTcsNiwxMywxLDI1LDIsMzMsNCwyLDEzNCwyMCw5LDgsMjUsNSwwLDIsMjUsMTIsODgsNCw1LDMsNSwzLDUsMywyXSxpPTAscz1bXTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rPTIpcy5wdXNoKGkrPXJbb10pLHJbbysxXSYmcy5wdXNoKDQ1LGkrPXJbbysxXSk7dC53b3JkQ2hhcnM9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLHMpfSksYWNlLmRlZmluZSgiYWNlL21vZGUvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9jb25maWciLCJhY2UvdG9rZW5pemVyIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9iZWhhdmlvdXIvY3N0eWxlIiwiYWNlL3VuaWNvZGUiLCJhY2UvbGliL2xhbmciLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2NvbmZpZyIpLGk9ZSgiLi4vdG9rZW5pemVyIikuVG9rZW5pemVyLHM9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxvPWUoIi4vYmVoYXZpb3VyL2NzdHlsZSIpLkNzdHlsZUJlaGF2aW91cix1PWUoIi4uL3VuaWNvZGUiKSxhPWUoIi4uL2xpYi9sYW5nIiksZj1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsbD1lKCIuLi9yYW5nZSIpLlJhbmdlLGM9ZnVuY3Rpb24oKXt0aGlzLkhpZ2hsaWdodFJ1bGVzPXN9OyhmdW5jdGlvbigpe3RoaXMuJGRlZmF1bHRCZWhhdmlvdXI9bmV3IG8sdGhpcy50b2tlblJlPW5ldyBSZWdFeHAoIl5bIit1LndvcmRDaGFycysiXFwkX10rIiwiZyIpLHRoaXMubm9uVG9rZW5SZT1uZXcgUmVnRXhwKCJeKD86W14iK3Uud29yZENoYXJzKyJcXCRfXXxcXHNdKSsiLCJnIiksdGhpcy5nZXRUb2tlbml6ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdG9rZW5pemVyfHwodGhpcy4kaGlnaGxpZ2h0UnVsZXM9dGhpcy4kaGlnaGxpZ2h0UnVsZXN8fG5ldyB0aGlzLkhpZ2hsaWdodFJ1bGVzKHRoaXMuJGhpZ2hsaWdodFJ1bGVDb25maWcpLHRoaXMuJHRva2VuaXplcj1uZXcgaSh0aGlzLiRoaWdobGlnaHRSdWxlcy5nZXRSdWxlcygpKSksdGhpcy4kdG9rZW5pemVyfSx0aGlzLmxpbmVDb21tZW50U3RhcnQ9IiIsdGhpcy5ibG9ja0NvbW1lbnQ9IiIsdGhpcy50b2dnbGVDb21tZW50TGluZXM9ZnVuY3Rpb24oZSx0LG4scil7ZnVuY3Rpb24gdyhlKXtmb3IodmFyIHQ9bjt0PD1yO3QrKyllKGkuZ2V0TGluZSh0KSx0KX12YXIgaT10LmRvYyxzPSEwLG89ITAsdT1JbmZpbml0eSxmPXQuZ2V0VGFiU2l6ZSgpLGw9ITE7aWYoIXRoaXMubGluZUNvbW1lbnRTdGFydCl7aWYoIXRoaXMuYmxvY2tDb21tZW50KXJldHVybiExO3ZhciBjPXRoaXMuYmxvY2tDb21tZW50LnN0YXJ0LGg9dGhpcy5ibG9ja0NvbW1lbnQuZW5kLHA9bmV3IFJlZ0V4cCgiXihcXHMqKSg/OiIrYS5lc2NhcGVSZWdFeHAoYykrIikiKSxkPW5ldyBSZWdFeHAoIig/OiIrYS5lc2NhcGVSZWdFeHAoaCkrIilcXHMqJCIpLHY9ZnVuY3Rpb24oZSx0KXtpZihnKGUsdCkpcmV0dXJuO2lmKCFzfHwvXFMvLnRlc3QoZSkpaS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjplLmxlbmd0aH0saCksaS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSxjKX0sbT1mdW5jdGlvbihlLHQpe3ZhciBuOyhuPWUubWF0Y2goZCkpJiZpLnJlbW92ZUluTGluZSh0LGUubGVuZ3RoLW5bMF0ubGVuZ3RoLGUubGVuZ3RoKSwobj1lLm1hdGNoKHApKSYmaS5yZW1vdmVJbkxpbmUodCxuWzFdLmxlbmd0aCxuWzBdLmxlbmd0aCl9LGc9ZnVuY3Rpb24oZSxuKXtpZihwLnRlc3QoZSkpcmV0dXJuITA7dmFyIHI9dC5nZXRUb2tlbnMobik7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspaWYocltpXS50eXBlPT09ImNvbW1lbnQiKXJldHVybiEwfX1lbHNle2lmKEFycmF5LmlzQXJyYXkodGhpcy5saW5lQ29tbWVudFN0YXJ0KSl2YXIgcD10aGlzLmxpbmVDb21tZW50U3RhcnQubWFwKGEuZXNjYXBlUmVnRXhwKS5qb2luKCJ8IiksYz10aGlzLmxpbmVDb21tZW50U3RhcnRbMF07ZWxzZSB2YXIgcD1hLmVzY2FwZVJlZ0V4cCh0aGlzLmxpbmVDb21tZW50U3RhcnQpLGM9dGhpcy5saW5lQ29tbWVudFN0YXJ0O3A9bmV3IFJlZ0V4cCgiXihcXHMqKSg/OiIrcCsiKSA/IiksbD10LmdldFVzZVNvZnRUYWJzKCk7dmFyIG09ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLm1hdGNoKHApO2lmKCFuKXJldHVybjt2YXIgcj1uWzFdLmxlbmd0aCxzPW5bMF0ubGVuZ3RoOyFiKGUscixzKSYmblswXVtzLTFdPT0iICImJnMtLSxpLnJlbW92ZUluTGluZSh0LHIscyl9LHk9YysiICIsdj1mdW5jdGlvbihlLHQpe2lmKCFzfHwvXFMvLnRlc3QoZSkpYihlLHUsdSk/aS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSx5KTppLmluc2VydEluTGluZSh7cm93OnQsY29sdW1uOnV9LGMpfSxnPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHAudGVzdChlKX0sYj1mdW5jdGlvbihlLHQsbil7dmFyIHI9MDt3aGlsZSh0LS0mJmUuY2hhckF0KHQpPT0iICIpcisrO2lmKHIlZiE9MClyZXR1cm4hMTt2YXIgcj0wO3doaWxlKGUuY2hhckF0KG4rKyk9PSIgIilyKys7cmV0dXJuIGY+Mj9yJWYhPWYtMTpyJWY9PTB9fXZhciBFPUluZmluaXR5O3coZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNlYXJjaCgvXFMvKTtuIT09LTE/KG48dSYmKHU9biksbyYmIWcoZSx0KSYmKG89ITEpKTpFPmUubGVuZ3RoJiYoRT1lLmxlbmd0aCl9KSx1PT1JbmZpbml0eSYmKHU9RSxzPSExLG89ITEpLGwmJnUlZiE9MCYmKHU9TWF0aC5mbG9vcih1L2YpKmYpLHcobz9tOnYpfSx0aGlzLnRvZ2dsZUJsb2NrQ29tbWVudD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLmJsb2NrQ29tbWVudDtpZighaSlyZXR1cm47IWkuc3RhcnQmJmlbMF0mJihpPWlbMF0pO3ZhciBzPW5ldyBmKHQsci5yb3csci5jb2x1bW4pLG89cy5nZXRDdXJyZW50VG9rZW4oKSx1PXQuc2VsZWN0aW9uLGE9dC5zZWxlY3Rpb24udG9PcmllbnRlZFJhbmdlKCksYyxoO2lmKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciBwLGQ7d2hpbGUobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHY9by52YWx1ZS5pbmRleE9mKGkuc3RhcnQpO2lmKHYhPS0xKXt2YXIgbT1zLmdldEN1cnJlbnRUb2tlblJvdygpLGc9cy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSt2O3A9bmV3IGwobSxnLG0sZytpLnN0YXJ0Lmxlbmd0aCk7YnJlYWt9bz1zLnN0ZXBCYWNrd2FyZCgpfXZhciBzPW5ldyBmKHQsci5yb3csci5jb2x1bW4pLG89cy5nZXRDdXJyZW50VG9rZW4oKTt3aGlsZShvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgdj1vLnZhbHVlLmluZGV4T2YoaS5lbmQpO2lmKHYhPS0xKXt2YXIgbT1zLmdldEN1cnJlbnRUb2tlblJvdygpLGc9cy5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKSt2O2Q9bmV3IGwobSxnLG0sZytpLmVuZC5sZW5ndGgpO2JyZWFrfW89cy5zdGVwRm9yd2FyZCgpfWQmJnQucmVtb3ZlKGQpLHAmJih0LnJlbW92ZShwKSxjPXAuc3RhcnQucm93LGg9LWkuc3RhcnQubGVuZ3RoKX1lbHNlIGg9aS5zdGFydC5sZW5ndGgsYz1uLnN0YXJ0LnJvdyx0Lmluc2VydChuLmVuZCxpLmVuZCksdC5pbnNlcnQobi5zdGFydCxpLnN0YXJ0KTthLnN0YXJ0LnJvdz09YyYmKGEuc3RhcnQuY29sdW1uKz1oKSxhLmVuZC5yb3c9PWMmJihhLmVuZC5jb2x1bW4rPWgpLHQuc2VsZWN0aW9uLmZyb21PcmllbnRlZFJhbmdlKGEpfSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy4kZ2V0SW5kZW50KHQpfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe30sdGhpcy4kZ2V0SW5kZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqLylbMF19LHRoaXMuY3JlYXRlV29ya2VyPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsfSx0aGlzLmNyZWF0ZU1vZGVEZWxlZ2F0ZXM9ZnVuY3Rpb24oZSl7dGhpcy4kZW1iZWRzPVtdLHRoaXMuJG1vZGVzPXt9O2Zvcih2YXIgdCBpbiBlKWlmKGVbdF0pe3ZhciBuPWVbdF0saT1uLnByb3RvdHlwZS4kaWQscz1yLiRtb2Rlc1tpXTtzfHwoci4kbW9kZXNbaV09cz1uZXcgbiksci4kbW9kZXNbdF18fChyLiRtb2Rlc1t0XT1zKSx0aGlzLiRlbWJlZHMucHVzaCh0KSx0aGlzLiRtb2Rlc1t0XT1zfXZhciBvPVsidG9nZ2xlQmxvY2tDb21tZW50IiwidG9nZ2xlQ29tbWVudExpbmVzIiwiZ2V0TmV4dExpbmVJbmRlbnQiLCJjaGVja091dGRlbnQiLCJhdXRvT3V0ZGVudCIsInRyYW5zZm9ybUFjdGlvbiIsImdldENvbXBsZXRpb25zIl07Zm9yKHZhciB0PTA7dDxvLmxlbmd0aDt0KyspKGZ1bmN0aW9uKGUpe3ZhciBuPW9bdF0scj1lW25dO2Vbb1t0XV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZGVsZWdhdG9yKG4sYXJndW1lbnRzLHIpfX0pKHRoaXMpfSx0aGlzLiRkZWxlZ2F0b3I9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF18fCJzdGFydCI7aWYodHlwZW9mIHIhPSJzdHJpbmciKXtpZihBcnJheS5pc0FycmF5KHJbMl0pKXt2YXIgaT1yWzJdW3JbMl0ubGVuZ3RoLTFdLHM9dGhpcy4kbW9kZXNbaV07aWYocylyZXR1cm4gc1tlXS5hcHBseShzLFtyWzFdXS5jb25jYXQoW10uc2xpY2UuY2FsbCh0LDEpKSl9cj1yWzBdfHwic3RhcnQifWZvcih2YXIgbz0wO288dGhpcy4kZW1iZWRzLmxlbmd0aDtvKyspe2lmKCF0aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbb11dKWNvbnRpbnVlO3ZhciB1PXIuc3BsaXQodGhpcy4kZW1iZWRzW29dKTtpZighdVswXSYmdVsxXSl7dFswXT11WzFdO3ZhciBzPXRoaXMuJG1vZGVzW3RoaXMuJGVtYmVkc1tvXV07cmV0dXJuIHNbZV0uYXBwbHkocyx0KX19dmFyIGE9bi5hcHBseSh0aGlzLHQpO3JldHVybiBuP2E6dW5kZWZpbmVkfSx0aGlzLnRyYW5zZm9ybUFjdGlvbj1mdW5jdGlvbihlLHQsbixyLGkpe2lmKHRoaXMuJGJlaGF2aW91cil7dmFyIHM9dGhpcy4kYmVoYXZpb3VyLmdldEJlaGF2aW91cnMoKTtmb3IodmFyIG8gaW4gcylpZihzW29dW3RdKXt2YXIgdT1zW29dW3RdLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZih1KXJldHVybiB1fX19LHRoaXMuZ2V0S2V5d29yZHM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuY29tcGxldGlvbktleXdvcmRzKXt2YXIgdD10aGlzLiR0b2tlbml6ZXIucnVsZXMsbj1bXTtmb3IodmFyIHIgaW4gdCl7dmFyIGk9dFtyXTtmb3IodmFyIHM9MCxvPWkubGVuZ3RoO3M8bztzKyspaWYodHlwZW9mIGlbc10udG9rZW49PSJzdHJpbmciKS9rZXl3b3JkfHN1cHBvcnR8c3RvcmFnZS8udGVzdChpW3NdLnRva2VuKSYmbi5wdXNoKGlbc10ucmVnZXgpO2Vsc2UgaWYodHlwZW9mIGlbc10udG9rZW49PSJvYmplY3QiKWZvcih2YXIgdT0wLGE9aVtzXS50b2tlbi5sZW5ndGg7dTxhO3UrKylpZigva2V5d29yZHxzdXBwb3J0fHN0b3JhZ2UvLnRlc3QoaVtzXS50b2tlblt1XSkpe3ZhciByPWlbc10ucmVnZXgubWF0Y2goL1woLis/XCkvZylbdV07bi5wdXNoKHIuc3Vic3RyKDEsci5sZW5ndGgtMikpfX10aGlzLmNvbXBsZXRpb25LZXl3b3Jkcz1ufXJldHVybiBlP24uY29uY2F0KHRoaXMuJGtleXdvcmRMaXN0fHxbXSk6dGhpcy4ka2V5d29yZExpc3R9LHRoaXMuJGNyZWF0ZUtleXdvcmRMaXN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodFJ1bGVzfHx0aGlzLmdldFRva2VuaXplcigpLHRoaXMuJGtleXdvcmRMaXN0PXRoaXMuJGhpZ2hsaWdodFJ1bGVzLiRrZXl3b3JkTGlzdHx8W119LHRoaXMuZ2V0Q29tcGxldGlvbnM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4ka2V5d29yZExpc3R8fHRoaXMuJGNyZWF0ZUtleXdvcmRMaXN0KCk7cmV0dXJuIGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUsdmFsdWU6ZSxzY29yZTowLG1ldGE6ImtleXdvcmQifX0pfSx0aGlzLiRpZD0iYWNlL21vZGUvdGV4dCJ9KS5jYWxsKGMucHJvdG90eXBlKSx0Lk1vZGU9Y30pLGFjZS5kZWZpbmUoImFjZS9hcHBseV9kZWx0YSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3Rocm93IGNvbnNvbGUubG9nKCJJbnZhbGlkIERlbHRhOiIsZSksIkludmFsaWQgRGVsdGE6ICIrdH1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuIHQucm93Pj0wJiZ0LnJvdzxlLmxlbmd0aCYmdC5jb2x1bW4+PTAmJnQuY29sdW1uPD1lW3Qucm93XS5sZW5ndGh9ZnVuY3Rpb24gcyhlLHQpe3QuYWN0aW9uIT0iaW5zZXJ0IiYmdC5hY3Rpb24hPSJyZW1vdmUiJiZyKHQsImRlbHRhLmFjdGlvbiBtdXN0IGJlICdpbnNlcnQnIG9yICdyZW1vdmUnIiksdC5saW5lcyBpbnN0YW5jZW9mIEFycmF5fHxyKHQsImRlbHRhLmxpbmVzIG11c3QgYmUgYW4gQXJyYXkiKSwoIXQuc3RhcnR8fCF0LmVuZCkmJnIodCwiZGVsdGEuc3RhcnQvZW5kIG11c3QgYmUgYW4gcHJlc2VudCIpO3ZhciBuPXQuc3RhcnQ7aShlLHQuc3RhcnQpfHxyKHQsImRlbHRhLnN0YXJ0IG11c3QgYmUgY29udGFpbmVkIGluIGRvY3VtZW50Iik7dmFyIHM9dC5lbmQ7dC5hY3Rpb249PSJyZW1vdmUiJiYhaShlLHMpJiZyKHQsImRlbHRhLmVuZCBtdXN0IGNvbnRhaW5lZCBpbiBkb2N1bWVudCBmb3IgJ3JlbW92ZScgYWN0aW9ucyIpO3ZhciBvPXMucm93LW4ucm93LHU9cy5jb2x1bW4tKG89PTA/bi5jb2x1bW46MCk7KG8hPXQubGluZXMubGVuZ3RoLTF8fHQubGluZXNbb10ubGVuZ3RoIT11KSYmcih0LCJkZWx0YS5yYW5nZSBtdXN0IG1hdGNoIGRlbHRhIGxpbmVzIil9dC5hcHBseURlbHRhPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnN0YXJ0LnJvdyxpPXQuc3RhcnQuY29sdW1uLHM9ZVtyXXx8IiI7c3dpdGNoKHQuYWN0aW9uKXtjYXNlImluc2VydCI6dmFyIG89dC5saW5lcztpZihvLmxlbmd0aD09PTEpZVtyXT1zLnN1YnN0cmluZygwLGkpK3QubGluZXNbMF0rcy5zdWJzdHJpbmcoaSk7ZWxzZXt2YXIgdT1bciwxXS5jb25jYXQodC5saW5lcyk7ZS5zcGxpY2UuYXBwbHkoZSx1KSxlW3JdPXMuc3Vic3RyaW5nKDAsaSkrZVtyXSxlW3IrdC5saW5lcy5sZW5ndGgtMV0rPXMuc3Vic3RyaW5nKGkpfWJyZWFrO2Nhc2UicmVtb3ZlIjp2YXIgYT10LmVuZC5jb2x1bW4sZj10LmVuZC5yb3c7cj09PWY/ZVtyXT1zLnN1YnN0cmluZygwLGkpK3Muc3Vic3RyaW5nKGEpOmUuc3BsaWNlKHIsZi1yKzEscy5zdWJzdHJpbmcoMCxpKStlW2ZdLnN1YnN0cmluZyhhKSl9fX0pLGFjZS5kZWZpbmUoImFjZS9hbmNob3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9dC5BbmNob3I9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJG9uQ2hhbmdlPXRoaXMub25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLmF0dGFjaChlKSx0eXBlb2Ygbj09InVuZGVmaW5lZCI/dGhpcy5zZXRQb3NpdGlvbih0LnJvdyx0LmNvbHVtbik6dGhpcy5zZXRQb3NpdGlvbih0LG4pfTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuKXt2YXIgcj1uP2UuY29sdW1uPD10LmNvbHVtbjplLmNvbHVtbjx0LmNvbHVtbjtyZXR1cm4gZS5yb3c8dC5yb3d8fGUucm93PT10LnJvdyYmcn1mdW5jdGlvbiB0KHQsbixyKXt2YXIgaT10LmFjdGlvbj09Imluc2VydCIscz0oaT8xOi0xKSoodC5lbmQucm93LXQuc3RhcnQucm93KSxvPShpPzE6LTEpKih0LmVuZC5jb2x1bW4tdC5zdGFydC5jb2x1bW4pLHU9dC5zdGFydCxhPWk/dTp0LmVuZDtyZXR1cm4gZShuLHUscik/e3JvdzpuLnJvdyxjb2x1bW46bi5jb2x1bW59OmUoYSxuLCFyKT97cm93Om4ucm93K3MsY29sdW1uOm4uY29sdW1uKyhuLnJvdz09YS5yb3c/bzowKX06e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW59fXIuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5nZXRQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHRoaXMucm93LHRoaXMuY29sdW1uKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY3VtZW50fSx0aGlzLiRpbnNlcnRSaWdodD0hMSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe2lmKGUuc3RhcnQucm93PT1lLmVuZC5yb3cmJmUuc3RhcnQucm93IT10aGlzLnJvdylyZXR1cm47aWYoZS5zdGFydC5yb3c+dGhpcy5yb3cpcmV0dXJuO3ZhciBuPXQoZSx7cm93OnRoaXMucm93LGNvbHVtbjp0aGlzLmNvbHVtbn0sdGhpcy4kaW5zZXJ0UmlnaHQpO3RoaXMuc2V0UG9zaXRpb24obi5yb3csbi5jb2x1bW4sITApfSx0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtuP3I9e3JvdzplLGNvbHVtbjp0fTpyPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZSx0KTtpZih0aGlzLnJvdz09ci5yb3cmJnRoaXMuY29sdW1uPT1yLmNvbHVtbilyZXR1cm47dmFyIGk9e3Jvdzp0aGlzLnJvdyxjb2x1bW46dGhpcy5jb2x1bW59O3RoaXMucm93PXIucm93LHRoaXMuY29sdW1uPXIuY29sdW1uLHRoaXMuX3NpZ25hbCgiY2hhbmdlIix7b2xkOmksdmFsdWU6cn0pfSx0aGlzLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSl9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe3RoaXMuZG9jdW1lbnQ9ZXx8dGhpcy5kb2N1bWVudCx0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiBlPj10aGlzLmRvY3VtZW50LmdldExlbmd0aCgpPyhuLnJvdz1NYXRoLm1heCgwLHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCktMSksbi5jb2x1bW49dGhpcy5kb2N1bWVudC5nZXRMaW5lKG4ucm93KS5sZW5ndGgpOmU8MD8obi5yb3c9MCxuLmNvbHVtbj0wKToobi5yb3c9ZSxuLmNvbHVtbj1NYXRoLm1pbih0aGlzLmRvY3VtZW50LmdldExpbmUobi5yb3cpLmxlbmd0aCxNYXRoLm1heCgwLHQpKSksdDwwJiYobi5jb2x1bW49MCksbn19KS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9kb2N1bWVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2FwcGx5X2RlbHRhIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3JhbmdlIiwiYWNlL2FuY2hvciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2FwcGx5X2RlbHRhIikuYXBwbHlEZWx0YSxzPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuL3JhbmdlIikuUmFuZ2UsdT1lKCIuL2FuY2hvciIpLkFuY2hvcixhPWZ1bmN0aW9uKGUpe3RoaXMuJGxpbmVzPVsiIl0sZS5sZW5ndGg9PT0wP3RoaXMuJGxpbmVzPVsiIl06QXJyYXkuaXNBcnJheShlKT90aGlzLmluc2VydE1lcmdlZExpbmVzKHtyb3c6MCxjb2x1bW46MH0sZSk6dGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxlKX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCktMTt0aGlzLnJlbW92ZShuZXcgbygwLDAsdCx0aGlzLmdldExpbmUodCkubGVuZ3RoKSksdGhpcy5pbnNlcnQoe3JvdzowLGNvbHVtbjowfSxlKX0sdGhpcy5nZXRWYWx1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFsbExpbmVzKCkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuY3JlYXRlQW5jaG9yPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyB1KHRoaXMsZSx0KX0sImFhYSIuc3BsaXQoL2EvKS5sZW5ndGg9PT0wP3RoaXMuJHNwbGl0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xyXG58XHIvZywiXG4iKS5zcGxpdCgiXG4iKX06dGhpcy4kc3BsaXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuc3BsaXQoL1xyXG58XHJ8XG4vKX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9eLio/KFxyXG58XHJ8XG4pL20pO3RoaXMuJGF1dG9OZXdMaW5lPXQ/dFsxXToiXG4iLHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKX0sdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyPWZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuJG5ld0xpbmVNb2RlKXtjYXNlIndpbmRvd3MiOnJldHVybiJcclxuIjtjYXNlInVuaXgiOnJldHVybiJcbiI7ZGVmYXVsdDpyZXR1cm4gdGhpcy4kYXV0b05ld0xpbmV8fCJcbiJ9fSx0aGlzLiRhdXRvTmV3TGluZT0iIix0aGlzLiRuZXdMaW5lTW9kZT0iYXV0byIsdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihlKXtpZih0aGlzLiRuZXdMaW5lTW9kZT09PWUpcmV0dXJuO3RoaXMuJG5ld0xpbmVNb2RlPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VOZXdMaW5lTW9kZSIpfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG5ld0xpbmVNb2RlfSx0aGlzLmlzTmV3TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09IlxyXG4ifHxlPT0iXHIifHxlPT0iXG4ifSx0aGlzLmdldExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGxpbmVzW2VdfHwiIn0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRsaW5lcy5zbGljZShlLHQrMSl9LHRoaXMuZ2V0QWxsTGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMaW5lcygwLHRoaXMuZ2V0TGVuZ3RoKCkpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRsaW5lcy5sZW5ndGh9LHRoaXMuZ2V0VGV4dFJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmdldExpbmVzRm9yUmFuZ2UoZSkuam9pbih0aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSl9LHRoaXMuZ2V0TGluZXNGb3JSYW5nZT1mdW5jdGlvbihlKXt2YXIgdDtpZihlLnN0YXJ0LnJvdz09PWUuZW5kLnJvdyl0PVt0aGlzLmdldExpbmUoZS5zdGFydC5yb3cpLnN1YnN0cmluZyhlLnN0YXJ0LmNvbHVtbixlLmVuZC5jb2x1bW4pXTtlbHNle3Q9dGhpcy5nZXRMaW5lcyhlLnN0YXJ0LnJvdyxlLmVuZC5yb3cpLHRbMF09KHRbMF18fCIiKS5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4pO3ZhciBuPXQubGVuZ3RoLTE7ZS5lbmQucm93LWUuc3RhcnQucm93PT1uJiYodFtuXT10W25dLnN1YnN0cmluZygwLGUuZW5kLmNvbHVtbikpfXJldHVybiB0fSx0aGlzLmluc2VydExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpLHRoaXMuaW5zZXJ0RnVsbExpbmVzKGUsdCl9LHRoaXMucmVtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQucmVtb3ZlTGluZXMgaXMgZGVwcmVjYXRlZC4gVXNlIHRoZSByZW1vdmVGdWxsTGluZXMgbWV0aG9kIGluc3RlYWQuIiksdGhpcy5yZW1vdmVGdWxsTGluZXMoZSx0KX0sdGhpcy5pbnNlcnROZXdMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5pbnNlcnROZXdMaW5lIGlzIGRlcHJlY2F0ZWQuIFVzZSBpbnNlcnRNZXJnZWRMaW5lcyhwb3NpdGlvbiwgWycnLCAnJ10pIGluc3RlYWQuIiksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyhlLFsiIiwiIl0pfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmdldExlbmd0aCgpPD0xJiZ0aGlzLiRkZXRlY3ROZXdMaW5lKHQpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoZSx0aGlzLiRzcGxpdCh0KSl9LHRoaXMuaW5zZXJ0SW5MaW5lPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jbGlwcGVkUG9zKGUucm93LGUuY29sdW1uKSxyPXRoaXMucG9zKGUucm93LGUuY29sdW1uK3QubGVuZ3RoKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpuLGVuZDpyLGFjdGlvbjoiaW5zZXJ0IixsaW5lczpbdF19LCEwKSx0aGlzLmNsb25lUG9zKHIpfSx0aGlzLmNsaXBwZWRQb3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldExlbmd0aCgpO2U9PT11bmRlZmluZWQ/ZT1uOmU8MD9lPTA6ZT49biYmKGU9bi0xLHQ9dW5kZWZpbmVkKTt2YXIgcj10aGlzLmdldExpbmUoZSk7cmV0dXJuIHQ9PXVuZGVmaW5lZCYmKHQ9ci5sZW5ndGgpLHQ9TWF0aC5taW4oTWF0aC5tYXgodCwwKSxyLmxlbmd0aCkse3JvdzplLGNvbHVtbjp0fX0sdGhpcy5jbG9uZVBvcz1mdW5jdGlvbihlKXtyZXR1cm57cm93OmUucm93LGNvbHVtbjplLmNvbHVtbn19LHRoaXMucG9zPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3JvdzplLGNvbHVtbjp0fX0sdGhpcy4kY2xpcFBvc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGVuZ3RoKCk7cmV0dXJuIGUucm93Pj10PyhlLnJvdz1NYXRoLm1heCgwLHQtMSksZS5jb2x1bW49dGhpcy5nZXRMaW5lKHQtMSkubGVuZ3RoKTooZS5yb3c9TWF0aC5tYXgoMCxlLnJvdyksZS5jb2x1bW49TWF0aC5taW4oTWF0aC5tYXgoZS5jb2x1bW4sMCksdGhpcy5nZXRMaW5lKGUucm93KS5sZW5ndGgpKSxlfSx0aGlzLmluc2VydEZ1bGxMaW5lcz1mdW5jdGlvbihlLHQpe2U9TWF0aC5taW4oTWF0aC5tYXgoZSwwKSx0aGlzLmdldExlbmd0aCgpKTt2YXIgbj0wO2U8dGhpcy5nZXRMZW5ndGgoKT8odD10LmNvbmNhdChbIiJdKSxuPTApOih0PVsiIl0uY29uY2F0KHQpLGUtLSxuPXRoaXMuJGxpbmVzW2VdLmxlbmd0aCksdGhpcy5pbnNlcnRNZXJnZWRMaW5lcyh7cm93OmUsY29sdW1uOm59LHQpfSx0aGlzLmluc2VydE1lcmdlZExpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jbGlwcGVkUG9zKGUucm93LGUuY29sdW1uKSxyPXtyb3c6bi5yb3crdC5sZW5ndGgtMSxjb2x1bW46KHQubGVuZ3RoPT0xP24uY29sdW1uOjApK3RbdC5sZW5ndGgtMV0ubGVuZ3RofTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpuLGVuZDpyLGFjdGlvbjoiaW5zZXJ0IixsaW5lczp0fSksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jbGlwcGVkUG9zKGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKSxuPXRoaXMuY2xpcHBlZFBvcyhlLmVuZC5yb3csZS5lbmQuY29sdW1uKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDp0LGVuZDpuLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2Uoe3N0YXJ0OnQsZW5kOm59KX0pLHRoaXMuY2xvbmVQb3ModCl9LHRoaXMucmVtb3ZlSW5MaW5lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmNsaXBwZWRQb3MoZSx0KSxpPXRoaXMuY2xpcHBlZFBvcyhlLG4pO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnIsZW5kOmksYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZSh7c3RhcnQ6cixlbmQ6aX0pfSwhMCksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5yZW1vdmVGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtlPU1hdGgubWluKE1hdGgubWF4KDAsZSksdGhpcy5nZXRMZW5ndGgoKS0xKSx0PU1hdGgubWluKE1hdGgubWF4KDAsdCksdGhpcy5nZXRMZW5ndGgoKS0xKTt2YXIgbj10PT10aGlzLmdldExlbmd0aCgpLTEmJmU+MCxyPXQ8dGhpcy5nZXRMZW5ndGgoKS0xLGk9bj9lLTE6ZSxzPW4/dGhpcy5nZXRMaW5lKGkpLmxlbmd0aDowLHU9cj90KzE6dCxhPXI/MDp0aGlzLmdldExpbmUodSkubGVuZ3RoLGY9bmV3IG8oaSxzLHUsYSksbD10aGlzLiRsaW5lcy5zbGljZShlLHQrMSk7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6Zi5zdGFydCxlbmQ6Zi5lbmQsYWN0aW9uOiJyZW1vdmUiLGxpbmVzOnRoaXMuZ2V0TGluZXNGb3JSYW5nZShmKX0pLGx9LHRoaXMucmVtb3ZlTmV3TGluZT1mdW5jdGlvbihlKXtlPHRoaXMuZ2V0TGVuZ3RoKCktMSYmZT49MCYmdGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLnBvcyhlLHRoaXMuZ2V0TGluZShlKS5sZW5ndGgpLGVuZDp0aGlzLnBvcyhlKzEsMCksYWN0aW9uOiJyZW1vdmUiLGxpbmVzOlsiIiwiIl19KX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7ZSBpbnN0YW5jZW9mIG98fChlPW8uZnJvbVBvaW50cyhlLnN0YXJ0LGUuZW5kKSk7aWYodC5sZW5ndGg9PT0wJiZlLmlzRW1wdHkoKSlyZXR1cm4gZS5zdGFydDtpZih0PT10aGlzLmdldFRleHRSYW5nZShlKSlyZXR1cm4gZS5lbmQ7dGhpcy5yZW1vdmUoZSk7dmFyIG47cmV0dXJuIHQ/bj10aGlzLmluc2VydChlLnN0YXJ0LHQpOm49ZS5zdGFydCxufSx0aGlzLmFwcGx5RGVsdGFzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXRoaXMuYXBwbHlEZWx0YShlW3RdKX0sdGhpcy5yZXZlcnREZWx0YXM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWUubGVuZ3RoLTE7dD49MDt0LS0pdGhpcy5yZXZlcnREZWx0YShlW3RdKX0sdGhpcy5hcHBseURlbHRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiO2lmKG4/ZS5saW5lcy5sZW5ndGg8PTEmJiFlLmxpbmVzWzBdOiFvLmNvbXBhcmVQb2ludHMoZS5zdGFydCxlLmVuZCkpcmV0dXJuO24mJmUubGluZXMubGVuZ3RoPjJlND90aGlzLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YShlLDJlNCk6KGkodGhpcy4kbGluZXMsZSx0KSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSkpfSx0aGlzLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YT1mdW5jdGlvbihlLHQpe3ZhciBuPWUubGluZXMscj1uLmxlbmd0aC10KzEsaT1lLnN0YXJ0LnJvdyxzPWUuc3RhcnQuY29sdW1uO2Zvcih2YXIgbz0wLHU9MDtvPHI7bz11KXt1Kz10LTE7dmFyIGE9bi5zbGljZShvLHUpO2EucHVzaCgiIiksdGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLnBvcyhpK28scyksZW5kOnRoaXMucG9zKGkrdSxzPTApLGFjdGlvbjplLmFjdGlvbixsaW5lczphfSwhMCl9ZS5saW5lcz1uLnNsaWNlKG8pLGUuc3RhcnQucm93PWkrbyxlLnN0YXJ0LmNvbHVtbj1zLHRoaXMuYXBwbHlEZWx0YShlLCEwKX0sdGhpcy5yZXZlcnREZWx0YT1mdW5jdGlvbihlKXt0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OnRoaXMuY2xvbmVQb3MoZS5zdGFydCksZW5kOnRoaXMuY2xvbmVQb3MoZS5lbmQpLGFjdGlvbjplLmFjdGlvbj09Imluc2VydCI/InJlbW92ZSI6Imluc2VydCIsbGluZXM6ZS5saW5lcy5zbGljZSgpfSl9LHRoaXMuaW5kZXhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kbGluZXN8fHRoaXMuZ2V0QWxsTGluZXMoKSxyPXRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDtmb3IodmFyIGk9dHx8MCxzPW4ubGVuZ3RoO2k8cztpKyspe2UtPW5baV0ubGVuZ3RoK3I7aWYoZTwwKXJldHVybntyb3c6aSxjb2x1bW46ZStuW2ldLmxlbmd0aCtyfX1yZXR1cm57cm93OnMtMSxjb2x1bW46ZStuW3MtMV0ubGVuZ3RoK3J9fSx0aGlzLnBvc2l0aW9uVG9JbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGxpbmVzfHx0aGlzLmdldEFsbExpbmVzKCkscj10aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKS5sZW5ndGgsaT0wLHM9TWF0aC5taW4oZS5yb3csbi5sZW5ndGgpO2Zvcih2YXIgbz10fHwwO288czsrK28paSs9bltvXS5sZW5ndGgrcjtyZXR1cm4gaStlLmNvbHVtbn19KS5jYWxsKGEucHJvdG90eXBlKSx0LkRvY3VtZW50PWF9KSxhY2UuZGVmaW5lKCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9ZnVuY3Rpb24oZSx0KXt0aGlzLnJ1bm5pbmc9ITEsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLmN1cnJlbnRMaW5lPTAsdGhpcy50b2tlbml6ZXI9ZTt2YXIgbj10aGlzO3RoaXMuJHdvcmtlcj1mdW5jdGlvbigpe2lmKCFuLnJ1bm5pbmcpcmV0dXJuO3ZhciBlPW5ldyBEYXRlLHQ9bi5jdXJyZW50TGluZSxyPS0xLGk9bi5kb2Mscz10O3doaWxlKG4ubGluZXNbdF0pdCsrO3ZhciBvPWkuZ2V0TGVuZ3RoKCksdT0wO24ucnVubmluZz0hMTt3aGlsZSh0PG8pe24uJHRva2VuaXplUm93KHQpLHI9dDtkbyB0Kys7d2hpbGUobi5saW5lc1t0XSk7dSsrO2lmKHUlNT09PTAmJm5ldyBEYXRlLWU+MjApe24ucnVubmluZz1zZXRUaW1lb3V0KG4uJHdvcmtlciwyMCk7YnJlYWt9fW4uY3VycmVudExpbmU9dCxyPT0tMSYmKHI9dCksczw9ciYmbi5maXJlVXBkYXRlRXZlbnQocyxyKX19OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5zZXRUb2tlbml6ZXI9ZnVuY3Rpb24oZSl7dGhpcy50b2tlbml6ZXI9ZSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuc3RhcnQoMCl9LHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy5kb2M9ZSx0aGlzLmxpbmVzPVtdLHRoaXMuc3RhdGVzPVtdLHRoaXMuc3RvcCgpfSx0aGlzLmZpcmVVcGRhdGVFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXtmaXJzdDplLGxhc3Q6dH07dGhpcy5fc2lnbmFsKCJ1cGRhdGUiLHtkYXRhOm59KX0sdGhpcy5zdGFydD1mdW5jdGlvbihlKXt0aGlzLmN1cnJlbnRMaW5lPU1hdGgubWluKGV8fDAsdGhpcy5jdXJyZW50TGluZSx0aGlzLmRvYy5nZXRMZW5ndGgoKSksdGhpcy5saW5lcy5zcGxpY2UodGhpcy5jdXJyZW50TGluZSx0aGlzLmxpbmVzLmxlbmd0aCksdGhpcy5zdGF0ZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsdGhpcy5zdGF0ZXMubGVuZ3RoKSx0aGlzLnN0b3AoKSx0aGlzLnJ1bm5pbmc9c2V0VGltZW91dCh0aGlzLiR3b3JrZXIsNzAwKX0sdGhpcy5zY2hlZHVsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nfHwodGhpcy5ydW5uaW5nPXNldFRpbWVvdXQodGhpcy4kd29ya2VyLDcwMCkpfSx0aGlzLiR1cGRhdGVPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LnJvdyxuPWUuZW5kLnJvdy10O2lmKG49PT0wKXRoaXMubGluZXNbdF09bnVsbDtlbHNlIGlmKGUuYWN0aW9uPT0icmVtb3ZlIil0aGlzLmxpbmVzLnNwbGljZSh0LG4rMSxudWxsKSx0aGlzLnN0YXRlcy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1BcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMubGluZXMuc3BsaWNlLmFwcGx5KHRoaXMubGluZXMsciksdGhpcy5zdGF0ZXMuc3BsaWNlLmFwcGx5KHRoaXMuc3RhdGVzLHIpfXRoaXMuY3VycmVudExpbmU9TWF0aC5taW4odCx0aGlzLmN1cnJlbnRMaW5lLHRoaXMuZG9jLmdldExlbmd0aCgpKSx0aGlzLnN0b3AoKX0sdGhpcy5zdG9wPWZ1bmN0aW9uKCl7dGhpcy5ydW5uaW5nJiZjbGVhclRpbWVvdXQodGhpcy5ydW5uaW5nKSx0aGlzLnJ1bm5pbmc9ITF9LHRoaXMuZ2V0VG9rZW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmxpbmVzW2VdfHx0aGlzLiR0b2tlbml6ZVJvdyhlKX0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jdXJyZW50TGluZT09ZSYmdGhpcy4kdG9rZW5pemVSb3coZSksdGhpcy5zdGF0ZXNbZV18fCJzdGFydCJ9LHRoaXMuJHRva2VuaXplUm93PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9jLmdldExpbmUoZSksbj10aGlzLnN0YXRlc1tlLTFdLHI9dGhpcy50b2tlbml6ZXIuZ2V0TGluZVRva2Vucyh0LG4sZSk7cmV0dXJuIHRoaXMuc3RhdGVzW2VdKyIiIT1yLnN0YXRlKyIiPyh0aGlzLnN0YXRlc1tlXT1yLnN0YXRlLHRoaXMubGluZXNbZSsxXT1udWxsLHRoaXMuY3VycmVudExpbmU+ZSsxJiYodGhpcy5jdXJyZW50TGluZT1lKzEpKTp0aGlzLmN1cnJlbnRMaW5lPT1lJiYodGhpcy5jdXJyZW50TGluZT1lKzEpLHRoaXMubGluZXNbZV09ci50b2tlbnN9fSkuY2FsbChzLnByb3RvdHlwZSksdC5CYWNrZ3JvdW5kVG9rZW5pemVyPXN9KSxhY2UuZGVmaW5lKCJhY2Uvc2VhcmNoX2hpZ2hsaWdodCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9sYW5nIiksaT1lKCIuL2xpYi9vb3AiKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZSxvPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLnNldFJlZ2V4cChlKSx0aGlzLmNsYXp6PXQsdGhpcy50eXBlPW58fCJ0ZXh0In07KGZ1bmN0aW9uKCl7dGhpcy5NQVhfUkFOR0VTPTUwMCx0aGlzLnNldFJlZ2V4cD1mdW5jdGlvbihlKXtpZih0aGlzLnJlZ0V4cCsiIj09ZSsiIilyZXR1cm47dGhpcy5yZWdFeHA9ZSx0aGlzLmNhY2hlPVtdfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlLHQsbixpKXtpZighdGhpcy5yZWdFeHApcmV0dXJuO3ZhciBvPWkuZmlyc3RSb3csdT1pLmxhc3RSb3c7Zm9yKHZhciBhPW87YTw9dTthKyspe3ZhciBmPXRoaXMuY2FjaGVbYV07Zj09bnVsbCYmKGY9ci5nZXRNYXRjaE9mZnNldHMobi5nZXRMaW5lKGEpLHRoaXMucmVnRXhwKSxmLmxlbmd0aD50aGlzLk1BWF9SQU5HRVMmJihmPWYuc2xpY2UoMCx0aGlzLk1BWF9SQU5HRVMpKSxmPWYubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgcyhhLGUub2Zmc2V0LGEsZS5vZmZzZXQrZS5sZW5ndGgpfSksdGhpcy5jYWNoZVthXT1mLmxlbmd0aD9mOiIiKTtmb3IodmFyIGw9Zi5sZW5ndGg7bC0tOyl0LmRyYXdTaW5nbGVMaW5lTWFya2VyKGUsZltsXS50b1NjcmVlblJhbmdlKG4pLHRoaXMuY2xhenosaSl9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuU2VhcmNoSGlnaGxpZ2h0PW99KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gaShlLHQpe3RoaXMuZm9sZERhdGE9ZSxBcnJheS5pc0FycmF5KHQpP3RoaXMuZm9sZHM9dDp0PXRoaXMuZm9sZHM9W3RdO3ZhciBuPXRbdC5sZW5ndGgtMV07dGhpcy5yYW5nZT1uZXcgcih0WzBdLnN0YXJ0LnJvdyx0WzBdLnN0YXJ0LmNvbHVtbixuLmVuZC5yb3csbi5lbmQuY29sdW1uKSx0aGlzLnN0YXJ0PXRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5lbmQ9dGhpcy5yYW5nZS5lbmQsdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc2V0Rm9sZExpbmUodGhpcyl9LHRoaXMpfXZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2U7KGZ1bmN0aW9uKCl7dGhpcy5zaGlmdFJvdz1mdW5jdGlvbihlKXt0aGlzLnN0YXJ0LnJvdys9ZSx0aGlzLmVuZC5yb3crPWUsdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc3RhcnQucm93Kz1lLHQuZW5kLnJvdys9ZX0pfSx0aGlzLmFkZEZvbGQ9ZnVuY3Rpb24oZSl7aWYoZS5zYW1lUm93KXtpZihlLnN0YXJ0LnJvdzx0aGlzLnN0YXJ0Um93fHxlLmVuZFJvdz50aGlzLmVuZFJvdyl0aHJvdyBuZXcgRXJyb3IoIkNhbid0IGFkZCBhIGZvbGQgdG8gdGhpcyBGb2xkTGluZSBhcyBpdCBoYXMgbm8gY29ubmVjdGlvbiIpO3RoaXMuZm9sZHMucHVzaChlKSx0aGlzLmZvbGRzLnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4tZS5yYW5nZS5jb21wYXJlRW5kKHQuc3RhcnQucm93LHQuc3RhcnQuY29sdW1uKX0pLHRoaXMucmFuZ2UuY29tcGFyZUVuZChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik+MD8odGhpcy5lbmQucm93PWUuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49ZS5lbmQuY29sdW1uKTp0aGlzLnJhbmdlLmNvbXBhcmVTdGFydChlLmVuZC5yb3csZS5lbmQuY29sdW1uKTwwJiYodGhpcy5zdGFydC5yb3c9ZS5zdGFydC5yb3csdGhpcy5zdGFydC5jb2x1bW49ZS5zdGFydC5jb2x1bW4pfWVsc2UgaWYoZS5zdGFydC5yb3c9PXRoaXMuZW5kLnJvdyl0aGlzLmZvbGRzLnB1c2goZSksdGhpcy5lbmQucm93PWUuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49ZS5lbmQuY29sdW1uO2Vsc2V7aWYoZS5lbmQucm93IT10aGlzLnN0YXJ0LnJvdyl0aHJvdyBuZXcgRXJyb3IoIlRyeWluZyB0byBhZGQgZm9sZCB0byBGb2xkUm93IHRoYXQgZG9lc24ndCBoYXZlIGEgbWF0Y2hpbmcgcm93Iik7dGhpcy5mb2xkcy51bnNoaWZ0KGUpLHRoaXMuc3RhcnQucm93PWUuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWUuc3RhcnQuY29sdW1ufWUuZm9sZExpbmU9dGhpc30sdGhpcy5jb250YWluc1Jvdz1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5zdGFydC5yb3cmJmU8PXRoaXMuZW5kLnJvd30sdGhpcy53YWxrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wLGk9dGhpcy5mb2xkcyxzLG8sdSxhPSEwO3Q9PW51bGwmJih0PXRoaXMuZW5kLnJvdyxuPXRoaXMuZW5kLmNvbHVtbik7Zm9yKHZhciBmPTA7ZjxpLmxlbmd0aDtmKyspe3M9aVtmXSxvPXMucmFuZ2UuY29tcGFyZVN0YXJ0KHQsbik7aWYobz09LTEpe2UobnVsbCx0LG4scixhKTtyZXR1cm59dT1lKG51bGwscy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4scixhKSx1PSF1JiZlKHMucGxhY2Vob2xkZXIscy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4scik7aWYodXx8bz09PTApcmV0dXJuO2E9IXMuc2FtZVJvdyxyPXMuZW5kLmNvbHVtbn1lKG51bGwsdCxuLHIsYSl9LHRoaXMuZ2V0TmV4dEZvbGRUbz1mdW5jdGlvbihlLHQpe3ZhciBuLHI7Zm9yKHZhciBpPTA7aTx0aGlzLmZvbGRzLmxlbmd0aDtpKyspe249dGhpcy5mb2xkc1tpXSxyPW4ucmFuZ2UuY29tcGFyZUVuZChlLHQpO2lmKHI9PS0xKXJldHVybntmb2xkOm4sa2luZDoiYWZ0ZXIifTtpZihyPT09MClyZXR1cm57Zm9sZDpuLGtpbmQ6Imluc2lkZSJ9fXJldHVybiBudWxsfSx0aGlzLmFkZFJlbW92ZUNoYXJzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldE5leHRGb2xkVG8oZSx0KSxpLHM7aWYocil7aT1yLmZvbGQ7aWYoci5raW5kPT0iaW5zaWRlIiYmaS5zdGFydC5jb2x1bW4hPXQmJmkuc3RhcnQucm93IT1lKXdpbmRvdy5jb25zb2xlJiZ3aW5kb3cuY29uc29sZS5sb2coZSx0LGkpO2Vsc2UgaWYoaS5zdGFydC5yb3c9PWUpe3M9dGhpcy5mb2xkczt2YXIgbz1zLmluZGV4T2YoaSk7bz09PTAmJih0aGlzLnN0YXJ0LmNvbHVtbis9bik7Zm9yKG87bzxzLmxlbmd0aDtvKyspe2k9c1tvXSxpLnN0YXJ0LmNvbHVtbis9bjtpZighaS5zYW1lUm93KXJldHVybjtpLmVuZC5jb2x1bW4rPW59dGhpcy5lbmQuY29sdW1uKz1ufX19LHRoaXMuc3BsaXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldE5leHRGb2xkVG8oZSx0KTtpZighbnx8bi5raW5kPT0iaW5zaWRlIilyZXR1cm4gbnVsbDt2YXIgcj1uLmZvbGQscz10aGlzLmZvbGRzLG89dGhpcy5mb2xkRGF0YSx1PXMuaW5kZXhPZihyKSxhPXNbdS0xXTt0aGlzLmVuZC5yb3c9YS5lbmQucm93LHRoaXMuZW5kLmNvbHVtbj1hLmVuZC5jb2x1bW4scz1zLnNwbGljZSh1LHMubGVuZ3RoLXUpO3ZhciBmPW5ldyBpKG8scyk7cmV0dXJuIG8uc3BsaWNlKG8uaW5kZXhPZih0aGlzKSsxLDAsZiksZn0sdGhpcy5tZXJnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmZvbGRzO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRoaXMuYWRkRm9sZCh0W25dKTt2YXIgcj10aGlzLmZvbGREYXRhO3Iuc3BsaWNlKHIuaW5kZXhPZihlKSwxKX0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3ZhciBlPVt0aGlzLnJhbmdlLnRvU3RyaW5nKCkrIjogWyJdO3JldHVybiB0aGlzLmZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7ZS5wdXNoKCIgICIrdC50b1N0cmluZygpKX0pLGUucHVzaCgiXSIpLGUuam9pbigiXG4iKX0sdGhpcy5pZHhUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PTA7Zm9yKHZhciBuPTA7bjx0aGlzLmZvbGRzLmxlbmd0aDtuKyspe3ZhciByPXRoaXMuZm9sZHNbbl07ZS09ci5zdGFydC5jb2x1bW4tdDtpZihlPDApcmV0dXJue3JvdzpyLnN0YXJ0LnJvdyxjb2x1bW46ci5zdGFydC5jb2x1bW4rZX07ZS09ci5wbGFjZWhvbGRlci5sZW5ndGg7aWYoZTwwKXJldHVybiByLnN0YXJ0O3Q9ci5lbmQuY29sdW1ufXJldHVybntyb3c6dGhpcy5lbmQucm93LGNvbHVtbjp0aGlzLmVuZC5jb2x1bW4rZX19fSkuY2FsbChpLnByb3RvdHlwZSksdC5Gb2xkTGluZT1pfSksYWNlLmRlZmluZSgiYWNlL3JhbmdlX2xpc3QiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPXIuY29tcGFyZVBvaW50cyxzPWZ1bmN0aW9uKCl7dGhpcy5yYW5nZXM9W10sdGhpcy4kYmlhcz0xfTsoZnVuY3Rpb24oKXt0aGlzLmNvbXBhcmVQb2ludHM9aSx0aGlzLnBvaW50SW5kZXg9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMucmFuZ2VzO2Zvcih2YXIgcz1ufHwwO3M8ci5sZW5ndGg7cysrKXt2YXIgbz1yW3NdLHU9aShlLG8uZW5kKTtpZih1PjApY29udGludWU7dmFyIGE9aShlLG8uc3RhcnQpO3JldHVybiB1PT09MD90JiZhIT09MD8tcy0yOnM6YT4wfHxhPT09MCYmIXQ/czotcy0xfXJldHVybi1zLTF9LHRoaXMuYWRkPWZ1bmN0aW9uKGUpe3ZhciB0PSFlLmlzRW1wdHkoKSxuPXRoaXMucG9pbnRJbmRleChlLnN0YXJ0LHQpO248MCYmKG49LW4tMSk7dmFyIHI9dGhpcy5wb2ludEluZGV4KGUuZW5kLHQsbik7cmV0dXJuIHI8MD9yPS1yLTE6cisrLHRoaXMucmFuZ2VzLnNwbGljZShuLHItbixlKX0sdGhpcy5hZGRMaXN0PWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXQucHVzaC5hcHBseSh0LHRoaXMuYWRkKGVbbl0pKTtyZXR1cm4gdH0sdGhpcy5zdWJzdHJhY3RQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnBvaW50SW5kZXgoZSk7aWYodD49MClyZXR1cm4gdGhpcy5yYW5nZXMuc3BsaWNlKHQsMSl9LHRoaXMubWVyZ2U9ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMucmFuZ2VzO3Q9dC5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoZS5zdGFydCx0LnN0YXJ0KX0pO3ZhciBuPXRbMF0scjtmb3IodmFyIHM9MTtzPHQubGVuZ3RoO3MrKyl7cj1uLG49dFtzXTt2YXIgbz1pKHIuZW5kLG4uc3RhcnQpO2lmKG88MCljb250aW51ZTtpZihvPT0wJiYhci5pc0VtcHR5KCkmJiFuLmlzRW1wdHkoKSljb250aW51ZTtpKHIuZW5kLG4uZW5kKTwwJiYoci5lbmQucm93PW4uZW5kLnJvdyxyLmVuZC5jb2x1bW49bi5lbmQuY29sdW1uKSx0LnNwbGljZShzLDEpLGUucHVzaChuKSxuPXIscy0tfXJldHVybiB0aGlzLnJhbmdlcz10LGV9LHRoaXMuY29udGFpbnM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wb2ludEluZGV4KHtyb3c6ZSxjb2x1bW46dH0pPj0wfSx0aGlzLmNvbnRhaW5zUG9pbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucG9pbnRJbmRleChlKT49MH0sdGhpcy5yYW5nZUF0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb2ludEluZGV4KGUpO2lmKHQ+PTApcmV0dXJuIHRoaXMucmFuZ2VzW3RdfSx0aGlzLmNsaXBSb3dzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yYW5nZXM7aWYoblswXS5zdGFydC5yb3c+dHx8bltuLmxlbmd0aC0xXS5zdGFydC5yb3c8ZSlyZXR1cm5bXTt2YXIgcj10aGlzLnBvaW50SW5kZXgoe3JvdzplLGNvbHVtbjowfSk7cjwwJiYocj0tci0xKTt2YXIgaT10aGlzLnBvaW50SW5kZXgoe3Jvdzp0LGNvbHVtbjowfSxyKTtpPDAmJihpPS1pLTEpO3ZhciBzPVtdO2Zvcih2YXIgbz1yO288aTtvKyspcy5wdXNoKG5bb10pO3JldHVybiBzfSx0aGlzLnJlbW92ZUFsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmdlcy5zcGxpY2UoMCx0aGlzLnJhbmdlcy5sZW5ndGgpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuZGV0YWNoKCksdGhpcy5zZXNzaW9uPWUsdGhpcy5vbkNoYW5nZT10aGlzLiRvbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlIix0aGlzLm9uQ2hhbmdlKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXtpZighdGhpcy5zZXNzaW9uKXJldHVybjt0aGlzLnNlc3Npb24ucmVtb3ZlTGlzdGVuZXIoImNoYW5nZSIsdGhpcy5vbkNoYW5nZSksdGhpcy5zZXNzaW9uPW51bGx9LHRoaXMuJG9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQsbj1lLmVuZCxyPXQucm93LGk9bi5yb3cscz10aGlzLnJhbmdlcztmb3IodmFyIG89MCx1PXMubGVuZ3RoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5lbmQucm93Pj1yKWJyZWFrfWlmKGUuYWN0aW9uPT0iaW5zZXJ0Iil7dmFyIGY9aS1yLGw9LXQuY29sdW1uK24uY29sdW1uO2Zvcig7bzx1O28rKyl7dmFyIGE9c1tvXTtpZihhLnN0YXJ0LnJvdz5yKWJyZWFrO2Euc3RhcnQucm93PT1yJiZhLnN0YXJ0LmNvbHVtbj49dC5jb2x1bW4mJihhLnN0YXJ0LmNvbHVtbj09dC5jb2x1bW4mJnRoaXMuJGJpYXM8PTB8fChhLnN0YXJ0LmNvbHVtbis9bCxhLnN0YXJ0LnJvdys9ZikpO2lmKGEuZW5kLnJvdz09ciYmYS5lbmQuY29sdW1uPj10LmNvbHVtbil7aWYoYS5lbmQuY29sdW1uPT10LmNvbHVtbiYmdGhpcy4kYmlhczwwKWNvbnRpbnVlO2EuZW5kLmNvbHVtbj09dC5jb2x1bW4mJmw+MCYmbzx1LTEmJmEuZW5kLmNvbHVtbj5hLnN0YXJ0LmNvbHVtbiYmYS5lbmQuY29sdW1uPT1zW28rMV0uc3RhcnQuY29sdW1uJiYoYS5lbmQuY29sdW1uLT1sKSxhLmVuZC5jb2x1bW4rPWwsYS5lbmQucm93Kz1mfX19ZWxzZXt2YXIgZj1yLWksbD10LmNvbHVtbi1uLmNvbHVtbjtmb3IoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5zdGFydC5yb3c+aSlicmVhaztpZihhLmVuZC5yb3c8aSYmKHI8YS5lbmQucm93fHxyPT1hLmVuZC5yb3cmJnQuY29sdW1uPGEuZW5kLmNvbHVtbikpYS5lbmQucm93PXIsYS5lbmQuY29sdW1uPXQuY29sdW1uO2Vsc2UgaWYoYS5lbmQucm93PT1pKWlmKGEuZW5kLmNvbHVtbjw9bi5jb2x1bW4pe2lmKGZ8fGEuZW5kLmNvbHVtbj50LmNvbHVtbilhLmVuZC5jb2x1bW49dC5jb2x1bW4sYS5lbmQucm93PXQucm93fWVsc2UgYS5lbmQuY29sdW1uKz1sLGEuZW5kLnJvdys9ZjtlbHNlIGEuZW5kLnJvdz5pJiYoYS5lbmQucm93Kz1mKTtpZihhLnN0YXJ0LnJvdzxpJiYocjxhLnN0YXJ0LnJvd3x8cj09YS5zdGFydC5yb3cmJnQuY29sdW1uPGEuc3RhcnQuY29sdW1uKSlhLnN0YXJ0LnJvdz1yLGEuc3RhcnQuY29sdW1uPXQuY29sdW1uO2Vsc2UgaWYoYS5zdGFydC5yb3c9PWkpaWYoYS5zdGFydC5jb2x1bW48PW4uY29sdW1uKXtpZihmfHxhLnN0YXJ0LmNvbHVtbj50LmNvbHVtbilhLnN0YXJ0LmNvbHVtbj10LmNvbHVtbixhLnN0YXJ0LnJvdz10LnJvd31lbHNlIGEuc3RhcnQuY29sdW1uKz1sLGEuc3RhcnQucm93Kz1mO2Vsc2UgYS5zdGFydC5yb3c+aSYmKGEuc3RhcnQucm93Kz1mKX19aWYoZiE9MCYmbzx1KWZvcig7bzx1O28rKyl7dmFyIGE9c1tvXTthLnN0YXJ0LnJvdys9ZixhLmVuZC5yb3crPWZ9fX0pLmNhbGwocy5wcm90b3R5cGUpLHQuUmFuZ2VMaXN0PXN9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2VfbGlzdCIsImFjZS9saWIvb29wIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7ZS5yb3ctPXQucm93LGUucm93PT0wJiYoZS5jb2x1bW4tPXQuY29sdW1uKX1mdW5jdGlvbiB1KGUsdCl7byhlLnN0YXJ0LHQpLG8oZS5lbmQsdCl9ZnVuY3Rpb24gYShlLHQpe2Uucm93PT0wJiYoZS5jb2x1bW4rPXQuY29sdW1uKSxlLnJvdys9dC5yb3d9ZnVuY3Rpb24gZihlLHQpe2EoZS5zdGFydCx0KSxhKGUuZW5kLHQpfXZhciByPWUoIi4uL3JhbmdlX2xpc3QiKS5SYW5nZUxpc3QsaT1lKCIuLi9saWIvb29wIikscz10LkZvbGQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmZvbGRMaW5lPW51bGwsdGhpcy5wbGFjZWhvbGRlcj10LHRoaXMucmFuZ2U9ZSx0aGlzLnN0YXJ0PWUuc3RhcnQsdGhpcy5lbmQ9ZS5lbmQsdGhpcy5zYW1lUm93PWUuc3RhcnQucm93PT1lLmVuZC5yb3csdGhpcy5zdWJGb2xkcz10aGlzLnJhbmdlcz1bXX07aS5pbmhlcml0cyhzLHIpLGZ1bmN0aW9uKCl7dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiciJyt0aGlzLnBsYWNlaG9sZGVyKyciICcrdGhpcy5yYW5nZS50b1N0cmluZygpfSx0aGlzLnNldEZvbGRMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuZm9sZExpbmU9ZSx0aGlzLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7dC5zZXRGb2xkTGluZShlKX0pfSx0aGlzLmNsb25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5yYW5nZS5jbG9uZSgpLHQ9bmV3IHMoZSx0aGlzLnBsYWNlaG9sZGVyKTtyZXR1cm4gdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Quc3ViRm9sZHMucHVzaChlLmNsb25lKCkpfSksdC5jb2xsYXBzZUNoaWxkcmVuPXRoaXMuY29sbGFwc2VDaGlsZHJlbix0fSx0aGlzLmFkZFN1YkZvbGQ9ZnVuY3Rpb24oZSl7aWYodGhpcy5yYW5nZS5pc0VxdWFsKGUpKXJldHVybjt1KGUsdGhpcy5zdGFydCk7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLnN0YXJ0LmNvbHVtbjtmb3IodmFyIHI9MCxpPS0xO3I8dGhpcy5zdWJGb2xkcy5sZW5ndGg7cisrKXtpPXRoaXMuc3ViRm9sZHNbcl0ucmFuZ2UuY29tcGFyZSh0LG4pO2lmKGkhPTEpYnJlYWt9dmFyIHM9dGhpcy5zdWJGb2xkc1tyXSxvPTA7aWYoaT09MCl7aWYocy5yYW5nZS5jb250YWluc1JhbmdlKGUpKXJldHVybiBzLmFkZFN1YkZvbGQoZSk7bz0xfXZhciB0PWUucmFuZ2UuZW5kLnJvdyxuPWUucmFuZ2UuZW5kLmNvbHVtbjtmb3IodmFyIGE9cixpPS0xO2E8dGhpcy5zdWJGb2xkcy5sZW5ndGg7YSsrKXtpPXRoaXMuc3ViRm9sZHNbYV0ucmFuZ2UuY29tcGFyZSh0LG4pO2lmKGkhPTEpYnJlYWt9aT09MCYmYSsrO3ZhciBmPXRoaXMuc3ViRm9sZHMuc3BsaWNlKHIsYS1yLGUpLGw9aT09MD9mLmxlbmd0aC0xOmYubGVuZ3RoO2Zvcih2YXIgYz1vO2M8bDtjKyspZS5hZGRTdWJGb2xkKGZbY10pO3JldHVybiBlLnNldEZvbGRMaW5lKHRoaXMuZm9sZExpbmUpLGV9LHRoaXMucmVzdG9yZVJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBmKGUsdGhpcy5zdGFydCl9fS5jYWxsKHMucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZF9saW5lIiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB1KCl7dGhpcy5nZXRGb2xkQXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGk9ci5mb2xkcztmb3IodmFyIHM9MDtzPGkubGVuZ3RoO3MrKyl7dmFyIG89aVtzXS5yYW5nZTtpZihvLmNvbnRhaW5zKGUsdCkpe2lmKG49PTEmJm8uaXNFbmQoZSx0KSYmIW8uaXNFbXB0eSgpKWNvbnRpbnVlO2lmKG49PS0xJiZvLmlzU3RhcnQoZSx0KSYmIW8uaXNFbXB0eSgpKWNvbnRpbnVlO3JldHVybiBpW3NdfX19LHRoaXMuZ2V0Rm9sZHNJblJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQsbj1lLmVuZCxyPXRoaXMuJGZvbGREYXRhLGk9W107dC5jb2x1bW4rPTEsbi5jb2x1bW4tPTE7Zm9yKHZhciBzPTA7czxyLmxlbmd0aDtzKyspe3ZhciBvPXJbc10ucmFuZ2UuY29tcGFyZVJhbmdlKGUpO2lmKG89PTIpY29udGludWU7aWYobz09LTIpYnJlYWs7dmFyIHU9cltzXS5mb2xkcztmb3IodmFyIGE9MDthPHUubGVuZ3RoO2ErKyl7dmFyIGY9dVthXTtvPWYucmFuZ2UuY29tcGFyZVJhbmdlKGUpO2lmKG89PS0yKWJyZWFrO2lmKG89PTIpY29udGludWU7aWYobz09NDIpYnJlYWs7aS5wdXNoKGYpfX1yZXR1cm4gdC5jb2x1bW4tPTEsbi5jb2x1bW4rPTEsaX0sdGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0PWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3ZhciB0PVtdO2UuZm9yRWFjaChmdW5jdGlvbihlKXt0PXQuY29uY2F0KHRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpKX0sdGhpcyl9ZWxzZSB2YXIgdD10aGlzLmdldEZvbGRzSW5SYW5nZShlKTtyZXR1cm4gdH0sdGhpcy5nZXRBbGxGb2xkcz1mdW5jdGlvbigpe3ZhciBlPVtdLHQ9dGhpcy4kZm9sZERhdGE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspZm9yKHZhciByPTA7cjx0W25dLmZvbGRzLmxlbmd0aDtyKyspZS5wdXNoKHRbbl0uZm9sZHNbcl0pO3JldHVybiBlfSx0aGlzLmdldEZvbGRTdHJpbmdBdD1mdW5jdGlvbihlLHQsbixyKXtyPXJ8fHRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIXIpcmV0dXJuIG51bGw7dmFyIGk9e2VuZDp7Y29sdW1uOjB9fSxzLG87Zm9yKHZhciB1PTA7dTxyLmZvbGRzLmxlbmd0aDt1Kyspe289ci5mb2xkc1t1XTt2YXIgYT1vLnJhbmdlLmNvbXBhcmVFbmQoZSx0KTtpZihhPT0tMSl7cz10aGlzLmdldExpbmUoby5zdGFydC5yb3cpLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4sby5zdGFydC5jb2x1bW4pO2JyZWFrfWlmKGE9PT0wKXJldHVybiBudWxsO2k9b31yZXR1cm4gc3x8KHM9dGhpcy5nZXRMaW5lKG8uc3RhcnQucm93KS5zdWJzdHJpbmcoaS5lbmQuY29sdW1uKSksbj09LTE/cy5zdWJzdHJpbmcoMCx0LWkuZW5kLmNvbHVtbik6bj09MT9zLnN1YnN0cmluZyh0LWkuZW5kLmNvbHVtbik6c30sdGhpcy5nZXRGb2xkTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9MDt0JiYocj1uLmluZGV4T2YodCkpLHI9PS0xJiYocj0wKTtmb3IocjtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihpLnN0YXJ0LnJvdzw9ZSYmaS5lbmQucm93Pj1lKXJldHVybiBpO2lmKGkuZW5kLnJvdz5lKXJldHVybiBudWxsfXJldHVybiBudWxsfSx0aGlzLmdldE5leHRGb2xkTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9MDt0JiYocj1uLmluZGV4T2YodCkpLHI9PS0xJiYocj0wKTtmb3IocjtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihpLmVuZC5yb3c+PWUpcmV0dXJuIGl9cmV0dXJuIG51bGx9LHRoaXMuZ2V0Rm9sZGVkUm93Q291bnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPXQtZSsxO2Zvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXt2YXIgcz1uW2ldLG89cy5lbmQucm93LHU9cy5zdGFydC5yb3c7aWYobz49dCl7dTx0JiYodT49ZT9yLT10LXU6cj0wKTticmVha31vPj1lJiYodT49ZT9yLT1vLXU6ci09by1lKzEpfXJldHVybiByfSx0aGlzLiRhZGRGb2xkTGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kZm9sZERhdGEucHVzaChlKSx0aGlzLiRmb2xkRGF0YS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuc3RhcnQucm93LXQuc3RhcnQucm93fSksZX0sdGhpcy5hZGRGb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj0hMSxvO2UgaW5zdGFuY2VvZiBzP289ZToobz1uZXcgcyh0LGUpLG8uY29sbGFwc2VDaGlsZHJlbj10LmNvbGxhcHNlQ2hpbGRyZW4pLHRoaXMuJGNsaXBSYW5nZVRvRG9jdW1lbnQoby5yYW5nZSk7dmFyIHU9by5zdGFydC5yb3csYT1vLnN0YXJ0LmNvbHVtbixmPW8uZW5kLnJvdyxsPW8uZW5kLmNvbHVtbixjPXRoaXMuZ2V0Rm9sZEF0KHUsYSwxKSxoPXRoaXMuZ2V0Rm9sZEF0KGYsbCwtMSk7aWYoYyYmaD09YylyZXR1cm4gYy5hZGRTdWJGb2xkKG8pO2MmJiFjLnJhbmdlLmlzU3RhcnQodSxhKSYmdGhpcy5yZW1vdmVGb2xkKGMpLGgmJiFoLnJhbmdlLmlzRW5kKGYsbCkmJnRoaXMucmVtb3ZlRm9sZChoKTt2YXIgcD10aGlzLmdldEZvbGRzSW5SYW5nZShvLnJhbmdlKTtwLmxlbmd0aD4wJiYodGhpcy5yZW1vdmVGb2xkcyhwKSxwLmZvckVhY2goZnVuY3Rpb24oZSl7by5hZGRTdWJGb2xkKGUpfSkpO2Zvcih2YXIgZD0wO2Q8bi5sZW5ndGg7ZCsrKXt2YXIgdj1uW2RdO2lmKGY9PXYuc3RhcnQucm93KXt2LmFkZEZvbGQobykscj0hMDticmVha31pZih1PT12LmVuZC5yb3cpe3YuYWRkRm9sZChvKSxyPSEwO2lmKCFvLnNhbWVSb3cpe3ZhciBtPW5bZCsxXTtpZihtJiZtLnN0YXJ0LnJvdz09Zil7di5tZXJnZShtKTticmVha319YnJlYWt9aWYoZjw9di5zdGFydC5yb3cpYnJlYWt9cmV0dXJuIHJ8fCh2PXRoaXMuJGFkZEZvbGRMaW5lKG5ldyBpKHRoaXMuJGZvbGREYXRhLG8pKSksdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kdXBkYXRlV3JhcERhdGEodi5zdGFydC5yb3csdi5zdGFydC5yb3cpOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKHYuc3RhcnQucm93LHYuc3RhcnQucm93KSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLl9zaWduYWwoImNoYW5nZUZvbGQiLHtkYXRhOm8sYWN0aW9uOiJhZGQifSksb30sdGhpcy5hZGRGb2xkcz1mdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5hZGRGb2xkKGUpfSx0aGlzKX0sdGhpcy5yZW1vdmVGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZm9sZExpbmUsbj10LnN0YXJ0LnJvdyxyPXQuZW5kLnJvdyxpPXRoaXMuJGZvbGREYXRhLHM9dC5mb2xkcztpZihzLmxlbmd0aD09MSlpLnNwbGljZShpLmluZGV4T2YodCksMSk7ZWxzZSBpZih0LnJhbmdlLmlzRW5kKGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pKXMucG9wKCksdC5lbmQucm93PXNbcy5sZW5ndGgtMV0uZW5kLnJvdyx0LmVuZC5jb2x1bW49c1tzLmxlbmd0aC0xXS5lbmQuY29sdW1uO2Vsc2UgaWYodC5yYW5nZS5pc1N0YXJ0KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKSlzLnNoaWZ0KCksdC5zdGFydC5yb3c9c1swXS5zdGFydC5yb3csdC5zdGFydC5jb2x1bW49c1swXS5zdGFydC5jb2x1bW47ZWxzZSBpZihlLnNhbWVSb3cpcy5zcGxpY2Uocy5pbmRleE9mKGUpLDEpO2Vsc2V7dmFyIG89dC5zcGxpdChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik7cz1vLmZvbGRzLHMuc2hpZnQoKSxvLnN0YXJ0LnJvdz1zWzBdLnN0YXJ0LnJvdyxvLnN0YXJ0LmNvbHVtbj1zWzBdLnN0YXJ0LmNvbHVtbn10aGlzLiR1cGRhdGluZ3x8KHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHVwZGF0ZVdyYXBEYXRhKG4scik6dGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGUobixyKSksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGb2xkIix7ZGF0YTplLGFjdGlvbjoicmVtb3ZlIn0pfSx0aGlzLnJlbW92ZUZvbGRzPWZ1bmN0aW9uKGUpe3ZhciB0PVtdO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQucHVzaChlW25dKTt0LmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVGb2xkKGUpfSx0aGlzKSx0aGlzLiRtb2RpZmllZD0hMH0sdGhpcy5leHBhbmRGb2xkPWZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlRm9sZChlKSxlLnN1YkZvbGRzLmZvckVhY2goZnVuY3Rpb24odCl7ZS5yZXN0b3JlUmFuZ2UodCksdGhpcy5hZGRGb2xkKHQpfSx0aGlzKSxlLmNvbGxhcHNlQ2hpbGRyZW4+MCYmdGhpcy5mb2xkQWxsKGUuc3RhcnQucm93KzEsZS5lbmQucm93LGUuY29sbGFwc2VDaGlsZHJlbi0xKSxlLnN1YkZvbGRzPVtdfSx0aGlzLmV4cGFuZEZvbGRzPWZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlKXt0aGlzLmV4cGFuZEZvbGQoZSl9LHRoaXMpfSx0aGlzLnVuZm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuLGk7ZT09bnVsbD8obj1uZXcgcigwLDAsdGhpcy5nZXRMZW5ndGgoKSwwKSx0PSEwKTp0eXBlb2YgZT09Im51bWJlciI/bj1uZXcgcihlLDAsZSx0aGlzLmdldExpbmUoZSkubGVuZ3RoKToicm93ImluIGU/bj1yLmZyb21Qb2ludHMoZSxlKTpuPWUsaT10aGlzLmdldEZvbGRzSW5SYW5nZUxpc3Qobik7aWYodCl0aGlzLnJlbW92ZUZvbGRzKGkpO2Vsc2V7dmFyIHM9aTt3aGlsZShzLmxlbmd0aCl0aGlzLmV4cGFuZEZvbGRzKHMpLHM9dGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0KG4pfWlmKGkubGVuZ3RoKXJldHVybiBpfSx0aGlzLmlzUm93Rm9sZGVkPWZ1bmN0aW9uKGUsdCl7cmV0dXJuISF0aGlzLmdldEZvbGRMaW5lKGUsdCl9LHRoaXMuZ2V0Um93Rm9sZEVuZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0Rm9sZExpbmUoZSx0KTtyZXR1cm4gbj9uLmVuZC5yb3c6ZX0sdGhpcy5nZXRSb3dGb2xkU3RhcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEZvbGRMaW5lKGUsdCk7cmV0dXJuIG4/bi5zdGFydC5yb3c6ZX0sdGhpcy5nZXRGb2xkRGlzcGxheUxpbmU9ZnVuY3Rpb24oZSx0LG4scixpKXtyPT1udWxsJiYocj1lLnN0YXJ0LnJvdyksaT09bnVsbCYmKGk9MCksdD09bnVsbCYmKHQ9ZS5lbmQucm93KSxuPT1udWxsJiYobj10aGlzLmdldExpbmUodCkubGVuZ3RoKTt2YXIgcz10aGlzLmRvYyxvPSIiO3JldHVybiBlLndhbGsoZnVuY3Rpb24oZSx0LG4sdSl7aWYodDxyKXJldHVybjtpZih0PT1yKXtpZihuPGkpcmV0dXJuO3U9TWF0aC5tYXgoaSx1KX1lIT1udWxsP28rPWU6bys9cy5nZXRMaW5lKHQpLnN1YnN0cmluZyh1LG4pfSx0LG4pLG99LHRoaXMuZ2V0RGlzcGxheUxpbmU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5nZXRGb2xkTGluZShlKTtpZighaSl7dmFyIHM7cmV0dXJuIHM9dGhpcy5kb2MuZ2V0TGluZShlKSxzLnN1YnN0cmluZyhyfHwwLHR8fHMubGVuZ3RoKX1yZXR1cm4gdGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoaSxlLHQsbixyKX0sdGhpcy4kY2xvbmVGb2xkRGF0YT1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBlPXRoaXMuJGZvbGREYXRhLm1hcChmdW5jdGlvbih0KXt2YXIgbj10LmZvbGRzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5jbG9uZSgpfSk7cmV0dXJuIG5ldyBpKGUsbil9KSxlfSx0aGlzLnRvZ2dsZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24sbj10LmdldFJhbmdlKCkscixpO2lmKG4uaXNFbXB0eSgpKXt2YXIgcz1uLnN0YXJ0O3I9dGhpcy5nZXRGb2xkQXQocy5yb3cscy5jb2x1bW4pO2lmKHIpe3RoaXMuZXhwYW5kRm9sZChyKTtyZXR1cm59KGk9dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0KHMpKT9uLmNvbXBhcmVQb2ludChpKT09MT9uLmVuZD1pOihuLnN0YXJ0PWksbi5zdGFydC5jb2x1bW4rKyxuLmVuZC5jb2x1bW4tLSk6KGk9dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6cy5yb3csY29sdW1uOnMuY29sdW1uKzF9KSk/KG4uY29tcGFyZVBvaW50KGkpPT0xP24uZW5kPWk6bi5zdGFydD1pLG4uc3RhcnQuY29sdW1uKyspOm49dGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlKHMucm93LHMuY29sdW1uKXx8bn1lbHNle3ZhciBvPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKG4pO2lmKGUmJm8ubGVuZ3RoKXt0aGlzLmV4cGFuZEZvbGRzKG8pO3JldHVybn1vLmxlbmd0aD09MSYmKHI9b1swXSl9cnx8KHI9dGhpcy5nZXRGb2xkQXQobi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pKTtpZihyJiZyLnJhbmdlLnRvU3RyaW5nKCk9PW4udG9TdHJpbmcoKSl7dGhpcy5leHBhbmRGb2xkKHIpO3JldHVybn12YXIgdT0iLi4uIjtpZighbi5pc011bHRpTGluZSgpKXt1PXRoaXMuZ2V0VGV4dFJhbmdlKG4pO2lmKHUubGVuZ3RoPDQpcmV0dXJuO3U9dS50cmltKCkuc3Vic3RyaW5nKDAsMikrIi4uIn10aGlzLmFkZEZvbGQodSxuKX0sdGhpcy5nZXRDb21tZW50Rm9sZFJhbmdlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1uZXcgbyh0aGlzLGUsdCkscz1pLmdldEN1cnJlbnRUb2tlbigpLHU9cy50eXBlO2lmKHMmJi9eY29tbWVudHxzdHJpbmcvLnRlc3QodSkpe3U9dS5tYXRjaCgvY29tbWVudHxzdHJpbmcvKVswXSx1PT0iY29tbWVudCImJih1Kz0ifGRvYy1zdGFydCIpO3ZhciBhPW5ldyBSZWdFeHAodSksZj1uZXcgcjtpZihuIT0xKXtkbyBzPWkuc3RlcEJhY2t3YXJkKCk7d2hpbGUocyYmYS50ZXN0KHMudHlwZSkpO2kuc3RlcEZvcndhcmQoKX1mLnN0YXJ0LnJvdz1pLmdldEN1cnJlbnRUb2tlblJvdygpLGYuc3RhcnQuY29sdW1uPWkuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrMixpPW5ldyBvKHRoaXMsZSx0KTtpZihuIT0tMSl7dmFyIGw9LTE7ZG97cz1pLnN0ZXBGb3J3YXJkKCk7aWYobD09LTEpe3ZhciBjPXRoaXMuZ2V0U3RhdGUoaS4kcm93KTthLnRlc3QoYyl8fChsPWkuJHJvdyl9ZWxzZSBpZihpLiRyb3c+bClicmVha313aGlsZShzJiZhLnRlc3Qocy50eXBlKSk7cz1pLnN0ZXBCYWNrd2FyZCgpfWVsc2Ugcz1pLmdldEN1cnJlbnRUb2tlbigpO3JldHVybiBmLmVuZC5yb3c9aS5nZXRDdXJyZW50VG9rZW5Sb3coKSxmLmVuZC5jb2x1bW49aS5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStzLnZhbHVlLmxlbmd0aC0yLGZ9fSx0aGlzLmZvbGRBbGw9ZnVuY3Rpb24oZSx0LG4pe249PXVuZGVmaW5lZCYmKG49MWU1KTt2YXIgcj10aGlzLmZvbGRXaWRnZXRzO2lmKCFyKXJldHVybjt0PXR8fHRoaXMuZ2V0TGVuZ3RoKCksZT1lfHwwO2Zvcih2YXIgaT1lO2k8dDtpKyspe3JbaV09PW51bGwmJihyW2ldPXRoaXMuZ2V0Rm9sZFdpZGdldChpKSk7aWYocltpXSE9InN0YXJ0Iiljb250aW51ZTt2YXIgcz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShpKTtpZihzJiZzLmlzTXVsdGlMaW5lKCkmJnMuZW5kLnJvdzw9dCYmcy5zdGFydC5yb3c+PWUpe2k9cy5lbmQucm93O3RyeXt2YXIgbz10aGlzLmFkZEZvbGQoIi4uLiIscyk7byYmKG8uY29sbGFwc2VDaGlsZHJlbj1uKX1jYXRjaCh1KXt9fX19LHRoaXMuJGZvbGRTdHlsZXM9e21hbnVhbDoxLG1hcmtiZWdpbjoxLG1hcmtiZWdpbmVuZDoxfSx0aGlzLiRmb2xkU3R5bGU9Im1hcmtiZWdpbiIsdGhpcy5zZXRGb2xkU3R5bGU9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGZvbGRTdHlsZXNbZV0pdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvbGQgc3R5bGU6ICIrZSsiWyIrT2JqZWN0LmtleXModGhpcy4kZm9sZFN0eWxlcykuam9pbigiLCAiKSsiXSIpO2lmKHRoaXMuJGZvbGRTdHlsZT09ZSlyZXR1cm47dGhpcy4kZm9sZFN0eWxlPWUsZT09Im1hbnVhbCImJnRoaXMudW5mb2xkKCk7dmFyIHQ9dGhpcy4kZm9sZE1vZGU7dGhpcy4kc2V0Rm9sZGluZyhudWxsKSx0aGlzLiRzZXRGb2xkaW5nKHQpfSx0aGlzLiRzZXRGb2xkaW5nPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGZvbGRNb2RlPT1lKXJldHVybjt0aGlzLiRmb2xkTW9kZT1lLHRoaXMub2ZmKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLm9mZigidG9rZW5pemVyVXBkYXRlIix0aGlzLiR0b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5fc2lnbmFsKCJjaGFuZ2VBbm5vdGF0aW9uIik7aWYoIWV8fHRoaXMuJGZvbGRTdHlsZT09Im1hbnVhbCIpe3RoaXMuZm9sZFdpZGdldHM9bnVsbDtyZXR1cm59dGhpcy5mb2xkV2lkZ2V0cz1bXSx0aGlzLmdldEZvbGRXaWRnZXQ9ZS5nZXRGb2xkV2lkZ2V0LmJpbmQoZSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZS5nZXRGb2xkV2lkZ2V0UmFuZ2UuYmluZChlLHRoaXMsdGhpcy4kZm9sZFN0eWxlKSx0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cz10aGlzLnVwZGF0ZUZvbGRXaWRnZXRzLmJpbmQodGhpcyksdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHM9dGhpcy50b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMub24oImNoYW5nZSIsdGhpcy4kdXBkYXRlRm9sZFdpZGdldHMpLHRoaXMub24oInRva2VuaXplclVwZGF0ZSIsdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMpfSx0aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmZvbGRXaWRnZXRzO2lmKCFufHx0JiZuW2VdKXJldHVybnt9O3ZhciByPWUtMSxpO3doaWxlKHI+PTApe3ZhciBzPW5bcl07cz09bnVsbCYmKHM9bltyXT10aGlzLmdldEZvbGRXaWRnZXQocikpO2lmKHM9PSJzdGFydCIpe3ZhciBvPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKHIpO2l8fChpPW8pO2lmKG8mJm8uZW5kLnJvdz49ZSlicmVha31yLS19cmV0dXJue3JhbmdlOnIhPT0tMSYmbyxmaXJzdFJhbmdlOml9fSx0aGlzLm9uRm9sZFdpZGdldENsaWNrPWZ1bmN0aW9uKGUsdCl7dD10LmRvbUV2ZW50O3ZhciBuPXtjaGlsZHJlbjp0LnNoaWZ0S2V5LGFsbDp0LmN0cmxLZXl8fHQubWV0YUtleSxzaWJsaW5nczp0LmFsdEtleX0scj10aGlzLiR0b2dnbGVGb2xkV2lkZ2V0KGUsbik7aWYoIXIpe3ZhciBpPXQudGFyZ2V0fHx0LnNyY0VsZW1lbnQ7aSYmL2FjZV9mb2xkLXdpZGdldC8udGVzdChpLmNsYXNzTmFtZSkmJihpLmNsYXNzTmFtZSs9IiBhY2VfaW52YWxpZCIpfX0sdGhpcy4kdG9nZ2xlRm9sZFdpZGdldD1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmdldEZvbGRXaWRnZXQpcmV0dXJuO3ZhciBuPXRoaXMuZ2V0Rm9sZFdpZGdldChlKSxyPXRoaXMuZ2V0TGluZShlKSxpPW49PT0iZW5kIj8tMToxLHM9dGhpcy5nZXRGb2xkQXQoZSxpPT09LTE/MDpyLmxlbmd0aCxpKTtpZihzKXJldHVybiB0LmNoaWxkcmVufHx0LmFsbD90aGlzLnJlbW92ZUZvbGQocyk6dGhpcy5leHBhbmRGb2xkKHMpLHM7dmFyIG89dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoZSwhMCk7aWYobyYmIW8uaXNNdWx0aUxpbmUoKSl7cz10aGlzLmdldEZvbGRBdChvLnN0YXJ0LnJvdyxvLnN0YXJ0LmNvbHVtbiwxKTtpZihzJiZvLmlzRXF1YWwocy5yYW5nZSkpcmV0dXJuIHRoaXMucmVtb3ZlRm9sZChzKSxzfWlmKHQuc2libGluZ3Mpe3ZhciB1PXRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YShlKTtpZih1LnJhbmdlKXZhciBhPXUucmFuZ2Uuc3RhcnQucm93KzEsZj11LnJhbmdlLmVuZC5yb3c7dGhpcy5mb2xkQWxsKGEsZix0LmFsbD8xZTQ6MCl9ZWxzZSB0LmNoaWxkcmVuPyhmPW8/by5lbmQucm93OnRoaXMuZ2V0TGVuZ3RoKCksdGhpcy5mb2xkQWxsKGUrMSxmLHQuYWxsPzFlNDowKSk6byYmKHQuYWxsJiYoby5jb2xsYXBzZUNoaWxkcmVuPTFlNCksdGhpcy5hZGRGb2xkKCIuLi4iLG8pKTtyZXR1cm4gb30sdGhpcy50b2dnbGVGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdzt0PXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KHQpO3ZhciBuPXRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQodCx7fSk7aWYobilyZXR1cm47dmFyIHI9dGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhKHQsITApO249ci5yYW5nZXx8ci5maXJzdFJhbmdlO2lmKG4pe3Q9bi5zdGFydC5yb3c7dmFyIGk9dGhpcy5nZXRGb2xkQXQodCx0aGlzLmdldExpbmUodCkubGVuZ3RoLDEpO2k/dGhpcy5yZW1vdmVGb2xkKGkpOnRoaXMuYWRkRm9sZCgiLi4uIixuKX19LHRoaXMudXBkYXRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuPT09MCl0aGlzLmZvbGRXaWRnZXRzW3RdPW51bGw7ZWxzZSBpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy5mb2xkV2lkZ2V0cy5zcGxpY2UodCxuKzEsbnVsbCk7ZWxzZXt2YXIgcj1BcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMuZm9sZFdpZGdldHMuc3BsaWNlLmFwcGx5KHRoaXMuZm9sZFdpZGdldHMscil9fSx0aGlzLnRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0LmZpcnN0IT10Lmxhc3QmJnRoaXMuZm9sZFdpZGdldHMubGVuZ3RoPnQuZmlyc3QmJnRoaXMuZm9sZFdpZGdldHMuc3BsaWNlKHQuZmlyc3QsdGhpcy5mb2xkV2lkZ2V0cy5sZW5ndGgpfX12YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi9mb2xkX2xpbmUiKS5Gb2xkTGluZSxzPWUoIi4vZm9sZCIpLkZvbGQsbz1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3I7dC5Gb2xkaW5nPXV9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvdG9rZW5faXRlcmF0b3IiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHMoKXt0aGlzLmZpbmRNYXRjaGluZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0KXtpZihlLmNvbHVtbj09MClyZXR1cm4gbnVsbDt2YXIgbj10fHx0aGlzLmdldExpbmUoZS5yb3cpLmNoYXJBdChlLmNvbHVtbi0xKTtpZihuPT0iIilyZXR1cm4gbnVsbDt2YXIgcj1uLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTtyZXR1cm4gcj9yWzFdP3RoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChyWzFdLGUpOnRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChyWzJdLGUpOm51bGx9LHRoaXMuZ2V0QnJhY2tldFJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGluZShlLnJvdyksbj0hMCxyLHM9dC5jaGFyQXQoZS5jb2x1bW4tMSksbz1zJiZzLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKTtvfHwocz10LmNoYXJBdChlLmNvbHVtbiksZT17cm93OmUucm93LGNvbHVtbjplLmNvbHVtbisxfSxvPXMmJnMubWF0Y2goLyhbXChcW1x7XSl8KFtcKVxdXH1dKS8pLG49ITEpO2lmKCFvKXJldHVybiBudWxsO2lmKG9bMV0pe3ZhciB1PXRoaXMuJGZpbmRDbG9zaW5nQnJhY2tldChvWzFdLGUpO2lmKCF1KXJldHVybiBudWxsO3I9aS5mcm9tUG9pbnRzKGUsdSksbnx8KHIuZW5kLmNvbHVtbisrLHIuc3RhcnQuY29sdW1uLS0pLHIuY3Vyc29yPXIuZW5kfWVsc2V7dmFyIHU9dGhpcy4kZmluZE9wZW5pbmdCcmFja2V0KG9bMl0sZSk7aWYoIXUpcmV0dXJuIG51bGw7cj1pLmZyb21Qb2ludHModSxlKSxufHwoci5zdGFydC5jb2x1bW4rKyxyLmVuZC5jb2x1bW4tLSksci5jdXJzb3I9ci5zdGFydH1yZXR1cm4gcn0sdGhpcy4kYnJhY2tldHM9eyIpIjoiKCIsIigiOiIpIiwiXSI6IlsiLCJbIjoiXSIsInsiOiJ9IiwifSI6InsiLCI8IjoiPiIsIj4iOiI8In0sdGhpcy4kZmluZE9wZW5pbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLiRicmFja2V0c1tlXSxzPTEsbz1uZXcgcih0aGlzLHQucm93LHQuY29sdW1uKSx1PW8uZ2V0Q3VycmVudFRva2VuKCk7dXx8KHU9by5zdGVwRm9yd2FyZCgpKTtpZighdSlyZXR1cm47bnx8KG49bmV3IFJlZ0V4cCgiKFxcLj8iK3UudHlwZS5yZXBsYWNlKCIuIiwiXFwuIikucmVwbGFjZSgicnBhcmVuIiwiLnBhcmVuIikucmVwbGFjZSgvXGIoPzplbmQpXGIvLCIoPzpzdGFydHxiZWdpbnxlbmQpIikrIikrIikpO3ZhciBhPXQuY29sdW1uLW8uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCktMixmPXUudmFsdWU7Zm9yKDs7KXt3aGlsZShhPj0wKXt2YXIgbD1mLmNoYXJBdChhKTtpZihsPT1pKXtzLT0xO2lmKHM9PTApcmV0dXJue3JvdzpvLmdldEN1cnJlbnRUb2tlblJvdygpLGNvbHVtbjphK28uZ2V0Q3VycmVudFRva2VuQ29sdW1uKCl9fWVsc2UgbD09ZSYmKHMrPTEpO2EtPTF9ZG8gdT1vLnN0ZXBCYWNrd2FyZCgpO3doaWxlKHUmJiFuLnRlc3QodS50eXBlKSk7aWYodT09bnVsbClicmVhaztmPXUudmFsdWUsYT1mLmxlbmd0aC0xfXJldHVybiBudWxsfSx0aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXRoaXMuJGJyYWNrZXRzW2VdLHM9MSxvPW5ldyByKHRoaXMsdC5yb3csdC5jb2x1bW4pLHU9by5nZXRDdXJyZW50VG9rZW4oKTt1fHwodT1vLnN0ZXBGb3J3YXJkKCkpO2lmKCF1KXJldHVybjtufHwobj1uZXcgUmVnRXhwKCIoXFwuPyIrdS50eXBlLnJlcGxhY2UoIi4iLCJcXC4iKS5yZXBsYWNlKCJscGFyZW4iLCIucGFyZW4iKS5yZXBsYWNlKC9cYig/OnN0YXJ0fGJlZ2luKVxiLywiKD86c3RhcnR8YmVnaW58ZW5kKSIpKyIpKyIpKTt2YXIgYT10LmNvbHVtbi1vLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpO2Zvcig7Oyl7dmFyIGY9dS52YWx1ZSxsPWYubGVuZ3RoO3doaWxlKGE8bCl7dmFyIGM9Zi5jaGFyQXQoYSk7aWYoYz09aSl7cy09MTtpZihzPT0wKXJldHVybntyb3c6by5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YStvLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGM9PWUmJihzKz0xKTthKz0xfWRvIHU9by5zdGVwRm9yd2FyZCgpO3doaWxlKHUmJiFuLnRlc3QodS50eXBlKSk7aWYodT09bnVsbClicmVhazthPTB9cmV0dXJuIG51bGx9fXZhciByPWUoIi4uL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixpPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5CcmFja2V0TWF0Y2g9c30pLGFjZS5kZWZpbmUoImFjZS9lZGl0X3Nlc3Npb24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9iaWRpaGFuZGxlciIsImFjZS9jb25maWciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2Uvc2VsZWN0aW9uIiwiYWNlL21vZGUvdGV4dCIsImFjZS9yYW5nZSIsImFjZS9kb2N1bWVudCIsImFjZS9iYWNrZ3JvdW5kX3Rva2VuaXplciIsImFjZS9zZWFyY2hfaGlnaGxpZ2h0IiwiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2xhbmciKSxzPWUoIi4vYmlkaWhhbmRsZXIiKS5CaWRpSGFuZGxlcixvPWUoIi4vY29uZmlnIiksdT1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGE9ZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb24sZj1lKCIuL21vZGUvdGV4dCIpLk1vZGUsbD1lKCIuL3JhbmdlIikuUmFuZ2UsYz1lKCIuL2RvY3VtZW50IikuRG9jdW1lbnQsaD1lKCIuL2JhY2tncm91bmRfdG9rZW5pemVyIikuQmFja2dyb3VuZFRva2VuaXplcixwPWUoIi4vc2VhcmNoX2hpZ2hsaWdodCIpLlNlYXJjaEhpZ2hsaWdodCxkPWZ1bmN0aW9uKGUsdCl7dGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy4kZGVjb3JhdGlvbnM9W10sdGhpcy4kZnJvbnRNYXJrZXJzPXt9LHRoaXMuJGJhY2tNYXJrZXJzPXt9LHRoaXMuJG1hcmtlcklkPTEsdGhpcy4kdW5kb1NlbGVjdD0hMCx0aGlzLiRmb2xkRGF0YT1bXSx0aGlzLmlkPSJzZXNzaW9uIisgKytkLiR1aWQsdGhpcy4kZm9sZERhdGEudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5qb2luKCJcbiIpfSx0aGlzLm9uKCJjaGFuZ2VGb2xkIix0aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpKSx0aGlzLiRvbkNoYW5nZT10aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyk7aWYodHlwZW9mIGUhPSJvYmplY3QifHwhZS5nZXRMaW5lKWU9bmV3IGMoZSk7dGhpcy5zZXREb2N1bWVudChlKSx0aGlzLnNlbGVjdGlvbj1uZXcgYSh0aGlzKSx0aGlzLiRiaWRpSGFuZGxlcj1uZXcgcyh0aGlzKSxvLnJlc2V0T3B0aW9ucyh0aGlzKSx0aGlzLnNldE1vZGUodCksby5fc2lnbmFsKCJzZXNzaW9uIix0aGlzKX07ZC4kdWlkPTAsZnVuY3Rpb24oKXtmdW5jdGlvbiBtKGUpe3JldHVybiBlPDQzNTI/ITE6ZT49NDM1MiYmZTw9NDQ0N3x8ZT49NDUxNSYmZTw9NDUxOXx8ZT49NDYwMiYmZTw9NDYwN3x8ZT49OTAwMSYmZTw9OTAwMnx8ZT49MTE5MDQmJmU8PTExOTI5fHxlPj0xMTkzMSYmZTw9MTIwMTl8fGU+PTEyMDMyJiZlPD0xMjI0NXx8ZT49MTIyNzImJmU8PTEyMjgzfHxlPj0xMjI4OCYmZTw9MTIzNTB8fGU+PTEyMzUzJiZlPD0xMjQzOHx8ZT49MTI0NDEmJmU8PTEyNTQzfHxlPj0xMjU0OSYmZTw9MTI1ODl8fGU+PTEyNTkzJiZlPD0xMjY4Nnx8ZT49MTI2ODgmJmU8PTEyNzMwfHxlPj0xMjczNiYmZTw9MTI3NzF8fGU+PTEyNzg0JiZlPD0xMjgzMHx8ZT49MTI4MzImJmU8PTEyODcxfHxlPj0xMjg4MCYmZTw9MTMwNTR8fGU+PTEzMDU2JiZlPD0xOTkwM3x8ZT49MTk5NjgmJmU8PTQyMTI0fHxlPj00MjEyOCYmZTw9NDIxODJ8fGU+PTQzMzYwJiZlPD00MzM4OHx8ZT49NDQwMzImJmU8PTU1MjAzfHxlPj01NTIxNiYmZTw9NTUyMzh8fGU+PTU1MjQzJiZlPD01NTI5MXx8ZT49NjM3NDQmJmU8PTY0MjU1fHxlPj02NTA0MCYmZTw9NjUwNDl8fGU+PTY1MDcyJiZlPD02NTEwNnx8ZT49NjUxMDgmJmU8PTY1MTI2fHxlPj02NTEyOCYmZTw9NjUxMzF8fGU+PTY1MjgxJiZlPD02NTM3Nnx8ZT49NjU1MDQmJmU8PTY1NTEwfXIuaW1wbGVtZW50KHRoaXMsdSksdGhpcy5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt0aGlzLmRvYyYmdGhpcy5kb2MucmVtb3ZlTGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpLHRoaXMuZG9jPWUsZS5vbigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMucmVzZXRDYWNoZXMoKX0sdGhpcy5nZXREb2N1bWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvY30sdGhpcy4kcmVzZXRSb3dDYWNoZT1mdW5jdGlvbihlKXtpZighZSl7dGhpcy4kZG9jUm93Q2FjaGU9W10sdGhpcy4kc2NyZWVuUm93Q2FjaGU9W107cmV0dXJufXZhciB0PXRoaXMuJGRvY1Jvd0NhY2hlLmxlbmd0aCxuPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgodGhpcy4kZG9jUm93Q2FjaGUsZSkrMTt0Pm4mJih0aGlzLiRkb2NSb3dDYWNoZS5zcGxpY2Uobix0KSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5zcGxpY2Uobix0KSl9LHRoaXMuJGdldFJvd0NhY2hlSW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9ZS5sZW5ndGgtMTt3aGlsZShuPD1yKXt2YXIgaT1uK3I+PjEscz1lW2ldO2lmKHQ+cyluPWkrMTtlbHNle2lmKCEodDxzKSlyZXR1cm4gaTtyPWktMX19cmV0dXJuIG4tMX0sdGhpcy5yZXNldENhY2hlcz1mdW5jdGlvbigpe3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHdyYXBEYXRhPVtdLHRoaXMuJHJvd0xlbmd0aENhY2hlPVtdLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKX0sdGhpcy5vbkNoYW5nZUZvbGQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMuJHJlc2V0Um93Q2FjaGUodC5zdGFydC5yb3cpfSx0aGlzLm9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJGJpZGlIYW5kbGVyLm9uQ2hhbmdlKGUpLHRoaXMuJHJlc2V0Um93Q2FjaGUoZS5zdGFydC5yb3cpO3ZhciB0PXRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlKGUpOyF0aGlzLiRmcm9tVW5kbyYmdGhpcy4kdW5kb01hbmFnZXImJih0JiZ0Lmxlbmd0aCYmKHRoaXMuJHVuZG9NYW5hZ2VyLmFkZCh7YWN0aW9uOiJyZW1vdmVGb2xkcyIsZm9sZHM6dH0sdGhpcy5tZXJnZVVuZG9EZWx0YXMpLHRoaXMubWVyZ2VVbmRvRGVsdGFzPSEwKSx0aGlzLiR1bmRvTWFuYWdlci5hZGQoZSx0aGlzLm1lcmdlVW5kb0RlbHRhcyksdGhpcy5tZXJnZVVuZG9EZWx0YXM9ITAsdGhpcy4kaW5mb3JtVW5kb01hbmFnZXIuc2NoZWR1bGUoKSksdGhpcy5iZ1Rva2VuaXplciYmdGhpcy5iZ1Rva2VuaXplci4kdXBkYXRlT25DaGFuZ2UoZSksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpfSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldFZhbHVlKGUpLHRoaXMuc2VsZWN0aW9uLm1vdmVUbygwLDApLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCksdGhpcy5zZXRVbmRvTWFuYWdlcih0aGlzLiR1bmRvTWFuYWdlciksdGhpcy5nZXRVbmRvTWFuYWdlcigpLnJlc2V0KCl9LHRoaXMuZ2V0VmFsdWU9dGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRWYWx1ZSgpfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbn0sdGhpcy5nZXRTdGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5iZ1Rva2VuaXplci5nZXRTdGF0ZShlKX0sdGhpcy5nZXRUb2tlbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0VG9rZW5zKGUpfSx0aGlzLmdldFRva2VuQXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhlKSxyLGk9MDtpZih0PT1udWxsKXt2YXIgcz1uLmxlbmd0aC0xO2k9dGhpcy5nZXRMaW5lKGUpLmxlbmd0aH1lbHNlIGZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXtpKz1uW3NdLnZhbHVlLmxlbmd0aDtpZihpPj10KWJyZWFrfXJldHVybiByPW5bc10scj8oci5pbmRleD1zLHIuc3RhcnQ9aS1yLnZhbHVlLmxlbmd0aCxyKTpudWxsfSx0aGlzLnNldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKGUpe3RoaXMuJHVuZG9NYW5hZ2VyPWUsdGhpcy4kaW5mb3JtVW5kb01hbmFnZXImJnRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpO2lmKGUpe3ZhciB0PXRoaXM7ZS5hZGRTZXNzaW9uKHRoaXMpLHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcj1mdW5jdGlvbigpe3QuJGluZm9ybVVuZG9NYW5hZ2VyLmNhbmNlbCgpLHQubWVyZ2VVbmRvRGVsdGFzPSExfSx0aGlzLiRpbmZvcm1VbmRvTWFuYWdlcj1pLmRlbGF5ZWRDYWxsKHRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcil9ZWxzZSB0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXI9ZnVuY3Rpb24oKXt9fSx0aGlzLm1hcmtVbmRvR3JvdXA9ZnVuY3Rpb24oKXt0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXImJnRoaXMuJHN5bmNJbmZvcm1VbmRvTWFuYWdlcigpfSx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXI9e3VuZG86ZnVuY3Rpb24oKXt9LHJlZG86ZnVuY3Rpb24oKXt9LGhhc1VuZG86ZnVuY3Rpb24oKXt9LGhhc1JlZG86ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fSxhZGQ6ZnVuY3Rpb24oKXt9LGFkZFNlbGVjdGlvbjpmdW5jdGlvbigpe30sc3RhcnROZXdHcm91cDpmdW5jdGlvbigpe30sYWRkU2Vzc2lvbjpmdW5jdGlvbigpe319LHRoaXMuZ2V0VW5kb01hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb01hbmFnZXJ8fHRoaXMuJGRlZmF1bHRVbmRvTWFuYWdlcn0sdGhpcy5nZXRUYWJTdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVc2VTb2Z0VGFicygpP2kuc3RyaW5nUmVwZWF0KCIgIix0aGlzLmdldFRhYlNpemUoKSk6IgkifSx0aGlzLnNldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ1c2VTb2Z0VGFicyIsZSl9LHRoaXMuZ2V0VXNlU29mdFRhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMmJiF0aGlzLiRtb2RlLiRpbmRlbnRXaXRoVGFic30sdGhpcy5zZXRUYWJTaXplPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ0YWJTaXplIixlKX0sdGhpcy5nZXRUYWJTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRhYlNpemV9LHRoaXMuaXNUYWJTdG9wPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR1c2VTb2Z0VGFicyYmZS5jb2x1bW4ldGhpcy4kdGFiU2l6ZT09PTB9LHRoaXMuc2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigibmF2aWdhdGVXaXRoaW5Tb2Z0VGFicyIsZSl9LHRoaXMuZ2V0TmF2aWdhdGVXaXRoaW5Tb2Z0VGFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzfSx0aGlzLiRvdmVyd3JpdGU9ITEsdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIm92ZXJ3cml0ZSIsZSl9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG92ZXJ3cml0ZX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNldE92ZXJ3cml0ZSghdGhpcy4kb3ZlcndyaXRlKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZGVjb3JhdGlvbnNbZV18fCh0aGlzLiRkZWNvcmF0aW9uc1tlXT0iIiksdGhpcy4kZGVjb3JhdGlvbnNbZV0rPSIgIit0LHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRkZWNvcmF0aW9uc1tlXT0odGhpcy4kZGVjb3JhdGlvbnNbZV18fCIiKS5yZXBsYWNlKCIgIit0LCIiKSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5nZXRCcmVha3BvaW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRicmVha3BvaW50c30sdGhpcy5zZXRCcmVha3BvaW50cz1mdW5jdGlvbihlKXt0aGlzLiRicmVha3BvaW50cz1bXTtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLiRicmVha3BvaW50c1tlW3RdXT0iYWNlX2JyZWFrcG9pbnQiO3RoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmNsZWFyQnJlYWtwb2ludHM9ZnVuY3Rpb24oKXt0aGlzLiRicmVha3BvaW50cz1bXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5zZXRCcmVha3BvaW50PWZ1bmN0aW9uKGUsdCl7dD09PXVuZGVmaW5lZCYmKHQ9ImFjZV9icmVha3BvaW50IiksdD90aGlzLiRicmVha3BvaW50c1tlXT10OmRlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tlXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnQ9ZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXMuJGJyZWFrcG9pbnRzW2VdLHRoaXMuX3NpZ25hbCgiY2hhbmdlQnJlYWtwb2ludCIse30pfSx0aGlzLmFkZE1hcmtlcj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRtYXJrZXJJZCsrLHM9e3JhbmdlOmUsdHlwZTpufHwibGluZSIscmVuZGVyZXI6dHlwZW9mIG49PSJmdW5jdGlvbiI/bjpudWxsLGNsYXp6OnQsaW5Gcm9udDohIXIsaWQ6aX07cmV0dXJuIHI/KHRoaXMuJGZyb250TWFya2Vyc1tpXT1zLHRoaXMuX3NpZ25hbCgiY2hhbmdlRnJvbnRNYXJrZXIiKSk6KHRoaXMuJGJhY2tNYXJrZXJzW2ldPXMsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpLGl9LHRoaXMuYWRkRHluYW1pY01hcmtlcj1mdW5jdGlvbihlLHQpe2lmKCFlLnVwZGF0ZSlyZXR1cm47dmFyIG49dGhpcy4kbWFya2VySWQrKztyZXR1cm4gZS5pZD1uLGUuaW5Gcm9udD0hIXQsdD8odGhpcy4kZnJvbnRNYXJrZXJzW25dPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGcm9udE1hcmtlciIpKToodGhpcy4kYmFja01hcmtlcnNbbl09ZSx0aGlzLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSksZX0sdGhpcy5yZW1vdmVNYXJrZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kZnJvbnRNYXJrZXJzW2VdfHx0aGlzLiRiYWNrTWFya2Vyc1tlXTtpZighdClyZXR1cm47dmFyIG49dC5pbkZyb250P3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2VycztkZWxldGUgbltlXSx0aGlzLl9zaWduYWwodC5pbkZyb250PyJjaGFuZ2VGcm9udE1hcmtlciI6ImNoYW5nZUJhY2tNYXJrZXIiKX0sdGhpcy5nZXRNYXJrZXJzPWZ1bmN0aW9uKGUpe3JldHVybiBlP3RoaXMuJGZyb250TWFya2Vyczp0aGlzLiRiYWNrTWFya2Vyc30sdGhpcy5oaWdobGlnaHQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJHNlYXJjaEhpZ2hsaWdodCl7dmFyIHQ9bmV3IHAobnVsbCwiYWNlX3NlbGVjdGVkLXdvcmQiLCJ0ZXh0Iik7dGhpcy4kc2VhcmNoSGlnaGxpZ2h0PXRoaXMuYWRkRHluYW1pY01hcmtlcih0KX10aGlzLiRzZWFyY2hIaWdobGlnaHQuc2V0UmVnZXhwKGUpfSx0aGlzLmhpZ2hsaWdodExpbmVzPWZ1bmN0aW9uKGUsdCxuLHIpe3R5cGVvZiB0IT0ibnVtYmVyIiYmKG49dCx0PWUpLG58fChuPSJhY2Vfc3RlcCIpO3ZhciBpPW5ldyBsKGUsMCx0LEluZmluaXR5KTtyZXR1cm4gaS5pZD10aGlzLmFkZE1hcmtlcihpLG4sImZ1bGxMaW5lIixyKSxpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGFubm90YXRpb25zPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VBbm5vdGF0aW9uIix7fSl9LHRoaXMuZ2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYW5ub3RhdGlvbnN8fFtdfSx0aGlzLmNsZWFyQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLnNldEFubm90YXRpb25zKFtdKX0sdGhpcy4kZGV0ZWN0TmV3TGluZT1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKC9eLio/KFxyP1xuKS9tKTt0P3RoaXMuJGF1dG9OZXdMaW5lPXRbMV06dGhpcy4kYXV0b05ld0xpbmU9IlxuIn0sdGhpcy5nZXRXb3JkUmFuZ2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldExpbmUoZSkscj0hMTt0PjAmJihyPSEhbi5jaGFyQXQodC0xKS5tYXRjaCh0aGlzLnRva2VuUmUpKSxyfHwocj0hIW4uY2hhckF0KHQpLm1hdGNoKHRoaXMudG9rZW5SZSkpO2lmKHIpdmFyIGk9dGhpcy50b2tlblJlO2Vsc2UgaWYoL15ccyskLy50ZXN0KG4uc2xpY2UodC0xLHQrMSkpKXZhciBpPS9ccy87ZWxzZSB2YXIgaT10aGlzLm5vblRva2VuUmU7dmFyIHM9dDtpZihzPjApe2RvIHMtLTt3aGlsZShzPj0wJiZuLmNoYXJBdChzKS5tYXRjaChpKSk7cysrfXZhciBvPXQ7d2hpbGUobzxuLmxlbmd0aCYmbi5jaGFyQXQobykubWF0Y2goaSkpbysrO3JldHVybiBuZXcgbChlLHMsZSxvKX0sdGhpcy5nZXRBV29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRXb3JkUmFuZ2UoZSx0KSxyPXRoaXMuZ2V0TGluZShuLmVuZC5yb3cpO3doaWxlKHIuY2hhckF0KG4uZW5kLmNvbHVtbikubWF0Y2goL1sgXHRdLykpbi5lbmQuY29sdW1uKz0xO3JldHVybiBufSx0aGlzLnNldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldE5ld0xpbmVNb2RlKGUpfSx0aGlzLmdldE5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldE5ld0xpbmVNb2RlKCl9LHRoaXMuc2V0VXNlV29ya2VyPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ1c2VXb3JrZXIiLGUpfSx0aGlzLmdldFVzZVdvcmtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXb3JrZXJ9LHRoaXMub25SZWxvYWRUb2tlbml6ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3RoaXMuYmdUb2tlbml6ZXIuc3RhcnQodC5maXJzdCksdGhpcy5fc2lnbmFsKCJ0b2tlbml6ZXJVcGRhdGUiLGUpfSx0aGlzLiRtb2Rlcz1vLiRtb2Rlcyx0aGlzLiRtb2RlPW51bGwsdGhpcy4kbW9kZUlkPW51bGwsdGhpcy5zZXRNb2RlPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihlLmdldFRva2VuaXplcilyZXR1cm4gdGhpcy4kb25DaGFuZ2VNb2RlKGUpO3ZhciBuPWUscj1uLnBhdGh9ZWxzZSByPWV8fCJhY2UvbW9kZS90ZXh0Ijt0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdfHwodGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXT1uZXcgZik7aWYodGhpcy4kbW9kZXNbcl0mJiFuKXt0aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbcl0pLHQmJnQoKTtyZXR1cm59dGhpcy4kbW9kZUlkPXIsby5sb2FkTW9kdWxlKFsibW9kZSIscl0sZnVuY3Rpb24oZSl7aWYodGhpcy4kbW9kZUlkIT09cilyZXR1cm4gdCYmdCgpO3RoaXMuJG1vZGVzW3JdJiYhbj90aGlzLiRvbkNoYW5nZU1vZGUodGhpcy4kbW9kZXNbcl0pOmUmJmUuTW9kZSYmKGU9bmV3IGUuTW9kZShuKSxufHwodGhpcy4kbW9kZXNbcl09ZSxlLiRpZD1yKSx0aGlzLiRvbkNoYW5nZU1vZGUoZSkpLHQmJnQoKX0uYmluZCh0aGlzKSksdGhpcy4kbW9kZXx8dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il0sITApfSx0aGlzLiRvbkNoYW5nZU1vZGU9ZnVuY3Rpb24oZSx0KXt0fHwodGhpcy4kbW9kZUlkPWUuJGlkKTtpZih0aGlzLiRtb2RlPT09ZSlyZXR1cm47dGhpcy4kbW9kZT1lLHRoaXMuJHN0b3BXb3JrZXIoKSx0aGlzLiR1c2VXb3JrZXImJnRoaXMuJHN0YXJ0V29ya2VyKCk7dmFyIG49ZS5nZXRUb2tlbml6ZXIoKTtpZihuLmFkZEV2ZW50TGlzdGVuZXIhPT11bmRlZmluZWQpe3ZhciByPXRoaXMub25SZWxvYWRUb2tlbml6ZXIuYmluZCh0aGlzKTtuLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIscil9aWYoIXRoaXMuYmdUb2tlbml6ZXIpe3RoaXMuYmdUb2tlbml6ZXI9bmV3IGgobik7dmFyIGk9dGhpczt0aGlzLmJnVG9rZW5pemVyLmFkZEV2ZW50TGlzdGVuZXIoInVwZGF0ZSIsZnVuY3Rpb24oZSl7aS5fc2lnbmFsKCJ0b2tlbml6ZXJVcGRhdGUiLGUpfSl9ZWxzZSB0aGlzLmJnVG9rZW5pemVyLnNldFRva2VuaXplcihuKTt0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KHRoaXMuZ2V0RG9jdW1lbnQoKSksdGhpcy50b2tlblJlPWUudG9rZW5SZSx0aGlzLm5vblRva2VuUmU9ZS5ub25Ub2tlblJlLHR8fChlLmF0dGFjaFRvU2Vzc2lvbiYmZS5hdHRhY2hUb1Nlc3Npb24odGhpcyksdGhpcy4kb3B0aW9ucy53cmFwTWV0aG9kLnNldC5jYWxsKHRoaXMsdGhpcy4kd3JhcE1ldGhvZCksdGhpcy4kc2V0Rm9sZGluZyhlLmZvbGRpbmdSdWxlcyksdGhpcy5iZ1Rva2VuaXplci5zdGFydCgwKSx0aGlzLl9lbWl0KCJjaGFuZ2VNb2RlIikpfSx0aGlzLiRzdG9wV29ya2VyPWZ1bmN0aW9uKCl7dGhpcy4kd29ya2VyJiYodGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsKX0sdGhpcy4kc3RhcnRXb3JrZXI9ZnVuY3Rpb24oKXt0cnl7dGhpcy4kd29ya2VyPXRoaXMuJG1vZGUuY3JlYXRlV29ya2VyKHRoaXMpfWNhdGNoKGUpe28ud2FybigiQ291bGQgbm90IGxvYWQgd29ya2VyIixlKSx0aGlzLiR3b3JrZXI9bnVsbH19LHRoaXMuZ2V0TW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRtb2RlfSx0aGlzLiRzY3JvbGxUb3A9MCx0aGlzLnNldFNjcm9sbFRvcD1mdW5jdGlvbihlKXtpZih0aGlzLiRzY3JvbGxUb3A9PT1lfHxpc05hTihlKSlyZXR1cm47dGhpcy4kc2Nyb2xsVG9wPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VTY3JvbGxUb3AiLGUpfSx0aGlzLmdldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxUb3B9LHRoaXMuJHNjcm9sbExlZnQ9MCx0aGlzLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24oZSl7aWYodGhpcy4kc2Nyb2xsTGVmdD09PWV8fGlzTmFOKGUpKXJldHVybjt0aGlzLiRzY3JvbGxMZWZ0PWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VTY3JvbGxMZWZ0IixlKX0sdGhpcy5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNjcm9sbExlZnR9LHRoaXMuZ2V0U2NyZWVuV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY29tcHV0ZVdpZHRoKCksdGhpcy5saW5lV2lkZ2V0cz9NYXRoLm1heCh0aGlzLmdldExpbmVXaWRnZXRNYXhXaWR0aCgpLHRoaXMuc2NyZWVuV2lkdGgpOnRoaXMuc2NyZWVuV2lkdGh9LHRoaXMuZ2V0TGluZVdpZGdldE1heFdpZHRoPWZ1bmN0aW9uKCl7aWYodGhpcy5saW5lV2lkZ2V0c1dpZHRoIT1udWxsKXJldHVybiB0aGlzLmxpbmVXaWRnZXRzV2lkdGg7dmFyIGU9MDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QmJnQuc2NyZWVuV2lkdGg+ZSYmKGU9dC5zY3JlZW5XaWR0aCl9KSx0aGlzLmxpbmVXaWRnZXRXaWR0aD1lfSx0aGlzLiRjb21wdXRlV2lkdGg9ZnVuY3Rpb24oZSl7aWYodGhpcy4kbW9kaWZpZWR8fGUpe3RoaXMuJG1vZGlmaWVkPSExO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXJldHVybiB0aGlzLnNjcmVlbldpZHRoPXRoaXMuJHdyYXBMaW1pdDt2YXIgdD10aGlzLmRvYy5nZXRBbGxMaW5lcygpLG49dGhpcy4kcm93TGVuZ3RoQ2FjaGUscj0wLGk9MCxzPXRoaXMuJGZvbGREYXRhW2ldLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eSx1PXQubGVuZ3RoO2Zvcih2YXIgYT0wO2E8dTthKyspe2lmKGE+byl7YT1zLmVuZC5yb3crMTtpZihhPj11KWJyZWFrO3M9dGhpcy4kZm9sZERhdGFbaSsrXSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHl9blthXT09bnVsbCYmKG5bYV09dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgodFthXSlbMF0pLG5bYV0+ciYmKHI9blthXSl9dGhpcy5zY3JlZW5XaWR0aD1yfX0sdGhpcy5nZXRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lKGUpfSx0aGlzLmdldExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLmdldExpbmVzKGUsdCl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9jLmdldExlbmd0aCgpfSx0aGlzLmdldFRleHRSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VGV4dFJhbmdlKGV8fHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCkpfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5pbnNlcnQoZSx0KX0sdGhpcy5yZW1vdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLnJlbW92ZShlKX0sdGhpcy5yZW1vdmVGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MucmVtb3ZlRnVsbExpbmVzKGUsdCl9LHRoaXMudW5kb0NoYW5nZXM9ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO2Zvcih2YXIgbj1lLmxlbmd0aC0xO24hPS0xO24tLSl7dmFyIHI9ZVtuXTtyLmFjdGlvbj09Imluc2VydCJ8fHIuYWN0aW9uPT0icmVtb3ZlIj90aGlzLmRvYy5yZXZlcnREZWx0YShyKTpyLmZvbGRzJiZ0aGlzLmFkZEZvbGRzKHIuZm9sZHMpfSF0JiZ0aGlzLiR1bmRvU2VsZWN0JiYoZS5zZWxlY3Rpb25CZWZvcmU/dGhpcy5zZWxlY3Rpb24uZnJvbUpTT04oZS5zZWxlY3Rpb25CZWZvcmUpOnRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZSwhMCkpKSx0aGlzLiRmcm9tVW5kbz0hMX0sdGhpcy5yZWRvQ2hhbmdlcz1mdW5jdGlvbihlLHQpe2lmKCFlLmxlbmd0aClyZXR1cm47dGhpcy4kZnJvbVVuZG89ITA7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07KHIuYWN0aW9uPT0iaW5zZXJ0Inx8ci5hY3Rpb249PSJyZW1vdmUiKSYmdGhpcy5kb2MuYXBwbHlEZWx0YShyKX0hdCYmdGhpcy4kdW5kb1NlbGVjdCYmKGUuc2VsZWN0aW9uQWZ0ZXI/dGhpcy5zZWxlY3Rpb24uZnJvbUpTT04oZS5zZWxlY3Rpb25BZnRlcik6dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UodGhpcy4kZ2V0VW5kb1NlbGVjdGlvbihlLCExKSkpLHRoaXMuJGZyb21VbmRvPSExfSx0aGlzLnNldFVuZG9TZWxlY3Q9ZnVuY3Rpb24oZSl7dGhpcy4kdW5kb1NlbGVjdD1lfSx0aGlzLiRnZXRVbmRvU2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXtyZXR1cm4gdD9lLmFjdGlvbiE9PSJpbnNlcnQiOmUuYWN0aW9uPT09Imluc2VydCJ9dmFyIHIsaSxzO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt2YXIgdT1lW29dO2lmKCF1LnN0YXJ0KWNvbnRpbnVlO2lmKCFyKXtuKHUpPyhyPWwuZnJvbVBvaW50cyh1LnN0YXJ0LHUuZW5kKSxzPSEwKToocj1sLmZyb21Qb2ludHModS5zdGFydCx1LnN0YXJ0KSxzPSExKTtjb250aW51ZX1uKHUpPyhpPXUuc3RhcnQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09LTEmJnIuc2V0U3RhcnQoaSksaT11LmVuZCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0xJiZyLnNldEVuZChpKSxzPSEwKTooaT11LnN0YXJ0LHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PS0xJiYocj1sLmZyb21Qb2ludHModS5zdGFydCx1LnN0YXJ0KSkscz0hMSl9cmV0dXJuIHJ9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5yZXBsYWNlKGUsdCl9LHRoaXMubW92ZVRleHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuZ2V0VGV4dFJhbmdlKGUpLGk9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSkscz1sLmZyb21Qb2ludHModCx0KTtpZighbil7dGhpcy5yZW1vdmUoZSk7dmFyIG89ZS5zdGFydC5yb3ctZS5lbmQucm93LHU9bz8tZS5lbmQuY29sdW1uOmUuc3RhcnQuY29sdW1uLWUuZW5kLmNvbHVtbjt1JiYocy5zdGFydC5yb3c9PWUuZW5kLnJvdyYmcy5zdGFydC5jb2x1bW4+ZS5lbmQuY29sdW1uJiYocy5zdGFydC5jb2x1bW4rPXUpLHMuZW5kLnJvdz09ZS5lbmQucm93JiZzLmVuZC5jb2x1bW4+ZS5lbmQuY29sdW1uJiYocy5lbmQuY29sdW1uKz11KSksbyYmcy5zdGFydC5yb3c+PWUuZW5kLnJvdyYmKHMuc3RhcnQucm93Kz1vLHMuZW5kLnJvdys9byl9cy5lbmQ9dGhpcy5pbnNlcnQocy5zdGFydCxyKTtpZihpLmxlbmd0aCl7dmFyIGE9ZS5zdGFydCxmPXMuc3RhcnQsbz1mLnJvdy1hLnJvdyx1PWYuY29sdW1uLWEuY29sdW1uO3RoaXMuYWRkRm9sZHMoaS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5jbG9uZSgpLGUuc3RhcnQucm93PT1hLnJvdyYmKGUuc3RhcnQuY29sdW1uKz11KSxlLmVuZC5yb3c9PWEucm93JiYoZS5lbmQuY29sdW1uKz11KSxlLnN0YXJ0LnJvdys9byxlLmVuZC5yb3crPW8sZX0pKX1yZXR1cm4gc30sdGhpcy5pbmRlbnRSb3dzPWZ1bmN0aW9uKGUsdCxuKXtuPW4ucmVwbGFjZSgvXHQvZyx0aGlzLmdldFRhYlN0cmluZygpKTtmb3IodmFyIHI9ZTtyPD10O3IrKyl0aGlzLmRvYy5pbnNlcnRJbkxpbmUoe3JvdzpyLGNvbHVtbjowfSxuKX0sdGhpcy5vdXRkZW50Um93cz1mdW5jdGlvbihlKXt2YXIgdD1lLmNvbGxhcHNlUm93cygpLG49bmV3IGwoMCwwLDAsMCkscj10aGlzLmdldFRhYlNpemUoKTtmb3IodmFyIGk9dC5zdGFydC5yb3c7aTw9dC5lbmQucm93OysraSl7dmFyIHM9dGhpcy5nZXRMaW5lKGkpO24uc3RhcnQucm93PWksbi5lbmQucm93PWk7Zm9yKHZhciBvPTA7bzxyOysrbylpZihzLmNoYXJBdChvKSE9IiAiKWJyZWFrO288ciYmcy5jaGFyQXQobyk9PSIJIj8obi5zdGFydC5jb2x1bW49byxuLmVuZC5jb2x1bW49bysxKToobi5zdGFydC5jb2x1bW49MCxuLmVuZC5jb2x1bW49byksdGhpcy5yZW1vdmUobil9fSx0aGlzLiRtb3ZlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe2U9dGhpcy5nZXRSb3dGb2xkU3RhcnQoZSksdD10aGlzLmdldFJvd0ZvbGRFbmQodCk7aWYobjwwKXt2YXIgcj10aGlzLmdldFJvd0ZvbGRTdGFydChlK24pO2lmKHI8MClyZXR1cm4gMDt2YXIgaT1yLWV9ZWxzZSBpZihuPjApe3ZhciByPXRoaXMuZ2V0Um93Rm9sZEVuZCh0K24pO2lmKHI+dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSlyZXR1cm4gMDt2YXIgaT1yLXR9ZWxzZXtlPXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KGUpLHQ9dGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQodCk7dmFyIGk9dC1lKzF9dmFyIHM9bmV3IGwoZSwwLHQsTnVtYmVyLk1BWF9WQUxVRSksbz10aGlzLmdldEZvbGRzSW5SYW5nZShzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5jbG9uZSgpLGUuc3RhcnQucm93Kz1pLGUuZW5kLnJvdys9aSxlfSksdT1uPT0wP3RoaXMuZG9jLmdldExpbmVzKGUsdCk6dGhpcy5kb2MucmVtb3ZlRnVsbExpbmVzKGUsdCk7cmV0dXJuIHRoaXMuZG9jLmluc2VydEZ1bGxMaW5lcyhlK2ksdSksby5sZW5ndGgmJnRoaXMuYWRkRm9sZHMobyksaX0sdGhpcy5tb3ZlTGluZXNVcD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LC0xKX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsMSl9LHRoaXMuZHVwbGljYXRlTGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwwKX0sdGhpcy4kY2xpcFJvd1RvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oZSx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xKSl9LHRoaXMuJGNsaXBDb2x1bW5Ub1Jvdz1mdW5jdGlvbihlLHQpe3JldHVybiB0PDA/MDpNYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aCx0KX0sdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudD1mdW5jdGlvbihlLHQpe3Q9TWF0aC5tYXgoMCx0KTtpZihlPDApZT0wLHQ9MDtlbHNle3ZhciBuPXRoaXMuZG9jLmdldExlbmd0aCgpO2U+PW4/KGU9bi0xLHQ9dGhpcy5kb2MuZ2V0TGluZShuLTEpLmxlbmd0aCk6dD1NYXRoLm1pbih0aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aCx0KX1yZXR1cm57cm93OmUsY29sdW1uOnR9fSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe2Uuc3RhcnQucm93PDA/KGUuc3RhcnQucm93PTAsZS5zdGFydC5jb2x1bW49MCk6ZS5zdGFydC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGUuc3RhcnQucm93LGUuc3RhcnQuY29sdW1uKTt2YXIgdD10aGlzLmRvYy5nZXRMZW5ndGgoKS0xO3JldHVybiBlLmVuZC5yb3c+dD8oZS5lbmQucm93PXQsZS5lbmQuY29sdW1uPXRoaXMuZG9jLmdldExpbmUodCkubGVuZ3RoKTplLmVuZC5jb2x1bW49dGhpcy4kY2xpcENvbHVtblRvUm93KGUuZW5kLnJvdyxlLmVuZC5jb2x1bW4pLGV9LHRoaXMuJHdyYXBMaW1pdD04MCx0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLiR3cmFwTGltaXRSYW5nZT17bWluOm51bGwsbWF4Om51bGx9LHRoaXMuc2V0VXNlV3JhcE1vZGU9ZnVuY3Rpb24oZSl7aWYoZSE9dGhpcy4kdXNlV3JhcE1vZGUpe3RoaXMuJHVzZVdyYXBNb2RlPWUsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcmVzZXRSb3dDYWNoZSgwKTtpZihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpO3RoaXMuJHdyYXBEYXRhPUFycmF5KHQpLHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsdC0xKX10aGlzLl9zaWduYWwoImNoYW5nZVdyYXBNb2RlIil9fSx0aGlzLmdldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVdyYXBNb2RlfSx0aGlzLnNldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy4kd3JhcExpbWl0UmFuZ2UubWluIT09ZXx8dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4IT09dCl0aGlzLiR3cmFwTGltaXRSYW5nZT17bWluOmUsbWF4OnR9LHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJGJpZGlIYW5kbGVyLm1hcmtBc0RpcnR5KCksdGhpcy4kdXNlV3JhcE1vZGUmJnRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcE1vZGUiKX0sdGhpcy5hZGp1c3RXcmFwTGltaXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiR3cmFwTGltaXRSYW5nZTtuLm1heDwwJiYobj17bWluOnQsbWF4OnR9KTt2YXIgcj10aGlzLiRjb25zdHJhaW5XcmFwTGltaXQoZSxuLm1pbixuLm1heCk7cmV0dXJuIHIhPXRoaXMuJHdyYXBMaW1pdCYmcj4xPyh0aGlzLiR3cmFwTGltaXQ9cix0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVwZGF0ZVdyYXBEYXRhKDAsdGhpcy5nZXRMZW5ndGgoKS0xKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuX3NpZ25hbCgiY2hhbmdlV3JhcExpbWl0IikpLCEwKTohMX0sdGhpcy4kY29uc3RyYWluV3JhcExpbWl0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdCYmKGU9TWF0aC5tYXgodCxlKSksbiYmKGU9TWF0aC5taW4obixlKSksZX0sdGhpcy5nZXRXcmFwTGltaXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kd3JhcExpbWl0fSx0aGlzLnNldFdyYXBMaW1pdD1mdW5jdGlvbihlKXt0aGlzLnNldFdyYXBMaW1pdFJhbmdlKGUsZSl9LHRoaXMuZ2V0V3JhcExpbWl0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm57bWluOnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbixtYXg6dGhpcy4kd3JhcExpbWl0UmFuZ2UubWF4fX0sdGhpcy4kdXBkYXRlSW50ZXJuYWxEYXRhT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kdXNlV3JhcE1vZGUsbj1lLmFjdGlvbixyPWUuc3RhcnQsaT1lLmVuZCxzPXIucm93LG89aS5yb3csdT1vLXMsYT1udWxsO3RoaXMuJHVwZGF0aW5nPSEwO2lmKHUhPTApaWYobj09PSJyZW1vdmUiKXt0aGlzW3Q/IiR3cmFwRGF0YSI6IiRyb3dMZW5ndGhDYWNoZSJdLnNwbGljZShzLHUpO3ZhciBmPXRoaXMuJGZvbGREYXRhO2E9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSksdGhpcy5yZW1vdmVGb2xkcyhhKTt2YXIgbD10aGlzLmdldEZvbGRMaW5lKGkucm93KSxjPTA7aWYobCl7bC5hZGRSZW1vdmVDaGFycyhpLnJvdyxpLmNvbHVtbixyLmNvbHVtbi1pLmNvbHVtbiksbC5zaGlmdFJvdygtdSk7dmFyIGg9dGhpcy5nZXRGb2xkTGluZShzKTtoJiZoIT09bCYmKGgubWVyZ2UobCksbD1oKSxjPWYuaW5kZXhPZihsKSsxfWZvcihjO2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2wuc3RhcnQucm93Pj1pLnJvdyYmbC5zaGlmdFJvdygtdSl9bz1zfWVsc2V7dmFyIHA9QXJyYXkodSk7cC51bnNoaWZ0KHMsMCk7dmFyIGQ9dD90aGlzLiR3cmFwRGF0YTp0aGlzLiRyb3dMZW5ndGhDYWNoZTtkLnNwbGljZS5hcHBseShkLHApO3ZhciBmPXRoaXMuJGZvbGREYXRhLGw9dGhpcy5nZXRGb2xkTGluZShzKSxjPTA7aWYobCl7dmFyIHY9bC5yYW5nZS5jb21wYXJlSW5zaWRlKHIucm93LHIuY29sdW1uKTt2PT0wPyhsPWwuc3BsaXQoci5yb3csci5jb2x1bW4pLGwmJihsLnNoaWZ0Um93KHUpLGwuYWRkUmVtb3ZlQ2hhcnMobywwLGkuY29sdW1uLXIuY29sdW1uKSkpOnY9PS0xJiYobC5hZGRSZW1vdmVDaGFycyhzLDAsaS5jb2x1bW4tci5jb2x1bW4pLGwuc2hpZnRSb3codSkpLGM9Zi5pbmRleE9mKGwpKzF9Zm9yKGM7YzxmLmxlbmd0aDtjKyspe3ZhciBsPWZbY107bC5zdGFydC5yb3c+PXMmJmwuc2hpZnRSb3codSl9fWVsc2V7dT1NYXRoLmFicyhlLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW4pLG49PT0icmVtb3ZlIiYmKGE9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSksdGhpcy5yZW1vdmVGb2xkcyhhKSx1PS11KTt2YXIgbD10aGlzLmdldEZvbGRMaW5lKHMpO2wmJmwuYWRkUmVtb3ZlQ2hhcnMocyxyLmNvbHVtbix1KX1yZXR1cm4gdCYmdGhpcy4kd3JhcERhdGEubGVuZ3RoIT10aGlzLmRvYy5nZXRMZW5ndGgoKSYmY29uc29sZS5lcnJvcigiZG9jLmdldExlbmd0aCgpIGFuZCAkd3JhcERhdGEubGVuZ3RoIGhhdmUgdG8gYmUgdGhlIHNhbWUhIiksdGhpcy4kdXBkYXRpbmc9ITEsdD90aGlzLiR1cGRhdGVXcmFwRGF0YShzLG8pOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKHMsbyksYX0sdGhpcy4kdXBkYXRlUm93TGVuZ3RoQ2FjaGU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJHJvd0xlbmd0aENhY2hlW2VdPW51bGwsdGhpcy4kcm93TGVuZ3RoQ2FjaGVbdF09bnVsbH0sdGhpcy4kdXBkYXRlV3JhcERhdGE9ZnVuY3Rpb24oZSx0KXt2YXIgcj10aGlzLmRvYy5nZXRBbGxMaW5lcygpLGk9dGhpcy5nZXRUYWJTaXplKCksbz10aGlzLiR3cmFwRGF0YSx1PXRoaXMuJHdyYXBMaW1pdCxhLGYsbD1lO3Q9TWF0aC5taW4odCxyLmxlbmd0aC0xKTt3aGlsZShsPD10KWY9dGhpcy5nZXRGb2xkTGluZShsLGYpLGY/KGE9W10sZi53YWxrKGZ1bmN0aW9uKGUsdCxpLG8pe3ZhciB1O2lmKGUhPW51bGwpe3U9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhlLGEubGVuZ3RoKSx1WzBdPW47Zm9yKHZhciBmPTE7Zjx1Lmxlbmd0aDtmKyspdVtmXT1zfWVsc2UgdT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKHJbdF0uc3Vic3RyaW5nKG8saSksYS5sZW5ndGgpO2E9YS5jb25jYXQodSl9LmJpbmQodGhpcyksZi5lbmQucm93LHJbZi5lbmQucm93XS5sZW5ndGgrMSksb1tmLnN0YXJ0LnJvd109dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoYSx1LGkpLGw9Zi5lbmQucm93KzEpOihhPXRoaXMuJGdldERpc3BsYXlUb2tlbnMocltsXSksb1tsXT10aGlzLiRjb21wdXRlV3JhcFNwbGl0cyhhLHUsaSksbCsrKX07dmFyIGU9MSx0PTIsbj0zLHM9NCxhPTksYz0xMCxkPTExLHY9MTI7dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHM9ZnVuY3Rpb24oZSxyLGkpe2Z1bmN0aW9uIGcoKXt2YXIgdD0wO2lmKG09PT0wKXJldHVybiB0O2lmKHApZm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07aWYocj09Yyl0Kz0xO2Vsc2V7aWYociE9ZCl7aWYocj09diljb250aW51ZTticmVha310Kz1pfX1yZXR1cm4gaCYmcCE9PSExJiYodCs9aSksTWF0aC5taW4odCxtKX1mdW5jdGlvbiB5KHQpe3ZhciBuPXQtZjtmb3IodmFyIHI9ZjtyPHQ7cisrKXt2YXIgaT1lW3JdO2lmKGk9PT0xMnx8aT09PTIpbi09MX1vLmxlbmd0aHx8KGI9ZygpLG8uaW5kZW50PWIpLGwrPW4sby5wdXNoKGwpLGY9dH1pZihlLmxlbmd0aD09MClyZXR1cm5bXTt2YXIgbz1bXSx1PWUubGVuZ3RoLGY9MCxsPTAsaD10aGlzLiR3cmFwQXNDb2RlLHA9dGhpcy4kaW5kZW50ZWRTb2Z0V3JhcCxtPXI8PU1hdGgubWF4KDIqaSw4KXx8cD09PSExPzA6TWF0aC5mbG9vcihyLzIpLGI9MDt3aGlsZSh1LWY+ci1iKXt2YXIgdz1mK3ItYjtpZihlW3ctMV0+PWMmJmVbd10+PWMpe3kodyk7Y29udGludWV9aWYoZVt3XT09bnx8ZVt3XT09cyl7Zm9yKHc7dyE9Zi0xO3ctLSlpZihlW3ddPT1uKWJyZWFrO2lmKHc+Zil7eSh3KTtjb250aW51ZX13PWYrcjtmb3Iodzt3PGUubGVuZ3RoO3crKylpZihlW3ddIT1zKWJyZWFrO2lmKHc9PWUubGVuZ3RoKWJyZWFrO3kodyk7Y29udGludWV9dmFyIEU9TWF0aC5tYXgody0oci0ocj4+MikpLGYtMSk7d2hpbGUodz5FJiZlW3ddPG4pdy0tO2lmKGgpe3doaWxlKHc+RSYmZVt3XTxuKXctLTt3aGlsZSh3PkUmJmVbd109PWEpdy0tfWVsc2Ugd2hpbGUodz5FJiZlW3ddPGMpdy0tO2lmKHc+RSl7eSgrK3cpO2NvbnRpbnVlfXc9ZityLGVbd109PXQmJnctLSx5KHctYil9cmV0dXJuIG99LHRoaXMuJGdldERpc3BsYXlUb2tlbnM9ZnVuY3Rpb24obixyKXt2YXIgaT1bXSxzO3I9cnx8MDtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7dmFyIHU9bi5jaGFyQ29kZUF0KG8pO2lmKHU9PTkpe3M9dGhpcy5nZXRTY3JlZW5UYWJTaXplKGkubGVuZ3RoK3IpLGkucHVzaChkKTtmb3IodmFyIGY9MTtmPHM7ZisrKWkucHVzaCh2KX1lbHNlIHU9PTMyP2kucHVzaChjKTp1PjM5JiZ1PDQ4fHx1PjU3JiZ1PDY0P2kucHVzaChhKTp1Pj00MzUyJiZtKHUpP2kucHVzaChlLHQpOmkucHVzaChlKX1yZXR1cm4gaX0sdGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGg9ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PTApcmV0dXJuWzAsMF07dD09bnVsbCYmKHQ9SW5maW5pdHkpLG49bnx8MDt2YXIgcixpO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspe3I9ZS5jaGFyQ29kZUF0KGkpLHI9PTk/bis9dGhpcy5nZXRTY3JlZW5UYWJTaXplKG4pOnI+PTQzNTImJm0ocik/bis9MjpuKz0xO2lmKG4+dClicmVha31yZXR1cm5bbixpXX0sdGhpcy5saW5lV2lkZ2V0cz1udWxsLHRoaXMuZ2V0Um93TGVuZ3RoPWZ1bmN0aW9uKGUpe2lmKHRoaXMubGluZVdpZGdldHMpdmFyIHQ9dGhpcy5saW5lV2lkZ2V0c1tlXSYmdGhpcy5saW5lV2lkZ2V0c1tlXS5yb3dDb3VudHx8MDtlbHNlIHQ9MDtyZXR1cm4hdGhpcy4kdXNlV3JhcE1vZGV8fCF0aGlzLiR3cmFwRGF0YVtlXT8xK3Q6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzErdH0sdGhpcy5nZXRSb3dMaW5lQ291bnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MTp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMX0sdGhpcy5nZXRSb3dXcmFwSW5kZW50PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgdD10aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLE51bWJlci5NQVhfVkFMVUUpLG49dGhpcy4kd3JhcERhdGFbdC5yb3ddO3JldHVybiBuLmxlbmd0aCYmblswXTx0LmNvbHVtbj9uLmluZGVudDowfXJldHVybiAwfSx0aGlzLmdldFNjcmVlbkxhc3RSb3dDb2x1bW49ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSxOdW1iZXIuTUFYX1ZBTFVFKTtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKHQucm93LHQuY29sdW1uKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW49ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3coZSx0KTtyZXR1cm4gdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKG4pfSx0aGlzLmdldERvY3VtZW50TGFzdFJvd0NvbHVtblBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCk7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4sTnVtYmVyLk1BWF9WQUxVRS8xMCl9LHRoaXMuZ2V0Um93U3BsaXREYXRhPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR3cmFwRGF0YVtlXTp1bmRlZmluZWR9LHRoaXMuZ2V0U2NyZWVuVGFiU2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdGFiU2l6ZS0oZSV0aGlzLiR0YWJTaXplfDApfSx0aGlzLnNjcmVlblRvRG9jdW1lbnRSb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KS5yb3d9LHRoaXMuc2NyZWVuVG9Eb2N1bWVudENvbHVtbj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLHQpLmNvbHVtbn0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb249ZnVuY3Rpb24oZSx0LG4pe2lmKGU8MClyZXR1cm57cm93OjAsY29sdW1uOjB9O3ZhciByLGk9MCxzPTAsbyx1PTAsYT0wLGY9dGhpcy4kc2NyZWVuUm93Q2FjaGUsbD10aGlzLiRnZXRSb3dDYWNoZUluZGV4KGYsZSksYz1mLmxlbmd0aDtpZihjJiZsPj0wKXZhciB1PWZbbF0saT10aGlzLiRkb2NSb3dDYWNoZVtsXSxoPWU+ZltjLTFdO2Vsc2UgdmFyIGg9IWM7dmFyIHA9dGhpcy5nZXRMZW5ndGgoKS0xLGQ9dGhpcy5nZXROZXh0Rm9sZExpbmUoaSksdj1kP2Quc3RhcnQucm93OkluZmluaXR5O3doaWxlKHU8PWUpe2E9dGhpcy5nZXRSb3dMZW5ndGgoaSk7aWYodSthPmV8fGk+PXApYnJlYWs7dSs9YSxpKyssaT52JiYoaT1kLmVuZC5yb3crMSxkPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGksZCksdj1kP2Quc3RhcnQucm93OkluZmluaXR5KSxoJiYodGhpcy4kZG9jUm93Q2FjaGUucHVzaChpKSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5wdXNoKHUpKX1pZihkJiZkLnN0YXJ0LnJvdzw9aSlyPXRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGQpLGk9ZC5zdGFydC5yb3c7ZWxzZXtpZih1K2E8PWV8fGk+cClyZXR1cm57cm93OnAsY29sdW1uOnRoaXMuZ2V0TGluZShwKS5sZW5ndGh9O3I9dGhpcy5nZXRMaW5lKGkpLGQ9bnVsbH12YXIgbT0wLGc9TWF0aC5mbG9vcihlLXUpO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgeT10aGlzLiR3cmFwRGF0YVtpXTt5JiYobz15W2ddLGc+MCYmeS5sZW5ndGgmJihtPXkuaW5kZW50LHM9eVtnLTFdfHx5W3kubGVuZ3RoLTFdLHI9ci5zdWJzdHJpbmcocykpKX1yZXR1cm4gbiE9PXVuZGVmaW5lZCYmdGhpcy4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHUrZyxpLGcpJiYodD10aGlzLiRiaWRpSGFuZGxlci5vZmZzZXRUb0NvbChuKSkscys9dGhpcy4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgocix0LW0pWzFdLHRoaXMuJHVzZVdyYXBNb2RlJiZzPj1vJiYocz1vLTEpLGQ/ZC5pZHhUb1Bvc2l0aW9uKHMpOntyb3c6aSxjb2x1bW46c319LHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQ9PSJ1bmRlZmluZWQiKXZhciBuPXRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQoZS5yb3csZS5jb2x1bW4pO2Vsc2Ugbj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUsdCk7ZT1uLnJvdyx0PW4uY29sdW1uO3ZhciByPTAsaT1udWxsLHM9bnVsbDtzPXRoaXMuZ2V0Rm9sZEF0KGUsdCwxKSxzJiYoZT1zLnN0YXJ0LnJvdyx0PXMuc3RhcnQuY29sdW1uKTt2YXIgbyx1PTAsYT10aGlzLiRkb2NSb3dDYWNoZSxmPXRoaXMuJGdldFJvd0NhY2hlSW5kZXgoYSxlKSxsPWEubGVuZ3RoO2lmKGwmJmY+PTApdmFyIHU9YVtmXSxyPXRoaXMuJHNjcmVlblJvd0NhY2hlW2ZdLGM9ZT5hW2wtMV07ZWxzZSB2YXIgYz0hbDt2YXIgaD10aGlzLmdldE5leHRGb2xkTGluZSh1KSxwPWg/aC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUodTxlKXtpZih1Pj1wKXtvPWguZW5kLnJvdysxO2lmKG8+ZSlicmVhaztoPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKG8saCkscD1oP2guc3RhcnQucm93OkluZmluaXR5fWVsc2Ugbz11KzE7cis9dGhpcy5nZXRSb3dMZW5ndGgodSksdT1vLGMmJih0aGlzLiRkb2NSb3dDYWNoZS5wdXNoKHUpLHRoaXMuJHNjcmVlblJvd0NhY2hlLnB1c2gocikpfXZhciBkPSIiO2gmJnU+PXA/KGQ9dGhpcy5nZXRGb2xkRGlzcGxheUxpbmUoaCxlLHQpLGk9aC5zdGFydC5yb3cpOihkPXRoaXMuZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KSxpPWUpO3ZhciB2PTA7aWYodGhpcy4kdXNlV3JhcE1vZGUpe3ZhciBtPXRoaXMuJHdyYXBEYXRhW2ldO2lmKG0pe3ZhciBnPTA7d2hpbGUoZC5sZW5ndGg+PW1bZ10pcisrLGcrKztkPWQuc3Vic3RyaW5nKG1bZy0xXXx8MCxkLmxlbmd0aCksdj1nPjA/bS5pbmRlbnQ6MH19cmV0dXJue3JvdzpyLGNvbHVtbjp2K3RoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKGQpWzBdfX0sdGhpcy5kb2N1bWVudFRvU2NyZWVuQ29sdW1uPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCkuY29sdW1ufSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Sb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24oZSx0KS5yb3d9LHRoaXMuZ2V0U2NyZWVuTGVuZ3RoPWZ1bmN0aW9uKCl7dmFyIGU9MCx0PW51bGw7aWYoIXRoaXMuJHVzZVdyYXBNb2RlKXtlPXRoaXMuZ2V0TGVuZ3RoKCk7dmFyIG49dGhpcy4kZm9sZERhdGE7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspdD1uW3JdLGUtPXQuZW5kLnJvdy10LnN0YXJ0LnJvd31lbHNle3ZhciBpPXRoaXMuJHdyYXBEYXRhLmxlbmd0aCxzPTAscj0wLHQ9dGhpcy4kZm9sZERhdGFbcisrXSxvPXQ/dC5zdGFydC5yb3c6SW5maW5pdHk7d2hpbGUoczxpKXt2YXIgdT10aGlzLiR3cmFwRGF0YVtzXTtlKz11P3UubGVuZ3RoKzE6MSxzKysscz5vJiYocz10LmVuZC5yb3crMSx0PXRoaXMuJGZvbGREYXRhW3IrK10sbz10P3Quc3RhcnQucm93OkluZmluaXR5KX19cmV0dXJuIHRoaXMubGluZVdpZGdldHMmJihlKz10aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGgoKSksZX0sdGhpcy4kc2V0Rm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGVuYWJsZVZhckNoYXIpcmV0dXJuO3RoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoPWZ1bmN0aW9uKHQsbixyKXtpZihuPT09MClyZXR1cm5bMCwwXTtufHwobj1JbmZpbml0eSkscj1yfHwwO3ZhciBpLHM7Zm9yKHM9MDtzPHQubGVuZ3RoO3MrKyl7aT10LmNoYXJBdChzKSxpPT09IgkiP3IrPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShyKTpyKz1lLmdldENoYXJhY3RlcldpZHRoKGkpO2lmKHI+bilicmVha31yZXR1cm5bcixzXX19LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYmdUb2tlbml6ZXImJih0aGlzLmJnVG9rZW5pemVyLnNldERvY3VtZW50KG51bGwpLHRoaXMuYmdUb2tlbml6ZXI9bnVsbCksdGhpcy4kc3RvcFdvcmtlcigpfSx0aGlzLmlzRnVsbFdpZHRoPW19LmNhbGwoZC5wcm90b3R5cGUpLGUoIi4vZWRpdF9zZXNzaW9uL2ZvbGRpbmciKS5Gb2xkaW5nLmNhbGwoZC5wcm90b3R5cGUpLGUoIi4vZWRpdF9zZXNzaW9uL2JyYWNrZXRfbWF0Y2giKS5CcmFja2V0TWF0Y2guY2FsbChkLnByb3RvdHlwZSksby5kZWZpbmVPcHRpb25zKGQucHJvdG90eXBlLCJzZXNzaW9uIix7d3JhcDp7c2V0OmZ1bmN0aW9uKGUpeyFlfHxlPT0ib2ZmIj9lPSExOmU9PSJmcmVlIj9lPSEwOmU9PSJwcmludE1hcmdpbiI/ZT0tMTp0eXBlb2YgZT09InN0cmluZyImJihlPXBhcnNlSW50KGUsMTApfHwhMSk7aWYodGhpcy4kd3JhcD09ZSlyZXR1cm47dGhpcy4kd3JhcD1lO2lmKCFlKXRoaXMuc2V0VXNlV3JhcE1vZGUoITEpO2Vsc2V7dmFyIHQ9dHlwZW9mIGU9PSJudW1iZXIiP2U6bnVsbDt0aGlzLnNldFdyYXBMaW1pdFJhbmdlKHQsdCksdGhpcy5zZXRVc2VXcmFwTW9kZSghMCl9fSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRVc2VXcmFwTW9kZSgpP3RoaXMuJHdyYXA9PS0xPyJwcmludE1hcmdpbiI6dGhpcy5nZXRXcmFwTGltaXRSYW5nZSgpLm1pbj90aGlzLiR3cmFwOiJmcmVlIjoib2ZmIn0saGFuZGxlc1NldDohMH0sd3JhcE1ldGhvZDp7c2V0OmZ1bmN0aW9uKGUpe2U9ZT09ImF1dG8iP3RoaXMuJG1vZGUudHlwZSE9InRleHQiOmUhPSJ0ZXh0IixlIT10aGlzLiR3cmFwQXNDb2RlJiYodGhpcy4kd3JhcEFzQ29kZT1lLHRoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy5zZXRVc2VXcmFwTW9kZSghMCkpKX0saW5pdGlhbFZhbHVlOiJhdXRvIn0saW5kZW50ZWRTb2Z0V3JhcDp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1c2VXcmFwTW9kZT0hMSx0aGlzLnNldFVzZVdyYXBNb2RlKCEwKSl9LGluaXRpYWxWYWx1ZTohMH0sZmlyc3RMaW5lTnVtYmVyOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiKX0saW5pdGlhbFZhbHVlOjF9LHVzZVdvcmtlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHVzZVdvcmtlcj1lLHRoaXMuJHN0b3BXb3JrZXIoKSxlJiZ0aGlzLiRzdGFydFdvcmtlcigpfSxpbml0aWFsVmFsdWU6ITB9LHVzZVNvZnRUYWJzOntpbml0aWFsVmFsdWU6ITB9LHRhYlNpemU6e3NldDpmdW5jdGlvbihlKXtlPXBhcnNlSW50KGUpLGU+MCYmdGhpcy4kdGFiU2l6ZSE9PWUmJih0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRyb3dMZW5ndGhDYWNoZT1bXSx0aGlzLiR0YWJTaXplPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VUYWJTaXplIikpfSxpbml0aWFsVmFsdWU6NCxoYW5kbGVzU2V0OiEwfSxuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzOntpbml0aWFsVmFsdWU6ITF9LGZvbGRTdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0Rm9sZFN0eWxlKGUpfSxoYW5kbGVzU2V0OiEwfSxvdmVyd3JpdGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLl9zaWduYWwoImNoYW5nZU92ZXJ3cml0ZSIpfSxpbml0aWFsVmFsdWU6ITF9LG5ld0xpbmVNb2RlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5kb2Muc2V0TmV3TGluZU1vZGUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpfSxoYW5kbGVzU2V0OiEwfSxtb2RlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRNb2RlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZUlkfSxoYW5kbGVzU2V0OiEwfX0pLHQuRWRpdFNlc3Npb249ZH0pLGFjZS5kZWZpbmUoImFjZS9zZWFyY2giLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuL1x3Ly50ZXN0KGUpfHx0LnJlZ0V4cD8iXFxiIjoiIn1yZXR1cm4gbihlWzBdKStlK24oZVtlLmxlbmd0aC0xXSl9dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1mdW5jdGlvbigpe3RoaXMuJG9wdGlvbnM9e319OyhmdW5jdGlvbigpe3RoaXMuc2V0PWZ1bmN0aW9uKGUpe3JldHVybiBpLm1peGluKHRoaXMuJG9wdGlvbnMsZSksdGhpc30sdGhpcy5nZXRPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHIuY29weU9iamVjdCh0aGlzLiRvcHRpb25zKX0sdGhpcy5zZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJG9wdGlvbnM9ZX0sdGhpcy5maW5kPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJG9wdGlvbnMsbj10aGlzLiRtYXRjaEl0ZXJhdG9yKGUsdCk7aWYoIW4pcmV0dXJuITE7dmFyIHI9bnVsbDtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKGUsbixpLG8pe3JldHVybiByPW5ldyBzKGUsbixpLG8pLG49PW8mJnQuc3RhcnQmJnQuc3RhcnQuc3RhcnQmJnQuc2tpcEN1cnJlbnQhPTAmJnIuaXNFcXVhbCh0LnN0YXJ0KT8ocj1udWxsLCExKTohMH0pLHJ9LHRoaXMuZmluZEFsbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zO2lmKCF0Lm5lZWRsZSlyZXR1cm5bXTt0aGlzLiRhc3NlbWJsZVJlZ0V4cCh0KTt2YXIgbj10LnJhbmdlLGk9bj9lLmdldExpbmVzKG4uc3RhcnQucm93LG4uZW5kLnJvdyk6ZS5kb2MuZ2V0QWxsTGluZXMoKSxvPVtdLHU9dC5yZTtpZih0LiRpc011bHRpTGluZSl7dmFyIGE9dS5sZW5ndGgsZj1pLmxlbmd0aC1hLGw7ZTpmb3IodmFyIGM9dS5vZmZzZXR8fDA7Yzw9ZjtjKyspe2Zvcih2YXIgaD0wO2g8YTtoKyspaWYoaVtjK2hdLnNlYXJjaCh1W2hdKT09LTEpY29udGludWUgZTt2YXIgcD1pW2NdLGQ9aVtjK2EtMV0sdj1wLmxlbmd0aC1wLm1hdGNoKHVbMF0pWzBdLmxlbmd0aCxtPWQubWF0Y2godVthLTFdKVswXS5sZW5ndGg7aWYobCYmbC5lbmQucm93PT09YyYmbC5lbmQuY29sdW1uPnYpY29udGludWU7by5wdXNoKGw9bmV3IHMoYyx2LGMrYS0xLG0pKSxhPjImJihjPWMrYS0yKX19ZWxzZSBmb3IodmFyIGc9MDtnPGkubGVuZ3RoO2crKyl7dmFyIHk9ci5nZXRNYXRjaE9mZnNldHMoaVtnXSx1KTtmb3IodmFyIGg9MDtoPHkubGVuZ3RoO2grKyl7dmFyIGI9eVtoXTtvLnB1c2gobmV3IHMoZyxiLm9mZnNldCxnLGIub2Zmc2V0K2IubGVuZ3RoKSl9fWlmKG4pe3ZhciB3PW4uc3RhcnQuY29sdW1uLEU9bi5zdGFydC5jb2x1bW4sZz0wLGg9by5sZW5ndGgtMTt3aGlsZShnPGgmJm9bZ10uc3RhcnQuY29sdW1uPHcmJm9bZ10uc3RhcnQucm93PT1uLnN0YXJ0LnJvdylnKys7d2hpbGUoZzxoJiZvW2hdLmVuZC5jb2x1bW4+RSYmb1toXS5lbmQucm93PT1uLmVuZC5yb3cpaC0tO289by5zbGljZShnLGgrMSk7Zm9yKGc9MCxoPW8ubGVuZ3RoO2c8aDtnKyspb1tnXS5zdGFydC5yb3crPW4uc3RhcnQucm93LG9bZ10uZW5kLnJvdys9bi5zdGFydC5yb3d9cmV0dXJuIG99LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJG9wdGlvbnMscj10aGlzLiRhc3NlbWJsZVJlZ0V4cChuKTtpZihuLiRpc011bHRpTGluZSlyZXR1cm4gdDtpZighcilyZXR1cm47dmFyIGk9ci5leGVjKGUpO2lmKCFpfHxpWzBdLmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7dD1lLnJlcGxhY2Uocix0KTtpZihuLnByZXNlcnZlQ2FzZSl7dD10LnNwbGl0KCIiKTtmb3IodmFyIHM9TWF0aC5taW4oZS5sZW5ndGgsZS5sZW5ndGgpO3MtLTspe3ZhciBvPWVbc107byYmby50b0xvd2VyQ2FzZSgpIT1vP3Rbc109dFtzXS50b1VwcGVyQ2FzZSgpOnRbc109dFtzXS50b0xvd2VyQ2FzZSgpfXQ9dC5qb2luKCIiKX1yZXR1cm4gdH0sdGhpcy4kYXNzZW1ibGVSZWdFeHA9ZnVuY3Rpb24oZSx0KXtpZihlLm5lZWRsZSBpbnN0YW5jZW9mIFJlZ0V4cClyZXR1cm4gZS5yZT1lLm5lZWRsZTt2YXIgbj1lLm5lZWRsZTtpZighZS5uZWVkbGUpcmV0dXJuIGUucmU9ITE7ZS5yZWdFeHB8fChuPXIuZXNjYXBlUmVnRXhwKG4pKSxlLndob2xlV29yZCYmKG49dShuLGUpKTt2YXIgaT1lLmNhc2VTZW5zaXRpdmU/ImdtIjoiZ21pIjtlLiRpc011bHRpTGluZT0hdCYmL1tcblxyXS8udGVzdChuKTtpZihlLiRpc011bHRpTGluZSlyZXR1cm4gZS5yZT10aGlzLiRhc3NlbWJsZU11bHRpbGluZVJlZ0V4cChuLGkpO3RyeXt2YXIgcz1uZXcgUmVnRXhwKG4saSl9Y2F0Y2gobyl7cz0hMX1yZXR1cm4gZS5yZT1zfSx0aGlzLiRhc3NlbWJsZU11bHRpbGluZVJlZ0V4cD1mdW5jdGlvbihlLHQpe3ZhciBuPWUucmVwbGFjZSgvXHJcbnxccnxcbi9nLCIkXG5eIikuc3BsaXQoIlxuIikscj1bXTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl0cnl7ci5wdXNoKG5ldyBSZWdFeHAobltpXSx0KSl9Y2F0Y2gocyl7cmV0dXJuITF9cmV0dXJuIHJ9LHRoaXMuJG1hdGNoSXRlcmF0b3I9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRhc3NlbWJsZVJlZ0V4cCh0KTtpZighbilyZXR1cm4hMTt2YXIgcj10LmJhY2t3YXJkcz09MSxpPXQuc2tpcEN1cnJlbnQhPTAscz10LnJhbmdlLG89dC5zdGFydDtvfHwobz1zP3Nbcj8iZW5kIjoic3RhcnQiXTplLnNlbGVjdGlvbi5nZXRSYW5nZSgpKSxvLnN0YXJ0JiYobz1vW2khPXI/ImVuZCI6InN0YXJ0Il0pO3ZhciB1PXM/cy5zdGFydC5yb3c6MCxhPXM/cy5lbmQucm93OmUuZ2V0TGVuZ3RoKCktMTtpZihyKXZhciBmPWZ1bmN0aW9uKGUpe3ZhciBuPW8ucm93O2lmKGMobixvLmNvbHVtbixlKSlyZXR1cm47Zm9yKG4tLTtuPj11O24tLSlpZihjKG4sTnVtYmVyLk1BWF9WQUxVRSxlKSlyZXR1cm47aWYodC53cmFwPT0wKXJldHVybjtmb3Iobj1hLHU9by5yb3c7bj49dTtuLS0paWYoYyhuLE51bWJlci5NQVhfVkFMVUUsZSkpcmV0dXJufTtlbHNlIHZhciBmPWZ1bmN0aW9uKGUpe3ZhciBuPW8ucm93O2lmKGMobixvLmNvbHVtbixlKSlyZXR1cm47Zm9yKG4rPTE7bjw9YTtuKyspaWYoYyhuLDAsZSkpcmV0dXJuO2lmKHQud3JhcD09MClyZXR1cm47Zm9yKG49dSxhPW8ucm93O248PWE7bisrKWlmKGMobiwwLGUpKXJldHVybn07aWYodC4kaXNNdWx0aUxpbmUpdmFyIGw9bi5sZW5ndGgsYz1mdW5jdGlvbih0LGkscyl7dmFyIG89cj90LWwrMTp0O2lmKG88MClyZXR1cm47dmFyIHU9ZS5nZXRMaW5lKG8pLGE9dS5zZWFyY2goblswXSk7aWYoIXImJmE8aXx8YT09PS0xKXJldHVybjtmb3IodmFyIGY9MTtmPGw7ZisrKXt1PWUuZ2V0TGluZShvK2YpO2lmKHUuc2VhcmNoKG5bZl0pPT0tMSlyZXR1cm59dmFyIGM9dS5tYXRjaChuW2wtMV0pWzBdLmxlbmd0aDtpZihyJiZjPmkpcmV0dXJuO2lmKHMobyxhLG8rbC0xLGMpKXJldHVybiEwfTtlbHNlIGlmKHIpdmFyIGM9ZnVuY3Rpb24odCxyLGkpe3ZhciBzPWUuZ2V0TGluZSh0KSxvPVtdLHUsYT0wO24ubGFzdEluZGV4PTA7d2hpbGUodT1uLmV4ZWMocykpe3ZhciBmPXVbMF0ubGVuZ3RoO2E9dS5pbmRleDtpZighZil7aWYoYT49cy5sZW5ndGgpYnJlYWs7bi5sYXN0SW5kZXg9YSs9MX1pZih1LmluZGV4K2Y+cilicmVhaztvLnB1c2godS5pbmRleCxmKX1mb3IodmFyIGw9by5sZW5ndGgtMTtsPj0wO2wtPTIpe3ZhciBjPW9bbC0xXSxmPW9bbF07aWYoaSh0LGMsdCxjK2YpKXJldHVybiEwfX07ZWxzZSB2YXIgYz1mdW5jdGlvbih0LHIsaSl7dmFyIHM9ZS5nZXRMaW5lKHQpLG8sdTtuLmxhc3RJbmRleD1yO3doaWxlKHU9bi5leGVjKHMpKXt2YXIgYT11WzBdLmxlbmd0aDtvPXUuaW5kZXg7aWYoaSh0LG8sdCxvK2EpKXJldHVybiEwO2lmKCFhKXtuLmxhc3RJbmRleD1vKz0xO2lmKG8+PXMubGVuZ3RoKXJldHVybiExfX19O3JldHVybntmb3JFYWNoOmZ9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuU2VhcmNoPW99KSxhY2UuZGVmaW5lKCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXt0aGlzLnBsYXRmb3JtPXR8fChpLmlzTWFjPyJtYWMiOiJ3aW4iKSx0aGlzLmNvbW1hbmRzPXt9LHRoaXMuY29tbWFuZEtleUJpbmRpbmc9e30sdGhpcy5hZGRDb21tYW5kcyhlKSx0aGlzLiRzaW5nbGVDb21tYW5kPSEwfWZ1bmN0aW9uIHUoZSx0KXtvLmNhbGwodGhpcyxlLHQpLHRoaXMuJHNpbmdsZUNvbW1hbmQ9ITF9dmFyIHI9ZSgiLi4vbGliL2tleXMiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKSxzPXIuS0VZX01PRFM7dS5wcm90b3R5cGU9by5wcm90b3R5cGUsZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUuYmluZEtleSYmZS5iaW5kS2V5LnBvc2l0aW9ufHwoZS5pc0RlZmF1bHQ/LTEwMDowKX10aGlzLmFkZENvbW1hbmQ9ZnVuY3Rpb24oZSl7dGhpcy5jb21tYW5kc1tlLm5hbWVdJiZ0aGlzLnJlbW92ZUNvbW1hbmQoZSksdGhpcy5jb21tYW5kc1tlLm5hbWVdPWUsZS5iaW5kS2V5JiZ0aGlzLl9idWlsZEtleUhhc2goZSl9LHRoaXMucmVtb3ZlQ29tbWFuZD1mdW5jdGlvbihlLHQpe3ZhciBuPWUmJih0eXBlb2YgZT09InN0cmluZyI/ZTplLm5hbWUpO2U9dGhpcy5jb21tYW5kc1tuXSx0fHxkZWxldGUgdGhpcy5jb21tYW5kc1tuXTt2YXIgcj10aGlzLmNvbW1hbmRLZXlCaW5kaW5nO2Zvcih2YXIgaSBpbiByKXt2YXIgcz1yW2ldO2lmKHM9PWUpZGVsZXRlIHJbaV07ZWxzZSBpZihBcnJheS5pc0FycmF5KHMpKXt2YXIgbz1zLmluZGV4T2YoZSk7byE9LTEmJihzLnNwbGljZShvLDEpLHMubGVuZ3RoPT0xJiYocltpXT1zWzBdKSl9fX0sdGhpcy5iaW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXt0eXBlb2YgZT09Im9iamVjdCImJmUmJihuPT11bmRlZmluZWQmJihuPWUucG9zaXRpb24pLGU9ZVt0aGlzLnBsYXRmb3JtXSk7aWYoIWUpcmV0dXJuO2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiB0aGlzLmFkZENvbW1hbmQoe2V4ZWM6dCxiaW5kS2V5OmUsbmFtZTp0Lm5hbWV8fGV9KTtlLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj0iIjtpZihlLmluZGV4T2YoIiAiKSE9LTEpe3ZhciBpPWUuc3BsaXQoL1xzKy8pO2U9aS5wb3AoKSxpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wYXJzZUtleXMoZSksbj1zW3QuaGFzaElkXSt0LmtleTtyKz0ocj8iICI6IiIpK24sdGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZyhyLCJjaGFpbktleXMiKX0sdGhpcykscis9IiAifXZhciBvPXRoaXMucGFyc2VLZXlzKGUpLHU9c1tvLmhhc2hJZF0rby5rZXk7dGhpcy5fYWRkQ29tbWFuZFRvQmluZGluZyhyK3UsdCxuKX0sdGhpcyl9LHRoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmc9ZnVuY3Rpb24odCxuLHIpe3ZhciBpPXRoaXMuY29tbWFuZEtleUJpbmRpbmcscztpZighbilkZWxldGUgaVt0XTtlbHNlIGlmKCFpW3RdfHx0aGlzLiRzaW5nbGVDb21tYW5kKWlbdF09bjtlbHNle0FycmF5LmlzQXJyYXkoaVt0XSk/KHM9aVt0XS5pbmRleE9mKG4pKSE9LTEmJmlbdF0uc3BsaWNlKHMsMSk6aVt0XT1baVt0XV0sdHlwZW9mIHIhPSJudW1iZXIiJiYocj1lKG4pKTt2YXIgbz1pW3RdO2ZvcihzPTA7czxvLmxlbmd0aDtzKyspe3ZhciB1PW9bc10sYT1lKHUpO2lmKGE+cilicmVha31vLnNwbGljZShzLDAsbil9fSx0aGlzLmFkZENvbW1hbmRzPWZ1bmN0aW9uKGUpe2UmJk9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG49ZVt0XTtpZighbilyZXR1cm47aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiB0aGlzLmJpbmRLZXkobix0KTt0eXBlb2Ygbj09ImZ1bmN0aW9uIiYmKG49e2V4ZWM6bn0pO2lmKHR5cGVvZiBuIT0ib2JqZWN0IilyZXR1cm47bi5uYW1lfHwobi5uYW1lPXQpLHRoaXMuYWRkQ29tbWFuZChuKX0sdGhpcyl9LHRoaXMucmVtb3ZlQ29tbWFuZHM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLnJlbW92ZUNvbW1hbmQoZVt0XSl9LHRoaXMpfSx0aGlzLmJpbmRLZXlzPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5iaW5kS2V5KHQsZVt0XSl9LHRoaXMpfSx0aGlzLl9idWlsZEtleUhhc2g9ZnVuY3Rpb24oZSl7dGhpcy5iaW5kS2V5KGUuYmluZEtleSxlKX0sdGhpcy5wYXJzZUtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9bXC1cK10oW1wtXCtdKT8vKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGV9KSxuPXQucG9wKCksaT1yW25dO2lmKHIuRlVOQ1RJT05fS0VZU1tpXSluPXIuRlVOQ1RJT05fS0VZU1tpXS50b0xvd2VyQ2FzZSgpO2Vsc2V7aWYoIXQubGVuZ3RoKXJldHVybntrZXk6bixoYXNoSWQ6LTF9O2lmKHQubGVuZ3RoPT0xJiZ0WzBdPT0ic2hpZnQiKXJldHVybntrZXk6bi50b1VwcGVyQ2FzZSgpLGhhc2hJZDotMX19dmFyIHM9MDtmb3IodmFyIG89dC5sZW5ndGg7by0tOyl7dmFyIHU9ci5LRVlfTU9EU1t0W29dXTtpZih1PT1udWxsKXJldHVybiB0eXBlb2YgY29uc29sZSE9InVuZGVmaW5lZCImJmNvbnNvbGUuZXJyb3IoImludmFsaWQgbW9kaWZpZXIgIit0W29dKyIgaW4gIitlKSwhMTtzfD11fXJldHVybntrZXk6bixoYXNoSWQ6c319LHRoaXMuZmluZEtleUNvbW1hbmQ9ZnVuY3Rpb24odCxuKXt2YXIgcj1zW3RdK247cmV0dXJuIHRoaXMuY29tbWFuZEtleUJpbmRpbmdbcl19LHRoaXMuaGFuZGxlS2V5Ym9hcmQ9ZnVuY3Rpb24oZSx0LG4scil7aWYocjwwKXJldHVybjt2YXIgaT1zW3RdK24sbz10aGlzLmNvbW1hbmRLZXlCaW5kaW5nW2ldO2UuJGtleUNoYWluJiYoZS4ka2V5Q2hhaW4rPSIgIitpLG89dGhpcy5jb21tYW5kS2V5QmluZGluZ1tlLiRrZXlDaGFpbl18fG8pO2lmKG8paWYobz09ImNoYWluS2V5cyJ8fG9bby5sZW5ndGgtMV09PSJjaGFpbktleXMiKXJldHVybiBlLiRrZXlDaGFpbj1lLiRrZXlDaGFpbnx8aSx7Y29tbWFuZDoibnVsbCJ9O2lmKGUuJGtleUNoYWluKWlmKCEhdCYmdCE9NHx8bi5sZW5ndGghPTEpe2lmKHQ9PS0xfHxyPjApZS4ka2V5Q2hhaW49IiJ9ZWxzZSBlLiRrZXlDaGFpbj1lLiRrZXlDaGFpbi5zbGljZSgwLC1pLmxlbmd0aC0xKTtyZXR1cm57Y29tbWFuZDpvfX0sdGhpcy5nZXRTdGF0dXNUZXh0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuJGtleUNoYWlufHwiIn19LmNhbGwoby5wcm90b3R5cGUpLHQuSGFzaEhhbmRsZXI9byx0Lk11bHRpSGFzaEhhbmRsZXI9dX0pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9jb21tYW5kX21hbmFnZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLk11bHRpSGFzaEhhbmRsZXIscz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWZ1bmN0aW9uKGUsdCl7aS5jYWxsKHRoaXMsdCxlKSx0aGlzLmJ5TmFtZT10aGlzLmNvbW1hbmRzLHRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoImV4ZWMiLGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbW1hbmQuZXhlYyhlLmVkaXRvcixlLmFyZ3N8fHt9KX0pfTtyLmluaGVyaXRzKG8saSksZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuZXhlYz1mdW5jdGlvbihlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSl7Zm9yKHZhciByPWUubGVuZ3RoO3ItLTspaWYodGhpcy5leGVjKGVbcl0sdCxuKSlyZXR1cm4hMDtyZXR1cm4hMX10eXBlb2YgZT09InN0cmluZyImJihlPXRoaXMuY29tbWFuZHNbZV0pO2lmKCFlKXJldHVybiExO2lmKHQmJnQuJHJlYWRPbmx5JiYhZS5yZWFkT25seSlyZXR1cm4hMTtpZih0aGlzLiRjaGVja0NvbW1hbmRTdGF0ZSE9MCYmZS5pc0F2YWlsYWJsZSYmIWUuaXNBdmFpbGFibGUodCkpcmV0dXJuITE7dmFyIGk9e2VkaXRvcjp0LGNvbW1hbmQ6ZSxhcmdzOm59O3JldHVybiBpLnJldHVyblZhbHVlPXRoaXMuX2VtaXQoImV4ZWMiLGkpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJFeGVjIixpKSxpLnJldHVyblZhbHVlPT09ITE/ITE6ITB9LHRoaXMudG9nZ2xlUmVjb3JkaW5nPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGluUmVwbGF5KXJldHVybjtyZXR1cm4gZSYmZS5fZW1pdCgiY2hhbmdlU3RhdHVzIiksdGhpcy5yZWNvcmRpbmc/KHRoaXMubWFjcm8ucG9wKCksdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKCJleGVjIix0aGlzLiRhZGRDb21tYW5kVG9NYWNybyksdGhpcy5tYWNyby5sZW5ndGh8fCh0aGlzLm1hY3JvPXRoaXMub2xkTWFjcm8pLHRoaXMucmVjb3JkaW5nPSExKToodGhpcy4kYWRkQ29tbWFuZFRvTWFjcm98fCh0aGlzLiRhZGRDb21tYW5kVG9NYWNybz1mdW5jdGlvbihlKXt0aGlzLm1hY3JvLnB1c2goW2UuY29tbWFuZCxlLmFyZ3NdKX0uYmluZCh0aGlzKSksdGhpcy5vbGRNYWNybz10aGlzLm1hY3JvLHRoaXMubWFjcm89W10sdGhpcy5vbigiZXhlYyIsdGhpcy4kYWRkQ29tbWFuZFRvTWFjcm8pLHRoaXMucmVjb3JkaW5nPSEwKX0sdGhpcy5yZXBsYXk9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaW5SZXBsYXl8fCF0aGlzLm1hY3JvKXJldHVybjtpZih0aGlzLnJlY29yZGluZylyZXR1cm4gdGhpcy50b2dnbGVSZWNvcmRpbmcoZSk7dHJ5e3RoaXMuJGluUmVwbGF5PSEwLHRoaXMubWFjcm8uZm9yRWFjaChmdW5jdGlvbih0KXt0eXBlb2YgdD09InN0cmluZyI/dGhpcy5leGVjKHQsZSk6dGhpcy5leGVjKHRbMF0sZSx0WzFdKX0sdGhpcyl9ZmluYWxseXt0aGlzLiRpblJlcGxheT0hMX19LHRoaXMudHJpbU1hY3JvPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGVbMF0hPSJzdHJpbmciJiYoZVswXT1lWzBdLm5hbWUpLGVbMV18fChlPWVbMF0pLGV9KX19LmNhbGwoby5wcm90b3R5cGUpLHQuQ29tbWFuZE1hbmFnZXI9b30pLGFjZS5kZWZpbmUoImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NvbmZpZyIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe3JldHVybnt3aW46ZSxtYWM6dH19dmFyIHI9ZSgiLi4vbGliL2xhbmciKSxpPWUoIi4uL2NvbmZpZyIpLHM9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LmNvbW1hbmRzPVt7bmFtZToic2hvd1NldHRpbmdzTWVudSIsYmluZEtleTpvKCJDdHJsLSwiLCJDb21tYW5kLSwiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZXR0aW5nc19tZW51IixmdW5jdGlvbih0KXt0LmluaXQoZSksZS5zaG93U2V0dGluZ3NNZW51KCl9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb1RvTmV4dEVycm9yIixiaW5kS2V5Om8oIkFsdC1FIiwiRjQiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiLi9leHQvZXJyb3JfbWFya2VyIixmdW5jdGlvbih0KXt0LnNob3dFcnJvck1hcmtlcihlLDEpfSl9LHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6ImdvVG9QcmV2aW91c0Vycm9yIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1FIiwiU2hpZnQtRjQiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiLi9leHQvZXJyb3JfbWFya2VyIixmdW5jdGlvbih0KXt0LnNob3dFcnJvck1hcmtlcihlLC0xKX0pfSxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RhbGwiLGRlc2NyaXB0aW9uOiJTZWxlY3QgYWxsIixiaW5kS2V5Om8oIkN0cmwtQSIsIkNvbW1hbmQtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RBbGwoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJjZW50ZXJzZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJDZW50ZXIgc2VsZWN0aW9uIixiaW5kS2V5Om8obnVsbCwiQ3RybC1MIiksZXhlYzpmdW5jdGlvbihlKXtlLmNlbnRlclNlbGVjdGlvbigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9saW5lIixkZXNjcmlwdGlvbjoiR28gdG8gbGluZS4uLiIsYmluZEtleTpvKCJDdHJsLUwiLCJDb21tYW5kLUwiKSxleGVjOmZ1bmN0aW9uKGUsdCl7dHlwZW9mIHQ9PSJudW1iZXIiJiYhaXNOYU4odCkmJmUuZ290b0xpbmUodCksZS5wcm9tcHQoeyR0eXBlOiJnb3RvTGluZSJ9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkIixiaW5kS2V5Om8oIkFsdC1MfEN0cmwtRjEiLCJDb21tYW5kLUFsdC1MfENvbW1hbmQtRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkKCExKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1MfEN0cmwtU2hpZnQtRjEiLCJDb21tYW5kLUFsdC1TaGlmdC1MfENvbW1hbmQtU2hpZnQtRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkKCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlRm9sZFdpZGdldCIsYmluZEtleTpvKCJGMiIsIkYyIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZFdpZGdldCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVQYXJlbnRGb2xkV2lkZ2V0IixiaW5kS2V5Om8oIkFsdC1GMiIsIkFsdC1GMiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGRXaWRnZXQoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmb2xkYWxsIixkZXNjcmlwdGlvbjoiRm9sZCBhbGwiLGJpbmRLZXk6byhudWxsLCJDdHJsLUNvbW1hbmQtT3B0aW9uLTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi5mb2xkQWxsKCl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZE90aGVyIixkZXNjcmlwdGlvbjoiRm9sZCBvdGhlciIsYmluZEtleTpvKCJBbHQtMCIsIkNvbW1hbmQtT3B0aW9uLTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi5mb2xkQWxsKCksZS5zZXNzaW9uLnVuZm9sZChlLnNlbGVjdGlvbi5nZXRBbGxSYW5nZXMoKSl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidW5mb2xkYWxsIixkZXNjcmlwdGlvbjoiVW5mb2xkIGFsbCIsYmluZEtleTpvKCJBbHQtU2hpZnQtMCIsIkNvbW1hbmQtT3B0aW9uLVNoaWZ0LTAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi51bmZvbGQoKX0sc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJmaW5kbmV4dCIsZGVzY3JpcHRpb246IkZpbmQgbmV4dCIsYmluZEtleTpvKCJDdHJsLUsiLCJDb21tYW5kLUciKSxleGVjOmZ1bmN0aW9uKGUpe2UuZmluZE5leHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZHByZXZpb3VzIixkZXNjcmlwdGlvbjoiRmluZCBwcmV2aW91cyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUsiLCJDb21tYW5kLVNoaWZ0LUciKSxleGVjOmZ1bmN0aW9uKGUpe2UuZmluZFByZXZpb3VzKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE9yRmluZE5leHQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgb3IgZmluZCBuZXh0IixiaW5kS2V5Om8oIkFsdC1LIiwiQ3RybC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdGlvbi5pc0VtcHR5KCk/ZS5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOmUuZmluZE5leHQoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RPckZpbmRQcmV2aW91cyIsZGVzY3JpcHRpb246IlNlbGVjdCBvciBmaW5kIHByZXZpb3VzIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1LIiwiQ3RybC1TaGlmdC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdGlvbi5pc0VtcHR5KCk/ZS5zZWxlY3Rpb24uc2VsZWN0V29yZCgpOmUuZmluZFByZXZpb3VzKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZCIsZGVzY3JpcHRpb246IkZpbmQiLGJpbmRLZXk6bygiQ3RybC1GIiwiQ29tbWFuZC1GIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2VhcmNoYm94IixmdW5jdGlvbih0KXt0LlNlYXJjaChlKX0pfSxyZWFkT25seTohMH0se25hbWU6Im92ZXJ3cml0ZSIsZGVzY3JpcHRpb246Ik92ZXJ3cml0ZSIsYmluZEtleToiSW5zZXJ0IixleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlT3ZlcndyaXRlKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9zdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBzdGFydCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUhvbWUiLCJDb21tYW5kLVNoaWZ0LUhvbWV8Q29tbWFuZC1TaGlmdC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RGaWxlU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6ImdvdG9zdGFydCIsZGVzY3JpcHRpb246IkdvIHRvIHN0YXJ0IixiaW5kS2V5Om8oIkN0cmwtSG9tZSIsIkNvbW1hbmQtSG9tZXxDb21tYW5kLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlRmlsZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJzZWxlY3R1cCIsZGVzY3JpcHRpb246IlNlbGVjdCB1cCIsYmluZEtleTpvKCJTaGlmdC1VcCIsIlNoaWZ0LVVwfEN0cmwtU2hpZnQtUCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RVcCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmV1cCIsZGVzY3JpcHRpb246IkdvIGxpbmUgdXAiLGJpbmRLZXk6bygiVXAiLCJVcHxDdHJsLVAiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZVVwKHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2VuZCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBlbmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1FbmQiLCJDb21tYW5kLVNoaWZ0LUVuZHxDb21tYW5kLVNoaWZ0LURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToiZ290b2VuZCIsZGVzY3JpcHRpb246IkdvIHRvIGVuZCIsYmluZEtleTpvKCJDdHJsLUVuZCIsIkNvbW1hbmQtRW5kfENvbW1hbmQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUZpbGVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6InNlbGVjdGRvd24iLGRlc2NyaXB0aW9uOiJTZWxlY3QgZG93biIsYmluZEtleTpvKCJTaGlmdC1Eb3duIiwiU2hpZnQtRG93bnxDdHJsLVNoaWZ0LU4iKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RG93bigpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb2xpbmVkb3duIixkZXNjcmlwdGlvbjoiR28gbGluZSBkb3duIixiaW5kS2V5Om8oIkRvd24iLCJEb3dufEN0cmwtTiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlRG93bih0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZGxlZnQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtTGVmdCIsIk9wdGlvbi1TaGlmdC1MZWZ0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG93b3JkbGVmdCIsZGVzY3JpcHRpb246IkdvIHRvIHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLUxlZnQiLCJPcHRpb24tTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZVdvcmRMZWZ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LUxlZnQiLCJDb21tYW5kLVNoaWZ0LUxlZnR8Q3RybC1TaGlmdC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiR28gdG8gbGluZSBzdGFydCIsYmluZEtleTpvKCJBbHQtTGVmdHxIb21lIiwiQ29tbWFuZC1MZWZ0fEhvbWV8Q3RybC1BIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlTGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdGxlZnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGVmdCIsYmluZEtleTpvKCJTaGlmdC1MZWZ0IiwiU2hpZnQtTGVmdHxDdHJsLVNoaWZ0LUIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGVmdCIsZGVzY3JpcHRpb246IkdvIHRvIGxlZnQiLGJpbmRLZXk6bygiTGVmdCIsIkxlZnR8Q3RybC1CIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVMZWZ0KHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R3b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVJpZ2h0IiwiT3B0aW9uLVNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiR28gdG8gd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLVJpZ2h0IiwiT3B0aW9uLVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlV29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbGluZWVuZCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtU2hpZnQtUmlnaHQiLCJDb21tYW5kLVNoaWZ0LVJpZ2h0fFNoaWZ0LUVuZHxDdHJsLVNoaWZ0LUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZWVuZCIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUgZW5kIixiaW5kS2V5Om8oIkFsdC1SaWdodHxFbmQiLCJDb21tYW5kLVJpZ2h0fEVuZHxDdHJsLUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHJpZ2h0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHJpZ2h0IixiaW5kS2V5Om8oIlNoaWZ0LVJpZ2h0IiwiU2hpZnQtUmlnaHQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0UmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3JpZ2h0IixkZXNjcmlwdGlvbjoiR28gdG8gcmlnaHQiLGJpbmRLZXk6bygiUmlnaHQiLCJSaWdodHxDdHJsLUYiKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZVJpZ2h0KHQudGltZXMpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdlZG93biIsZGVzY3JpcHRpb246IlNlbGVjdCBwYWdlIGRvd24iLGJpbmRLZXk6IlNoaWZ0LVBhZ2VEb3duIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0UGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJwYWdlZG93biIsZGVzY3JpcHRpb246IlBhZ2UgZG93biIsYmluZEtleTpvKG51bGwsIk9wdGlvbi1QYWdlRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zY3JvbGxQYWdlRG93bigpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdlZG93biIsZGVzY3JpcHRpb246IkdvIHRvIHBhZ2UgZG93biIsYmluZEtleTpvKCJQYWdlRG93biIsIlBhZ2VEb3dufEN0cmwtViIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nb3RvUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RwYWdldXAiLGRlc2NyaXB0aW9uOiJTZWxlY3QgcGFnZSB1cCIsYmluZEtleToiU2hpZnQtUGFnZVVwIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0UGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZXVwIixkZXNjcmlwdGlvbjoiUGFnZSB1cCIsYmluZEtleTpvKG51bGwsIk9wdGlvbi1QYWdlVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Nyb2xsUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3BhZ2V1cCIsZGVzY3JpcHRpb246IkdvIHRvIHBhZ2UgdXAiLGJpbmRLZXk6IlBhZ2VVcCIsZXhlYzpmdW5jdGlvbihlKXtlLmdvdG9QYWdlVXAoKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzY3JvbGx1cCIsZGVzY3JpcHRpb246IlNjcm9sbCB1cCIsYmluZEtleTpvKCJDdHJsLVVwIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuc2Nyb2xsQnkoMCwtMiplLnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpfSxyZWFkT25seTohMH0se25hbWU6InNjcm9sbGRvd24iLGRlc2NyaXB0aW9uOiJTY3JvbGwgZG93biIsYmluZEtleTpvKCJDdHJsLURvd24iLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci5zY3JvbGxCeSgwLDIqZS5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbGluZSBzdGFydCIsYmluZEtleToiU2hpZnQtSG9tZSIsZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsaW5lZW5kIixkZXNjcmlwdGlvbjoiU2VsZWN0IGxpbmUgZW5kIixiaW5kS2V5OiJTaGlmdC1FbmQiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZXJlY29yZGluZyIsZGVzY3JpcHRpb246IlRvZ2dsZSByZWNvcmRpbmciLGJpbmRLZXk6bygiQ3RybC1BbHQtRSIsIkNvbW1hbmQtT3B0aW9uLUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29tbWFuZHMudG9nZ2xlUmVjb3JkaW5nKGUpfSxyZWFkT25seTohMH0se25hbWU6InJlcGxheW1hY3JvIixkZXNjcmlwdGlvbjoiUmVwbGF5IG1hY3JvIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRSIsIkNvbW1hbmQtU2hpZnQtRSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb21tYW5kcy5yZXBsYXkoZSl9LHJlYWRPbmx5OiEwfSx7bmFtZToianVtcHRvbWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJKdW1wIHRvIG1hdGNoaW5nIixiaW5kS2V5Om8oIkN0cmwtXFx8Q3RybC1QIiwiQ29tbWFuZC1cXCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5qdW1wVG9NYXRjaGluZygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9tYXRjaGluZyIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVxcfEN0cmwtU2hpZnQtUCIsIkNvbW1hbmQtU2hpZnQtXFwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToiZXhwYW5kVG9NYXRjaGluZyIsZGVzY3JpcHRpb246IkV4cGFuZCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LU0iLCJDdHJsLVNoaWZ0LU0iKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoITAsITApfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToicGFzc0tleXNUb0Jyb3dzZXIiLGRlc2NyaXB0aW9uOiJQYXNzIGtleXMgdG8gYnJvd3NlciIsYmluZEtleTpvKG51bGwsbnVsbCksZXhlYzpmdW5jdGlvbigpe30scGFzc0V2ZW50OiEwLHJlYWRPbmx5OiEwfSx7bmFtZToiY29weSIsZGVzY3JpcHRpb246IkNvcHkiLGV4ZWM6ZnVuY3Rpb24oZSl7fSxyZWFkT25seTohMH0se25hbWU6ImN1dCIsZGVzY3JpcHRpb246IkN1dCIsZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLiRjb3B5V2l0aEVtcHR5U2VsZWN0aW9uJiZlLnNlbGVjdGlvbi5pc0VtcHR5KCksbj10P2Uuc2VsZWN0aW9uLmdldExpbmVSYW5nZSgpOmUuc2VsZWN0aW9uLmdldFJhbmdlKCk7ZS5fZW1pdCgiY3V0IixuKSxuLmlzRW1wdHkoKXx8ZS5zZXNzaW9uLnJlbW92ZShuKSxlLmNsZWFyU2VsZWN0aW9uKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InBhc3RlIixkZXNjcmlwdGlvbjoiUGFzdGUiLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLiRoYW5kbGVQYXN0ZSh0KX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmVsaW5lIixkZXNjcmlwdGlvbjoiUmVtb3ZlIGxpbmUiLGJpbmRLZXk6bygiQ3RybC1EIiwiQ29tbWFuZC1EIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZUxpbmVzKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSJ9LHtuYW1lOiJkdXBsaWNhdGVTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJEdXBsaWNhdGUgc2VsZWN0aW9uIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRCIsIkNvbW1hbmQtU2hpZnQtRCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5kdXBsaWNhdGVTZWxlY3Rpb24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToic29ydGxpbmVzIixkZXNjcmlwdGlvbjoiU29ydCBsaW5lcyIsYmluZEtleTpvKCJDdHJsLUFsdC1TIiwiQ29tbWFuZC1BbHQtUyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zb3J0TGluZXMoKX0sc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvbiIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIn0se25hbWU6InRvZ2dsZWNvbW1lbnQiLGRlc2NyaXB0aW9uOiJUb2dnbGUgY29tbWVudCIsYmluZEtleTpvKCJDdHJsLS8iLCJDb21tYW5kLS8iKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9nZ2xlQ29tbWVudExpbmVzKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToidG9nZ2xlQmxvY2tDb21tZW50IixkZXNjcmlwdGlvbjoiVG9nZ2xlIGJsb2NrIGNvbW1lbnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC0vIiwiQ29tbWFuZC1TaGlmdC0vIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZUJsb2NrQ29tbWVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToibW9kaWZ5TnVtYmVyVXAiLGRlc2NyaXB0aW9uOiJNb2RpZnkgbnVtYmVyIHVwIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtVXAiLCJBbHQtU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubW9kaWZ5TnVtYmVyKDEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJtb2RpZnlOdW1iZXJEb3duIixkZXNjcmlwdGlvbjoiTW9kaWZ5IG51bWJlciBkb3duIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRG93biIsIkFsdC1TaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vZGlmeU51bWJlcigtMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InJlcGxhY2UiLGRlc2NyaXB0aW9uOiJSZXBsYWNlIixiaW5kS2V5Om8oIkN0cmwtSCIsIkNvbW1hbmQtT3B0aW9uLUYiKSxleGVjOmZ1bmN0aW9uKGUpe2kubG9hZE1vZHVsZSgiYWNlL2V4dC9zZWFyY2hib3giLGZ1bmN0aW9uKHQpe3QuU2VhcmNoKGUsITApfSl9fSx7bmFtZToidW5kbyIsZGVzY3JpcHRpb246IlVuZG8iLGJpbmRLZXk6bygiQ3RybC1aIiwiQ29tbWFuZC1aIiksZXhlYzpmdW5jdGlvbihlKXtlLnVuZG8oKX19LHtuYW1lOiJyZWRvIixkZXNjcmlwdGlvbjoiUmVkbyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVp8Q3RybC1ZIiwiQ29tbWFuZC1TaGlmdC1afENvbW1hbmQtWSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZWRvKCl9fSx7bmFtZToiY29weWxpbmVzdXAiLGRlc2NyaXB0aW9uOiJDb3B5IGxpbmVzIHVwIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1VcCIsIkNvbW1hbmQtT3B0aW9uLVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvcHlMaW5lc1VwKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToibW92ZWxpbmVzdXAiLGRlc2NyaXB0aW9uOiJNb3ZlIGxpbmVzIHVwIixiaW5kS2V5Om8oIkFsdC1VcCIsIk9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb3ZlTGluZXNVcCgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImNvcHlsaW5lc2Rvd24iLGRlc2NyaXB0aW9uOiJDb3B5IGxpbmVzIGRvd24iLGJpbmRLZXk6bygiQWx0LVNoaWZ0LURvd24iLCJDb21tYW5kLU9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvcHlMaW5lc0Rvd24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJtb3ZlbGluZXNkb3duIixkZXNjcmlwdGlvbjoiTW92ZSBsaW5lcyBkb3duIixiaW5kS2V5Om8oIkFsdC1Eb3duIiwiT3B0aW9uLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubW92ZUxpbmVzRG93bigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImRlbCIsZGVzY3JpcHRpb246IkRlbGV0ZSIsYmluZEtleTpvKCJEZWxldGUiLCJEZWxldGV8Q3RybC1EfFNoaWZ0LURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmUoInJpZ2h0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImJhY2tzcGFjZSIsZGVzY3JpcHRpb246IkJhY2tzcGFjZSIsYmluZEtleTpvKCJTaGlmdC1CYWNrc3BhY2V8QmFja3NwYWNlIiwiQ3RybC1CYWNrc3BhY2V8U2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZXxDdHJsLUgiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlKCJsZWZ0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImN1dF9vcl9kZWxldGUiLGRlc2NyaXB0aW9uOiJDdXQgb3IgZGVsZXRlIixiaW5kS2V5Om8oIlNoaWZ0LURlbGV0ZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtpZighZS5zZWxlY3Rpb24uaXNFbXB0eSgpKXJldHVybiExO2UucmVtb3ZlKCJsZWZ0Iil9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LUJhY2tzcGFjZSIsIkNvbW1hbmQtQmFja3NwYWNlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVRvTGluZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InJlbW92ZXRvbGluZWVuZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtRGVsZXRlIiwiQ3RybC1LfENvbW1hbmQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVRvTGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVzdGFydGhhcmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBzdGFydCBoYXJkIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtQmFja3NwYWNlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5zdGFydC5jb2x1bW49MCxlLnNlc3Npb24ucmVtb3ZlKHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVlbmRoYXJkIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgZW5kIGhhcmQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1EZWxldGUiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0LmVuZC5jb2x1bW49TnVtYmVyLk1BWF9WQUxVRSxlLnNlc3Npb24ucmVtb3ZlKHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV3b3JkbGVmdCIsZGVzY3JpcHRpb246IlJlbW92ZSB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1CYWNrc3BhY2UiLCJBbHQtQmFja3NwYWNlfEN0cmwtQWx0LUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV3b3JkcmlnaHQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgd29yZCByaWdodCIsYmluZEtleTpvKCJDdHJsLURlbGV0ZSIsIkFsdC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlV29yZFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im91dGRlbnQiLGRlc2NyaXB0aW9uOiJPdXRkZW50IixiaW5kS2V5Om8oIlNoaWZ0LVRhYiIsIlNoaWZ0LVRhYiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja091dGRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6ImluZGVudCIsZGVzY3JpcHRpb246IkluZGVudCIsYmluZEtleTpvKCJUYWIiLCJUYWIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuaW5kZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJibG9ja291dGRlbnQiLGRlc2NyaXB0aW9uOiJCbG9jayBvdXRkZW50IixiaW5kS2V5Om8oIkN0cmwtWyIsIkN0cmwtWyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5ibG9ja091dGRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJibG9ja2luZGVudCIsZGVzY3JpcHRpb246IkJsb2NrIGluZGVudCIsYmluZEtleTpvKCJDdHJsLV0iLCJDdHJsLV0iKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tJbmRlbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2hMaW5lIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJpbnNlcnRzdHJpbmciLGRlc2NyaXB0aW9uOiJJbnNlcnQgc3RyaW5nIixleGVjOmZ1bmN0aW9uKGUsdCl7ZS5pbnNlcnQodCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Imluc2VydHRleHQiLGRlc2NyaXB0aW9uOiJJbnNlcnQgdGV4dCIsZXhlYzpmdW5jdGlvbihlLHQpe2UuaW5zZXJ0KHIuc3RyaW5nUmVwZWF0KHQudGV4dHx8IiIsdC50aW1lc3x8MSkpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJzcGxpdGxpbmUiLGRlc2NyaXB0aW9uOiJTcGxpdCBsaW5lIixiaW5kS2V5Om8obnVsbCwiQ3RybC1PIiksZXhlYzpmdW5jdGlvbihlKXtlLnNwbGl0TGluZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0cmFuc3Bvc2VsZXR0ZXJzIixkZXNjcmlwdGlvbjoiVHJhbnNwb3NlIGxldHRlcnMiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVgiLCJDdHJsLVQiKSxleGVjOmZ1bmN0aW9uKGUpe2UudHJhbnNwb3NlTGV0dGVycygpfSxtdWx0aVNlbGVjdEFjdGlvbjpmdW5jdGlvbihlKXtlLnRyYW5zcG9zZVNlbGVjdGlvbnMoMSl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidG91cHBlcmNhc2UiLGRlc2NyaXB0aW9uOiJUbyB1cHBlcmNhc2UiLGJpbmRLZXk6bygiQ3RybC1VIiwiQ3RybC1VIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvVXBwZXJDYXNlKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRvbG93ZXJjYXNlIixkZXNjcmlwdGlvbjoiVG8gbG93ZXJjYXNlIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtVSIsIkN0cmwtU2hpZnQtVSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b0xvd2VyQ2FzZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJleHBhbmR0b2xpbmUiLGRlc2NyaXB0aW9uOiJFeHBhbmQgdG8gbGluZSIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUwiLCJDb21tYW5kLVNoaWZ0LUwiKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5zdGFydC5jb2x1bW49dC5lbmQuY29sdW1uPTAsdC5lbmQucm93KyssZS5zZWxlY3Rpb24uc2V0UmFuZ2UodCwhMSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImpvaW5saW5lcyIsZGVzY3JpcHRpb246IkpvaW4gbGluZXMiLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSxuPXQ/ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpOmUuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkFuY2hvcigpLGk9dD9lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKTplLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25MZWFkKCksbz1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpLmxlbmd0aCx1PWUuc2Vzc2lvbi5kb2MuZ2V0VGV4dFJhbmdlKGUuc2VsZWN0aW9uLmdldFJhbmdlKCkpLGE9dS5yZXBsYWNlKC9cblxzKi8sIiAiKS5sZW5ndGgsZj1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpO2Zvcih2YXIgbD1uLnJvdysxO2w8PWkucm93KzE7bCsrKXt2YXIgYz1yLnN0cmluZ1RyaW1MZWZ0KHIuc3RyaW5nVHJpbVJpZ2h0KGUuc2Vzc2lvbi5kb2MuZ2V0TGluZShsKSkpO2MubGVuZ3RoIT09MCYmKGM9IiAiK2MpLGYrPWN9aS5yb3crMTxlLnNlc3Npb24uZG9jLmdldExlbmd0aCgpLTEmJihmKz1lLnNlc3Npb24uZG9jLmdldE5ld0xpbmVDaGFyYWN0ZXIoKSksZS5jbGVhclNlbGVjdGlvbigpLGUuc2Vzc2lvbi5kb2MucmVwbGFjZShuZXcgcyhuLnJvdywwLGkucm93KzIsMCksZiksYT4wPyhlLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8obi5yb3csbi5jb2x1bW4pLGUuc2VsZWN0aW9uLnNlbGVjdFRvKG4ucm93LG4uY29sdW1uK2EpKToobz1lLnNlc3Npb24uZG9jLmdldExpbmUobi5yb3cpLmxlbmd0aD5vP28rMTpvLGUuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhuLnJvdyxvKSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMH0se25hbWU6ImludmVydFNlbGVjdGlvbiIsZGVzY3JpcHRpb246IkludmVydCBzZWxlY3Rpb24iLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXNzaW9uLmRvYy5nZXRMZW5ndGgoKS0xLG49ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKHQpLmxlbmd0aCxyPWUuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMsaT1bXTtyLmxlbmd0aDwxJiYocj1bZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKV0pO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKW89PXIubGVuZ3RoLTEmJihyW29dLmVuZC5yb3chPT10fHxyW29dLmVuZC5jb2x1bW4hPT1uKSYmaS5wdXNoKG5ldyBzKHJbb10uZW5kLnJvdyxyW29dLmVuZC5jb2x1bW4sdCxuKSksbz09PTA/KHJbb10uc3RhcnQucm93IT09MHx8cltvXS5zdGFydC5jb2x1bW4hPT0wKSYmaS5wdXNoKG5ldyBzKDAsMCxyW29dLnN0YXJ0LnJvdyxyW29dLnN0YXJ0LmNvbHVtbikpOmkucHVzaChuZXcgcyhyW28tMV0uZW5kLnJvdyxyW28tMV0uZW5kLmNvbHVtbixyW29dLnN0YXJ0LnJvdyxyW29dLnN0YXJ0LmNvbHVtbikpO2UuZXhpdE11bHRpU2VsZWN0TW9kZSgpLGUuY2xlYXJTZWxlY3Rpb24oKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyllLnNlbGVjdGlvbi5hZGRSYW5nZShpW29dLCExKX0scmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6Im5vbmUifSx7bmFtZToib3BlbkNvbW1hbmRQYWxsZXRlIixkZXNjcmlwdGlvbjoiT3BlbiBjb21tYW5kIHBhbGxldGUiLGJpbmRLZXk6bygiRjEiLCJGMSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5wcm9tcHQoeyR0eXBlOiJjb21tYW5kcyJ9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJtb2RlU2VsZWN0IixkZXNjcmlwdGlvbjoiQ2hhbmdlIGxhbmd1YWdlIG1vZGUuLi4iLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5wcm9tcHQoeyR0eXBlOiJtb2RlcyJ9KX0scmVhZE9ubHk6ITB9XX0pLGFjZS5kZWZpbmUoImFjZS9lZGl0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvdXNlcmFnZW50IiwiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsImFjZS9tb3VzZS9tb3VzZV9oYW5kbGVyIiwiYWNlL21vdXNlL2ZvbGRfaGFuZGxlciIsImFjZS9rZXlib2FyZC9rZXliaW5kaW5nIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9zZWFyY2giLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIiwiYWNlL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiLCJhY2UvY29uZmlnIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL2NsaXBib2FyZCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9saWIvbGFuZyIpLG89ZSgiLi9saWIvdXNlcmFnZW50IiksdT1lKCIuL2tleWJvYXJkL3RleHRpbnB1dCIpLlRleHRJbnB1dCxhPWUoIi4vbW91c2UvbW91c2VfaGFuZGxlciIpLk1vdXNlSGFuZGxlcixmPWUoIi4vbW91c2UvZm9sZF9oYW5kbGVyIikuRm9sZEhhbmRsZXIsbD1lKCIuL2tleWJvYXJkL2tleWJpbmRpbmciKS5LZXlCaW5kaW5nLGM9ZSgiLi9lZGl0X3Nlc3Npb24iKS5FZGl0U2Vzc2lvbixoPWUoIi4vc2VhcmNoIikuU2VhcmNoLHA9ZSgiLi9yYW5nZSIpLlJhbmdlLGQ9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix2PWUoIi4vY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIikuQ29tbWFuZE1hbmFnZXIsbT1lKCIuL2NvbW1hbmRzL2RlZmF1bHRfY29tbWFuZHMiKS5jb21tYW5kcyxnPWUoIi4vY29uZmlnIikseT1lKCIuL3Rva2VuX2l0ZXJhdG9yIikuVG9rZW5JdGVyYXRvcixiPWUoIi4vY2xpcGJvYXJkIiksdz1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRDb250YWluZXJFbGVtZW50KCk7dGhpcy5jb250YWluZXI9cix0aGlzLnJlbmRlcmVyPWUsdGhpcy5pZD0iZWRpdG9yIisgKyt3LiR1aWQsdGhpcy5jb21tYW5kcz1uZXcgdihvLmlzTWFjPyJtYWMiOiJ3aW4iLG0pLHR5cGVvZiBkb2N1bWVudD09Im9iamVjdCImJih0aGlzLnRleHRJbnB1dD1uZXcgdShlLmdldFRleHRBcmVhQ29udGFpbmVyKCksdGhpcyksdGhpcy5yZW5kZXJlci50ZXh0YXJlYT10aGlzLnRleHRJbnB1dC5nZXRFbGVtZW50KCksdGhpcy4kbW91c2VIYW5kbGVyPW5ldyBhKHRoaXMpLG5ldyBmKHRoaXMpKSx0aGlzLmtleUJpbmRpbmc9bmV3IGwodGhpcyksdGhpcy4kc2VhcmNoPShuZXcgaCkuc2V0KHt3cmFwOiEwfSksdGhpcy4kaGlzdG9yeVRyYWNrZXI9dGhpcy4kaGlzdG9yeVRyYWNrZXIuYmluZCh0aGlzKSx0aGlzLmNvbW1hbmRzLm9uKCJleGVjIix0aGlzLiRoaXN0b3J5VHJhY2tlciksdGhpcy4kaW5pdE9wZXJhdGlvbkxpc3RlbmVycygpLHRoaXMuXyRlbWl0SW5wdXRFdmVudD1zLmRlbGF5ZWRDYWxsKGZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJpbnB1dCIse30pLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmJnVG9rZW5pemVyJiZ0aGlzLnNlc3Npb24uYmdUb2tlbml6ZXIuc2NoZWR1bGVTdGFydCgpfS5iaW5kKHRoaXMpKSx0aGlzLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKGUsdCl7dC5fJGVtaXRJbnB1dEV2ZW50LnNjaGVkdWxlKDMxKX0pLHRoaXMuc2V0U2Vzc2lvbih0fHxuJiZuLnNlc3Npb258fG5ldyBjKCIiKSksZy5yZXNldE9wdGlvbnModGhpcyksbiYmdGhpcy5zZXRPcHRpb25zKG4pLGcuX3NpZ25hbCgiZWRpdG9yIix0aGlzKX07dy4kdWlkPTAsZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGQpLHRoaXMuJGluaXRPcGVyYXRpb25MaXN0ZW5lcnM9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLm9uKCJleGVjIix0aGlzLnN0YXJ0T3BlcmF0aW9uLmJpbmQodGhpcyksITApLHRoaXMuY29tbWFuZHMub24oImFmdGVyRXhlYyIsdGhpcy5lbmRPcGVyYXRpb24uYmluZCh0aGlzKSwhMCksdGhpcy4kb3BSZXNldFRpbWVyPXMuZGVsYXllZENhbGwodGhpcy5lbmRPcGVyYXRpb24uYmluZCh0aGlzLCEwKSksdGhpcy5vbigiY2hhbmdlIixmdW5jdGlvbigpe3RoaXMuY3VyT3B8fCh0aGlzLnN0YXJ0T3BlcmF0aW9uKCksdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy4kbGFzdFNlbCksdGhpcy5jdXJPcC5kb2NDaGFuZ2VkPSEwfS5iaW5kKHRoaXMpLCEwKSx0aGlzLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGZ1bmN0aW9uKCl7dGhpcy5jdXJPcHx8KHRoaXMuc3RhcnRPcGVyYXRpb24oKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLiRsYXN0U2VsKSx0aGlzLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQ9ITB9LmJpbmQodGhpcyksITApfSx0aGlzLmN1ck9wPW51bGwsdGhpcy5wcmV2T3A9e30sdGhpcy5zdGFydE9wZXJhdGlvbj1mdW5jdGlvbihlKXtpZih0aGlzLmN1ck9wKXtpZighZXx8dGhpcy5jdXJPcC5jb21tYW5kKXJldHVybjt0aGlzLnByZXZPcD10aGlzLmN1ck9wfWV8fCh0aGlzLnByZXZpb3VzQ29tbWFuZD1udWxsLGU9e30pLHRoaXMuJG9wUmVzZXRUaW1lci5zY2hlZHVsZSgpLHRoaXMuY3VyT3A9dGhpcy5zZXNzaW9uLmN1ck9wPXtjb21tYW5kOmUuY29tbWFuZHx8e30sYXJnczplLmFyZ3Msc2Nyb2xsVG9wOnRoaXMucmVuZGVyZXIuc2Nyb2xsVG9wfSx0aGlzLmN1ck9wLnNlbGVjdGlvbkJlZm9yZT10aGlzLnNlbGVjdGlvbi50b0pTT04oKX0sdGhpcy5lbmRPcGVyYXRpb249ZnVuY3Rpb24oZSl7aWYodGhpcy5jdXJPcCl7aWYoZSYmZS5yZXR1cm5WYWx1ZT09PSExKXJldHVybiB0aGlzLmN1ck9wPW51bGw7aWYoZT09MSYmdGhpcy5jdXJPcC5jb21tYW5kJiZ0aGlzLmN1ck9wLmNvbW1hbmQubmFtZT09Im1vdXNlIilyZXR1cm47dGhpcy5fc2lnbmFsKCJiZWZvcmVFbmRPcGVyYXRpb24iKTtpZighdGhpcy5jdXJPcClyZXR1cm47dmFyIHQ9dGhpcy5jdXJPcC5jb21tYW5kLG49dCYmdC5zY3JvbGxJbnRvVmlldztpZihuKXtzd2l0Y2gobil7Y2FzZSJjZW50ZXItYW5pbWF0ZSI6bj0iYW5pbWF0ZSI7Y2FzZSJjZW50ZXIiOnRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSk7YnJlYWs7Y2FzZSJhbmltYXRlIjpjYXNlImN1cnNvciI6dGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpO2JyZWFrO2Nhc2Uic2VsZWN0aW9uUGFydCI6dmFyIHI9dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSxpPXRoaXMucmVuZGVyZXIubGF5ZXJDb25maWc7KHIuc3RhcnQucm93Pj1pLmxhc3RSb3d8fHIuZW5kLnJvdzw9aS5maXJzdFJvdykmJnRoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcodGhpcy5zZWxlY3Rpb24uYW5jaG9yLHRoaXMuc2VsZWN0aW9uLmxlYWQpO2JyZWFrO2RlZmF1bHQ6fW49PSJhbmltYXRlIiYmdGhpcy5yZW5kZXJlci5hbmltYXRlU2Nyb2xsaW5nKHRoaXMuY3VyT3Auc2Nyb2xsVG9wKX12YXIgcz10aGlzLnNlbGVjdGlvbi50b0pTT04oKTt0aGlzLmN1ck9wLnNlbGVjdGlvbkFmdGVyPXMsdGhpcy4kbGFzdFNlbD10aGlzLnNlbGVjdGlvbi50b0pTT04oKSx0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5hZGRTZWxlY3Rpb24ocyksdGhpcy5wcmV2T3A9dGhpcy5jdXJPcCx0aGlzLmN1ck9wPW51bGx9fSx0aGlzLiRtZXJnZWFibGVDb21tYW5kcz1bImJhY2tzcGFjZSIsImRlbCIsImluc2VydHN0cmluZyJdLHRoaXMuJGhpc3RvcnlUcmFja2VyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRtZXJnZVVuZG9EZWx0YXMpcmV0dXJuO3ZhciB0PXRoaXMucHJldk9wLG49dGhpcy4kbWVyZ2VhYmxlQ29tbWFuZHMscj10LmNvbW1hbmQmJmUuY29tbWFuZC5uYW1lPT10LmNvbW1hbmQubmFtZTtpZihlLmNvbW1hbmQubmFtZT09Imluc2VydHN0cmluZyIpe3ZhciBpPWUuYXJnczt0aGlzLm1lcmdlTmV4dENvbW1hbmQ9PT11bmRlZmluZWQmJih0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITApLHI9ciYmdGhpcy5tZXJnZU5leHRDb21tYW5kJiYoIS9ccy8udGVzdChpKXx8L1xzLy50ZXN0KHQuYXJncykpLHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMH1lbHNlIHI9ciYmbi5pbmRleE9mKGUuY29tbWFuZC5uYW1lKSE9PS0xO3RoaXMuJG1lcmdlVW5kb0RlbHRhcyE9ImFsd2F5cyImJkRhdGUubm93KCktdGhpcy5zZXF1ZW5jZVN0YXJ0VGltZT4yZTMmJihyPSExKSxyP3RoaXMuc2Vzc2lvbi5tZXJnZVVuZG9EZWx0YXM9ITA6bi5pbmRleE9mKGUuY29tbWFuZC5uYW1lKSE9PS0xJiYodGhpcy5zZXF1ZW5jZVN0YXJ0VGltZT1EYXRlLm5vdygpKX0sdGhpcy5zZXRLZXlib2FyZEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXtpZihlJiZ0eXBlb2YgZT09InN0cmluZyImJmUhPSJhY2UiKXt0aGlzLiRrZXliaW5kaW5nSWQ9ZTt2YXIgbj10aGlzO2cubG9hZE1vZHVsZShbImtleWJpbmRpbmciLGVdLGZ1bmN0aW9uKHIpe24uJGtleWJpbmRpbmdJZD09ZSYmbi5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihyJiZyLmhhbmRsZXIpLHQmJnQoKX0pfWVsc2UgdGhpcy4ka2V5YmluZGluZ0lkPW51bGwsdGhpcy5rZXlCaW5kaW5nLnNldEtleWJvYXJkSGFuZGxlcihlKSx0JiZ0KCl9LHRoaXMuZ2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMua2V5QmluZGluZy5nZXRLZXlib2FyZEhhbmRsZXIoKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2Vzc2lvbj09ZSlyZXR1cm47dGhpcy5jdXJPcCYmdGhpcy5lbmRPcGVyYXRpb24oKSx0aGlzLmN1ck9wPXt9O3ZhciB0PXRoaXMuc2Vzc2lvbjtpZih0KXt0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2UiLHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZU1vZGUiLHRoaXMuJG9uQ2hhbmdlTW9kZSksdGhpcy5zZXNzaW9uLm9mZigidG9rZW5pemVyVXBkYXRlIix0aGlzLiRvblRva2VuaXplclVwZGF0ZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlVGFiU2l6ZSIsdGhpcy4kb25DaGFuZ2VUYWJTaXplKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VXcmFwTGltaXQiLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0KSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VXcmFwTW9kZSIsdGhpcy4kb25DaGFuZ2VXcmFwTW9kZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlRm9sZCIsdGhpcy4kb25DaGFuZ2VGb2xkKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VGcm9udE1hcmtlciIsdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlciksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQmFja01hcmtlciIsdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUFubm90YXRpb24iLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbiksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlU2Nyb2xsTGVmdCIsdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlKTt2YXIgbj10aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7bi5vZmYoImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLG4ub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKX10aGlzLnNlc3Npb249ZSxlPyh0aGlzLiRvbkRvY3VtZW50Q2hhbmdlPXRoaXMub25Eb2N1bWVudENoYW5nZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZSIsdGhpcy4kb25Eb2N1bWVudENoYW5nZSksdGhpcy5yZW5kZXJlci5zZXRTZXNzaW9uKGUpLHRoaXMuJG9uQ2hhbmdlTW9kZT10aGlzLm9uQ2hhbmdlTW9kZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZU1vZGUiLHRoaXMuJG9uQ2hhbmdlTW9kZSksdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGU9dGhpcy5vblRva2VuaXplclVwZGF0ZS5iaW5kKHRoaXMpLGUub24oInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZT10aGlzLnJlbmRlcmVyLm9uQ2hhbmdlVGFiU2l6ZS5iaW5kKHRoaXMucmVuZGVyZXIpLGUub24oImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQ9dGhpcy5vbkNoYW5nZVdyYXBMaW1pdC5iaW5kKHRoaXMpLGUub24oImNoYW5nZVdyYXBMaW1pdCIsdGhpcy4kb25DaGFuZ2VXcmFwTGltaXQpLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGU9dGhpcy5vbkNoYW5nZVdyYXBNb2RlLmJpbmQodGhpcyksZS5vbigiY2hhbmdlV3JhcE1vZGUiLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpLHRoaXMuJG9uQ2hhbmdlRm9sZD10aGlzLm9uQ2hhbmdlRm9sZC5iaW5kKHRoaXMpLGUub24oImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlcj10aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUZyb250TWFya2VyIix0aGlzLiRvbkNoYW5nZUZyb250TWFya2VyKSx0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXI9dGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUJhY2tNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlciksdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50PXRoaXMub25DaGFuZ2VCcmVha3BvaW50LmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VCcmVha3BvaW50Iix0aGlzLiRvbkNoYW5nZUJyZWFrcG9pbnQpLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbj10aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbi5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQW5ub3RhdGlvbiIsdGhpcy4kb25DaGFuZ2VBbm5vdGF0aW9uKSx0aGlzLiRvbkN1cnNvckNoYW5nZT10aGlzLm9uQ3Vyc29yQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VPdmVyd3JpdGUiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLiRvblNjcm9sbFRvcENoYW5nZT10aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VTY3JvbGxUb3AiLHRoaXMuJG9uU2Nyb2xsVG9wQ2hhbmdlKSx0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2U9dGhpcy5vblNjcm9sbExlZnRDaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZVNjcm9sbExlZnQiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSksdGhpcy5zZWxlY3Rpb249ZS5nZXRTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5vbigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TZWxlY3Rpb25DaGFuZ2U9dGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2VsZWN0aW9uLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlKSx0aGlzLm9uQ2hhbmdlTW9kZSgpLHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLm9uU2Nyb2xsVG9wQ2hhbmdlKCksdGhpcy5vblNjcm9sbExlZnRDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5vbkNoYW5nZUZyb250TWFya2VyKCksdGhpcy5vbkNoYW5nZUJhY2tNYXJrZXIoKSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludCgpLHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uKCksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMucmVuZGVyZXIuYWRqdXN0V3JhcExpbWl0KCksdGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCkpOih0aGlzLnNlbGVjdGlvbj1udWxsLHRoaXMucmVuZGVyZXIuc2V0U2Vzc2lvbihlKSksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZXNzaW9uIix7c2Vzc2lvbjplLG9sZFNlc3Npb246dH0pLHRoaXMuY3VyT3A9bnVsbCx0JiZ0Ll9zaWduYWwoImNoYW5nZUVkaXRvciIse29sZEVkaXRvcjp0aGlzfSksZSYmZS5fc2lnbmFsKCJjaGFuZ2VFZGl0b3IiLHtlZGl0b3I6dGhpc30pLGUmJmUuYmdUb2tlbml6ZXImJmUuYmdUb2tlbml6ZXIuc2NoZWR1bGVTdGFydCgpfSx0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9ufSx0aGlzLnNldFZhbHVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5kb2Muc2V0VmFsdWUoZSksdD90PT0xP3RoaXMubmF2aWdhdGVGaWxlRW5kKCk6dD09LTEmJnRoaXMubmF2aWdhdGVGaWxlU3RhcnQoKTp0aGlzLnNlbGVjdEFsbCgpLGV9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFZhbHVlKCl9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9ufSx0aGlzLnJlc2l6ZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLm9uUmVzaXplKGUpfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGUsdCl7dGhpcy5yZW5kZXJlci5zZXRUaGVtZShlLHQpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0VGhlbWUoKX0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFN0eWxlKGUpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci51bnNldFN0eWxlKGUpfSx0aGlzLmdldEZvbnRTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmb250U2l6ZSIpfHxpLmNvbXB1dGVkU3R5bGUodGhpcy5jb250YWluZXIpLmZvbnRTaXplfSx0aGlzLnNldEZvbnRTaXplPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmb250U2l6ZSIsZSl9LHRoaXMuJGhpZ2hsaWdodEJyYWNrZXRzPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0JiYodGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQpLHRoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodD1udWxsKTtpZih0aGlzLiRoaWdobGlnaHRQZW5kaW5nKXJldHVybjt2YXIgZT10aGlzO3RoaXMuJGhpZ2hsaWdodFBlbmRpbmc9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe2UuJGhpZ2hsaWdodFBlbmRpbmc9ITE7dmFyIHQ9ZS5zZXNzaW9uO2lmKCF0fHwhdC5iZ1Rva2VuaXplcilyZXR1cm47dmFyIG49dC5maW5kTWF0Y2hpbmdCcmFja2V0KGUuZ2V0Q3Vyc29yUG9zaXRpb24oKSk7aWYobil2YXIgcj1uZXcgcChuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbisxKTtlbHNlIGlmKHQuJG1vZGUuZ2V0TWF0Y2hpbmcpdmFyIHI9dC4kbW9kZS5nZXRNYXRjaGluZyhlLnNlc3Npb24pO3ImJih0LiRicmFja2V0SGlnaGxpZ2h0PXQuYWRkTWFya2VyKHIsImFjZV9icmFja2V0IiwidGV4dCIpKX0sNTApfSx0aGlzLiRoaWdobGlnaHRUYWdzPWZ1bmN0aW9uKCl7aWYodGhpcy4kaGlnaGxpZ2h0VGFnUGVuZGluZylyZXR1cm47dmFyIGU9dGhpczt0aGlzLiRoaWdobGlnaHRUYWdQZW5kaW5nPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRoaWdobGlnaHRUYWdQZW5kaW5nPSExO3ZhciB0PWUuc2Vzc2lvbjtpZighdHx8IXQuYmdUb2tlbml6ZXIpcmV0dXJuO3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyB5KGUuc2Vzc2lvbixuLnJvdyxuLmNvbHVtbiksaT1yLmdldEN1cnJlbnRUb2tlbigpO2lmKCFpfHwhL1xiKD86dGFnLW9wZW58dGFnLW5hbWUpLy50ZXN0KGkudHlwZSkpe3QucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGw7cmV0dXJufWlmKGkudHlwZS5pbmRleE9mKCJ0YWctb3BlbiIpIT0tMSl7aT1yLnN0ZXBGb3J3YXJkKCk7aWYoIWkpcmV0dXJufXZhciBzPWkudmFsdWUsbz0wLHU9ci5zdGVwQmFja3dhcmQoKTtpZih1LnZhbHVlPT0iPCIpe2RvIHU9aSxpPXIuc3RlcEZvcndhcmQoKSxpJiZpLnZhbHVlPT09cyYmaS50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKHUudmFsdWU9PT0iPCI/bysrOnUudmFsdWU9PT0iPC8iJiZvLS0pO3doaWxlKGkmJm8+PTApfWVsc2V7ZG8gaT11LHU9ci5zdGVwQmFja3dhcmQoKSxpJiZpLnZhbHVlPT09cyYmaS50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKHUudmFsdWU9PT0iPCI/bysrOnUudmFsdWU9PT0iPC8iJiZvLS0pO3doaWxlKHUmJm88PTApO3Iuc3RlcEZvcndhcmQoKX1pZighaSl7dC5yZW1vdmVNYXJrZXIodC4kdGFnSGlnaGxpZ2h0KSx0LiR0YWdIaWdobGlnaHQ9bnVsbDtyZXR1cm59dmFyIGE9ci5nZXRDdXJyZW50VG9rZW5Sb3coKSxmPXIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCksbD1uZXcgcChhLGYsYSxmK2kudmFsdWUubGVuZ3RoKSxjPXQuJGJhY2tNYXJrZXJzW3QuJHRhZ0hpZ2hsaWdodF07dC4kdGFnSGlnaGxpZ2h0JiZjIT11bmRlZmluZWQmJmwuY29tcGFyZVJhbmdlKGMucmFuZ2UpIT09MCYmKHQucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGwpLHQuJHRhZ0hpZ2hsaWdodHx8KHQuJHRhZ0hpZ2hsaWdodD10LmFkZE1hcmtlcihsLCJhY2VfYnJhY2tldCIsInRleHQiKSl9LDUwKX0sdGhpcy5mb2N1cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe2UuaXNGb2N1c2VkKCl8fGUudGV4dElucHV0LmZvY3VzKCl9KSx0aGlzLnRleHRJbnB1dC5mb2N1cygpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRleHRJbnB1dC5pc0ZvY3VzZWQoKX0sdGhpcy5ibHVyPWZ1bmN0aW9uKCl7dGhpcy50ZXh0SW5wdXQuYmx1cigpfSx0aGlzLm9uRm9jdXM9ZnVuY3Rpb24oZSl7aWYodGhpcy4kaXNGb2N1c2VkKXJldHVybjt0aGlzLiRpc0ZvY3VzZWQ9ITAsdGhpcy5yZW5kZXJlci5zaG93Q3Vyc29yKCksdGhpcy5yZW5kZXJlci52aXN1YWxpemVGb2N1cygpLHRoaXMuX2VtaXQoImZvY3VzIixlKX0sdGhpcy5vbkJsdXI9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGlzRm9jdXNlZClyZXR1cm47dGhpcy4kaXNGb2N1c2VkPSExLHRoaXMucmVuZGVyZXIuaGlkZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudmlzdWFsaXplQmx1cigpLHRoaXMuX2VtaXQoImJsdXIiLGUpfSx0aGlzLiRjdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpfSx0aGlzLm9uRG9jdW1lbnRDaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSxuPWUuc3RhcnQucm93PT1lLmVuZC5yb3c/ZS5lbmQucm93OkluZmluaXR5O3RoaXMucmVuZGVyZXIudXBkYXRlTGluZXMoZS5zdGFydC5yb3csbix0KSx0aGlzLl9zaWduYWwoImNoYW5nZSIsZSksdGhpcy4kY3Vyc29yQ2hhbmdlKCksdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpfSx0aGlzLm9uVG9rZW5pemVyVXBkYXRlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKHQuZmlyc3QsdC5sYXN0KX0sdGhpcy5vblNjcm9sbFRvcENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9ZKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSl9LHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zY3JvbGxUb1godGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSl9LHRoaXMub25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JDaGFuZ2UoKSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cygpLHRoaXMuJGhpZ2hsaWdodFRhZ3MoKSx0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2Vzc2lvbigpLHQ7aWYodGhpcy4kaGlnaGxpZ2h0QWN0aXZlTGluZSl7aWYodGhpcy4kc2VsZWN0aW9uU3R5bGUhPSJsaW5lInx8IXRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkpdD10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7dGhpcy5yZW5kZXJlci50aGVtZSYmdGhpcy5yZW5kZXJlci50aGVtZS4kc2VsZWN0aW9uQ29sb3JDb25mbGljdCYmIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmKHQ9ITEpLHRoaXMucmVuZGVyZXIuJG1heExpbmVzJiZ0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCk9PT0xJiYhKHRoaXMucmVuZGVyZXIuJG1pbkxpbmVzPjEpJiYodD0hMSl9aWYoZS4kaGlnaGxpZ2h0TGluZU1hcmtlciYmIXQpZS5yZW1vdmVNYXJrZXIoZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5pZCksZS4kaGlnaGxpZ2h0TGluZU1hcmtlcj1udWxsO2Vsc2UgaWYoIWUuJGhpZ2hsaWdodExpbmVNYXJrZXImJnQpe3ZhciBuPW5ldyBwKHQucm93LHQuY29sdW1uLHQucm93LEluZmluaXR5KTtuLmlkPWUuYWRkTWFya2VyKG4sImFjZV9hY3RpdmUtbGluZSIsInNjcmVlbkxpbmUiKSxlLiRoaWdobGlnaHRMaW5lTWFya2VyPW59ZWxzZSB0JiYoZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5zdGFydC5yb3c9dC5yb3csZS4kaGlnaGxpZ2h0TGluZU1hcmtlci5lbmQucm93PXQucm93LGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuc3RhcnQuY29sdW1uPXQuY29sdW1uLGUuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKX0sdGhpcy5vblNlbGVjdGlvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb247dC4kc2VsZWN0aW9uTWFya2VyJiZ0LnJlbW92ZU1hcmtlcih0LiRzZWxlY3Rpb25NYXJrZXIpLHQuJHNlbGVjdGlvbk1hcmtlcj1udWxsO2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCkscj10aGlzLmdldFNlbGVjdGlvblN0eWxlKCk7dC4kc2VsZWN0aW9uTWFya2VyPXQuYWRkTWFya2VyKG4sImFjZV9zZWxlY3Rpb24iLHIpfWVsc2UgdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpO3ZhciBpPXRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZCYmdGhpcy4kZ2V0U2VsZWN0aW9uSGlnaExpZ2h0UmVnZXhwKCk7dGhpcy5zZXNzaW9uLmhpZ2hsaWdodChpKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRnZXRTZWxlY3Rpb25IaWdoTGlnaHRSZWdleHA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5pc0VtcHR5KCl8fHQuaXNNdWx0aUxpbmUoKSlyZXR1cm47dmFyIG49dC5zdGFydC5jb2x1bW4scj10LmVuZC5jb2x1bW4saT1lLmdldExpbmUodC5zdGFydC5yb3cpLHM9aS5zdWJzdHJpbmcobixyKTtpZihzLmxlbmd0aD41ZTN8fCEvW1x3XGRdLy50ZXN0KHMpKXJldHVybjt2YXIgbz10aGlzLiRzZWFyY2guJGFzc2VtYmxlUmVnRXhwKHt3aG9sZVdvcmQ6ITAsY2FzZVNlbnNpdGl2ZTohMCxuZWVkbGU6c30pLHU9aS5zdWJzdHJpbmcobi0xLHIrMSk7aWYoIW8udGVzdCh1KSlyZXR1cm47cmV0dXJuIG99LHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlRnJvbnRNYXJrZXJzKCl9LHRoaXMub25DaGFuZ2VCYWNrTWFya2VyPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQnJlYWtwb2ludD1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQnJlYWtwb2ludHMoKX0sdGhpcy5vbkNoYW5nZUFubm90YXRpb249ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNldEFubm90YXRpb25zKHRoaXMuc2Vzc2lvbi5nZXRBbm5vdGF0aW9ucygpKX0sdGhpcy5vbkNoYW5nZU1vZGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci51cGRhdGVUZXh0KCksdGhpcy5fZW1pdCgiY2hhbmdlTW9kZSIsZSl9LHRoaXMub25DaGFuZ2VXcmFwTGltaXQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5vbkNoYW5nZVdyYXBNb2RlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZSghMCl9LHRoaXMub25DaGFuZ2VGb2xkPWZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLmdldFNlbGVjdGVkVGV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSl9LHRoaXMuZ2V0Q29weVRleHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGVkVGV4dCgpLHQ9dGhpcy5zZXNzaW9uLmRvYy5nZXROZXdMaW5lQ2hhcmFjdGVyKCksbj0hMTtpZighZSYmdGhpcy4kY29weVdpdGhFbXB0eVNlbGVjdGlvbil7bj0hMDt2YXIgcj10aGlzLnNlbGVjdGlvbi5nZXRBbGxSYW5nZXMoKTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyl7dmFyIHM9cltpXTtpZihpJiZyW2ktMV0uc3RhcnQucm93PT1zLnN0YXJ0LnJvdyljb250aW51ZTtlKz10aGlzLnNlc3Npb24uZ2V0TGluZShzLnN0YXJ0LnJvdykrdH19dmFyIG89e3RleHQ6ZX07cmV0dXJuIHRoaXMuX3NpZ25hbCgiY29weSIsbyksYi5saW5lTW9kZT1uP28udGV4dDoiIixvLnRleHR9LHRoaXMub25Db3B5PWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5leGVjKCJjb3B5Iix0aGlzKX0sdGhpcy5vbkN1dD1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMuZXhlYygiY3V0Iix0aGlzKX0sdGhpcy5vblBhc3RlPWZ1bmN0aW9uKGUsdCl7dmFyIG49e3RleHQ6ZSxldmVudDp0fTt0aGlzLmNvbW1hbmRzLmV4ZWMoInBhc3RlIix0aGlzLG4pfSx0aGlzLiRoYW5kbGVQYXN0ZT1mdW5jdGlvbihlKXt0eXBlb2YgZT09InN0cmluZyImJihlPXt0ZXh0OmV9KSx0aGlzLl9zaWduYWwoInBhc3RlIixlKTt2YXIgdD1lLnRleHQsbj10PT1iLmxpbmVNb2RlLHI9dGhpcy5zZXNzaW9uO2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpbj9yLmluc2VydCh7cm93OnRoaXMuc2VsZWN0aW9uLmxlYWQucm93LGNvbHVtbjowfSx0KTp0aGlzLmluc2VydCh0KTtlbHNlIGlmKG4pdGhpcy5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3IuaW5zZXJ0KHtyb3c6ZS5zdGFydC5yb3csY29sdW1uOjB9LHQpfSk7ZWxzZXt2YXIgaT10LnNwbGl0KC9cclxufFxyfFxuLykscz10aGlzLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLG89aS5sZW5ndGg9PTImJighaVswXXx8IWlbMV0pO2lmKGkubGVuZ3RoIT1zLmxlbmd0aHx8bylyZXR1cm4gdGhpcy5jb21tYW5kcy5leGVjKCJpbnNlcnRzdHJpbmciLHRoaXMsdCk7Zm9yKHZhciB1PXMubGVuZ3RoO3UtLTspe3ZhciBhPXNbdV07YS5pc0VtcHR5KCl8fHIucmVtb3ZlKGEpLHIuaW5zZXJ0KGEuc3RhcnQsaVt1XSl9fX0sdGhpcy5leGVjQ29tbWFuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbW1hbmRzLmV4ZWMoZSx0aGlzLHQpfSx0aGlzLmluc2VydD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbixyPW4uZ2V0TW9kZSgpLGk9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSYmIXQpe3ZhciBzPXIudHJhbnNmb3JtQWN0aW9uKG4uZ2V0U3RhdGUoaS5yb3cpLCJpbnNlcnRpb24iLHRoaXMsbixlKTtzJiYoZSE9PXMudGV4dCYmKHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZXx8KHRoaXMuc2Vzc2lvbi5tZXJnZVVuZG9EZWx0YXM9ITEsdGhpcy5tZXJnZU5leHRDb21tYW5kPSExKSksZT1zLnRleHQpfWU9PSIJIiYmKGU9dGhpcy5zZXNzaW9uLmdldFRhYlN0cmluZygpKTtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgbz10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aT10aGlzLnNlc3Npb24ucmVtb3ZlKG8pLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX1lbHNlIGlmKHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZS5pbmRleE9mKCJcbiIpPT0tMSl7dmFyIG89bmV3IHAuZnJvbVBvaW50cyhpLGkpO28uZW5kLmNvbHVtbis9ZS5sZW5ndGgsdGhpcy5zZXNzaW9uLnJlbW92ZShvKX1pZihlPT0iXG4ifHxlPT0iXHJcbiIpe3ZhciB1PW4uZ2V0TGluZShpLnJvdyk7aWYoaS5jb2x1bW4+dS5zZWFyY2goL1xTfCQvKSl7dmFyIGE9dS5zdWJzdHIoaS5jb2x1bW4pLnNlYXJjaCgvXFN8JC8pO24uZG9jLnJlbW92ZUluTGluZShpLnJvdyxpLmNvbHVtbixpLmNvbHVtbithKX19dGhpcy5jbGVhclNlbGVjdGlvbigpO3ZhciBmPWkuY29sdW1uLGw9bi5nZXRTdGF0ZShpLnJvdyksdT1uLmdldExpbmUoaS5yb3cpLGM9ci5jaGVja091dGRlbnQobCx1LGUpO24uaW5zZXJ0KGksZSkscyYmcy5zZWxlY3Rpb24mJihzLnNlbGVjdGlvbi5sZW5ndGg9PTI/dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IHAoaS5yb3csZitzLnNlbGVjdGlvblswXSxpLnJvdyxmK3Muc2VsZWN0aW9uWzFdKSk6dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobmV3IHAoaS5yb3crcy5zZWxlY3Rpb25bMF0scy5zZWxlY3Rpb25bMV0saS5yb3crcy5zZWxlY3Rpb25bMl0scy5zZWxlY3Rpb25bM10pKSk7aWYobi5nZXREb2N1bWVudCgpLmlzTmV3TGluZShlKSl7dmFyIGg9ci5nZXROZXh0TGluZUluZGVudChsLHUuc2xpY2UoMCxpLmNvbHVtbiksbi5nZXRUYWJTdHJpbmcoKSk7bi5pbnNlcnQoe3JvdzppLnJvdysxLGNvbHVtbjowfSxoKX1jJiZyLmF1dG9PdXRkZW50KGwsbixpLnJvdyl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oZSx0KXtpZighdClyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLm9uVGV4dElucHV0KGUpO3RoaXMuc3RhcnRPcGVyYXRpb24oe2NvbW1hbmQ6e25hbWU6Imluc2VydHN0cmluZyJ9fSk7dmFyIG49dGhpcy5hcHBseUNvbXBvc2l0aW9uLmJpbmQodGhpcyxlLHQpO3RoaXMuc2VsZWN0aW9uLnJhbmdlQ291bnQ/dGhpcy5mb3JFYWNoU2VsZWN0aW9uKG4pOm4oKSx0aGlzLmVuZE9wZXJhdGlvbigpfSx0aGlzLmFwcGx5Q29tcG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZih0LmV4dGVuZExlZnR8fHQuZXh0ZW5kUmlnaHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7bi5zdGFydC5jb2x1bW4tPXQuZXh0ZW5kTGVmdCxuLmVuZC5jb2x1bW4rPXQuZXh0ZW5kUmlnaHQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UobiksIWUmJiFuLmlzRW1wdHkoKSYmdGhpcy5yZW1vdmUoKX0oZXx8IXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSkmJnRoaXMuaW5zZXJ0KGUsITApO2lmKHQucmVzdG9yZVN0YXJ0fHx0LnJlc3RvcmVFbmQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7bi5zdGFydC5jb2x1bW4tPXQucmVzdG9yZVN0YXJ0LG4uZW5kLmNvbHVtbi09dC5yZXN0b3JlRW5kLHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG4pfX0sdGhpcy5vbkNvbW1hbmRLZXk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmtleUJpbmRpbmcub25Db21tYW5kS2V5KGUsdCxuKX0sdGhpcy5zZXRPdmVyd3JpdGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldE92ZXJ3cml0ZShlKX0sdGhpcy5nZXRPdmVyd3JpdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpfSx0aGlzLnRvZ2dsZU92ZXJ3cml0ZT1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi50b2dnbGVPdmVyd3JpdGUoKX0sdGhpcy5zZXRTY3JvbGxTcGVlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2Nyb2xsU3BlZWQiLGUpfSx0aGlzLmdldFNjcm9sbFNwZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzY3JvbGxTcGVlZCIpfSx0aGlzLnNldERyYWdEZWxheT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZHJhZ0RlbGF5IixlKX0sdGhpcy5nZXREcmFnRGVsYXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImRyYWdEZWxheSIpfSx0aGlzLnNldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzZWxlY3Rpb25TdHlsZSIsZSl9LHRoaXMuZ2V0U2VsZWN0aW9uU3R5bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNlbGVjdGlvblN0eWxlIil9LHRoaXMuc2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0QWN0aXZlTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0QWN0aXZlTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0QWN0aXZlTGluZSIpfSx0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiKX0sdGhpcy5zZXRIaWdobGlnaHRTZWxlY3RlZFdvcmQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodFNlbGVjdGVkV29yZCIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhpZ2hsaWdodFNlbGVjdGVkV29yZH0sdGhpcy5zZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldEFuaW1hdGVkU2Nyb2xsKGUpfSx0aGlzLmdldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0QW5pbWF0ZWRTY3JvbGwoKX0sdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFNob3dJbnZpc2libGVzKGUpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd0ludmlzaWJsZXMoKX0sdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0RGlzcGxheUluZGVudEd1aWRlcyhlKX0sdGhpcy5nZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0RGlzcGxheUluZGVudEd1aWRlcygpfSx0aGlzLnNldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFNob3dQcmludE1hcmdpbihlKX0sdGhpcy5nZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRTaG93UHJpbnRNYXJnaW4oKX0sdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldFByaW50TWFyZ2luQ29sdW1uKGUpfSx0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0UHJpbnRNYXJnaW5Db2x1bW4oKX0sdGhpcy5zZXRSZWFkT25seT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigicmVhZE9ubHkiLGUpfSx0aGlzLmdldFJlYWRPbmx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJyZWFkT25seSIpfSx0aGlzLnNldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJiZWhhdmlvdXJzRW5hYmxlZCIsZSl9LHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImJlaGF2aW91cnNFbmFibGVkIil9LHRoaXMuc2V0V3JhcEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJ3cmFwQmVoYXZpb3Vyc0VuYWJsZWQiLGUpfSx0aGlzLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigid3JhcEJlaGF2aW91cnNFbmFibGVkIil9LHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93Rm9sZFdpZGdldHMiLGUpfSx0aGlzLmdldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0ZvbGRXaWRnZXRzIil9LHRoaXMuc2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiLGUpfSx0aGlzLmdldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmKGU9PSJsZWZ0Ij90aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCk6dGhpcy5zZWxlY3Rpb24uc2VsZWN0UmlnaHQoKSk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHRoaXMuZ2V0QmVoYXZpb3Vyc0VuYWJsZWQoKSl7dmFyIG49dGhpcy5zZXNzaW9uLHI9bi5nZXRTdGF0ZSh0LnN0YXJ0LnJvdyksaT1uLmdldE1vZGUoKS50cmFuc2Zvcm1BY3Rpb24ociwiZGVsZXRpb24iLHRoaXMsbix0KTtpZih0LmVuZC5jb2x1bW49PT0wKXt2YXIgcz1uLmdldFRleHRSYW5nZSh0KTtpZihzW3MubGVuZ3RoLTFdPT0iXG4iKXt2YXIgbz1uLmdldExpbmUodC5lbmQucm93KTsvXlxzKyQvLnRlc3QobykmJih0LmVuZC5jb2x1bW49by5sZW5ndGgpfX1pJiYodD1pKX10aGlzLnNlc3Npb24ucmVtb3ZlKHQpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRSaWdodCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmRMZWZ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGluZVN0YXJ0KCksdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMZWZ0KCksdGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZW1vdmVUb0xpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVFbmQoKTt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7ZS5zdGFydC5jb2x1bW49PWUuZW5kLmNvbHVtbiYmZS5zdGFydC5yb3c9PWUuZW5kLnJvdyYmKGUuZW5kLmNvbHVtbj0wLGUuZW5kLnJvdysrKSx0aGlzLnNlc3Npb24ucmVtb3ZlKGUpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5zcGxpdExpbmU9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCl8fCh0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpKTt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCk7dGhpcy5pbnNlcnQoIlxuIiksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihlKX0sdGhpcy50cmFuc3Bvc2VMZXR0ZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSlyZXR1cm47dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHQ9ZS5jb2x1bW47aWYodD09PTApcmV0dXJuO3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUucm93KSxyLGk7dDxuLmxlbmd0aD8ocj1uLmNoYXJBdCh0KStuLmNoYXJBdCh0LTEpLGk9bmV3IHAoZS5yb3csdC0xLGUucm93LHQrMSkpOihyPW4uY2hhckF0KHQtMSkrbi5jaGFyQXQodC0yKSxpPW5ldyBwKGUucm93LHQtMixlLnJvdyx0KSksdGhpcy5zZXNzaW9uLnJlcGxhY2UoaSxyKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKGkuZW5kKX0sdGhpcy50b0xvd2VyQ2FzZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKHQsbi50b0xvd2VyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKX0sdGhpcy50b1VwcGVyQ2FzZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKHQsbi50b1VwcGVyQ2FzZSgpKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShlKX0sdGhpcy5pbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7aWYodC5zdGFydC5yb3c8dC5lbmQucm93KXt2YXIgbj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTtlLmluZGVudFJvd3Mobi5maXJzdCxuLmxhc3QsIgkiKTtyZXR1cm59aWYodC5zdGFydC5jb2x1bW48dC5lbmQuY29sdW1uKXt2YXIgcj1lLmdldFRleHRSYW5nZSh0KTtpZighL15ccyskLy50ZXN0KHIpKXt2YXIgbj10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTtlLmluZGVudFJvd3Mobi5maXJzdCxuLmxhc3QsIgkiKTtyZXR1cm59fXZhciBpPWUuZ2V0TGluZSh0LnN0YXJ0LnJvdyksbz10LnN0YXJ0LHU9ZS5nZXRUYWJTaXplKCksYT1lLmRvY3VtZW50VG9TY3JlZW5Db2x1bW4oby5yb3csby5jb2x1bW4pO2lmKHRoaXMuc2Vzc2lvbi5nZXRVc2VTb2Z0VGFicygpKXZhciBmPXUtYSV1LGw9cy5zdHJpbmdSZXBlYXQoIiAiLGYpO2Vsc2V7dmFyIGY9YSV1O3doaWxlKGlbdC5zdGFydC5jb2x1bW4tMV09PSIgIiYmZil0LnN0YXJ0LmNvbHVtbi0tLGYtLTt0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZSh0KSxsPSIJIn1yZXR1cm4gdGhpcy5pbnNlcnQobCl9LHRoaXMuYmxvY2tJbmRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKTt0aGlzLnNlc3Npb24uaW5kZW50Um93cyhlLmZpcnN0LGUubGFzdCwiCSIpfSx0aGlzLmJsb2NrT3V0ZGVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTZWxlY3Rpb24oKTt0aGlzLnNlc3Npb24ub3V0ZGVudFJvd3MoZS5nZXRSYW5nZSgpKX0sdGhpcy5zb3J0TGluZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRnZXRTZWxlY3RlZFJvd3MoKSx0PXRoaXMuc2Vzc2lvbixuPVtdO2Zvcih2YXIgcj1lLmZpcnN0O3I8PWUubGFzdDtyKyspbi5wdXNoKHQuZ2V0TGluZShyKSk7bi5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6ZS50b0xvd2VyQ2FzZSgpPnQudG9Mb3dlckNhc2UoKT8xOjB9KTt2YXIgaT1uZXcgcCgwLDAsMCwwKTtmb3IodmFyIHI9ZS5maXJzdDtyPD1lLmxhc3Q7cisrKXt2YXIgcz10LmdldExpbmUocik7aS5zdGFydC5yb3c9cixpLmVuZC5yb3c9cixpLmVuZC5jb2x1bW49cy5sZW5ndGgsdC5yZXBsYWNlKGksbltyLWUuZmlyc3RdKX19LHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFN0YXRlKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKS5yb3cpLHQ9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVDb21tZW50TGluZXMoZSx0aGlzLnNlc3Npb24sdC5maXJzdCx0Lmxhc3QpfSx0aGlzLnRvZ2dsZUJsb2NrQ29tbWVudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSx0PXRoaXMuc2Vzc2lvbi5nZXRTdGF0ZShlLnJvdyksbj10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZXNzaW9uLmdldE1vZGUoKS50b2dnbGVCbG9ja0NvbW1lbnQodCx0aGlzLnNlc3Npb24sbixlKX0sdGhpcy5nZXROdW1iZXJBdD1mdW5jdGlvbihlLHQpe3ZhciBuPS9bXC1dP1swLTldKyg/OlwuWzAtOV0rKT8vZztuLmxhc3RJbmRleD0wO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGUpO3doaWxlKG4ubGFzdEluZGV4PHQpe3ZhciBpPW4uZXhlYyhyKTtpZihpLmluZGV4PD10JiZpLmluZGV4K2lbMF0ubGVuZ3RoPj10KXt2YXIgcz17dmFsdWU6aVswXSxzdGFydDppLmluZGV4LGVuZDppLmluZGV4K2lbMF0ubGVuZ3RofTtyZXR1cm4gc319cmV0dXJuIG51bGx9LHRoaXMubW9kaWZ5TnVtYmVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLnJvdyxuPXRoaXMuc2VsZWN0aW9uLmdldEN1cnNvcigpLmNvbHVtbixyPW5ldyBwKHQsbi0xLHQsbiksaT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHIpO2lmKCFpc05hTihwYXJzZUZsb2F0KGkpKSYmaXNGaW5pdGUoaSkpe3ZhciBzPXRoaXMuZ2V0TnVtYmVyQXQodCxuKTtpZihzKXt2YXIgbz1zLnZhbHVlLmluZGV4T2YoIi4iKT49MD9zLnN0YXJ0K3MudmFsdWUuaW5kZXhPZigiLiIpKzE6cy5lbmQsdT1zLnN0YXJ0K3MudmFsdWUubGVuZ3RoLW8sYT1wYXJzZUZsb2F0KHMudmFsdWUpO2EqPU1hdGgucG93KDEwLHUpLG8hPT1zLmVuZCYmbjxvP2UqPU1hdGgucG93KDEwLHMuZW5kLW4tMSk6ZSo9TWF0aC5wb3coMTAscy5lbmQtbiksYSs9ZSxhLz1NYXRoLnBvdygxMCx1KTt2YXIgZj1hLnRvRml4ZWQodSksbD1uZXcgcCh0LHMuc3RhcnQsdCxzLmVuZCk7dGhpcy5zZXNzaW9uLnJlcGxhY2UobCxmKSx0aGlzLm1vdmVDdXJzb3JUbyh0LE1hdGgubWF4KHMuc3RhcnQrMSxuK2YubGVuZ3RoLXMudmFsdWUubGVuZ3RoKSl9fWVsc2UgdGhpcy50b2dnbGVXb3JkKCl9LHRoaXMuJHRvZ2dsZVdvcmRQYWlycz1bWyJmaXJzdCIsImxhc3QiXSxbInRydWUiLCJmYWxzZSJdLFsieWVzIiwibm8iXSxbIndpZHRoIiwiaGVpZ2h0Il0sWyJ0b3AiLCJib3R0b20iXSxbInJpZ2h0IiwibGVmdCJdLFsib24iLCJvZmYiXSxbIngiLCJ5Il0sWyJnZXQiLCJzZXQiXSxbIm1heCIsIm1pbiJdLFsiaG9yaXpvbnRhbCIsInZlcnRpY2FsIl0sWyJzaG93IiwiaGlkZSJdLFsiYWRkIiwicmVtb3ZlIl0sWyJ1cCIsImRvd24iXSxbImJlZm9yZSIsImFmdGVyIl0sWyJldmVuIiwib2RkIl0sWyJpbnNpZGUiLCJvdXRzaWRlIl0sWyJuZXh0IiwicHJldmlvdXMiXSxbImluY3JlYXNlIiwiZGVjcmVhc2UiXSxbImF0dGFjaCIsImRldGFjaCJdLFsiJiYiLCJ8fCJdLFsiPT0iLCIhPSJdXSx0aGlzLnRvZ2dsZVdvcmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3csdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5jb2x1bW47dGhpcy5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO3ZhciBuPXRoaXMuZ2V0U2VsZWN0ZWRUZXh0KCkscj10aGlzLnNlbGVjdGlvbi5nZXRXb3JkUmFuZ2UoKS5zdGFydC5jb2x1bW4saT1uLnJlcGxhY2UoLyhbYS16XSt8W0EtWl0rKSg/PVtBLVpfXXwkKS9nLCIkMSAiKS5zcGxpdCgvXHMvKSxvPXQtci0xO288MCYmKG89MCk7dmFyIHU9MCxhPTAsZj10aGlzO24ubWF0Y2goL1tBLVphLXowLTlfXSsvKSYmaS5mb3JFYWNoKGZ1bmN0aW9uKHQsaSl7YT11K3QubGVuZ3RoLG8+PXUmJm88PWEmJihuPXQsZi5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSxmLm1vdmVDdXJzb3JUbyhlLHUrciksZi5zZWxlY3Rpb24uc2VsZWN0VG8oZSxhK3IpKSx1PWF9KTt2YXIgbD10aGlzLiR0b2dnbGVXb3JkUGFpcnMsYztmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyl7dmFyIHA9bFtoXTtmb3IodmFyIGQ9MDtkPD0xO2QrKyl7dmFyIHY9KyFkLG09bi5tYXRjaChuZXcgUmVnRXhwKCJeXFxzP18/KCIrcy5lc2NhcGVSZWdFeHAocFtkXSkrIilcXHM/JCIsImkiKSk7aWYobSl7dmFyIGc9bi5tYXRjaChuZXcgUmVnRXhwKCIoW19dfF58XFxzKSgiK3MuZXNjYXBlUmVnRXhwKG1bMV0pKyIpKCR8XFxzKSIsImciKSk7ZyYmKGM9bi5yZXBsYWNlKG5ldyBSZWdFeHAocy5lc2NhcGVSZWdFeHAocFtkXSksImkiKSxmdW5jdGlvbihlKXt2YXIgdD1wW3ZdO3JldHVybiBlLnRvVXBwZXJDYXNlKCk9PWU/dD10LnRvVXBwZXJDYXNlKCk6ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKT09ZS5jaGFyQXQoMCkmJih0PXQuc3Vic3RyKDAsMCkrcFt2XS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cigxKSksdH0pLHRoaXMuaW5zZXJ0KGMpLGM9IiIpfX19fSx0aGlzLnJlbW92ZUxpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLnJlbW92ZUZ1bGxMaW5lcyhlLmZpcnN0LGUubGFzdCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLmR1cGxpY2F0ZVNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2VsZWN0aW9uLHQ9dGhpcy5zZXNzaW9uLG49ZS5nZXRSYW5nZSgpLHI9ZS5pc0JhY2t3YXJkcygpO2lmKG4uaXNFbXB0eSgpKXt2YXIgaT1uLnN0YXJ0LnJvdzt0LmR1cGxpY2F0ZUxpbmVzKGksaSl9ZWxzZXt2YXIgcz1yP24uc3RhcnQ6bi5lbmQsbz10Lmluc2VydChzLHQuZ2V0VGV4dFJhbmdlKG4pLCExKTtuLnN0YXJ0PXMsbi5lbmQ9byxlLnNldFNlbGVjdGlvblJhbmdlKG4scil9fSx0aGlzLm1vdmVMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoMSwhMSl9LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoLTEsITEpfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5zZXNzaW9uLm1vdmVUZXh0KGUsdCxuKX0sdGhpcy5jb3B5TGluZXNVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygtMSwhMCl9LHRoaXMuY29weUxpbmVzRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVMaW5lcygxLCEwKX0sdGhpcy4kbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7dmFyIG4scixpPXRoaXMuc2VsZWN0aW9uO2lmKCFpLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciBzPWkudG9PcmllbnRlZFJhbmdlKCk7bj10aGlzLiRnZXRTZWxlY3RlZFJvd3Mocykscj10aGlzLnNlc3Npb24uJG1vdmVMaW5lcyhuLmZpcnN0LG4ubGFzdCx0PzA6ZSksdCYmZT09LTEmJihyPTApLHMubW92ZUJ5KHIsMCksaS5mcm9tT3JpZW50ZWRSYW5nZShzKX1lbHNle3ZhciBvPWkucmFuZ2VMaXN0LnJhbmdlcztpLnJhbmdlTGlzdC5kZXRhY2godGhpcy5zZXNzaW9uKSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITA7dmFyIHU9MCxhPTAsZj1vLmxlbmd0aDtmb3IodmFyIGw9MDtsPGY7bCsrKXt2YXIgYz1sO29bbF0ubW92ZUJ5KHUsMCksbj10aGlzLiRnZXRTZWxlY3RlZFJvd3Mob1tsXSk7dmFyIGg9bi5maXJzdCxwPW4ubGFzdDt3aGlsZSgrK2w8Zil7YSYmb1tsXS5tb3ZlQnkoYSwwKTt2YXIgZD10aGlzLiRnZXRTZWxlY3RlZFJvd3Mob1tsXSk7aWYodCYmZC5maXJzdCE9cClicmVhaztpZighdCYmZC5maXJzdD5wKzEpYnJlYWs7cD1kLmxhc3R9bC0tLHU9dGhpcy5zZXNzaW9uLiRtb3ZlTGluZXMoaCxwLHQ/MDplKSx0JiZlPT0tMSYmKGM9bCsxKTt3aGlsZShjPD1sKW9bY10ubW92ZUJ5KHUsMCksYysrO3R8fCh1PTApLGErPXV9aS5mcm9tT3JpZW50ZWRSYW5nZShpLnJhbmdlc1swXSksaS5yYW5nZUxpc3QuYXR0YWNoKHRoaXMuc2Vzc2lvbiksdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExfX0sdGhpcy4kZ2V0U2VsZWN0ZWRSb3dzPWZ1bmN0aW9uKGUpe3JldHVybiBlPShlfHx0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLmNvbGxhcHNlUm93cygpLHtmaXJzdDp0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZFN0YXJ0KGUuc3RhcnQucm93KSxsYXN0OnRoaXMuc2Vzc2lvbi5nZXRSb3dGb2xkRW5kKGUuZW5kLnJvdyl9fSx0aGlzLm9uQ29tcG9zaXRpb25TdGFydD1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNob3dDb21wb3NpdGlvbihlKX0sdGhpcy5vbkNvbXBvc2l0aW9uVXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2V0Q29tcG9zaXRpb25UZXh0KGUpfSx0aGlzLm9uQ29tcG9zaXRpb25FbmQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmhpZGVDb21wb3NpdGlvbigpfSx0aGlzLmdldEZpcnN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldEZpcnN0VmlzaWJsZVJvdygpfSx0aGlzLmdldExhc3RWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd1Zpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuZ2V0Rmlyc3RWaXNpYmxlUm93KCkmJmU8PXRoaXMuZ2V0TGFzdFZpc2libGVSb3coKX0sdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gZT49dGhpcy5yZW5kZXJlci5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdygpJiZlPD10aGlzLnJlbmRlcmVyLmdldExhc3RGdWxseVZpc2libGVSb3coKX0sdGhpcy4kZ2V0VmlzaWJsZVJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsQm90dG9tUm93KCktdGhpcy5yZW5kZXJlci5nZXRTY3JvbGxUb3BSb3coKSsxfSx0aGlzLiRtb3ZlQnlQYWdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZW5kZXJlcixyPXRoaXMucmVuZGVyZXIubGF5ZXJDb25maWcsaT1lKk1hdGguZmxvb3Ioci5oZWlnaHQvci5saW5lSGVpZ2h0KTt0PT09ITA/dGhpcy5zZWxlY3Rpb24uJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeShpLDApfSk6dD09PSExJiYodGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KGksMCksdGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSk7dmFyIHM9bi5zY3JvbGxUb3A7bi5zY3JvbGxCeSgwLGkqci5saW5lSGVpZ2h0KSx0IT1udWxsJiZuLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpLG4uYW5pbWF0ZVNjcm9sbGluZyhzKX0sdGhpcy5zZWxlY3RQYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSwhMCl9LHRoaXMuc2VsZWN0UGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSwhMCl9LHRoaXMuZ290b1BhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxLCExKX0sdGhpcy5nb3RvUGFnZVVwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgtMSwhMSl9LHRoaXMuc2Nyb2xsUGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEpfSx0aGlzLnNjcm9sbFBhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEpfSx0aGlzLnNjcm9sbFRvUm93PWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9Sb3coZSl9LHRoaXMuc2Nyb2xsVG9MaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9MaW5lKGUsdCxuLHIpfSx0aGlzLmNlbnRlclNlbGVjdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSx0PXtyb3c6TWF0aC5mbG9vcihlLnN0YXJ0LnJvdysoZS5lbmQucm93LWUuc3RhcnQucm93KS8yKSxjb2x1bW46TWF0aC5mbG9vcihlLnN0YXJ0LmNvbHVtbisoZS5lbmQuY29sdW1uLWUuc3RhcnQuY29sdW1uKS8yKX07dGhpcy5yZW5kZXJlci5hbGlnbkN1cnNvcih0LC41KX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKX0sdGhpcy5nZXRDdXJzb3JQb3NpdGlvblNjcmVlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSl9LHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKX0sdGhpcy5zZWxlY3RBbGw9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5zZWxlY3RBbGwoKX0sdGhpcy5jbGVhclNlbGVjdGlvbj1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubW92ZUN1cnNvclRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMuanVtcFRvTWF0Y2hpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgeSh0aGlzLnNlc3Npb24sbi5yb3csbi5jb2x1bW4pLGk9ci5nZXRDdXJyZW50VG9rZW4oKSxzPWl8fHIuc3RlcEZvcndhcmQoKTtpZighcylyZXR1cm47dmFyIG8sdT0hMSxhPXt9LGY9bi5jb2x1bW4tcy5zdGFydCxsLGM9eyIpIjoiKCIsIigiOiIoIiwiXSI6IlsiLCJbIjoiWyIsInsiOiJ7IiwifSI6InsifTtkb3tpZihzLnZhbHVlLm1hdGNoKC9be30oKVxbXF1dL2cpKWZvcig7ZjxzLnZhbHVlLmxlbmd0aCYmIXU7ZisrKXtpZighY1tzLnZhbHVlW2ZdXSljb250aW51ZTtsPWNbcy52YWx1ZVtmXV0rIi4iK3MudHlwZS5yZXBsYWNlKCJycGFyZW4iLCJscGFyZW4iKSxpc05hTihhW2xdKSYmKGFbbF09MCk7c3dpdGNoKHMudmFsdWVbZl0pe2Nhc2UiKCI6Y2FzZSJbIjpjYXNlInsiOmFbbF0rKzticmVhaztjYXNlIikiOmNhc2UiXSI6Y2FzZSJ9IjphW2xdLS0sYVtsXT09PS0xJiYobz0iYnJhY2tldCIsdT0hMCl9fWVsc2Ugcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikhPT0tMSYmKGlzTmFOKGFbcy52YWx1ZV0pJiYoYVtzLnZhbHVlXT0wKSxpLnZhbHVlPT09IjwiP2Fbcy52YWx1ZV0rKzppLnZhbHVlPT09IjwvIiYmYVtzLnZhbHVlXS0tLGFbcy52YWx1ZV09PT0tMSYmKG89InRhZyIsdT0hMCkpO3V8fChpPXMscz1yLnN0ZXBGb3J3YXJkKCksZj0wKX13aGlsZShzJiYhdSk7aWYoIW8pcmV0dXJuO3ZhciBoLGQ7aWYobz09PSJicmFja2V0Iil7aD10aGlzLnNlc3Npb24uZ2V0QnJhY2tldFJhbmdlKG4pO2lmKCFoKXtoPW5ldyBwKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStmLTEsci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpK2YtMSksZD1oLnN0YXJ0O2lmKHR8fGQucm93PT09bi5yb3cmJk1hdGguYWJzKGQuY29sdW1uLW4uY29sdW1uKTwyKWg9dGhpcy5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShkKX19ZWxzZSBpZihvPT09InRhZyIpe2lmKCFzfHxzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKT09PS0xKXJldHVybjt2YXIgdj1zLnZhbHVlO2g9bmV3IHAoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIsci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIpO2lmKGguY29tcGFyZShuLnJvdyxuLmNvbHVtbik9PT0wKXt1PSExO2RvIHM9aSxpPXIuc3RlcEJhY2t3YXJkKCksaSYmKGkudHlwZS5pbmRleE9mKCJ0YWctY2xvc2UiKSE9PS0xJiZoLnNldEVuZChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrMSkscy52YWx1ZT09PXYmJnMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJihpLnZhbHVlPT09IjwiP2Fbdl0rKzppLnZhbHVlPT09IjwvIiYmYVt2XS0tLGFbdl09PT0wJiYodT0hMCkpKTt3aGlsZShpJiYhdSl9cyYmcy50eXBlLmluZGV4T2YoInRhZy1uYW1lIikmJihkPWguc3RhcnQsZC5yb3c9PW4ucm93JiZNYXRoLmFicyhkLmNvbHVtbi1uLmNvbHVtbik8MiYmKGQ9aC5lbmQpKX1kPWgmJmguY3Vyc29yfHxkLGQmJihlP2gmJnQ/dGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UoaCk6aCYmaC5pc0VxdWFsKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSk/dGhpcy5jbGVhclNlbGVjdGlvbigpOnRoaXMuc2VsZWN0aW9uLnNlbGVjdFRvKGQucm93LGQuY29sdW1uKTp0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oZC5yb3csZC5jb2x1bW4pKX0sdGhpcy5nb3RvTGluZT1mdW5jdGlvbihlLHQsbil7dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlc3Npb24udW5mb2xkKHtyb3c6ZS0xLGNvbHVtbjp0fHwwfSksdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlJiZ0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSx0aGlzLm1vdmVDdXJzb3JUbyhlLTEsdHx8MCksdGhpcy5pc1Jvd0Z1bGx5VmlzaWJsZShlLTEpfHx0aGlzLnNjcm9sbFRvTGluZShlLTEsITAsbil9LHRoaXMubmF2aWdhdGVUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9uLm1vdmVUbyhlLHQpfSx0aGlzLm5hdmlnYXRlVXA9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSYmIXRoaXMuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCkpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmFuY2hvci5nZXRQb3NpdGlvbigpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfXRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KC1lfHwtMSwwKX0sdGhpcy5uYXZpZ2F0ZURvd249ZnVuY3Rpb24oZSl7aWYodGhpcy5zZWxlY3Rpb24uaXNNdWx0aUxpbmUoKSYmdGhpcy5zZWxlY3Rpb24uaXNCYWNrd2FyZHMoKSl7dmFyIHQ9dGhpcy5zZWxlY3Rpb24uYW5jaG9yLmdldFBvc2l0aW9uKCk7cmV0dXJuIHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9dGhpcy5zZWxlY3Rpb24uY2xlYXJTZWxlY3Rpb24oKSx0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yQnkoZXx8MSwwKX0sdGhpcy5uYXZpZ2F0ZUxlZnQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLnN0YXJ0O3RoaXMubW92ZUN1cnNvclRvUG9zaXRpb24odCl9ZWxzZXtlPWV8fDE7d2hpbGUoZS0tKXRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMZWZ0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlUmlnaHQ9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLmVuZDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfWVsc2V7ZT1lfHwxO3doaWxlKGUtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yUmlnaHQoKX10aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZVN0YXJ0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JMaW5lRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZUVuZD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlRW5kKCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckZpbGVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVdvcmRSaWdodD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkUmlnaHQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkTGVmdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JXb3JkTGVmdCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5yZXBsYWNlPWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy4kc2VhcmNoLnNldCh0KTt2YXIgbj10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pLHI9MDtyZXR1cm4gbj8odGhpcy4kdHJ5UmVwbGFjZShuLGUpJiYocj0xKSx0aGlzLnNlbGVjdGlvbi5zZXRTZWxlY3Rpb25SYW5nZShuKSx0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KG4uc3RhcnQsbi5lbmQpLHIpOnJ9LHRoaXMucmVwbGFjZUFsbD1mdW5jdGlvbihlLHQpe3QmJnRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIG49dGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKSxyPTA7aWYoIW4ubGVuZ3RoKXJldHVybiByO3ZhciBpPXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTt0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oMCwwKTtmb3IodmFyIHM9bi5sZW5ndGgtMTtzPj0wOy0tcyl0aGlzLiR0cnlSZXBsYWNlKG5bc10sZSkmJnIrKztyZXR1cm4gdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoaSkscn0sdGhpcy4kdHJ5UmVwbGFjZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoZSk7cmV0dXJuIHQ9dGhpcy4kc2VhcmNoLnJlcGxhY2Uobix0KSx0IT09bnVsbD8oZS5lbmQ9dGhpcy5zZXNzaW9uLnJlcGxhY2UoZSx0KSxlKTpudWxsfSx0aGlzLmdldExhc3RTZWFyY2hPcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlYXJjaC5nZXRPcHRpb25zKCl9LHRoaXMuZmluZD1mdW5jdGlvbihlLHQsbil7dHx8KHQ9e30pLHR5cGVvZiBlPT0ic3RyaW5nInx8ZSBpbnN0YW5jZW9mIFJlZ0V4cD90Lm5lZWRsZT1lOnR5cGVvZiBlPT0ib2JqZWN0IiYmci5taXhpbih0LGUpO3ZhciBpPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5uZWVkbGU9PW51bGwmJihlPXRoaXMuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoaSl8fHRoaXMuJHNlYXJjaC4kb3B0aW9ucy5uZWVkbGUsZXx8KGk9dGhpcy5zZXNzaW9uLmdldFdvcmRSYW5nZShpLnN0YXJ0LnJvdyxpLnN0YXJ0LmNvbHVtbiksZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGkpKSx0aGlzLiRzZWFyY2guc2V0KHtuZWVkbGU6ZX0pKSx0aGlzLiRzZWFyY2guc2V0KHQpLHQuc3RhcnR8fHRoaXMuJHNlYXJjaC5zZXQoe3N0YXJ0Oml9KTt2YXIgcz10aGlzLiRzZWFyY2guZmluZCh0aGlzLnNlc3Npb24pO2lmKHQucHJldmVudFNjcm9sbClyZXR1cm4gcztpZihzKXJldHVybiB0aGlzLnJldmVhbFJhbmdlKHMsbiksczt0LmJhY2t3YXJkcz9pLnN0YXJ0PWkuZW5kOmkuZW5kPWkuc3RhcnQsdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2UoaSl9LHRoaXMuZmluZE5leHQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmZpbmQoe3NraXBDdXJyZW50OiEwLGJhY2t3YXJkczohMX0sZSx0KX0sdGhpcy5maW5kUHJldmlvdXM9ZnVuY3Rpb24oZSx0KXt0aGlzLmZpbmQoZSx7c2tpcEN1cnJlbnQ6ITAsYmFja3dhcmRzOiEwfSx0KX0sdGhpcy5yZXZlYWxSYW5nZT1mdW5jdGlvbihlLHQpe3RoaXMuc2Vzc2lvbi51bmZvbGQoZSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSk7dmFyIG49dGhpcy5yZW5kZXJlci5zY3JvbGxUb3A7dGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyhlLnN0YXJ0LGUuZW5kLC41KSx0IT09ITEmJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyhuKX0sdGhpcy51bmRvPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkudW5kbyh0aGlzLnNlc3Npb24pLHRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSl9LHRoaXMucmVkbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnJlZG8odGhpcy5zZXNzaW9uKSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLmRlc3Ryb3koKSx0aGlzLl9zaWduYWwoImRlc3Ryb3kiLHRoaXMpLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmRlc3Ryb3koKX0sdGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO3ZhciB0LG49dGhpcyxyPSExO3RoaXMuJHNjcm9sbEFuY2hvcnx8KHRoaXMuJHNjcm9sbEFuY2hvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7dmFyIGk9dGhpcy4kc2Nyb2xsQW5jaG9yO2kuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGUiLHRoaXMuY29udGFpbmVyLmluc2VydEJlZm9yZShpLHRoaXMuY29udGFpbmVyLmZpcnN0Q2hpbGQpO3ZhciBzPXRoaXMub24oImNoYW5nZVNlbGVjdGlvbiIsZnVuY3Rpb24oKXtyPSEwfSksbz10aGlzLnJlbmRlcmVyLm9uKCJiZWZvcmVSZW5kZXIiLGZ1bmN0aW9uKCl7ciYmKHQ9bi5yZW5kZXJlci5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpfSksdT10aGlzLnJlbmRlcmVyLm9uKCJhZnRlclJlbmRlciIsZnVuY3Rpb24oKXtpZihyJiZ0JiYobi5pc0ZvY3VzZWQoKXx8bi5zZWFyY2hCb3gmJm4uc2VhcmNoQm94LmlzRm9jdXNlZCgpKSl7dmFyIGU9bi5yZW5kZXJlcixzPWUuJGN1cnNvckxheWVyLiRwaXhlbFBvcyxvPWUubGF5ZXJDb25maWcsdT1zLnRvcC1vLm9mZnNldDtzLnRvcD49MCYmdSt0LnRvcDwwP3I9ITA6cy50b3A8by5oZWlnaHQmJnMudG9wK3QudG9wK28ubGluZUhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/cj0hMTpyPW51bGwsciE9bnVsbCYmKGkuc3R5bGUudG9wPXUrInB4IixpLnN0eWxlLmxlZnQ9cy5sZWZ0KyJweCIsaS5zdHlsZS5oZWlnaHQ9by5saW5lSGVpZ2h0KyJweCIsaS5zY3JvbGxJbnRvVmlldyhyKSkscj10PW51bGx9fSk7dGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc9ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm47ZGVsZXRlIHRoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3LHRoaXMub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLHMpLHRoaXMucmVuZGVyZXIub2ZmKCJhZnRlclJlbmRlciIsdSksdGhpcy5yZW5kZXJlci5vZmYoImJlZm9yZVJlbmRlciIsbyl9fSx0aGlzLiRyZXNldEN1cnNvclN0eWxlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kY3Vyc29yU3R5bGV8fCJhY2UiLHQ9dGhpcy5yZW5kZXJlci4kY3Vyc29yTGF5ZXI7aWYoIXQpcmV0dXJuO3Quc2V0U21vb3RoQmxpbmtpbmcoL3Ntb290aC8udGVzdChlKSksdC5pc0JsaW5raW5nPSF0aGlzLiRyZWFkT25seSYmZSE9IndpZGUiLGkuc2V0Q3NzQ2xhc3ModC5lbGVtZW50LCJhY2Vfc2xpbS1jdXJzb3JzIiwvc2xpbS8udGVzdChlKSl9LHRoaXMucHJvbXB0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2cubG9hZE1vZHVsZSgiLi9leHQvcHJvbXB0IixmdW5jdGlvbihpKXtpLnByb21wdChyLGUsdCxuKX0pfX0uY2FsbCh3LnByb3RvdHlwZSksZy5kZWZpbmVPcHRpb25zKHcucHJvdG90eXBlLCJlZGl0b3IiLHtzZWxlY3Rpb25TdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx0aGlzLl9zaWduYWwoImNoYW5nZVNlbGVjdGlvblN0eWxlIix7ZGF0YTplfSl9LGluaXRpYWxWYWx1ZToibGluZSJ9LGhpZ2hsaWdodEFjdGl2ZUxpbmU6e3NldDpmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0saW5pdGlhbFZhbHVlOiEwfSxoaWdobGlnaHRTZWxlY3RlZFdvcmQ6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSgpfSxpbml0aWFsVmFsdWU6ITB9LHJlYWRPbmx5OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy50ZXh0SW5wdXQuc2V0UmVhZE9ubHkoZSksdGhpcy4kcmVzZXRDdXJzb3JTdHlsZSgpfSxpbml0aWFsVmFsdWU6ITF9LGNvcHlXaXRoRW1wdHlTZWxlY3Rpb246e3NldDpmdW5jdGlvbihlKXt0aGlzLnRleHRJbnB1dC5zZXRDb3B5V2l0aEVtcHR5U2VsZWN0aW9uKGUpfSxpbml0aWFsVmFsdWU6ITF9LGN1cnNvclN0eWxlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kcmVzZXRDdXJzb3JTdHlsZSgpfSx2YWx1ZXM6WyJhY2UiLCJzbGltIiwic21vb3RoIiwid2lkZSJdLGluaXRpYWxWYWx1ZToiYWNlIn0sbWVyZ2VVbmRvRGVsdGFzOnt2YWx1ZXM6WyExLCEwLCJhbHdheXMiXSxpbml0aWFsVmFsdWU6ITB9LGJlaGF2aW91cnNFbmFibGVkOntpbml0aWFsVmFsdWU6ITB9LHdyYXBCZWhhdmlvdXJzRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSxhdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXc6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldyhlKX19LGtleWJvYXJkSGFuZGxlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4ka2V5YmluZGluZ0lkfSxoYW5kbGVzU2V0OiEwfSx2YWx1ZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRWYWx1ZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VmFsdWUoKX0saGFuZGxlc1NldDohMCxoaWRkZW46ITB9LHNlc3Npb246e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldFNlc3Npb24oZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlc3Npb259LGhhbmRsZXNTZXQ6ITAsaGlkZGVuOiEwfSxzaG93TGluZU51bWJlcnM6e3NldDpmdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLiRndXR0ZXJMYXllci5zZXRTaG93TGluZU51bWJlcnMoZSksdGhpcy5yZW5kZXJlci4kbG9vcC5zY2hlZHVsZSh0aGlzLnJlbmRlcmVyLkNIQU5HRV9HVVRURVIpLGUmJnRoaXMuJHJlbGF0aXZlTGluZU51bWJlcnM/RS5hdHRhY2godGhpcyk6RS5kZXRhY2godGhpcyl9LGluaXRpYWxWYWx1ZTohMH0scmVsYXRpdmVMaW5lTnVtYmVyczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHNob3dMaW5lTnVtYmVycyYmZT9FLmF0dGFjaCh0aGlzKTpFLmRldGFjaCh0aGlzKX19LGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlOiJyZW5kZXJlciIsdlNjcm9sbEJhckFsd2F5c1Zpc2libGU6InJlbmRlcmVyIixoaWdobGlnaHRHdXR0ZXJMaW5lOiJyZW5kZXJlciIsYW5pbWF0ZWRTY3JvbGw6InJlbmRlcmVyIixzaG93SW52aXNpYmxlczoicmVuZGVyZXIiLHNob3dQcmludE1hcmdpbjoicmVuZGVyZXIiLHByaW50TWFyZ2luQ29sdW1uOiJyZW5kZXJlciIscHJpbnRNYXJnaW46InJlbmRlcmVyIixmYWRlRm9sZFdpZGdldHM6InJlbmRlcmVyIixzaG93Rm9sZFdpZGdldHM6InJlbmRlcmVyIixkaXNwbGF5SW5kZW50R3VpZGVzOiJyZW5kZXJlciIsc2hvd0d1dHRlcjoicmVuZGVyZXIiLGZvbnRTaXplOiJyZW5kZXJlciIsZm9udEZhbWlseToicmVuZGVyZXIiLG1heExpbmVzOiJyZW5kZXJlciIsbWluTGluZXM6InJlbmRlcmVyIixzY3JvbGxQYXN0RW5kOiJyZW5kZXJlciIsZml4ZWRXaWR0aEd1dHRlcjoicmVuZGVyZXIiLHRoZW1lOiJyZW5kZXJlciIsaGFzQ3NzVHJhbnNmb3JtczoicmVuZGVyZXIiLG1heFBpeGVsSGVpZ2h0OiJyZW5kZXJlciIsdXNlVGV4dGFyZWFGb3JJTUU6InJlbmRlcmVyIixzY3JvbGxTcGVlZDoiJG1vdXNlSGFuZGxlciIsZHJhZ0RlbGF5OiIkbW91c2VIYW5kbGVyIixkcmFnRW5hYmxlZDoiJG1vdXNlSGFuZGxlciIsZm9jdXNUaW1lb3V0OiIkbW91c2VIYW5kbGVyIix0b29sdGlwRm9sbG93c01vdXNlOiIkbW91c2VIYW5kbGVyIixmaXJzdExpbmVOdW1iZXI6InNlc3Npb24iLG92ZXJ3cml0ZToic2Vzc2lvbiIsbmV3TGluZU1vZGU6InNlc3Npb24iLHVzZVdvcmtlcjoic2Vzc2lvbiIsdXNlU29mdFRhYnM6InNlc3Npb24iLG5hdmlnYXRlV2l0aGluU29mdFRhYnM6InNlc3Npb24iLHRhYlNpemU6InNlc3Npb24iLHdyYXA6InNlc3Npb24iLGluZGVudGVkU29mdFdyYXA6InNlc3Npb24iLGZvbGRTdHlsZToic2Vzc2lvbiIsbW9kZToic2Vzc2lvbiJ9KTt2YXIgRT17Z2V0VGV4dDpmdW5jdGlvbihlLHQpe3JldHVybihNYXRoLmFicyhlLnNlbGVjdGlvbi5sZWFkLnJvdy10KXx8dCsxKyh0PDk/Ilx1MDBiNyI6IiIpKSsiIn0sZ2V0V2lkdGg6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBNYXRoLm1heCh0LnRvU3RyaW5nKCkubGVuZ3RoLChuLmxhc3RSb3crMSkudG9TdHJpbmcoKS5sZW5ndGgsMikqbi5jaGFyYWN0ZXJXaWR0aH0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7dC5yZW5kZXJlci4kbG9vcC5zY2hlZHVsZSh0LnJlbmRlcmVyLkNIQU5HRV9HVVRURVIpfSxhdHRhY2g6ZnVuY3Rpb24oZSl7ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJHJlbmRlcmVyPXRoaXMsZS5vbigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLnVwZGF0ZSksdGhpcy51cGRhdGUobnVsbCxlKX0sZGV0YWNoOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj09dGhpcyYmKGUucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj1udWxsKSxlLm9mZigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLnVwZGF0ZSksdGhpcy51cGRhdGUobnVsbCxlKX19O3QuRWRpdG9yPXd9KSxhY2UuZGVmaW5lKCJhY2UvdW5kb21hbmFnZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49dDtuLS07KXt2YXIgcj1lW25dO2lmKHImJiFyWzBdLmlnbm9yZSl7d2hpbGUobjx0LTEpe3ZhciBpPWQoZVtuXSxlW24rMV0pO2Vbbl09aVswXSxlW24rMV09aVsxXSxuKyt9cmV0dXJuITB9fX1mdW5jdGlvbiBhKGUpe3ZhciB0PWUuYWN0aW9uPT0iaW5zZXJ0IixuPWUuc3RhcnQscj1lLmVuZCxpPShyLnJvdy1uLnJvdykqKHQ/MTotMSkscz0oci5jb2x1bW4tbi5jb2x1bW4pKih0PzE6LTEpO3QmJihyPW4pO2Zvcih2YXIgbyBpbiB0aGlzLm1hcmtzKXt2YXIgYT10aGlzLm1hcmtzW29dLGY9dShhLG4pO2lmKGY8MCljb250aW51ZTtpZihmPT09MCYmdCl7aWYoYS5iaWFzIT0xKXthLmJpYXM9PS0xO2NvbnRpbnVlfWY9MX12YXIgbD10P2Y6dShhLHIpO2lmKGw+MCl7YS5yb3crPWksYS5jb2x1bW4rPWEucm93PT1yLnJvdz9zOjA7Y29udGludWV9IXQmJmw8PTAmJihhLnJvdz1uLnJvdyxhLmNvbHVtbj1uLmNvbHVtbixsPT09MCYmKGEuYmlhcz0xKSl9fWZ1bmN0aW9uIGYoZSl7cmV0dXJue3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59fWZ1bmN0aW9uIGwoZSl7cmV0dXJue3N0YXJ0OmYoZS5zdGFydCksZW5kOmYoZS5lbmQpLGFjdGlvbjplLmFjdGlvbixsaW5lczplLmxpbmVzLnNsaWNlKCl9fWZ1bmN0aW9uIGMoZSl7ZT1lfHx0aGlzO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubWFwKGMpLmpvaW4oIlxuIik7dmFyIHQ9IiI7ZS5hY3Rpb24/KHQ9ZS5hY3Rpb249PSJpbnNlcnQiPyIrIjoiLSIsdCs9IlsiK2UubGluZXMrIl0iKTplLnZhbHVlJiYoQXJyYXkuaXNBcnJheShlLnZhbHVlKT90PWUudmFsdWUubWFwKGgpLmpvaW4oIlxuIik6dD1oKGUudmFsdWUpKSxlLnN0YXJ0JiYodCs9aChlKSk7aWYoZS5pZHx8ZS5yZXYpdCs9IgkoIisoZS5pZHx8ZS5yZXYpKyIpIjtyZXR1cm4gdH1mdW5jdGlvbiBoKGUpe3JldHVybiBlLnN0YXJ0LnJvdysiOiIrZS5zdGFydC5jb2x1bW4rIj0+IitlLmVuZC5yb3crIjoiK2UuZW5kLmNvbHVtbn1mdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiLHI9dC5hY3Rpb249PSJpbnNlcnQiO2lmKG4mJnIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5zdGFydCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsMSl9ZWxzZSBpZihuJiYhcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsLTEpfWVsc2UgaWYoIW4mJnIpaWYobyh0LnN0YXJ0LGUuc3RhcnQpPj0wKW0odCxlLDEpO2Vsc2V7aWYoIShvKHQuc3RhcnQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LDEpfWVsc2UgaWYoIW4mJiFyKWlmKG8odC5zdGFydCxlLnN0YXJ0KT49MCltKHQsZSwxKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpcmV0dXJuIG51bGw7bShlLHQsLTEpfXJldHVyblt0LGVdfWZ1bmN0aW9uIGQoZSx0KXtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOylmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKylpZighcChlW25dLHRbcl0pKXt3aGlsZShuPGUubGVuZ3RoKXt3aGlsZShyLS0pcCh0W3JdLGVbbl0pO3I9dC5sZW5ndGgsbisrfXJldHVybltlLHRdfXJldHVybiBlLnNlbGVjdGlvbkJlZm9yZT10LnNlbGVjdGlvbkJlZm9yZT1lLnNlbGVjdGlvbkFmdGVyPXQuc2VsZWN0aW9uQWZ0ZXI9bnVsbCxbdCxlXX1mdW5jdGlvbiB2KGUsdCl7dmFyIG49ZS5hY3Rpb249PSJpbnNlcnQiLHI9dC5hY3Rpb249PSJpbnNlcnQiO2lmKG4mJnIpbyhlLnN0YXJ0LHQuc3RhcnQpPDA/bSh0LGUsMSk6bShlLHQsMSk7ZWxzZSBpZihuJiYhcilvKGUuc3RhcnQsdC5lbmQpPj0wP20oZSx0LC0xKTpvKGUuc3RhcnQsdC5zdGFydCk8PTA/bSh0LGUsMSk6KG0oZSxzLmZyb21Qb2ludHModC5zdGFydCxlLnN0YXJ0KSwtMSksbSh0LGUsMSkpO2Vsc2UgaWYoIW4mJnIpbyh0LnN0YXJ0LGUuZW5kKT49MD9tKHQsZSwtMSk6byh0LnN0YXJ0LGUuc3RhcnQpPD0wP20oZSx0LDEpOihtKHQscy5mcm9tUG9pbnRzKGUuc3RhcnQsdC5zdGFydCksLTEpLG0oZSx0LDEpKTtlbHNlIGlmKCFuJiYhcilpZihvKHQuc3RhcnQsZS5lbmQpPj0wKW0odCxlLC0xKTtlbHNle2lmKCEobyh0LmVuZCxlLnN0YXJ0KTw9MCkpe3ZhciBpLHU7cmV0dXJuIG8oZS5zdGFydCx0LnN0YXJ0KTwwJiYoaT1lLGU9eShlLHQuc3RhcnQpKSxvKGUuZW5kLHQuZW5kKT4wJiYodT15KGUsdC5lbmQpKSxnKHQuZW5kLGUuc3RhcnQsZS5lbmQsLTEpLHUmJiFpJiYoZS5saW5lcz11LmxpbmVzLGUuc3RhcnQ9dS5zdGFydCxlLmVuZD11LmVuZCx1PWUpLFt0LGksdV0uZmlsdGVyKEJvb2xlYW4pfW0oZSx0LC0xKX1yZXR1cm5bdCxlXX1mdW5jdGlvbiBtKGUsdCxuKXtnKGUuc3RhcnQsdC5zdGFydCx0LmVuZCxuKSxnKGUuZW5kLHQuc3RhcnQsdC5lbmQsbil9ZnVuY3Rpb24gZyhlLHQsbixyKXtlLnJvdz09KHI9PTE/dDpuKS5yb3cmJihlLmNvbHVtbis9cioobi5jb2x1bW4tdC5jb2x1bW4pKSxlLnJvdys9cioobi5yb3ctdC5yb3cpfWZ1bmN0aW9uIHkoZSx0KXt2YXIgbj1lLmxpbmVzLHI9ZS5lbmQ7ZS5lbmQ9Zih0KTt2YXIgaT1lLmVuZC5yb3ctZS5zdGFydC5yb3cscz1uLnNwbGljZShpLG4ubGVuZ3RoKSxvPWk/dC5jb2x1bW46dC5jb2x1bW4tZS5zdGFydC5jb2x1bW47bi5wdXNoKHNbMF0uc3Vic3RyaW5nKDAsbykpLHNbMF09c1swXS5zdWJzdHIobyk7dmFyIHU9e3N0YXJ0OmYodCksZW5kOnIsbGluZXM6cyxhY3Rpb246ZS5hY3Rpb259O3JldHVybiB1fWZ1bmN0aW9uIGIoZSx0KXt0PWwodCk7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV0sbz12KHMsdCk7dD1vWzBdLG8ubGVuZ3RoIT0yJiYob1syXT8oci5zcGxpY2UoaSsxLDEsb1sxXSxvWzJdKSxpKyspOm9bMV18fChyLnNwbGljZShpLDEpLGktLSkpfXIubGVuZ3RofHxlLnNwbGljZShuLDEpfXJldHVybiBlfWZ1bmN0aW9uIHcoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtmb3IodmFyIGk9MDtpPHIubGVuZ3RoO2krKyliKGUscltpXSl9fXZhciByPWZ1bmN0aW9uKCl7dGhpcy4kbWF4UmV2PTAsdGhpcy4kZnJvbVVuZG89ITEsdGhpcy5yZXNldCgpfTsoZnVuY3Rpb24oKXt0aGlzLmFkZFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy4kc2Vzc2lvbj1lfSx0aGlzLmFkZD1mdW5jdGlvbihlLHQsbil7aWYodGhpcy4kZnJvbVVuZG8pcmV0dXJuO2lmKGU9PXRoaXMuJGxhc3REZWx0YSlyZXR1cm47aWYodD09PSExfHwhdGhpcy5sYXN0RGVsdGFzKXRoaXMubGFzdERlbHRhcz1bXSx0aGlzLiR1bmRvU3RhY2sucHVzaCh0aGlzLmxhc3REZWx0YXMpLGUuaWQ9dGhpcy4kcmV2PSsrdGhpcy4kbWF4UmV2O2lmKGUuYWN0aW9uPT0icmVtb3ZlInx8ZS5hY3Rpb249PSJpbnNlcnQiKXRoaXMuJGxhc3REZWx0YT1lO3RoaXMubGFzdERlbHRhcy5wdXNoKGUpfSx0aGlzLmFkZFNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9ucy5wdXNoKHt2YWx1ZTplLHJldjp0fHx0aGlzLiRyZXZ9KX0sdGhpcy5zdGFydE5ld0dyb3VwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGFzdERlbHRhcz1udWxsLHRoaXMuJHJldn0sdGhpcy5tYXJrSWdub3JlZD1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKTt2YXIgbj10aGlzLiR1bmRvU3RhY2s7Zm9yKHZhciByPW4ubGVuZ3RoO3ItLTspe3ZhciBpPW5bcl1bMF07aWYoaS5pZDw9ZSlicmVhaztpLmlkPHQmJihpLmlnbm9yZT0hMCl9dGhpcy5sYXN0RGVsdGFzPW51bGx9LHRoaXMuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZWxlY3Rpb25zO2Zvcih2YXIgcj1uLmxlbmd0aDtyLS07KXt2YXIgaT1uW3JdO2lmKGkucmV2PGUpcmV0dXJuIHQmJihpPW5bcisxXSksaX19LHRoaXMuZ2V0UmV2aXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmV2fSx0aGlzLmdldERlbHRhcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKTt2YXIgbj10aGlzLiR1bmRvU3RhY2sscj1udWxsLGk9MDtmb3IodmFyIHM9bi5sZW5ndGg7cy0tOyl7dmFyIG89bltzXVswXTtvLmlkPHQmJiFyJiYocj1zKzEpO2lmKG8uaWQ8PWUpe2k9cysxO2JyZWFrfX1yZXR1cm4gbi5zbGljZShpLHIpfSx0aGlzLmdldENoYW5nZWRSYW5nZXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSl9LHRoaXMuZ2V0Q2hhbmdlZExpbmVzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpfSx0aGlzLnVuZG89ZnVuY3Rpb24oZSx0KXt0aGlzLmxhc3REZWx0YXM9bnVsbDt2YXIgbj10aGlzLiR1bmRvU3RhY2s7aWYoIWkobixuLmxlbmd0aCkpcmV0dXJuO2V8fChlPXRoaXMuJHNlc3Npb24pLHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYhPT10aGlzLiRyZXYmJnRoaXMuJHJlZG9TdGFjay5sZW5ndGgmJih0aGlzLiRyZWRvU3RhY2s9W10pLHRoaXMuJGZyb21VbmRvPSEwO3ZhciByPW4ucG9wKCkscz1udWxsO3JldHVybiByJiZyLmxlbmd0aCYmKHM9ZS51bmRvQ2hhbmdlcyhyLHQpLHRoaXMuJHJlZG9TdGFjay5wdXNoKHIpLHRoaXMuJHN5bmNSZXYoKSksdGhpcy4kZnJvbVVuZG89ITEsc30sdGhpcy5yZWRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5sYXN0RGVsdGFzPW51bGwsZXx8KGU9dGhpcy4kc2Vzc2lvbiksdGhpcy4kZnJvbVVuZG89ITA7aWYodGhpcy4kcmVkb1N0YWNrQmFzZVJldiE9dGhpcy4kcmV2KXt2YXIgbj10aGlzLmdldERlbHRhcyh0aGlzLiRyZWRvU3RhY2tCYXNlUmV2LHRoaXMuJHJldisxKTt3KHRoaXMuJHJlZG9TdGFjayxuKSx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PXRoaXMuJHJldix0aGlzLiRyZWRvU3RhY2suZm9yRWFjaChmdW5jdGlvbihlKXtlWzBdLmlkPSsrdGhpcy4kbWF4UmV2fSx0aGlzKX12YXIgcj10aGlzLiRyZWRvU3RhY2sucG9wKCksaT1udWxsO3JldHVybiByJiYoaT1lLnJlZG9DaGFuZ2VzKHIsdCksdGhpcy4kdW5kb1N0YWNrLnB1c2gociksdGhpcy4kc3luY1JldigpKSx0aGlzLiRmcm9tVW5kbz0hMSxpfSx0aGlzLiRzeW5jUmV2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kdW5kb1N0YWNrLHQ9ZVtlLmxlbmd0aC0xXSxuPXQmJnRbMF0uaWR8fDA7dGhpcy4kcmVkb1N0YWNrQmFzZVJldj1uLHRoaXMuJHJldj1ufSx0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5sYXN0RGVsdGFzPW51bGwsdGhpcy4kbGFzdERlbHRhPW51bGwsdGhpcy4kdW5kb1N0YWNrPVtdLHRoaXMuJHJlZG9TdGFjaz1bXSx0aGlzLiRyZXY9MCx0aGlzLm1hcms9MCx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2PXRoaXMuJHJldix0aGlzLnNlbGVjdGlvbnM9W119LHRoaXMuY2FuVW5kbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1bmRvU3RhY2subGVuZ3RoPjB9LHRoaXMuY2FuUmVkbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZWRvU3RhY2subGVuZ3RoPjB9LHRoaXMuYm9va21hcms9ZnVuY3Rpb24oZSl7ZT09dW5kZWZpbmVkJiYoZT10aGlzLiRyZXYpLHRoaXMubWFyaz1lfSx0aGlzLmlzQXRCb29rbWFyaz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyZXY9PT10aGlzLm1hcmt9LHRoaXMudG9KU09OPWZ1bmN0aW9uKCl7fSx0aGlzLmZyb21KU09OPWZ1bmN0aW9uKCl7fSx0aGlzLmhhc1VuZG89dGhpcy5jYW5VbmRvLHRoaXMuaGFzUmVkbz10aGlzLmNhblJlZG8sdGhpcy5pc0NsZWFuPXRoaXMuaXNBdEJvb2ttYXJrLHRoaXMubWFya0NsZWFuPXRoaXMuYm9va21hcmssdGhpcy4kcHJldHR5UHJpbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU/YyhlKTpjKHRoaXMuJHVuZG9TdGFjaykrIlxuLS0tXG4iK2ModGhpcy4kcmVkb1N0YWNrKX19KS5jYWxsKHIucHJvdG90eXBlKTt2YXIgcz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1zLmNvbXBhcmVQb2ludHMsdT1zLmNvbXBhcmVQb2ludHM7dC5VbmRvTWFuYWdlcj1yfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2xpbmVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9kb20iKSxpPWZ1bmN0aW9uKGUsdCl7dGhpcy5lbGVtZW50PWUsdGhpcy5jYW52YXNIZWlnaHQ9dHx8NWU1LHRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9dGhpcy5jYW52YXNIZWlnaHQqMisicHgiLHRoaXMuY2VsbHM9W10sdGhpcy5jZWxsQ2FjaGU9W10sdGhpcy4kb2Zmc2V0Q29lZmZpY2llbnQ9MH07KGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ29udGFpbmVyPWZ1bmN0aW9uKGUpe3IudHJhbnNsYXRlKHRoaXMuZWxlbWVudCwwLC0oZS5maXJzdFJvd1NjcmVlbiplLmxpbmVIZWlnaHQldGhpcy5jYW52YXNIZWlnaHQpLWUub2Zmc2V0KnRoaXMuJG9mZnNldENvZWZmaWNpZW50KX0sdGhpcy5wYWdlQ2hhbmdlZD1mdW5jdGlvbihlLHQpe3JldHVybiBNYXRoLmZsb29yKGUuZmlyc3RSb3dTY3JlZW4qZS5saW5lSGVpZ2h0L3RoaXMuY2FudmFzSGVpZ2h0KSE9PU1hdGguZmxvb3IodC5maXJzdFJvd1NjcmVlbip0LmxpbmVIZWlnaHQvdGhpcy5jYW52YXNIZWlnaHQpfSx0aGlzLmNvbXB1dGVMaW5lVG9wPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LmZpcnN0Um93U2NyZWVuKnQubGluZUhlaWdodCxpPU1hdGguZmxvb3Ioci90aGlzLmNhbnZhc0hlaWdodCkscz1uLmRvY3VtZW50VG9TY3JlZW5Sb3coZSwwKSp0LmxpbmVIZWlnaHQ7cmV0dXJuIHMtaSp0aGlzLmNhbnZhc0hlaWdodH0sdGhpcy5jb21wdXRlTGluZUhlaWdodD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQubGluZUhlaWdodCpuLmdldFJvd0xlbmd0aChlKX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxscy5sZW5ndGh9LHRoaXMuZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNlbGxzW2VdfSx0aGlzLnNoaWZ0PWZ1bmN0aW9uKCl7dGhpcy4kY2FjaGVDZWxsKHRoaXMuY2VsbHMuc2hpZnQoKSl9LHRoaXMucG9wPWZ1bmN0aW9uKCl7dGhpcy4kY2FjaGVDZWxsKHRoaXMuY2VsbHMucG9wKCkpfSx0aGlzLnB1c2g9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dGhpcy5jZWxscy5wdXNoLmFwcGx5KHRoaXMuY2VsbHMsZSk7dmFyIHQ9ci5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5lbGVtZW50KTt0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQodCl9ZWxzZSB0aGlzLmNlbGxzLnB1c2goZSksdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKGUuZWxlbWVudCl9LHRoaXMudW5zaGlmdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt0aGlzLmNlbGxzLnVuc2hpZnQuYXBwbHkodGhpcy5jZWxscyxlKTt2YXIgdD1yLmNyZWF0ZUZyYWdtZW50KHRoaXMuZWxlbWVudCk7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdC5hcHBlbmRDaGlsZChlW25dLmVsZW1lbnQpO3RoaXMuZWxlbWVudC5maXJzdENoaWxkP3RoaXMuZWxlbWVudC5pbnNlcnRCZWZvcmUodCx0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZCk6dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHQpfWVsc2UgdGhpcy5jZWxscy51bnNoaWZ0KGUpLHRoaXMuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLGUuZWxlbWVudCl9LHRoaXMubGFzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNlbGxzLmxlbmd0aD90aGlzLmNlbGxzW3RoaXMuY2VsbHMubGVuZ3RoLTFdOm51bGx9LHRoaXMuJGNhY2hlQ2VsbD1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47ZS5lbGVtZW50LnJlbW92ZSgpLHRoaXMuY2VsbENhY2hlLnB1c2goZSl9LHRoaXMuY3JlYXRlQ2VsbD1mdW5jdGlvbihlLHQsbixpKXt2YXIgcz10aGlzLmNlbGxDYWNoZS5wb3AoKTtpZighcyl7dmFyIG89ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtpJiZpKG8pLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChvKSxzPXtlbGVtZW50Om8sdGV4dDoiIixyb3c6ZX19cmV0dXJuIHMucm93PWUsc319KS5jYWxsKGkucHJvdG90eXBlKSx0LkxpbmVzPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvZ3V0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9sYXllci9saW5lcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZihlKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIik7ZS5hcHBlbmRDaGlsZCh0KTt2YXIgbj1yLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyZXR1cm4gZS5hcHBlbmRDaGlsZChuKSxlfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9vb3AiKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcix1PWUoIi4vbGluZXMiKS5MaW5lcyxhPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfZ3V0dGVyLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRTaG93Rm9sZFdpZGdldHModGhpcy4kc2hvd0ZvbGRXaWRnZXRzKSx0aGlzLmd1dHRlcldpZHRoPTAsdGhpcy4kYW5ub3RhdGlvbnM9W10sdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnM9dGhpcy4kdXBkYXRlQW5ub3RhdGlvbnMuYmluZCh0aGlzKSx0aGlzLiRsaW5lcz1uZXcgdSh0aGlzLmVsZW1lbnQpLHRoaXMuJGxpbmVzLiRvZmZzZXRDb2VmZmljaWVudD0xfTsoZnVuY3Rpb24oKXtpLmltcGxlbWVudCh0aGlzLG8pLHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zKSx0aGlzLnNlc3Npb249ZSxlJiZlLm9uKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zKX0sdGhpcy5hZGRHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkIHVzZSBzZXNzaW9uLmFkZEd1dHRlckRlY29yYXRpb24iKSx0aGlzLnNlc3Npb24uYWRkR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnJlbW92ZUd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oImRlcHJlY2F0ZWQgdXNlIHNlc3Npb24ucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbiIpLHRoaXMuc2Vzc2lvbi5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kYW5ub3RhdGlvbnM9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF0scj1uLnJvdyxpPXRoaXMuJGFubm90YXRpb25zW3JdO2l8fChpPXRoaXMuJGFubm90YXRpb25zW3JdPXt0ZXh0OltdfSk7dmFyIG89bi50ZXh0O289bz9zLmVzY2FwZUhUTUwobyk6bi5odG1sfHwiIixpLnRleHQuaW5kZXhPZihvKT09PS0xJiZpLnRleHQucHVzaChvKTt2YXIgdT1uLnR5cGU7dT09ImVycm9yIj9pLmNsYXNzTmFtZT0iIGFjZV9lcnJvciI6dT09Indhcm5pbmciJiZpLmNsYXNzTmFtZSE9IiBhY2VfZXJyb3IiP2kuY2xhc3NOYW1lPSIgYWNlX3dhcm5pbmciOnU9PSJpbmZvIiYmIWkuY2xhc3NOYW1lJiYoaS5jbGFzc05hbWU9IiBhY2VfaW5mbyIpfX0sdGhpcy4kdXBkYXRlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGFubm90YXRpb25zLmxlbmd0aClyZXR1cm47dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuIT09MClpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy4kYW5ub3RhdGlvbnMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9bmV3IEFycmF5KG4rMSk7ci51bnNoaWZ0KHQsMSksdGhpcy4kYW5ub3RhdGlvbnMuc3BsaWNlLmFwcGx5KHRoaXMuJGFubm90YXRpb25zLHIpfX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5jb25maWc9ZTt2YXIgdD10aGlzLnNlc3Npb24sbj1lLmZpcnN0Um93LHI9TWF0aC5taW4oZS5sYXN0Um93K2UuZ3V0dGVyT2Zmc2V0LHQuZ2V0TGVuZ3RoKCktMSk7dGhpcy5vbGRMYXN0Um93PXIsdGhpcy5jb25maWc9ZSx0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpLHRoaXMuJHVwZGF0ZUN1cnNvclJvdygpO3ZhciBpPXQuZ2V0TmV4dEZvbGRMaW5lKG4pLHM9aT9pLnN0YXJ0LnJvdzpJbmZpbml0eSxvPW51bGwsdT0tMSxhPW47Zm9yKDs7KXthPnMmJihhPWkuZW5kLnJvdysxLGk9dC5nZXROZXh0Rm9sZExpbmUoYSxpKSxzPWk/aS5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGE+cil7d2hpbGUodGhpcy4kbGluZXMuZ2V0TGVuZ3RoKCk+dSsxKXRoaXMuJGxpbmVzLnBvcCgpO2JyZWFrfW89dGhpcy4kbGluZXMuZ2V0KCsrdSksbz9vLnJvdz1hOihvPXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwoYSxlLHRoaXMuc2Vzc2lvbixmKSx0aGlzLiRsaW5lcy5wdXNoKG8pKSx0aGlzLiRyZW5kZXJDZWxsKG8sZSxpLGEpLGErK310aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIiksdGhpcy4kdXBkYXRlR3V0dGVyV2lkdGgoZSl9LHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbixuPXQuZ3V0dGVyUmVuZGVyZXJ8fHRoaXMuJHJlbmRlcmVyLHI9dC4kZmlyc3RMaW5lTnVtYmVyLGk9dGhpcy4kbGluZXMubGFzdCgpP3RoaXMuJGxpbmVzLmxhc3QoKS50ZXh0OiIiO2lmKHRoaXMuJGZpeGVkV2lkdGh8fHQuJHVzZVdyYXBNb2RlKWk9dC5nZXRMZW5ndGgoKStyLTE7dmFyIHM9bj9uLmdldFdpZHRoKHQsaSxlKTppLnRvU3RyaW5nKCkubGVuZ3RoKmUuY2hhcmFjdGVyV2lkdGgsbz10aGlzLiRwYWRkaW5nfHx0aGlzLiRjb21wdXRlUGFkZGluZygpO3MrPW8ubGVmdCtvLnJpZ2h0LHMhPT10aGlzLmd1dHRlcldpZHRoJiYhaXNOYU4ocykmJih0aGlzLmd1dHRlcldpZHRoPXMsdGhpcy5lbGVtZW50LnBhcmVudE5vZGUuc3R5bGUud2lkdGg9dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPU1hdGguY2VpbCh0aGlzLmd1dHRlcldpZHRoKSsicHgiLHRoaXMuX3NpZ25hbCgiY2hhbmdlR3V0dGVyV2lkdGgiLHMpKX0sdGhpcy4kdXBkYXRlQ3Vyc29yUm93PWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCk7aWYodGhpcy4kY3Vyc29yUm93PT09ZS5yb3cpcmV0dXJuO3RoaXMuJGN1cnNvclJvdz1lLnJvd30sdGhpcy51cGRhdGVMaW5lSGlnaGxpZ2h0PWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uY3Vyc29yLnJvdzt0aGlzLiRjdXJzb3JSb3c9ZTtpZih0aGlzLiRjdXJzb3JDZWxsJiZ0aGlzLiRjdXJzb3JDZWxsLnJvdz09ZSlyZXR1cm47dGhpcy4kY3Vyc29yQ2VsbCYmKHRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWU9dGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKCJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsIiIpKTt2YXIgdD10aGlzLiRsaW5lcy5jZWxsczt0aGlzLiRjdXJzb3JDZWxsPW51bGw7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoci5yb3c+PXRoaXMuJGN1cnNvclJvdyl7aWYoci5yb3c+dGhpcy4kY3Vyc29yUm93KXt2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodGhpcy4kY3Vyc29yUm93KTtpZighKG4+MCYmaSYmaS5zdGFydC5yb3c9PXRbbi0xXS5yb3cpKWJyZWFrO3I9dFtuLTFdfXIuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIityLmVsZW1lbnQuY2xhc3NOYW1lLHRoaXMuJGN1cnNvckNlbGw9cjticmVha319fSx0aGlzLnNjcm9sbExpbmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnO3RoaXMuY29uZmlnPWUsdGhpcy4kdXBkYXRlQ3Vyc29yUm93KCk7aWYodGhpcy4kbGluZXMucGFnZUNoYW5nZWQodCxlKSlyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKTt2YXIgbj1NYXRoLm1pbihlLmxhc3RSb3crZS5ndXR0ZXJPZmZzZXQsdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTEpLHI9dGhpcy5vbGRMYXN0Um93O3RoaXMub2xkTGFzdFJvdz1uO2lmKCF0fHxyPGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKG48dC5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYodC5maXJzdFJvdzxlLmZpcnN0Um93KWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQodC5maXJzdFJvdyxlLmZpcnN0Um93LTEpO2k+MDtpLS0pdGhpcy4kbGluZXMuc2hpZnQoKTtpZihyPm4pZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChuKzEscik7aT4wO2ktLSl0aGlzLiRsaW5lcy5wb3AoKTtlLmZpcnN0Um93PHQuZmlyc3RSb3cmJnRoaXMuJGxpbmVzLnVuc2hpZnQodGhpcy4kcmVuZGVyTGluZXMoZSxlLmZpcnN0Um93LHQuZmlyc3RSb3ctMSkpLG4+ciYmdGhpcy4kbGluZXMucHVzaCh0aGlzLiRyZW5kZXJMaW5lcyhlLHIrMSxuKSksdGhpcy51cGRhdGVMaW5lSGlnaGxpZ2h0KCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpLHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoKGUpfSx0aGlzLiRyZW5kZXJMaW5lcz1mdW5jdGlvbihlLHQsbil7dmFyIHI9W10saT10LHM9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpKSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXtpPm8mJihpPXMuZW5kLnJvdysxLHM9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZShpLHMpLG89cz9zLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYoaT5uKWJyZWFrO3ZhciB1PXRoaXMuJGxpbmVzLmNyZWF0ZUNlbGwoaSxlLHRoaXMuc2Vzc2lvbixmKTt0aGlzLiRyZW5kZXJDZWxsKHUsZSxzLGkpLHIucHVzaCh1KSxpKyt9cmV0dXJuIHJ9LHRoaXMuJHJlbmRlckNlbGw9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9ZS5lbGVtZW50LG89dGhpcy5zZXNzaW9uLHU9cy5jaGlsZE5vZGVzWzBdLGE9cy5jaGlsZE5vZGVzWzFdLGY9by4kZmlyc3RMaW5lTnVtYmVyLGw9by4kYnJlYWtwb2ludHMsYz1vLiRkZWNvcmF0aW9ucyxoPW8uZ3V0dGVyUmVuZGVyZXJ8fHRoaXMuJHJlbmRlcmVyLHA9dGhpcy4kc2hvd0ZvbGRXaWRnZXRzJiZvLmZvbGRXaWRnZXRzLGQ9bj9uLnN0YXJ0LnJvdzpOdW1iZXIuTUFYX1ZBTFVFLHY9ImFjZV9ndXR0ZXItY2VsbCAiO3RoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUmJihpPT10aGlzLiRjdXJzb3JSb3d8fG4mJmk8dGhpcy4kY3Vyc29yUm93JiZpPj1kJiZ0aGlzLiRjdXJzb3JSb3c8PW4uZW5kLnJvdykmJih2Kz0iYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLHRoaXMuJGN1cnNvckNlbGwhPWUmJih0aGlzLiRjdXJzb3JDZWxsJiYodGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZT10aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lLnJlcGxhY2UoImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIiwiIikpLHRoaXMuJGN1cnNvckNlbGw9ZSkpLGxbaV0mJih2Kz1sW2ldKSxjW2ldJiYodis9Y1tpXSksdGhpcy4kYW5ub3RhdGlvbnNbaV0mJih2Kz10aGlzLiRhbm5vdGF0aW9uc1tpXS5jbGFzc05hbWUpLHMuY2xhc3NOYW1lIT12JiYocy5jbGFzc05hbWU9dik7aWYocCl7dmFyIG09cFtpXTttPT1udWxsJiYobT1wW2ldPW8uZ2V0Rm9sZFdpZGdldChpKSl9aWYobSl7dmFyIHY9ImFjZV9mb2xkLXdpZGdldCBhY2VfIittO209PSJzdGFydCImJmk9PWQmJmk8bi5lbmQucm93P3YrPSIgYWNlX2Nsb3NlZCI6dis9IiBhY2Vfb3BlbiIsYS5jbGFzc05hbWUhPXYmJihhLmNsYXNzTmFtZT12KTt2YXIgZz10LmxpbmVIZWlnaHQrInB4IjtyLnNldFN0eWxlKGEuc3R5bGUsImhlaWdodCIsZyksci5zZXRTdHlsZShhLnN0eWxlLCJkaXNwbGF5IiwiaW5saW5lLWJsb2NrIil9ZWxzZSBhJiZyLnNldFN0eWxlKGEuc3R5bGUsImRpc3BsYXkiLCJub25lIik7dmFyIHk9KGg/aC5nZXRUZXh0KG8saSk6aStmKS50b1N0cmluZygpO3JldHVybiB5IT09dS5kYXRhJiYodS5kYXRhPXkpLHIuc2V0U3R5bGUoZS5lbGVtZW50LnN0eWxlLCJoZWlnaHQiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lSGVpZ2h0KGksdCxvKSsicHgiKSxyLnNldFN0eWxlKGUuZWxlbWVudC5zdHlsZSwidG9wIix0aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcChpLHQsbykrInB4IiksZS50ZXh0PXksZX0sdGhpcy4kZml4ZWRXaWR0aD0hMSx0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lPSEwLHRoaXMuJHJlbmRlcmVyPSIiLHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lPWV9LHRoaXMuJHNob3dMaW5lTnVtYmVycz0hMCx0aGlzLiRyZW5kZXJlcj0iIix0aGlzLnNldFNob3dMaW5lTnVtYmVycz1mdW5jdGlvbihlKXt0aGlzLiRyZW5kZXJlcj0hZSYme2dldFdpZHRoOmZ1bmN0aW9uKCl7cmV0dXJuIDB9LGdldFRleHQ6ZnVuY3Rpb24oKXtyZXR1cm4iIn19fSx0aGlzLmdldFNob3dMaW5lTnVtYmVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93TGluZU51bWJlcnN9LHRoaXMuJHNob3dGb2xkV2lkZ2V0cz0hMCx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXtlP3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIik6ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9mb2xkaW5nLWVuYWJsZWQiKSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9ZSx0aGlzLiRwYWRkaW5nPW51bGx9LHRoaXMuZ2V0U2hvd0ZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dGb2xkV2lkZ2V0c30sdGhpcy4kY29tcHV0ZVBhZGRpbmc9ZnVuY3Rpb24oKXtpZighdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpcmV0dXJue2xlZnQ6MCxyaWdodDowfTt2YXIgZT1yLmNvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpO3JldHVybiB0aGlzLiRwYWRkaW5nPXt9LHRoaXMuJHBhZGRpbmcubGVmdD0ocGFyc2VJbnQoZS5ib3JkZXJMZWZ0V2lkdGgpfHwwKSsocGFyc2VJbnQoZS5wYWRkaW5nTGVmdCl8fDApKzEsdGhpcy4kcGFkZGluZy5yaWdodD0ocGFyc2VJbnQoZS5ib3JkZXJSaWdodFdpZHRoKXx8MCkrKHBhcnNlSW50KGUucGFkZGluZ1JpZ2h0KXx8MCksdGhpcy4kcGFkZGluZ30sdGhpcy5nZXRSZWdpb249ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kcGFkZGluZ3x8dGhpcy4kY29tcHV0ZVBhZGRpbmcoKSxuPXRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihlLng8dC5sZWZ0K24ubGVmdClyZXR1cm4ibWFya2VycyI7aWYodGhpcy4kc2hvd0ZvbGRXaWRnZXRzJiZlLng+bi5yaWdodC10LnJpZ2h0KXJldHVybiJmb2xkV2lkZ2V0cyJ9fSkuY2FsbChhLnByb3RvdHlwZSksdC5HdXR0ZXI9YX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9tYXJrZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4uL2xpYi9kb20iKSxzPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfbWFya2VyLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCl9OyhmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSx0LG4scil7cmV0dXJuKGU/MTowKXwodD8yOjApfChuPzQ6MCl8KHI/ODowKX10aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lfSx0aGlzLnNldE1hcmtlcnM9ZnVuY3Rpb24oZSl7dGhpcy5tYXJrZXJzPWV9LHRoaXMuZWx0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5pIT0tMSYmdGhpcy5lbGVtZW50LmNoaWxkTm9kZXNbdGhpcy5pXTtuP3RoaXMuaSsrOihuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChuKSx0aGlzLmk9LTEpLG4uc3R5bGUuY3NzVGV4dD10LG4uY2xhc3NOYW1lPWV9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjt0aGlzLmNvbmZpZz1lLHRoaXMuaT0wO3ZhciB0O2Zvcih2YXIgbiBpbiB0aGlzLm1hcmtlcnMpe3ZhciByPXRoaXMubWFya2Vyc1tuXTtpZighci5yYW5nZSl7ci51cGRhdGUodCx0aGlzLHRoaXMuc2Vzc2lvbixlKTtjb250aW51ZX12YXIgaT1yLnJhbmdlLmNsaXBSb3dzKGUuZmlyc3RSb3csZS5sYXN0Um93KTtpZihpLmlzRW1wdHkoKSljb250aW51ZTtpPWkudG9TY3JlZW5SYW5nZSh0aGlzLnNlc3Npb24pO2lmKHIucmVuZGVyZXIpe3ZhciBzPXRoaXMuJGdldFRvcChpLnN0YXJ0LnJvdyxlKSxvPXRoaXMuJHBhZGRpbmcraS5zdGFydC5jb2x1bW4qZS5jaGFyYWN0ZXJXaWR0aDtyLnJlbmRlcmVyKHQsaSxvLHMsZSl9ZWxzZSByLnR5cGU9PSJmdWxsTGluZSI/dGhpcy5kcmF3RnVsbExpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6ci50eXBlPT0ic2NyZWVuTGluZSI/dGhpcy5kcmF3U2NyZWVuTGluZU1hcmtlcih0LGksci5jbGF6eixlKTppLmlzTXVsdGlMaW5lKCk/ci50eXBlPT0idGV4dCI/dGhpcy5kcmF3VGV4dE1hcmtlcih0LGksci5jbGF6eixlKTp0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6dGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcih0LGksci5jbGF6eisiIGFjZV9zdGFydCIrIiBhY2VfYnIxNSIsZSl9aWYodGhpcy5pIT0tMSl3aGlsZSh0aGlzLmk8dGhpcy5lbGVtZW50LmNoaWxkRWxlbWVudENvdW50KXRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCh0aGlzLmVsZW1lbnQubGFzdENoaWxkKX0sdGhpcy4kZ2V0VG9wPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUtdC5maXJzdFJvd1NjcmVlbikqdC5saW5lSGVpZ2h0fSx0aGlzLmRyYXdUZXh0TWFya2VyPWZ1bmN0aW9uKHQsbixpLHMsbyl7dmFyIHU9dGhpcy5zZXNzaW9uLGE9bi5zdGFydC5yb3csZj1uLmVuZC5yb3csbD1hLGM9MCxoPTAscD11LmdldFNjcmVlbkxhc3RSb3dDb2x1bW4obCksZD1uZXcgcihsLG4uc3RhcnQuY29sdW1uLGwsaCk7Zm9yKDtsPD1mO2wrKylkLnN0YXJ0LnJvdz1kLmVuZC5yb3c9bCxkLnN0YXJ0LmNvbHVtbj1sPT1hP24uc3RhcnQuY29sdW1uOnUuZ2V0Um93V3JhcEluZGVudChsKSxkLmVuZC5jb2x1bW49cCxjPWgsaD1wLHA9bCsxPGY/dS5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGwrMSk6bD09Zj8wOm4uZW5kLmNvbHVtbix0aGlzLmRyYXdTaW5nbGVMaW5lTWFya2VyKHQsZCxpKyhsPT1hPyIgYWNlX3N0YXJ0IjoiIikrIiBhY2VfYnIiK2UobD09YXx8bD09YSsxJiZuLnN0YXJ0LmNvbHVtbixjPGgsaD5wLGw9PWYpLHMsbD09Zj8wOjEsbyl9LHRoaXMuZHJhd011bHRpTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJHBhZGRpbmcsbz1yLmxpbmVIZWlnaHQsdT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksYT1zK3Quc3RhcnQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7aT1pfHwiIjtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LnN0YXJ0LnJvdykpe3ZhciBmPXQuY2xvbmUoKTtmLmVuZC5yb3c9Zi5zdGFydC5yb3csZi5lbmQuY29sdW1uPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKGYuc3RhcnQucm93KS5sZW5ndGgsdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSxmLG4rIiBhY2VfYnIxIGFjZV9zdGFydCIscixudWxsLGkpfWVsc2UgdGhpcy5lbHQobisiIGFjZV9icjEgYWNlX3N0YXJ0IiwiaGVpZ2h0OiIrbysicHg7IisicmlnaHQ6MDsiKyJ0b3A6Iit1KyJweDtsZWZ0OiIrYSsicHg7IisoaXx8IiIpKTtpZih0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh0LmVuZC5yb3cpKXt2YXIgZj10LmNsb25lKCk7Zi5zdGFydC5yb3c9Zi5lbmQucm93LGYuc3RhcnQuY29sdW1uPTAsdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSxmLG4rIiBhY2VfYnIxMiIscixudWxsLGkpfWVsc2V7dT10aGlzLiRnZXRUb3AodC5lbmQucm93LHIpO3ZhciBsPXQuZW5kLmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO3RoaXMuZWx0KG4rIiBhY2VfYnIxMiIsImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrbCsicHg7IisidG9wOiIrdSsicHg7IisibGVmdDoiK3MrInB4OyIrKGl8fCIiKSl9bz0odC5lbmQucm93LXQuc3RhcnQucm93LTEpKnIubGluZUhlaWdodDtpZihvPD0wKXJldHVybjt1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdysxLHIpO3ZhciBjPSh0LnN0YXJ0LmNvbHVtbj8xOjApfCh0LmVuZC5jb2x1bW4/MDo4KTt0aGlzLmVsdChuKyhjPyIgYWNlX2JyIitjOiIiKSwiaGVpZ2h0OiIrbysicHg7IisicmlnaHQ6MDsiKyJ0b3A6Iit1KyJweDsiKyJsZWZ0OiIrcysicHg7IisoaXx8IiIpKX0sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkscyl7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5zdGFydC5yb3cpKXJldHVybiB0aGlzLmRyYXdCaWRpU2luZ2xlTGluZU1hcmtlcihlLHQsbixyLGkscyk7dmFyIG89ci5saW5lSGVpZ2h0LHU9KHQuZW5kLmNvbHVtbisoaXx8MCktdC5zdGFydC5jb2x1bW4pKnIuY2hhcmFjdGVyV2lkdGgsYT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksZj10aGlzLiRwYWRkaW5nK3Quc3RhcnQuY29sdW1uKnIuY2hhcmFjdGVyV2lkdGg7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6Iit1KyJweDsiKyJ0b3A6IithKyJweDsiKyJsZWZ0OiIrZisicHg7Iisoc3x8IiIpKX0sdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpLHMpe3ZhciBvPXIubGluZUhlaWdodCx1PXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxhPXRoaXMuJHBhZGRpbmcsZj10aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFNlbGVjdGlvbnModC5zdGFydC5jb2x1bW4sdC5lbmQuY29sdW1uKTtmLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7Iisid2lkdGg6IitlLndpZHRoKyhpfHwwKSsicHg7IisidG9wOiIrdSsicHg7IisibGVmdDoiKyhhK2UubGVmdCkrInB4OyIrKHN8fCIiKSl9LHRoaXMpfSx0aGlzLmRyYXdGdWxsTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxvPXIubGluZUhlaWdodDt0LnN0YXJ0LnJvdyE9dC5lbmQucm93JiYobys9dGhpcy4kZ2V0VG9wKHQuZW5kLnJvdyxyKS1zKSx0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ0b3A6IitzKyJweDsiKyJsZWZ0OjA7cmlnaHQ6MDsiKyhpfHwiIikpfSx0aGlzLmRyYXdTY3JlZW5MaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIHM9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLG89ci5saW5lSGVpZ2h0O3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrInRvcDoiK3MrInB4OyIrImxlZnQ6MDtyaWdodDowOyIrKGl8fCIiKSl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5NYXJrZXI9c30pLGFjZS5kZWZpbmUoImFjZS9sYXllci90ZXh0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9sYXllci9saW5lcyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4vbGluZXMiKS5MaW5lcyx1PWUoIi4uL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLGE9ZnVuY3Rpb24oZSl7dGhpcy5kb209aSx0aGlzLmVsZW1lbnQ9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV90ZXh0LWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy4kdXBkYXRlRW9sQ2hhcj10aGlzLiR1cGRhdGVFb2xDaGFyLmJpbmQodGhpcyksdGhpcy4kbGluZXM9bmV3IG8odGhpcy5lbGVtZW50KX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyx1KSx0aGlzLkVPRl9DSEFSPSJcdTAwYjYiLHRoaXMuRU9MX0NIQVJfTEY9Ilx1MDBhYyIsdGhpcy5FT0xfQ0hBUl9DUkxGPSJcdTAwYTQiLHRoaXMuRU9MX0NIQVI9dGhpcy5FT0xfQ0hBUl9MRix0aGlzLlRBQl9DSEFSPSJcdTIwMTQiLHRoaXMuU1BBQ0VfQ0hBUj0iXHUwMGI3Iix0aGlzLiRwYWRkaW5nPTAsdGhpcy5NQVhfTElORV9MRU5HVEg9MWU0LHRoaXMuJHVwZGF0ZUVvbENoYXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZG9jLHQ9ZS5nZXROZXdMaW5lQ2hhcmFjdGVyKCk9PSJcbiImJmUuZ2V0TmV3TGluZU1vZGUoKSE9IndpbmRvd3MiLG49dD90aGlzLkVPTF9DSEFSX0xGOnRoaXMuRU9MX0NIQVJfQ1JMRjtpZih0aGlzLkVPTF9DSEFSIT1uKXJldHVybiB0aGlzLkVPTF9DSEFSPW4sITB9LHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWUsdGhpcy5lbGVtZW50LnN0eWxlLm1hcmdpbj0iMCAiK2UrInB4In0sdGhpcy5nZXRMaW5lSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGZvbnRNZXRyaWNzLiRjaGFyYWN0ZXJTaXplLmhlaWdodHx8MH0sdGhpcy5nZXRDaGFyYWN0ZXJXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmb250TWV0cmljcy4kY2hhcmFjdGVyU2l6ZS53aWR0aHx8MH0sdGhpcy4kc2V0Rm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7dGhpcy4kZm9udE1ldHJpY3M9ZSx0aGlzLiRmb250TWV0cmljcy5vbigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZnVuY3Rpb24oZSl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixlKX0uYmluZCh0aGlzKSksdGhpcy4kcG9sbFNpemVDaGFuZ2VzKCl9LHRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3RoaXMuJGZvbnRNZXRyaWNzLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKX0sdGhpcy4kcG9sbFNpemVDaGFuZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPXRoaXMuJGZvbnRNZXRyaWNzLiRwb2xsU2l6ZUNoYW5nZXMoKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lLGUmJnRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKX0sdGhpcy5zaG93SW52aXNpYmxlcz0hMSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNob3dJbnZpc2libGVzPT1lPyExOih0aGlzLnNob3dJbnZpc2libGVzPWUsdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLCEwKX0sdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPSEwLHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPT1lPyExOih0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXM9ZSx0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCksITApfSx0aGlzLiR0YWJTdHJpbmdzPVtdLHRoaXMub25DaGFuZ2VUYWJTaXplPXRoaXMuJGNvbXB1dGVUYWJTdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpO3RoaXMudGFiU2l6ZT1lO3ZhciB0PXRoaXMuJHRhYlN0cmluZ3M9WzBdO2Zvcih2YXIgbj0xO248ZSsxO24rKylpZih0aGlzLnNob3dJbnZpc2libGVzKXt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV90YWIiLHIudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQodGhpcy5UQUJfQ0hBUixuKSx0LnB1c2gocil9ZWxzZSB0LnB1c2godGhpcy5kb20uY3JlYXRlVGV4dE5vZGUocy5zdHJpbmdSZXBlYXQoIiAiLG4pLHRoaXMuZWxlbWVudCkpO2lmKHRoaXMuZGlzcGxheUluZGVudEd1aWRlcyl7dGhpcy4kaW5kZW50R3VpZGVSZT0vXHNcU3wgXHR8XHQgfFxzJC87dmFyIGk9ImFjZV9pbmRlbnQtZ3VpZGUiLG89IiIsdT0iIjtpZih0aGlzLnNob3dJbnZpc2libGVzKXtpKz0iIGFjZV9pbnZpc2libGUiLG89IiBhY2VfaW52aXNpYmxlX3NwYWNlIix1PSIgYWNlX2ludmlzaWJsZV90YWIiO3ZhciBhPXMuc3RyaW5nUmVwZWF0KHRoaXMuU1BBQ0VfQ0hBUix0aGlzLnRhYlNpemUpLGY9cy5zdHJpbmdSZXBlYXQodGhpcy5UQUJfQ0hBUix0aGlzLnRhYlNpemUpfWVsc2UgdmFyIGE9cy5zdHJpbmdSZXBlYXQoIiAiLHRoaXMudGFiU2l6ZSksZj1hO3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT1pK28sci50ZXh0Q29udGVudD1hLHRoaXMuJHRhYlN0cmluZ3NbIiAiXT1yO3ZhciByPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyLmNsYXNzTmFtZT1pK3Usci50ZXh0Q29udGVudD1mLHRoaXMuJHRhYlN0cmluZ3NbIgkiXT1yfX0sdGhpcy51cGRhdGVMaW5lcz1mdW5jdGlvbihlLHQsbil7aWYodGhpcy5jb25maWcubGFzdFJvdyE9ZS5sYXN0Um93fHx0aGlzLmNvbmZpZy5maXJzdFJvdyE9ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy5jb25maWc9ZTt2YXIgcj1NYXRoLm1heCh0LGUuZmlyc3RSb3cpLGk9TWF0aC5taW4obixlLmxhc3RSb3cpLHM9dGhpcy5lbGVtZW50LmNoaWxkTm9kZXMsbz0wO2Zvcih2YXIgdT1lLmZpcnN0Um93O3U8cjt1Kyspe3ZhciBhPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh1KTtpZihhKXtpZihhLmNvbnRhaW5zUm93KHIpKXtyPWEuc3RhcnQucm93O2JyZWFrfXU9YS5lbmQucm93fW8rK312YXIgZj0hMSx1PXIsYT10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHUpLGw9YT9hLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe3U+bCYmKHU9YS5lbmQucm93KzEsYT10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHUsYSksbD1hP2Euc3RhcnQucm93OkluZmluaXR5KTtpZih1PmkpYnJlYWs7dmFyIGM9c1tvKytdO2lmKGMpe3RoaXMuZG9tLnJlbW92ZUNoaWxkcmVuKGMpLHRoaXMuJHJlbmRlckxpbmUoYyx1LHU9PWw/YTohMSksZiYmKGMuc3R5bGUudG9wPXRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHUsZSx0aGlzLnNlc3Npb24pKyJweCIpO3ZhciBoPWUubGluZUhlaWdodCp0aGlzLnNlc3Npb24uZ2V0Um93TGVuZ3RoKHUpKyJweCI7Yy5zdHlsZS5oZWlnaHQhPWgmJihmPSEwLGMuc3R5bGUuaGVpZ2h0PWgpfXUrK31pZihmKXdoaWxlKG88dGhpcy4kbGluZXMuY2VsbHMubGVuZ3RoKXt2YXIgcD10aGlzLiRsaW5lcy5jZWxsc1tvKytdO3AuZWxlbWVudC5zdHlsZS50b3A9dGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AocC5yb3csZSx0aGlzLnNlc3Npb24pKyJweCJ9fSx0aGlzLnNjcm9sbExpbmVzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZmlnO3RoaXMuY29uZmlnPWU7aWYodGhpcy4kbGluZXMucGFnZUNoYW5nZWQodCxlKSlyZXR1cm4gdGhpcy51cGRhdGUoZSk7dGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKTt2YXIgbj1lLmxhc3RSb3cscj10P3QubGFzdFJvdzotMTtpZighdHx8cjxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihuPHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKCF0fHx0Lmxhc3RSb3c8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYoZS5sYXN0Um93PHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKHQuZmlyc3RSb3c8ZS5maXJzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KHQuZmlyc3RSb3csZS5maXJzdFJvdy0xKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnNoaWZ0KCk7aWYodC5sYXN0Um93PmUubGFzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KGUubGFzdFJvdysxLHQubGFzdFJvdyk7aT4wO2ktLSl0aGlzLiRsaW5lcy5wb3AoKTtlLmZpcnN0Um93PHQuZmlyc3RSb3cmJnRoaXMuJGxpbmVzLnVuc2hpZnQodGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLGUuZmlyc3RSb3csdC5maXJzdFJvdy0xKSksZS5sYXN0Um93PnQubGFzdFJvdyYmdGhpcy4kbGluZXMucHVzaCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsdC5sYXN0Um93KzEsZS5sYXN0Um93KSl9LHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLHM9dCxvPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocyksdT1vP28uc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7cz51JiYocz1vLmVuZC5yb3crMSxvPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUocyxvKSx1PW8/by5zdGFydC5yb3c6SW5maW5pdHkpO2lmKHM+bilicmVhazt2YXIgYT10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKHMsZSx0aGlzLnNlc3Npb24pLGY9YS5lbGVtZW50O3RoaXMuZG9tLnJlbW92ZUNoaWxkcmVuKGYpLGkuc2V0U3R5bGUoZi5zdHlsZSwiaGVpZ2h0Iix0aGlzLiRsaW5lcy5jb21wdXRlTGluZUhlaWdodChzLGUsdGhpcy5zZXNzaW9uKSsicHgiKSxpLnNldFN0eWxlKGYuc3R5bGUsInRvcCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AocyxlLHRoaXMuc2Vzc2lvbikrInB4IiksdGhpcy4kcmVuZGVyTGluZShmLHMscz09dT9vOiExKSx0aGlzLiR1c2VMaW5lR3JvdXBzKCk/Zi5jbGFzc05hbWU9ImFjZV9saW5lX2dyb3VwIjpmLmNsYXNzTmFtZT0iYWNlX2xpbmUiLHIucHVzaChhKSxzKyt9cmV0dXJuIHJ9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSksdGhpcy5jb25maWc9ZTt2YXIgdD1lLmZpcnN0Um93LG49ZS5sYXN0Um93LHI9dGhpcy4kbGluZXM7d2hpbGUoci5nZXRMZW5ndGgoKSlyLnBvcCgpO3IucHVzaCh0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50KGUsdCxuKSl9LHRoaXMuJHRleHRUb2tlbj17dGV4dDohMCxycGFyZW46ITAsbHBhcmVuOiEwfSx0aGlzLiRyZW5kZXJUb2tlbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLG89LyhcdCl8KCArKXwoW1x4MDAtXHgxZlx4ODAtXHhhMFx4YWRcdTE2ODBcdTE4MEVcdTIwMDAtXHUyMDBmXHUyMDI4XHUyMDI5XHUyMDJGXHUyMDVGXHVGRUZGXHVGRkY5LVx1RkZGQ10rKXwoXHUzMDAwKXwoW1x1MTEwMC1cdTExNUZcdTExQTMtXHUxMUE3XHUxMUZBLVx1MTFGRlx1MjMyOS1cdTIzMkFcdTJFODAtXHUyRTk5XHUyRTlCLVx1MkVGM1x1MkYwMC1cdTJGRDVcdTJGRjAtXHUyRkZCXHUzMDAxLVx1MzAzRVx1MzA0MS1cdTMwOTZcdTMwOTktXHUzMEZGXHUzMTA1LVx1MzEyRFx1MzEzMS1cdTMxOEVcdTMxOTAtXHUzMUJBXHUzMUMwLVx1MzFFM1x1MzFGMC1cdTMyMUVcdTMyMjAtXHUzMjQ3XHUzMjUwLVx1MzJGRVx1MzMwMC1cdTREQkZcdTRFMDAtXHVBNDhDXHVBNDkwLVx1QTRDNlx1QTk2MC1cdUE5N0NcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQUZGXHVGRTEwLVx1RkUxOVx1RkUzMC1cdUZFNTJcdUZFNTQtXHVGRTY2XHVGRTY4LVx1RkU2Qlx1RkYwMS1cdUZGNjBcdUZGRTAtXHVGRkU2XXxbXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0pL2csdT10aGlzLmRvbS5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpLGEsZj0wO3doaWxlKGE9by5leGVjKHIpKXt2YXIgbD1hWzFdLGM9YVsyXSxoPWFbM10scD1hWzRdLGQ9YVs1XTtpZighaS5zaG93SW52aXNpYmxlcyYmYyljb250aW51ZTt2YXIgdj1mIT1hLmluZGV4P3Iuc2xpY2UoZixhLmluZGV4KToiIjtmPWEuaW5kZXgrYVswXS5sZW5ndGgsdiYmdS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZSh2LHRoaXMuZWxlbWVudCkpO2lmKGwpe3ZhciBtPWkuc2Vzc2lvbi5nZXRTY3JlZW5UYWJTaXplKHQrYS5pbmRleCk7dS5hcHBlbmRDaGlsZChpLiR0YWJTdHJpbmdzW21dLmNsb25lTm9kZSghMCkpLHQrPW0tMX1lbHNlIGlmKGMpaWYoaS5zaG93SW52aXNpYmxlcyl7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UiLGcudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQoaS5TUEFDRV9DSEFSLGMubGVuZ3RoKSx1LmFwcGVuZENoaWxkKGcpfWVsc2UgdS5hcHBlbmRDaGlsZCh0aGlzLmNvbS5jcmVhdGVUZXh0Tm9kZShjLHRoaXMuZWxlbWVudCkpO2Vsc2UgaWYoaCl7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UgYWNlX2ludmFsaWQiLGcudGV4dENvbnRlbnQ9cy5zdHJpbmdSZXBlYXQoaS5TUEFDRV9DSEFSLGgubGVuZ3RoKSx1LmFwcGVuZENoaWxkKGcpfWVsc2UgaWYocCl7dCs9MTt2YXIgZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7Zy5zdHlsZS53aWR0aD1pLmNvbmZpZy5jaGFyYWN0ZXJXaWR0aCoyKyJweCIsZy5jbGFzc05hbWU9aS5zaG93SW52aXNpYmxlcz8iYWNlX2NqayBhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfc3BhY2UiOiJhY2VfY2prIixnLnRleHRDb250ZW50PWkuc2hvd0ludmlzaWJsZXM/aS5TUEFDRV9DSEFSOnAsdS5hcHBlbmRDaGlsZChnKX1lbHNlIGlmKGQpe3QrPTE7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuc3R5bGUud2lkdGg9aS5jb25maWcuY2hhcmFjdGVyV2lkdGgqMisicHgiLGcuY2xhc3NOYW1lPSJhY2VfY2prIixnLnRleHRDb250ZW50PWQsdS5hcHBlbmRDaGlsZChnKX19dS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShmP3Iuc2xpY2UoZik6cix0aGlzLmVsZW1lbnQpKTtpZighdGhpcy4kdGV4dFRva2VuW24udHlwZV0pe3ZhciB5PSJhY2VfIituLnR5cGUucmVwbGFjZSgvXC4vZywiIGFjZV8iKSxnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtuLnR5cGU9PSJmb2xkIiYmKGcuc3R5bGUud2lkdGg9bi52YWx1ZS5sZW5ndGgqdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgrInB4IiksZy5jbGFzc05hbWU9eSxnLmFwcGVuZENoaWxkKHUpLGUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBlLmFwcGVuZENoaWxkKHUpO3JldHVybiB0K3IubGVuZ3RofSx0aGlzLnJlbmRlckluZGVudEd1aWRlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnNlYXJjaCh0aGlzLiRpbmRlbnRHdWlkZVJlKTtpZihyPD0wfHxyPj1uKXJldHVybiB0O2lmKHRbMF09PSIgIil7ci09ciV0aGlzLnRhYlNpemU7dmFyIGk9ci90aGlzLnRhYlNpemU7Zm9yKHZhciBzPTA7czxpO3MrKyllLmFwcGVuZENoaWxkKHRoaXMuJHRhYlN0cmluZ3NbIiAiXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gdC5zdWJzdHIocil9aWYodFswXT09IgkiKXtmb3IodmFyIHM9MDtzPHI7cysrKWUuYXBwZW5kQ2hpbGQodGhpcy4kdGFiU3RyaW5nc1siCSJdLmNsb25lTm9kZSghMCkpO3JldHVybiB0LnN1YnN0cihyKX1yZXR1cm4gdH0sdGhpcy4kY3JlYXRlTGluZUVsZW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIHQuY2xhc3NOYW1lPSJhY2VfbGluZSIsdC5zdHlsZS5oZWlnaHQ9dGhpcy5jb25maWcubGluZUhlaWdodCsicHgiLHR9LHRoaXMuJHJlbmRlcldyYXBwZWRMaW5lPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0wLGk9MCxvPW5bMF0sdT0wLGE9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKTtlLmFwcGVuZENoaWxkKGEpO2Zvcih2YXIgZj0wO2Y8dC5sZW5ndGg7ZisrKXt2YXIgbD10W2ZdLGM9bC52YWx1ZTtpZihmPT0wJiZ0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMpe3I9Yy5sZW5ndGgsYz10aGlzLnJlbmRlckluZGVudEd1aWRlKGEsYyxvKTtpZighYyljb250aW51ZTtyLT1jLmxlbmd0aH1pZihyK2MubGVuZ3RoPG8pdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjKSxyKz1jLmxlbmd0aDtlbHNle3doaWxlKHIrYy5sZW5ndGg+PW8pdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjLnN1YnN0cmluZygwLG8tcikpLGM9Yy5zdWJzdHJpbmcoby1yKSxyPW8sYT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoYSksYS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jcmVhdGVUZXh0Tm9kZShzLnN0cmluZ1JlcGVhdCgiXHUwMGEwIixuLmluZGVudCksdGhpcy5lbGVtZW50KSksaSsrLHU9MCxvPW5baV18fE51bWJlci5NQVhfVkFMVUU7Yy5sZW5ndGghPTAmJihyKz1jLmxlbmd0aCx1PXRoaXMuJHJlbmRlclRva2VuKGEsdSxsLGMpKX19bltuLmxlbmd0aC0xXT50aGlzLk1BWF9MSU5FX0xFTkdUSCYmdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlKGEsdSxudWxsLCIiLCEwKX0sdGhpcy4kcmVuZGVyU2ltcGxlTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPTAscj10WzBdLGk9ci52YWx1ZTt0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMmJihpPXRoaXMucmVuZGVySW5kZW50R3VpZGUoZSxpKSksaSYmKG49dGhpcy4kcmVuZGVyVG9rZW4oZSxuLHIsaSkpO2Zvcih2YXIgcz0xO3M8dC5sZW5ndGg7cysrKXtyPXRbc10saT1yLnZhbHVlO2lmKG4raS5sZW5ndGg+dGhpcy5NQVhfTElORV9MRU5HVEgpcmV0dXJuIHRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZShlLG4scixpKTtuPXRoaXMuJHJlbmRlclRva2VuKGUsbixyLGkpfX0sdGhpcy4kcmVuZGVyT3ZlcmZsb3dNZXNzYWdlPWZ1bmN0aW9uKGUsdCxuLHIsaSl7biYmdGhpcy4kcmVuZGVyVG9rZW4oZSx0LG4sci5zbGljZSgwLHRoaXMuTUFYX0xJTkVfTEVOR1RILXQpKTt2YXIgcz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7cy5jbGFzc05hbWU9ImFjZV9pbmxpbmVfYnV0dG9uIGFjZV9rZXl3b3JkIGFjZV90b2dnbGVfd3JhcCIscy50ZXh0Q29udGVudD1pPyI8aGlkZT4iOiI8Y2xpY2sgdG8gc2VlIG1vcmUuLi4+IixlLmFwcGVuZENoaWxkKHMpfSx0aGlzLiRyZW5kZXJMaW5lPWZ1bmN0aW9uKGUsdCxuKXshbiYmbiE9MCYmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHQpKTtpZihuKXZhciByPXRoaXMuJGdldEZvbGRMaW5lVG9rZW5zKHQsbik7ZWxzZSB2YXIgcj10aGlzLnNlc3Npb24uZ2V0VG9rZW5zKHQpO3ZhciBpPWU7aWYoci5sZW5ndGgpe3ZhciBzPXRoaXMuc2Vzc2lvbi5nZXRSb3dTcGxpdERhdGEodCk7aWYocyYmcy5sZW5ndGgpe3RoaXMuJHJlbmRlcldyYXBwZWRMaW5lKGUscixzKTt2YXIgaT1lLmxhc3RDaGlsZH1lbHNle3ZhciBpPWU7dGhpcy4kdXNlTGluZUdyb3VwcygpJiYoaT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoaSkpLHRoaXMuJHJlbmRlclNpbXBsZUxpbmUoaSxyKX19ZWxzZSB0aGlzLiR1c2VMaW5lR3JvdXBzKCkmJihpPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCksZS5hcHBlbmRDaGlsZChpKSk7aWYodGhpcy5zaG93SW52aXNpYmxlcyYmaSl7biYmKHQ9bi5lbmQucm93KTt2YXIgbz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7by5jbGFzc05hbWU9ImFjZV9pbnZpc2libGUgYWNlX2ludmlzaWJsZV9lb2wiLG8udGV4dENvbnRlbnQ9dD09dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTE/dGhpcy5FT0ZfQ0hBUjp0aGlzLkVPTF9DSEFSLGkuYXBwZW5kQ2hpbGQobyl9fSx0aGlzLiRnZXRGb2xkTGluZVRva2Vucz1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIGkoZSx0LG4pe3ZhciBpPTAscz0wO3doaWxlKHMrZVtpXS52YWx1ZS5sZW5ndGg8dCl7cys9ZVtpXS52YWx1ZS5sZW5ndGgsaSsrO2lmKGk9PWUubGVuZ3RoKXJldHVybn1pZihzIT10KXt2YXIgbz1lW2ldLnZhbHVlLnN1YnN0cmluZyh0LXMpO28ubGVuZ3RoPm4tdCYmKG89by5zdWJzdHJpbmcoMCxuLXQpKSxyLnB1c2goe3R5cGU6ZVtpXS50eXBlLHZhbHVlOm99KSxzPXQrby5sZW5ndGgsaSs9MX13aGlsZShzPG4mJmk8ZS5sZW5ndGgpe3ZhciBvPWVbaV0udmFsdWU7by5sZW5ndGgrcz5uP3IucHVzaCh7dHlwZTplW2ldLnR5cGUsdmFsdWU6by5zdWJzdHJpbmcoMCxuLXMpfSk6ci5wdXNoKGVbaV0pLHMrPW8ubGVuZ3RoLGkrPTF9fXZhciBuPXRoaXMuc2Vzc2lvbixyPVtdLHM9bi5nZXRUb2tlbnMoZSk7cmV0dXJuIHQud2FsayhmdW5jdGlvbihlLHQsbyx1LGEpe2UhPW51bGw/ci5wdXNoKHt0eXBlOiJmb2xkIix2YWx1ZTplfSk6KGEmJihzPW4uZ2V0VG9rZW5zKHQpKSxzLmxlbmd0aCYmaShzLHUsbykpfSx0LmVuZC5yb3csdGhpcy5zZXNzaW9uLmdldExpbmUodC5lbmQucm93KS5sZW5ndGgpLHJ9LHRoaXMuJHVzZUxpbmVHcm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCl9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe319KS5jYWxsKGEucHJvdG90eXBlKSx0LlRleHQ9YX0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9jdXJzb3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50PXIuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5lbGVtZW50LmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9jdXJzb3ItbGF5ZXIiLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLmlzVmlzaWJsZT0hMSx0aGlzLmlzQmxpbmtpbmc9ITAsdGhpcy5ibGlua0ludGVydmFsPTFlMyx0aGlzLnNtb290aEJsaW5raW5nPSExLHRoaXMuY3Vyc29ycz1bXSx0aGlzLmN1cnNvcj10aGlzLmFkZEN1cnNvcigpLHIuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLiR1cGRhdGVDdXJzb3JzPXRoaXMuJHVwZGF0ZU9wYWNpdHkuYmluZCh0aGlzKX07KGZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlT3BhY2l0eT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmN1cnNvcnM7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspci5zZXRTdHlsZSh0W25dLnN0eWxlLCJvcGFjaXR5IixlPyIiOiIwIil9LHRoaXMuJHN0YXJ0Q3NzQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5jdXJzb3JzO2Zvcih2YXIgdD1lLmxlbmd0aDt0LS07KWVbdF0uc3R5bGUuYW5pbWF0aW9uRHVyYXRpb249dGhpcy5ibGlua0ludGVydmFsKyJtcyI7c2V0VGltZW91dChmdW5jdGlvbigpe3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfYW5pbWF0ZS1ibGlua2luZyIpfS5iaW5kKHRoaXMpKX0sdGhpcy4kc3RvcENzc0FuaW1hdGlvbj1mdW5jdGlvbigpe3IucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfYW5pbWF0ZS1ibGlua2luZyIpfSx0aGlzLiRwYWRkaW5nPTAsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbj1lfSx0aGlzLnNldEJsaW5raW5nPWZ1bmN0aW9uKGUpe2UhPXRoaXMuaXNCbGlua2luZyYmKHRoaXMuaXNCbGlua2luZz1lLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLnNldEJsaW5rSW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5ibGlua0ludGVydmFsJiYodGhpcy5ibGlua0ludGVydmFsPWUsdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuc2V0U21vb3RoQmxpbmtpbmc9ZnVuY3Rpb24oZSl7ZSE9dGhpcy5zbW9vdGhCbGlua2luZyYmKHRoaXMuc21vb3RoQmxpbmtpbmc9ZSxyLnNldENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIsZSksdGhpcy4kdXBkYXRlQ3Vyc29ycyghMCksdGhpcy5yZXN0YXJ0VGltZXIoKSl9LHRoaXMuYWRkQ3Vyc29yPWZ1bmN0aW9uKCl7dmFyIGU9ci5jcmVhdGVFbGVtZW50KCJkaXYiKTtyZXR1cm4gZS5jbGFzc05hbWU9ImFjZV9jdXJzb3IiLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChlKSx0aGlzLmN1cnNvcnMucHVzaChlKSxlfSx0aGlzLnJlbW92ZUN1cnNvcj1mdW5jdGlvbigpe2lmKHRoaXMuY3Vyc29ycy5sZW5ndGg+MSl7dmFyIGU9dGhpcy5jdXJzb3JzLnBvcCgpO3JldHVybiBlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSksZX19LHRoaXMuaGlkZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuaXNWaXNpYmxlPSExLHIuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfaGlkZGVuLWN1cnNvcnMiKSx0aGlzLnJlc3RhcnRUaW1lcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT0hMCxyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5yZXN0YXJ0VGltZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiR1cGRhdGVDdXJzb3JzO2NsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbElkKSxjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpLHRoaXMuJHN0b3BDc3NBbmltYXRpb24oKSx0aGlzLnNtb290aEJsaW5raW5nJiZyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX3Ntb290aC1ibGlua2luZyIpLGUoITApO2lmKCF0aGlzLmlzQmxpbmtpbmd8fCF0aGlzLmJsaW5rSW50ZXJ2YWx8fCF0aGlzLmlzVmlzaWJsZSl7dGhpcy4kc3RvcENzc0FuaW1hdGlvbigpO3JldHVybn10aGlzLnNtb290aEJsaW5raW5nJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5hZGRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciKX0uYmluZCh0aGlzKSk7aWYoci5IQVNfQ1NTX0FOSU1BVElPTil0aGlzLiRzdGFydENzc0FuaW1hdGlvbigpO2Vsc2V7dmFyIHQ9ZnVuY3Rpb24oKXt0aGlzLnRpbWVvdXRJZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZSghMSl9LC42KnRoaXMuYmxpbmtJbnRlcnZhbCl9LmJpbmQodGhpcyk7dGhpcy5pbnRlcnZhbElkPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ZSghMCksdCgpfSx0aGlzLmJsaW5rSW50ZXJ2YWwpLHQoKX19LHRoaXMuZ2V0UGl4ZWxQb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKCF0aGlzLmNvbmZpZ3x8IXRoaXMuc2Vzc2lvbilyZXR1cm57bGVmdDowLHRvcDowfTtlfHwoZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpKTt2YXIgbj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUpLHI9dGhpcy4kcGFkZGluZysodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3cobi5yb3csZS5yb3cpP3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChuLmNvbHVtbik6bi5jb2x1bW4qdGhpcy5jb25maWcuY2hhcmFjdGVyV2lkdGgpLGk9KG4ucm93LSh0P3RoaXMuY29uZmlnLmZpcnN0Um93U2NyZWVuOjApKSp0aGlzLmNvbmZpZy5saW5lSGVpZ2h0O3JldHVybntsZWZ0OnIsdG9wOml9fSx0aGlzLmlzQ3Vyc29ySW5WaWV3PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9wPj0wJiZlLnRvcDx0Lm1heEhlaWdodH0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy5jb25maWc9ZTt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMsbj0wLGk9MDtpZih0PT09dW5kZWZpbmVkfHx0Lmxlbmd0aD09PTApdD1be2N1cnNvcjpudWxsfV07Zm9yKHZhciBuPTAscz10Lmxlbmd0aDtuPHM7bisrKXt2YXIgbz10aGlzLmdldFBpeGVsUG9zaXRpb24odFtuXS5jdXJzb3IsITApO2lmKChvLnRvcD5lLmhlaWdodCtlLm9mZnNldHx8by50b3A8MCkmJm4+MSljb250aW51ZTt2YXIgdT10aGlzLmN1cnNvcnNbaSsrXXx8dGhpcy5hZGRDdXJzb3IoKSxhPXUuc3R5bGU7dGhpcy5kcmF3Q3Vyc29yP3RoaXMuZHJhd0N1cnNvcih1LG8sZSx0W25dLHRoaXMuc2Vzc2lvbik6dGhpcy5pc0N1cnNvckluVmlldyhvLGUpPyhyLnNldFN0eWxlKGEsImRpc3BsYXkiLCJibG9jayIpLHIudHJhbnNsYXRlKHUsby5sZWZ0LG8udG9wKSxyLnNldFN0eWxlKGEsIndpZHRoIixNYXRoLnJvdW5kKGUuY2hhcmFjdGVyV2lkdGgpKyJweCIpLHIuc2V0U3R5bGUoYSwiaGVpZ2h0IixlLmxpbmVIZWlnaHQrInB4IikpOnIuc2V0U3R5bGUoYSwiZGlzcGxheSIsIm5vbmUiKX13aGlsZSh0aGlzLmN1cnNvcnMubGVuZ3RoPmkpdGhpcy5yZW1vdmVDdXJzb3IoKTt2YXIgZj10aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCk7dGhpcy4kc2V0T3ZlcndyaXRlKGYpLHRoaXMuJHBpeGVsUG9zPW8sdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5kcmF3Q3Vyc29yPW51bGwsdGhpcy4kc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe2UhPXRoaXMub3ZlcndyaXRlJiYodGhpcy5vdmVyd3JpdGU9ZSxlP3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfb3ZlcndyaXRlLWN1cnNvcnMiKTpyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX292ZXJ3cml0ZS1jdXJzb3JzIikpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKX19KS5jYWxsKGkucHJvdG90eXBlKSx0LkN1cnNvcj1pfSksYWNlLmRlZmluZSgiYWNlL3Njcm9sbGJhciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9saWIvZXZlbnQiKSxvPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdT0zMjc2OCxhPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9zY3JvbGxiYXIgYWNlX3Njcm9sbGJhciIrdGhpcy5jbGFzc1N1ZmZpeCx0aGlzLmlubmVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbm5lci5jbGFzc05hbWU9ImFjZV9zY3JvbGxiYXItaW5uZXIiLHRoaXMuaW5uZXIudGV4dENvbnRlbnQ9Ilx1MDBhMCIsdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaW5uZXIpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbGVtZW50KSx0aGlzLnNldFZpc2libGUoITEpLHRoaXMuc2tpcEV2ZW50PSExLHMuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJzY3JvbGwiLHRoaXMub25TY3JvbGwuYmluZCh0aGlzKSkscy5hZGRMaXN0ZW5lcih0aGlzLmVsZW1lbnQsIm1vdXNlZG93biIscy5wcmV2ZW50RGVmYXVsdCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsbyksdGhpcy5zZXRWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS5kaXNwbGF5PWU/IiI6Im5vbmUiLHRoaXMuaXNWaXNpYmxlPWUsdGhpcy5jb2VmZj0xfX0pLmNhbGwoYS5wcm90b3R5cGUpO3ZhciBmPWZ1bmN0aW9uKGUsdCl7YS5jYWxsKHRoaXMsZSksdGhpcy5zY3JvbGxUb3A9MCx0aGlzLnNjcm9sbEhlaWdodD0wLHQuJHNjcm9sbGJhcldpZHRoPXRoaXMud2lkdGg9aS5zY3JvbGxiYXJXaWR0aChlLm93bmVyRG9jdW1lbnQpLHRoaXMuaW5uZXIuc3R5bGUud2lkdGg9dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPSh0aGlzLndpZHRofHwxNSkrNSsicHgiLHRoaXMuJG1pbldpZHRoPTB9O3IuaW5oZXJpdHMoZixhKSxmdW5jdGlvbigpe3RoaXMuY2xhc3NTdWZmaXg9Ii12Iix0aGlzLm9uU2Nyb2xsPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2tpcEV2ZW50KXt0aGlzLnNjcm9sbFRvcD10aGlzLmVsZW1lbnQuc2Nyb2xsVG9wO2lmKHRoaXMuY29lZmYhPTEpe3ZhciBlPXRoaXMuZWxlbWVudC5jbGllbnRIZWlnaHQvdGhpcy5zY3JvbGxIZWlnaHQ7dGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AqKDEtZSkvKHRoaXMuY29lZmYtZSl9dGhpcy5fZW1pdCgic2Nyb2xsIix7ZGF0YTp0aGlzLnNjcm9sbFRvcH0pfXRoaXMuc2tpcEV2ZW50PSExfSx0aGlzLmdldFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWF4KHRoaXMuaXNWaXNpYmxlP3RoaXMud2lkdGg6MCx0aGlzLiRtaW5XaWR0aHx8MCl9LHRoaXMuc2V0SGVpZ2h0PWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9ZSsicHgifSx0aGlzLnNldElubmVySGVpZ2h0PXRoaXMuc2V0U2Nyb2xsSGVpZ2h0PWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsSGVpZ2h0PWUsZT51Pyh0aGlzLmNvZWZmPXUvZSxlPXUpOnRoaXMuY29lZmYhPTEmJih0aGlzLmNvZWZmPTEpLHRoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0PWUrInB4In0sdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxUb3AhPWUmJih0aGlzLnNraXBFdmVudD0hMCx0aGlzLnNjcm9sbFRvcD1lLHRoaXMuZWxlbWVudC5zY3JvbGxUb3A9ZSp0aGlzLmNvZWZmKX19LmNhbGwoZi5wcm90b3R5cGUpO3ZhciBsPWZ1bmN0aW9uKGUsdCl7YS5jYWxsKHRoaXMsZSksdGhpcy5zY3JvbGxMZWZ0PTAsdGhpcy5oZWlnaHQ9dC4kc2Nyb2xsYmFyV2lkdGgsdGhpcy5pbm5lci5zdHlsZS5oZWlnaHQ9dGhpcy5lbGVtZW50LnN0eWxlLmhlaWdodD0odGhpcy5oZWlnaHR8fDE1KSs1KyJweCJ9O3IuaW5oZXJpdHMobCxhKSxmdW5jdGlvbigpe3RoaXMuY2xhc3NTdWZmaXg9Ii1oIix0aGlzLm9uU2Nyb2xsPWZ1bmN0aW9uKCl7dGhpcy5za2lwRXZlbnR8fCh0aGlzLnNjcm9sbExlZnQ9dGhpcy5lbGVtZW50LnNjcm9sbExlZnQsdGhpcy5fZW1pdCgic2Nyb2xsIix7ZGF0YTp0aGlzLnNjcm9sbExlZnR9KSksdGhpcy5za2lwRXZlbnQ9ITF9LHRoaXMuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXNWaXNpYmxlP3RoaXMuaGVpZ2h0OjB9LHRoaXMuc2V0V2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5lbGVtZW50LnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRJbm5lcldpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuaW5uZXIuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldFNjcm9sbFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuaW5uZXIuc3R5bGUud2lkdGg9ZSsicHgifSx0aGlzLnNldFNjcm9sbExlZnQ9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxMZWZ0IT1lJiYodGhpcy5za2lwRXZlbnQ9ITAsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0PWUpfX0uY2FsbChsLnByb3RvdHlwZSksdC5TY3JvbGxCYXI9Zix0LlNjcm9sbEJhclY9Zix0LlNjcm9sbEJhckg9bCx0LlZTY3JvbGxCYXI9Zix0LkhTY3JvbGxCYXI9bH0pLGFjZS5kZWZpbmUoImFjZS9yZW5kZXJsb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvZXZlbnQiKSxpPWZ1bmN0aW9uKGUsdCl7dGhpcy5vblJlbmRlcj1lLHRoaXMucGVuZGluZz0hMSx0aGlzLmNoYW5nZXM9MCx0aGlzLiRyZWN1cnNpb25MaW1pdD0yLHRoaXMud2luZG93PXR8fHdpbmRvdzt2YXIgbj10aGlzO3RoaXMuX2ZsdXNoPWZ1bmN0aW9uKGUpe24ucGVuZGluZz0hMTt2YXIgdD1uLmNoYW5nZXM7dCYmKHIuYmxvY2tJZGxlKDEwMCksbi5jaGFuZ2VzPTAsbi5vblJlbmRlcih0KSk7aWYobi5jaGFuZ2VzKXtpZihuLiRyZWN1cnNpb25MaW1pdC0tPDApcmV0dXJuO24uc2NoZWR1bGUoKX1lbHNlIG4uJHJlY3Vyc2lvbkxpbWl0PTJ9fTsoZnVuY3Rpb24oKXt0aGlzLnNjaGVkdWxlPWZ1bmN0aW9uKGUpe3RoaXMuY2hhbmdlcz10aGlzLmNoYW5nZXN8ZSx0aGlzLmNoYW5nZXMmJiF0aGlzLnBlbmRpbmcmJihyLm5leHRGcmFtZSh0aGlzLl9mbHVzaCksdGhpcy5wZW5kaW5nPSEwKX0sdGhpcy5jbGVhcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNoYW5nZXM7cmV0dXJuIHRoaXMuY2hhbmdlcz0wLHR9fSkuY2FsbChpLnByb3RvdHlwZSksdC5SZW5kZXJMb29wPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvZm9udF9tZXRyaWNzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvZG9tIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi4vbGliL2V2ZW50IiksdT1lKCIuLi9saWIvdXNlcmFnZW50IiksYT1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixmPTI1NixsPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixjPTIwMCxoPXQuRm9udE1ldHJpY3M9ZnVuY3Rpb24oZSl7dGhpcy5lbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuZWwuc3R5bGUsITApLHRoaXMuJG1haW49aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLiRtYWluLnN0eWxlKSx0aGlzLiRtZWFzdXJlTm9kZT1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzKHRoaXMuJG1lYXN1cmVOb2RlLnN0eWxlKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuJG1haW4pLHRoaXMuZWwuYXBwZW5kQ2hpbGQodGhpcy4kbWVhc3VyZU5vZGUpLGUuYXBwZW5kQ2hpbGQodGhpcy5lbCksdGhpcy4kbWVhc3VyZU5vZGUuaW5uZXJIVE1MPXMuc3RyaW5nUmVwZWF0KCJYIixmKSx0aGlzLiRjaGFyYWN0ZXJTaXplPXt3aWR0aDowLGhlaWdodDowfSxsP3RoaXMuJGFkZE9ic2VydmVyKCk6dGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzKCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsYSksdGhpcy4kY2hhcmFjdGVyU2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXM9ZnVuY3Rpb24oZSx0KXtlLndpZHRoPWUuaGVpZ2h0PSJhdXRvIixlLmxlZnQ9ZS50b3A9IjBweCIsZS52aXNpYmlsaXR5PSJoaWRkZW4iLGUucG9zaXRpb249ImFic29sdXRlIixlLndoaXRlU3BhY2U9InByZSIsdS5pc0lFPDg/ZVsiZm9udC1mYW1pbHkiXT0iaW5oZXJpdCI6ZS5mb250PSJpbmhlcml0IixlLm92ZXJmbG93PXQ/ImhpZGRlbiI6InZpc2libGUifSx0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oZSl7ZT09PXVuZGVmaW5lZCYmKGU9dGhpcy4kbWVhc3VyZVNpemVzKCkpO2lmKGUmJih0aGlzLiRjaGFyYWN0ZXJTaXplLndpZHRoIT09ZS53aWR0aHx8dGhpcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHQhPT1lLmhlaWdodCkpe3RoaXMuJG1lYXN1cmVOb2RlLnN0eWxlLmZvbnRXZWlnaHQ9ImJvbGQiO3ZhciB0PXRoaXMuJG1lYXN1cmVTaXplcygpO3RoaXMuJG1lYXN1cmVOb2RlLnN0eWxlLmZvbnRXZWlnaHQ9IiIsdGhpcy4kY2hhcmFjdGVyU2l6ZT1lLHRoaXMuY2hhclNpemVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5hbGxvd0JvbGRGb250cz10JiZ0LndpZHRoPT09ZS53aWR0aCYmdC5oZWlnaHQ9PT1lLmhlaWdodCx0aGlzLl9lbWl0KCJjaGFuZ2VDaGFyYWN0ZXJTaXplIix7ZGF0YTplfSl9fSx0aGlzLiRhZGRPYnNlcnZlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kb2JzZXJ2ZXI9bmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcihmdW5jdGlvbih0KXt2YXIgbj10WzBdLmNvbnRlbnRSZWN0O2UuY2hlY2tGb3JTaXplQ2hhbmdlcyh7aGVpZ2h0Om4uaGVpZ2h0LHdpZHRoOm4ud2lkdGgvZn0pfSksdGhpcy4kb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLiRtZWFzdXJlTm9kZSl9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcz1mdW5jdGlvbigpe2lmKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyfHx0aGlzLiRvYnNlcnZlcilyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9by5vbklkbGUoZnVuY3Rpb24gdCgpe2UuY2hlY2tGb3JTaXplQ2hhbmdlcygpLG8ub25JZGxlKHQsNTAwKX0sNTAwKX0sdGhpcy5zZXRQb2xsaW5nPWZ1bmN0aW9uKGUpe2U/dGhpcy4kcG9sbFNpemVDaGFuZ2VzKCk6dGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXImJihjbGVhckludGVydmFsKHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyKSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj0wKX0sdGhpcy4kbWVhc3VyZVNpemVzPWZ1bmN0aW9uKGUpe3ZhciB0PXtoZWlnaHQ6KGV8fHRoaXMuJG1lYXN1cmVOb2RlKS5jbGllbnRIZWlnaHQsd2lkdGg6KGV8fHRoaXMuJG1lYXN1cmVOb2RlKS5jbGllbnRXaWR0aC9mfTtyZXR1cm4gdC53aWR0aD09PTB8fHQuaGVpZ2h0PT09MD9udWxsOnR9LHRoaXMuJG1lYXN1cmVDaGFyV2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy4kbWFpbi5pbm5lckhUTUw9cy5zdHJpbmdSZXBlYXQoZSxmKTt2YXIgdD10aGlzLiRtYWluLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiB0LndpZHRoL2Z9LHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGg9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFyU2l6ZXNbZV07cmV0dXJuIHQ9PT11bmRlZmluZWQmJih0PXRoaXMuY2hhclNpemVzW2VdPXRoaXMuJG1lYXN1cmVDaGFyV2lkdGgoZSkvdGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCksdH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciksdGhpcy4kb2JzZXJ2ZXImJnRoaXMuJG9ic2VydmVyLmRpc2Nvbm5lY3QoKSx0aGlzLmVsJiZ0aGlzLmVsLnBhcmVudE5vZGUmJnRoaXMuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmVsKX0sdGhpcy4kZ2V0Wm9vbT1mdW5jdGlvbiBlKHQpe3JldHVybiB0Pyh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS56b29tfHwxKSplKHQucGFyZW50RWxlbWVudCk6MX0sdGhpcy4kaW5pdFRyYW5zZm9ybU1lYXN1cmVOb2Rlcz1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuWyJkaXYiLHtzdHlsZToicG9zaXRpb246IGFic29sdXRlO3RvcDoiK2UrInB4O2xlZnQ6Iit0KyJweDsifV19O3RoaXMuZWxzPWkuYnVpbGREb20oW2UoMCwwKSxlKGMsMCksZSgwLGMpLGUoYyxjKV0sdGhpcy5lbCl9LHRoaXMudHJhbnNmb3JtQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKGUsdCxuKXt2YXIgcj1lWzFdKnRbMF0tZVswXSp0WzFdO3JldHVyblsoLXRbMV0qblswXSt0WzBdKm5bMV0pL3IsKCtlWzFdKm5bMF0tZVswXSpuWzFdKS9yXX1mdW5jdGlvbiBpKGUsdCl7cmV0dXJuW2VbMF0tdFswXSxlWzFdLXRbMV1dfWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm5bZVswXSt0WzBdLGVbMV0rdFsxXV19ZnVuY3Rpb24gbyhlLHQpe3JldHVybltlKnRbMF0sZSp0WzFdXX1mdW5jdGlvbiB1KGUpe3ZhciB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW3QubGVmdCx0LnRvcF19aWYoZSl7dmFyIG49dGhpcy4kZ2V0Wm9vbSh0aGlzLmVsKTtlPW8oMS9uLGUpfXRoaXMuZWxzfHx0aGlzLiRpbml0VHJhbnNmb3JtTWVhc3VyZU5vZGVzKCk7dmFyIGE9dSh0aGlzLmVsc1swXSksZj11KHRoaXMuZWxzWzFdKSxsPXUodGhpcy5lbHNbMl0pLGg9dSh0aGlzLmVsc1szXSkscD1yKGkoaCxmKSxpKGgsbCksaShzKGYsbCkscyhoLGEpKSksZD1vKDErcFswXSxpKGYsYSkpLHY9bygxK3BbMV0saShsLGEpKTtpZih0KXt2YXIgbT10LGc9cFswXSptWzBdL2MrcFsxXSptWzFdL2MrMSx5PXMobyhtWzBdLGQpLG8obVsxXSx2KSk7cmV0dXJuIHMobygxL2cvYyx5KSxhKX12YXIgYj1pKGUsYSksdz1yKGkoZCxvKHBbMF0sYikpLGkodixvKHBbMV0sYikpLGIpO3JldHVybiBvKGMsdyl9fSkuY2FsbChoLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvdmlydHVhbF9yZW5kZXJlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvY29uZmlnIiwiYWNlL2xheWVyL2d1dHRlciIsImFjZS9sYXllci9tYXJrZXIiLCJhY2UvbGF5ZXIvdGV4dCIsImFjZS9sYXllci9jdXJzb3IiLCJhY2Uvc2Nyb2xsYmFyIiwiYWNlL3Njcm9sbGJhciIsImFjZS9yZW5kZXJsb29wIiwiYWNlL2xheWVyL2ZvbnRfbWV0cmljcyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9jb25maWciKSxvPWUoIi4vbGF5ZXIvZ3V0dGVyIikuR3V0dGVyLHU9ZSgiLi9sYXllci9tYXJrZXIiKS5NYXJrZXIsYT1lKCIuL2xheWVyL3RleHQiKS5UZXh0LGY9ZSgiLi9sYXllci9jdXJzb3IiKS5DdXJzb3IsbD1lKCIuL3Njcm9sbGJhciIpLkhTY3JvbGxCYXIsYz1lKCIuL3Njcm9sbGJhciIpLlZTY3JvbGxCYXIsaD1lKCIuL3JlbmRlcmxvb3AiKS5SZW5kZXJMb29wLHA9ZSgiLi9sYXllci9mb250X21ldHJpY3MiKS5Gb250TWV0cmljcyxkPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdj0nLmFjZV9icjEge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7fS5hY2VfYnIyIHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4O30uYWNlX2JyMyB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDt9LmFjZV9icjQge2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI1IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNiB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjcge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI4IHtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIDogM3B4O30uYWNlX2JyOSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEwe2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMXtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTJ7Ym9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEze2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxNHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTV7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogM3B4O30uYWNlX2VkaXRvciB7cG9zaXRpb246IHJlbGF0aXZlO292ZXJmbG93OiBoaWRkZW47Zm9udDogMTJweC9ub3JtYWwgXCdNb25hY29cJywgXCdNZW5sb1wnLCBcJ1VidW50dSBNb25vXCcsIFwnQ29uc29sYXNcJywgXCdzb3VyY2UtY29kZS1wcm9cJywgbW9ub3NwYWNlO2RpcmVjdGlvbjogbHRyO3RleHQtYWxpZ246IGxlZnQ7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApO30uYWNlX3Njcm9sbGVyIHtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3c6IGhpZGRlbjt0b3A6IDA7Ym90dG9tOiAwO2JhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtjdXJzb3I6IHRleHQ7fS5hY2VfY29udGVudCB7cG9zaXRpb246IGFic29sdXRlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7bWluLXdpZHRoOiAxMDAlO2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX2RyYWdnaW5nIC5hY2Vfc2Nyb2xsZXI6YmVmb3Jle3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDtib3R0b206IDA7Y29udGVudDogXCdcJztiYWNrZ3JvdW5kOiByZ2JhKDI1MCwgMjUwLCAyNTAsIDAuMDEpO3otaW5kZXg6IDEwMDA7fS5hY2VfZHJhZ2dpbmcuYWNlX2RhcmsgLmFjZV9zY3JvbGxlcjpiZWZvcmV7YmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjAxKTt9LmFjZV9zZWxlY3RpbmcsIC5hY2Vfc2VsZWN0aW5nICoge2N1cnNvcjogdGV4dCAhaW1wb3J0YW50O30uYWNlX2d1dHRlciB7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93IDogaGlkZGVuO3dpZHRoOiBhdXRvO3RvcDogMDtib3R0b206IDA7bGVmdDogMDtjdXJzb3I6IGRlZmF1bHQ7ei1pbmRleDogNDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX2d1dHRlci1hY3RpdmUtbGluZSB7cG9zaXRpb246IGFic29sdXRlO2xlZnQ6IDA7cmlnaHQ6IDA7fS5hY2Vfc2Nyb2xsZXIuYWNlX3Njcm9sbC1sZWZ0IHtib3gtc2hhZG93OiAxN3B4IDAgMTZweCAtMTZweCByZ2JhKDAsIDAsIDAsIDAuNCkgaW5zZXQ7fS5hY2VfZ3V0dGVyLWNlbGwge3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDtwYWRkaW5nLWxlZnQ6IDE5cHg7cGFkZGluZy1yaWdodDogNnB4O2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX2Vycm9yIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUJPRkJNVkVYLy8vLy8vLy8vUVJzd0ZBYi9VaTR3RkFZd0ZBWXdGQWFXR0FmRFJ5bXpPU0gvUHhzd0ZBYi9TaVV3RkFZd0ZBYlVQUnZqUWlEbGxvZzVIaEhkUnlic1RpMy9UeXY5VGlyK1N5ai9VQzMvLy8vWHVyZWJNQkl3RkFiL1JTSGJQeC9nVXpmZHdMM2t6TWl2S0JBd0ZBYmJ2Ym5oUHg2Nk5ob3dGQVl3RkFhWkpnOHdGQWF4S0JEWnVyZi9SQjZtTXhiL1NDTXdGQVl3RkFieFFCMytSQjR3RkFiL1FoeTRPaCs0UWlmYk5SY3dGQVl3RkFZd0ZBYi9RUnpkTmhnd0ZBWXdGQWJhdjd2L1V5N29hRTY4TUJLNUx4TGV3ci9yMk5YZXdMc3dGQWF4Snc0d0ZBYmtQUnkyUHlZd0ZBYXhLaExtMXRNd0ZBYXpQaVF3RkFhVUdBYi9RQnJmT3gzYnZydi9WQy9tYUU0d0ZBYlJQQnE2TVJPOFF5bmV3OERwMnRqZndiMHdGQWJ4NmVqdTUrYnk2dW5zNHVIOS9mMzYrdnIvR2tIakFBQUFZblJTVGxNQUd0KzY0cm5XdS9ibzhlQUE0SW5IMytEd29ON2o0ZUxpNHhQOTlOZmc0K2IrL3U5Qi9lRHMxTUQxbU83KzRQSGcyTVhhMzQ3Zzd2RGl6TUxONGVHK1B2N2k1ZXZzL3Y3OXl1N1MzL0RWNy80OThZdjI0ZUgrNHVmUTNPenUvdjcreTEzc1Jxd0FBQURMU1VSQlZIamFaYy9YRHNGZ0dJQmh0RHJzaGxpdG1rMklyYkhGcUwycHZYZi8rNzhEUG9rajcrRno5cXBVLzlVWEpJbGhtUGFUYVE2UVBhejBtbSs1Z3drZ292Y1Y2R1p6ZDVKdENRd2dzeG9IT3ZKTzE1a2xlUkxBbk1nSEZJRVNVRVBtYXdCOW5nbWVsVHRpcHd3ZkFTaWx4T0x5aVY1VVZVeVZBZmJHMGNDUEhpZytHQmt6QUVOSFMwQXN0VkY2YmFjWklPemdMbXhzSGJ0Mk9lY05nSkM4M0pFUm1lUFVZcThBUkdrSng2WHRGc2RkZEJRZ1pFMm5QUjZDSUNaaGF3akE0RmIvY2h2KzM5OWtmUitNTU1ER09RQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2d1dHRlci1jZWxsLmFjZV93YXJuaW5nIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUFtVkJNVkVYLy8vOEFBQUQvLy84QUFBQUFBQUJQU3piLzVzQUFBQUIvYmxILzczei91bGtBQUFBQUFBRDg1cGtBQUFBQUFBQUNBZ1Avdkd6L3JrRGVyR2JHclY3L3BrUUlDQWYvLy8vZTBJc0FBQUQvb0VEL3FUdmhyblVBQUFEL3lIRC9uamNBQUFEdXYyci9uei8vb1RqL3AwNjRvR2YvekhBQUFBQTlOaXIvdEZJQUFBRC90bFRpdVdmL3RrSUFBQUN5blhFQUFBQUFBQUF0SVJXN3pCcEJBQUFBTTNSU1RsTUFBQlIxbTdSWE84TG4zMVozNnpUK25lWGU1T3pvb1JEZm4rVFo0cDNoMmhUZjR0M2szdWN5ck4xSzUrWGFrczUyU2ZzOUNYZ3JBQUFBamtsRVFWUjQybzNQYlErQ0lCUUZZRXdib1BoU1lnb1l1bklxcUxuNi96OHVZZEg4Vm1kbnU5dno0V3dYZ04veFRQUkQyK3NnT2NaanNnZS93aFhaZ1VhWVl2VDhRbnVKYVVyanJIVVFyZUdjenVFYWZRQ08vU0pUdWZUYnJvV3NQZ3NsbFZocTN3SkVrMmpVU3pYM0NVRURKQzg0NzA3ZGpSYzVNVEFReG9MZ3VwV1J3VzZVQjVmUysrTlY4QWJPWmduc0M3QnBFQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZ3V0dGVyLWNlbGwuYWNlX2luZm8ge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FBQUFBQTZtS0M5QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFBSjBVazVUQUFCMms4MDRBQUFBUGtsRVFWUVkwMk5nSUI2OFF1TzN0aUx6bmpBd3BLVGdOeURiTWVnd2lzQ0haVUVUVVpWMFpxT3F1QnBYajJydG5wU0pUMUFFbm5SbUwyT2dHZ0FBSUtrUlFhcDJodGdBQUFBQVNVVk9SSzVDWUlJPSIpO2JhY2tncm91bmQtcG9zaXRpb246IDJweCBjZW50ZXI7fS5hY2VfZGFyayAuYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUJBTUFBQUR0M2VKU0FBQUFKRkJNVkVVQUFBQ2hvYUdBZ0lBcUtpcSt2cjZ0cmExWldWbVVsSlNibTVzOFBEeHVibTU2ZW5yZGd6ZzNBQUFBQVhSU1RsTUFRT2JZWmdBQUFDbEpSRUZVZU5wallNQVBkc01ZSGVneUpaRlFCbHNVbE1GVkNXVVlLa0FaTXhaQUdkeGxETVFCQUcrVEJQNEI2UnlKQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX3Njcm9sbGJhciB7Y29udGFpbjogc3RyaWN0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtyaWdodDogMDtib3R0b206IDA7ei1pbmRleDogNjt9LmFjZV9zY3JvbGxiYXItaW5uZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtjdXJzb3I6IHRleHQ7bGVmdDogMDt0b3A6IDA7fS5hY2Vfc2Nyb2xsYmFyLXZ7b3ZlcmZsb3cteDogaGlkZGVuO292ZXJmbG93LXk6IHNjcm9sbDt0b3A6IDA7fS5hY2Vfc2Nyb2xsYmFyLWgge292ZXJmbG93LXg6IHNjcm9sbDtvdmVyZmxvdy15OiBoaWRkZW47bGVmdDogMDt9LmFjZV9wcmludC1tYXJnaW4ge3Bvc2l0aW9uOiBhYnNvbHV0ZTtoZWlnaHQ6IDEwMCU7fS5hY2VfdGV4dC1pbnB1dCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDA7d2lkdGg6IDAuNWVtO2hlaWdodDogMWVtO29wYWNpdHk6IDA7YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7LW1vei1hcHBlYXJhbmNlOiBub25lO2FwcGVhcmFuY2U6IG5vbmU7Ym9yZGVyOiBub25lO3Jlc2l6ZTogbm9uZTtvdXRsaW5lOiBub25lO292ZXJmbG93OiBoaWRkZW47Zm9udDogaW5oZXJpdDtwYWRkaW5nOiAwIDFweDttYXJnaW46IDAgLTFweDtjb250YWluOiBzdHJpY3Q7LW1zLXVzZXItc2VsZWN0OiB0ZXh0Oy1tb3otdXNlci1zZWxlY3Q6IHRleHQ7LXdlYmtpdC11c2VyLXNlbGVjdDogdGV4dDt1c2VyLXNlbGVjdDogdGV4dDt3aGl0ZS1zcGFjZTogcHJlIWltcG9ydGFudDt9LmFjZV90ZXh0LWlucHV0LmFjZV9jb21wb3NpdGlvbiB7YmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7Y29sb3I6IGluaGVyaXQ7ei1pbmRleDogMTAwMDtvcGFjaXR5OiAxO30uYWNlX2NvbXBvc2l0aW9uX3BsYWNlaG9sZGVyIHsgY29sb3I6IHRyYW5zcGFyZW50IH0uYWNlX2NvbXBvc2l0aW9uX21hcmtlciB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZDtwb3NpdGlvbjogYWJzb2x1dGU7Ym9yZGVyLXJhZGl1czogMDttYXJnaW4tdG9wOiAxcHg7fVthY2Vfbm9jb250ZXh0PXRydWVdIHt0cmFuc2Zvcm06IG5vbmUhaW1wb3J0YW50O2ZpbHRlcjogbm9uZSFpbXBvcnRhbnQ7cGVyc3BlY3RpdmU6IG5vbmUhaW1wb3J0YW50O2NsaXAtcGF0aDogbm9uZSFpbXBvcnRhbnQ7bWFzayA6IG5vbmUhaW1wb3J0YW50O2NvbnRhaW46IG5vbmUhaW1wb3J0YW50O3BlcnNwZWN0aXZlOiBub25lIWltcG9ydGFudDttaXgtYmxlbmQtbW9kZTogaW5pdGlhbCFpbXBvcnRhbnQ7ei1pbmRleDogYXV0bzt9LmFjZV9sYXllciB7ei1pbmRleDogMTtwb3NpdGlvbjogYWJzb2x1dGU7b3ZlcmZsb3c6IGhpZGRlbjt3b3JkLXdyYXA6IG5vcm1hbDt3aGl0ZS1zcGFjZTogcHJlO2hlaWdodDogMTAwJTt3aWR0aDogMTAwJTtib3gtc2l6aW5nOiBib3JkZXItYm94O3BvaW50ZXItZXZlbnRzOiBub25lO30uYWNlX2d1dHRlci1sYXllciB7cG9zaXRpb246IHJlbGF0aXZlO3dpZHRoOiBhdXRvO3RleHQtYWxpZ246IHJpZ2h0O3BvaW50ZXItZXZlbnRzOiBhdXRvO2hlaWdodDogMTAwMDAwMHB4O2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O30uYWNlX3RleHQtbGF5ZXIge2ZvbnQ6IGluaGVyaXQgIWltcG9ydGFudDtwb3NpdGlvbjogYWJzb2x1dGU7aGVpZ2h0OiAxMDAwMDAwcHg7d2lkdGg6IDEwMDAwMDBweDtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lLCAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmVfZ3JvdXAge2NvbnRhaW46IHN0eWxlIHNpemUgbGF5b3V0O3Bvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IDA7bGVmdDogMDtyaWdodDogMDt9LmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIsLmFjZV9oaWRwaSAuYWNlX2d1dHRlci1sYXllciwuYWNlX2hpZHBpIC5hY2VfY29udGVudCwuYWNlX2hpZHBpIC5hY2VfZ3V0dGVyIHtjb250YWluOiBzdHJpY3Q7d2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTt9LmFjZV9oaWRwaSAuYWNlX3RleHQtbGF5ZXIgPiAuYWNlX2xpbmUsIC5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lX2dyb3VwIHtjb250YWluOiBzdHJpY3Q7fS5hY2VfY2prIHtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7dGV4dC1hbGlnbjogY2VudGVyO30uYWNlX2N1cnNvci1sYXllciB7ei1pbmRleDogNDt9LmFjZV9jdXJzb3Ige3otaW5kZXg6IDQ7cG9zaXRpb246IGFic29sdXRlO2JveC1zaXppbmc6IGJvcmRlci1ib3g7Ym9yZGVyLWxlZnQ6IDJweCBzb2xpZDt0cmFuc2Zvcm06IHRyYW5zbGF0ZXooMCk7fS5hY2VfbXVsdGlzZWxlY3QgLmFjZV9jdXJzb3Ige2JvcmRlci1sZWZ0LXdpZHRoOiAxcHg7fS5hY2Vfc2xpbS1jdXJzb3JzIC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMXB4O30uYWNlX292ZXJ3cml0ZS1jdXJzb3JzIC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMDtib3JkZXItYm90dG9tOiAxcHggc29saWQ7fS5hY2VfaGlkZGVuLWN1cnNvcnMgLmFjZV9jdXJzb3Ige29wYWNpdHk6IDAuMjt9LmFjZV9zbW9vdGgtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige3RyYW5zaXRpb246IG9wYWNpdHkgMC4xOHM7fS5hY2VfYW5pbWF0ZS1ibGlua2luZyAuYWNlX2N1cnNvciB7YW5pbWF0aW9uLWR1cmF0aW9uOiAxMDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogc3RlcC1lbmQ7YW5pbWF0aW9uLW5hbWU6IGJsaW5rLWFjZS1hbmltYXRlO2FuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO30uYWNlX2FuaW1hdGUtYmxpbmtpbmcuYWNlX3Ntb290aC1ibGlua2luZyAuYWNlX2N1cnNvciB7YW5pbWF0aW9uLWR1cmF0aW9uOiAxMDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbi1vdXQ7YW5pbWF0aW9uLW5hbWU6IGJsaW5rLWFjZS1hbmltYXRlLXNtb290aDt9QGtleWZyYW1lcyBibGluay1hY2UtYW5pbWF0ZSB7ZnJvbSwgdG8geyBvcGFjaXR5OiAxOyB9NjAlIHsgb3BhY2l0eTogMDsgfX1Aa2V5ZnJhbWVzIGJsaW5rLWFjZS1hbmltYXRlLXNtb290aCB7ZnJvbSwgdG8geyBvcGFjaXR5OiAxOyB9NDUlIHsgb3BhY2l0eTogMTsgfTYwJSB7IG9wYWNpdHk6IDA7IH04NSUgeyBvcGFjaXR5OiAwOyB9fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RlcCwgLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDM7fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNTt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9icmFja2V0IHtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogNjt9LmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmUtbGluZSB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDI7fS5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0ZWQtd29yZCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDQ7Ym94LXNpemluZzogYm9yZGVyLWJveDt9LmFjZV9saW5lIC5hY2VfZm9sZCB7Ym94LXNpemluZzogYm9yZGVyLWJveDtkaXNwbGF5OiBpbmxpbmUtYmxvY2s7aGVpZ2h0OiAxMXB4O21hcmdpbi10b3A6IC0ycHg7dmVydGljYWwtYWxpZ246IG1pZGRsZTtiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCRUFBQUFKQ0FZQUFBRFU2TWNNQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFKcEpSRUZVZU5waS9QLy9Qd09sZ0FYR1lHUmtsQVZTb2tEOEdtandZMXdhc0tsalFwWUFDdHBDRmVBRGNIVlFmUXlNUUF3endBWkkzd0pLdkNMa2ZLQmFNU0NsQmxSN0JPUWlrQ0ZHUUVFcklIMFZxa2FiaUdDQXF3VWFkQXpaSlJ4UXIvMGd3aVhJYWw4elFRUG5OVlRnSjFUZGF3TDBUNWdCSVAxTVVKTmhCdjJIS29RSEhqcU5yQTRXTzR6WTBnbHlOS0xUMktJZklNQUFRc2RnR2lYdmduWUFBQUFBU1VWT1JLNUNZSUk9IiksdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQTNDQVlBQUFETk5pQTVBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUNKSlJFRlVlTnBpK1AvL2Z4Z1RBd1BEQnhEeEQwNzhSU1grWWVFeURGTUNJTUFBSTNJTm1YaXdmMllBQUFBQVNVVk9SSzVDWUlJPSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQsIHJlcGVhdC14O2JhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXIsIHRvcCBsZWZ0O2NvbG9yOiB0cmFuc3BhcmVudDtib3JkZXI6IDFweCBzb2xpZCBibGFjaztib3JkZXItcmFkaXVzOiAycHg7Y3Vyc29yOiBwb2ludGVyO3BvaW50ZXItZXZlbnRzOiBhdXRvO30uYWNlX2RhcmsgLmFjZV9mb2xkIHt9LmFjZV9mb2xkOmhvdmVye2JhY2tncm91bmQtaW1hZ2U6dXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJFQUFBQUpDQVlBQUFEVTZNY01BQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUpwSlJFRlVlTnBpL1AvL1B3T2xnQVhHWUdSa2xBVlNva0Q4R21qd1kxd2FzS2xqUXBZQUN0cENGZUFEY0hWUWZReU1RQXd6d0FaSTN3Skt2Q0xrZktCYU1TQ2xCbFI3Qk9RaWtDRkdRRUVySUgwVnFrYWJpR0NBcXdVYWRBelpKUnhRci8wZ3dpWElhbDh6UVFQbk5WVGdKMVRkYXdMMFQ1Z0JJUDFNVUpOaEJ2MkhLb1FISGpxTnJBNFdPNHpZMGdseU5LTFQyS0lmSU1BQVFzZGdHaVh2Z25ZQUFBQUFTVVZPUks1Q1lJST0iKSx1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBM0NBWUFBQUROTmlBNUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQ0JKUkVGVWVOcGkrUC8vZno0VEF3UERaeER4RDVYNGk1ZkxNRXdKZ0FBREFFUFZEYmpOdzg3WkFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV90b29sdGlwIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGO2JhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHRyYW5zcGFyZW50LCByZ2JhKDAsIDAsIDAsIDAuMSkpO2JvcmRlcjogMXB4IHNvbGlkIGdyYXk7Ym9yZGVyLXJhZGl1czogMXB4O2JveC1zaGFkb3c6IDAgMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7Y29sb3I6IGJsYWNrO21heC13aWR0aDogMTAwJTtwYWRkaW5nOiAzcHggNHB4O3Bvc2l0aW9uOiBmaXhlZDt6LWluZGV4OiA5OTk5OTk7Ym94LXNpemluZzogYm9yZGVyLWJveDtjdXJzb3I6IGRlZmF1bHQ7d2hpdGUtc3BhY2U6IHByZTt3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7bGluZS1oZWlnaHQ6IG5vcm1hbDtmb250LXN0eWxlOiBub3JtYWw7Zm9udC13ZWlnaHQ6IG5vcm1hbDtsZXR0ZXItc3BhY2luZzogbm9ybWFsO3BvaW50ZXItZXZlbnRzOiBub25lO30uYWNlX2ZvbGRpbmctZW5hYmxlZCA+IC5hY2VfZ3V0dGVyLWNlbGwge3BhZGRpbmctcmlnaHQ6IDEzcHg7fS5hY2VfZm9sZC13aWRnZXQge2JveC1zaXppbmc6IGJvcmRlci1ib3g7bWFyZ2luOiAwIC0xMnB4IDAgMXB4O2Rpc3BsYXk6IG5vbmU7d2lkdGg6IDExcHg7dmVydGljYWwtYWxpZ246IHRvcDtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFORWxFUVZSNDJtV0tzUTBBTUF6QzhpeExscnpRanptQmlFanAwQTZXd0JDU1BnS0FYb0xrcVNvdDduTjN5TXdSN3BaMzJOenBLa1ZvREJVeEtBQUFBQUJKUlU1RXJrSmdnZz09Iik7YmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7Ym9yZGVyLXJhZGl1czogM3B4O2JvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O2N1cnNvcjogcG9pbnRlcjt9LmFjZV9mb2xkaW5nLWVuYWJsZWQgLmFjZV9mb2xkLXdpZGdldCB7ZGlzcGxheTogaW5saW5lLWJsb2NrOyAgIH0uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9lbmQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQU5FbEVRVlI0Mm0zSHdRa0FNQWhEMFl6c1JjaEZLSTdzQWlrZVdrcnh3U2NFQjBuaDVlN0tUUFdpbVpraTR0WWZWYlgrTU5sNHB5WlhlalVPMVFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9mb2xkLXdpZGdldC5hY2VfY2xvc2VkIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBR0NBWUFBQUFHNVNRTUFBQUFPVWxFUVZSNDJqWEt3UWtBTUFnRHdLd3FLRDRFd1EyNnNTT2tWV2pnSUlIQXpQaUNnYXFpcW5KSFpuS0lDQkVSSE4xOTRPNWI5dmJMdUFWUkwrbDBZV25aQUFBQUFFbEZUa1N1UW1DQ1hBPT0iKTt9LmFjZV9mb2xkLXdpZGdldDpob3ZlciB7Ym9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjMpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtib3gtc2hhZG93OiAwIDFweCAxcHggcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO30uYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7Ym9yZGVyOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjQpO2JhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC4wNSk7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQUhrbEVRVlFJVzJQNC8vOC9Bem9HRVE3b0dDYUxMQWhXaVN3QjE0NkJBUUNTVFBZb2NxVDBBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0LmFjZV9lbmQge2JhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQUgwbEVRVlFJVzJQNC8vOC9BeFE3d05qSUFqRE1nQzRBeGpDVktCaXJJQUFGMGt6MnJsaHhwQUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldC5hY2VfY2xvc2VkIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBRkNBWUFBQUNBY1ZhaUFBQUFIRWxFUVZRSVcyUDQvLysvQXhBemdEQURsT09Bem5IQUtnUFdBd0FSamk4VUlEVGZRUUFBQUFCSlJVNUVya0pnZ2c9PSIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldDpob3ZlciB7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0OmFjdGl2ZSB7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTt9LmFjZV9pbmxpbmVfYnV0dG9uIHtib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyYXk7ZGlzcGxheTogaW5saW5lLWJsb2NrO21hcmdpbjogLTFweCA4cHg7cGFkZGluZzogMCA1cHg7cG9pbnRlci1ldmVudHM6IGF1dG87Y3Vyc29yOiBwb2ludGVyO30uYWNlX2lubGluZV9idXR0b246aG92ZXIge2JvcmRlci1jb2xvcjogZ3JheTtiYWNrZ3JvdW5kOiByZ2JhKDIwMCwyMDAsMjAwLDAuMik7ZGlzcGxheTogaW5saW5lLWJsb2NrO3BvaW50ZXItZXZlbnRzOiBhdXRvO30uYWNlX2ZvbGQtd2lkZ2V0LmFjZV9pbnZhbGlkIHtiYWNrZ3JvdW5kLWNvbG9yOiAjRkZCNEI0O2JvcmRlci1jb2xvcjogI0RFNTU1NTt9LmFjZV9mYWRlLWZvbGQtd2lkZ2V0cyAuYWNlX2ZvbGQtd2lkZ2V0IHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuNHMgZWFzZSAwLjA1cztvcGFjaXR5OiAwO30uYWNlX2ZhZGUtZm9sZC13aWRnZXRzOmhvdmVyIC5hY2VfZm9sZC13aWRnZXQge3RyYW5zaXRpb246IG9wYWNpdHkgMC4wNXMgZWFzZSAwLjA1cztvcGFjaXR5OjE7fS5hY2VfdW5kZXJsaW5lIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9LmFjZV9ib2xkIHtmb250LXdlaWdodDogYm9sZDt9LmFjZV9ub2JvbGQgLmFjZV9ib2xkIHtmb250LXdlaWdodDogbm9ybWFsO30uYWNlX2l0YWxpYyB7Zm9udC1zdHlsZTogaXRhbGljO30uYWNlX2Vycm9yLW1hcmtlciB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsMC4yKTtwb3NpdGlvbjogYWJzb2x1dGU7ei1pbmRleDogOTt9LmFjZV9oaWdobGlnaHQtbWFya2VyIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAwLDAuMik7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDg7fS5hY2VfbW9iaWxlLW1lbnUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtsaW5lLWhlaWdodDogMS41O2JvcmRlci1yYWRpdXM6IDRweDstbXMtdXNlci1zZWxlY3Q6IG5vbmU7LW1vei11c2VyLXNlbGVjdDogbm9uZTstd2Via2l0LXVzZXItc2VsZWN0OiBub25lO3VzZXItc2VsZWN0OiBub25lO2JhY2tncm91bmQ6IHdoaXRlO2JveC1zaGFkb3c6IDFweCAzcHggMnB4IGdyZXk7Ym9yZGVyOiAxcHggc29saWQgI2RjZGNkYztjb2xvcjogYmxhY2s7fS5hY2VfZGFyayA+IC5hY2VfbW9iaWxlLW1lbnUge2JhY2tncm91bmQ6ICMzMzM7Y29sb3I6ICNjY2M7Ym94LXNoYWRvdzogMXB4IDNweCAycHggZ3JleTtib3JkZXI6IDFweCBzb2xpZCAjNDQ0O30uYWNlX21vYmlsZS1idXR0b24ge3BhZGRpbmc6IDJweDtjdXJzb3I6IHBvaW50ZXI7b3ZlcmZsb3c6IGhpZGRlbjt9LmFjZV9tb2JpbGUtYnV0dG9uOmhvdmVyIHtiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO29wYWNpdHk6MTt9LmFjZV9tb2JpbGUtYnV0dG9uOmFjdGl2ZSB7YmFja2dyb3VuZC1jb2xvcjogI2RkZDt9JyxtPWUoIi4vbGliL3VzZXJhZ2VudCIpLGc9bS5pc0lFO2kuaW1wb3J0Q3NzU3RyaW5nKHYsImFjZV9lZGl0b3IuY3NzIik7dmFyIHk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuY29udGFpbmVyPWV8fGkuY3JlYXRlRWxlbWVudCgiZGl2IiksaS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2VkaXRvciIpLGkuSElfRFBJJiZpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfaGlkcGkiKSx0aGlzLnNldFRoZW1lKHQpLHRoaXMuJGd1dHRlcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuJGd1dHRlci5jbGFzc05hbWU9ImFjZV9ndXR0ZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJGd1dHRlciksdGhpcy4kZ3V0dGVyLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCEwKSx0aGlzLnNjcm9sbGVyPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5zY3JvbGxlci5jbGFzc05hbWU9ImFjZV9zY3JvbGxlciIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY3JvbGxlciksdGhpcy5jb250ZW50PWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5jb250ZW50LmNsYXNzTmFtZT0iYWNlX2NvbnRlbnQiLHRoaXMuc2Nyb2xsZXIuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50KSx0aGlzLiRndXR0ZXJMYXllcj1uZXcgbyh0aGlzLiRndXR0ZXIpLHRoaXMuJGd1dHRlckxheWVyLm9uKCJjaGFuZ2VHdXR0ZXJXaWR0aCIsdGhpcy5vbkd1dHRlclJlc2l6ZS5iaW5kKHRoaXMpKSx0aGlzLiRtYXJrZXJCYWNrPW5ldyB1KHRoaXMuY29udGVudCk7dmFyIHI9dGhpcy4kdGV4dExheWVyPW5ldyBhKHRoaXMuY29udGVudCk7dGhpcy5jYW52YXM9ci5lbGVtZW50LHRoaXMuJG1hcmtlckZyb250PW5ldyB1KHRoaXMuY29udGVudCksdGhpcy4kY3Vyc29yTGF5ZXI9bmV3IGYodGhpcy5jb250ZW50KSx0aGlzLiRob3JpelNjcm9sbD0hMSx0aGlzLiR2U2Nyb2xsPSExLHRoaXMuc2Nyb2xsQmFyPXRoaXMuc2Nyb2xsQmFyVj1uZXcgYyh0aGlzLmNvbnRhaW5lcix0aGlzKSx0aGlzLnNjcm9sbEJhckg9bmV3IGwodGhpcy5jb250YWluZXIsdGhpcyksdGhpcy5zY3JvbGxCYXJWLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oZSl7bi4kc2Nyb2xsQW5pbWF0aW9ufHxuLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGUuZGF0YS1uLnNjcm9sbE1hcmdpbi50b3ApfSksdGhpcy5zY3JvbGxCYXJILmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZnVuY3Rpb24oZSl7bi4kc2Nyb2xsQW5pbWF0aW9ufHxuLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChlLmRhdGEtbi5zY3JvbGxNYXJnaW4ubGVmdCl9KSx0aGlzLnNjcm9sbFRvcD0wLHRoaXMuc2Nyb2xsTGVmdD0wLHRoaXMuY3Vyc29yUG9zPXtyb3c6MCxjb2x1bW46MH0sdGhpcy4kZm9udE1ldHJpY3M9bmV3IHAodGhpcy5jb250YWluZXIpLHRoaXMuJHRleHRMYXllci4kc2V0Rm9udE1ldHJpY3ModGhpcy4kZm9udE1ldHJpY3MpLHRoaXMuJHRleHRMYXllci5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixmdW5jdGlvbihlKXtuLnVwZGF0ZUNoYXJhY3RlclNpemUoKSxuLm9uUmVzaXplKCEwLG4uZ3V0dGVyV2lkdGgsbi4kc2l6ZS53aWR0aCxuLiRzaXplLmhlaWdodCksbi5fc2lnbmFsKCJjaGFuZ2VDaGFyYWN0ZXJTaXplIixlKX0pLHRoaXMuJHNpemU9e3dpZHRoOjAsaGVpZ2h0OjAsc2Nyb2xsZXJIZWlnaHQ6MCxzY3JvbGxlcldpZHRoOjAsJGRpcnR5OiEwfSx0aGlzLmxheWVyQ29uZmlnPXt3aWR0aDoxLHBhZGRpbmc6MCxmaXJzdFJvdzowLGZpcnN0Um93U2NyZWVuOjAsbGFzdFJvdzowLGxpbmVIZWlnaHQ6MCxjaGFyYWN0ZXJXaWR0aDowLG1pbkhlaWdodDoxLG1heEhlaWdodDoxLG9mZnNldDowLGhlaWdodDoxLGd1dHRlck9mZnNldDoxfSx0aGlzLnNjcm9sbE1hcmdpbj17bGVmdDowLHJpZ2h0OjAsdG9wOjAsYm90dG9tOjAsdjowLGg6MH0sdGhpcy5tYXJnaW49e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowLHY6MCxoOjB9LHRoaXMuJGtlZXBUZXh0QXJlYUF0Q3Vyc29yPSFtLmlzSU9TLHRoaXMuJGxvb3A9bmV3IGgodGhpcy4kcmVuZGVyQ2hhbmdlcy5iaW5kKHRoaXMpLHRoaXMuY29udGFpbmVyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy51cGRhdGVDaGFyYWN0ZXJTaXplKCksdGhpcy5zZXRQYWRkaW5nKDQpLHMucmVzZXRPcHRpb25zKHRoaXMpLHMuX3NpZ25hbCgicmVuZGVyZXIiLHRoaXMpfTsoZnVuY3Rpb24oKXt0aGlzLkNIQU5HRV9DVVJTT1I9MSx0aGlzLkNIQU5HRV9NQVJLRVI9Mix0aGlzLkNIQU5HRV9HVVRURVI9NCx0aGlzLkNIQU5HRV9TQ1JPTEw9OCx0aGlzLkNIQU5HRV9MSU5FUz0xNix0aGlzLkNIQU5HRV9URVhUPTMyLHRoaXMuQ0hBTkdFX1NJWkU9NjQsdGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0s9MTI4LHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVD0yNTYsdGhpcy5DSEFOR0VfRlVMTD01MTIsdGhpcy5DSEFOR0VfSF9TQ1JPTEw9MTAyNCxyLmltcGxlbWVudCh0aGlzLGQpLHRoaXMudXBkYXRlQ2hhcmFjdGVyU2l6ZT1mdW5jdGlvbigpe3RoaXMuJHRleHRMYXllci5hbGxvd0JvbGRGb250cyE9dGhpcy4kYWxsb3dCb2xkRm9udHMmJih0aGlzLiRhbGxvd0JvbGRGb250cz10aGlzLiR0ZXh0TGF5ZXIuYWxsb3dCb2xkRm9udHMsdGhpcy5zZXRTdHlsZSgiYWNlX25vYm9sZCIsIXRoaXMuJGFsbG93Qm9sZEZvbnRzKSksdGhpcy5sYXllckNvbmZpZy5jaGFyYWN0ZXJXaWR0aD10aGlzLmNoYXJhY3RlcldpZHRoPXRoaXMuJHRleHRMYXllci5nZXRDaGFyYWN0ZXJXaWR0aCgpLHRoaXMubGF5ZXJDb25maWcubGluZUhlaWdodD10aGlzLmxpbmVIZWlnaHQ9dGhpcy4kdGV4dExheWVyLmdldExpbmVIZWlnaHQoKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwibGluZS1oZWlnaHQiLHRoaXMubGluZUhlaWdodCsicHgiKX0sdGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLmRvYy5vZmYoImNoYW5nZU5ld0xpbmVNb2RlIix0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUpLHRoaXMuc2Vzc2lvbj1lLGUmJnRoaXMuc2Nyb2xsTWFyZ2luLnRvcCYmZS5nZXRTY3JvbGxUb3AoKTw9MCYmZS5zZXRTY3JvbGxUb3AoLXRoaXMuc2Nyb2xsTWFyZ2luLnRvcCksdGhpcy4kY3Vyc29yTGF5ZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiRtYXJrZXJCYWNrLnNldFNlc3Npb24oZSksdGhpcy4kbWFya2VyRnJvbnQuc2V0U2Vzc2lvbihlKSx0aGlzLiRndXR0ZXJMYXllci5zZXRTZXNzaW9uKGUpLHRoaXMuJHRleHRMYXllci5zZXRTZXNzaW9uKGUpO2lmKCFlKXJldHVybjt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMuc2Vzc2lvbi4kc2V0Rm9udE1ldHJpY3ModGhpcy4kZm9udE1ldHJpY3MpLHRoaXMuc2Nyb2xsQmFySC5zY3JvbGxMZWZ0PXRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbCx0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGU9dGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlLmJpbmQodGhpcyksdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKCksdGhpcy5zZXNzaW9uLmRvYy5vbigiY2hhbmdlTmV3TGluZU1vZGUiLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSl9LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe3Q9PT11bmRlZmluZWQmJih0PUluZmluaXR5KSx0aGlzLiRjaGFuZ2VkTGluZXM/KHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz5lJiYodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PWUpLHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PHQmJih0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdz10KSk6dGhpcy4kY2hhbmdlZExpbmVzPXtmaXJzdFJvdzplLGxhc3RSb3c6dH07aWYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c8dGhpcy5sYXllckNvbmZpZy5maXJzdFJvdyl7aWYoIW4pcmV0dXJuO3RoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PXRoaXMubGF5ZXJDb25maWcubGFzdFJvd31pZih0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+dGhpcy5sYXllckNvbmZpZy5sYXN0Um93KXJldHVybjt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0xJTkVTKX0sdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKSx0aGlzLiR0ZXh0TGF5ZXIuJHVwZGF0ZUVvbENoYXIoKSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldEVvbENoYXIodGhpcy4kdGV4dExheWVyLkVPTF9DSEFSKX0sdGhpcy5vbkNoYW5nZVRhYlNpemU9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFR8dGhpcy5DSEFOR0VfTUFSS0VSKSx0aGlzLiR0ZXh0TGF5ZXIub25DaGFuZ2VUYWJTaXplKCl9LHRoaXMudXBkYXRlVGV4dD1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LHRoaXMudXBkYXRlRnVsbD1mdW5jdGlvbihlKXtlP3RoaXMuJHJlbmRlckNoYW5nZXModGhpcy5DSEFOR0VfRlVMTCwhMCk6dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKX0sdGhpcy51cGRhdGVGb250U2l6ZT1mdW5jdGlvbigpe3RoaXMuJHRleHRMYXllci5jaGVja0ZvclNpemVDaGFuZ2VzKCl9LHRoaXMuJGNoYW5nZXM9MCx0aGlzLiR1cGRhdGVTaXplQXN5bmM9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnBlbmRpbmc/dGhpcy4kc2l6ZS4kZGlydHk9ITA6dGhpcy5vblJlc2l6ZSgpfSx0aGlzLm9uUmVzaXplPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHRoaXMucmVzaXppbmc+MilyZXR1cm47dGhpcy5yZXNpemluZz4wP3RoaXMucmVzaXppbmcrKzp0aGlzLnJlc2l6aW5nPWU/MTowO3ZhciBpPXRoaXMuY29udGFpbmVyO3J8fChyPWkuY2xpZW50SGVpZ2h0fHxpLnNjcm9sbEhlaWdodCksbnx8KG49aS5jbGllbnRXaWR0aHx8aS5zY3JvbGxXaWR0aCk7dmFyIHM9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZShlLHQsbixyKTtpZighdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodHx8IW4mJiFyKXJldHVybiB0aGlzLnJlc2l6aW5nPTA7ZSYmKHRoaXMuJGd1dHRlckxheWVyLiRwYWRkaW5nPW51bGwpLGU/dGhpcy4kcmVuZGVyQ2hhbmdlcyhzfHRoaXMuJGNoYW5nZXMsITApOnRoaXMuJGxvb3Auc2NoZWR1bGUoc3x0aGlzLiRjaGFuZ2VzKSx0aGlzLnJlc2l6aW5nJiYodGhpcy5yZXNpemluZz0wKSx0aGlzLnNjcm9sbEJhclYuc2Nyb2xsTGVmdD10aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGx9LHRoaXMuJHVwZGF0ZUNhY2hlZFNpemU9ZnVuY3Rpb24oZSx0LG4scil7ci09dGhpcy4kZXh0cmFIZWlnaHR8fDA7dmFyIHM9MCxvPXRoaXMuJHNpemUsdT17d2lkdGg6by53aWR0aCxoZWlnaHQ6by5oZWlnaHQsc2Nyb2xsZXJIZWlnaHQ6by5zY3JvbGxlckhlaWdodCxzY3JvbGxlcldpZHRoOm8uc2Nyb2xsZXJXaWR0aH07ciYmKGV8fG8uaGVpZ2h0IT1yKSYmKG8uaGVpZ2h0PXIsc3w9dGhpcy5DSEFOR0VfU0laRSxvLnNjcm9sbGVySGVpZ2h0PW8uaGVpZ2h0LHRoaXMuJGhvcml6U2Nyb2xsJiYoby5zY3JvbGxlckhlaWdodC09dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKSx0aGlzLnNjcm9sbEJhclYuZWxlbWVudC5zdHlsZS5ib3R0b209dGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKyJweCIsc3w9dGhpcy5DSEFOR0VfU0NST0xMKTtpZihuJiYoZXx8by53aWR0aCE9bikpe3N8PXRoaXMuQ0hBTkdFX1NJWkUsby53aWR0aD1uLHQ9PW51bGwmJih0PXRoaXMuJHNob3dHdXR0ZXI/dGhpcy4kZ3V0dGVyLm9mZnNldFdpZHRoOjApLHRoaXMuZ3V0dGVyV2lkdGg9dCxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsQmFySC5lbGVtZW50LnN0eWxlLCJsZWZ0Iix0KyJweCIpLGkuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwibGVmdCIsdCt0aGlzLm1hcmdpbi5sZWZ0KyJweCIpLG8uc2Nyb2xsZXJXaWR0aD1NYXRoLm1heCgwLG4tdC10aGlzLnNjcm9sbEJhclYuZ2V0V2lkdGgoKS10aGlzLm1hcmdpbi5oKSxpLnNldFN0eWxlKHRoaXMuJGd1dHRlci5zdHlsZSwibGVmdCIsdGhpcy5tYXJnaW4ubGVmdCsicHgiKTt2YXIgYT10aGlzLnNjcm9sbEJhclYuZ2V0V2lkdGgoKSsicHgiO2kuc2V0U3R5bGUodGhpcy5zY3JvbGxCYXJILmVsZW1lbnQuc3R5bGUsInJpZ2h0IixhKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsInJpZ2h0IixhKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImJvdHRvbSIsdGhpcy5zY3JvbGxCYXJILmdldEhlaWdodCgpKTtpZih0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLmFkanVzdFdyYXBMaW1pdCgpfHxlKXN8PXRoaXMuQ0hBTkdFX0ZVTEx9cmV0dXJuIG8uJGRpcnR5PSFufHwhcixzJiZ0aGlzLl9zaWduYWwoInJlc2l6ZSIsdSksc30sdGhpcy5vbkd1dHRlclJlc2l6ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRzaG93R3V0dGVyP2U6MDt0IT10aGlzLmd1dHRlcldpZHRoJiYodGhpcy4kY2hhbmdlc3w9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0LHRoaXMuJHNpemUud2lkdGgsdGhpcy4kc2l6ZS5oZWlnaHQpKSx0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKT90aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOnRoaXMuJHNpemUuJGRpcnR5P3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCk6dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLXRoaXMuJHBhZGRpbmcqMix0PU1hdGguZmxvb3IoZS90aGlzLmNoYXJhY3RlcldpZHRoKTtyZXR1cm4gdGhpcy5zZXNzaW9uLmFkanVzdFdyYXBMaW1pdCh0LHRoaXMuJHNob3dQcmludE1hcmdpbiYmdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4pfSx0aGlzLnNldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJhbmltYXRlZFNjcm9sbCIsZSl9LHRoaXMuZ2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYW5pbWF0ZWRTY3JvbGx9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dJbnZpc2libGVzIixlKSx0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnNldFNob3dJbnZpc2libGVzKGUpfSx0aGlzLmdldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93SW52aXNpYmxlcyIpfSx0aGlzLmdldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImRpc3BsYXlJbmRlbnRHdWlkZXMiKX0sdGhpcy5zZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJkaXNwbGF5SW5kZW50R3VpZGVzIixlKX0sdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNob3dQcmludE1hcmdpbiIsZSl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93UHJpbnRNYXJnaW4iKX0sdGhpcy5zZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigicHJpbnRNYXJnaW5Db2x1bW4iLGUpfSx0aGlzLmdldFByaW50TWFyZ2luQ29sdW1uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJwcmludE1hcmdpbkNvbHVtbiIpfSx0aGlzLmdldFNob3dHdXR0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dHdXR0ZXIiKX0sdGhpcy5zZXRTaG93R3V0dGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnNldE9wdGlvbigic2hvd0d1dHRlciIsZSl9LHRoaXMuZ2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiKX0sdGhpcy5zZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIsZSl9LHRoaXMuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIsZSl9LHRoaXMuZ2V0SGlnaGxpZ2h0R3V0dGVyTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiaGlnaGxpZ2h0R3V0dGVyTGluZSIpfSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbj1mdW5jdGlvbigpe2lmKCF0aGlzLiRzaG93UHJpbnRNYXJnaW4mJiF0aGlzLiRwcmludE1hcmdpbkVsKXJldHVybjtpZighdGhpcy4kcHJpbnRNYXJnaW5FbCl7dmFyIGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKTtlLmNsYXNzTmFtZT0iYWNlX2xheWVyIGFjZV9wcmludC1tYXJnaW4tbGF5ZXIiLHRoaXMuJHByaW50TWFyZ2luRWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRwcmludE1hcmdpbkVsLmNsYXNzTmFtZT0iYWNlX3ByaW50LW1hcmdpbiIsZS5hcHBlbmRDaGlsZCh0aGlzLiRwcmludE1hcmdpbkVsKSx0aGlzLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpfXZhciB0PXRoaXMuJHByaW50TWFyZ2luRWwuc3R5bGU7dC5sZWZ0PU1hdGgucm91bmQodGhpcy5jaGFyYWN0ZXJXaWR0aCp0aGlzLiRwcmludE1hcmdpbkNvbHVtbit0aGlzLiRwYWRkaW5nKSsicHgiLHQudmlzaWJpbGl0eT10aGlzLiRzaG93UHJpbnRNYXJnaW4/InZpc2libGUiOiJoaWRkZW4iLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLiR3cmFwPT0tMSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKX0sdGhpcy5nZXRDb250YWluZXJFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGFpbmVyfSx0aGlzLmdldE1vdXNlRXZlbnRUYXJnZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxlcn0sdGhpcy5nZXRUZXh0QXJlYUNvbnRhaW5lcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3I9ZnVuY3Rpb24oKXtpZih0aGlzLiRpc01vdXNlUHJlc3NlZClyZXR1cm47dmFyIGU9dGhpcy50ZXh0YXJlYS5zdHlsZSx0PXRoaXMuJGNvbXBvc2l0aW9uO2lmKCF0aGlzLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmIXQpe2kudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsLTEwMCwwKTtyZXR1cm59dmFyIG49dGhpcy4kY3Vyc29yTGF5ZXIuJHBpeGVsUG9zO2lmKCFuKXJldHVybjt0JiZ0Lm1hcmtlclJhbmdlJiYobj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHQubWFya2VyUmFuZ2Uuc3RhcnQsITApKTt2YXIgcj10aGlzLmxheWVyQ29uZmlnLHM9bi50b3Asbz1uLmxlZnQ7cy09ci5vZmZzZXQ7dmFyIHU9dCYmdC51c2VUZXh0YXJlYUZvcklNRT90aGlzLmxpbmVIZWlnaHQ6Zz8wOjE7aWYoczwwfHxzPnIuaGVpZ2h0LXUpe2kudHJhbnNsYXRlKHRoaXMudGV4dGFyZWEsMCwwKTtyZXR1cm59dmFyIGE9MSxmPXRoaXMuJHNpemUuaGVpZ2h0LXU7aWYoIXQpcys9dGhpcy5saW5lSGVpZ2h0O2Vsc2UgaWYodC51c2VUZXh0YXJlYUZvcklNRSl7dmFyIGw9dGhpcy50ZXh0YXJlYS52YWx1ZTthPXRoaXMuY2hhcmFjdGVyV2lkdGgqdGhpcy5zZXNzaW9uLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChsKVswXSx1Kz0yfWVsc2Ugcys9dGhpcy5saW5lSGVpZ2h0KzI7by09dGhpcy5zY3JvbGxMZWZ0LG8+dGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEmJihvPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hKSxvKz10aGlzLmd1dHRlcldpZHRoK3RoaXMubWFyZ2luLmxlZnQsaS5zZXRTdHlsZShlLCJoZWlnaHQiLHUrInB4IiksaS5zZXRTdHlsZShlLCJ3aWR0aCIsYSsicHgiKSxpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLE1hdGgubWluKG8sdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLWEpLE1hdGgubWluKHMsZikpfSx0aGlzLmdldEZpcnN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93fSx0aGlzLmdldEZpcnN0RnVsbHlWaXNpYmxlUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3crKHRoaXMubGF5ZXJDb25maWcub2Zmc2V0PT09MD8wOjEpfSx0aGlzLmdldExhc3RGdWxseVZpc2libGVSb3c9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxheWVyQ29uZmlnLHQ9ZS5sYXN0Um93LG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Sb3codCwwKSplLmxpbmVIZWlnaHQ7cmV0dXJuIG4tdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPmUuaGVpZ2h0LWUubGluZUhlaWdodD90LTE6dH0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9LHRoaXMuJHBhZGRpbmc9bnVsbCx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lLHRoaXMuJHRleHRMYXllci5zZXRQYWRkaW5nKGUpLHRoaXMuJGN1cnNvckxheWVyLnNldFBhZGRpbmcoZSksdGhpcy4kbWFya2VyRnJvbnQuc2V0UGFkZGluZyhlKSx0aGlzLiRtYXJrZXJCYWNrLnNldFBhZGRpbmcoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSx0aGlzLnNldFNjcm9sbE1hcmdpbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLnNjcm9sbE1hcmdpbjtpLnRvcD1lfDAsaS5ib3R0b209dHwwLGkucmlnaHQ9cnwwLGkubGVmdD1ufDAsaS52PWkudG9wK2kuYm90dG9tLGkuaD1pLmxlZnQraS5yaWdodCxpLnRvcCYmdGhpcy5zY3JvbGxUb3A8PTAmJnRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCgtaS50b3ApLHRoaXMudXBkYXRlRnVsbCgpfSx0aGlzLnNldE1hcmdpbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLm1hcmdpbjtpLnRvcD1lfDAsaS5ib3R0b209dHwwLGkucmlnaHQ9cnwwLGkubGVmdD1ufDAsaS52PWkudG9wK2kuYm90dG9tLGkuaD1pLmxlZnQraS5yaWdodCx0aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuZ3V0dGVyV2lkdGgsdGhpcy4kc2l6ZS53aWR0aCx0aGlzLiRzaXplLmhlaWdodCksdGhpcy51cGRhdGVGdWxsKCl9LHRoaXMuZ2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV9LHRoaXMuc2V0SFNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhTY3JvbGxCYXJBbHdheXNWaXNpYmxlIixlKX0sdGhpcy5nZXRWU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZX0sdGhpcy5zZXRWU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidlNjcm9sbEJhckFsd2F5c1Zpc2libGUiLGUpfSx0aGlzLiR1cGRhdGVTY3JvbGxCYXJWPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQsdD10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0OyF0aGlzLiRtYXhMaW5lcyYmdGhpcy4kc2Nyb2xsUGFzdEVuZCYmKGUtPSh0LXRoaXMubGluZUhlaWdodCkqdGhpcy4kc2Nyb2xsUGFzdEVuZCx0aGlzLnNjcm9sbFRvcD5lLXQmJihlPXRoaXMuc2Nyb2xsVG9wK3QsdGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsKSksdGhpcy5zY3JvbGxCYXJWLnNldFNjcm9sbEhlaWdodChlK3RoaXMuc2Nyb2xsTWFyZ2luLnYpLHRoaXMuc2Nyb2xsQmFyVi5zZXRTY3JvbGxUb3AodGhpcy5zY3JvbGxUb3ArdGhpcy5zY3JvbGxNYXJnaW4udG9wKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFySD1mdW5jdGlvbigpe3RoaXMuc2Nyb2xsQmFySC5zZXRTY3JvbGxXaWR0aCh0aGlzLmxheWVyQ29uZmlnLndpZHRoKzIqdGhpcy4kcGFkZGluZyt0aGlzLnNjcm9sbE1hcmdpbi5oKSx0aGlzLnNjcm9sbEJhckguc2V0U2Nyb2xsTGVmdCh0aGlzLnNjcm9sbExlZnQrdGhpcy5zY3JvbGxNYXJnaW4ubGVmdCl9LHRoaXMuJGZyb3plbj0hMSx0aGlzLmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMuJGZyb3plbj0hMH0sdGhpcy51bmZyZWV6ZT1mdW5jdGlvbigpe3RoaXMuJGZyb3plbj0hMX0sdGhpcy4kcmVuZGVyQ2hhbmdlcz1mdW5jdGlvbihlLHQpe3RoaXMuJGNoYW5nZXMmJihlfD10aGlzLiRjaGFuZ2VzLHRoaXMuJGNoYW5nZXM9MCk7aWYoIXRoaXMuc2Vzc2lvbnx8IXRoaXMuY29udGFpbmVyLm9mZnNldFdpZHRofHx0aGlzLiRmcm96ZW58fCFlJiYhdCl7dGhpcy4kY2hhbmdlc3w9ZTtyZXR1cm59aWYodGhpcy4kc2l6ZS4kZGlydHkpcmV0dXJuIHRoaXMuJGNoYW5nZXN8PWUsdGhpcy5vblJlc2l6ZSghMCk7dGhpcy5saW5lSGVpZ2h0fHx0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpLHRoaXMuX3NpZ25hbCgiYmVmb3JlUmVuZGVyIiksdGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyJiZ0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLnVwZGF0ZUNoYXJhY3RlcldpZHRocyh0aGlzLiRmb250TWV0cmljcyk7dmFyIG49dGhpcy5sYXllckNvbmZpZztpZihlJnRoaXMuQ0hBTkdFX0ZVTEx8fGUmdGhpcy5DSEFOR0VfU0laRXx8ZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0xJTkVTfHxlJnRoaXMuQ0hBTkdFX1NDUk9MTHx8ZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCl7ZXw9dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl8dGhpcy4kbG9vcC5jbGVhcigpO2lmKG4uZmlyc3RSb3chPXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cmJm4uZmlyc3RSb3dTY3JlZW49PXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3dTY3JlZW4pe3ZhciByPXRoaXMuc2Nyb2xsVG9wKyhuLmZpcnN0Um93LXRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cpKnRoaXMubGluZUhlaWdodDtyPjAmJih0aGlzLnNjcm9sbFRvcD1yLGV8PXRoaXMuQ0hBTkdFX1NDUk9MTCxlfD10aGlzLiRjb21wdXRlTGF5ZXJDb25maWcoKXx0aGlzLiRsb29wLmNsZWFyKCkpfW49dGhpcy5sYXllckNvbmZpZyx0aGlzLiR1cGRhdGVTY3JvbGxCYXJWKCksZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCYmdGhpcy4kdXBkYXRlU2Nyb2xsQmFySCgpLGkudHJhbnNsYXRlKHRoaXMuY29udGVudCwtdGhpcy5zY3JvbGxMZWZ0LC1uLm9mZnNldCk7dmFyIHM9bi53aWR0aCsyKnRoaXMuJHBhZGRpbmcrInB4IixvPW4ubWluSGVpZ2h0KyJweCI7aS5zZXRTdHlsZSh0aGlzLmNvbnRlbnQuc3R5bGUsIndpZHRoIixzKSxpLnNldFN0eWxlKHRoaXMuY29udGVudC5zdHlsZSwiaGVpZ2h0IixvKX1lJnRoaXMuQ0hBTkdFX0hfU0NST0xMJiYoaS50cmFuc2xhdGUodGhpcy5jb250ZW50LC10aGlzLnNjcm9sbExlZnQsLW4ub2Zmc2V0KSx0aGlzLnNjcm9sbGVyLmNsYXNzTmFtZT10aGlzLnNjcm9sbExlZnQ8PTA/ImFjZV9zY3JvbGxlciI6ImFjZV9zY3JvbGxlciBhY2Vfc2Nyb2xsLWxlZnQiKTtpZihlJnRoaXMuQ0hBTkdFX0ZVTEwpe3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsLHRoaXMuJHRleHRMYXllci51cGRhdGUobiksdGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIik7cmV0dXJufWlmKGUmdGhpcy5DSEFOR0VfU0NST0xMKXt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCxlJnRoaXMuQ0hBTkdFX1RFWFR8fGUmdGhpcy5DSEFOR0VfTElORVM/dGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKTp0aGlzLiR0ZXh0TGF5ZXIuc2Nyb2xsTGluZXMobiksdGhpcy4kc2hvd0d1dHRlciYmKGUmdGhpcy5DSEFOR0VfR1VUVEVSfHxlJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKTp0aGlzLiRndXR0ZXJMYXllci5zY3JvbGxMaW5lcyhuKSksdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy4kbWFya2VyRnJvbnQudXBkYXRlKG4pLHRoaXMuJGN1cnNvckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKTtyZXR1cm59ZSZ0aGlzLkNIQU5HRV9URVhUPyh0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pLHRoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSk6ZSZ0aGlzLkNIQU5HRV9MSU5FUz8odGhpcy4kdXBkYXRlTGluZXMoKXx8ZSZ0aGlzLkNIQU5HRV9HVVRURVImJnRoaXMuJHNob3dHdXR0ZXIpJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6ZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0dVVFRFUj90aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6ZSZ0aGlzLkNIQU5HRV9DVVJTT1ImJnRoaXMuJGhpZ2hsaWdodEd1dHRlckxpbmUmJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZUxpbmVIaWdobGlnaHQobiksZSZ0aGlzLkNIQU5HRV9DVVJTT1ImJih0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSksZSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCkmJnRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSxlJih0aGlzLkNIQU5HRV9NQVJLRVJ8dGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spJiZ0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIil9LHRoaXMuJGF1dG9zaXplPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpKnRoaXMubGluZUhlaWdodCx0PXRoaXMuJG1heExpbmVzKnRoaXMubGluZUhlaWdodCxuPU1hdGgubWluKHQsTWF0aC5tYXgoKHRoaXMuJG1pbkxpbmVzfHwxKSp0aGlzLmxpbmVIZWlnaHQsZSkpK3RoaXMuc2Nyb2xsTWFyZ2luLnYrKHRoaXMuJGV4dHJhSGVpZ2h0fHwwKTt0aGlzLiRob3JpelNjcm9sbCYmKG4rPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSksdGhpcy4kbWF4UGl4ZWxIZWlnaHQmJm4+dGhpcy4kbWF4UGl4ZWxIZWlnaHQmJihuPXRoaXMuJG1heFBpeGVsSGVpZ2h0KTt2YXIgcj1uPD0yKnRoaXMubGluZUhlaWdodCxpPSFyJiZlPnQ7aWYobiE9dGhpcy5kZXNpcmVkSGVpZ2h0fHx0aGlzLiRzaXplLmhlaWdodCE9dGhpcy5kZXNpcmVkSGVpZ2h0fHxpIT10aGlzLiR2U2Nyb2xsKXtpIT10aGlzLiR2U2Nyb2xsJiYodGhpcy4kdlNjcm9sbD1pLHRoaXMuc2Nyb2xsQmFyVi5zZXRWaXNpYmxlKGkpKTt2YXIgcz10aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aDt0aGlzLmNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9bisicHgiLHRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy4kZ3V0dGVyV2lkdGgscyxuKSx0aGlzLmRlc2lyZWRIZWlnaHQ9bix0aGlzLl9zaWduYWwoImF1dG9zaXplIil9fSx0aGlzLiRjb21wdXRlTGF5ZXJDb25maWc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzLiRzaXplLG49dC5oZWlnaHQ8PTIqdGhpcy5saW5lSGVpZ2h0LHI9dGhpcy5zZXNzaW9uLmdldFNjcmVlbkxlbmd0aCgpLGk9cip0aGlzLmxpbmVIZWlnaHQscz10aGlzLiRnZXRMb25nZXN0TGluZSgpLG89IW4mJih0aGlzLiRoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8dC5zY3JvbGxlcldpZHRoLXMtMip0aGlzLiRwYWRkaW5nPDApLHU9dGhpcy4kaG9yaXpTY3JvbGwhPT1vO3UmJih0aGlzLiRob3JpelNjcm9sbD1vLHRoaXMuc2Nyb2xsQmFySC5zZXRWaXNpYmxlKG8pKTt2YXIgYT10aGlzLiR2U2Nyb2xsO3RoaXMuJG1heExpbmVzJiZ0aGlzLmxpbmVIZWlnaHQ+MSYmdGhpcy4kYXV0b3NpemUoKTt2YXIgZj10LnNjcm9sbGVySGVpZ2h0K3RoaXMubGluZUhlaWdodCxsPSF0aGlzLiRtYXhMaW5lcyYmdGhpcy4kc2Nyb2xsUGFzdEVuZD8odC5zY3JvbGxlckhlaWdodC10aGlzLmxpbmVIZWlnaHQpKnRoaXMuJHNjcm9sbFBhc3RFbmQ6MDtpKz1sO3ZhciBjPXRoaXMuc2Nyb2xsTWFyZ2luO3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoTWF0aC5tYXgoLWMudG9wLE1hdGgubWluKHRoaXMuc2Nyb2xsVG9wLGktdC5zY3JvbGxlckhlaWdodCtjLmJvdHRvbSkpKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLm1heCgtYy5sZWZ0LE1hdGgubWluKHRoaXMuc2Nyb2xsTGVmdCxzKzIqdGhpcy4kcGFkZGluZy10LnNjcm9sbGVyV2lkdGgrYy5yaWdodCkpKTt2YXIgaD0hbiYmKHRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHx0LnNjcm9sbGVySGVpZ2h0LWkrbDwwfHx0aGlzLnNjcm9sbFRvcD5jLnRvcCkscD1hIT09aDtwJiYodGhpcy4kdlNjcm9sbD1oLHRoaXMuc2Nyb2xsQmFyVi5zZXRWaXNpYmxlKGgpKTt2YXIgZD10aGlzLnNjcm9sbFRvcCV0aGlzLmxpbmVIZWlnaHQsdj1NYXRoLmNlaWwoZi90aGlzLmxpbmVIZWlnaHQpLTEsbT1NYXRoLm1heCgwLE1hdGgucm91bmQoKHRoaXMuc2Nyb2xsVG9wLWQpL3RoaXMubGluZUhlaWdodCkpLGc9bSt2LHksYix3PXRoaXMubGluZUhlaWdodDttPWUuc2NyZWVuVG9Eb2N1bWVudFJvdyhtLDApO3ZhciBFPWUuZ2V0Rm9sZExpbmUobSk7RSYmKG09RS5zdGFydC5yb3cpLHk9ZS5kb2N1bWVudFRvU2NyZWVuUm93KG0sMCksYj1lLmdldFJvd0xlbmd0aChtKSp3LGc9TWF0aC5taW4oZS5zY3JlZW5Ub0RvY3VtZW50Um93KGcsMCksZS5nZXRMZW5ndGgoKS0xKSxmPXQuc2Nyb2xsZXJIZWlnaHQrZS5nZXRSb3dMZW5ndGgoZykqdytiLGQ9dGhpcy5zY3JvbGxUb3AteSp3O3ZhciBTPTA7aWYodGhpcy5sYXllckNvbmZpZy53aWR0aCE9c3x8dSlTPXRoaXMuQ0hBTkdFX0hfU0NST0xMO2lmKHV8fHApU3w9dGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLmd1dHRlcldpZHRoLHQud2lkdGgsdC5oZWlnaHQpLHRoaXMuX3NpZ25hbCgic2Nyb2xsYmFyVmlzaWJpbGl0eUNoYW5nZWQiKSxwJiYocz10aGlzLiRnZXRMb25nZXN0TGluZSgpKTtyZXR1cm4gdGhpcy5sYXllckNvbmZpZz17d2lkdGg6cyxwYWRkaW5nOnRoaXMuJHBhZGRpbmcsZmlyc3RSb3c6bSxmaXJzdFJvd1NjcmVlbjp5LGxhc3RSb3c6ZyxsaW5lSGVpZ2h0OncsY2hhcmFjdGVyV2lkdGg6dGhpcy5jaGFyYWN0ZXJXaWR0aCxtaW5IZWlnaHQ6ZixtYXhIZWlnaHQ6aSxvZmZzZXQ6ZCxndXR0ZXJPZmZzZXQ6dz9NYXRoLm1heCgwLE1hdGguY2VpbCgoZCt0LmhlaWdodC10LnNjcm9sbGVySGVpZ2h0KS93KSk6MCxoZWlnaHQ6dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodH0sdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlciYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRDb250ZW50V2lkdGgocy10aGlzLiRwYWRkaW5nKSxTfSx0aGlzLiR1cGRhdGVMaW5lcz1mdW5jdGlvbigpe2lmKCF0aGlzLiRjaGFuZ2VkTGluZXMpcmV0dXJuO3ZhciBlPXRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdyx0PXRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93O3RoaXMuJGNoYW5nZWRMaW5lcz1udWxsO3ZhciBuPXRoaXMubGF5ZXJDb25maWc7aWYoZT5uLmxhc3RSb3crMSlyZXR1cm47aWYodDxuLmZpcnN0Um93KXJldHVybjtpZih0PT09SW5maW5pdHkpe3RoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pO3JldHVybn1yZXR1cm4gdGhpcy4kdGV4dExheWVyLnVwZGF0ZUxpbmVzKG4sZSx0KSwhMH0sdGhpcy4kZ2V0TG9uZ2VzdExpbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2NyZWVuV2lkdGgoKTtyZXR1cm4gdGhpcy5zaG93SW52aXNpYmxlcyYmIXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUmJihlKz0xKSx0aGlzLiR0ZXh0TGF5ZXImJmU+dGhpcy4kdGV4dExheWVyLk1BWF9MSU5FX0xFTkdUSCYmKGU9dGhpcy4kdGV4dExheWVyLk1BWF9MSU5FX0xFTkdUSCszMCksTWF0aC5tYXgodGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLTIqdGhpcy4kcGFkZGluZyxNYXRoLnJvdW5kKGUqdGhpcy5jaGFyYWN0ZXJXaWR0aCkpfSx0aGlzLnVwZGF0ZUZyb250TWFya2Vycz1mdW5jdGlvbigpe3RoaXMuJG1hcmtlckZyb250LnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnMoITApKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX01BUktFUl9GUk9OVCl9LHRoaXMudXBkYXRlQmFja01hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLiRtYXJrZXJCYWNrLnNldE1hcmtlcnModGhpcy5zZXNzaW9uLmdldE1hcmtlcnMoKSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfQkFDSyl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGd1dHRlckxheWVyLmFkZEd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZ3V0dGVyTGF5ZXIucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzPWZ1bmN0aW9uKGUpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRBbm5vdGF0aW9ucyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMudXBkYXRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9DVVJTT1IpfSx0aGlzLmhpZGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5oaWRlQ3Vyc29yKCl9LHRoaXMuc2hvd0N1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGN1cnNvckxheWVyLnNob3dDdXJzb3IoKX0sdGhpcy5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldz1mdW5jdGlvbihlLHQsbil7dGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldyhlLG4pLHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcodCxuKX0sdGhpcy5zY3JvbGxDdXJzb3JJbnRvVmlldz1mdW5jdGlvbihlLHQsbil7aWYodGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodD09PTApcmV0dXJuO3ZhciByPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oZSksaT1yLmxlZnQscz1yLnRvcCxvPW4mJm4udG9wfHwwLHU9biYmbi5ib3R0b218fDAsYT10aGlzLiRzY3JvbGxBbmltYXRpb24/dGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpOnRoaXMuc2Nyb2xsVG9wO2Erbz5zPyh0JiZhK28+cyt0aGlzLmxpbmVIZWlnaHQmJihzLT10KnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpLHM9PT0wJiYocz0tdGhpcy5zY3JvbGxNYXJnaW4udG9wKSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMpKTphK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdTxzK3RoaXMubGluZUhlaWdodCYmKHQmJmErdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC11PHMtdGhpcy5saW5lSGVpZ2h0JiYocys9dCp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMrdGhpcy5saW5lSGVpZ2h0K3UtdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCkpO3ZhciBmPXRoaXMuc2Nyb2xsTGVmdDtmPmk/KGk8dGhpcy4kcGFkZGluZysyKnRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGgmJihpPS10aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KSx0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChpKSk6Zit0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGg8aSt0aGlzLmNoYXJhY3RlcldpZHRoP3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KE1hdGgucm91bmQoaSt0aGlzLmNoYXJhY3RlcldpZHRoLXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aCkpOmY8PXRoaXMuJHBhZGRpbmcmJmktZjx0aGlzLmNoYXJhY3RlcldpZHRoJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCgwKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpfSx0aGlzLmdldFNjcm9sbExlZnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKX0sdGhpcy5nZXRTY3JvbGxUb3BSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zY3JvbGxUb3AvdGhpcy5saW5lSGVpZ2h0fSx0aGlzLmdldFNjcm9sbEJvdHRvbVJvdz1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCgwLE1hdGguZmxvb3IoKHRoaXMuc2Nyb2xsVG9wK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpL3RoaXMubGluZUhlaWdodCktMSl9LHRoaXMuc2Nyb2xsVG9Sb3c9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChlKnRoaXMubGluZUhlaWdodCl9LHRoaXMuYWxpZ25DdXJzb3I9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im51bWJlciImJihlPXtyb3c6ZSxjb2x1bW46MH0pO3ZhciBuPXRoaXMuJGN1cnNvckxheWVyLmdldFBpeGVsUG9zaXRpb24oZSkscj10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXRoaXMubGluZUhlaWdodCxpPW4udG9wLXIqKHR8fDApO3JldHVybiB0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKGkpLGl9LHRoaXMuU1RFUFM9OCx0aGlzLiRjYWxjU3RlcHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9dGhpcy5TVEVQUyxpPVtdLHM9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuKihNYXRoLnBvdyhlLTEsMykrMSkrdH07Zm9yKG49MDtuPHI7KytuKWkucHVzaChzKG4vdGhpcy5TVEVQUyxlLHQtZSkpO3JldHVybiBpfSx0aGlzLnNjcm9sbFRvTGluZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6ZSxjb2x1bW46MH0pLHM9aS50b3A7dCYmKHMtPXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQvMik7dmFyIG89dGhpcy5zY3JvbGxUb3A7dGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzKSxuIT09ITEmJnRoaXMuYW5pbWF0ZVNjcm9sbGluZyhvLHIpfSx0aGlzLmFuaW1hdGVTY3JvbGxpbmc9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNjcm9sbFRvcDtpZighdGhpcy4kYW5pbWF0ZWRTY3JvbGwpcmV0dXJuO3ZhciByPXRoaXM7aWYoZT09bilyZXR1cm47aWYodGhpcy4kc2Nyb2xsQW5pbWF0aW9uKXt2YXIgaT10aGlzLiRzY3JvbGxBbmltYXRpb24uc3RlcHM7aWYoaS5sZW5ndGgpe2U9aVswXTtpZihlPT1uKXJldHVybn19dmFyIHM9ci4kY2FsY1N0ZXBzKGUsbik7dGhpcy4kc2Nyb2xsQW5pbWF0aW9uPXtmcm9tOmUsdG86bixzdGVwczpzfSxjbGVhckludGVydmFsKHRoaXMuJHRpbWVyKSxyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMuc2hpZnQoKSksci5zZXNzaW9uLiRzY3JvbGxUb3A9bix0aGlzLiR0aW1lcj1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3MubGVuZ3RoPyhyLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHMuc2hpZnQoKSksci5zZXNzaW9uLiRzY3JvbGxUb3A9bik6biE9bnVsbD8oci5zZXNzaW9uLiRzY3JvbGxUb3A9LTEsci5zZXNzaW9uLnNldFNjcm9sbFRvcChuKSxuPW51bGwpOihyLiR0aW1lcj1jbGVhckludGVydmFsKHIuJHRpbWVyKSxyLiRzY3JvbGxBbmltYXRpb249bnVsbCx0JiZ0KCkpfSwxMCl9LHRoaXMuc2Nyb2xsVG9ZPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsVG9wIT09ZSYmKHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKSx0aGlzLnNjcm9sbFRvcD1lKX0sdGhpcy5zY3JvbGxUb1g9ZnVuY3Rpb24oZSl7dGhpcy5zY3JvbGxMZWZ0IT09ZSYmKHRoaXMuc2Nyb2xsTGVmdD1lKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0hfU0NST0xMKX0sdGhpcy5zY3JvbGxUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AodCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodCl9LHRoaXMuc2Nyb2xsQnk9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSt0KSxlJiZ0aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsTGVmdCgpK2UpfSx0aGlzLmlzU2Nyb2xsYWJsZUJ5PWZ1bmN0aW9uKGUsdCl7aWYodDwwJiZ0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk+PTEtdGhpcy5zY3JvbGxNYXJnaW4udG9wKXJldHVybiEwO2lmKHQ+MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdGhpcy5sYXllckNvbmZpZy5tYXhIZWlnaHQ8LTErdGhpcy5zY3JvbGxNYXJnaW4uYm90dG9tKXJldHVybiEwO2lmKGU8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKT49MS10aGlzLnNjcm9sbE1hcmdpbi5sZWZ0KXJldHVybiEwO2lmKGU+MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKSt0aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtdGhpcy5sYXllckNvbmZpZy53aWR0aDwtMSt0aGlzLnNjcm9sbE1hcmdpbi5yaWdodClyZXR1cm4hMH0sdGhpcy5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbjtpZih0aGlzLiRoYXNDc3NUcmFuc2Zvcm1zKXtuPXt0b3A6MCxsZWZ0OjB9O3ZhciByPXRoaXMuJGZvbnRNZXRyaWNzLnRyYW5zZm9ybUNvb3JkaW5hdGVzKFtlLHRdKTtlPXJbMV0tdGhpcy5ndXR0ZXJXaWR0aC10aGlzLm1hcmdpbi5sZWZ0LHQ9clswXX1lbHNlIG49dGhpcy5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgaT1lK3RoaXMuc2Nyb2xsTGVmdC1uLmxlZnQtdGhpcy4kcGFkZGluZyxzPWkvdGhpcy5jaGFyYWN0ZXJXaWR0aCxvPU1hdGguZmxvb3IoKHQrdGhpcy5zY3JvbGxUb3Atbi50b3ApL3RoaXMubGluZUhlaWdodCksdT10aGlzLiRibG9ja0N1cnNvcj9NYXRoLmZsb29yKHMpOk1hdGgucm91bmQocyk7cmV0dXJue3JvdzpvLGNvbHVtbjp1LHNpZGU6cy11PjA/MTotMSxvZmZzZXRYOml9fSx0aGlzLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodGhpcy4kaGFzQ3NzVHJhbnNmb3Jtcyl7bj17dG9wOjAsbGVmdDowfTt2YXIgcj10aGlzLiRmb250TWV0cmljcy50cmFuc2Zvcm1Db29yZGluYXRlcyhbZSx0XSk7ZT1yWzFdLXRoaXMuZ3V0dGVyV2lkdGgtdGhpcy5tYXJnaW4ubGVmdCx0PXJbMF19ZWxzZSBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGk9ZSt0aGlzLnNjcm9sbExlZnQtbi5sZWZ0LXRoaXMuJHBhZGRpbmcscz1pL3RoaXMuY2hhcmFjdGVyV2lkdGgsbz10aGlzLiRibG9ja0N1cnNvcj9NYXRoLmZsb29yKHMpOk1hdGgucm91bmQocyksdT1NYXRoLmZsb29yKCh0K3RoaXMuc2Nyb2xsVG9wLW4udG9wKS90aGlzLmxpbmVIZWlnaHQpO3JldHVybiB0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKHUsTWF0aC5tYXgobywwKSxpKX0sdGhpcy50ZXh0VG9TY3JlZW5Db29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCksaT10aGlzLiRwYWRkaW5nKyh0aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyhyLnJvdyxlKT90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQoci5jb2x1bW4pOk1hdGgucm91bmQoci5jb2x1bW4qdGhpcy5jaGFyYWN0ZXJXaWR0aCkpLHM9ci5yb3cqdGhpcy5saW5lSGVpZ2h0O3JldHVybntwYWdlWDpuLmxlZnQraS10aGlzLnNjcm9sbExlZnQscGFnZVk6bi50b3Arcy10aGlzLnNjcm9sbFRvcH19LHRoaXMudmlzdWFsaXplRm9jdXM9ZnVuY3Rpb24oKXtpLmFkZENzc0NsYXNzKHRoaXMuY29udGFpbmVyLCJhY2VfZm9jdXMiKX0sdGhpcy52aXN1YWxpemVCbHVyPWZ1bmN0aW9uKCl7aS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMuc2hvd0NvbXBvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuJGNvbXBvc2l0aW9uPWUsZS5jc3NUZXh0fHwoZS5jc3NUZXh0PXRoaXMudGV4dGFyZWEuc3R5bGUuY3NzVGV4dCksZS51c2VUZXh0YXJlYUZvcklNRT10aGlzLiR1c2VUZXh0YXJlYUZvcklNRSx0aGlzLiR1c2VUZXh0YXJlYUZvcklNRT8oaS5hZGRDc3NDbGFzcyh0aGlzLnRleHRhcmVhLCJhY2VfY29tcG9zaXRpb24iKSx0aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQ9IiIsdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLiRjdXJzb3JMYXllci5lbGVtZW50LnN0eWxlLmRpc3BsYXk9Im5vbmUiKTplLm1hcmtlcklkPXRoaXMuc2Vzc2lvbi5hZGRNYXJrZXIoZS5tYXJrZXJSYW5nZSwiYWNlX2NvbXBvc2l0aW9uX21hcmtlciIsInRleHQiKX0sdGhpcy5zZXRDb21wb3NpdGlvblRleHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5jdXJzb3I7dGhpcy5hZGRUb2tlbihlLCJjb21wb3NpdGlvbl9wbGFjZWhvbGRlciIsdC5yb3csdC5jb2x1bW4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCl9LHRoaXMuaGlkZUNvbXBvc2l0aW9uPWZ1bmN0aW9uKCl7aWYoIXRoaXMuJGNvbXBvc2l0aW9uKXJldHVybjt0aGlzLiRjb21wb3NpdGlvbi5tYXJrZXJJZCYmdGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLiRjb21wb3NpdGlvbi5tYXJrZXJJZCksaS5yZW1vdmVDc3NDbGFzcyh0aGlzLnRleHRhcmVhLCJhY2VfY29tcG9zaXRpb24iKSx0aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQ9dGhpcy4kY29tcG9zaXRpb24uY3NzVGV4dCx0aGlzLiRjb21wb3NpdGlvbj1udWxsLHRoaXMuJGN1cnNvckxheWVyLmVsZW1lbnQuc3R5bGUuZGlzcGxheT0iIn0sdGhpcy5hZGRUb2tlbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLnNlc3Npb247aS5iZ1Rva2VuaXplci5saW5lc1tuXT1udWxsO3ZhciBzPXt0eXBlOnQsdmFsdWU6ZX0sbz1pLmdldFRva2VucyhuKTtpZihyPT1udWxsKW8ucHVzaChzKTtlbHNle3ZhciB1PTA7Zm9yKHZhciBhPTA7YTxvLmxlbmd0aDthKyspe3ZhciBmPW9bYV07dSs9Zi52YWx1ZS5sZW5ndGg7aWYocjw9dSl7dmFyIGw9Zi52YWx1ZS5sZW5ndGgtKHUtciksYz1mLnZhbHVlLnNsaWNlKDAsbCksaD1mLnZhbHVlLnNsaWNlKGwpO28uc3BsaWNlKGEsMSx7dHlwZTpmLnR5cGUsdmFsdWU6Y30scyx7dHlwZTpmLnR5cGUsdmFsdWU6aH0pO2JyZWFrfX19dGhpcy51cGRhdGVMaW5lcyhuLG4pfSx0aGlzLnNldFRoZW1lPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbyhyKXtpZihuLiR0aGVtZUlkIT1lKXJldHVybiB0JiZ0KCk7aWYoIXJ8fCFyLmNzc0NsYXNzKXRocm93IG5ldyBFcnJvcigiY291bGRuJ3QgbG9hZCBtb2R1bGUgIitlKyIgb3IgaXQgZGlkbid0IGNhbGwgZGVmaW5lIik7ci4kaWQmJihuLiR0aGVtZUlkPXIuJGlkKSxpLmltcG9ydENzc1N0cmluZyhyLmNzc1RleHQsci5jc3NDbGFzcyxuLmNvbnRhaW5lciksbi50aGVtZSYmaS5yZW1vdmVDc3NDbGFzcyhuLmNvbnRhaW5lcixuLnRoZW1lLmNzc0NsYXNzKTt2YXIgcz0icGFkZGluZyJpbiByP3IucGFkZGluZzoicGFkZGluZyJpbihuLnRoZW1lfHx7fSk/NDpuLiRwYWRkaW5nO24uJHBhZGRpbmcmJnMhPW4uJHBhZGRpbmcmJm4uc2V0UGFkZGluZyhzKSxuLiR0aGVtZT1yLmNzc0NsYXNzLG4udGhlbWU9cixpLmFkZENzc0NsYXNzKG4uY29udGFpbmVyLHIuY3NzQ2xhc3MpLGkuc2V0Q3NzQ2xhc3Mobi5jb250YWluZXIsImFjZV9kYXJrIixyLmlzRGFyayksbi4kc2l6ZSYmKG4uJHNpemUud2lkdGg9MCxuLiR1cGRhdGVTaXplQXN5bmMoKSksbi5fZGlzcGF0Y2hFdmVudCgidGhlbWVMb2FkZWQiLHt0aGVtZTpyfSksdCYmdCgpfXZhciBuPXRoaXM7dGhpcy4kdGhlbWVJZD1lLG4uX2Rpc3BhdGNoRXZlbnQoInRoZW1lQ2hhbmdlIix7dGhlbWU6ZX0pO2lmKCFlfHx0eXBlb2YgZT09InN0cmluZyIpe3ZhciByPWV8fHRoaXMuJG9wdGlvbnMudGhlbWUuaW5pdGlhbFZhbHVlO3MubG9hZE1vZHVsZShbInRoZW1lIixyXSxvKX1lbHNlIG8oZSl9LHRoaXMuZ2V0VGhlbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdGhlbWVJZH0sdGhpcy5zZXRTdHlsZT1mdW5jdGlvbihlLHQpe2kuc2V0Q3NzQ2xhc3ModGhpcy5jb250YWluZXIsZSx0IT09ITEpfSx0aGlzLnVuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7aS5yZW1vdmVDc3NDbGFzcyh0aGlzLmNvbnRhaW5lcixlKX0sdGhpcy5zZXRDdXJzb3JTdHlsZT1mdW5jdGlvbihlKXtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImN1cnNvciIsZSl9LHRoaXMuc2V0TW91c2VDdXJzb3I9ZnVuY3Rpb24oZSl7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJjdXJzb3IiLGUpfSx0aGlzLmF0dGFjaFRvU2hhZG93Um9vdD1mdW5jdGlvbigpe2kuaW1wb3J0Q3NzU3RyaW5nKHYsImFjZV9lZGl0b3IuY3NzIix0aGlzLmNvbnRhaW5lcil9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZnJlZXplKCksdGhpcy4kZm9udE1ldHJpY3MuZGVzdHJveSgpLHRoaXMuJGN1cnNvckxheWVyLmRlc3Ryb3koKX19KS5jYWxsKHkucHJvdG90eXBlKSxzLmRlZmluZU9wdGlvbnMoeS5wcm90b3R5cGUsInJlbmRlcmVyIix7YW5pbWF0ZWRTY3JvbGw6e2luaXRpYWxWYWx1ZTohMX0sc2hvd0ludmlzaWJsZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR0ZXh0TGF5ZXIuc2V0U2hvd0ludmlzaWJsZXMoZSkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCl9LGluaXRpYWxWYWx1ZTohMX0sc2hvd1ByaW50TWFyZ2luOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxpbml0aWFsVmFsdWU6ITB9LHByaW50TWFyZ2luQ29sdW1uOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxpbml0aWFsVmFsdWU6ODB9LHByaW50TWFyZ2luOntzZXQ6ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJudW1iZXIiJiYodGhpcy4kcHJpbnRNYXJnaW5Db2x1bW49ZSksdGhpcy4kc2hvd1ByaW50TWFyZ2luPSEhZSx0aGlzLiR1cGRhdGVQcmludE1hcmdpbigpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd1ByaW50TWFyZ2luJiZ0aGlzLiRwcmludE1hcmdpbkNvbHVtbn19LHNob3dHdXR0ZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXIuc3R5bGUuZGlzcGxheT1lPyJibG9jayI6Im5vbmUiLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy5vbkd1dHRlclJlc2l6ZSgpfSxpbml0aWFsVmFsdWU6ITB9LGZhZGVGb2xkV2lkZ2V0czp7c2V0OmZ1bmN0aW9uKGUpe2kuc2V0Q3NzQ2xhc3ModGhpcy4kZ3V0dGVyLCJhY2VfZmFkZS1mb2xkLXdpZGdldHMiLGUpfSxpbml0aWFsVmFsdWU6ITF9LHNob3dGb2xkV2lkZ2V0czp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLnNldFNob3dGb2xkV2lkZ2V0cyhlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LGluaXRpYWxWYWx1ZTohMH0sZGlzcGxheUluZGVudEd1aWRlczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHRleHRMYXllci5zZXREaXNwbGF5SW5kZW50R3VpZGVzKGUpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSxpbml0aWFsVmFsdWU6ITB9LGhpZ2hsaWdodEd1dHRlckxpbmU6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX0saW5pdGlhbFZhbHVlOiEwfSxoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKGUpeyghdGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV8fCF0aGlzLiRob3JpelNjcm9sbCkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOiExfSx2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZTp7c2V0OmZ1bmN0aW9uKGUpeyghdGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV8fCF0aGlzLiR2U2Nyb2xsKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6ITF9LGZvbnRTaXplOntzZXQ6ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJudW1iZXIiJiYoZSs9InB4IiksdGhpcy5jb250YWluZXIuc3R5bGUuZm9udFNpemU9ZSx0aGlzLnVwZGF0ZUZvbnRTaXplKCl9LGluaXRpYWxWYWx1ZToxMn0sZm9udEZhbWlseTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRGYW1pbHk9ZSx0aGlzLnVwZGF0ZUZvbnRTaXplKCl9fSxtYXhMaW5lczp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlRnVsbCgpfX0sbWluTGluZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRtaW5MaW5lczw1NjI5NDk5NTM0MjEzMTF8fCh0aGlzLiRtaW5MaW5lcz0wKSx0aGlzLnVwZGF0ZUZ1bGwoKX19LG1heFBpeGVsSGVpZ2h0OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVGdWxsKCl9LGluaXRpYWxWYWx1ZTowfSxzY3JvbGxQYXN0RW5kOntzZXQ6ZnVuY3Rpb24oZSl7ZT0rZXx8MDtpZih0aGlzLiRzY3JvbGxQYXN0RW5kPT1lKXJldHVybjt0aGlzLiRzY3JvbGxQYXN0RW5kPWUsdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9TQ1JPTEwpfSxpbml0aWFsVmFsdWU6MCxoYW5kbGVzU2V0OiEwfSxmaXhlZFdpZHRoR3V0dGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuJGZpeGVkV2lkdGg9ISFlLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfR1VUVEVSKX19LHRoZW1lOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRUaGVtZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRoZW1lSWR8fHRoaXMudGhlbWV9LGluaXRpYWxWYWx1ZToiLi90aGVtZS90ZXh0bWF0ZSIsaGFuZGxlc1NldDohMH0saGFzQ3NzVHJhbnNmb3Jtczp7fSx1c2VUZXh0YXJlYUZvcklNRTp7aW5pdGlhbFZhbHVlOiFtLmlzTW9iaWxlJiYhbS5pc0lFfX0pLHQuVmlydHVhbFJlbmRlcmVyPXl9KSxhY2UuZGVmaW5lKCJhY2Uvd29ya2VyL3dvcmtlcl9jbGllbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbmV0IiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdShlKXt2YXIgdD0iaW1wb3J0U2NyaXB0cygnIitpLnF1YWxpZnlVUkwoZSkrIicpOyI7dHJ5e3JldHVybiBuZXcgQmxvYihbdF0se3R5cGU6ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQifSl9Y2F0Y2gobil7dmFyIHI9d2luZG93LkJsb2JCdWlsZGVyfHx3aW5kb3cuV2ViS2l0QmxvYkJ1aWxkZXJ8fHdpbmRvdy5Nb3pCbG9iQnVpbGRlcixzPW5ldyByO3JldHVybiBzLmFwcGVuZCh0KSxzLmdldEJsb2IoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKX19ZnVuY3Rpb24gYShlKXtpZih0eXBlb2YgV29ya2VyPT0idW5kZWZpbmVkIilyZXR1cm57cG9zdE1lc3NhZ2U6ZnVuY3Rpb24oKXt9LHRlcm1pbmF0ZTpmdW5jdGlvbigpe319O2lmKG8uZ2V0KCJsb2FkV29ya2VyRnJvbUJsb2IiKSl7dmFyIHQ9dShlKSxuPXdpbmRvdy5VUkx8fHdpbmRvdy53ZWJraXRVUkwscj1uLmNyZWF0ZU9iamVjdFVSTCh0KTtyZXR1cm4gbmV3IFdvcmtlcihyKX1yZXR1cm4gbmV3IFdvcmtlcihlKX12YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9saWIvbmV0Iikscz1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixvPWUoIi4uL2NvbmZpZyIpLGY9ZnVuY3Rpb24oZSl7ZS5wb3N0TWVzc2FnZXx8KGU9dGhpcy4kY3JlYXRlV29ya2VyRnJvbU9sZENvbmZpZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHRoaXMuJHdvcmtlcj1lLHRoaXMuJHNlbmREZWx0YVF1ZXVlPXRoaXMuJHNlbmREZWx0YVF1ZXVlLmJpbmQodGhpcyksdGhpcy5jaGFuZ2VMaXN0ZW5lcj10aGlzLmNoYW5nZUxpc3RlbmVyLmJpbmQodGhpcyksdGhpcy5vbk1lc3NhZ2U9dGhpcy5vbk1lc3NhZ2UuYmluZCh0aGlzKSx0aGlzLmNhbGxiYWNrSWQ9MSx0aGlzLmNhbGxiYWNrcz17fSx0aGlzLiR3b3JrZXIub25tZXNzYWdlPXRoaXMub25NZXNzYWdlfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLHMpLHRoaXMuJGNyZWF0ZVdvcmtlckZyb21PbGRDb25maWc9ZnVuY3Rpb24odCxuLHIsaSxzKXtlLm5hbWVUb1VybCYmIWUudG9VcmwmJihlLnRvVXJsPWUubmFtZVRvVXJsKTtpZihvLmdldCgicGFja2FnZWQiKXx8IWUudG9VcmwpaT1pfHxvLm1vZHVsZVVybChuLCJ3b3JrZXIiKTtlbHNle3ZhciB1PXRoaXMuJG5vcm1hbGl6ZVBhdGg7aT1pfHx1KGUudG9VcmwoImFjZS93b3JrZXIvd29ya2VyLmpzIixudWxsLCJfIikpO3ZhciBmPXt9O3QuZm9yRWFjaChmdW5jdGlvbih0KXtmW3RdPXUoZS50b1VybCh0LG51bGwsIl8iKS5yZXBsYWNlKC8oXC5qcyk/KFw/LiopPyQvLCIiKSl9KX1yZXR1cm4gdGhpcy4kd29ya2VyPWEoaSkscyYmdGhpcy5zZW5kKCJpbXBvcnRTY3JpcHRzIixzKSx0aGlzLiR3b3JrZXIucG9zdE1lc3NhZ2Uoe2luaXQ6ITAsdGxuczpmLG1vZHVsZTpuLGNsYXNzbmFtZTpyfSksdGhpcy4kd29ya2VyfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7c3dpdGNoKHQudHlwZSl7Y2FzZSJldmVudCI6dGhpcy5fc2lnbmFsKHQubmFtZSx7ZGF0YTp0LmRhdGF9KTticmVhaztjYXNlImNhbGwiOnZhciBuPXRoaXMuY2FsbGJhY2tzW3QuaWRdO24mJihuKHQuZGF0YSksZGVsZXRlIHRoaXMuY2FsbGJhY2tzW3QuaWRdKTticmVhaztjYXNlImVycm9yIjp0aGlzLnJlcG9ydEVycm9yKHQuZGF0YSk7YnJlYWs7Y2FzZSJsb2ciOndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmxvZyYmY29uc29sZS5sb2cuYXBwbHkoY29uc29sZSx0LmRhdGEpfX0sdGhpcy5yZXBvcnRFcnJvcj1mdW5jdGlvbihlKXt3aW5kb3cuY29uc29sZSYmY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihlKX0sdGhpcy4kbm9ybWFsaXplUGF0aD1mdW5jdGlvbihlKXtyZXR1cm4gaS5xdWFsaWZ5VVJMKGUpfSx0aGlzLnRlcm1pbmF0ZT1mdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgidGVybWluYXRlIix7fSksdGhpcy5kZWx0YVF1ZXVlPW51bGwsdGhpcy4kd29ya2VyLnRlcm1pbmF0ZSgpLHRoaXMuJHdvcmtlcj1udWxsLHRoaXMuJGRvYyYmdGhpcy4kZG9jLm9mZigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKSx0aGlzLiRkb2M9bnVsbH0sdGhpcy5zZW5kPWZ1bmN0aW9uKGUsdCl7dGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtjb21tYW5kOmUsYXJnczp0fSl9LHRoaXMuY2FsbD1mdW5jdGlvbihlLHQsbil7aWYobil7dmFyIHI9dGhpcy5jYWxsYmFja0lkKys7dGhpcy5jYWxsYmFja3Nbcl09bix0LnB1c2gocil9dGhpcy5zZW5kKGUsdCl9LHRoaXMuZW1pdD1mdW5jdGlvbihlLHQpe3RyeXt0LmRhdGEmJnQuZGF0YS5lcnImJih0LmRhdGEuZXJyPXttZXNzYWdlOnQuZGF0YS5lcnIubWVzc2FnZSxzdGFjazp0LmRhdGEuZXJyLnN0YWNrLGNvZGU6dC5kYXRhLmVyci5jb2RlfSksdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtldmVudDplLGRhdGE6e2RhdGE6dC5kYXRhfX0pfWNhdGNoKG4pe2NvbnNvbGUuZXJyb3Iobi5zdGFjayl9fSx0aGlzLmF0dGFjaFRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy4kZG9jJiZ0aGlzLnRlcm1pbmF0ZSgpLHRoaXMuJGRvYz1lLHRoaXMuY2FsbCgic2V0VmFsdWUiLFtlLmdldFZhbHVlKCldKSxlLm9uKCJjaGFuZ2UiLHRoaXMuY2hhbmdlTGlzdGVuZXIpfSx0aGlzLmNoYW5nZUxpc3RlbmVyPWZ1bmN0aW9uKGUpe3RoaXMuZGVsdGFRdWV1ZXx8KHRoaXMuZGVsdGFRdWV1ZT1bXSxzZXRUaW1lb3V0KHRoaXMuJHNlbmREZWx0YVF1ZXVlLDApKSxlLmFjdGlvbj09Imluc2VydCI/dGhpcy5kZWx0YVF1ZXVlLnB1c2goZS5zdGFydCxlLmxpbmVzKTp0aGlzLmRlbHRhUXVldWUucHVzaChlLnN0YXJ0LGUuZW5kKX0sdGhpcy4kc2VuZERlbHRhUXVldWU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmRlbHRhUXVldWU7aWYoIWUpcmV0dXJuO3RoaXMuZGVsdGFRdWV1ZT1udWxsLGUubGVuZ3RoPjUwJiZlLmxlbmd0aD50aGlzLiRkb2MuZ2V0TGVuZ3RoKCk+PjE/dGhpcy5jYWxsKCJzZXRWYWx1ZSIsW3RoaXMuJGRvYy5nZXRWYWx1ZSgpXSk6dGhpcy5lbWl0KCJjaGFuZ2UiLHtkYXRhOmV9KX19KS5jYWxsKGYucHJvdG90eXBlKTt2YXIgbD1mdW5jdGlvbihlLHQsbil7dmFyIHI9bnVsbCxpPSExLHU9T2JqZWN0LmNyZWF0ZShzKSxhPVtdLGw9bmV3IGYoe21lc3NhZ2VCdWZmZXI6YSx0ZXJtaW5hdGU6ZnVuY3Rpb24oKXt9LHBvc3RNZXNzYWdlOmZ1bmN0aW9uKGUpe2EucHVzaChlKTtpZighcilyZXR1cm47aT9zZXRUaW1lb3V0KGMpOmMoKX19KTtsLnNldEVtaXRTeW5jPWZ1bmN0aW9uKGUpe2k9ZX07dmFyIGM9ZnVuY3Rpb24oKXt2YXIgZT1hLnNoaWZ0KCk7ZS5jb21tYW5kP3JbZS5jb21tYW5kXS5hcHBseShyLGUuYXJncyk6ZS5ldmVudCYmdS5fc2lnbmFsKGUuZXZlbnQsZS5kYXRhKX07cmV0dXJuIHUucG9zdE1lc3NhZ2U9ZnVuY3Rpb24oZSl7bC5vbk1lc3NhZ2Uoe2RhdGE6ZX0pfSx1LmNhbGxiYWNrPWZ1bmN0aW9uKGUsdCl7dGhpcy5wb3N0TWVzc2FnZSh7dHlwZToiY2FsbCIsaWQ6dCxkYXRhOmV9KX0sdS5lbWl0PWZ1bmN0aW9uKGUsdCl7dGhpcy5wb3N0TWVzc2FnZSh7dHlwZToiZXZlbnQiLG5hbWU6ZSxkYXRhOnR9KX0sby5sb2FkTW9kdWxlKFsid29ya2VyIix0XSxmdW5jdGlvbihlKXtyPW5ldyBlW25dKHUpO3doaWxlKGEubGVuZ3RoKWMoKX0pLGx9O3QuVUlXb3JrZXJDbGllbnQ9bCx0LldvcmtlckNsaWVudD1mLHQuY3JlYXRlV29ya2VyPWF9KSxhY2UuZGVmaW5lKCJhY2UvcGxhY2Vob2xkZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9yYW5nZSIpLlJhbmdlLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPWUoIi4vbGliL29vcCIpLG89ZnVuY3Rpb24oZSx0LG4scixpLHMpe3ZhciBvPXRoaXM7dGhpcy5sZW5ndGg9dCx0aGlzLnNlc3Npb249ZSx0aGlzLmRvYz1lLmdldERvY3VtZW50KCksdGhpcy5tYWluQ2xhc3M9aSx0aGlzLm90aGVyc0NsYXNzPXMsdGhpcy4kb25VcGRhdGU9dGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpLHRoaXMuZG9jLm9uKCJjaGFuZ2UiLHRoaXMuJG9uVXBkYXRlKSx0aGlzLiRvdGhlcnM9cix0aGlzLiRvbkN1cnNvckNoYW5nZT1mdW5jdGlvbigpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtvLm9uQ3Vyc29yQ2hhbmdlKCl9KX0sdGhpcy4kcG9zPW47dmFyIHU9ZS5nZXRVbmRvTWFuYWdlcigpLiR1bmRvU3RhY2t8fGUuZ2V0VW5kb01hbmFnZXIoKS4kdW5kb3N0YWNrfHx7bGVuZ3RoOi0xfTt0aGlzLiR1bmRvU3RhY2tEZXB0aD11Lmxlbmd0aCx0aGlzLnNldHVwKCksZS5zZWxlY3Rpb24ub24oImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpfTsoZnVuY3Rpb24oKXtzLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuc2V0dXA9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5kb2Msbj10aGlzLnNlc3Npb247dGhpcy5zZWxlY3Rpb25CZWZvcmU9bi5zZWxlY3Rpb24udG9KU09OKCksbi5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUmJm4uc2VsZWN0aW9uLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnBvcz10LmNyZWF0ZUFuY2hvcih0aGlzLiRwb3Mucm93LHRoaXMuJHBvcy5jb2x1bW4pO3ZhciBpPXRoaXMucG9zO2kuJGluc2VydFJpZ2h0PSEwLGkuZGV0YWNoKCksaS5tYXJrZXJJZD1uLmFkZE1hcmtlcihuZXcgcihpLnJvdyxpLmNvbHVtbixpLnJvdyxpLmNvbHVtbit0aGlzLmxlbmd0aCksdGhpcy5tYWluQ2xhc3MsbnVsbCwhMSksdGhpcy5vdGhlcnM9W10sdGhpcy4kb3RoZXJzLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHI9dC5jcmVhdGVBbmNob3Iobi5yb3csbi5jb2x1bW4pO3IuJGluc2VydFJpZ2h0PSEwLHIuZGV0YWNoKCksZS5vdGhlcnMucHVzaChyKX0pLG4uc2V0VW5kb1NlbGVjdCghMSl9LHRoaXMuc2hvd090aGVyTWFya2Vycz1mdW5jdGlvbigpe2lmKHRoaXMub3RoZXJzQWN0aXZlKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24sdD10aGlzO3RoaXMub3RoZXJzQWN0aXZlPSEwLHRoaXMub3RoZXJzLmZvckVhY2goZnVuY3Rpb24obil7bi5tYXJrZXJJZD1lLmFkZE1hcmtlcihuZXcgcihuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbit0Lmxlbmd0aCksdC5vdGhlcnNDbGFzcyxudWxsLCExKX0pfSx0aGlzLmhpZGVPdGhlck1hcmtlcnM9ZnVuY3Rpb24oKXtpZighdGhpcy5vdGhlcnNBY3RpdmUpcmV0dXJuO3RoaXMub3RoZXJzQWN0aXZlPSExO2Zvcih2YXIgZT0wO2U8dGhpcy5vdGhlcnMubGVuZ3RoO2UrKyl0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMub3RoZXJzW2VdLm1hcmtlcklkKX0sdGhpcy5vblVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLiR1cGRhdGluZylyZXR1cm4gdGhpcy51cGRhdGVBbmNob3JzKGUpO3ZhciB0PWU7aWYodC5zdGFydC5yb3chPT10LmVuZC5yb3cpcmV0dXJuO2lmKHQuc3RhcnQucm93IT09dGhpcy5wb3Mucm93KXJldHVybjt0aGlzLiR1cGRhdGluZz0hMDt2YXIgbj1lLmFjdGlvbj09PSJpbnNlcnQiP3QuZW5kLmNvbHVtbi10LnN0YXJ0LmNvbHVtbjp0LnN0YXJ0LmNvbHVtbi10LmVuZC5jb2x1bW4saT10LnN0YXJ0LmNvbHVtbj49dGhpcy5wb3MuY29sdW1uJiZ0LnN0YXJ0LmNvbHVtbjw9dGhpcy5wb3MuY29sdW1uK3RoaXMubGVuZ3RoKzEscz10LnN0YXJ0LmNvbHVtbi10aGlzLnBvcy5jb2x1bW47dGhpcy51cGRhdGVBbmNob3JzKGUpLGkmJih0aGlzLmxlbmd0aCs9bik7aWYoaSYmIXRoaXMuc2Vzc2lvbi4kZnJvbVVuZG8paWYoZS5hY3Rpb249PT0iaW5zZXJ0Iilmb3IodmFyIG89dGhpcy5vdGhlcnMubGVuZ3RoLTE7bz49MDtvLS0pe3ZhciB1PXRoaXMub3RoZXJzW29dLGE9e3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rc307dGhpcy5kb2MuaW5zZXJ0TWVyZ2VkTGluZXMoYSxlLmxpbmVzKX1lbHNlIGlmKGUuYWN0aW9uPT09InJlbW92ZSIpZm9yKHZhciBvPXRoaXMub3RoZXJzLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgdT10aGlzLm90aGVyc1tvXSxhPXtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uK3N9O3RoaXMuZG9jLnJlbW92ZShuZXcgcihhLnJvdyxhLmNvbHVtbixhLnJvdyxhLmNvbHVtbi1uKSl9dGhpcy4kdXBkYXRpbmc9ITEsdGhpcy51cGRhdGVNYXJrZXJzKCl9LHRoaXMudXBkYXRlQW5jaG9ycz1mdW5jdGlvbihlKXt0aGlzLnBvcy5vbkNoYW5nZShlKTtmb3IodmFyIHQ9dGhpcy5vdGhlcnMubGVuZ3RoO3QtLTspdGhpcy5vdGhlcnNbdF0ub25DaGFuZ2UoZSk7dGhpcy51cGRhdGVNYXJrZXJzKCl9LHRoaXMudXBkYXRlTWFya2Vycz1mdW5jdGlvbigpe2lmKHRoaXMuJHVwZGF0aW5nKXJldHVybjt2YXIgZT10aGlzLHQ9dGhpcy5zZXNzaW9uLG49ZnVuY3Rpb24obixpKXt0LnJlbW92ZU1hcmtlcihuLm1hcmtlcklkKSxuLm1hcmtlcklkPXQuYWRkTWFya2VyKG5ldyByKG4ucm93LG4uY29sdW1uLG4ucm93LG4uY29sdW1uK2UubGVuZ3RoKSxpLG51bGwsITEpfTtuKHRoaXMucG9zLHRoaXMubWFpbkNsYXNzKTtmb3IodmFyIGk9dGhpcy5vdGhlcnMubGVuZ3RoO2ktLTspbih0aGlzLm90aGVyc1tpXSx0aGlzLm90aGVyc0NsYXNzKX0sdGhpcy5vbkN1cnNvckNoYW5nZT1mdW5jdGlvbihlKXtpZih0aGlzLiR1cGRhdGluZ3x8IXRoaXMuc2Vzc2lvbilyZXR1cm47dmFyIHQ9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKTt0LnJvdz09PXRoaXMucG9zLnJvdyYmdC5jb2x1bW4+PXRoaXMucG9zLmNvbHVtbiYmdC5jb2x1bW48PXRoaXMucG9zLmNvbHVtbit0aGlzLmxlbmd0aD8odGhpcy5zaG93T3RoZXJNYXJrZXJzKCksdGhpcy5fZW1pdCgiY3Vyc29yRW50ZXIiLGUpKToodGhpcy5oaWRlT3RoZXJNYXJrZXJzKCksdGhpcy5fZW1pdCgiY3Vyc29yTGVhdmUiLGUpKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24ucmVtb3ZlTWFya2VyKHRoaXMucG9zJiZ0aGlzLnBvcy5tYXJrZXJJZCksdGhpcy5oaWRlT3RoZXJNYXJrZXJzKCksdGhpcy5kb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiRvblVwZGF0ZSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5yZW1vdmVFdmVudExpc3RlbmVyKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSx0aGlzLnNlc3Npb24uc2V0VW5kb1NlbGVjdCghMCksdGhpcy5zZXNzaW9uPW51bGx9LHRoaXMuY2FuY2VsPWZ1bmN0aW9uKCl7aWYodGhpcy4kdW5kb1N0YWNrRGVwdGg9PT0tMSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCksdD0oZS4kdW5kb1N0YWNrfHxlLiR1bmRvc3RhY2spLmxlbmd0aC10aGlzLiR1bmRvU3RhY2tEZXB0aDtmb3IodmFyIG49MDtuPHQ7bisrKWUudW5kbyh0aGlzLnNlc3Npb24sITApO3RoaXMuc2VsZWN0aW9uQmVmb3JlJiZ0aGlzLnNlc3Npb24uc2VsZWN0aW9uLmZyb21KU09OKHRoaXMuc2VsZWN0aW9uQmVmb3JlKX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlBsYWNlSG9sZGVyPW99KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlLnJvdz09dC5yb3cmJmUuY29sdW1uPT10LmNvbHVtbn1mdW5jdGlvbiBvKGUpe3ZhciB0PWUuZG9tRXZlbnQsbj10LmFsdEtleSxvPXQuc2hpZnRLZXksdT10LmN0cmxLZXksYT1lLmdldEFjY2VsS2V5KCksZj1lLmdldEJ1dHRvbigpO3UmJmkuaXNNYWMmJihmPXQuYnV0dG9uKTtpZihlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmZj09Mil7ZS5lZGl0b3IudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZS5kb21FdmVudCk7cmV0dXJufWlmKCF1JiYhbiYmIWEpe2Y9PT0wJiZlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmZS5lZGl0b3IuZXhpdE11bHRpU2VsZWN0TW9kZSgpO3JldHVybn1pZihmIT09MClyZXR1cm47dmFyIGw9ZS5lZGl0b3IsYz1sLnNlbGVjdGlvbixoPWwuaW5NdWx0aVNlbGVjdE1vZGUscD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxkPWMuZ2V0Q3Vyc29yKCksdj1lLmluU2VsZWN0aW9uKCl8fGMuaXNFbXB0eSgpJiZzKHAsZCksbT1lLngsZz1lLnkseT1mdW5jdGlvbihlKXttPWUuY2xpZW50WCxnPWUuY2xpZW50WX0sYj1sLnNlc3Npb24sdz1sLnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcyhtLGcpLEU9dyxTO2lmKGwuJG1vdXNlSGFuZGxlci4kZW5hYmxlSnVtcFRvRGVmKXUmJm58fGEmJm4/Uz1vPyJibG9jayI6ImFkZCI6biYmbC4kYmxvY2tTZWxlY3RFbmFibGVkJiYoUz0iYmxvY2siKTtlbHNlIGlmKGEmJiFuKXtTPSJhZGQiO2lmKCFoJiZvKXJldHVybn1lbHNlIG4mJmwuJGJsb2NrU2VsZWN0RW5hYmxlZCYmKFM9ImJsb2NrIik7UyYmaS5pc01hYyYmdC5jdHJsS2V5JiZsLiRtb3VzZUhhbmRsZXIuY2FuY2VsQ29udGV4dE1lbnUoKTtpZihTPT0iYWRkIil7aWYoIWgmJnYpcmV0dXJuO2lmKCFoKXt2YXIgeD1jLnRvT3JpZW50ZWRSYW5nZSgpO2wuYWRkU2VsZWN0aW9uTWFya2VyKHgpfXZhciBUPWMucmFuZ2VMaXN0LnJhbmdlQXRQb2ludChwKTtsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITAsbyYmKFQ9bnVsbCx4PWMucmFuZ2VzWzBdfHx4LGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKHgpKSxsLm9uY2UoIm1vdXNldXAiLGZ1bmN0aW9uKCl7dmFyIGU9Yy50b09yaWVudGVkUmFuZ2UoKTtUJiZlLmlzRW1wdHkoKSYmcyhULmN1cnNvcixlLmN1cnNvcik/Yy5zdWJzdHJhY3RQb2ludChlLmN1cnNvcik6KG8/Yy5zdWJzdHJhY3RQb2ludCh4LmN1cnNvcik6eCYmKGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKHgpLGMuYWRkUmFuZ2UoeCkpLGMuYWRkUmFuZ2UoZSkpLGwuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMX0pfWVsc2UgaWYoUz09ImJsb2NrIil7ZS5zdG9wKCksbC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO3ZhciBOLEM9W10saz1mdW5jdGlvbigpe3ZhciBlPWwucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKG0sZyksdD1iLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihlLnJvdyxlLmNvbHVtbixlLm9mZnNldFgpO2lmKHMoRSxlKSYmcyh0LGMubGVhZCkpcmV0dXJuO0U9ZSxsLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbih0KSxsLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCksbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKEMpLEM9Yy5yZWN0YW5ndWxhclJhbmdlQmxvY2soRSx3KSxsLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uJiZDLmxlbmd0aD09MSYmQ1swXS5pc0VtcHR5KCkmJihDWzBdPWwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb24uY2xvbmUoKSksQy5mb3JFYWNoKGwuYWRkU2VsZWN0aW9uTWFya2VyLGwpLGwudXBkYXRlU2VsZWN0aW9uTWFya2VycygpfTtoJiYhYT9jLnRvU2luZ2xlUmFuZ2UoKTohaCYmYSYmKE49Yy50b09yaWVudGVkUmFuZ2UoKSxsLmFkZFNlbGVjdGlvbk1hcmtlcihOKSksbz93PWIuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGMubGVhZCk6Yy5tb3ZlVG9Qb3NpdGlvbihwKSxFPXtyb3c6LTEsY29sdW1uOi0xfTt2YXIgTD1mdW5jdGlvbihlKXtrKCksY2xlYXJJbnRlcnZhbChPKSxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoQyksQy5sZW5ndGh8fChDPVtjLnRvT3JpZW50ZWRSYW5nZSgpXSksTiYmKGwucmVtb3ZlU2VsZWN0aW9uTWFya2VyKE4pLGMudG9TaW5nbGVSYW5nZShOKSk7Zm9yKHZhciB0PTA7dDxDLmxlbmd0aDt0KyspYy5hZGRSYW5nZShDW3RdKTtsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITEsbC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbj1udWxsfSxBPWs7ci5jYXB0dXJlKGwuY29udGFpbmVyLHksTCk7dmFyIE89c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtBKCl9LDIwKTtyZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCgpfX12YXIgcj1lKCIuLi9saWIvZXZlbnQiKSxpPWUoIi4uL2xpYi91c2VyYWdlbnQiKTt0Lm9uTW91c2VEb3duPW99KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvbXVsdGlfc2VsZWN0X2NvbW1hbmRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciJdLGZ1bmN0aW9uKGUsdCxuKXt0LmRlZmF1bHRDb21tYW5kcz1be25hbWU6ImFkZEN1cnNvckFib3ZlIixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBhYm92ZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygtMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtVXAiLG1hYzoiQ3RybC1BbHQtVXAifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckJlbG93IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBiZWxvdyIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygxKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1Eb3duIixtYWM6IkN0cmwtQWx0LURvd24ifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckFib3ZlU2tpcEN1cnJlbnQiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGFib3ZlIChza2lwIGN1cnJlbnQpIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKC0xLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1VcCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1VcCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiYWRkQ3Vyc29yQmVsb3dTa2lwQ3VycmVudCIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYmVsb3cgKHNraXAgY3VycmVudCkiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtRG93biIsbWFjOiJDdHJsLUFsdC1TaGlmdC1Eb3duIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RNb3JlQmVmb3JlIixkZXNjcmlwdGlvbjoiU2VsZWN0IG1vcmUgYmVmb3JlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgtMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtTGVmdCIsbWFjOiJDdHJsLUFsdC1MZWZ0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RNb3JlQWZ0ZXIiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbW9yZSBhZnRlciIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtUmlnaHQiLG1hYzoiQ3RybC1BbHQtUmlnaHQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE5leHRCZWZvcmUiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbmV4dCBiZWZvcmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKC0xLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1MZWZ0IixtYWM6IkN0cmwtQWx0LVNoaWZ0LUxlZnQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdE5leHRBZnRlciIsZGVzY3JpcHRpb246IlNlbGVjdCBuZXh0IGFmdGVyIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgxLCEwKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1TaGlmdC1SaWdodCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1SaWdodCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic3BsaXRJbnRvTGluZXMiLGRlc2NyaXB0aW9uOiJTcGxpdCBpbnRvIGxpbmVzIixleGVjOmZ1bmN0aW9uKGUpe2UubXVsdGlTZWxlY3Quc3BsaXRJbnRvTGluZXMoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1MIixtYWM6IkN0cmwtQWx0LUwifSxyZWFkT25seTohMH0se25hbWU6ImFsaWduQ3Vyc29ycyIsZGVzY3JpcHRpb246IkFsaWduIGN1cnNvcnMiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5hbGlnbkN1cnNvcnMoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1BIixtYWM6IkN0cmwtQWx0LUEifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6ImZpbmRBbGwiLGRlc2NyaXB0aW9uOiJGaW5kIGFsbCIsZXhlYzpmdW5jdGlvbihlKXtlLmZpbmRBbGwoKX0sYmluZEtleTp7d2luOiJDdHJsLUFsdC1LIixtYWM6IkN0cmwtQWx0LUcifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH1dLHQubXVsdGlTZWxlY3RDb21tYW5kcz1be25hbWU6InNpbmdsZVNlbGVjdGlvbiIsZGVzY3JpcHRpb246IlNpbmdsZSBzZWxlY3Rpb24iLGJpbmRLZXk6ImVzYyIsZXhlYzpmdW5jdGlvbihlKXtlLmV4aXRNdWx0aVNlbGVjdE1vZGUoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITAsaXNBdmFpbGFibGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJmUuaW5NdWx0aVNlbGVjdE1vZGV9fV07dmFyIHI9ZSgiLi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIikuSGFzaEhhbmRsZXI7dC5rZXlib2FyZEhhbmRsZXI9bmV3IHIodC5tdWx0aVNlbGVjdENvbW1hbmRzKX0pLGFjZS5kZWZpbmUoImFjZS9tdWx0aV9zZWxlY3QiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2VfbGlzdCIsImFjZS9yYW5nZSIsImFjZS9zZWxlY3Rpb24iLCJhY2UvbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIsImFjZS9zZWFyY2giLCJhY2UvZWRpdF9zZXNzaW9uIiwiYWNlL2VkaXRvciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gaChlLHQsbil7cmV0dXJuIGMuJG9wdGlvbnMud3JhcD0hMCxjLiRvcHRpb25zLm5lZWRsZT10LGMuJG9wdGlvbnMuYmFja3dhcmRzPW49PS0xLGMuZmluZChlKX1mdW5jdGlvbiB2KGUsdCl7cmV0dXJuIGUucm93PT10LnJvdyYmZS5jb2x1bW49PXQuY29sdW1ufWZ1bmN0aW9uIG0oZSl7aWYoZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpcmV0dXJuO2UuJG9uQWRkUmFuZ2U9ZS4kb25BZGRSYW5nZS5iaW5kKGUpLGUuJG9uUmVtb3ZlUmFuZ2U9ZS4kb25SZW1vdmVSYW5nZS5iaW5kKGUpLGUuJG9uTXVsdGlTZWxlY3Q9ZS4kb25NdWx0aVNlbGVjdC5iaW5kKGUpLGUuJG9uU2luZ2xlU2VsZWN0PWUuJG9uU2luZ2xlU2VsZWN0LmJpbmQoZSksZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2U9dC5vblNlc3Npb25DaGFuZ2UuYmluZChlKSxlLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlPWUuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UuYmluZChlKSxlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZShlKSxlLm9uKCJjaGFuZ2VTZXNzaW9uIixlLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksZS5vbigibW91c2Vkb3duIixvKSxlLmNvbW1hbmRzLmFkZENvbW1hbmRzKGYuZGVmYXVsdENvbW1hbmRzKSxnKGUpfWZ1bmN0aW9uIGcoZSl7ZnVuY3Rpb24gcih0KXtuJiYoZS5yZW5kZXJlci5zZXRNb3VzZUN1cnNvcigiIiksbj0hMSl9aWYoIWUudGV4dElucHV0KXJldHVybjt2YXIgdD1lLnRleHRJbnB1dC5nZXRFbGVtZW50KCksbj0hMTt1LmFkZExpc3RlbmVyKHQsImtleWRvd24iLGZ1bmN0aW9uKHQpe3ZhciBpPXQua2V5Q29kZT09MTgmJiEodC5jdHJsS2V5fHx0LnNoaWZ0S2V5fHx0Lm1ldGFLZXkpO2UuJGJsb2NrU2VsZWN0RW5hYmxlZCYmaT9ufHwoZS5yZW5kZXJlci5zZXRNb3VzZUN1cnNvcigiY3Jvc3NoYWlyIiksbj0hMCk6biYmcigpfSksdS5hZGRMaXN0ZW5lcih0LCJrZXl1cCIsciksdS5hZGRMaXN0ZW5lcih0LCJibHVyIixyKX12YXIgcj1lKCIuL3JhbmdlX2xpc3QiKS5SYW5nZUxpc3QsaT1lKCIuL3JhbmdlIikuUmFuZ2Uscz1lKCIuL3NlbGVjdGlvbiIpLlNlbGVjdGlvbixvPWUoIi4vbW91c2UvbXVsdGlfc2VsZWN0X2hhbmRsZXIiKS5vbk1vdXNlRG93bix1PWUoIi4vbGliL2V2ZW50IiksYT1lKCIuL2xpYi9sYW5nIiksZj1lKCIuL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIpO3QuY29tbWFuZHM9Zi5kZWZhdWx0Q29tbWFuZHMuY29uY2F0KGYubXVsdGlTZWxlY3RDb21tYW5kcyk7dmFyIGw9ZSgiLi9zZWFyY2giKS5TZWFyY2gsYz1uZXcgbCxwPWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb247KGZ1bmN0aW9uKCl7dGhpcy5nZXRTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNlbGVjdGlvbk1hcmtlcnN9fSkuY2FsbChwLnByb3RvdHlwZSksZnVuY3Rpb24oKXt0aGlzLnJhbmdlcz1udWxsLHRoaXMucmFuZ2VMaXN0PW51bGwsdGhpcy5hZGRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybjtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmdGhpcy5yYW5nZUNvdW50PT09MCl7dmFyIG49dGhpcy50b09yaWVudGVkUmFuZ2UoKTt0aGlzLnJhbmdlTGlzdC5hZGQobiksdGhpcy5yYW5nZUxpc3QuYWRkKGUpO2lmKHRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGghPTIpcmV0dXJuIHRoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpLHR8fHRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSk7dGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCksdGhpcy5yYW5nZUxpc3QuYWRkKG4pLHRoaXMuJG9uQWRkUmFuZ2Uobil9ZS5jdXJzb3J8fChlLmN1cnNvcj1lLmVuZCk7dmFyIHI9dGhpcy5yYW5nZUxpc3QuYWRkKGUpO3JldHVybiB0aGlzLiRvbkFkZFJhbmdlKGUpLHIubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKHIpLHRoaXMucmFuZ2VDb3VudD4xJiYhdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmKHRoaXMuX3NpZ25hbCgibXVsdGlTZWxlY3QiKSx0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSEwLHRoaXMuc2Vzc2lvbi4kdW5kb1NlbGVjdD0hMSx0aGlzLnJhbmdlTGlzdC5hdHRhY2godGhpcy5zZXNzaW9uKSksdHx8dGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKX0sdGhpcy50b1NpbmdsZVJhbmdlPWZ1bmN0aW9uKGUpe2U9ZXx8dGhpcy5yYW5nZXNbMF07dmFyIHQ9dGhpcy5yYW5nZUxpc3QucmVtb3ZlQWxsKCk7dC5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UodCksZSYmdGhpcy5mcm9tT3JpZW50ZWRSYW5nZShlKX0sdGhpcy5zdWJzdHJhY3RQb2ludD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnJhbmdlTGlzdC5zdWJzdHJhY3RQb2ludChlKTtpZih0KXJldHVybiB0aGlzLiRvblJlbW92ZVJhbmdlKHQpLHRbMF19LHRoaXMubWVyZ2VPdmVybGFwcGluZ1Jhbmdlcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmFuZ2VMaXN0Lm1lcmdlKCk7ZS5sZW5ndGgmJnRoaXMuJG9uUmVtb3ZlUmFuZ2UoZSl9LHRoaXMuJG9uQWRkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yYW5nZUNvdW50PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5sZW5ndGgsdGhpcy5yYW5nZXMudW5zaGlmdChlKSx0aGlzLl9zaWduYWwoImFkZFJhbmdlIix7cmFuZ2U6ZX0pfSx0aGlzLiRvblJlbW92ZVJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmFuZ2VDb3VudD10aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoO2lmKHRoaXMucmFuZ2VDb3VudD09MSYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSl7dmFyIHQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLnBvcCgpO2UucHVzaCh0KSx0aGlzLnJhbmdlQ291bnQ9MH1mb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9dGhpcy5yYW5nZXMuaW5kZXhPZihlW25dKTt0aGlzLnJhbmdlcy5zcGxpY2UociwxKX10aGlzLl9zaWduYWwoInJlbW92ZVJhbmdlIix7cmFuZ2VzOmV9KSx0aGlzLnJhbmdlQ291bnQ9PT0wJiZ0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYodGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMSx0aGlzLl9zaWduYWwoInNpbmdsZVNlbGVjdCIpLHRoaXMuc2Vzc2lvbi4kdW5kb1NlbGVjdD0hMCx0aGlzLnJhbmdlTGlzdC5kZXRhY2godGhpcy5zZXNzaW9uKSksdD10fHx0aGlzLnJhbmdlc1swXSx0JiYhdC5pc0VxdWFsKHRoaXMuZ2V0UmFuZ2UoKSkmJnRoaXMuZnJvbU9yaWVudGVkUmFuZ2UodCl9LHRoaXMuJGluaXRSYW5nZUxpc3Q9ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlTGlzdClyZXR1cm47dGhpcy5yYW5nZUxpc3Q9bmV3IHIsdGhpcy5yYW5nZXM9W10sdGhpcy5yYW5nZUNvdW50PTB9LHRoaXMuZ2V0QWxsUmFuZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmFuZ2VDb3VudD90aGlzLnJhbmdlTGlzdC5yYW5nZXMuY29uY2F0KCk6W3RoaXMuZ2V0UmFuZ2UoKV19LHRoaXMuc3BsaXRJbnRvTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLnJhbmdlQ291bnQ+MSl7dmFyIGU9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLHQ9ZVtlLmxlbmd0aC0xXSxuPWkuZnJvbVBvaW50cyhlWzBdLnN0YXJ0LHQuZW5kKTt0aGlzLnRvU2luZ2xlUmFuZ2UoKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKG4sdC5jdXJzb3I9PXQuc3RhcnQpfWVsc2V7dmFyIG49dGhpcy5nZXRSYW5nZSgpLHI9dGhpcy5pc0JhY2t3YXJkcygpLHM9bi5zdGFydC5yb3csbz1uLmVuZC5yb3c7aWYocz09byl7aWYocil2YXIgdT1uLmVuZCxhPW4uc3RhcnQ7ZWxzZSB2YXIgdT1uLnN0YXJ0LGE9bi5lbmQ7dGhpcy5hZGRSYW5nZShpLmZyb21Qb2ludHMoYSxhKSksdGhpcy5hZGRSYW5nZShpLmZyb21Qb2ludHModSx1KSk7cmV0dXJufXZhciBmPVtdLGw9dGhpcy5nZXRMaW5lUmFuZ2UocywhMCk7bC5zdGFydC5jb2x1bW49bi5zdGFydC5jb2x1bW4sZi5wdXNoKGwpO2Zvcih2YXIgYz1zKzE7YzxvO2MrKylmLnB1c2godGhpcy5nZXRMaW5lUmFuZ2UoYywhMCkpO2w9dGhpcy5nZXRMaW5lUmFuZ2UobywhMCksbC5lbmQuY29sdW1uPW4uZW5kLmNvbHVtbixmLnB1c2gobCksZi5mb3JFYWNoKHRoaXMuYWRkUmFuZ2UsdGhpcyl9fSx0aGlzLnRvZ2dsZUJsb2NrU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50PjEpe3ZhciBlPXRoaXMucmFuZ2VMaXN0LnJhbmdlcyx0PWVbZS5sZW5ndGgtMV0sbj1pLmZyb21Qb2ludHMoZVswXS5zdGFydCx0LmVuZCk7dGhpcy50b1NpbmdsZVJhbmdlKCksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShuLHQuY3Vyc29yPT10LnN0YXJ0KX1lbHNle3ZhciByPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5jdXJzb3IpLHM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmFuY2hvciksbz10aGlzLnJlY3Rhbmd1bGFyUmFuZ2VCbG9jayhyLHMpO28uZm9yRWFjaCh0aGlzLmFkZFJhbmdlLHRoaXMpfX0sdGhpcy5yZWN0YW5ndWxhclJhbmdlQmxvY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLHM9ZS5jb2x1bW48dC5jb2x1bW47aWYocyl2YXIgbz1lLmNvbHVtbix1PXQuY29sdW1uLGE9ZS5vZmZzZXRYLGY9dC5vZmZzZXRYO2Vsc2UgdmFyIG89dC5jb2x1bW4sdT1lLmNvbHVtbixhPXQub2Zmc2V0WCxmPWUub2Zmc2V0WDt2YXIgbD1lLnJvdzx0LnJvdztpZihsKXZhciBjPWUucm93LGg9dC5yb3c7ZWxzZSB2YXIgYz10LnJvdyxoPWUucm93O288MCYmKG89MCksYzwwJiYoYz0wKSxjPT1oJiYobj0hMCk7dmFyIHA7Zm9yKHZhciBkPWM7ZDw9aDtkKyspe3ZhciBtPWkuZnJvbVBvaW50cyh0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGQsbyxhKSx0aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGQsdSxmKSk7aWYobS5pc0VtcHR5KCkpe2lmKHAmJnYobS5lbmQscCkpYnJlYWs7cD1tLmVuZH1tLmN1cnNvcj1zP20uc3RhcnQ6bS5lbmQsci5wdXNoKG0pfWwmJnIucmV2ZXJzZSgpO2lmKCFuKXt2YXIgZz1yLmxlbmd0aC0xO3doaWxlKHJbZ10uaXNFbXB0eSgpJiZnPjApZy0tO2lmKGc+MCl7dmFyIHk9MDt3aGlsZShyW3ldLmlzRW1wdHkoKSl5Kyt9Zm9yKHZhciBiPWc7Yj49eTtiLS0pcltiXS5pc0VtcHR5KCkmJnIuc3BsaWNlKGIsMSl9cmV0dXJuIHJ9fS5jYWxsKHMucHJvdG90eXBlKTt2YXIgZD1lKCIuL2VkaXRvciIpLkVkaXRvcjsoZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVNlbGVjdGlvbk1hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy5hZGRTZWxlY3Rpb25NYXJrZXI9ZnVuY3Rpb24oZSl7ZS5jdXJzb3J8fChlLmN1cnNvcj1lLmVuZCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpO3JldHVybiBlLm1hcmtlcj10aGlzLnNlc3Npb24uYWRkTWFya2VyKGUsImFjZV9zZWxlY3Rpb24iLHQpLHRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5wdXNoKGUpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMubGVuZ3RoLGV9LHRoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2VyPWZ1bmN0aW9uKGUpe2lmKCFlLm1hcmtlcilyZXR1cm47dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcihlLm1hcmtlcik7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmluZGV4T2YoZSk7dCE9LTEmJnRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5zcGxpY2UodCwxKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmxlbmd0aH0sdGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycztmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl7dmFyIHI9ZVtuXTtpZighci5tYXJrZXIpY29udGludWU7dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcihyLm1hcmtlcik7dmFyIGk9dC5pbmRleE9mKHIpO2khPS0xJiZ0LnNwbGljZShpLDEpfXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb25NYXJrZXJDb3VudD10Lmxlbmd0aH0sdGhpcy4kb25BZGRSYW5nZT1mdW5jdGlvbihlKXt0aGlzLmFkZFNlbGVjdGlvbk1hcmtlcihlLnJhbmdlKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25SZW1vdmVSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcnMoZS5yYW5nZXMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvbk11bHRpU2VsZWN0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUpcmV0dXJuO3RoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITAsdGhpcy5zZXRTdHlsZSgiYWNlX211bHRpc2VsZWN0IiksdGhpcy5rZXlCaW5kaW5nLmFkZEtleWJvYXJkSGFuZGxlcihmLmtleWJvYXJkSGFuZGxlciksdGhpcy5jb21tYW5kcy5zZXREZWZhdWx0SGFuZGxlcigiZXhlYyIsdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWMpLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfSx0aGlzLiRvblNpbmdsZVNlbGVjdD1mdW5jdGlvbihlKXtpZih0aGlzLnNlc3Npb24ubXVsdGlTZWxlY3QuaW5WaXJ0dWFsTW9kZSlyZXR1cm47dGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMSx0aGlzLnVuc2V0U3R5bGUoImFjZV9tdWx0aXNlbGVjdCIpLHRoaXMua2V5QmluZGluZy5yZW1vdmVLZXlib2FyZEhhbmRsZXIoZi5rZXlib2FyZEhhbmRsZXIpLHRoaXMuY29tbWFuZHMucmVtb3ZlRGVmYXVsdEhhbmRsZXIoImV4ZWMiLHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKSx0aGlzLl9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kb25NdWx0aVNlbGVjdEV4ZWM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21tYW5kLG49ZS5lZGl0b3I7aWYoIW4ubXVsdGlTZWxlY3QpcmV0dXJuO2lmKCF0Lm11bHRpU2VsZWN0QWN0aW9uKXt2YXIgcj10LmV4ZWMobixlLmFyZ3N8fHt9KTtuLm11bHRpU2VsZWN0LmFkZFJhbmdlKG4ubXVsdGlTZWxlY3QudG9PcmllbnRlZFJhbmdlKCkpLG4ubXVsdGlTZWxlY3QubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpfWVsc2UgdC5tdWx0aVNlbGVjdEFjdGlvbj09ImZvckVhY2giP3I9bi5mb3JFYWNoU2VsZWN0aW9uKHQsZS5hcmdzKTp0Lm11bHRpU2VsZWN0QWN0aW9uPT0iZm9yRWFjaExpbmUiP3I9bi5mb3JFYWNoU2VsZWN0aW9uKHQsZS5hcmdzLCEwKTp0Lm11bHRpU2VsZWN0QWN0aW9uPT0ic2luZ2xlIj8obi5leGl0TXVsdGlTZWxlY3RNb2RlKCkscj10LmV4ZWMobixlLmFyZ3N8fHt9KSk6cj10Lm11bHRpU2VsZWN0QWN0aW9uKG4sZS5hcmdzfHx7fSk7cmV0dXJuIHJ9LHRoaXMuZm9yRWFjaFNlbGVjdGlvbj1mdW5jdGlvbihlLHQsbil7aWYodGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXJldHVybjt2YXIgcj1uJiZuLmtlZXBPcmRlcixpPW49PTF8fG4mJm4uJGJ5TGluZXMsbz10aGlzLnNlc3Npb24sdT10aGlzLnNlbGVjdGlvbixhPXUucmFuZ2VMaXN0LGY9KHI/dTphKS5yYW5nZXMsbDtpZighZi5sZW5ndGgpcmV0dXJuIGUuZXhlYz9lLmV4ZWModGhpcyx0fHx7fSk6ZSh0aGlzLHR8fHt9KTt2YXIgYz11Ll9ldmVudFJlZ2lzdHJ5O3UuX2V2ZW50UmVnaXN0cnk9e307dmFyIGg9bmV3IHMobyk7dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO2Zvcih2YXIgcD1mLmxlbmd0aDtwLS07KXtpZihpKXdoaWxlKHA+MCYmZltwXS5zdGFydC5yb3c9PWZbcC0xXS5lbmQucm93KXAtLTtoLmZyb21PcmllbnRlZFJhbmdlKGZbcF0pLGguaW5kZXg9cCx0aGlzLnNlbGVjdGlvbj1vLnNlbGVjdGlvbj1oO3ZhciBkPWUuZXhlYz9lLmV4ZWModGhpcyx0fHx7fSk6ZSh0aGlzLHR8fHt9KTshbCYmZCE9PXVuZGVmaW5lZCYmKGw9ZCksaC50b09yaWVudGVkUmFuZ2UoZltwXSl9aC5kZXRhY2goKSx0aGlzLnNlbGVjdGlvbj1vLnNlbGVjdGlvbj11LHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMSx1Ll9ldmVudFJlZ2lzdHJ5PWMsdS5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCksdS5yYW5nZXNbMF0mJnUuZnJvbU9yaWVudGVkUmFuZ2UodS5yYW5nZXNbMF0pO3ZhciB2PXRoaXMucmVuZGVyZXIuJHNjcm9sbEFuaW1hdGlvbjtyZXR1cm4gdGhpcy5vbkN1cnNvckNoYW5nZSgpLHRoaXMub25TZWxlY3Rpb25DaGFuZ2UoKSx2JiZ2LmZyb209PXYudG8mJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyh2LmZyb20pLGx9LHRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZT1mdW5jdGlvbigpe2lmKCF0aGlzLmluTXVsdGlTZWxlY3RNb2RlfHx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpcmV0dXJuO3RoaXMubXVsdGlTZWxlY3QudG9TaW5nbGVSYW5nZSgpfSx0aGlzLmdldFNlbGVjdGVkVGV4dD1mdW5jdGlvbigpe3ZhciBlPSIiO2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJiF0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciB0PXRoaXMubXVsdGlTZWxlY3QucmFuZ2VMaXN0LnJhbmdlcyxuPVtdO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKW4ucHVzaCh0aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRbcl0pKTt2YXIgaT10aGlzLnNlc3Npb24uZ2V0RG9jdW1lbnQoKS5nZXROZXdMaW5lQ2hhcmFjdGVyKCk7ZT1uLmpvaW4oaSksZS5sZW5ndGg9PShuLmxlbmd0aC0xKSppLmxlbmd0aCYmKGU9IiIpfWVsc2UgdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwoZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSkpO3JldHVybiBlfSx0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmIXRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSl7dmFyIG49dGhpcy5tdWx0aVNlbGVjdC5yYW5nZXNbMF07aWYodGhpcy5tdWx0aVNlbGVjdC5pc0VtcHR5KCkmJnQ9PXRoaXMubXVsdGlTZWxlY3QuYW5jaG9yKXJldHVybjt2YXIgcj10PT10aGlzLm11bHRpU2VsZWN0LmFuY2hvcj9uLmN1cnNvcj09bi5zdGFydD9uLmVuZDpuLnN0YXJ0Om4uY3Vyc29yO3Iucm93IT10LnJvd3x8dGhpcy5zZXNzaW9uLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KHIucm93LHIuY29sdW1uKS5jb2x1bW4hPXQuY29sdW1uP3RoaXMubXVsdGlTZWxlY3QudG9TaW5nbGVSYW5nZSh0aGlzLm11bHRpU2VsZWN0LnRvT3JpZW50ZWRSYW5nZSgpKTp0aGlzLm11bHRpU2VsZWN0Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKX19LHRoaXMuZmluZEFsbD1mdW5jdGlvbihlLHQsbil7dD10fHx7fSx0Lm5lZWRsZT1lfHx0Lm5lZWRsZTtpZih0Lm5lZWRsZT09dW5kZWZpbmVkKXt2YXIgcj10aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCk/dGhpcy5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKCk6dGhpcy5zZWxlY3Rpb24uZ2V0UmFuZ2UoKTt0Lm5lZWRsZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKHIpfXRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIGk9dGhpcy4kc2VhcmNoLmZpbmRBbGwodGhpcy5zZXNzaW9uKTtpZighaS5sZW5ndGgpcmV0dXJuIDA7dmFyIHM9dGhpcy5tdWx0aVNlbGVjdDtufHxzLnRvU2luZ2xlUmFuZ2UoaVswXSk7Zm9yKHZhciBvPWkubGVuZ3RoO28tLTspcy5hZGRSYW5nZShpW29dLCEwKTtyZXR1cm4gciYmcy5yYW5nZUxpc3QucmFuZ2VBdFBvaW50KHIuc3RhcnQpJiZzLmFkZFJhbmdlKHIsITApLGkubGVuZ3RofSx0aGlzLnNlbGVjdE1vcmVMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLHI9bi5jdXJzb3I9PW4uZW5kLHM9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihuLmN1cnNvcik7dGhpcy5zZWxlY3Rpb24uJGRlc2lyZWRDb2x1bW4mJihzLmNvbHVtbj10aGlzLnNlbGVjdGlvbi4kZGVzaXJlZENvbHVtbik7dmFyIG89dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihzLnJvdytlLHMuY29sdW1uKTtpZighbi5pc0VtcHR5KCkpdmFyIHU9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihyP24uZW5kOm4uc3RhcnQpLGE9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbih1LnJvdytlLHUuY29sdW1uKTtlbHNlIHZhciBhPW87aWYocil7dmFyIGY9aS5mcm9tUG9pbnRzKG8sYSk7Zi5jdXJzb3I9Zi5zdGFydH1lbHNle3ZhciBmPWkuZnJvbVBvaW50cyhhLG8pO2YuY3Vyc29yPWYuZW5kfWYuZGVzaXJlZENvbHVtbj1zLmNvbHVtbjtpZighdGhpcy5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUpdGhpcy5zZWxlY3Rpb24uYWRkUmFuZ2Uobik7ZWxzZSBpZih0KXZhciBsPW4uY3Vyc29yO3RoaXMuc2VsZWN0aW9uLmFkZFJhbmdlKGYpLGwmJnRoaXMuc2VsZWN0aW9uLnN1YnN0cmFjdFBvaW50KGwpfSx0aGlzLnRyYW5zcG9zZVNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLG49dC5tdWx0aVNlbGVjdCxyPW4ucmFuZ2VzO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldO2lmKHMuaXNFbXB0eSgpKXt2YXIgbz10LmdldFdvcmRSYW5nZShzLnN0YXJ0LnJvdyxzLnN0YXJ0LmNvbHVtbik7cy5zdGFydC5yb3c9by5zdGFydC5yb3cscy5zdGFydC5jb2x1bW49by5zdGFydC5jb2x1bW4scy5lbmQucm93PW8uZW5kLnJvdyxzLmVuZC5jb2x1bW49by5lbmQuY29sdW1ufX1uLm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKTt2YXIgdT1bXTtmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXTt1LnVuc2hpZnQodC5nZXRUZXh0UmFuZ2UocykpfWU8MD91LnVuc2hpZnQodS5wb3AoKSk6dS5wdXNoKHUuc2hpZnQoKSk7Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV0sbz1zLmNsb25lKCk7dC5yZXBsYWNlKHMsdVtpXSkscy5zdGFydC5yb3c9by5zdGFydC5yb3cscy5zdGFydC5jb2x1bW49by5zdGFydC5jb2x1bW59bi5mcm9tT3JpZW50ZWRSYW5nZShuLnJhbmdlc1swXSl9LHRoaXMuc2VsZWN0TW9yZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLGk9ci5tdWx0aVNlbGVjdCxzPWkudG9PcmllbnRlZFJhbmdlKCk7aWYocy5pc0VtcHR5KCkpe3M9ci5nZXRXb3JkUmFuZ2Uocy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4pLHMuY3Vyc29yPWU9PS0xP3Muc3RhcnQ6cy5lbmQsdGhpcy5tdWx0aVNlbGVjdC5hZGRSYW5nZShzKTtpZihuKXJldHVybn12YXIgbz1yLmdldFRleHRSYW5nZShzKSx1PWgocixvLGUpO3UmJih1LmN1cnNvcj1lPT0tMT91LnN0YXJ0OnUuZW5kLHRoaXMuc2Vzc2lvbi51bmZvbGQodSksdGhpcy5tdWx0aVNlbGVjdC5hZGRSYW5nZSh1KSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpKSx0JiZ0aGlzLm11bHRpU2VsZWN0LnN1YnN0cmFjdFBvaW50KHMuY3Vyc29yKX0sdGhpcy5hbGlnbkN1cnNvcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24sdD1lLm11bHRpU2VsZWN0LG49dC5yYW5nZXMscj0tMSxzPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe2lmKGUuY3Vyc29yLnJvdz09cilyZXR1cm4hMDtyPWUuY3Vyc29yLnJvd30pO2lmKCFuLmxlbmd0aHx8cy5sZW5ndGg9PW4ubGVuZ3RoLTEpe3ZhciBvPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksdT1vLnN0YXJ0LnJvdyxmPW8uZW5kLnJvdyxsPXU9PWY7aWYobCl7dmFyIGM9dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLGg7ZG8gaD10aGlzLnNlc3Npb24uZ2V0TGluZShmKTt3aGlsZSgvWz06XS8udGVzdChoKSYmKytmPGMpO2RvIGg9dGhpcy5zZXNzaW9uLmdldExpbmUodSk7d2hpbGUoL1s9Ol0vLnRlc3QoaCkmJi0tdT4wKTt1PDAmJih1PTApLGY+PWMmJihmPWMtMSl9dmFyIHA9dGhpcy5zZXNzaW9uLnJlbW92ZUZ1bGxMaW5lcyh1LGYpO3A9dGhpcy4kcmVBbGlnblRleHQocCxsKSx0aGlzLnNlc3Npb24uaW5zZXJ0KHtyb3c6dSxjb2x1bW46MH0scC5qb2luKCJcbiIpKyJcbiIpLGx8fChvLnN0YXJ0LmNvbHVtbj0wLG8uZW5kLmNvbHVtbj1wW3AubGVuZ3RoLTFdLmxlbmd0aCksdGhpcy5zZWxlY3Rpb24uc2V0UmFuZ2Uobyl9ZWxzZXtzLmZvckVhY2goZnVuY3Rpb24oZSl7dC5zdWJzdHJhY3RQb2ludChlLmN1cnNvcil9KTt2YXIgZD0wLHY9SW5maW5pdHksbT1uLm1hcChmdW5jdGlvbih0KXt2YXIgbj10LmN1cnNvcixyPWUuZ2V0TGluZShuLnJvdyksaT1yLnN1YnN0cihuLmNvbHVtbikuc2VhcmNoKC9cUy9nKTtyZXR1cm4gaT09LTEmJihpPTApLG4uY29sdW1uPmQmJihkPW4uY29sdW1uKSxpPHYmJih2PWkpLGl9KTtuLmZvckVhY2goZnVuY3Rpb24odCxuKXt2YXIgcj10LmN1cnNvcixzPWQtci5jb2x1bW4sbz1tW25dLXY7cz5vP2UuaW5zZXJ0KHIsYS5zdHJpbmdSZXBlYXQoIiAiLHMtbykpOmUucmVtb3ZlKG5ldyBpKHIucm93LHIuY29sdW1uLHIucm93LHIuY29sdW1uLXMrbykpLHQuc3RhcnQuY29sdW1uPXQuZW5kLmNvbHVtbj1kLHQuc3RhcnQucm93PXQuZW5kLnJvdz1yLnJvdyx0LmN1cnNvcj10LmVuZH0pLHQuZnJvbU9yaWVudGVkUmFuZ2UoblswXSksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9fSx0aGlzLiRyZUFsaWduVGV4dD1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHUoZSl7cmV0dXJuIGEuc3RyaW5nUmVwZWF0KCIgIixlKX1mdW5jdGlvbiBmKGUpe3JldHVybiBlWzJdP3UoaSkrZVsyXSt1KHMtZVsyXS5sZW5ndGgrbykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX1mdW5jdGlvbiBsKGUpe3JldHVybiBlWzJdP3UoaStzLWVbMl0ubGVuZ3RoKStlWzJdK3UobykrZVs0XS5yZXBsYWNlKC9eKFs9Ol0pXHMrLywiJDEgIik6ZVswXX1mdW5jdGlvbiBjKGUpe3JldHVybiBlWzJdP3UoaSkrZVsyXSt1KG8pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19dmFyIG49ITAscj0hMCxpLHMsbztyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvKFxzKikoLio/KShccyopKFs9Ol0uKikvKTtyZXR1cm4gdD9pPT1udWxsPyhpPXRbMV0ubGVuZ3RoLHM9dFsyXS5sZW5ndGgsbz10WzNdLmxlbmd0aCx0KTooaStzK28hPXRbMV0ubGVuZ3RoK3RbMl0ubGVuZ3RoK3RbM10ubGVuZ3RoJiYocj0hMSksaSE9dFsxXS5sZW5ndGgmJihuPSExKSxpPnRbMV0ubGVuZ3RoJiYoaT10WzFdLmxlbmd0aCksczx0WzJdLmxlbmd0aCYmKHM9dFsyXS5sZW5ndGgpLG8+dFszXS5sZW5ndGgmJihvPXRbM10ubGVuZ3RoKSx0KTpbZV19KS5tYXAodD9mOm4/cj9sOmY6Yyl9fSkuY2FsbChkLnByb3RvdHlwZSksdC5vblNlc3Npb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXNzaW9uO3QmJiF0Lm11bHRpU2VsZWN0JiYodC4kc2VsZWN0aW9uTWFya2Vycz1bXSx0LnNlbGVjdGlvbi4kaW5pdFJhbmdlTGlzdCgpLHQubXVsdGlTZWxlY3Q9dC5zZWxlY3Rpb24pLHRoaXMubXVsdGlTZWxlY3Q9dCYmdC5tdWx0aVNlbGVjdDt2YXIgbj1lLm9sZFNlc3Npb247biYmKG4ubXVsdGlTZWxlY3Qub2ZmKCJhZGRSYW5nZSIsdGhpcy4kb25BZGRSYW5nZSksbi5tdWx0aVNlbGVjdC5vZmYoInJlbW92ZVJhbmdlIix0aGlzLiRvblJlbW92ZVJhbmdlKSxuLm11bHRpU2VsZWN0Lm9mZigibXVsdGlTZWxlY3QiLHRoaXMuJG9uTXVsdGlTZWxlY3QpLG4ubXVsdGlTZWxlY3Qub2ZmKCJzaW5nbGVTZWxlY3QiLHRoaXMuJG9uU2luZ2xlU2VsZWN0KSxuLm11bHRpU2VsZWN0LmxlYWQub2ZmKCJjaGFuZ2UiLHRoaXMuJGNoZWNrTXVsdGlzZWxlY3RDaGFuZ2UpLG4ubXVsdGlTZWxlY3QuYW5jaG9yLm9mZigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSksdCYmKHQubXVsdGlTZWxlY3Qub24oImFkZFJhbmdlIix0aGlzLiRvbkFkZFJhbmdlKSx0Lm11bHRpU2VsZWN0Lm9uKCJyZW1vdmVSYW5nZSIsdGhpcy4kb25SZW1vdmVSYW5nZSksdC5tdWx0aVNlbGVjdC5vbigibXVsdGlTZWxlY3QiLHRoaXMuJG9uTXVsdGlTZWxlY3QpLHQubXVsdGlTZWxlY3Qub24oInNpbmdsZVNlbGVjdCIsdGhpcy4kb25TaW5nbGVTZWxlY3QpLHQubXVsdGlTZWxlY3QubGVhZC5vbigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSx0Lm11bHRpU2VsZWN0LmFuY2hvci5vbigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSksdCYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSE9dC5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGUmJih0LnNlbGVjdGlvbi5pbk11bHRpU2VsZWN0TW9kZT90aGlzLiRvbk11bHRpU2VsZWN0KCk6dGhpcy4kb25TaW5nbGVTZWxlY3QoKSl9LHQuTXVsdGlTZWxlY3Q9bSxlKCIuL2NvbmZpZyIpLmRlZmluZU9wdGlvbnMoZC5wcm90b3R5cGUsImVkaXRvciIse2VuYWJsZU11bHRpc2VsZWN0OntzZXQ6ZnVuY3Rpb24oZSl7bSh0aGlzKSxlPyh0aGlzLm9uKCJjaGFuZ2VTZXNzaW9uIix0aGlzLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksdGhpcy5vbigibW91c2Vkb3duIixvKSk6KHRoaXMub2ZmKCJjaGFuZ2VTZXNzaW9uIix0aGlzLiRtdWx0aXNlbGVjdE9uU2Vzc2lvbkNoYW5nZSksdGhpcy5vZmYoIm1vdXNlZG93biIsbykpfSx2YWx1ZTohMH0sZW5hYmxlQmxvY2tTZWxlY3Q6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRibG9ja1NlbGVjdEVuYWJsZWQ9ZX0sdmFsdWU6ITB9fSl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxpPXQuRm9sZE1vZGU9ZnVuY3Rpb24oKXt9OyhmdW5jdGlvbigpe3RoaXMuZm9sZGluZ1N0YXJ0TWFya2VyPW51bGwsdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1udWxsLHRoaXMuZ2V0Rm9sZFdpZGdldD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXRMaW5lKG4pO3JldHVybiB0aGlzLmZvbGRpbmdTdGFydE1hcmtlci50ZXN0KHIpPyJzdGFydCI6dD09Im1hcmtiZWdpbmVuZCImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXImJnRoaXMuZm9sZGluZ1N0b3BNYXJrZXIudGVzdChyKT8iZW5kIjoiIn0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsfSx0aGlzLmluZGVudGF0aW9uQmxvY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPS9cUy8scz1lLmdldExpbmUodCksbz1zLnNlYXJjaChpKTtpZihvPT0tMSlyZXR1cm47dmFyIHU9bnx8cy5sZW5ndGgsYT1lLmdldExlbmd0aCgpLGY9dCxsPXQ7d2hpbGUoKyt0PGEpe3ZhciBjPWUuZ2V0TGluZSh0KS5zZWFyY2goaSk7aWYoYz09LTEpY29udGludWU7aWYoYzw9byl7dmFyIGg9ZS5nZXRUb2tlbkF0KHQsMCk7aWYoIWh8fGgudHlwZSE9PSJzdHJpbmciKWJyZWFrfWw9dH1pZihsPmYpe3ZhciBwPWUuZ2V0TGluZShsKS5sZW5ndGg7cmV0dXJuIG5ldyByKGYsdSxsLHApfX0sdGhpcy5vcGVuaW5nQnJhY2tldEJsb2NrPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89e3JvdzpuLGNvbHVtbjppKzF9LHU9ZS4kZmluZENsb3NpbmdCcmFja2V0KHQsbyxzKTtpZighdSlyZXR1cm47dmFyIGE9ZS5mb2xkV2lkZ2V0c1t1LnJvd107cmV0dXJuIGE9PW51bGwmJihhPWUuZ2V0Rm9sZFdpZGdldCh1LnJvdykpLGE9PSJzdGFydCImJnUucm93Pm8ucm93JiYodS5yb3ctLSx1LmNvbHVtbj1lLmdldExpbmUodS5yb3cpLmxlbmd0aCksci5mcm9tUG9pbnRzKG8sdSl9LHRoaXMuY2xvc2luZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXtyb3c6bixjb2x1bW46aX0sdT1lLiRmaW5kT3BlbmluZ0JyYWNrZXQodCxvKTtpZighdSlyZXR1cm47cmV0dXJuIHUuY29sdW1uKyssby5jb2x1bW4tLSxyLmZyb21Qb2ludHModSxvKX19KS5jYWxsKGkucHJvdG90eXBlKX0pLGFjZS5kZWZpbmUoImFjZS90aGVtZS90ZXh0bWF0ZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmlzRGFyaz0hMSx0LmNzc0NsYXNzPSJhY2UtdG0iLHQuY3NzVGV4dD0nLmFjZS10bSAuYWNlX2d1dHRlciB7YmFja2dyb3VuZDogI2YwZjBmMDtjb2xvcjogIzMzMzt9LmFjZS10bSAuYWNlX3ByaW50LW1hcmdpbiB7d2lkdGg6IDFweDtiYWNrZ3JvdW5kOiAjZThlOGU4O30uYWNlLXRtIC5hY2VfZm9sZCB7YmFja2dyb3VuZC1jb2xvcjogIzZCNzJFNjt9LmFjZS10bSB7YmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtjb2xvcjogYmxhY2s7fS5hY2UtdG0gLmFjZV9jdXJzb3Ige2NvbG9yOiBibGFjazt9LmFjZS10bSAuYWNlX2ludmlzaWJsZSB7Y29sb3I6IHJnYigxOTEsIDE5MSwgMTkxKTt9LmFjZS10bSAuYWNlX3N0b3JhZ2UsLmFjZS10bSAuYWNlX2tleXdvcmQge2NvbG9yOiBibHVlO30uYWNlLXRtIC5hY2VfY29uc3RhbnQge2NvbG9yOiByZ2IoMTk3LCA2LCAxMSk7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfYnVpbGRpbiB7Y29sb3I6IHJnYig4OCwgNzIsIDI0Nik7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbGFuZ3VhZ2Uge2NvbG9yOiByZ2IoODgsIDkyLCAyNDYpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2xpYnJhcnkge2NvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9pbnZhbGlkIHtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwgMC4xKTtjb2xvcjogcmVkO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfZnVuY3Rpb24ge2NvbG9yOiByZ2IoNjAsIDc2LCAxMTQpO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfY29uc3RhbnQge2NvbG9yOiByZ2IoNiwgMTUwLCAxNCk7fS5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV90eXBlLC5hY2UtdG0gLmFjZV9zdXBwb3J0LmFjZV9jbGFzcyB7Y29sb3I6IHJnYigxMDksIDEyMSwgMjIyKTt9LmFjZS10bSAuYWNlX2tleXdvcmQuYWNlX29wZXJhdG9yIHtjb2xvcjogcmdiKDEwNCwgMTE4LCAxMzUpO30uYWNlLXRtIC5hY2Vfc3RyaW5nIHtjb2xvcjogcmdiKDMsIDEwNiwgNyk7fS5hY2UtdG0gLmFjZV9jb21tZW50IHtjb2xvcjogcmdiKDc2LCAxMzYsIDEwNyk7fS5hY2UtdG0gLmFjZV9jb21tZW50LmFjZV9kb2Mge2NvbG9yOiByZ2IoMCwgMTAyLCAyNTUpO30uYWNlLXRtIC5hY2VfY29tbWVudC5hY2VfZG9jLmFjZV90YWcge2NvbG9yOiByZ2IoMTI4LCAxNTksIDE5MSk7fS5hY2UtdG0gLmFjZV9jb25zdGFudC5hY2VfbnVtZXJpYyB7Y29sb3I6IHJnYigwLCAwLCAyMDUpO30uYWNlLXRtIC5hY2VfdmFyaWFibGUge2NvbG9yOiByZ2IoNDksIDEzMiwgMTQ5KTt9LmFjZS10bSAuYWNlX3htbC1wZSB7Y29sb3I6IHJnYigxMDQsIDEwNCwgOTEpO30uYWNlLXRtIC5hY2VfZW50aXR5LmFjZV9uYW1lLmFjZV9mdW5jdGlvbiB7Y29sb3I6ICMwMDAwQTI7fS5hY2UtdG0gLmFjZV9oZWFkaW5nIHtjb2xvcjogcmdiKDEyLCA3LCAyNTUpO30uYWNlLXRtIC5hY2VfbGlzdCB7Y29sb3I6cmdiKDE4NSwgNiwgMTQ0KTt9LmFjZS10bSAuYWNlX21ldGEuYWNlX3RhZyB7Y29sb3I6cmdiKDAsIDIyLCAxNDIpO30uYWNlLXRtIC5hY2Vfc3RyaW5nLmFjZV9yZWdleCB7Y29sb3I6IHJnYigyNTUsIDAsIDApfS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3Rpb24ge2JhY2tncm91bmQ6IHJnYigxODEsIDIxMywgMjU1KTt9LmFjZS10bS5hY2VfbXVsdGlzZWxlY3QgLmFjZV9zZWxlY3Rpb24uYWNlX3N0YXJ0IHtib3gtc2hhZG93OiAwIDAgM3B4IDBweCB3aGl0ZTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAge2JhY2tncm91bmQ6IHJnYigyNTIsIDI1NSwgMCk7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGFjayB7YmFja2dyb3VuZDogcmdiKDE2NCwgMjI5LCAxMDEpO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7bWFyZ2luOiAtMXB4IDAgMCAtMXB4O2JvcmRlcjogMXB4IHNvbGlkIHJnYigxOTIsIDE5MiwgMTkyKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2FjdGl2ZS1saW5lIHtiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMDcpO30uYWNlLXRtIC5hY2VfZ3V0dGVyLWFjdGl2ZS1saW5lIHtiYWNrZ3JvdW5kLWNvbG9yIDogI2RjZGNkYzt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkLXdvcmQge2JhY2tncm91bmQ6IHJnYigyNTAsIDI1MCwgMjU1KTtib3JkZXI6IDFweCBzb2xpZCByZ2IoMjAwLCAyMDAsIDI1MCk7fS5hY2UtdG0gLmFjZV9pbmRlbnQtZ3VpZGUge2JhY2tncm91bmQ6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUFDQ0FZQUFBQ1pnYlluQUFBQUUwbEVRVlFJbVdQNC8vLy9mNGJMbHkvL0J3QW1WZ2QxL3cxMS9nQUFBQUJKUlU1RXJrSmdnZz09IikgcmlnaHQgcmVwZWF0LXk7fScsdC4kaWQ9ImFjZS90aGVtZS90ZXh0bWF0ZSI7dmFyIHI9ZSgiLi4vbGliL2RvbSIpO3IuaW1wb3J0Q3NzU3RyaW5nKHQuY3NzVGV4dCx0LmNzc0NsYXNzKX0pLGFjZS5kZWZpbmUoImFjZS9saW5lX3dpZGdldHMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe3RoaXMuc2Vzc2lvbj1lLHRoaXMuc2Vzc2lvbi53aWRnZXRNYW5hZ2VyPXRoaXMsdGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aD10aGlzLmdldFJvd0xlbmd0aCx0aGlzLnNlc3Npb24uJGdldFdpZGdldFNjcmVlbkxlbmd0aD10aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGgsdGhpcy51cGRhdGVPbkNoYW5nZT10aGlzLnVwZGF0ZU9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5yZW5kZXJXaWRnZXRzPXRoaXMucmVuZGVyV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMubWVhc3VyZVdpZGdldHM9dGhpcy5tZWFzdXJlV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHM9W10sdGhpcy4kb25DaGFuZ2VFZGl0b3I9dGhpcy4kb25DaGFuZ2VFZGl0b3IuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZSIsdGhpcy51cGRhdGVPbkNoYW5nZSksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VGb2xkIix0aGlzLnVwZGF0ZU9uRm9sZCksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VFZGl0b3IiLHRoaXMuJG9uQ2hhbmdlRWRpdG9yKX12YXIgcj1lKCIuL2xpYi9vb3AiKSxpPWUoIi4vbGliL2RvbSIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlOyhmdW5jdGlvbigpe3RoaXMuZ2V0Um93TGVuZ3RoPWZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzLmxpbmVXaWRnZXRzP3Q9dGhpcy5saW5lV2lkZ2V0c1tlXSYmdGhpcy5saW5lV2lkZ2V0c1tlXS5yb3dDb3VudHx8MDp0PTAsIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MSt0OnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxK3R9LHRoaXMuJGdldFdpZGdldFNjcmVlbkxlbmd0aD1mdW5jdGlvbigpe3ZhciBlPTA7cmV0dXJuIHRoaXMubGluZVdpZGdldHMuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0LnJvd0NvdW50JiYhdC5oaWRkZW4mJihlKz10LnJvd0NvdW50KX0pLGV9LHRoaXMuJG9uQ2hhbmdlRWRpdG9yPWZ1bmN0aW9uKGUpe3RoaXMuYXR0YWNoKGUuZWRpdG9yKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7ZSYmZS53aWRnZXRNYW5hZ2VyJiZlLndpZGdldE1hbmFnZXIhPXRoaXMmJmUud2lkZ2V0TWFuYWdlci5kZXRhY2goKTtpZih0aGlzLmVkaXRvcj09ZSlyZXR1cm47dGhpcy5kZXRhY2goKSx0aGlzLmVkaXRvcj1lLGUmJihlLndpZGdldE1hbmFnZXI9dGhpcyxlLnJlbmRlcmVyLm9uKCJiZWZvcmVSZW5kZXIiLHRoaXMubWVhc3VyZVdpZGdldHMpLGUucmVuZGVyZXIub24oImFmdGVyUmVuZGVyIix0aGlzLnJlbmRlcldpZGdldHMpKX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3I7aWYoIXQpcmV0dXJuO3RoaXMuZWRpdG9yPW51bGwsdC53aWRnZXRNYW5hZ2VyPW51bGwsdC5yZW5kZXJlci5vZmYoImJlZm9yZVJlbmRlciIsdGhpcy5tZWFzdXJlV2lkZ2V0cyksdC5yZW5kZXJlci5vZmYoImFmdGVyUmVuZGVyIix0aGlzLnJlbmRlcldpZGdldHMpO3ZhciBuPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztuJiZuLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmZS5lbCYmZS5lbC5wYXJlbnROb2RlJiYoZS5faW5Eb2N1bWVudD0hMSxlLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZS5lbCkpfSl9LHRoaXMudXBkYXRlT25Gb2xkPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5saW5lV2lkZ2V0cztpZighbnx8IWUuYWN0aW9uKXJldHVybjt2YXIgcj1lLmRhdGEsaT1yLnN0YXJ0LnJvdyxzPXIuZW5kLnJvdyxvPWUuYWN0aW9uPT0iYWRkIjtmb3IodmFyIHU9aSsxO3U8czt1Kyspblt1XSYmKG5bdV0uaGlkZGVuPW8pO25bc10mJihvP25baV0/bltzXS5oaWRkZW49bzpuW2ldPW5bc106KG5baV09PW5bc10mJihuW2ldPXVuZGVmaW5lZCksbltzXS5oaWRkZW49bykpfSx0aGlzLnVwZGF0ZU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighdClyZXR1cm47dmFyIG49ZS5zdGFydC5yb3cscj1lLmVuZC5yb3ctbjtpZihyIT09MClpZihlLmFjdGlvbj09InJlbW92ZSIpe3ZhciBpPXQuc3BsaWNlKG4rMSxyKTtpLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmdGhpcy5yZW1vdmVMaW5lV2lkZ2V0KGUpfSx0aGlzKSx0aGlzLiR1cGRhdGVSb3dzKCl9ZWxzZXt2YXIgcz1uZXcgQXJyYXkocik7cy51bnNoaWZ0KG4sMCksdC5zcGxpY2UuYXBwbHkodCxzKSx0aGlzLiR1cGRhdGVSb3dzKCl9fSx0aGlzLiR1cGRhdGVSb3dzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCFlKXJldHVybjt2YXIgdD0hMDtlLmZvckVhY2goZnVuY3Rpb24oZSxuKXtpZihlKXt0PSExLGUucm93PW47d2hpbGUoZS4kb2xkV2lkZ2V0KWUuJG9sZFdpZGdldC5yb3c9bixlPWUuJG9sZFdpZGdldH19KSx0JiYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzPW51bGwpfSx0aGlzLmFkZExpbmVXaWRnZXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzfHwodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzPW5ldyBBcnJheSh0aGlzLnNlc3Npb24uZ2V0TGVuZ3RoKCkpKTt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddO3QmJihlLiRvbGRXaWRnZXQ9dCx0LmVsJiZ0LmVsLnBhcmVudE5vZGUmJih0LmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5lbCksdC5faW5Eb2N1bWVudD0hMSkpLHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd109ZSxlLnNlc3Npb249dGhpcy5zZXNzaW9uO3ZhciBuPXRoaXMuZWRpdG9yLnJlbmRlcmVyO2UuaHRtbCYmIWUuZWwmJihlLmVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5lbC5pbm5lckhUTUw9ZS5odG1sKSxlLmVsJiYoaS5hZGRDc3NDbGFzcyhlLmVsLCJhY2VfbGluZVdpZGdldENvbnRhaW5lciIpLGUuZWwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixlLmVsLnN0eWxlLnpJbmRleD01LG4uY29udGFpbmVyLmFwcGVuZENoaWxkKGUuZWwpLGUuX2luRG9jdW1lbnQ9ITApLGUuY292ZXJHdXR0ZXJ8fChlLmVsLnN0eWxlLnpJbmRleD0zKSxlLnBpeGVsSGVpZ2h0PT1udWxsJiYoZS5waXhlbEhlaWdodD1lLmVsLm9mZnNldEhlaWdodCksZS5yb3dDb3VudD09bnVsbCYmKGUucm93Q291bnQ9ZS5waXhlbEhlaWdodC9uLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQpO3ZhciByPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZS5yb3csMCk7ZS4kZm9sZD1yO2lmKHIpe3ZhciBzPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztlLnJvdz09ci5lbmQucm93JiYhc1tyLnN0YXJ0LnJvd10/c1tyLnN0YXJ0LnJvd109ZTplLmhpZGRlbj0hMH1yZXR1cm4gdGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzplLnJvd319fSksdGhpcy4kdXBkYXRlUm93cygpLHRoaXMucmVuZGVyV2lkZ2V0cyhudWxsLG4pLHRoaXMub25XaWRnZXRDaGFuZ2VkKGUpLGV9LHRoaXMucmVtb3ZlTGluZVdpZGdldD1mdW5jdGlvbihlKXtlLl9pbkRvY3VtZW50PSExLGUuc2Vzc2lvbj1udWxsLGUuZWwmJmUuZWwucGFyZW50Tm9kZSYmZS5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuZWwpO2lmKGUuZWRpdG9yJiZlLmVkaXRvci5kZXN0cm95KXRyeXtlLmVkaXRvci5kZXN0cm95KCl9Y2F0Y2godCl7fWlmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyl7dmFyIG49dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XTtpZihuPT1lKXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd109ZS4kb2xkV2lkZ2V0LGUuJG9sZFdpZGdldCYmdGhpcy5vbldpZGdldENoYW5nZWQoZS4kb2xkV2lkZ2V0KTtlbHNlIHdoaWxlKG4pe2lmKG4uJG9sZFdpZGdldD09ZSl7bi4kb2xkV2lkZ2V0PWUuJG9sZFdpZGdldDticmVha31uPW4uJG9sZFdpZGdldH19dGhpcy5zZXNzaW9uLl9lbWl0KCJjaGFuZ2VGb2xkIix7ZGF0YTp7c3RhcnQ6e3JvdzplLnJvd319fSksdGhpcy4kdXBkYXRlUm93cygpfSx0aGlzLmdldFdpZGdldHNBdFJvdz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHMsbj10JiZ0W2VdLHI9W107d2hpbGUobilyLnB1c2gobiksbj1uLiRvbGRXaWRnZXQ7cmV0dXJuIHJ9LHRoaXMub25XaWRnZXRDaGFuZ2VkPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHMucHVzaChlKSx0aGlzLmVkaXRvciYmdGhpcy5lZGl0b3IucmVuZGVyZXIudXBkYXRlRnVsbCgpfSx0aGlzLm1lYXN1cmVXaWRnZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cyxyPXQubGF5ZXJDb25maWc7aWYoIW58fCFuLmxlbmd0aClyZXR1cm47dmFyIGk9SW5maW5pdHk7Zm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe3ZhciBvPW5bc107aWYoIW98fCFvLmVsKWNvbnRpbnVlO2lmKG8uc2Vzc2lvbiE9dGhpcy5zZXNzaW9uKWNvbnRpbnVlO2lmKCFvLl9pbkRvY3VtZW50KXtpZih0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbby5yb3ddIT1vKWNvbnRpbnVlO28uX2luRG9jdW1lbnQ9ITAsdC5jb250YWluZXIuYXBwZW5kQ2hpbGQoby5lbCl9by5oPW8uZWwub2Zmc2V0SGVpZ2h0LG8uZml4ZWRXaWR0aHx8KG8udz1vLmVsLm9mZnNldFdpZHRoLG8uc2NyZWVuV2lkdGg9TWF0aC5jZWlsKG8udy9yLmNoYXJhY3RlcldpZHRoKSk7dmFyIHU9by5oL3IubGluZUhlaWdodDtvLmNvdmVyTGluZSYmKHUtPXRoaXMuc2Vzc2lvbi5nZXRSb3dMaW5lQ291bnQoby5yb3cpLHU8MCYmKHU9MCkpLG8ucm93Q291bnQhPXUmJihvLnJvd0NvdW50PXUsby5yb3c8aSYmKGk9by5yb3cpKX1pIT1JbmZpbml0eSYmKHRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6aX19fSksdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRXaWR0aD1udWxsKSx0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzPVtdfSx0aGlzLnJlbmRlcldpZGdldHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmxheWVyQ29uZmlnLHI9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzO2lmKCFyKXJldHVybjt2YXIgaT1NYXRoLm1pbih0aGlzLmZpcnN0Um93LG4uZmlyc3RSb3cpLHM9TWF0aC5tYXgodGhpcy5sYXN0Um93LG4ubGFzdFJvdyxyLmxlbmd0aCk7d2hpbGUoaT4wJiYhcltpXSlpLS07dGhpcy5maXJzdFJvdz1uLmZpcnN0Um93LHRoaXMubGFzdFJvdz1uLmxhc3RSb3csdC4kY3Vyc29yTGF5ZXIuY29uZmlnPW47Zm9yKHZhciBvPWk7bzw9cztvKyspe3ZhciB1PXJbb107aWYoIXV8fCF1LmVsKWNvbnRpbnVlO2lmKHUuaGlkZGVuKXt1LmVsLnN0eWxlLnRvcD0tMTAwLSh1LnBpeGVsSGVpZ2h0fHwwKSsicHgiO2NvbnRpbnVlfXUuX2luRG9jdW1lbnR8fCh1Ll9pbkRvY3VtZW50PSEwLHQuY29udGFpbmVyLmFwcGVuZENoaWxkKHUuZWwpKTt2YXIgYT10LiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHtyb3c6byxjb2x1bW46MH0sITApLnRvcDt1LmNvdmVyTGluZXx8KGErPW4ubGluZUhlaWdodCp0aGlzLnNlc3Npb24uZ2V0Um93TGluZUNvdW50KHUucm93KSksdS5lbC5zdHlsZS50b3A9YS1uLm9mZnNldCsicHgiO3ZhciBmPXUuY292ZXJHdXR0ZXI/MDp0Lmd1dHRlcldpZHRoO3UuZml4ZWRXaWR0aHx8KGYtPXQuc2Nyb2xsTGVmdCksdS5lbC5zdHlsZS5sZWZ0PWYrInB4Iix1LmZ1bGxXaWR0aCYmdS5zY3JlZW5XaWR0aCYmKHUuZWwuc3R5bGUubWluV2lkdGg9bi53aWR0aCsyKm4ucGFkZGluZysicHgiKSx1LmZpeGVkV2lkdGg/dS5lbC5zdHlsZS5yaWdodD10LnNjcm9sbEJhci5nZXRXaWR0aCgpKyJweCI6dS5lbC5zdHlsZS5yaWdodD0iIn19fSkuY2FsbChvLnByb3RvdHlwZSksdC5MaW5lV2lkZ2V0cz1vfSksYWNlLmRlZmluZSgiYWNlL2V4dC9lcnJvcl9tYXJrZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGluZV93aWRnZXRzIiwiYWNlL2xpYi9kb20iLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0LG4pe3ZhciByPTAsaT1lLmxlbmd0aC0xO3doaWxlKHI8PWkpe3ZhciBzPXIraT4+MSxvPW4odCxlW3NdKTtpZihvPjApcj1zKzE7ZWxzZXtpZighKG88MCkpcmV0dXJuIHM7aT1zLTF9fXJldHVybi0ocisxKX1mdW5jdGlvbiB1KGUsdCxuKXt2YXIgcj1lLmdldEFubm90YXRpb25zKCkuc29ydChzLmNvbXBhcmVQb2ludHMpO2lmKCFyLmxlbmd0aClyZXR1cm47dmFyIGk9byhyLHtyb3c6dCxjb2x1bW46LTF9LHMuY29tcGFyZVBvaW50cyk7aTwwJiYoaT0taS0xKSxpPj1yLmxlbmd0aD9pPW4+MD8wOnIubGVuZ3RoLTE6aT09PTAmJm48MCYmKGk9ci5sZW5ndGgtMSk7dmFyIHU9cltpXTtpZighdXx8IW4pcmV0dXJuO2lmKHUucm93PT09dCl7ZG8gdT1yW2krPW5dO3doaWxlKHUmJnUucm93PT09dCk7aWYoIXUpcmV0dXJuIHIuc2xpY2UoKX12YXIgYT1bXTt0PXUucm93O2RvIGFbbjwwPyJ1bnNoaWZ0IjoicHVzaCJdKHUpLHU9cltpKz1uXTt3aGlsZSh1JiZ1LnJvdz09dCk7cmV0dXJuIGEubGVuZ3RoJiZhfXZhciByPWUoIi4uL2xpbmVfd2lkZ2V0cyIpLkxpbmVXaWRnZXRzLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vcmFuZ2UiKS5SYW5nZTt0LnNob3dFcnJvck1hcmtlcj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuc2Vzc2lvbjtuLndpZGdldE1hbmFnZXJ8fChuLndpZGdldE1hbmFnZXI9bmV3IHIobiksbi53aWRnZXRNYW5hZ2VyLmF0dGFjaChlKSk7dmFyIHM9ZS5nZXRDdXJzb3JQb3NpdGlvbigpLG89cy5yb3csYT1uLndpZGdldE1hbmFnZXIuZ2V0V2lkZ2V0c0F0Um93KG8pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT0iZXJyb3JNYXJrZXIifSlbMF07YT9hLmRlc3Ryb3koKTpvLT10O3ZhciBmPXUobixvLHQpLGw7aWYoZil7dmFyIGM9ZlswXTtzLmNvbHVtbj0oYy5wb3MmJnR5cGVvZiBjLmNvbHVtbiE9Im51bWJlciI/Yy5wb3Muc2M6Yy5jb2x1bW4pfHwwLHMucm93PWMucm93LGw9ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuJGFubm90YXRpb25zW3Mucm93XX1lbHNle2lmKGEpcmV0dXJuO2w9e3RleHQ6WyJMb29rcyBnb29kISJdLGNsYXNzTmFtZToiYWNlX29rIn19ZS5zZXNzaW9uLnVuZm9sZChzLnJvdyksZS5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24ocyk7dmFyIGg9e3JvdzpzLnJvdyxmaXhlZFdpZHRoOiEwLGNvdmVyR3V0dGVyOiEwLGVsOmkuY3JlYXRlRWxlbWVudCgiZGl2IiksdHlwZToiZXJyb3JNYXJrZXIifSxwPWguZWwuYXBwZW5kQ2hpbGQoaS5jcmVhdGVFbGVtZW50KCJkaXYiKSksZD1oLmVsLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpO2QuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXRfYXJyb3cgIitsLmNsYXNzTmFtZTt2YXIgdj1lLnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKHMpLmxlZnQ7ZC5zdHlsZS5sZWZ0PXYrZS5yZW5kZXJlci5ndXR0ZXJXaWR0aC01KyJweCIsaC5lbC5jbGFzc05hbWU9ImVycm9yX3dpZGdldF93cmFwcGVyIixwLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0ICIrbC5jbGFzc05hbWUscC5pbm5lckhUTUw9bC50ZXh0LmpvaW4oIjxicj4iKSxwLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpO3ZhciBtPWZ1bmN0aW9uKGUsdCxuKXtpZih0PT09MCYmKG49PT0iZXNjInx8bj09PSJyZXR1cm4iKSlyZXR1cm4gaC5kZXN0cm95KCkse2NvbW1hbmQ6Im51bGwifX07aC5kZXN0cm95PWZ1bmN0aW9uKCl7aWYoZS4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkKXJldHVybjtlLmtleUJpbmRpbmcucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKG0pLG4ud2lkZ2V0TWFuYWdlci5yZW1vdmVMaW5lV2lkZ2V0KGgpLGUub2ZmKCJjaGFuZ2VTZWxlY3Rpb24iLGguZGVzdHJveSksZS5vZmYoImNoYW5nZVNlc3Npb24iLGguZGVzdHJveSksZS5vZmYoIm1vdXNldXAiLGguZGVzdHJveSksZS5vZmYoImNoYW5nZSIsaC5kZXN0cm95KX0sZS5rZXlCaW5kaW5nLmFkZEtleWJvYXJkSGFuZGxlcihtKSxlLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGguZGVzdHJveSksZS5vbigiY2hhbmdlU2Vzc2lvbiIsaC5kZXN0cm95KSxlLm9uKCJtb3VzZXVwIixoLmRlc3Ryb3kpLGUub24oImNoYW5nZSIsaC5kZXN0cm95KSxlLnNlc3Npb24ud2lkZ2V0TWFuYWdlci5hZGRMaW5lV2lkZ2V0KGgpLGguZWwub25tb3VzZWRvd249ZS5mb2N1cy5iaW5kKGUpLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcobnVsbCwuNSx7Ym90dG9tOmguZWwub2Zmc2V0SGVpZ2h0fSl9LGkuaW1wb3J0Q3NzU3RyaW5nKCIgICAgLmVycm9yX3dpZGdldF93cmFwcGVyIHsgICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7ICAgICAgICBjb2xvcjogaW5oZXJpdDsgICAgICAgIGJvcmRlcjpub25lICAgIH0gICAgLmVycm9yX3dpZGdldCB7ICAgICAgICBib3JkZXItdG9wOiBzb2xpZCAycHg7ICAgICAgICBib3JkZXItYm90dG9tOiBzb2xpZCAycHg7ICAgICAgICBtYXJnaW46IDVweCAwOyAgICAgICAgcGFkZGluZzogMTBweCA0MHB4OyAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOyAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX2Vycm9yLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9lcnJvcnsgICAgICAgIGJvcmRlci1jb2xvcjogI2ZmNWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX3dhcm5pbmcsIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX3dhcm5pbmd7ICAgICAgICBib3JkZXItY29sb3I6ICNGMUQ4MTcgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9pbmZvLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9pbmZveyAgICAgICAgYm9yZGVyLWNvbG9yOiAjNWE1YTVhICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2Vfb2ssIC5lcnJvcl93aWRnZXRfYXJyb3cuYWNlX29reyAgICAgICAgYm9yZGVyLWNvbG9yOiAjNWFhYTVhICAgIH0gICAgLmVycm9yX3dpZGdldF9hcnJvdyB7ICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7ICAgICAgICBib3JkZXI6IHNvbGlkIDVweDsgICAgICAgIGJvcmRlci10b3AtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQhaW1wb3J0YW50OyAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIHRvcDogLTVweDsgICAgfSIsIiIpfSksYWNlLmRlZmluZSgiYWNlL2FjZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZml4b2xkYnJvd3NlcnMiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvcmFuZ2UiLCJhY2UvZWRpdG9yIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS91bmRvbWFuYWdlciIsImFjZS92aXJ0dWFsX3JlbmRlcmVyIiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsImFjZS9wbGFjZWhvbGRlciIsImFjZS9tdWx0aV9zZWxlY3QiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIsImFjZS90aGVtZS90ZXh0bWF0ZSIsImFjZS9leHQvZXJyb3JfbWFya2VyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZSgiLi9saWIvZml4b2xkYnJvd3NlcnMiKTt2YXIgcj1lKCIuL2xpYi9kb20iKSxpPWUoIi4vbGliL2V2ZW50Iikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1lKCIuL2VkaXRvciIpLkVkaXRvcix1PWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb24sYT1lKCIuL3VuZG9tYW5hZ2VyIikuVW5kb01hbmFnZXIsZj1lKCIuL3ZpcnR1YWxfcmVuZGVyZXIiKS5WaXJ0dWFsUmVuZGVyZXI7ZSgiLi93b3JrZXIvd29ya2VyX2NsaWVudCIpLGUoIi4va2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiksZSgiLi9wbGFjZWhvbGRlciIpLGUoIi4vbXVsdGlfc2VsZWN0IiksZSgiLi9tb2RlL2ZvbGRpbmcvZm9sZF9tb2RlIiksZSgiLi90aGVtZS90ZXh0bWF0ZSIpLGUoIi4vZXh0L2Vycm9yX21hcmtlciIpLHQuY29uZmlnPWUoIi4vY29uZmlnIiksdC5yZXF1aXJlPWUsdHlwZW9mIGRlZmluZT09ImZ1bmN0aW9uIiYmKHQuZGVmaW5lPWRlZmluZSksdC5lZGl0PWZ1bmN0aW9uKGUsbil7aWYodHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgcz1lO2U9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocyk7aWYoIWUpdGhyb3cgbmV3IEVycm9yKCJhY2UuZWRpdCBjYW4ndCBmaW5kIGRpdiAjIitzKX1pZihlJiZlLmVudiYmZS5lbnYuZWRpdG9yIGluc3RhbmNlb2YgbylyZXR1cm4gZS5lbnYuZWRpdG9yO3ZhciB1PSIiO2lmKGUmJi9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZS50YWdOYW1lKSl7dmFyIGE9ZTt1PWEudmFsdWUsZT1yLmNyZWF0ZUVsZW1lbnQoInByZSIpLGEucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQoZSxhKX1lbHNlIGUmJih1PWUudGV4dENvbnRlbnQsZS5pbm5lckhUTUw9IiIpO3ZhciBsPXQuY3JlYXRlRWRpdFNlc3Npb24odSksYz1uZXcgbyhuZXcgZihlKSxsLG4pLGg9e2RvY3VtZW50OmwsZWRpdG9yOmMsb25SZXNpemU6Yy5yZXNpemUuYmluZChjLG51bGwpfTtyZXR1cm4gYSYmKGgudGV4dGFyZWE9YSksaS5hZGRMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsaC5vblJlc2l6ZSksYy5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtpLnJlbW92ZUxpc3RlbmVyKHdpbmRvdywicmVzaXplIixoLm9uUmVzaXplKSxoLmVkaXRvci5jb250YWluZXIuZW52PW51bGx9KSxjLmNvbnRhaW5lci5lbnY9Yy5lbnY9aCxjfSx0LmNyZWF0ZUVkaXRTZXNzaW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IHUoZSx0KTtyZXR1cm4gbi5zZXRVbmRvTWFuYWdlcihuZXcgYSksbn0sdC5SYW5nZT1zLHQuRWRpdG9yPW8sdC5FZGl0U2Vzc2lvbj11LHQuVW5kb01hbmFnZXI9YSx0LlZpcnR1YWxSZW5kZXJlcj1mLHQudmVyc2lvbj10LmNvbmZpZy52ZXJzaW9ufSk7ICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgYWNlLnJlcXVpcmUoWyJhY2UvYWNlIl0sIGZ1bmN0aW9uKGEpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYSkgewogICAgICAgICAgICAgICAgICAgICAgICBhLmNvbmZpZy5pbml0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBhLmRlZmluZSA9IGFjZS5kZWZpbmU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghd2luZG93LmFjZSkKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZSA9IGE7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2Vba2V5XSA9IGFba2V5XTsKICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlWyJkZWZhdWx0Il0gPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiICYmIHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHdpbmRvdy5hY2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKCk7CiAgICB9OwogICAg0LzRg9GA0L7QvC7RgdGC0LDRgNGCLtC/0L7QtNC/0LjRgdCw0YLRjCjQstCy0LXRgdGC0LhBQ0UpOwp9",
+"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UtYnVpbGRzL2Jsb2IvbWFzdGVyL3NyYy1taW4tbm9jb25mbGljdC9hY2UuanMKKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbyhuKXt2YXIgaT1lO24mJihlW25dfHwoZVtuXT17fSksaT1lW25dKTtpZighaS5kZWZpbmV8fCFpLmRlZmluZS5wYWNrYWdlZCl0Lm9yaWdpbmFsPWkuZGVmaW5lLGkuZGVmaW5lPXQsaS5kZWZpbmUucGFja2FnZWQ9ITA7aWYoIWkucmVxdWlyZXx8IWkucmVxdWlyZS5wYWNrYWdlZClyLm9yaWdpbmFsPWkucmVxdWlyZSxpLnJlcXVpcmU9cixpLnJlcXVpcmUucGFja2FnZWQ9ITB9dmFyIEFDRV9OQU1FU1BBQ0UgPSAiYWNlIixlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7IWUmJnR5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiYoZT13aW5kb3cpO2lmKCFBQ0VfTkFNRVNQQUNFJiZ0eXBlb2YgcmVxdWlyZWpzIT0idW5kZWZpbmVkIilyZXR1cm47dmFyIHQ9ZnVuY3Rpb24oZSxuLHIpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil7dC5vcmlnaW5hbD90Lm9yaWdpbmFsLmFwcGx5KHRoaXMsYXJndW1lbnRzKTooY29uc29sZS5lcnJvcigiZHJvcHBpbmcgbW9kdWxlIGJlY2F1c2UgZGVmaW5lIHdhc24ndCBhIHN0cmluZy4iKSxjb25zb2xlLnRyYWNlKCkpO3JldHVybn1hcmd1bWVudHMubGVuZ3RoPT0yJiYocj1uKSx0Lm1vZHVsZXNbZV18fCh0LnBheWxvYWRzW2VdPXIsdC5tb2R1bGVzW2VdPW51bGwpfTt0Lm1vZHVsZXM9e30sdC5wYXlsb2Fkcz17fTt2YXIgbj1mdW5jdGlvbihlLHQsbil7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXt2YXIgaT1zKGUsdCk7aWYoaSE9dW5kZWZpbmVkKXJldHVybiBuJiZuKCksaX1lbHNlIGlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KT09PSJbb2JqZWN0IEFycmF5XSIpe3ZhciBvPVtdO2Zvcih2YXIgdT0wLGE9dC5sZW5ndGg7dTxhOysrdSl7dmFyIGY9cyhlLHRbdV0pO2lmKGY9PXVuZGVmaW5lZCYmci5vcmlnaW5hbClyZXR1cm47by5wdXNoKGYpfXJldHVybiBuJiZuLmFwcGx5KG51bGwsbyl8fCEwfX0scj1mdW5jdGlvbihlLHQpe3ZhciBpPW4oIiIsZSx0KTtyZXR1cm4gaT09dW5kZWZpbmVkJiZyLm9yaWdpbmFsP3Iub3JpZ2luYWwuYXBwbHkodGhpcyxhcmd1bWVudHMpOml9LGk9ZnVuY3Rpb24oZSx0KXtpZih0LmluZGV4T2YoIiEiKSE9PS0xKXt2YXIgbj10LnNwbGl0KCIhIik7cmV0dXJuIGkoZSxuWzBdKSsiISIraShlLG5bMV0pfWlmKHQuY2hhckF0KDApPT0iLiIpe3ZhciByPWUuc3BsaXQoIi8iKS5zbGljZSgwLC0xKS5qb2luKCIvIik7dD1yKyIvIit0O3doaWxlKHQuaW5kZXhPZigiLiIpIT09LTEmJnMhPXQpe3ZhciBzPXQ7dD10LnJlcGxhY2UoL1wvXC5cLy8sIi8iKS5yZXBsYWNlKC9bXlwvXStcL1wuXC5cLy8sIiIpfX1yZXR1cm4gdH0scz1mdW5jdGlvbihlLHIpe3I9aShlLHIpO3ZhciBzPXQubW9kdWxlc1tyXTtpZighcyl7cz10LnBheWxvYWRzW3JdO2lmKHR5cGVvZiBzPT0iZnVuY3Rpb24iKXt2YXIgbz17fSx1PXtpZDpyLHVyaToiIixleHBvcnRzOm8scGFja2FnZWQ6ITB9LGE9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbihyLGUsdCl9LGY9cyhhLG8sdSk7bz1mfHx1LmV4cG9ydHMsdC5tb2R1bGVzW3JdPW8sZGVsZXRlIHQucGF5bG9hZHNbcl19cz10Lm1vZHVsZXNbcl09b3x8c31yZXR1cm4gc307byhBQ0VfTkFNRVNQQUNFKX0pKCksYWNlLmRlZmluZSgiYWNlL2xpYi9yZWdleHAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7cmV0dXJuKGUuZ2xvYmFsPyJnIjoiIikrKGUuaWdub3JlQ2FzZT8iaSI6IiIpKyhlLm11bHRpbGluZT8ibSI6IiIpKyhlLmV4dGVuZGVkPyJ4IjoiIikrKGUuc3RpY2t5PyJ5IjoiIil9ZnVuY3Rpb24gdShlLHQsbil7aWYoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpcmV0dXJuIGUuaW5kZXhPZih0LG4pO2Zvcih2YXIgcj1ufHwwO3I8ZS5sZW5ndGg7cisrKWlmKGVbcl09PT10KXJldHVybiByO3JldHVybi0xfXZhciByPXtleGVjOlJlZ0V4cC5wcm90b3R5cGUuZXhlYyx0ZXN0OlJlZ0V4cC5wcm90b3R5cGUudGVzdCxtYXRjaDpTdHJpbmcucHJvdG90eXBlLm1hdGNoLHJlcGxhY2U6U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlLHNwbGl0OlN0cmluZy5wcm90b3R5cGUuc3BsaXR9LGk9ci5leGVjLmNhbGwoLygpPz8vLCIiKVsxXT09PXVuZGVmaW5lZCxzPWZ1bmN0aW9uKCl7dmFyIGU9L14vZztyZXR1cm4gci50ZXN0LmNhbGwoZSwiIiksIWUubGFzdEluZGV4fSgpO2lmKHMmJmkpcmV0dXJuO1JlZ0V4cC5wcm90b3R5cGUuZXhlYz1mdW5jdGlvbihlKXt2YXIgdD1yLmV4ZWMuYXBwbHkodGhpcyxhcmd1bWVudHMpLG4sYTtpZih0eXBlb2YgZT09InN0cmluZyImJnQpeyFpJiZ0Lmxlbmd0aD4xJiZ1KHQsIiIpPi0xJiYoYT1SZWdFeHAodGhpcy5zb3VyY2Usci5yZXBsYWNlLmNhbGwobyh0aGlzKSwiZyIsIiIpKSxyLnJlcGxhY2UuY2FsbChlLnNsaWNlKHQuaW5kZXgpLGEsZnVuY3Rpb24oKXtmb3IodmFyIGU9MTtlPGFyZ3VtZW50cy5sZW5ndGgtMjtlKyspYXJndW1lbnRzW2VdPT09dW5kZWZpbmVkJiYodFtlXT11bmRlZmluZWQpfSkpO2lmKHRoaXMuX3hyZWdleHAmJnRoaXMuX3hyZWdleHAuY2FwdHVyZU5hbWVzKWZvcih2YXIgZj0xO2Y8dC5sZW5ndGg7ZisrKW49dGhpcy5feHJlZ2V4cC5jYXB0dXJlTmFtZXNbZi0xXSxuJiYodFtuXT10W2ZdKTshcyYmdGhpcy5nbG9iYWwmJiF0WzBdLmxlbmd0aCYmdGhpcy5sYXN0SW5kZXg+dC5pbmRleCYmdGhpcy5sYXN0SW5kZXgtLX1yZXR1cm4gdH0sc3x8KFJlZ0V4cC5wcm90b3R5cGUudGVzdD1mdW5jdGlvbihlKXt2YXIgdD1yLmV4ZWMuY2FsbCh0aGlzLGUpO3JldHVybiB0JiZ0aGlzLmdsb2JhbCYmIXRbMF0ubGVuZ3RoJiZ0aGlzLmxhc3RJbmRleD50LmluZGV4JiZ0aGlzLmxhc3RJbmRleC0tLCEhdH0pfSksYWNlLmRlZmluZSgiYWNlL2xpYi9lczUtc2hpbSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKCl7fWZ1bmN0aW9uIHcoZSl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwic2VudGluZWwiLHt9KSwic2VudGluZWwiaW4gZX1jYXRjaCh0KXt9fWZ1bmN0aW9uIEgoZSl7cmV0dXJuIGU9K2UsZSE9PWU/ZT0wOmUhPT0wJiZlIT09MS8wJiZlIT09LTEvMCYmKGU9KGU+MHx8LTEpKk1hdGguZmxvb3IoTWF0aC5hYnMoZSkpKSxlfWZ1bmN0aW9uIEIoZSl7dmFyIHQ9dHlwZW9mIGU7cmV0dXJuIGU9PT1udWxsfHx0PT09InVuZGVmaW5lZCJ8fHQ9PT0iYm9vbGVhbiJ8fHQ9PT0ibnVtYmVyInx8dD09PSJzdHJpbmcifWZ1bmN0aW9uIGooZSl7dmFyIHQsbixyO2lmKEIoZSkpcmV0dXJuIGU7bj1lLnZhbHVlT2Y7aWYodHlwZW9mIG49PSJmdW5jdGlvbiIpe3Q9bi5jYWxsKGUpO2lmKEIodCkpcmV0dXJuIHR9cj1lLnRvU3RyaW5nO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt0PXIuY2FsbChlKTtpZihCKHQpKXJldHVybiB0fXRocm93IG5ldyBUeXBlRXJyb3J9RnVuY3Rpb24ucHJvdG90eXBlLmJpbmR8fChGdW5jdGlvbi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbih0KXt2YXIgbj10aGlzO2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoIkZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgIituKTt2YXIgaT11LmNhbGwoYXJndW1lbnRzLDEpLHM9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2Ygcyl7dmFyIGU9bi5hcHBseSh0aGlzLGkuY29uY2F0KHUuY2FsbChhcmd1bWVudHMpKSk7cmV0dXJuIE9iamVjdChlKT09PWU/ZTp0aGlzfXJldHVybiBuLmFwcGx5KHQsaS5jb25jYXQodS5jYWxsKGFyZ3VtZW50cykpKX07cmV0dXJuIG4ucHJvdG90eXBlJiYoci5wcm90b3R5cGU9bi5wcm90b3R5cGUscy5wcm90b3R5cGU9bmV3IHIsci5wcm90b3R5cGU9bnVsbCksc30pO3ZhciBpPUZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLHM9QXJyYXkucHJvdG90eXBlLG89T2JqZWN0LnByb3RvdHlwZSx1PXMuc2xpY2UsYT1pLmJpbmQoby50b1N0cmluZyksZj1pLmJpbmQoby5oYXNPd25Qcm9wZXJ0eSksbCxjLGgscCxkO2lmKGQ9ZihvLCJfX2RlZmluZUdldHRlcl9fIikpbD1pLmJpbmQoby5fX2RlZmluZUdldHRlcl9fKSxjPWkuYmluZChvLl9fZGVmaW5lU2V0dGVyX18pLGg9aS5iaW5kKG8uX19sb29rdXBHZXR0ZXJfXykscD1pLmJpbmQoby5fX2xvb2t1cFNldHRlcl9fKTtpZihbMSwyXS5zcGxpY2UoMCkubGVuZ3RoIT0yKWlmKCFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7dmFyIHQ9bmV3IEFycmF5KGUrMik7cmV0dXJuIHRbMF09dFsxXT0wLHR9dmFyIHQ9W10sbjt0LnNwbGljZS5hcHBseSh0LGUoMjApKSx0LnNwbGljZS5hcHBseSh0LGUoMjYpKSxuPXQubGVuZ3RoLHQuc3BsaWNlKDUsMCwiWFhYIiksbisxPT10Lmxlbmd0aDtpZihuKzE9PXQubGVuZ3RoKXJldHVybiEwfSgpKUFycmF5LnByb3RvdHlwZS5zcGxpY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmxlbmd0aDtlPjA/ZT5uJiYoZT1uKTplPT12b2lkIDA/ZT0wOmU8MCYmKGU9TWF0aC5tYXgobitlLDApKSxlK3Q8bnx8KHQ9bi1lKTt2YXIgcj10aGlzLnNsaWNlKGUsZSt0KSxpPXUuY2FsbChhcmd1bWVudHMsMikscz1pLmxlbmd0aDtpZihlPT09bilzJiZ0aGlzLnB1c2guYXBwbHkodGhpcyxpKTtlbHNle3ZhciBvPU1hdGgubWluKHQsbi1lKSxhPWUrbyxmPWErcy1vLGw9bi1hLGM9bi1vO2lmKGY8YSlmb3IodmFyIGg9MDtoPGw7KytoKXRoaXNbZitoXT10aGlzW2EraF07ZWxzZSBpZihmPmEpZm9yKGg9bDtoLS07KXRoaXNbZitoXT10aGlzW2EraF07aWYocyYmZT09PWMpdGhpcy5sZW5ndGg9Yyx0aGlzLnB1c2guYXBwbHkodGhpcyxpKTtlbHNle3RoaXMubGVuZ3RoPWMrcztmb3IoaD0wO2g8czsrK2gpdGhpc1tlK2hdPWlbaF19fXJldHVybiByfTtlbHNle3ZhciB2PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7QXJyYXkucHJvdG90eXBlLnNwbGljZT1mdW5jdGlvbihlLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3YuYXBwbHkodGhpcyxbZT09PXZvaWQgMD8wOmUsdD09PXZvaWQgMD90aGlzLmxlbmd0aC1lOnRdLmNvbmNhdCh1LmNhbGwoYXJndW1lbnRzLDIpKSk6W119fUFycmF5LmlzQXJyYXl8fChBcnJheS5pc0FycmF5PWZ1bmN0aW9uKHQpe3JldHVybiBhKHQpPT0iW29iamVjdCBBcnJheV0ifSk7dmFyIG09T2JqZWN0KCJhIiksZz1tWzBdIT0iYSJ8fCEoMCBpbiBtKTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaHx8KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9YXJndW1lbnRzWzFdLHM9LTEsbz1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yO3doaWxlKCsrczxvKXMgaW4gciYmdC5jYWxsKGkscltzXSxzLG4pfSksQXJyYXkucHJvdG90eXBlLm1hcHx8KEFycmF5LnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjAscz1BcnJheShpKSxvPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciB1PTA7dTxpO3UrKyl1IGluIHImJihzW3VdPXQuY2FsbChvLHJbdV0sdSxuKSk7cmV0dXJuIHN9KSxBcnJheS5wcm90b3R5cGUuZmlsdGVyfHwoQXJyYXkucHJvdG90eXBlLmZpbHRlcj1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPVtdLG8sdT1hcmd1bWVudHNbMV07aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2Zvcih2YXIgZj0wO2Y8aTtmKyspZiBpbiByJiYobz1yW2ZdLHQuY2FsbCh1LG8sZixuKSYmcy5wdXNoKG8pKTtyZXR1cm4gc30pLEFycmF5LnByb3RvdHlwZS5ldmVyeXx8KEFycmF5LnByb3RvdHlwZS5ldmVyeT1mdW5jdGlvbih0KXt2YXIgbj1GKHRoaXMpLHI9ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6bixpPXIubGVuZ3RoPj4+MCxzPWFyZ3VtZW50c1sxXTtpZihhKHQpIT0iW29iamVjdCBGdW5jdGlvbl0iKXRocm93IG5ldyBUeXBlRXJyb3IodCsiIGlzIG5vdCBhIGZ1bmN0aW9uIik7Zm9yKHZhciBvPTA7bzxpO28rKylpZihvIGluIHImJiF0LmNhbGwocyxyW29dLG8sbikpcmV0dXJuITE7cmV0dXJuITB9KSxBcnJheS5wcm90b3R5cGUuc29tZXx8KEFycmF5LnByb3RvdHlwZS5zb21lPWZ1bmN0aW9uKHQpe3ZhciBuPUYodGhpcykscj1nJiZhKHRoaXMpPT0iW29iamVjdCBTdHJpbmddIj90aGlzLnNwbGl0KCIiKTpuLGk9ci5sZW5ndGg+Pj4wLHM9YXJndW1lbnRzWzFdO2lmKGEodCkhPSJbb2JqZWN0IEZ1bmN0aW9uXSIpdGhyb3cgbmV3IFR5cGVFcnJvcih0KyIgaXMgbm90IGEgZnVuY3Rpb24iKTtmb3IodmFyIG89MDtvPGk7bysrKWlmKG8gaW4gciYmdC5jYWxsKHMscltvXSxvLG4pKXJldHVybiEwO3JldHVybiExfSksQXJyYXkucHJvdG90eXBlLnJlZHVjZXx8KEFycmF5LnByb3RvdHlwZS5yZWR1Y2U9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKCFpJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKTt2YXIgcz0wLG87aWYoYXJndW1lbnRzLmxlbmd0aD49MilvPWFyZ3VtZW50c1sxXTtlbHNlIGRve2lmKHMgaW4gcil7bz1yW3MrK107YnJlYWt9aWYoKytzPj1pKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZSBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUiKX13aGlsZSghMCk7Zm9yKDtzPGk7cysrKXMgaW4gciYmKG89dC5jYWxsKHZvaWQgMCxvLHJbc10scyxuKSk7cmV0dXJuIG99KSxBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHR8fChBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQ9ZnVuY3Rpb24odCl7dmFyIG49Rih0aGlzKSxyPWcmJmEodGhpcyk9PSJbb2JqZWN0IFN0cmluZ10iP3RoaXMuc3BsaXQoIiIpOm4saT1yLmxlbmd0aD4+PjA7aWYoYSh0KSE9IltvYmplY3QgRnVuY3Rpb25dIil0aHJvdyBuZXcgVHlwZUVycm9yKHQrIiBpcyBub3QgYSBmdW5jdGlvbiIpO2lmKCFpJiZhcmd1bWVudHMubGVuZ3RoPT0xKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpO3ZhciBzLG89aS0xO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpcz1hcmd1bWVudHNbMV07ZWxzZSBkb3tpZihvIGluIHIpe3M9cltvLS1dO2JyZWFrfWlmKC0tbzwwKXRocm93IG5ldyBUeXBlRXJyb3IoInJlZHVjZVJpZ2h0IG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZSIpfXdoaWxlKCEwKTtkbyBvIGluIHRoaXMmJihzPXQuY2FsbCh2b2lkIDAscyxyW29dLG8sbikpO3doaWxlKG8tLSk7cmV0dXJuIHN9KTtpZighQXJyYXkucHJvdG90eXBlLmluZGV4T2Z8fFswLDFdLmluZGV4T2YoMSwyKSE9LTEpQXJyYXkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7dmFyIG49ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6Rih0aGlzKSxyPW4ubGVuZ3RoPj4+MDtpZighcilyZXR1cm4tMTt2YXIgaT0wO2FyZ3VtZW50cy5sZW5ndGg+MSYmKGk9SChhcmd1bWVudHNbMV0pKSxpPWk+PTA/aTpNYXRoLm1heCgwLHIraSk7Zm9yKDtpPHI7aSsrKWlmKGkgaW4gbiYmbltpXT09PXQpcmV0dXJuIGk7cmV0dXJuLTF9O2lmKCFBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Z8fFswLDFdLmxhc3RJbmRleE9mKDAsLTMpIT0tMSlBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24odCl7dmFyIG49ZyYmYSh0aGlzKT09IltvYmplY3QgU3RyaW5nXSI/dGhpcy5zcGxpdCgiIik6Rih0aGlzKSxyPW4ubGVuZ3RoPj4+MDtpZighcilyZXR1cm4tMTt2YXIgaT1yLTE7YXJndW1lbnRzLmxlbmd0aD4xJiYoaT1NYXRoLm1pbihpLEgoYXJndW1lbnRzWzFdKSkpLGk9aT49MD9pOnItTWF0aC5hYnMoaSk7Zm9yKDtpPj0wO2ktLSlpZihpIGluIG4mJnQ9PT1uW2ldKXJldHVybiBpO3JldHVybi0xfTtPYmplY3QuZ2V0UHJvdG90eXBlT2Z8fChPYmplY3QuZ2V0UHJvdG90eXBlT2Y9ZnVuY3Rpb24odCl7cmV0dXJuIHQuX19wcm90b19ffHwodC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTpvKX0pO2lmKCFPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKXt2YXIgeT0iT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciBjYWxsZWQgb24gYSBub24tb2JqZWN0OiAiO09iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I9ZnVuY3Rpb24odCxuKXtpZih0eXBlb2YgdCE9Im9iamVjdCImJnR5cGVvZiB0IT0iZnVuY3Rpb24ifHx0PT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKHkrdCk7aWYoIWYodCxuKSlyZXR1cm47dmFyIHIsaSxzO3I9e2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfTtpZihkKXt2YXIgdT10Ll9fcHJvdG9fXzt0Ll9fcHJvdG9fXz1vO3ZhciBpPWgodCxuKSxzPXAodCxuKTt0Ll9fcHJvdG9fXz11O2lmKGl8fHMpcmV0dXJuIGkmJihyLmdldD1pKSxzJiYoci5zZXQ9cykscn1yZXR1cm4gci52YWx1ZT10W25dLHJ9fU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzfHwoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpfSk7aWYoIU9iamVjdC5jcmVhdGUpe3ZhciBiO09iamVjdC5wcm90b3R5cGUuX19wcm90b19fPT09bnVsbD9iPWZ1bmN0aW9uKCl7cmV0dXJue19fcHJvdG9fXzpudWxsfX06Yj1mdW5jdGlvbigpe3ZhciBlPXt9O2Zvcih2YXIgdCBpbiBlKWVbdF09bnVsbDtyZXR1cm4gZS5jb25zdHJ1Y3Rvcj1lLmhhc093blByb3BlcnR5PWUucHJvcGVydHlJc0VudW1lcmFibGU9ZS5pc1Byb3RvdHlwZU9mPWUudG9Mb2NhbGVTdHJpbmc9ZS50b1N0cmluZz1lLnZhbHVlT2Y9ZS5fX3Byb3RvX189bnVsbCxlfSxPYmplY3QuY3JlYXRlPWZ1bmN0aW9uKHQsbil7dmFyIHI7aWYodD09PW51bGwpcj1iKCk7ZWxzZXtpZih0eXBlb2YgdCE9Im9iamVjdCIpdGhyb3cgbmV3IFR5cGVFcnJvcigidHlwZW9mIHByb3RvdHlwZVsiK3R5cGVvZiB0KyJdICE9ICdvYmplY3QnIik7dmFyIGk9ZnVuY3Rpb24oKXt9O2kucHJvdG90eXBlPXQscj1uZXcgaSxyLl9fcHJvdG9fXz10fXJldHVybiBuIT09dm9pZCAwJiZPYmplY3QuZGVmaW5lUHJvcGVydGllcyhyLG4pLHJ9fWlmKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSl7dmFyIEU9dyh7fSksUz10eXBlb2YgZG9jdW1lbnQ9PSJ1bmRlZmluZWQifHx3KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtpZighRXx8IVMpdmFyIHg9T2JqZWN0LmRlZmluZVByb3BlcnR5fWlmKCFPYmplY3QuZGVmaW5lUHJvcGVydHl8fHgpe3ZhciBUPSJQcm9wZXJ0eSBkZXNjcmlwdGlvbiBtdXN0IGJlIGFuIG9iamVjdDogIixOPSJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3Q6ICIsQz0iZ2V0dGVycyAmIHNldHRlcnMgY2FuIG5vdCBiZSBkZWZpbmVkIG9uIHRoaXMgamF2YXNjcmlwdCBlbmdpbmUiO09iamVjdC5kZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbih0LG4scil7aWYodHlwZW9mIHQhPSJvYmplY3QiJiZ0eXBlb2YgdCE9ImZ1bmN0aW9uInx8dD09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcihOK3QpO2lmKHR5cGVvZiByIT0ib2JqZWN0IiYmdHlwZW9mIHIhPSJmdW5jdGlvbiJ8fHI9PT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoVCtyKTtpZih4KXRyeXtyZXR1cm4geC5jYWxsKE9iamVjdCx0LG4scil9Y2F0Y2goaSl7fWlmKGYociwidmFsdWUiKSlpZihkJiYoaCh0LG4pfHxwKHQsbikpKXt2YXIgcz10Ll9fcHJvdG9fXzt0Ll9fcHJvdG9fXz1vLGRlbGV0ZSB0W25dLHRbbl09ci52YWx1ZSx0Ll9fcHJvdG9fXz1zfWVsc2UgdFtuXT1yLnZhbHVlO2Vsc2V7aWYoIWQpdGhyb3cgbmV3IFR5cGVFcnJvcihDKTtmKHIsImdldCIpJiZsKHQsbixyLmdldCksZihyLCJzZXQiKSYmYyh0LG4sci5zZXQpfXJldHVybiB0fX1PYmplY3QuZGVmaW5lUHJvcGVydGllc3x8KE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciByIGluIG4pZihuLHIpJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodCxyLG5bcl0pO3JldHVybiB0fSksT2JqZWN0LnNlYWx8fChPYmplY3Quc2VhbD1mdW5jdGlvbih0KXtyZXR1cm4gdH0pLE9iamVjdC5mcmVlemV8fChPYmplY3QuZnJlZXplPWZ1bmN0aW9uKHQpe3JldHVybiB0fSk7dHJ5e09iamVjdC5mcmVlemUoZnVuY3Rpb24oKXt9KX1jYXRjaChrKXtPYmplY3QuZnJlZXplPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bjp0KG4pfX0oT2JqZWN0LmZyZWV6ZSl9T2JqZWN0LnByZXZlbnRFeHRlbnNpb25zfHwoT2JqZWN0LnByZXZlbnRFeHRlbnNpb25zPWZ1bmN0aW9uKHQpe3JldHVybiB0fSksT2JqZWN0LmlzU2VhbGVkfHwoT2JqZWN0LmlzU2VhbGVkPWZ1bmN0aW9uKHQpe3JldHVybiExfSksT2JqZWN0LmlzRnJvemVufHwoT2JqZWN0LmlzRnJvemVuPWZ1bmN0aW9uKHQpe3JldHVybiExfSksT2JqZWN0LmlzRXh0ZW5zaWJsZXx8KE9iamVjdC5pc0V4dGVuc2libGU9ZnVuY3Rpb24odCl7aWYoT2JqZWN0KHQpPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yO3ZhciBuPSIiO3doaWxlKGYodCxuKSluKz0iPyI7dFtuXT0hMDt2YXIgcj1mKHQsbik7cmV0dXJuIGRlbGV0ZSB0W25dLHJ9KTtpZighT2JqZWN0LmtleXMpe3ZhciBMPSEwLEE9WyJ0b1N0cmluZyIsInRvTG9jYWxlU3RyaW5nIiwidmFsdWVPZiIsImhhc093blByb3BlcnR5IiwiaXNQcm90b3R5cGVPZiIsInByb3BlcnR5SXNFbnVtZXJhYmxlIiwiY29uc3RydWN0b3IiXSxPPUEubGVuZ3RoO2Zvcih2YXIgTSBpbnt0b1N0cmluZzpudWxsfSlMPSExO09iamVjdC5rZXlzPWZ1bmN0aW9uIEkoZSl7aWYodHlwZW9mIGUhPSJvYmplY3QiJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uInx8ZT09PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCIpO3ZhciBJPVtdO2Zvcih2YXIgdCBpbiBlKWYoZSx0KSYmSS5wdXNoKHQpO2lmKEwpZm9yKHZhciBuPTAscj1PO248cjtuKyspe3ZhciBpPUFbbl07ZihlLGkpJiZJLnB1c2goaSl9cmV0dXJuIEl9fURhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IERhdGUpLmdldFRpbWUoKX0pO3ZhciBfPSIJXG5ceDBiXGZcciBcdTAwYTBcdTE2ODBcdTE4MGVcdTIwMDBcdTIwMDFcdTIwMDJcdTIwMDNcdTIwMDRcdTIwMDVcdTIwMDZcdTIwMDdcdTIwMDhcdTIwMDlcdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdTIwMjhcdTIwMjlcdWZlZmYiO2lmKCFTdHJpbmcucHJvdG90eXBlLnRyaW18fF8udHJpbSgpKXtfPSJbIitfKyJdIjt2YXIgRD1uZXcgUmVnRXhwKCJeIitfK18rIioiKSxQPW5ldyBSZWdFeHAoXytfKyIqJCIpO1N0cmluZy5wcm90b3R5cGUudHJpbT1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcykucmVwbGFjZShELCIiKS5yZXBsYWNlKFAsIiIpfX12YXIgRj1mdW5jdGlvbihlKXtpZihlPT1udWxsKXRocm93IG5ldyBUeXBlRXJyb3IoImNhbid0IGNvbnZlcnQgIitlKyIgdG8gb2JqZWN0Iik7cmV0dXJuIE9iamVjdChlKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9yZWdleHAiLCJhY2UvbGliL2VzNS1zaGltIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtlKCIuL3JlZ2V4cCIpLGUoIi4vZXM1LXNoaW0iKSx0eXBlb2YgRWxlbWVudCE9InVuZGVmaW5lZCImJiFFbGVtZW50LnByb3RvdHlwZS5yZW1vdmUmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlIix7ZW51bWVyYWJsZTohMSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzKX19KX0pLGFjZS5kZWZpbmUoImFjZS9saWIvdXNlcmFnZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0Lk9TPXtMSU5VWDoiTElOVVgiLE1BQzoiTUFDIixXSU5ET1dTOiJXSU5ET1dTIn0sdC5nZXRPUz1mdW5jdGlvbigpe3JldHVybiB0LmlzTWFjP3QuT1MuTUFDOnQuaXNMaW51eD90Lk9TLkxJTlVYOnQuT1MuV0lORE9XU307dmFyIHI9dHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCI/bmF2aWdhdG9yOnt9LGk9KC9tYWN8d2lufGxpbnV4L2kuZXhlYyhyLnBsYXRmb3JtKXx8WyJvdGhlciJdKVswXS50b0xvd2VyQ2FzZSgpLHM9ci51c2VyQWdlbnR8fCIiLG89ci5hcHBOYW1lfHwiIjt0LmlzV2luPWk9PSJ3aW4iLHQuaXNNYWM9aT09Im1hYyIsdC5pc0xpbnV4PWk9PSJsaW51eCIsdC5pc0lFPW89PSJNaWNyb3NvZnQgSW50ZXJuZXQgRXhwbG9yZXIifHxvLmluZGV4T2YoIk1TQXBwSG9zdCIpPj0wP3BhcnNlRmxvYXQoKHMubWF0Y2goLyg/Ok1TSUUgfFRyaWRlbnRcL1swLTldK1tcLjAtOV0rOy4qcnY6KShbMC05XStbXC4wLTldKykvKXx8W10pWzFdKTpwYXJzZUZsb2F0KChzLm1hdGNoKC8oPzpUcmlkZW50XC9bMC05XStbXC4wLTldKzsuKnJ2OikoWzAtOV0rW1wuMC05XSspLyl8fFtdKVsxXSksdC5pc09sZElFPXQuaXNJRSYmdC5pc0lFPDksdC5pc0dlY2tvPXQuaXNNb3ppbGxhPXMubWF0Y2goLyBHZWNrb1wvXGQrLyksdC5pc09wZXJhPXR5cGVvZiBvcGVyYT09Im9iamVjdCImJk9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh3aW5kb3cub3BlcmEpPT0iW29iamVjdCBPcGVyYV0iLHQuaXNXZWJLaXQ9cGFyc2VGbG9hdChzLnNwbGl0KCJXZWJLaXQvIilbMV0pfHx1bmRlZmluZWQsdC5pc0Nocm9tZT1wYXJzZUZsb2F0KHMuc3BsaXQoIiBDaHJvbWUvIilbMV0pfHx1bmRlZmluZWQsdC5pc0VkZ2U9cGFyc2VGbG9hdChzLnNwbGl0KCIgRWRnZS8iKVsxXSl8fHVuZGVmaW5lZCx0LmlzQUlSPXMuaW5kZXhPZigiQWRvYmVBSVIiKT49MCx0LmlzQW5kcm9pZD1zLmluZGV4T2YoIkFuZHJvaWQiKT49MCx0LmlzQ2hyb21lT1M9cy5pbmRleE9mKCIgQ3JPUyAiKT49MCx0LmlzSU9TPS9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KHMpJiYhd2luZG93Lk1TU3RyZWFtLHQuaXNJT1MmJih0LmlzTWFjPSEwKSx0LmlzTW9iaWxlPXQuaXNJT1N8fHQuaXNBbmRyb2lkfSksYWNlLmRlZmluZSgiYWNlL2xpYi9kb20iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi91c2VyYWdlbnQiKSxpPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjt0LmJ1aWxkRG9tPWZ1bmN0aW9uIG8oZSx0LG4pe2lmKHR5cGVvZiBlPT0ic3RyaW5nIiYmZSl7dmFyIHI9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSk7cmV0dXJuIHQmJnQuYXBwZW5kQ2hpbGQocikscn1pZighQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZTtpZih0eXBlb2YgZVswXSE9InN0cmluZyJ8fCFlWzBdKXt2YXIgaT1bXTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHU9byhlW3NdLHQsbik7dSYmaS5wdXNoKHUpfXJldHVybiBpfXZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZVswXSksZj1lWzFdLGw9MTtmJiZ0eXBlb2YgZj09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGYpJiYobD0yKTtmb3IodmFyIHM9bDtzPGUubGVuZ3RoO3MrKylvKGVbc10sYSxuKTtyZXR1cm4gbD09MiYmT2JqZWN0LmtleXMoZikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1mW2VdO2U9PT0iY2xhc3MiP2EuY2xhc3NOYW1lPUFycmF5LmlzQXJyYXkodCk/dC5qb2luKCIgIik6dDp0eXBlb2YgdD09ImZ1bmN0aW9uInx8ZT09InZhbHVlIj9hW2VdPXQ6ZT09PSJyZWYiP24mJihuW3RdPWEpOnQhPW51bGwmJmEuc2V0QXR0cmlidXRlKGUsdCl9KSx0JiZ0LmFwcGVuZENoaWxkKGEpLGF9LHQuZ2V0RG9jdW1lbnRIZWFkPWZ1bmN0aW9uKGUpe3JldHVybiBlfHwoZT1kb2N1bWVudCksZS5oZWFkfHxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF18fGUuZG9jdW1lbnRFbGVtZW50fSx0LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TP2RvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0fHxpLGUpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSl9LHQucmVtb3ZlQ2hpbGRyZW49ZnVuY3Rpb24oZSl7ZS5pbm5lckhUTUw9IiJ9LHQuY3JlYXRlVGV4dE5vZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10P3Qub3duZXJEb2N1bWVudDpkb2N1bWVudDtyZXR1cm4gbi5jcmVhdGVUZXh0Tm9kZShlKX0sdC5jcmVhdGVGcmFnbWVudD1mdW5jdGlvbihlKXt2YXIgdD1lP2Uub3duZXJEb2N1bWVudDpkb2N1bWVudDtyZXR1cm4gdC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCl9LHQuaGFzQ3NzQ2xhc3M9ZnVuY3Rpb24oZSx0KXt2YXIgbj0oZS5jbGFzc05hbWUrIiIpLnNwbGl0KC9ccysvZyk7cmV0dXJuIG4uaW5kZXhPZih0KSE9PS0xfSx0LmFkZENzc0NsYXNzPWZ1bmN0aW9uKGUsbil7dC5oYXNDc3NDbGFzcyhlLG4pfHwoZS5jbGFzc05hbWUrPSIgIituKX0sdC5yZW1vdmVDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuY2xhc3NOYW1lLnNwbGl0KC9ccysvZyk7Zm9yKDs7KXt2YXIgcj1uLmluZGV4T2YodCk7aWYocj09LTEpYnJlYWs7bi5zcGxpY2UociwxKX1lLmNsYXNzTmFtZT1uLmpvaW4oIiAiKX0sdC50b2dnbGVDc3NDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuY2xhc3NOYW1lLnNwbGl0KC9ccysvZykscj0hMDtmb3IoOzspe3ZhciBpPW4uaW5kZXhPZih0KTtpZihpPT0tMSlicmVhaztyPSExLG4uc3BsaWNlKGksMSl9cmV0dXJuIHImJm4ucHVzaCh0KSxlLmNsYXNzTmFtZT1uLmpvaW4oIiAiKSxyfSx0LnNldENzc0NsYXNzPWZ1bmN0aW9uKGUsbixyKXtyP3QuYWRkQ3NzQ2xhc3MoZSxuKTp0LnJlbW92ZUNzc0NsYXNzKGUsbil9LHQuaGFzQ3NzU3RyaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyO3Q9dHx8ZG9jdW1lbnQ7aWYocj10LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIikpd2hpbGUobjxyLmxlbmd0aClpZihyW24rK10uaWQ9PT1lKXJldHVybiEwfSx0LmltcG9ydENzc1N0cmluZz1mdW5jdGlvbihuLHIsaSl7dmFyIHM9aTtpZighaXx8IWkuZ2V0Um9vdE5vZGUpcz1kb2N1bWVudDtlbHNle3M9aS5nZXRSb290Tm9kZSgpO2lmKCFzfHxzPT1pKXM9ZG9jdW1lbnR9dmFyIG89cy5vd25lckRvY3VtZW50fHxzO2lmKHImJnQuaGFzQ3NzU3RyaW5nKHIscykpcmV0dXJuIG51bGw7ciYmKG4rPSJcbi8qIyBzb3VyY2VVUkw9YWNlL2Nzcy8iK3IrIiAqLyIpO3ZhciB1PXQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTt1LmFwcGVuZENoaWxkKG8uY3JlYXRlVGV4dE5vZGUobikpLHImJih1LmlkPXIpLHM9PW8mJihzPXQuZ2V0RG9jdW1lbnRIZWFkKG8pKSxzLmluc2VydEJlZm9yZSh1LHMuZmlyc3RDaGlsZCl9LHQuaW1wb3J0Q3NzU3R5bHNoZWV0PWZ1bmN0aW9uKGUsbil7dC5idWlsZERvbShbImxpbmsiLHtyZWw6InN0eWxlc2hlZXQiLGhyZWY6ZX1dLHQuZ2V0RG9jdW1lbnRIZWFkKG4pKX0sdC5zY3JvbGxiYXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgbj10LmNyZWF0ZUVsZW1lbnQoImFjZV9pbm5lciIpO24uc3R5bGUud2lkdGg9IjEwMCUiLG4uc3R5bGUubWluV2lkdGg9IjBweCIsbi5zdHlsZS5oZWlnaHQ9IjIwMHB4IixuLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt2YXIgcj10LmNyZWF0ZUVsZW1lbnQoImFjZV9vdXRlciIpLGk9ci5zdHlsZTtpLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaS5sZWZ0PSItMTAwMDBweCIsaS5vdmVyZmxvdz0iaGlkZGVuIixpLndpZHRoPSIyMDBweCIsaS5taW5XaWR0aD0iMHB4IixpLmhlaWdodD0iMTUwcHgiLGkuZGlzcGxheT0iYmxvY2siLHIuYXBwZW5kQ2hpbGQobik7dmFyIHM9ZS5kb2N1bWVudEVsZW1lbnQ7cy5hcHBlbmRDaGlsZChyKTt2YXIgbz1uLm9mZnNldFdpZHRoO2kub3ZlcmZsb3c9InNjcm9sbCI7dmFyIHU9bi5vZmZzZXRXaWR0aDtyZXR1cm4gbz09dSYmKHU9ci5jbGllbnRXaWR0aCkscy5yZW1vdmVDaGlsZChyKSxvLXV9LHR5cGVvZiBkb2N1bWVudD09InVuZGVmaW5lZCImJih0LmltcG9ydENzc1N0cmluZz1mdW5jdGlvbigpe30pLHQuY29tcHV0ZWRTdHlsZT1mdW5jdGlvbihlLHQpe3JldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlLCIiKXx8e319LHQuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0LG4pe2VbdF0hPT1uJiYoZVt0XT1uKX0sdC5IQVNfQ1NTX0FOSU1BVElPTj0hMSx0LkhBU19DU1NfVFJBTlNGT1JNUz0hMSx0LkhJX0RQST1yLmlzV2luP3R5cGVvZiB3aW5kb3chPSJ1bmRlZmluZWQiJiZ3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz49MS41OiEwO2lmKHR5cGVvZiBkb2N1bWVudCE9InVuZGVmaW5lZCIpe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3QuSElfRFBJJiZzLnN0eWxlLnRyYW5zZm9ybSE9PXVuZGVmaW5lZCYmKHQuSEFTX0NTU19UUkFOU0ZPUk1TPSEwKSwhci5pc0VkZ2UmJnR5cGVvZiBzLnN0eWxlLmFuaW1hdGlvbk5hbWUhPSJ1bmRlZmluZWQiJiYodC5IQVNfQ1NTX0FOSU1BVElPTj0hMCkscz1udWxsfXQuSEFTX0NTU19UUkFOU0ZPUk1TP3QudHJhbnNsYXRlPWZ1bmN0aW9uKGUsdCxuKXtlLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlKCIrTWF0aC5yb3VuZCh0KSsicHgsICIrTWF0aC5yb3VuZChuKSsicHgpIn06dC50cmFuc2xhdGU9ZnVuY3Rpb24oZSx0LG4pe2Uuc3R5bGUudG9wPU1hdGgucm91bmQobikrInB4IixlLnN0eWxlLmxlZnQ9TWF0aC5yb3VuZCh0KSsicHgifX0pLGFjZS5kZWZpbmUoImFjZS9saWIvb29wIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt0LmluaGVyaXRzPWZ1bmN0aW9uKGUsdCl7ZS5zdXBlcl89dCxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KX0sdC5taXhpbj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX0sdC5pbXBsZW1lbnQ9ZnVuY3Rpb24oZSxuKXt0Lm1peGluKGUsbil9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9rZXlzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vb29wIiksaT1mdW5jdGlvbigpe3ZhciBlPXtNT0RJRklFUl9LRVlTOnsxNjoiU2hpZnQiLDE3OiJDdHJsIiwxODoiQWx0IiwyMjQ6Ik1ldGEiLDkxOiJNZXRhTGVmdCIsOTI6Ik1ldGFSaWdodCIsOTM6IkNvbnRleHRNZW51In0sS0VZX01PRFM6e2N0cmw6MSxhbHQ6MixvcHRpb246MixzaGlmdDo0LCJzdXBlciI6OCxtZXRhOjgsY29tbWFuZDo4LGNtZDo4fSxGVU5DVElPTl9LRVlTOns4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTM6IlJldHVybiIsMTk6IlBhdXNlIiwyNzoiRXNjIiwzMjoiU3BhY2UiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJMZWZ0IiwzODoiVXAiLDM5OiJSaWdodCIsNDA6IkRvd24iLDQ0OiJQcmludCIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsOTY6Ik51bXBhZDAiLDk3OiJOdW1wYWQxIiw5ODoiTnVtcGFkMiIsOTk6Ik51bXBhZDMiLDEwMDoiTnVtcGFkNCIsMTAxOiJOdW1wYWQ1IiwxMDI6Ik51bXBhZDYiLDEwMzoiTnVtcGFkNyIsMTA0OiJOdW1wYWQ4IiwxMDU6Ik51bXBhZDkiLCItMTMiOiJOdW1wYWRFbnRlciIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1sb2NrIiwxNDU6IlNjcm9sbGxvY2sifSxQUklOVEFCTEVfS0VZUzp7MzI6IiAiLDQ4OiIwIiw0OToiMSIsNTA6IjIiLDUxOiIzIiw1MjoiNCIsNTM6IjUiLDU0OiI2Iiw1NToiNyIsNTY6IjgiLDU3OiI5Iiw1OToiOyIsNjE6Ij0iLDY1OiJhIiw2NjoiYiIsNjc6ImMiLDY4OiJkIiw2OToiZSIsNzA6ImYiLDcxOiJnIiw3MjoiaCIsNzM6ImkiLDc0OiJqIiw3NToiayIsNzY6ImwiLDc3OiJtIiw3ODoibiIsNzk6Im8iLDgwOiJwIiw4MToicSIsODI6InIiLDgzOiJzIiw4NDoidCIsODU6InUiLDg2OiJ2Iiw4NzoidyIsODg6IngiLDg5OiJ5Iiw5MDoieiIsMTA3OiIrIiwxMDk6Ii0iLDExMDoiLiIsMTg2OiI7IiwxODc6Ij0iLDE4ODoiLCIsMTg5OiItIiwxOTA6Ii4iLDE5MToiLyIsMTkyOiJgIiwyMTk6IlsiLDIyMDoiXFwiLDIyMToiXSIsMjIyOiInIiwxMTE6Ii8iLDEwNjoiKiJ9fSx0LG47Zm9yKG4gaW4gZS5GVU5DVElPTl9LRVlTKXQ9ZS5GVU5DVElPTl9LRVlTW25dLnRvTG93ZXJDYXNlKCksZVt0XT1wYXJzZUludChuLDEwKTtmb3IobiBpbiBlLlBSSU5UQUJMRV9LRVlTKXQ9ZS5QUklOVEFCTEVfS0VZU1tuXS50b0xvd2VyQ2FzZSgpLGVbdF09cGFyc2VJbnQobiwxMCk7cmV0dXJuIHIubWl4aW4oZSxlLk1PRElGSUVSX0tFWVMpLHIubWl4aW4oZSxlLlBSSU5UQUJMRV9LRVlTKSxyLm1peGluKGUsZS5GVU5DVElPTl9LRVlTKSxlLmVudGVyPWVbInJldHVybiJdLGUuZXNjYXBlPWUuZXNjLGUuZGVsPWVbImRlbGV0ZSJdLGVbMTczXT0iLSIsZnVuY3Rpb24oKXt2YXIgdD1bImNtZCIsImN0cmwiLCJhbHQiLCJzaGlmdCJdO2Zvcih2YXIgbj1NYXRoLnBvdygyLHQubGVuZ3RoKTtuLS07KWUuS0VZX01PRFNbbl09dC5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG4mZS5LRVlfTU9EU1t0XX0pLmpvaW4oIi0iKSsiLSJ9KCksZS5LRVlfTU9EU1swXT0iIixlLktFWV9NT0RTWy0xXT0iaW5wdXQtIixlfSgpO3IubWl4aW4odCxpKSx0LmtleUNvZGVUb1N0cmluZz1mdW5jdGlvbihlKXt2YXIgdD1pW2VdO3JldHVybiB0eXBlb2YgdCE9InN0cmluZyImJih0PVN0cmluZy5mcm9tQ2hhckNvZGUoZSkpLHQudG9Mb3dlckNhc2UoKX19KSxhY2UuZGVmaW5lKCJhY2UvbGliL2V2ZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9rZXlzIiwiYWNlL2xpYi91c2VyYWdlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoZSx0LG4pe3ZhciBhPXUodCk7aWYoIWkuaXNNYWMmJnMpe3QuZ2V0TW9kaWZpZXJTdGF0ZSYmKHQuZ2V0TW9kaWZpZXJTdGF0ZSgiT1MiKXx8dC5nZXRNb2RpZmllclN0YXRlKCJXaW4iKSkmJihhfD04KTtpZihzLmFsdEdyKXtpZigoMyZhKT09MylyZXR1cm47cy5hbHRHcj0wfWlmKG49PT0xOHx8bj09PTE3KXt2YXIgZj0ibG9jYXRpb24iaW4gdD90LmxvY2F0aW9uOnQua2V5TG9jYXRpb247aWYobj09PTE3JiZmPT09MSlzW25dPT0xJiYobz10LnRpbWVTdGFtcCk7ZWxzZSBpZihuPT09MTgmJmE9PT0zJiZmPT09Mil7dmFyIGw9dC50aW1lU3RhbXAtbztsPDUwJiYocy5hbHRHcj0hMCl9fX1uIGluIHIuTU9ESUZJRVJfS0VZUyYmKG49LTEpO2lmKCFhJiZuPT09MTMpe3ZhciBmPSJsb2NhdGlvbiJpbiB0P3QubG9jYXRpb246dC5rZXlMb2NhdGlvbjtpZihmPT09Myl7ZSh0LGEsLW4pO2lmKHQuZGVmYXVsdFByZXZlbnRlZClyZXR1cm59fWlmKGkuaXNDaHJvbWVPUyYmYSY4KXtlKHQsYSxuKTtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2EmPS05fXJldHVybiEhYXx8biBpbiByLkZVTkNUSU9OX0tFWVN8fG4gaW4gci5QUklOVEFCTEVfS0VZUz9lKHQsYSxuKTohMX1mdW5jdGlvbiBmKCl7cz1PYmplY3QuY3JlYXRlKG51bGwpfXZhciByPWUoIi4va2V5cyIpLGk9ZSgiLi91c2VyYWdlbnQiKSxzPW51bGwsbz0wO3QuYWRkTGlzdGVuZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuYWRkRXZlbnRMaXN0ZW5lcilyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMSk7aWYoZS5hdHRhY2hFdmVudCl7dmFyIHI9ZnVuY3Rpb24oKXtuLmNhbGwoZSx3aW5kb3cuZXZlbnQpfTtuLl93cmFwcGVyPXIsZS5hdHRhY2hFdmVudCgib24iK3Qscil9fSx0LnJlbW92ZUxpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXtpZihlLnJlbW92ZUV2ZW50TGlzdGVuZXIpcmV0dXJuIGUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpO2UuZGV0YWNoRXZlbnQmJmUuZGV0YWNoRXZlbnQoIm9uIit0LG4uX3dyYXBwZXJ8fG4pfSx0LnN0b3BFdmVudD1mdW5jdGlvbihlKXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oZSksdC5wcmV2ZW50RGVmYXVsdChlKSwhMX0sdC5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24/ZS5zdG9wUHJvcGFnYXRpb24oKTplLmNhbmNlbEJ1YmJsZT0hMH0sdC5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0P2UucHJldmVudERlZmF1bHQoKTplLnJldHVyblZhbHVlPSExfSx0LmdldEJ1dHRvbj1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT0iZGJsY2xpY2siPzA6ZS50eXBlPT0iY29udGV4dG1lbnUifHxpLmlzTWFjJiZlLmN0cmxLZXkmJiFlLmFsdEtleSYmIWUuc2hpZnRLZXk/MjplLnByZXZlbnREZWZhdWx0P2UuYnV0dG9uOnsxOjAsMjoyLDQ6MX1bZS5idXR0b25dfSx0LmNhcHR1cmU9ZnVuY3Rpb24oZSxuLHIpe2Z1bmN0aW9uIGkoZSl7biYmbihlKSxyJiZyKGUpLHQucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsbiwhMCksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwibW91c2V1cCIsaSwhMCksdC5yZW1vdmVMaXN0ZW5lcihkb2N1bWVudCwiZHJhZ3N0YXJ0IixpLCEwKX1yZXR1cm4gdC5hZGRMaXN0ZW5lcihkb2N1bWVudCwibW91c2Vtb3ZlIixuLCEwKSx0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJtb3VzZXVwIixpLCEwKSx0LmFkZExpc3RlbmVyKGRvY3VtZW50LCJkcmFnc3RhcnQiLGksITApLGl9LHQuYWRkTW91c2VXaGVlbExpc3RlbmVyPWZ1bmN0aW9uKGUsbil7Im9ubW91c2V3aGVlbCJpbiBlP3QuYWRkTGlzdGVuZXIoZSwibW91c2V3aGVlbCIsZnVuY3Rpb24oZSl7dmFyIHQ9ODtlLndoZWVsRGVsdGFYIT09dW5kZWZpbmVkPyhlLndoZWVsWD0tZS53aGVlbERlbHRhWC90LGUud2hlZWxZPS1lLndoZWVsRGVsdGFZL3QpOihlLndoZWVsWD0wLGUud2hlZWxZPS1lLndoZWVsRGVsdGEvdCksbihlKX0pOiJvbndoZWVsImluIGU/dC5hZGRMaXN0ZW5lcihlLCJ3aGVlbCIsZnVuY3Rpb24oZSl7dmFyIHQ9LjM1O3N3aXRjaChlLmRlbHRhTW9kZSl7Y2FzZSBlLkRPTV9ERUxUQV9QSVhFTDplLndoZWVsWD1lLmRlbHRhWCp0fHwwLGUud2hlZWxZPWUuZGVsdGFZKnR8fDA7YnJlYWs7Y2FzZSBlLkRPTV9ERUxUQV9MSU5FOmNhc2UgZS5ET01fREVMVEFfUEFHRTplLndoZWVsWD0oZS5kZWx0YVh8fDApKjUsZS53aGVlbFk9KGUuZGVsdGFZfHwwKSo1fW4oZSl9KTp0LmFkZExpc3RlbmVyKGUsIkRPTU1vdXNlU2Nyb2xsIixmdW5jdGlvbihlKXtlLmF4aXMmJmUuYXhpcz09ZS5IT1JJWk9OVEFMX0FYSVM/KGUud2hlZWxYPShlLmRldGFpbHx8MCkqNSxlLndoZWVsWT0wKTooZS53aGVlbFg9MCxlLndoZWVsWT0oZS5kZXRhaWx8fDApKjUpLG4oZSl9KX0sdC5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyPWZ1bmN0aW9uKGUsbixyLHMpe2Z1bmN0aW9uIGMoZSl7dC5nZXRCdXR0b24oZSkhPT0wP289MDplLmRldGFpbD4xPyhvKyssbz40JiYobz0xKSk6bz0xO2lmKGkuaXNJRSl7dmFyIGM9TWF0aC5hYnMoZS5jbGllbnRYLXUpPjV8fE1hdGguYWJzKGUuY2xpZW50WS1hKT41O2lmKCFmfHxjKW89MTtmJiZjbGVhclRpbWVvdXQoZiksZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsfSxuW28tMV18fDYwMCksbz09MSYmKHU9ZS5jbGllbnRYLGE9ZS5jbGllbnRZKX1lLl9jbGlja3M9byxyW3NdKCJtb3VzZWRvd24iLGUpO2lmKG8+NClvPTA7ZWxzZSBpZihvPjEpcmV0dXJuIHJbc10obFtvXSxlKX1mdW5jdGlvbiBoKGUpe289MixmJiZjbGVhclRpbWVvdXQoZiksZj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Zj1udWxsfSxuW28tMV18fDYwMCkscltzXSgibW91c2Vkb3duIixlKSxyW3NdKGxbb10sZSl9dmFyIG89MCx1LGEsZixsPXsyOiJkYmxjbGljayIsMzoidHJpcGxlY2xpY2siLDQ6InF1YWRjbGljayJ9O0FycmF5LmlzQXJyYXkoZSl8fChlPVtlXSksZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuYWRkTGlzdGVuZXIoZSwibW91c2Vkb3duIixjKSxpLmlzT2xkSUUmJnQuYWRkTGlzdGVuZXIoZSwiZGJsY2xpY2siLGgpfSl9O3ZhciB1PSFpLmlzTWFjfHwhaS5pc09wZXJhfHwiS2V5Ym9hcmRFdmVudCJpbiB3aW5kb3c/ZnVuY3Rpb24oZSl7cmV0dXJuIDB8KGUuY3RybEtleT8xOjApfChlLmFsdEtleT8yOjApfChlLnNoaWZ0S2V5PzQ6MCl8KGUubWV0YUtleT84OjApfTpmdW5jdGlvbihlKXtyZXR1cm4gMHwoZS5tZXRhS2V5PzE6MCl8KGUuYWx0S2V5PzI6MCl8KGUuc2hpZnRLZXk/NDowKXwoZS5jdHJsS2V5Pzg6MCl9O3QuZ2V0TW9kaWZpZXJTdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuS0VZX01PRFNbdShlKV19LHQuYWRkQ29tbWFuZEtleUxpc3RlbmVyPWZ1bmN0aW9uKGUsbil7dmFyIHI9dC5hZGRMaXN0ZW5lcjtpZihpLmlzT2xkR2Vja298fGkuaXNPcGVyYSYmISgiS2V5Ym9hcmRFdmVudCJpbiB3aW5kb3cpKXt2YXIgbz1udWxsO3IoZSwia2V5ZG93biIsZnVuY3Rpb24oZSl7bz1lLmtleUNvZGV9KSxyKGUsImtleXByZXNzIixmdW5jdGlvbihlKXtyZXR1cm4gYShuLGUsbyl9KX1lbHNle3ZhciB1PW51bGw7cihlLCJrZXlkb3duIixmdW5jdGlvbihlKXtzW2Uua2V5Q29kZV09KHNbZS5rZXlDb2RlXXx8MCkrMTt2YXIgdD1hKG4sZSxlLmtleUNvZGUpO3JldHVybiB1PWUuZGVmYXVsdFByZXZlbnRlZCx0fSkscihlLCJrZXlwcmVzcyIsZnVuY3Rpb24oZSl7dSYmKGUuY3RybEtleXx8ZS5hbHRLZXl8fGUuc2hpZnRLZXl8fGUubWV0YUtleSkmJih0LnN0b3BFdmVudChlKSx1PW51bGwpfSkscihlLCJrZXl1cCIsZnVuY3Rpb24oZSl7c1tlLmtleUNvZGVdPW51bGx9KSxzfHwoZigpLHIod2luZG93LCJmb2N1cyIsZikpfX07aWYodHlwZW9mIHdpbmRvdz09Im9iamVjdCImJndpbmRvdy5wb3N0TWVzc2FnZSYmIWkuaXNPbGRJRSl7dmFyIGw9MTt0Lm5leHRUaWNrPWZ1bmN0aW9uKGUsbil7bj1ufHx3aW5kb3c7dmFyIHI9Inplcm8tdGltZW91dC1tZXNzYWdlLSIrbCsrLGk9ZnVuY3Rpb24ocyl7cy5kYXRhPT1yJiYodC5zdG9wUHJvcGFnYXRpb24ocyksdC5yZW1vdmVMaXN0ZW5lcihuLCJtZXNzYWdlIixpKSxlKCkpfTt0LmFkZExpc3RlbmVyKG4sIm1lc3NhZ2UiLGkpLG4ucG9zdE1lc3NhZ2UociwiKiIpfX10LiRpZGxlQmxvY2tlZD0hMSx0Lm9uSWRsZT1mdW5jdGlvbihlLG4pe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uIHIoKXt0LiRpZGxlQmxvY2tlZD9zZXRUaW1lb3V0KHIsMTAwKTplKCl9LG4pfSx0LiRpZGxlQmxvY2tJZD1udWxsLHQuYmxvY2tJZGxlPWZ1bmN0aW9uKGUpe3QuJGlkbGVCbG9ja0lkJiZjbGVhclRpbWVvdXQodC4kaWRsZUJsb2NrSWQpLHQuJGlkbGVCbG9ja2VkPSEwLHQuJGlkbGVCbG9ja0lkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiRpZGxlQmxvY2tlZD0hMX0sZXx8MTAwKX0sdC5uZXh0RnJhbWU9dHlwZW9mIHdpbmRvdz09Im9iamVjdCImJih3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lfHx3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5vUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSx0Lm5leHRGcmFtZT90Lm5leHRGcmFtZT10Lm5leHRGcmFtZS5iaW5kKHdpbmRvdyk6dC5uZXh0RnJhbWU9ZnVuY3Rpb24oZSl7c2V0VGltZW91dChlLDE3KX19KSxhY2UuZGVmaW5lKCJhY2UvcmFuZ2UiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUucm93LXQucm93fHxlLmNvbHVtbi10LmNvbHVtbn0saT1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnN0YXJ0PXtyb3c6ZSxjb2x1bW46dH0sdGhpcy5lbmQ9e3JvdzpuLGNvbHVtbjpyfX07KGZ1bmN0aW9uKCl7dGhpcy5pc0VxdWFsPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09PWUuc3RhcnQucm93JiZ0aGlzLmVuZC5yb3c9PT1lLmVuZC5yb3cmJnRoaXMuc3RhcnQuY29sdW1uPT09ZS5zdGFydC5jb2x1bW4mJnRoaXMuZW5kLmNvbHVtbj09PWUuZW5kLmNvbHVtbn0sdGhpcy50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJSYW5nZTogWyIrdGhpcy5zdGFydC5yb3crIi8iK3RoaXMuc3RhcnQuY29sdW1uKyJdIC0+IFsiK3RoaXMuZW5kLnJvdysiLyIrdGhpcy5lbmQuY29sdW1uKyJdIn0sdGhpcy5jb250YWlucz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MH0sdGhpcy5jb21wYXJlUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmVuZCxyPWUuc3RhcnQ7cmV0dXJuIHQ9dGhpcy5jb21wYXJlKG4ucm93LG4uY29sdW1uKSx0PT0xPyh0PXRoaXMuY29tcGFyZShyLnJvdyxyLmNvbHVtbiksdD09MT8yOnQ9PTA/MTowKTp0PT0tMT8tMjoodD10aGlzLmNvbXBhcmUoci5yb3csci5jb2x1bW4pLHQ9PS0xPy0xOnQ9PTE/NDI6MCl9LHRoaXMuY29tcGFyZVBvaW50PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbXBhcmUoZS5yb3csZS5jb2x1bW4pfSx0aGlzLmNvbnRhaW5zUmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KGUuc3RhcnQpPT0wJiZ0aGlzLmNvbXBhcmVQb2ludChlLmVuZCk9PTB9LHRoaXMuaW50ZXJzZWN0cz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbXBhcmVSYW5nZShlKTtyZXR1cm4gdD09LTF8fHQ9PTB8fHQ9PTF9LHRoaXMuaXNFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXR9LHRoaXMuaXNTdGFydD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnN0YXJ0LnJvdz09ZSYmdGhpcy5zdGFydC5jb2x1bW49PXR9LHRoaXMuc2V0U3RhcnQ9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im9iamVjdCI/KHRoaXMuc3RhcnQuY29sdW1uPWUuY29sdW1uLHRoaXMuc3RhcnQucm93PWUucm93KToodGhpcy5zdGFydC5yb3c9ZSx0aGlzLnN0YXJ0LmNvbHVtbj10KX0sdGhpcy5zZXRFbmQ9ZnVuY3Rpb24oZSx0KXt0eXBlb2YgZT09Im9iamVjdCI/KHRoaXMuZW5kLmNvbHVtbj1lLmNvbHVtbix0aGlzLmVuZC5yb3c9ZS5yb3cpOih0aGlzLmVuZC5yb3c9ZSx0aGlzLmVuZC5jb2x1bW49dCl9LHRoaXMuaW5zaWRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuY29tcGFyZShlLHQpPT0wP3RoaXMuaXNFbmQoZSx0KXx8dGhpcy5pc1N0YXJ0KGUsdCk/ITE6ITA6ITF9LHRoaXMuaW5zaWRlU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21wYXJlKGUsdCk9PTA/dGhpcy5pc0VuZChlLHQpPyExOiEwOiExfSx0aGlzLmluc2lkZUVuZD1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmNvbXBhcmUoZSx0KT09MD90aGlzLmlzU3RhcnQoZSx0KT8hMTohMDohMX0sdGhpcy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIXRoaXMuaXNNdWx0aUxpbmUoKSYmZT09PXRoaXMuc3RhcnQucm93P3Q8dGhpcy5zdGFydC5jb2x1bW4/LTE6dD50aGlzLmVuZC5jb2x1bW4/MTowOmU8dGhpcy5zdGFydC5yb3c/LTE6ZT50aGlzLmVuZC5yb3c/MTp0aGlzLnN0YXJ0LnJvdz09PWU/dD49dGhpcy5zdGFydC5jb2x1bW4/MDotMTp0aGlzLmVuZC5yb3c9PT1lP3Q8PXRoaXMuZW5kLmNvbHVtbj8wOjE6MH0sdGhpcy5jb21wYXJlU3RhcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10Py0xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNvbXBhcmVFbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5lbmQucm93PT1lJiZ0aGlzLmVuZC5jb2x1bW49PXQ/MTp0aGlzLmNvbXBhcmUoZSx0KX0sdGhpcy5jb21wYXJlSW5zaWRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZW5kLnJvdz09ZSYmdGhpcy5lbmQuY29sdW1uPT10PzE6dGhpcy5zdGFydC5yb3c9PWUmJnRoaXMuc3RhcnQuY29sdW1uPT10Py0xOnRoaXMuY29tcGFyZShlLHQpfSx0aGlzLmNsaXBSb3dzPWZ1bmN0aW9uKGUsdCl7aWYodGhpcy5lbmQucm93PnQpdmFyIG49e3Jvdzp0KzEsY29sdW1uOjB9O2Vsc2UgaWYodGhpcy5lbmQucm93PGUpdmFyIG49e3JvdzplLGNvbHVtbjowfTtpZih0aGlzLnN0YXJ0LnJvdz50KXZhciByPXtyb3c6dCsxLGNvbHVtbjowfTtlbHNlIGlmKHRoaXMuc3RhcnQucm93PGUpdmFyIHI9e3JvdzplLGNvbHVtbjowfTtyZXR1cm4gaS5mcm9tUG9pbnRzKHJ8fHRoaXMuc3RhcnQsbnx8dGhpcy5lbmQpfSx0aGlzLmV4dGVuZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY29tcGFyZShlLHQpO2lmKG49PTApcmV0dXJuIHRoaXM7aWYobj09LTEpdmFyIHI9e3JvdzplLGNvbHVtbjp0fTtlbHNlIHZhciBzPXtyb3c6ZSxjb2x1bW46dH07cmV0dXJuIGkuZnJvbVBvaW50cyhyfHx0aGlzLnN0YXJ0LHN8fHRoaXMuZW5kKX0sdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQucm93PT09dGhpcy5lbmQucm93JiZ0aGlzLnN0YXJ0LmNvbHVtbj09PXRoaXMuZW5kLmNvbHVtbn0sdGhpcy5pc011bHRpTGluZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LnJvdyE9PXRoaXMuZW5kLnJvd30sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3JldHVybiBpLmZyb21Qb2ludHModGhpcy5zdGFydCx0aGlzLmVuZCl9LHRoaXMuY29sbGFwc2VSb3dzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kLmNvbHVtbj09MD9uZXcgaSh0aGlzLnN0YXJ0LnJvdywwLE1hdGgubWF4KHRoaXMuc3RhcnQucm93LHRoaXMuZW5kLnJvdy0xKSwwKTpuZXcgaSh0aGlzLnN0YXJ0LnJvdywwLHRoaXMuZW5kLnJvdywwKX0sdGhpcy50b1NjcmVlblJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpLG49ZS5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5lbmQpO3JldHVybiBuZXcgaSh0LnJvdyx0LmNvbHVtbixuLnJvdyxuLmNvbHVtbil9LHRoaXMubW92ZUJ5PWZ1bmN0aW9uKGUsdCl7dGhpcy5zdGFydC5yb3crPWUsdGhpcy5zdGFydC5jb2x1bW4rPXQsdGhpcy5lbmQucm93Kz1lLHRoaXMuZW5kLmNvbHVtbis9dH19KS5jYWxsKGkucHJvdG90eXBlKSxpLmZyb21Qb2ludHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGkoZS5yb3csZS5jb2x1bW4sdC5yb3csdC5jb2x1bW4pfSxpLmNvbXBhcmVQb2ludHM9cixpLmNvbXBhcmVQb2ludHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5yb3ctdC5yb3d8fGUuY29sdW1uLXQuY29sdW1ufSx0LlJhbmdlPWl9KSxhY2UuZGVmaW5lKCJhY2UvbGliL2xhbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QubGFzdD1mdW5jdGlvbihlKXtyZXR1cm4gZVtlLmxlbmd0aC0xXX0sdC5zdHJpbmdSZXZlcnNlPWZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIil9LHQuc3RyaW5nUmVwZWF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7d2hpbGUodD4wKXt0JjEmJihuKz1lKTtpZih0Pj49MSllKz1lfXJldHVybiBufTt2YXIgcj0vXlxzXHMqLyxpPS9cc1xzKiQvO3Quc3RyaW5nVHJpbUxlZnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShyLCIiKX0sdC5zdHJpbmdUcmltUmlnaHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShpLCIiKX0sdC5jb3B5T2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH0sdC5jb3B5QXJyYXk9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKWVbbl0mJnR5cGVvZiBlW25dPT0ib2JqZWN0Ij90W25dPXRoaXMuY29weU9iamVjdChlW25dKTp0W25dPWVbbl07cmV0dXJuIHR9LHQuZGVlcENvcHk9ZnVuY3Rpb24gcyhlKXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fCFlKXJldHVybiBlO3ZhciB0O2lmKEFycmF5LmlzQXJyYXkoZSkpe3Q9W107Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdFtuXT1zKGVbbl0pO3JldHVybiB0fWlmKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybiBlO3Q9e307Zm9yKHZhciBuIGluIGUpdFtuXT1zKGVbbl0pO3JldHVybiB0fSx0LmFycmF5VG9NYXA9ZnVuY3Rpb24oZSl7dmFyIHQ9e307Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspdFtlW25dXT0xO3JldHVybiB0fSx0LmNyZWF0ZU1hcD1mdW5jdGlvbihlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXTtyZXR1cm4gdH0sdC5hcnJheVJlbW92ZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248PWUubGVuZ3RoO24rKyl0PT09ZVtuXSYmZS5zcGxpY2UobiwxKX0sdC5lc2NhcGVSZWdFeHA9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCJcXCQxIil9LHQuZXNjYXBlSFRNTD1mdW5jdGlvbihlKXtyZXR1cm4oIiIrZSkucmVwbGFjZSgvJi9nLCImIzM4OyIpLnJlcGxhY2UoLyIvZywiJiMzNDsiKS5yZXBsYWNlKC8nL2csIiYjMzk7IikucmVwbGFjZSgvPC9nLCImIzYwOyIpfSx0LmdldE1hdGNoT2Zmc2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPVtdO3JldHVybiBlLnJlcGxhY2UodCxmdW5jdGlvbihlKXtuLnB1c2goe29mZnNldDphcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0yXSxsZW5ndGg6ZS5sZW5ndGh9KX0pLG59LHQuZGVmZXJyZWRDYWxsPWZ1bmN0aW9uKGUpe3ZhciB0PW51bGwsbj1mdW5jdGlvbigpe3Q9bnVsbCxlKCl9LHI9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY2FuY2VsKCksdD1zZXRUaW1lb3V0KG4sZXx8MCkscn07cmV0dXJuIHIuc2NoZWR1bGU9cixyLmNhbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW5jZWwoKSxlKCkscn0sci5jYW5jZWw9ZnVuY3Rpb24oKXtyZXR1cm4gY2xlYXJUaW1lb3V0KHQpLHQ9bnVsbCxyfSxyLmlzUGVuZGluZz1mdW5jdGlvbigpe3JldHVybiB0fSxyfSx0LmRlbGF5ZWRDYWxsPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbCxyPWZ1bmN0aW9uKCl7bj1udWxsLGUoKX0saT1mdW5jdGlvbihlKXtuPT1udWxsJiYobj1zZXRUaW1lb3V0KHIsZXx8dCkpfTtyZXR1cm4gaS5kZWxheT1mdW5jdGlvbihlKXtuJiZjbGVhclRpbWVvdXQobiksbj1zZXRUaW1lb3V0KHIsZXx8dCl9LGkuc2NoZWR1bGU9aSxpLmNhbGw9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbCgpLGUoKX0saS5jYW5jZWw9ZnVuY3Rpb24oKXtuJiZjbGVhclRpbWVvdXQobiksbj1udWxsfSxpLmlzUGVuZGluZz1mdW5jdGlvbigpe3JldHVybiBufSxpfX0pLGFjZS5kZWZpbmUoImFjZS9jbGlwYm9hcmQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByO24uZXhwb3J0cz17bGluZU1vZGU6ITEscGFzdGVDYW5jZWxsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gciYmcj5EYXRlLm5vdygpLTUwPyEwOnI9ITF9LGNhbmNlbDpmdW5jdGlvbigpe3I9RGF0ZS5ub3coKX19fSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL3RleHRpbnB1dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2NsaXBib2FyZCIsImFjZS9saWIva2V5cyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1lKCIuLi9saWIvZG9tIiksbz1lKCIuLi9saWIvbGFuZyIpLHU9ZSgiLi4vY2xpcGJvYXJkIiksYT1pLmlzQ2hyb21lPDE4LGY9aS5pc0lFLGw9aS5pc0Nocm9tZT42MyxjPTQwMCxoPWUoIi4uL2xpYi9rZXlzIikscD1oLktFWV9NT0RTLGQ9aS5pc0lPUyx2PWQ/L1xzLzovXG4vLG09ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB6KCl7Uz0hMCxuLmJsdXIoKSxuLmZvY3VzKCksUz0hMX1mdW5jdGlvbiBYKGUpe2Uua2V5Q29kZT09MjcmJm4udmFsdWUubGVuZ3RoPG4uc2VsZWN0aW9uU3RhcnQmJih5fHwoeD1uLnZhbHVlKSxUPU49LTEsTCgpKSxXKCl9ZnVuY3Rpb24gJCgpe2NsZWFyVGltZW91dChWKSxWPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt3JiYobi5zdHlsZS5jc3NUZXh0PXcsdz0iIiksdC5yZW5kZXJlci4kaXNNb3VzZVByZXNzZWQ9ITEsdC5yZW5kZXJlci4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJnQucmVuZGVyZXIuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCl9LDApfWZ1bmN0aW9uIEsoZSx0LG4pe3ZhciByPW51bGwsaT0hMTtuLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLGZ1bmN0aW9uKGUpe3ImJmNsZWFyVGltZW91dChyKSxpPSEwfSwhMCksbi5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oZSl7cj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aT0hMX0sMTAwKX0sITApO3ZhciBzPWZ1bmN0aW9uKGUpe2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1uKXJldHVybjtpZihpfHx5fHx0LiRtb3VzZUhhbmRsZXIuaXNNb3VzZVByZXNzZWQpcmV0dXJuO2lmKG0pcmV0dXJuO3ZhciByPW4uc2VsZWN0aW9uU3RhcnQscz1uLnNlbGVjdGlvbkVuZCxvPW51bGwsdT0wO2lmKHI9PTApbz1oLnVwO2Vsc2UgaWYocj09MSlvPWguaG9tZTtlbHNlIGlmKHM+TiYmeFtzXT09IlxuIilvPWguZW5kO2Vsc2UgaWYocjxUJiZ4W3ItMV09PSIgIilvPWgubGVmdCx1PXAub3B0aW9uO2Vsc2UgaWYocjxUfHxyPT1UJiZOIT1UJiZyPT1zKW89aC5sZWZ0O2Vsc2UgaWYocz5OJiZ4LnNsaWNlKDAscykuc3BsaXQoIlxuIikubGVuZ3RoPjIpbz1oLmRvd247ZWxzZSBpZihzPk4mJnhbcy0xXT09IiAiKW89aC5yaWdodCx1PXAub3B0aW9uO2Vsc2UgaWYocz5OfHxzPT1OJiZOIT1UJiZyPT1zKW89aC5yaWdodDtyIT09cyYmKHV8PXAuc2hpZnQpO2lmKG8pe3ZhciBhPXQub25Db21tYW5kS2V5KHt9LHUsbyk7aWYoIWEmJnQuY29tbWFuZHMpe289aC5rZXlDb2RlVG9TdHJpbmcobyk7dmFyIGY9dC5jb21tYW5kcy5maW5kS2V5Q29tbWFuZCh1LG8pO2YmJnQuZXhlY0NvbW1hbmQoZil9VD1yLE49cyxMKCIiKX19O2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIscyksdC5vbigiZGVzdHJveSIsZnVuY3Rpb24oKXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLHMpfSl9dmFyIG49cy5jcmVhdGVFbGVtZW50KCJ0ZXh0YXJlYSIpO24uY2xhc3NOYW1lPSJhY2VfdGV4dC1pbnB1dCIsbi5zZXRBdHRyaWJ1dGUoIndyYXAiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NvcnJlY3QiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxuLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsITEpLG4uc3R5bGUub3BhY2l0eT0iMCIsZS5pbnNlcnRCZWZvcmUobixlLmZpcnN0Q2hpbGQpO3ZhciBtPSExLGc9ITEseT0hMSxiPSExLHc9IiI7aS5pc01vYmlsZXx8KG4uc3R5bGUuZm9udFNpemU9IjFweCIpO3ZhciBFPSExLFM9ITEseD0iIixUPTAsTj0wO3RyeXt2YXIgQz1kb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bn1jYXRjaChrKXt9ci5hZGRMaXN0ZW5lcihuLCJibHVyIixmdW5jdGlvbihlKXtpZihTKXJldHVybjt0Lm9uQmx1cihlKSxDPSExfSksci5hZGRMaXN0ZW5lcihuLCJmb2N1cyIsZnVuY3Rpb24oZSl7aWYoUylyZXR1cm47Qz0hMDtpZihpLmlzRWRnZSl0cnl7aWYoIWRvY3VtZW50Lmhhc0ZvY3VzKCkpcmV0dXJufWNhdGNoKGUpe310Lm9uRm9jdXMoZSksaS5pc0VkZ2U/c2V0VGltZW91dChMKTpMKCl9KSx0aGlzLiRmb2N1c1Njcm9sbD0hMSx0aGlzLmZvY3VzPWZ1bmN0aW9uKCl7aWYod3x8bHx8dGhpcy4kZm9jdXNTY3JvbGw9PSJicm93c2VyIilyZXR1cm4gbi5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pO3ZhciBlPW4uc3R5bGUudG9wO24uc3R5bGUucG9zaXRpb249ImZpeGVkIixuLnN0eWxlLnRvcD0iMHB4Ijt0cnl7dmFyIHQ9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AhPTB9Y2F0Y2gocil7cmV0dXJufXZhciBpPVtdO2lmKHQpe3ZhciBzPW4ucGFyZW50RWxlbWVudDt3aGlsZShzJiZzLm5vZGVUeXBlPT0xKWkucHVzaChzKSxzLnNldEF0dHJpYnV0ZSgiYWNlX25vY29udGV4dCIsITApLCFzLnBhcmVudEVsZW1lbnQmJnMuZ2V0Um9vdE5vZGU/cz1zLmdldFJvb3ROb2RlKCkuaG9zdDpzPXMucGFyZW50RWxlbWVudH1uLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksdCYmaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UucmVtb3ZlQXR0cmlidXRlKCJhY2Vfbm9jb250ZXh0Iil9KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bi5zdHlsZS5wb3NpdGlvbj0iIixuLnN0eWxlLnRvcD09IjBweCImJihuLnN0eWxlLnRvcD1lKX0sMCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe24uYmx1cigpfSx0aGlzLmlzRm9jdXNlZD1mdW5jdGlvbigpe3JldHVybiBDfSx0Lm9uKCJiZWZvcmVFbmRPcGVyYXRpb24iLGZ1bmN0aW9uKCl7aWYodC5jdXJPcCYmdC5jdXJPcC5jb21tYW5kLm5hbWU9PSJpbnNlcnRzdHJpbmciKXJldHVybjt5JiYoeD1uLnZhbHVlPSIiLFUoKSksTCgpfSk7dmFyIEw9ZD9mdW5jdGlvbihlKXtpZighQ3x8bSYmIWV8fGIpcmV0dXJuO2V8fChlPSIiKTt2YXIgcj0iXG4gYWIiK2UrImNkZSBmZ1xuIjtyIT1uLnZhbHVlJiYobi52YWx1ZT14PXIpO3ZhciBpPTQscz00KyhlLmxlbmd0aHx8KHQuc2VsZWN0aW9uLmlzRW1wdHkoKT8wOjEpKTsoVCE9aXx8TiE9cykmJm4uc2V0U2VsZWN0aW9uUmFuZ2UoaSxzKSxUPWksTj1zfTpmdW5jdGlvbigpe2lmKHl8fGIpcmV0dXJuO2lmKCFDJiYhXylyZXR1cm47eT0hMDt2YXIgZT10LnNlbGVjdGlvbixyPWUuZ2V0UmFuZ2UoKSxpPWUuY3Vyc29yLnJvdyxzPXIuc3RhcnQuY29sdW1uLG89ci5lbmQuY29sdW1uLHU9dC5zZXNzaW9uLmdldExpbmUoaSk7aWYoci5zdGFydC5yb3chPWkpe3ZhciBhPXQuc2Vzc2lvbi5nZXRMaW5lKGktMSk7cz1yLnN0YXJ0LnJvdzxpLTE/MDpzLG8rPWEubGVuZ3RoKzEsdT1hKyJcbiIrdX1lbHNlIGlmKHIuZW5kLnJvdyE9aSl7dmFyIGY9dC5zZXNzaW9uLmdldExpbmUoaSsxKTtvPXIuZW5kLnJvdz5pKzE/Zi5sZW5ndGg6byxvKz11Lmxlbmd0aCsxLHU9dSsiXG4iK2Z9dS5sZW5ndGg+YyYmKHM8YyYmbzxjP3U9dS5zbGljZSgwLGMpOih1PSJcbiIscz0wLG89MSkpO3ZhciBsPXUrIlxuXG4iO2whPXgmJihuLnZhbHVlPXg9bCxUPU49bC5sZW5ndGgpLF8mJihUPW4uc2VsZWN0aW9uU3RhcnQsTj1uLnNlbGVjdGlvbkVuZCk7aWYoTiE9b3x8VCE9c3x8bi5zZWxlY3Rpb25FbmQhPU4pdHJ5e24uc2V0U2VsZWN0aW9uUmFuZ2UocyxvKSxUPXMsTj1vfWNhdGNoKGgpe315PSExfTtDJiZ0Lm9uRm9jdXMoKTt2YXIgQT1mdW5jdGlvbihlKXtyZXR1cm4gZS5zZWxlY3Rpb25TdGFydD09PTAmJmUuc2VsZWN0aW9uRW5kPj14Lmxlbmd0aCYmZS52YWx1ZT09PXgmJngmJmUuc2VsZWN0aW9uRW5kIT09Tn0sTz1mdW5jdGlvbihlKXtpZih5KXJldHVybjttP209ITE6QShuKSYmKHQuc2VsZWN0QWxsKCksTCgpKX0sTT1udWxsO3RoaXMuc2V0SW5wdXRIYW5kbGVyPWZ1bmN0aW9uKGUpe009ZX0sdGhpcy5nZXRJbnB1dEhhbmRsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gTX07dmFyIF89ITEsRD1mdW5jdGlvbihlLHIpe18mJihfPSExKTtpZihnKXJldHVybiBMKCksZSYmdC5vblBhc3RlKGUpLGc9ITEsIiI7dmFyIGk9bi5zZWxlY3Rpb25TdGFydCxzPW4uc2VsZWN0aW9uRW5kLG89VCx1PXgubGVuZ3RoLU4sYT1lLGY9ZS5sZW5ndGgtaSxsPWUubGVuZ3RoLXMsYz0wO3doaWxlKG8+MCYmeFtjXT09ZVtjXSljKyssby0tO2E9YS5zbGljZShjKSxjPTE7d2hpbGUodT4wJiZ4Lmxlbmd0aC1jPlQtMSYmeFt4Lmxlbmd0aC1jXT09ZVtlLmxlbmd0aC1jXSljKyssdS0tO2YtPWMtMSxsLT1jLTE7dmFyIGg9YS5sZW5ndGgtYysxO3JldHVybiBoPDAmJihvPS1oLGg9MCksYT1hLnNsaWNlKDAsaCksIXImJmY9PWEubGVuZ3RoJiYhbyYmIXUmJiFsPyIiOihiPSEwLGEmJiFvJiYhdSYmIWYmJiFsfHxFP3Qub25UZXh0SW5wdXQoYSk6dC5vblRleHRJbnB1dChhLHtleHRlbmRMZWZ0Om8sZXh0ZW5kUmlnaHQ6dSxyZXN0b3JlU3RhcnQ6ZixyZXN0b3JlRW5kOmx9KSxiPSExLHg9ZSxUPWksTj1zLGEpfSxQPWZ1bmN0aW9uKGUpe2lmKHkpcmV0dXJuIFIoKTtpZihlJiZlLmlucHV0VHlwZSl7aWYoZS5pbnB1dFR5cGU9PSJoaXN0b3J5VW5kbyIpcmV0dXJuIHQuZXhlY0NvbW1hbmQoInVuZG8iKTtpZihlLmlucHV0VHlwZT09Imhpc3RvcnlSZWRvIilyZXR1cm4gdC5leGVjQ29tbWFuZCgicmVkbyIpfXZhciByPW4udmFsdWUsaT1EKHIsITApOyhyLmxlbmd0aD5jKzEwMHx8di50ZXN0KGkpKSYmTCgpfSxIPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNsaXBib2FyZERhdGF8fHdpbmRvdy5jbGlwYm9hcmREYXRhO2lmKCFyfHxhKXJldHVybjt2YXIgaT1mfHxuPyJUZXh0IjoidGV4dC9wbGFpbiI7dHJ5e3JldHVybiB0P3Iuc2V0RGF0YShpLHQpIT09ITE6ci5nZXREYXRhKGkpfWNhdGNoKGUpe2lmKCFuKXJldHVybiBIKGUsdCwhMCl9fSxCPWZ1bmN0aW9uKGUsaSl7dmFyIHM9dC5nZXRDb3B5VGV4dCgpO2lmKCFzKXJldHVybiByLnByZXZlbnREZWZhdWx0KGUpO0goZSxzKT8oZCYmKEwocyksbT1zLHNldFRpbWVvdXQoZnVuY3Rpb24oKXttPSExfSwxMCkpLGk/dC5vbkN1dCgpOnQub25Db3B5KCksci5wcmV2ZW50RGVmYXVsdChlKSk6KG09ITAsbi52YWx1ZT1zLG4uc2VsZWN0KCksc2V0VGltZW91dChmdW5jdGlvbigpe209ITEsTCgpLGk/dC5vbkN1dCgpOnQub25Db3B5KCl9KSl9LGo9ZnVuY3Rpb24oZSl7QihlLCEwKX0sRj1mdW5jdGlvbihlKXtCKGUsITEpfSxJPWZ1bmN0aW9uKGUpe3ZhciBzPUgoZSk7aWYodS5wYXN0ZUNhbmNlbGxlZCgpKXJldHVybjt0eXBlb2Ygcz09InN0cmluZyI/KHMmJnQub25QYXN0ZShzLGUpLGkuaXNJRSYmc2V0VGltZW91dChMKSxyLnByZXZlbnREZWZhdWx0KGUpKToobi52YWx1ZT0iIixnPSEwKX07ci5hZGRDb21tYW5kS2V5TGlzdGVuZXIobix0Lm9uQ29tbWFuZEtleS5iaW5kKHQpKSxyLmFkZExpc3RlbmVyKG4sInNlbGVjdCIsTyksci5hZGRMaXN0ZW5lcihuLCJpbnB1dCIsUCksci5hZGRMaXN0ZW5lcihuLCJjdXQiLGopLHIuYWRkTGlzdGVuZXIobiwiY29weSIsRiksci5hZGRMaXN0ZW5lcihuLCJwYXN0ZSIsSSksKCEoIm9uY3V0ImluIG4pfHwhKCJvbmNvcHkiaW4gbil8fCEoIm9ucGFzdGUiaW4gbikpJiZyLmFkZExpc3RlbmVyKGUsImtleWRvd24iLGZ1bmN0aW9uKGUpe2lmKGkuaXNNYWMmJiFlLm1ldGFLZXl8fCFlLmN0cmxLZXkpcmV0dXJuO3N3aXRjaChlLmtleUNvZGUpe2Nhc2UgNjc6RihlKTticmVhaztjYXNlIDg2OkkoZSk7YnJlYWs7Y2FzZSA4ODpqKGUpfX0pO3ZhciBxPWZ1bmN0aW9uKGUpe2lmKHl8fCF0Lm9uQ29tcG9zaXRpb25TdGFydHx8dC4kcmVhZE9ubHkpcmV0dXJuO3k9e307aWYoRSlyZXR1cm47c2V0VGltZW91dChSLDApLHQub24oIm1vdXNlZG93biIseik7dmFyIHI9dC5nZXRTZWxlY3Rpb25SYW5nZSgpO3IuZW5kLnJvdz1yLnN0YXJ0LnJvdyxyLmVuZC5jb2x1bW49ci5zdGFydC5jb2x1bW4seS5tYXJrZXJSYW5nZT1yLHkuc2VsZWN0aW9uU3RhcnQ9VCx0Lm9uQ29tcG9zaXRpb25TdGFydCh5KSx5LnVzZVRleHRhcmVhRm9ySU1FPyhuLnZhbHVlPSIiLHg9IiIsVD0wLE49MCk6KG4ubXNHZXRJbnB1dENvbnRleHQmJih5LmNvbnRleHQ9bi5tc0dldElucHV0Q29udGV4dCgpKSxuLmdldElucHV0Q29udGV4dCYmKHkuY29udGV4dD1uLmdldElucHV0Q29udGV4dCgpKSl9LFI9ZnVuY3Rpb24oKXtpZigheXx8IXQub25Db21wb3NpdGlvblVwZGF0ZXx8dC4kcmVhZE9ubHkpcmV0dXJuO2lmKEUpcmV0dXJuIHooKTtpZih5LnVzZVRleHRhcmVhRm9ySU1FKXQub25Db21wb3NpdGlvblVwZGF0ZShuLnZhbHVlKTtlbHNle3ZhciBlPW4udmFsdWU7RChlKSx5Lm1hcmtlclJhbmdlJiYoeS5jb250ZXh0JiYoeS5tYXJrZXJSYW5nZS5zdGFydC5jb2x1bW49eS5zZWxlY3Rpb25TdGFydD15LmNvbnRleHQuY29tcG9zaXRpb25TdGFydE9mZnNldCkseS5tYXJrZXJSYW5nZS5lbmQuY29sdW1uPXkubWFya2VyUmFuZ2Uuc3RhcnQuY29sdW1uK04teS5zZWxlY3Rpb25TdGFydCl9fSxVPWZ1bmN0aW9uKGUpe2lmKCF0Lm9uQ29tcG9zaXRpb25FbmR8fHQuJHJlYWRPbmx5KXJldHVybjt5PSExLHQub25Db21wb3NpdGlvbkVuZCgpLHQub2ZmKCJtb3VzZWRvd24iLHopLGUmJlAoKX0sVz1vLmRlbGF5ZWRDYWxsKFIsNTApLnNjaGVkdWxlLmJpbmQobnVsbCxudWxsKTtyLmFkZExpc3RlbmVyKG4sImNvbXBvc2l0aW9uc3RhcnQiLHEpLHIuYWRkTGlzdGVuZXIobiwiY29tcG9zaXRpb251cGRhdGUiLFIpLHIuYWRkTGlzdGVuZXIobiwia2V5dXAiLFgpLHIuYWRkTGlzdGVuZXIobiwia2V5ZG93biIsVyksci5hZGRMaXN0ZW5lcihuLCJjb21wb3NpdGlvbmVuZCIsVSksdGhpcy5nZXRFbGVtZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG59LHRoaXMuc2V0Q29tbWFuZE1vZGU9ZnVuY3Rpb24oZSl7RT1lLG4ucmVhZE9ubHk9ITF9LHRoaXMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24oZSl7RXx8KG4ucmVhZE9ubHk9ZSl9LHRoaXMuc2V0Q29weVdpdGhFbXB0eVNlbGVjdGlvbj1mdW5jdGlvbihlKXt9LHRoaXMub25Db250ZXh0TWVudT1mdW5jdGlvbihlKXtfPSEwLEwoKSx0Ll9lbWl0KCJuYXRpdmVjb250ZXh0bWVudSIse3RhcmdldDp0LGRvbUV2ZW50OmV9KSx0aGlzLm1vdmVUb01vdXNlKGUsITApfSx0aGlzLm1vdmVUb01vdXNlPWZ1bmN0aW9uKGUsbyl7d3x8KHc9bi5zdHlsZS5jc3NUZXh0KSxuLnN0eWxlLmNzc1RleHQ9KG8/InotaW5kZXg6MTAwMDAwOyI6IiIpKyhpLmlzSUU/Im9wYWNpdHk6MC4xOyI6IiIpKyJ0ZXh0LWluZGVudDogLSIrKFQrTikqdC5yZW5kZXJlci5jaGFyYWN0ZXJXaWR0aCouNSsicHg7Ijt2YXIgdT10LmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXMuY29tcHV0ZWRTdHlsZSh0LmNvbnRhaW5lciksZj11LnRvcCsocGFyc2VJbnQoYS5ib3JkZXJUb3BXaWR0aCl8fDApLGw9dS5sZWZ0KyhwYXJzZUludCh1LmJvcmRlckxlZnRXaWR0aCl8fDApLGM9dS5ib3R0b20tZi1uLmNsaWVudEhlaWdodC0yLGg9ZnVuY3Rpb24oZSl7cy50cmFuc2xhdGUobixlLmNsaWVudFgtbC0yLE1hdGgubWluKGUuY2xpZW50WS1mLTIsYykpfTtoKGUpO2lmKGUudHlwZSE9Im1vdXNlZG93biIpcmV0dXJuO3QucmVuZGVyZXIuJGlzTW91c2VQcmVzc2VkPSEwLGNsZWFyVGltZW91dChWKSxpLmlzV2luJiZyLmNhcHR1cmUodC5jb250YWluZXIsaCwkKX0sdGhpcy5vbkNvbnRleHRNZW51Q2xvc2U9JDt2YXIgVixKPWZ1bmN0aW9uKGUpe3QudGV4dElucHV0Lm9uQ29udGV4dE1lbnUoZSksJCgpfTtyLmFkZExpc3RlbmVyKG4sIm1vdXNldXAiLEopLHIuYWRkTGlzdGVuZXIobiwibW91c2Vkb3duIixmdW5jdGlvbihlKXtlLnByZXZlbnREZWZhdWx0KCksJCgpfSksci5hZGRMaXN0ZW5lcih0LnJlbmRlcmVyLnNjcm9sbGVyLCJjb250ZXh0bWVudSIsSiksci5hZGRMaXN0ZW5lcihuLCJjb250ZXh0bWVudSIsSiksZCYmSyhlLHQsbil9O3QuVGV4dElucHV0PW19KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9oYW5kbGVycyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUpe2UuJGNsaWNrU2VsZWN0aW9uPW51bGw7dmFyIHQ9ZS5lZGl0b3I7dC5zZXREZWZhdWx0SGFuZGxlcigibW91c2Vkb3duIix0aGlzLm9uTW91c2VEb3duLmJpbmQoZSkpLHQuc2V0RGVmYXVsdEhhbmRsZXIoImRibGNsaWNrIix0aGlzLm9uRG91YmxlQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigidHJpcGxlY2xpY2siLHRoaXMub25UcmlwbGVDbGljay5iaW5kKGUpKSx0LnNldERlZmF1bHRIYW5kbGVyKCJxdWFkY2xpY2siLHRoaXMub25RdWFkQ2xpY2suYmluZChlKSksdC5zZXREZWZhdWx0SGFuZGxlcigibW91c2V3aGVlbCIsdGhpcy5vbk1vdXNlV2hlZWwuYmluZChlKSk7dmFyIG49WyJzZWxlY3QiLCJzdGFydFNlbGVjdCIsInNlbGVjdEVuZCIsInNlbGVjdEFsbEVuZCIsInNlbGVjdEJ5V29yZHNFbmQiLCJzZWxlY3RCeUxpbmVzRW5kIiwiZHJhZ1dhaXQiLCJkcmFnV2FpdEVuZCIsImZvY3VzV2FpdCJdO24uZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPXRoaXNbdF19LHRoaXMpLGUuc2VsZWN0QnlMaW5lcz10aGlzLmV4dGVuZFNlbGVjdGlvbkJ5LmJpbmQoZSwiZ2V0TGluZVJhbmdlIiksZS5zZWxlY3RCeVdvcmRzPXRoaXMuZXh0ZW5kU2VsZWN0aW9uQnkuYmluZChlLCJnZXRXb3JkUmFuZ2UiKX1mdW5jdGlvbiB1KGUsdCxuLHIpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cobi1lLDIpK01hdGgucG93KHItdCwyKSl9ZnVuY3Rpb24gYShlLHQpe2lmKGUuc3RhcnQucm93PT1lLmVuZC5yb3cpdmFyIG49Mip0LmNvbHVtbi1lLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW47ZWxzZSBpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93LTEmJiFlLnN0YXJ0LmNvbHVtbiYmIWUuZW5kLmNvbHVtbil2YXIgbj10LmNvbHVtbi00O2Vsc2UgdmFyIG49Mip0LnJvdy1lLnN0YXJ0LnJvdy1lLmVuZC5yb3c7cmV0dXJuIG48MD97Y3Vyc29yOmUuc3RhcnQsYW5jaG9yOmUuZW5kfTp7Y3Vyc29yOmUuZW5kLGFuY2hvcjplLnN0YXJ0fX12YXIgcj1lKCIuLi9saWIvdXNlcmFnZW50IiksaT0wLHM9NTUwOyhmdW5jdGlvbigpe3RoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5pblNlbGVjdGlvbigpLG49ZS5nZXREb2N1bWVudFBvc2l0aW9uKCk7dGhpcy5tb3VzZWRvd25FdmVudD1lO3ZhciBpPXRoaXMuZWRpdG9yLHM9ZS5nZXRCdXR0b24oKTtpZihzIT09MCl7dmFyIG89aS5nZXRTZWxlY3Rpb25SYW5nZSgpLHU9by5pc0VtcHR5KCk7KHV8fHM9PTEpJiZpLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihuKSxzPT0yJiYoaS50ZXh0SW5wdXQub25Db250ZXh0TWVudShlLmRvbUV2ZW50KSxyLmlzTW96aWxsYXx8ZS5wcmV2ZW50RGVmYXVsdCgpKTtyZXR1cm59dGhpcy5tb3VzZWRvd25FdmVudC50aW1lPURhdGUubm93KCk7aWYodCYmIWkuaXNGb2N1c2VkKCkpe2kuZm9jdXMoKTtpZih0aGlzLiRmb2N1c1RpbWVvdXQmJiF0aGlzLiRjbGlja1NlbGVjdGlvbiYmIWkuaW5NdWx0aVNlbGVjdE1vZGUpe3RoaXMuc2V0U3RhdGUoImZvY3VzV2FpdCIpLHRoaXMuY2FwdHVyZU1vdXNlKGUpO3JldHVybn19cmV0dXJuIHRoaXMuY2FwdHVyZU1vdXNlKGUpLHRoaXMuc3RhcnRTZWxlY3QobixlLmRvbUV2ZW50Ll9jbGlja3M+MSksZS5wcmV2ZW50RGVmYXVsdCgpfSx0aGlzLnN0YXJ0U2VsZWN0PWZ1bmN0aW9uKGUsdCl7ZT1lfHx0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KTt2YXIgbj10aGlzLmVkaXRvcjtpZighdGhpcy5tb3VzZWRvd25FdmVudClyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudC5nZXRTaGlmdEtleSgpP24uc2VsZWN0aW9uLnNlbGVjdFRvUG9zaXRpb24oZSk6dHx8bi5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oZSksdHx8dGhpcy5zZWxlY3QoKSxuLnJlbmRlcmVyLnNjcm9sbGVyLnNldENhcHR1cmUmJm4ucmVuZGVyZXIuc2Nyb2xsZXIuc2V0Q2FwdHVyZSgpLG4uc2V0U3R5bGUoImFjZV9zZWxlY3RpbmciKSx0aGlzLnNldFN0YXRlKCJzZWxlY3QiKX0sdGhpcy5zZWxlY3Q9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuZWRpdG9yLG49dC5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KTtpZih0aGlzLiRjbGlja1NlbGVjdGlvbil7dmFyIHI9dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KG4pO2lmKHI9PS0xKWU9dGhpcy4kY2xpY2tTZWxlY3Rpb24uZW5kO2Vsc2UgaWYocj09MSllPXRoaXMuJGNsaWNrU2VsZWN0aW9uLnN0YXJ0O2Vsc2V7dmFyIGk9YSh0aGlzLiRjbGlja1NlbGVjdGlvbixuKTtuPWkuY3Vyc29yLGU9aS5hbmNob3J9dC5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uQW5jaG9yKGUucm93LGUuY29sdW1uKX10LnNlbGVjdGlvbi5zZWxlY3RUb1Bvc2l0aW9uKG4pLHQucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKX0sdGhpcy5leHRlbmRTZWxlY3Rpb25CeT1mdW5jdGlvbihlKXt2YXIgdCxuPXRoaXMuZWRpdG9yLHI9bi5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLngsdGhpcy55KSxpPW4uc2VsZWN0aW9uW2VdKHIucm93LHIuY29sdW1uKTtpZih0aGlzLiRjbGlja1NlbGVjdGlvbil7dmFyIHM9dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KGkuc3RhcnQpLG89dGhpcy4kY2xpY2tTZWxlY3Rpb24uY29tcGFyZVBvaW50KGkuZW5kKTtpZihzPT0tMSYmbzw9MCl7dD10aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ7aWYoaS5lbmQucm93IT1yLnJvd3x8aS5lbmQuY29sdW1uIT1yLmNvbHVtbilyPWkuc3RhcnR9ZWxzZSBpZihvPT0xJiZzPj0wKXt0PXRoaXMuJGNsaWNrU2VsZWN0aW9uLnN0YXJ0O2lmKGkuc3RhcnQucm93IT1yLnJvd3x8aS5zdGFydC5jb2x1bW4hPXIuY29sdW1uKXI9aS5lbmR9ZWxzZSBpZihzPT0tMSYmbz09MSlyPWkuZW5kLHQ9aS5zdGFydDtlbHNle3ZhciB1PWEodGhpcy4kY2xpY2tTZWxlY3Rpb24scik7cj11LmN1cnNvcix0PXUuYW5jaG9yfW4uc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcih0LnJvdyx0LmNvbHVtbil9bi5zZWxlY3Rpb24uc2VsZWN0VG9Qb3NpdGlvbihyKSxuLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCl9LHRoaXMuc2VsZWN0RW5kPXRoaXMuc2VsZWN0QWxsRW5kPXRoaXMuc2VsZWN0QnlXb3Jkc0VuZD10aGlzLnNlbGVjdEJ5TGluZXNFbmQ9ZnVuY3Rpb24oKXt0aGlzLiRjbGlja1NlbGVjdGlvbj1udWxsLHRoaXMuZWRpdG9yLnVuc2V0U3R5bGUoImFjZV9zZWxlY3RpbmciKSx0aGlzLmVkaXRvci5yZW5kZXJlci5zY3JvbGxlci5yZWxlYXNlQ2FwdHVyZSYmdGhpcy5lZGl0b3IucmVuZGVyZXIuc2Nyb2xsZXIucmVsZWFzZUNhcHR1cmUoKX0sdGhpcy5mb2N1c1dhaXQ9ZnVuY3Rpb24oKXt2YXIgZT11KHRoaXMubW91c2Vkb3duRXZlbnQueCx0aGlzLm1vdXNlZG93bkV2ZW50LnksdGhpcy54LHRoaXMueSksdD1EYXRlLm5vdygpOyhlPml8fHQtdGhpcy5tb3VzZWRvd25FdmVudC50aW1lPnRoaXMuJGZvY3VzVGltZW91dCkmJnRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpfSx0aGlzLm9uRG91YmxlQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksbj10aGlzLmVkaXRvcixyPW4uc2Vzc2lvbixpPXIuZ2V0QnJhY2tldFJhbmdlKHQpO2k/KGkuaXNFbXB0eSgpJiYoaS5zdGFydC5jb2x1bW4tLSxpLmVuZC5jb2x1bW4rKyksdGhpcy5zZXRTdGF0ZSgic2VsZWN0IikpOihpPW4uc2VsZWN0aW9uLmdldFdvcmRSYW5nZSh0LnJvdyx0LmNvbHVtbiksdGhpcy5zZXRTdGF0ZSgic2VsZWN0QnlXb3JkcyIpKSx0aGlzLiRjbGlja1NlbGVjdGlvbj1pLHRoaXMuc2VsZWN0KCl9LHRoaXMub25UcmlwbGVDbGljaz1mdW5jdGlvbihlKXt2YXIgdD1lLmdldERvY3VtZW50UG9zaXRpb24oKSxuPXRoaXMuZWRpdG9yO3RoaXMuc2V0U3RhdGUoInNlbGVjdEJ5TGluZXMiKTt2YXIgcj1uLmdldFNlbGVjdGlvblJhbmdlKCk7ci5pc011bHRpTGluZSgpJiZyLmNvbnRhaW5zKHQucm93LHQuY29sdW1uKT8odGhpcy4kY2xpY2tTZWxlY3Rpb249bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHIuc3RhcnQucm93KSx0aGlzLiRjbGlja1NlbGVjdGlvbi5lbmQ9bi5zZWxlY3Rpb24uZ2V0TGluZVJhbmdlKHIuZW5kLnJvdykuZW5kKTp0aGlzLiRjbGlja1NlbGVjdGlvbj1uLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UodC5yb3cpLHRoaXMuc2VsZWN0KCl9LHRoaXMub25RdWFkQ2xpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3I7dC5zZWxlY3RBbGwoKSx0aGlzLiRjbGlja1NlbGVjdGlvbj10LmdldFNlbGVjdGlvblJhbmdlKCksdGhpcy5zZXRTdGF0ZSgic2VsZWN0QWxsIil9LHRoaXMub25Nb3VzZVdoZWVsPWZ1bmN0aW9uKGUpe2lmKGUuZ2V0QWNjZWxLZXkoKSlyZXR1cm47ZS5nZXRTaGlmdEtleSgpJiZlLndoZWVsWSYmIWUud2hlZWxYJiYoZS53aGVlbFg9ZS53aGVlbFksZS53aGVlbFk9MCk7dmFyIHQ9dGhpcy5lZGl0b3I7dGhpcy4kbGFzdFNjcm9sbHx8KHRoaXMuJGxhc3RTY3JvbGw9e3Q6MCx2eDowLHZ5OjAsYWxsb3dlZDowfSk7dmFyIG49dGhpcy4kbGFzdFNjcm9sbCxyPWUuZG9tRXZlbnQudGltZVN0YW1wLGk9ci1uLnQsbz1pP2Uud2hlZWxYL2k6bi52eCx1PWk/ZS53aGVlbFkvaTpuLnZ5O2k8cyYmKG89KG8rbi52eCkvMix1PSh1K24udnkpLzIpO3ZhciBhPU1hdGguYWJzKG8vdSksZj0hMTthPj0xJiZ0LnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KGUud2hlZWxYKmUuc3BlZWQsMCkmJihmPSEwKSxhPD0xJiZ0LnJlbmRlcmVyLmlzU2Nyb2xsYWJsZUJ5KDAsZS53aGVlbFkqZS5zcGVlZCkmJihmPSEwKTtpZihmKW4uYWxsb3dlZD1yO2Vsc2UgaWYoci1uLmFsbG93ZWQ8cyl7dmFyIGw9TWF0aC5hYnMobyk8PTEuNSpNYXRoLmFicyhuLnZ4KSYmTWF0aC5hYnModSk8PTEuNSpNYXRoLmFicyhuLnZ5KTtsPyhmPSEwLG4uYWxsb3dlZD1yKTpuLmFsbG93ZWQ9MH1uLnQ9cixuLnZ4PW8sbi52eT11O2lmKGYpcmV0dXJuIHQucmVuZGVyZXIuc2Nyb2xsQnkoZS53aGVlbFgqZS5zcGVlZCxlLndoZWVsWSplLnNwZWVkKSxlLnN0b3AoKX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LkRlZmF1bHRIYW5kbGVycz1vfSksYWNlLmRlZmluZSgiYWNlL3Rvb2x0aXAiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKGUpe3RoaXMuaXNPcGVuPSExLHRoaXMuJGVsZW1lbnQ9bnVsbCx0aGlzLiRwYXJlbnROb2RlPWV9dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKTsoZnVuY3Rpb24oKXt0aGlzLiRpbml0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRlbGVtZW50LmNsYXNzTmFtZT0iYWNlX3Rvb2x0aXAiLHRoaXMuJGVsZW1lbnQuc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy4kcGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzLiRlbGVtZW50KSx0aGlzLiRlbGVtZW50fSx0aGlzLmdldEVsZW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZWxlbWVudHx8dGhpcy4kaW5pdCgpfSx0aGlzLnNldFRleHQ9ZnVuY3Rpb24oZSl7dGhpcy5nZXRFbGVtZW50KCkudGV4dENvbnRlbnQ9ZX0sdGhpcy5zZXRIdG1sPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0RWxlbWVudCgpLmlubmVySFRNTD1lfSx0aGlzLnNldFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy5nZXRFbGVtZW50KCkuc3R5bGUubGVmdD1lKyJweCIsdGhpcy5nZXRFbGVtZW50KCkuc3R5bGUudG9wPXQrInB4In0sdGhpcy5zZXRDbGFzc05hbWU9ZnVuY3Rpb24oZSl7aS5hZGRDc3NDbGFzcyh0aGlzLmdldEVsZW1lbnQoKSxlKX0sdGhpcy5zaG93PWZ1bmN0aW9uKGUsdCxuKXtlIT1udWxsJiZ0aGlzLnNldFRleHQoZSksdCE9bnVsbCYmbiE9bnVsbCYmdGhpcy5zZXRQb3NpdGlvbih0LG4pLHRoaXMuaXNPcGVufHwodGhpcy5nZXRFbGVtZW50KCkuc3R5bGUuZGlzcGxheT0iYmxvY2siLHRoaXMuaXNPcGVuPSEwKX0sdGhpcy5oaWRlPWZ1bmN0aW9uKCl7dGhpcy5pc09wZW4mJih0aGlzLmdldEVsZW1lbnQoKS5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLmlzT3Blbj0hMSl9LHRoaXMuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RWxlbWVudCgpLm9mZnNldEhlaWdodH0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEVsZW1lbnQoKS5vZmZzZXRXaWR0aH0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5pc09wZW49ITEsdGhpcy4kZWxlbWVudCYmdGhpcy4kZWxlbWVudC5wYXJlbnROb2RlJiZ0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCl9fSkuY2FsbChzLnByb3RvdHlwZSksdC5Ub29sdGlwPXN9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZGVmYXVsdF9ndXR0ZXJfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50IiwiYWNlL3Rvb2x0aXAiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSl7ZnVuY3Rpb24gbCgpe3ZhciByPXUuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxzPW4uJGFubm90YXRpb25zW3JdO2lmKCFzKXJldHVybiBjKCk7dmFyIG89dC5zZXNzaW9uLmdldExlbmd0aCgpO2lmKHI9PW8pe3ZhciBhPXQucmVuZGVyZXIucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzKDAsdS55KS5yb3csbD11LiRwb3M7aWYoYT50LnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblJvdyhsLnJvdyxsLmNvbHVtbikpcmV0dXJuIGMoKX1pZihmPT1zKXJldHVybjtmPXMudGV4dC5qb2luKCI8YnIvPiIpLGkuc2V0SHRtbChmKSxpLnNob3coKSx0Ll9zaWduYWwoInNob3dHdXR0ZXJUb29sdGlwIixpKSx0Lm9uKCJtb3VzZXdoZWVsIixjKTtpZihlLiR0b29sdGlwRm9sbG93c01vdXNlKWgodSk7ZWxzZXt2YXIgcD11LmRvbUV2ZW50LnRhcmdldCxkPXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1pLmdldEVsZW1lbnQoKS5zdHlsZTt2LmxlZnQ9ZC5yaWdodCsicHgiLHYudG9wPWQuYm90dG9tKyJweCJ9fWZ1bmN0aW9uIGMoKXtvJiYobz1jbGVhclRpbWVvdXQobykpLGYmJihpLmhpZGUoKSxmPW51bGwsdC5fc2lnbmFsKCJoaWRlR3V0dGVyVG9vbHRpcCIsaSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXdoZWVsIixjKSl9ZnVuY3Rpb24gaChlKXtpLnNldFBvc2l0aW9uKGUueCxlLnkpfXZhciB0PWUuZWRpdG9yLG49dC5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIsaT1uZXcgYSh0LmNvbnRhaW5lcik7ZS5lZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcm1vdXNlZG93biIsZnVuY3Rpb24ocil7aWYoIXQuaXNGb2N1c2VkKCl8fHIuZ2V0QnV0dG9uKCkhPTApcmV0dXJuO3ZhciBpPW4uZ2V0UmVnaW9uKHIpO2lmKGk9PSJmb2xkV2lkZ2V0cyIpcmV0dXJuO3ZhciBzPXIuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxvPXQuc2Vzc2lvbi5zZWxlY3Rpb247aWYoci5nZXRTaGlmdEtleSgpKW8uc2VsZWN0VG8ocywwKTtlbHNle2lmKHIuZG9tRXZlbnQuZGV0YWlsPT0yKXJldHVybiB0LnNlbGVjdEFsbCgpLHIucHJldmVudERlZmF1bHQoKTtlLiRjbGlja1NlbGVjdGlvbj10LnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2Uocyl9cmV0dXJuIGUuc2V0U3RhdGUoInNlbGVjdEJ5TGluZXMiKSxlLmNhcHR1cmVNb3VzZShyKSxyLnByZXZlbnREZWZhdWx0KCl9KTt2YXIgbyx1LGY7ZS5lZGl0b3Iuc2V0RGVmYXVsdEhhbmRsZXIoImd1dHRlcm1vdXNlbW92ZSIsZnVuY3Rpb24odCl7dmFyIG49dC5kb21FdmVudC50YXJnZXR8fHQuZG9tRXZlbnQuc3JjRWxlbWVudDtpZihyLmhhc0Nzc0NsYXNzKG4sImFjZV9mb2xkLXdpZGdldCIpKXJldHVybiBjKCk7ZiYmZS4kdG9vbHRpcEZvbGxvd3NNb3VzZSYmaCh0KSx1PXQ7aWYobylyZXR1cm47bz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bz1udWxsLHUmJiFlLmlzTW91c2VQcmVzc2VkP2woKTpjKCl9LDUwKX0pLHMuYWRkTGlzdGVuZXIodC5yZW5kZXJlci4kZ3V0dGVyLCJtb3VzZW91dCIsZnVuY3Rpb24oZSl7dT1udWxsO2lmKCFmfHxvKXJldHVybjtvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtvPW51bGwsYygpfSw1MCl9KSx0Lm9uKCJjaGFuZ2VTZXNzaW9uIixjKX1mdW5jdGlvbiBhKGUpe28uY2FsbCh0aGlzLGUpfXZhciByPWUoIi4uL2xpYi9kb20iKSxpPWUoIi4uL2xpYi9vb3AiKSxzPWUoIi4uL2xpYi9ldmVudCIpLG89ZSgiLi4vdG9vbHRpcCIpLlRvb2x0aXA7aS5pbmhlcml0cyhhLG8pLGZ1bmN0aW9uKCl7dGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXdpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscj13aW5kb3cuaW5uZXJIZWlnaHR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsaT10aGlzLmdldFdpZHRoKCkscz10aGlzLmdldEhlaWdodCgpO2UrPTE1LHQrPTE1LGUraT5uJiYoZS09ZStpLW4pLHQrcz5yJiYodC09MjArcyksby5wcm90b3R5cGUuc2V0UG9zaXRpb24uY2FsbCh0aGlzLGUsdCl9fS5jYWxsKGEucHJvdG90eXBlKSx0Lkd1dHRlckhhbmRsZXI9dX0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS9tb3VzZV9ldmVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz10Lk1vdXNlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt0aGlzLmRvbUV2ZW50PWUsdGhpcy5lZGl0b3I9dCx0aGlzLng9dGhpcy5jbGllbnRYPWUuY2xpZW50WCx0aGlzLnk9dGhpcy5jbGllbnRZPWUuY2xpZW50WSx0aGlzLiRwb3M9bnVsbCx0aGlzLiRpblNlbGVjdGlvbj1udWxsLHRoaXMucHJvcGFnYXRpb25TdG9wcGVkPSExLHRoaXMuZGVmYXVsdFByZXZlbnRlZD0hMX07KGZ1bmN0aW9uKCl7dGhpcy5zdG9wUHJvcGFnYXRpb249ZnVuY3Rpb24oKXtyLnN0b3BQcm9wYWdhdGlvbih0aGlzLmRvbUV2ZW50KSx0aGlzLnByb3BhZ2F0aW9uU3RvcHBlZD0hMH0sdGhpcy5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe3IucHJldmVudERlZmF1bHQodGhpcy5kb21FdmVudCksdGhpcy5kZWZhdWx0UHJldmVudGVkPSEwfSx0aGlzLnN0b3A9ZnVuY3Rpb24oKXt0aGlzLnN0b3BQcm9wYWdhdGlvbigpLHRoaXMucHJldmVudERlZmF1bHQoKX0sdGhpcy5nZXREb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHBvcz90aGlzLiRwb3M6KHRoaXMuJHBvcz10aGlzLmVkaXRvci5yZW5kZXJlci5zY3JlZW5Ub1RleHRDb29yZGluYXRlcyh0aGlzLmNsaWVudFgsdGhpcy5jbGllbnRZKSx0aGlzLiRwb3MpfSx0aGlzLmluU2VsZWN0aW9uPWZ1bmN0aW9uKCl7aWYodGhpcy4kaW5TZWxlY3Rpb24hPT1udWxsKXJldHVybiB0aGlzLiRpblNlbGVjdGlvbjt2YXIgZT10aGlzLmVkaXRvcix0PWUuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0LmlzRW1wdHkoKSl0aGlzLiRpblNlbGVjdGlvbj0hMTtlbHNle3ZhciBuPXRoaXMuZ2V0RG9jdW1lbnRQb3NpdGlvbigpO3RoaXMuJGluU2VsZWN0aW9uPXQuY29udGFpbnMobi5yb3csbi5jb2x1bW4pfXJldHVybiB0aGlzLiRpblNlbGVjdGlvbn0sdGhpcy5nZXRCdXR0b249ZnVuY3Rpb24oKXtyZXR1cm4gci5nZXRCdXR0b24odGhpcy5kb21FdmVudCl9LHRoaXMuZ2V0U2hpZnRLZXk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5zaGlmdEtleX0sdGhpcy5nZXRBY2NlbEtleT1pLmlzTWFjP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tRXZlbnQubWV0YUtleX06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21FdmVudC5jdHJsS2V5fX0pLmNhbGwocy5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL2RyYWdkcm9wX2hhbmRsZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZihlKXtmdW5jdGlvbiBUKGUsbil7dmFyIHI9RGF0ZS5ub3coKSxpPSFufHxlLnJvdyE9bi5yb3cscz0hbnx8ZS5jb2x1bW4hPW4uY29sdW1uO2lmKCFTfHxpfHxzKXQubW92ZUN1cnNvclRvUG9zaXRpb24oZSksUz1yLHg9e3g6cCx5OmR9O2Vsc2V7dmFyIG89bCh4LngseC55LHAsZCk7bz5hP1M9bnVsbDpyLVM+PXUmJih0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KCksUz1udWxsKX19ZnVuY3Rpb24gTihlLG4pe3ZhciByPURhdGUubm93KCksaT10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQscz10LnJlbmRlcmVyLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoLHU9dC5yZW5kZXJlci5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxhPXt4OntsZWZ0OnAtdS5sZWZ0LHJpZ2h0OnUucmlnaHQtcH0seTp7dG9wOmQtdS50b3AsYm90dG9tOnUuYm90dG9tLWR9fSxmPU1hdGgubWluKGEueC5sZWZ0LGEueC5yaWdodCksbD1NYXRoLm1pbihhLnkudG9wLGEueS5ib3R0b20pLGM9e3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59O2Yvczw9MiYmKGMuY29sdW1uKz1hLngubGVmdDxhLngucmlnaHQ/LTM6MiksbC9pPD0xJiYoYy5yb3crPWEueS50b3A8YS55LmJvdHRvbT8tMToxKTt2YXIgaD1lLnJvdyE9Yy5yb3csdj1lLmNvbHVtbiE9Yy5jb2x1bW4sbT0hbnx8ZS5yb3chPW4ucm93O2h8fHYmJiFtP0U/ci1FPj1vJiZ0LnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KGMpOkU9cjpFPW51bGx9ZnVuY3Rpb24gQygpe3ZhciBlPWc7Zz10LnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKHAsZCksVChnLGUpLE4oZyxlKX1mdW5jdGlvbiBrKCl7bT10LnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxoPXQuc2Vzc2lvbi5hZGRNYXJrZXIobSwiYWNlX3NlbGVjdGlvbiIsdC5nZXRTZWxlY3Rpb25TdHlsZSgpKSx0LmNsZWFyU2VsZWN0aW9uKCksdC5pc0ZvY3VzZWQoKSYmdC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuc2V0QmxpbmtpbmcoITEpLGNsZWFySW50ZXJ2YWwodiksQygpLHY9c2V0SW50ZXJ2YWwoQywyMCkseT0wLGkuYWRkTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsTyl9ZnVuY3Rpb24gTCgpe2NsZWFySW50ZXJ2YWwodiksdC5zZXNzaW9uLnJlbW92ZU1hcmtlcihoKSxoPW51bGwsdC5zZWxlY3Rpb24uZnJvbU9yaWVudGVkUmFuZ2UobSksdC5pc0ZvY3VzZWQoKSYmIXcmJnQuJHJlc2V0Q3Vyc29yU3R5bGUoKSxtPW51bGwsZz1udWxsLHk9MCxFPW51bGwsUz1udWxsLGkucmVtb3ZlTGlzdGVuZXIoZG9jdW1lbnQsIm1vdXNlbW92ZSIsTyl9ZnVuY3Rpb24gTygpe0E9PW51bGwmJihBPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtBIT1udWxsJiZoJiZMKCl9LDIwKSl9ZnVuY3Rpb24gTShlKXt2YXIgdD1lLnR5cGVzO3JldHVybiF0fHxBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKHQsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJ0ZXh0L3BsYWluInx8ZT09IlRleHQifSl9ZnVuY3Rpb24gXyhlKXt2YXIgdD1bImNvcHkiLCJjb3B5bW92ZSIsImFsbCIsInVuaW5pdGlhbGl6ZWQiXSxuPVsibW92ZSIsImNvcHltb3ZlIiwibGlua21vdmUiLCJhbGwiLCJ1bmluaXRpYWxpemVkIl0scj1zLmlzTWFjP2UuYWx0S2V5OmUuY3RybEtleSxpPSJ1bmluaXRpYWxpemVkIjt0cnl7aT1lLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkLnRvTG93ZXJDYXNlKCl9Y2F0Y2goZSl7fXZhciBvPSJub25lIjtyZXR1cm4gciYmdC5pbmRleE9mKGkpPj0wP289ImNvcHkiOm4uaW5kZXhPZihpKT49MD9vPSJtb3ZlIjp0LmluZGV4T2YoaSk+PTAmJihvPSJjb3B5Iiksb312YXIgdD1lLmVkaXRvcixuPXIuY3JlYXRlRWxlbWVudCgiaW1nIik7bi5zcmM9ImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09IixzLmlzT3BlcmEmJihuLnN0eWxlLmNzc1RleHQ9IndpZHRoOjFweDtoZWlnaHQ6MXB4O3Bvc2l0aW9uOmZpeGVkO3RvcDowO2xlZnQ6MDt6LWluZGV4OjIxNDc0ODM2NDc7b3BhY2l0eTowOyIpO3ZhciBmPVsiZHJhZ1dhaXQiLCJkcmFnV2FpdEVuZCIsInN0YXJ0RHJhZyIsImRyYWdSZWFkeUVuZCIsIm9uTW91c2VEcmFnIl07Zi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dGhpc1t0XX0sdGhpcyksdC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHRoaXMub25Nb3VzZURvd24uYmluZChlKSk7dmFyIGM9dC5jb250YWluZXIsaCxwLGQsdixtLGcseT0wLGIsdyxFLFMseDt0aGlzLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2FuY2VsRHJhZ3x8IWMuZHJhZ2dhYmxlKXt2YXIgcj10aGlzO3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5zdGFydFNlbGVjdCgpLHIuY2FwdHVyZU1vdXNlKGUpfSwwKSxlLnByZXZlbnREZWZhdWx0KCl9bT10LmdldFNlbGVjdGlvblJhbmdlKCk7dmFyIGk9ZS5kYXRhVHJhbnNmZXI7aS5lZmZlY3RBbGxvd2VkPXQuZ2V0UmVhZE9ubHkoKT8iY29weSI6ImNvcHlNb3ZlIixzLmlzT3BlcmEmJih0LmNvbnRhaW5lci5hcHBlbmRDaGlsZChuKSxuLnNjcm9sbFRvcD0wKSxpLnNldERyYWdJbWFnZSYmaS5zZXREcmFnSW1hZ2UobiwwLDApLHMuaXNPcGVyYSYmdC5jb250YWluZXIucmVtb3ZlQ2hpbGQobiksaS5jbGVhckRhdGEoKSxpLnNldERhdGEoIlRleHQiLHQuc2Vzc2lvbi5nZXRUZXh0UmFuZ2UoKSksdz0hMCx0aGlzLnNldFN0YXRlKCJkcmFnIil9LHRoaXMub25EcmFnRW5kPWZ1bmN0aW9uKGUpe2MuZHJhZ2dhYmxlPSExLHc9ITEsdGhpcy5zZXRTdGF0ZShudWxsKTtpZighdC5nZXRSZWFkT25seSgpKXt2YXIgbj1lLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0OyFiJiZuPT0ibW92ZSImJnQuc2Vzc2lvbi5yZW1vdmUodC5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0LiRyZXNldEN1cnNvclN0eWxlKCl9dGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUoIiIpfSx0aGlzLm9uRHJhZ0VudGVyPWZ1bmN0aW9uKGUpe2lmKHQuZ2V0UmVhZE9ubHkoKXx8IU0oZS5kYXRhVHJhbnNmZXIpKXJldHVybjtyZXR1cm4gcD1lLmNsaWVudFgsZD1lLmNsaWVudFksaHx8aygpLHkrKyxlLmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0PWI9XyhlKSxpLnByZXZlbnREZWZhdWx0KGUpfSx0aGlzLm9uRHJhZ092ZXI9ZnVuY3Rpb24oZSl7aWYodC5nZXRSZWFkT25seSgpfHwhTShlLmRhdGFUcmFuc2ZlcikpcmV0dXJuO3JldHVybiBwPWUuY2xpZW50WCxkPWUuY2xpZW50WSxofHwoaygpLHkrKyksQSE9PW51bGwmJihBPW51bGwpLGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9Yj1fKGUpLGkucHJldmVudERlZmF1bHQoZSl9LHRoaXMub25EcmFnTGVhdmU9ZnVuY3Rpb24oZSl7eS0tO2lmKHk8PTAmJmgpcmV0dXJuIEwoKSxiPW51bGwsaS5wcmV2ZW50RGVmYXVsdChlKX0sdGhpcy5vbkRyb3A9ZnVuY3Rpb24oZSl7aWYoIWcpcmV0dXJuO3ZhciBuPWUuZGF0YVRyYW5zZmVyO2lmKHcpc3dpdGNoKGIpe2Nhc2UibW92ZSI6bS5jb250YWlucyhnLnJvdyxnLmNvbHVtbik/bT17c3RhcnQ6ZyxlbmQ6Z306bT10Lm1vdmVUZXh0KG0sZyk7YnJlYWs7Y2FzZSJjb3B5IjptPXQubW92ZVRleHQobSxnLCEwKX1lbHNle3ZhciByPW4uZ2V0RGF0YSgiVGV4dCIpO209e3N0YXJ0OmcsZW5kOnQuc2Vzc2lvbi5pbnNlcnQoZyxyKX0sdC5mb2N1cygpLGI9bnVsbH1yZXR1cm4gTCgpLGkucHJldmVudERlZmF1bHQoZSl9LGkuYWRkTGlzdGVuZXIoYywiZHJhZ3N0YXJ0Iix0aGlzLm9uRHJhZ1N0YXJ0LmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2VuZCIsdGhpcy5vbkRyYWdFbmQuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnZW50ZXIiLHRoaXMub25EcmFnRW50ZXIuYmluZChlKSksaS5hZGRMaXN0ZW5lcihjLCJkcmFnb3ZlciIsdGhpcy5vbkRyYWdPdmVyLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJhZ2xlYXZlIix0aGlzLm9uRHJhZ0xlYXZlLmJpbmQoZSkpLGkuYWRkTGlzdGVuZXIoYywiZHJvcCIsdGhpcy5vbkRyb3AuYmluZChlKSk7dmFyIEE9bnVsbH1mdW5jdGlvbiBsKGUsdCxuLHIpe3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cobi1lLDIpK01hdGgucG93KHItdCwyKSl9dmFyIHI9ZSgiLi4vbGliL2RvbSIpLGk9ZSgiLi4vbGliL2V2ZW50Iikscz1lKCIuLi9saWIvdXNlcmFnZW50Iiksbz0yMDAsdT0yMDAsYT01OyhmdW5jdGlvbigpe3RoaXMuZHJhZ1dhaXQ9ZnVuY3Rpb24oKXt2YXIgZT1EYXRlLm5vdygpLXRoaXMubW91c2Vkb3duRXZlbnQudGltZTtlPnRoaXMuZWRpdG9yLmdldERyYWdEZWxheSgpJiZ0aGlzLnN0YXJ0RHJhZygpfSx0aGlzLmRyYWdXYWl0RW5kPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5lZGl0b3IuY29udGFpbmVyO2UuZHJhZ2dhYmxlPSExLHRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpLHRoaXMuc2VsZWN0RW5kKCl9LHRoaXMuZHJhZ1JlYWR5RW5kPWZ1bmN0aW9uKGUpe3RoaXMuZWRpdG9yLiRyZXNldEN1cnNvclN0eWxlKCksdGhpcy5lZGl0b3IudW5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIiksdGhpcy5lZGl0b3IucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUoIiIpLHRoaXMuZHJhZ1dhaXRFbmQoKX0sdGhpcy5zdGFydERyYWc9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERyYWc9ITE7dmFyIGU9dGhpcy5lZGl0b3IsdD1lLmNvbnRhaW5lcjt0LmRyYWdnYWJsZT0hMCxlLnJlbmRlcmVyLiRjdXJzb3JMYXllci5zZXRCbGlua2luZyghMSksZS5zZXRTdHlsZSgiYWNlX2RyYWdnaW5nIik7dmFyIG49cy5pc1dpbj8iZGVmYXVsdCI6Im1vdmUiO2UucmVuZGVyZXIuc2V0Q3Vyc29yU3R5bGUobiksdGhpcy5zZXRTdGF0ZSgiZHJhZ1JlYWR5Iil9LHRoaXMub25Nb3VzZURyYWc9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5lZGl0b3IuY29udGFpbmVyO2lmKHMuaXNJRSYmdGhpcy5zdGF0ZT09ImRyYWdSZWFkeSIpe3ZhciBuPWwodGhpcy5tb3VzZWRvd25FdmVudC54LHRoaXMubW91c2Vkb3duRXZlbnQueSx0aGlzLngsdGhpcy55KTtuPjMmJnQuZHJhZ0Ryb3AoKX1pZih0aGlzLnN0YXRlPT09ImRyYWdXYWl0Iil7dmFyIG49bCh0aGlzLm1vdXNlZG93bkV2ZW50LngsdGhpcy5tb3VzZWRvd25FdmVudC55LHRoaXMueCx0aGlzLnkpO24+MCYmKHQuZHJhZ2dhYmxlPSExLHRoaXMuc3RhcnRTZWxlY3QodGhpcy5tb3VzZWRvd25FdmVudC5nZXREb2N1bWVudFBvc2l0aW9uKCkpKX19LHRoaXMub25Nb3VzZURvd249ZnVuY3Rpb24oZSl7aWYoIXRoaXMuJGRyYWdFbmFibGVkKXJldHVybjt0aGlzLm1vdXNlZG93bkV2ZW50PWU7dmFyIHQ9dGhpcy5lZGl0b3Isbj1lLmluU2VsZWN0aW9uKCkscj1lLmdldEJ1dHRvbigpLGk9ZS5kb21FdmVudC5kZXRhaWx8fDE7aWYoaT09PTEmJnI9PT0wJiZuKXtpZihlLmVkaXRvci5pbk11bHRpU2VsZWN0TW9kZSYmKGUuZ2V0QWNjZWxLZXkoKXx8ZS5nZXRTaGlmdEtleSgpKSlyZXR1cm47dGhpcy5tb3VzZWRvd25FdmVudC50aW1lPURhdGUubm93KCk7dmFyIG89ZS5kb21FdmVudC50YXJnZXR8fGUuZG9tRXZlbnQuc3JjRWxlbWVudDsidW5zZWxlY3RhYmxlImluIG8mJihvLnVuc2VsZWN0YWJsZT0ib24iKTtpZih0LmdldERyYWdEZWxheSgpKXtpZihzLmlzV2ViS2l0KXt0aGlzLmNhbmNlbERyYWc9ITA7dmFyIHU9dC5jb250YWluZXI7dS5kcmFnZ2FibGU9ITB9dGhpcy5zZXRTdGF0ZSgiZHJhZ1dhaXQiKX1lbHNlIHRoaXMuc3RhcnREcmFnKCk7dGhpcy5jYXB0dXJlTW91c2UoZSx0aGlzLm9uTW91c2VEcmFnLmJpbmQodGhpcykpLGUuZGVmYXVsdFByZXZlbnRlZD0hMH19fSkuY2FsbChmLnByb3RvdHlwZSksdC5EcmFnZHJvcEhhbmRsZXI9Zn0pLGFjZS5kZWZpbmUoImFjZS9tb3VzZS90b3VjaF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL21vdXNlL21vdXNlX2V2ZW50IiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbW91c2VfZXZlbnQiKS5Nb3VzZUV2ZW50LGk9ZSgiLi4vbGliL2RvbSIpO3QuYWRkVG91Y2hMaXN0ZW5lcnM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB5KCl7dmFyIGU9d2luZG93Lm5hdmlnYXRvciYmd2luZG93Lm5hdmlnYXRvci5jbGlwYm9hcmQscj0hMSxzPWZ1bmN0aW9uKCl7dmFyIG49dC5nZXRDb3B5VGV4dCgpLHM9dC5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkuaGFzVW5kbygpO2cucmVwbGFjZUNoaWxkKGkuYnVpbGREb20ocj9bInNwYW4iLCFuJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJzZWxlY3RhbGwifSwiU2VsZWN0IEFsbCJdLG4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImNvcHkifSwiQ29weSJdLG4mJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImN1dCJ9LCJDdXQiXSxlJiZbInNwYW4iLHsiY2xhc3MiOiJhY2VfbW9iaWxlLWJ1dHRvbiIsYWN0aW9uOiJwYXN0ZSJ9LCJQYXN0ZSJdLHMmJlsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246InVuZG8ifSwiVW5kbyJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246ImZpbmQifSwiRmluZCJdLFsic3BhbiIseyJjbGFzcyI6ImFjZV9tb2JpbGUtYnV0dG9uIixhY3Rpb246Im9wZW5Db21tYW5kUGFsbGV0ZSJ9LCJQYWxsZXRlIl1dOlsic3BhbiJdKSxnLmZpcnN0Q2hpbGQpfSxvPWZ1bmN0aW9uKG4pe3ZhciBpPW4udGFyZ2V0LmdldEF0dHJpYnV0ZSgiYWN0aW9uIik7aWYoaT09Im1vcmUifHwhcilyZXR1cm4gcj0hcixzKCk7aWYoaT09InBhc3RlIillLnJlYWRUZXh0KCkudGhlbihmdW5jdGlvbihlKXt0LmV4ZWNDb21tYW5kKGksZSl9KTtlbHNlIGlmKGkpe2lmKGk9PSJjdXQifHxpPT0iY29weSIpZT9lLndyaXRlVGV4dCh0LmdldENvcHlUZXh0KCkpOmRvY3VtZW50LmV4ZWNDb21tYW5kKCJjb3B5Iik7dC5leGVjQ29tbWFuZChpKX1nLmZpcnN0Q2hpbGQuc3R5bGUuZGlzcGxheT0ibm9uZSIscj0hMSxpIT0ib3BlbkNvbW1hbmRQYWxsZXRlIiYmdC5mb2N1cygpfTtnPWkuYnVpbGREb20oWyJkaXYiLHsiY2xhc3MiOiJhY2VfbW9iaWxlLW1lbnUiLG9udG91Y2hzdGFydDpmdW5jdGlvbihlKXtuPSJtZW51IixlLnN0b3BQcm9wYWdhdGlvbigpLGUucHJldmVudERlZmF1bHQoKSx0LnRleHRJbnB1dC5mb2N1cygpfSxvbnRvdWNoZW5kOmZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCksZS5wcmV2ZW50RGVmYXVsdCgpLG8oZSl9LG9uY2xpY2s6b30sWyJzcGFuIl0sWyJzcGFuIix7ImNsYXNzIjoiYWNlX21vYmlsZS1idXR0b24iLGFjdGlvbjoibW9yZSJ9LCIuLi4iXV0sdC5jb250YWluZXIpfWZ1bmN0aW9uIGIoKXtnfHx5KCk7dmFyIGU9dC5zZWxlY3Rpb24uY3Vyc29yLG49dC5yZW5kZXJlci50ZXh0VG9TY3JlZW5Db29yZGluYXRlcyhlLnJvdyxlLmNvbHVtbikscj10LmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtnLnN0eWxlLnRvcD1uLnBhZ2VZLXIudG9wLTMrInB4IixnLnN0eWxlLnJpZ2h0PSIxMHB4IixnLnN0eWxlLmRpc3BsYXk9IiIsZy5maXJzdENoaWxkLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHQub24oImlucHV0Iix3KX1mdW5jdGlvbiB3KGUpe2cmJihnLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0Lm9mZigiaW5wdXQiLHcpfWZ1bmN0aW9uIEUoKXtmPW51bGwsY2xlYXJUaW1lb3V0KGYpO3ZhciBlPXQuc2VsZWN0aW9uLmdldFJhbmdlKCkscj1lLmNvbnRhaW5zKGgucm93LGguY29sdW1uKTtpZihlLmlzRW1wdHkoKXx8IXIpdC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCksdC5zZWxlY3Rpb24uc2VsZWN0V29yZCgpO249IndhaXQiLGIoKX1mdW5jdGlvbiBTKCl7Zj1udWxsLGNsZWFyVGltZW91dChmKSx0LnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihoKTt2YXIgZT1wPj0yP3Quc2VsZWN0aW9uLmdldExpbmVSYW5nZShoLnJvdyk6dC5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShoKTtlJiYhZS5pc0VtcHR5KCk/dC5zZWxlY3Rpb24uc2V0UmFuZ2UoZSk6dC5zZWxlY3Rpb24uc2VsZWN0V29yZCgpLG49IndhaXQifWZ1bmN0aW9uIHgoKXtjKz02MCxsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7Yy0tPD0wJiYoY2xlYXJJbnRlcnZhbChsKSxsPW51bGwpLE1hdGguYWJzKGQpPC4wMSYmKGQ9MCksTWF0aC5hYnModik8LjAxJiYodj0wKSxjPDIwJiYoZD0uOSpkKSxjPDIwJiYodj0uOSp2KTt2YXIgZT10LnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCk7dC5yZW5kZXJlci5zY3JvbGxCeSgxMCpkLDEwKnYpLGU9PXQuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSYmKGM9MCl9LDEwKX12YXIgbj0ic2Nyb2xsIixzLG8sdSxhLGYsbCxjPTAsaCxwPTAsZD0wLHY9MCxtLGc7ZS5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsZnVuY3Rpb24oZSl7aWYoIW0pcmV0dXJuO3ZhciBuPXQudGV4dElucHV0LmdldEVsZW1lbnQoKTtuLmZvY3VzKCl9KSxlLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGZ1bmN0aW9uKGUpe3ZhciBpPWUudG91Y2hlcztpZihmfHxpLmxlbmd0aD4xKXtjbGVhclRpbWVvdXQoZiksZj1udWxsLHU9LTEsbj0iem9vbSI7cmV0dXJufW09dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkPSEwO3ZhciBsPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCxnPXQucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCx5PWUudGltZVN0YW1wO2E9eTt2YXIgYj1pWzBdLHc9Yi5jbGllbnRYLHg9Yi5jbGllbnRZO01hdGguYWJzKHMtdykrTWF0aC5hYnMoby14KT5sJiYodT0tMSkscz1lLmNsaWVudFg9dyxvPWUuY2xpZW50WT14LGQ9dj0wO3ZhciBUPW5ldyByKGUsdCk7aD1ULmdldERvY3VtZW50UG9zaXRpb24oKTtpZih5LXU8NTAwJiZpLmxlbmd0aD09MSYmIWMpcCsrLGUucHJldmVudERlZmF1bHQoKSxlLmJ1dHRvbj0wLFMoKTtlbHNle3A9MDt2YXIgTj10LnNlbGVjdGlvbi5jdXJzb3IsQz10LnNlbGVjdGlvbi5pc0VtcHR5KCk/Tjp0LnNlbGVjdGlvbi5hbmNob3Isaz10LnJlbmRlcmVyLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKE4sITApLEw9dC5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihDLCEwKSxBPXQucmVuZGVyZXIuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksTz1mdW5jdGlvbihlLHQpe3JldHVybiBlLz1nLHQ9dC9sLS43NSxlKmUrdCp0fTtpZihlLmNsaWVudFg8QS5sZWZ0KXtuPSJ6b29tIjtyZXR1cm59dmFyIE09TyhlLmNsaWVudFgtQS5sZWZ0LWsubGVmdCxlLmNsaWVudFktQS50b3Atay50b3ApLF89TyhlLmNsaWVudFgtQS5sZWZ0LUwubGVmdCxlLmNsaWVudFktQS50b3AtTC50b3ApO008My41JiZfPDMuNSYmKG49TT5fPyJjdXJzb3IiOiJhbmNob3IiKSxfPDMuNT9uPSJhbmNob3IiOk08My41P249ImN1cnNvciI6bj0ic2Nyb2xsIixmPXNldFRpbWVvdXQoRSw0NTApfXU9eX0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLGZ1bmN0aW9uKGUpe209dC4kbW91c2VIYW5kbGVyLmlzTW91c2VQcmVzc2VkPSExLGwmJmNsZWFySW50ZXJ2YWwobCksbj09Inpvb20iPyhuPSIiLGM9MCk6Zj8odC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24oaCksYz0wLGIoKSk6bj09InNjcm9sbCI/KHgoKSxlLnByZXZlbnREZWZhdWx0KCksdygpKTpiKCksY2xlYXJUaW1lb3V0KGYpLGY9bnVsbH0pLGUuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixmdW5jdGlvbihlKXtmJiYoY2xlYXJUaW1lb3V0KGYpLGY9bnVsbCk7dmFyIGk9ZS50b3VjaGVzO2lmKGkubGVuZ3RoPjF8fG49PSJ6b29tIilyZXR1cm47dmFyIHU9aVswXSxsPXMtdS5jbGllbnRYLGM9by11LmNsaWVudFk7aWYobj09IndhaXQiKXtpZighKGwqbCtjKmM+NCkpcmV0dXJuIGUucHJldmVudERlZmF1bHQoKTtuPSJjdXJzb3IifXM9dS5jbGllbnRYLG89dS5jbGllbnRZLGUuY2xpZW50WD11LmNsaWVudFgsZS5jbGllbnRZPXUuY2xpZW50WTt2YXIgaD1lLnRpbWVTdGFtcCxwPWgtYTthPWg7aWYobj09InNjcm9sbCIpe3ZhciBtPW5ldyByKGUsdCk7bS5zcGVlZD0xLG0ud2hlZWxYPWwsbS53aGVlbFk9YywxMCpNYXRoLmFicyhsKTxNYXRoLmFicyhjKSYmKGw9MCksMTAqTWF0aC5hYnMoYyk8TWF0aC5hYnMobCkmJihjPTApLHAhPTAmJihkPWwvcCx2PWMvcCksdC5fZW1pdCgibW91c2V3aGVlbCIsbSksbS5wcm9wYWdhdGlvblN0b3BwZWR8fChkPXY9MCl9ZWxzZXt2YXIgZz1uZXcgcihlLHQpLHk9Zy5nZXREb2N1bWVudFBvc2l0aW9uKCk7bj09ImN1cnNvciI/dC5zZWxlY3Rpb24ubW92ZUN1cnNvclRvUG9zaXRpb24oeSk6bj09ImFuY2hvciImJnQuc2VsZWN0aW9uLnNldFNlbGVjdGlvbkFuY2hvcih5LnJvdyx5LmNvbHVtbiksdC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyh5KSxlLnByZXZlbnREZWZhdWx0KCl9fSl9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9uZXQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9kb20iKTt0LmdldD1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBYTUxIdHRwUmVxdWVzdDtuLm9wZW4oIkdFVCIsZSwhMCksbi5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXtuLnJlYWR5U3RhdGU9PT00JiZ0KG4ucmVzcG9uc2VUZXh0KX0sbi5zZW5kKG51bGwpfSx0LmxvYWRTY3JpcHQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1yLmdldERvY3VtZW50SGVhZCgpLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7aS5zcmM9ZSxuLmFwcGVuZENoaWxkKGkpLGkub25sb2FkPWkub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGUsbil7aWYobnx8IWkucmVhZHlTdGF0ZXx8aS5yZWFkeVN0YXRlPT0ibG9hZGVkInx8aS5yZWFkeVN0YXRlPT0iY29tcGxldGUiKWk9aS5vbmxvYWQ9aS5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxufHx0KCl9fSx0LnF1YWxpZnlVUkw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO3JldHVybiB0LmhyZWY9ZSx0LmhyZWZ9fSksYWNlLmRlZmluZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fSxpPWZ1bmN0aW9uKCl7dGhpcy5wcm9wYWdhdGlvblN0b3BwZWQ9ITB9LHM9ZnVuY3Rpb24oKXt0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITB9O3IuX2VtaXQ9ci5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuX2V2ZW50UmVnaXN0cnl8fCh0aGlzLl9ldmVudFJlZ2lzdHJ5PXt9KSx0aGlzLl9kZWZhdWx0SGFuZGxlcnN8fCh0aGlzLl9kZWZhdWx0SGFuZGxlcnM9e30pO3ZhciBuPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV18fFtdLHI9dGhpcy5fZGVmYXVsdEhhbmRsZXJzW2VdO2lmKCFuLmxlbmd0aCYmIXIpcmV0dXJuO2lmKHR5cGVvZiB0IT0ib2JqZWN0Inx8IXQpdD17fTt0LnR5cGV8fCh0LnR5cGU9ZSksdC5zdG9wUHJvcGFnYXRpb258fCh0LnN0b3BQcm9wYWdhdGlvbj1pKSx0LnByZXZlbnREZWZhdWx0fHwodC5wcmV2ZW50RGVmYXVsdD1zKSxuPW4uc2xpY2UoKTtmb3IodmFyIG89MDtvPG4ubGVuZ3RoO28rKyl7bltvXSh0LHRoaXMpO2lmKHQucHJvcGFnYXRpb25TdG9wcGVkKWJyZWFrfWlmKHImJiF0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuIHIodCx0aGlzKX0sci5fc2lnbmFsPWZ1bmN0aW9uKGUsdCl7dmFyIG49KHRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9KVtlXTtpZighbilyZXR1cm47bj1uLnNsaWNlKCk7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspbltyXSh0LHRoaXMpfSxyLm9uY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcihlLGZ1bmN0aW9uIHIoKXtuLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxyKSx0LmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO2lmKCF0KXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXt0PWV9KX0sci5zZXREZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2RlZmF1bHRIYW5kbGVycztufHwobj10aGlzLl9kZWZhdWx0SGFuZGxlcnM9e19kaXNhYmxlZF86e319KTtpZihuW2VdKXt2YXIgcj1uW2VdLGk9bi5fZGlzYWJsZWRfW2VdO2l8fChuLl9kaXNhYmxlZF9bZV09aT1bXSksaS5wdXNoKHIpO3ZhciBzPWkuaW5kZXhPZih0KTtzIT0tMSYmaS5zcGxpY2UocywxKX1uW2VdPXR9LHIucmVtb3ZlRGVmYXVsdEhhbmRsZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLl9kZWZhdWx0SGFuZGxlcnM7aWYoIW4pcmV0dXJuO3ZhciByPW4uX2Rpc2FibGVkX1tlXTtpZihuW2VdPT10KXImJnRoaXMuc2V0RGVmYXVsdEhhbmRsZXIoZSxyLnBvcCgpKTtlbHNlIGlmKHIpe3ZhciBpPXIuaW5kZXhPZih0KTtpIT0tMSYmci5zcGxpY2UoaSwxKX19LHIub249ci5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9ldmVudFJlZ2lzdHJ5PXRoaXMuX2V2ZW50UmVnaXN0cnl8fHt9O3ZhciByPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV07cmV0dXJuIHJ8fChyPXRoaXMuX2V2ZW50UmVnaXN0cnlbZV09W10pLHIuaW5kZXhPZih0KT09LTEmJnJbbj8idW5zaGlmdCI6InB1c2giXSh0KSx0fSxyLm9mZj1yLnJlbW92ZUxpc3RlbmVyPXIucmVtb3ZlRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3RoaXMuX2V2ZW50UmVnaXN0cnk9dGhpcy5fZXZlbnRSZWdpc3RyeXx8e307dmFyIG49dGhpcy5fZXZlbnRSZWdpc3RyeVtlXTtpZighbilyZXR1cm47dmFyIHI9bi5pbmRleE9mKHQpO3IhPT0tMSYmbi5zcGxpY2UociwxKX0sci5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7dGhpcy5fZXZlbnRSZWdpc3RyeSYmKHRoaXMuX2V2ZW50UmVnaXN0cnlbZV09W10pfSx0LkV2ZW50RW1pdHRlcj1yfSksYWNlLmRlZmluZSgiYWNlL2xpYi9hcHBfY29uZmlnIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7Im5vIHVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSl7dHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2Fybi5hcHBseShjb25zb2xlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPW5ldyBFcnJvcihlKTtuLmRhdGE9dCx0eXBlb2YgY29uc29sZT09Im9iamVjdCImJmNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3Iobiksc2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX12YXIgcj1lKCIuL29vcCIpLGk9ZSgiLi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHM9e3NldE9wdGlvbnM6ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZSkuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLnNldE9wdGlvbih0LGVbdF0pfSx0aGlzKX0sZ2V0T3B0aW9uczpmdW5jdGlvbihlKXt2YXIgdD17fTtpZighZSl7dmFyIG49dGhpcy4kb3B0aW9ucztlPU9iamVjdC5rZXlzKG4pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hbltlXS5oaWRkZW59KX1lbHNlIEFycmF5LmlzQXJyYXkoZSl8fCh0PWUsZT1PYmplY3Qua2V5cyh0KSk7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPXRoaXMuZ2V0T3B0aW9uKGUpfSx0aGlzKSx0fSxzZXRPcHRpb246ZnVuY3Rpb24oZSx0KXtpZih0aGlzWyIkIitlXT09PXQpcmV0dXJuO3ZhciBuPXRoaXMuJG9wdGlvbnNbZV07aWYoIW4pcmV0dXJuIG8oJ21pc3NwZWxsZWQgb3B0aW9uICInK2UrJyInKTtpZihuLmZvcndhcmRUbylyZXR1cm4gdGhpc1tuLmZvcndhcmRUb10mJnRoaXNbbi5mb3J3YXJkVG9dLnNldE9wdGlvbihlLHQpO24uaGFuZGxlc1NldHx8KHRoaXNbIiQiK2VdPXQpLG4mJm4uc2V0JiZuLnNldC5jYWxsKHRoaXMsdCl9LGdldE9wdGlvbjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zW2VdO3JldHVybiB0P3QuZm9yd2FyZFRvP3RoaXNbdC5mb3J3YXJkVG9dJiZ0aGlzW3QuZm9yd2FyZFRvXS5nZXRPcHRpb24oZSk6dCYmdC5nZXQ/dC5nZXQuY2FsbCh0aGlzKTp0aGlzWyIkIitlXTpvKCdtaXNzcGVsbGVkIG9wdGlvbiAiJytlKyciJyl9fSxhPWZ1bmN0aW9uKCl7dGhpcy4kZGVmYXVsdE9wdGlvbnM9e319OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsaSksdGhpcy5kZWZpbmVPcHRpb25zPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS4kb3B0aW9uc3x8KHRoaXMuJGRlZmF1bHRPcHRpb25zW3RdPWUuJG9wdGlvbnM9e30pLE9iamVjdC5rZXlzKG4pLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHI9blt0XTt0eXBlb2Ygcj09InN0cmluZyImJihyPXtmb3J3YXJkVG86cn0pLHIubmFtZXx8KHIubmFtZT10KSxlLiRvcHRpb25zW3IubmFtZV09ciwiaW5pdGlhbFZhbHVlImluIHImJihlWyIkIityLm5hbWVdPXIuaW5pdGlhbFZhbHVlKX0pLHIuaW1wbGVtZW50KGUscyksdGhpc30sdGhpcy5yZXNldE9wdGlvbnM9ZnVuY3Rpb24oZSl7T2JqZWN0LmtleXMoZS4kb3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgbj1lLiRvcHRpb25zW3RdOyJ2YWx1ZSJpbiBuJiZlLnNldE9wdGlvbih0LG4udmFsdWUpfSl9LHRoaXMuc2V0RGVmYXVsdFZhbHVlPWZ1bmN0aW9uKGUsdCxuKXtpZighZSl7Zm9yKGUgaW4gdGhpcy4kZGVmYXVsdE9wdGlvbnMpaWYodGhpcy4kZGVmYXVsdE9wdGlvbnNbZV1bdF0pYnJlYWs7aWYoIXRoaXMuJGRlZmF1bHRPcHRpb25zW2VdW3RdKXJldHVybiExfXZhciByPXRoaXMuJGRlZmF1bHRPcHRpb25zW2VdfHwodGhpcy4kZGVmYXVsdE9wdGlvbnNbZV09e30pO3JbdF0mJihyLmZvcndhcmRUbz90aGlzLnNldERlZmF1bHRWYWx1ZShyLmZvcndhcmRUbyx0LG4pOnJbdF0udmFsdWU9bil9LHRoaXMuc2V0RGVmYXVsdFZhbHVlcz1mdW5jdGlvbihlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obil7dGhpcy5zZXREZWZhdWx0VmFsdWUoZSxuLHRbbl0pfSx0aGlzKX0sdGhpcy53YXJuPW8sdGhpcy5yZXBvcnRFcnJvcj11fSkuY2FsbChhLnByb3RvdHlwZSksdC5BcHBDb25maWc9YX0pLGFjZS5kZWZpbmUoImFjZS9jb25maWciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9saWIvbmV0IiwiYWNlL2xpYi9hcHBfY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4peyJubyB1c2Ugc3RyaWN0IjtmdW5jdGlvbiBsKHIpe2lmKCF1fHwhdS5kb2N1bWVudClyZXR1cm47YS5wYWNrYWdlZD1yfHxlLnBhY2thZ2VkfHxuLnBhY2thZ2VkfHx1LmRlZmluZSYmZGVmaW5lLnBhY2thZ2VkO3ZhciBpPXt9LHM9IiIsbz1kb2N1bWVudC5jdXJyZW50U2NyaXB0fHxkb2N1bWVudC5fY3VycmVudFNjcmlwdCxmPW8mJm8ub3duZXJEb2N1bWVudHx8ZG9jdW1lbnQsbD1mLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzY3JpcHQiKTtmb3IodmFyIGg9MDtoPGwubGVuZ3RoO2grKyl7dmFyIHA9bFtoXSxkPXAuc3JjfHxwLmdldEF0dHJpYnV0ZSgic3JjIik7aWYoIWQpY29udGludWU7dmFyIHY9cC5hdHRyaWJ1dGVzO2Zvcih2YXIgbT0wLGc9di5sZW5ndGg7bTxnO20rKyl7dmFyIHk9dlttXTt5Lm5hbWUuaW5kZXhPZigiZGF0YS1hY2UtIik9PT0wJiYoaVtjKHkubmFtZS5yZXBsYWNlKC9eZGF0YS1hY2UtLywiIikpXT15LnZhbHVlKX12YXIgYj1kLm1hdGNoKC9eKC4qKVwvYWNlKFwtXHcrKT9cLmpzKFw/fCQpLyk7YiYmKHM9YlsxXSl9cyYmKGkuYmFzZT1pLmJhc2V8fHMsaS5wYWNrYWdlZD0hMCksaS5iYXNlUGF0aD1pLmJhc2UsaS53b3JrZXJQYXRoPWkud29ya2VyUGF0aHx8aS5iYXNlLGkubW9kZVBhdGg9aS5tb2RlUGF0aHx8aS5iYXNlLGkudGhlbWVQYXRoPWkudGhlbWVQYXRofHxpLmJhc2UsZGVsZXRlIGkuYmFzZTtmb3IodmFyIHcgaW4gaSl0eXBlb2YgaVt3XSE9InVuZGVmaW5lZCImJnQuc2V0KHcsaVt3XSl9ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfSl9dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL2xpYi9uZXQiKSxvPWUoIi4vbGliL2FwcF9jb25maWciKS5BcHBDb25maWc7bi5leHBvcnRzPXQ9bmV3IG87dmFyIHU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc3x8dHlwZW9mIHdpbmRvdyE9InVuZGVmaW5lZCImJndpbmRvd30oKSxhPXtwYWNrYWdlZDohMSx3b3JrZXJQYXRoOm51bGwsbW9kZVBhdGg6bnVsbCx0aGVtZVBhdGg6bnVsbCxiYXNlUGF0aDoiIixzdWZmaXg6Ii5qcyIsJG1vZHVsZVVybHM6e30sbG9hZFdvcmtlckZyb21CbG9iOiEwLHNoYXJlZFBvcHVwczohMX07dC5nZXQ9ZnVuY3Rpb24oZSl7aWYoIWEuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbmZpZyBrZXk6ICIrZSk7cmV0dXJuIGFbZV19LHQuc2V0PWZ1bmN0aW9uKGUsdCl7aWYoYS5oYXNPd25Qcm9wZXJ0eShlKSlhW2VdPXQ7ZWxzZSBpZih0aGlzLnNldERlZmF1bHRWYWx1ZSgiIixlLHQpPT0wKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBjb25maWcga2V5OiAiK2UpfSx0LmFsbD1mdW5jdGlvbigpe3JldHVybiByLmNvcHlPYmplY3QoYSl9LHQuJG1vZGVzPXt9LHQubW9kdWxlVXJsPWZ1bmN0aW9uKGUsdCl7aWYoYS4kbW9kdWxlVXJsc1tlXSlyZXR1cm4gYS4kbW9kdWxlVXJsc1tlXTt2YXIgbj1lLnNwbGl0KCIvIik7dD10fHxuW24ubGVuZ3RoLTJdfHwiIjt2YXIgcj10PT0ic25pcHBldHMiPyIvIjoiLSIsaT1uW24ubGVuZ3RoLTFdO2lmKHQ9PSJ3b3JrZXIiJiZyPT0iLSIpe3ZhciBzPW5ldyBSZWdFeHAoIl4iK3QrIltcXC1fXXxbXFwtX10iK3QrIiQiLCJnIik7aT1pLnJlcGxhY2UocywiIil9KCFpfHxpPT10KSYmbi5sZW5ndGg+MSYmKGk9bltuLmxlbmd0aC0yXSk7dmFyIG89YVt0KyJQYXRoIl07cmV0dXJuIG89PW51bGw/bz1hLmJhc2VQYXRoOnI9PSIvIiYmKHQ9cj0iIiksbyYmby5zbGljZSgtMSkhPSIvIiYmKG8rPSIvIiksbyt0K3IraSt0aGlzLmdldCgic3VmZml4Iil9LHQuc2V0TW9kdWxlVXJsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEuJG1vZHVsZVVybHNbZV09dH0sdC4kbG9hZGluZz17fSx0LmxvYWRNb2R1bGU9ZnVuY3Rpb24obixyKXt2YXIgaSxvO0FycmF5LmlzQXJyYXkobikmJihvPW5bMF0sbj1uWzFdKTt0cnl7aT1lKG4pfWNhdGNoKHUpe31pZihpJiYhdC4kbG9hZGluZ1tuXSlyZXR1cm4gciYmcihpKTt0LiRsb2FkaW5nW25dfHwodC4kbG9hZGluZ1tuXT1bXSksdC4kbG9hZGluZ1tuXS5wdXNoKHIpO2lmKHQuJGxvYWRpbmdbbl0ubGVuZ3RoPjEpcmV0dXJuO3ZhciBhPWZ1bmN0aW9uKCl7ZShbbl0sZnVuY3Rpb24oZSl7dC5fZW1pdCgibG9hZC5tb2R1bGUiLHtuYW1lOm4sbW9kdWxlOmV9KTt2YXIgcj10LiRsb2FkaW5nW25dO3QuJGxvYWRpbmdbbl09bnVsbCxyLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdChlKX0pfSl9O2lmKCF0LmdldCgicGFja2FnZWQiKSlyZXR1cm4gYSgpO3MubG9hZFNjcmlwdCh0Lm1vZHVsZVVybChuLG8pLGEpLGYoKX07dmFyIGY9ZnVuY3Rpb24oKXshYS5iYXNlUGF0aCYmIWEud29ya2VyUGF0aCYmIWEubW9kZVBhdGgmJiFhLnRoZW1lUGF0aCYmIU9iamVjdC5rZXlzKGEuJG1vZHVsZVVybHMpLmxlbmd0aCYmKGNvbnNvbGUuZXJyb3IoIlVuYWJsZSB0byBpbmZlciBwYXRoIHRvIGFjZSBmcm9tIHNjcmlwdCBzcmMsIiwidXNlIGFjZS5jb25maWcuc2V0KCdiYXNlUGF0aCcsICdwYXRoJykgdG8gZW5hYmxlIGR5bmFtaWMgbG9hZGluZyBvZiBtb2RlcyBhbmQgdGhlbWVzIiwib3Igd2l0aCB3ZWJwYWNrIHVzZSBhY2Uvd2VicGFjay1yZXNvbHZlciIpLGY9ZnVuY3Rpb24oKXt9KX07dC5pbml0PWwsdC52ZXJzaW9uPSIxLjQuNiJ9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9tb3VzZS9kZWZhdWx0X2hhbmRsZXJzIiwiYWNlL21vdXNlL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiLCJhY2UvbW91c2UvbW91c2VfZXZlbnQiLCJhY2UvbW91c2UvZHJhZ2Ryb3BfaGFuZGxlciIsImFjZS9tb3VzZS90b3VjaF9oYW5kbGVyIiwiYWNlL2NvbmZpZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1lKCIuL2RlZmF1bHRfaGFuZGxlcnMiKS5EZWZhdWx0SGFuZGxlcnMsbz1lKCIuL2RlZmF1bHRfZ3V0dGVyX2hhbmRsZXIiKS5HdXR0ZXJIYW5kbGVyLHU9ZSgiLi9tb3VzZV9ldmVudCIpLk1vdXNlRXZlbnQsYT1lKCIuL2RyYWdkcm9wX2hhbmRsZXIiKS5EcmFnZHJvcEhhbmRsZXIsZj1lKCIuL3RvdWNoX2hhbmRsZXIiKS5hZGRUb3VjaExpc3RlbmVycyxsPWUoIi4uL2NvbmZpZyIpLGM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmVkaXRvcj1lLG5ldyBzKHRoaXMpLG5ldyBvKHRoaXMpLG5ldyBhKHRoaXMpO3ZhciBuPWZ1bmN0aW9uKHQpe3ZhciBuPSFkb2N1bWVudC5oYXNGb2N1c3x8IWRvY3VtZW50Lmhhc0ZvY3VzKCl8fCFlLmlzRm9jdXNlZCgpJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT0oZS50ZXh0SW5wdXQmJmUudGV4dElucHV0LmdldEVsZW1lbnQoKSk7biYmd2luZG93LmZvY3VzKCksZS5mb2N1cygpfSx1PWUucmVuZGVyZXIuZ2V0TW91c2VFdmVudFRhcmdldCgpO3IuYWRkTGlzdGVuZXIodSwiY2xpY2siLHRoaXMub25Nb3VzZUV2ZW50LmJpbmQodGhpcywiY2xpY2siKSksci5hZGRMaXN0ZW5lcih1LCJtb3VzZW1vdmUiLHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzLCJtb3VzZW1vdmUiKSksci5hZGRNdWx0aU1vdXNlRG93bkxpc3RlbmVyKFt1LGUucmVuZGVyZXIuc2Nyb2xsQmFyViYmZS5yZW5kZXJlci5zY3JvbGxCYXJWLmlubmVyLGUucmVuZGVyZXIuc2Nyb2xsQmFySCYmZS5yZW5kZXJlci5zY3JvbGxCYXJILmlubmVyLGUudGV4dElucHV0JiZlLnRleHRJbnB1dC5nZXRFbGVtZW50KCldLmZpbHRlcihCb29sZWFuKSxbNDAwLDMwMCwyNTBdLHRoaXMsIm9uTW91c2VFdmVudCIpLHIuYWRkTW91c2VXaGVlbExpc3RlbmVyKGUuY29udGFpbmVyLHRoaXMub25Nb3VzZVdoZWVsLmJpbmQodGhpcywibW91c2V3aGVlbCIpKSxmKGUuY29udGFpbmVyLGUpO3ZhciBsPWUucmVuZGVyZXIuJGd1dHRlcjtyLmFkZExpc3RlbmVyKGwsIm1vdXNlZG93biIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJtb3VzZWRvd24iKSksci5hZGRMaXN0ZW5lcihsLCJjbGljayIsdGhpcy5vbk1vdXNlRXZlbnQuYmluZCh0aGlzLCJndXR0ZXJjbGljayIpKSxyLmFkZExpc3RlbmVyKGwsImRibGNsaWNrIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcmRibGNsaWNrIikpLHIuYWRkTGlzdGVuZXIobCwibW91c2Vtb3ZlIix0aGlzLm9uTW91c2VFdmVudC5iaW5kKHRoaXMsImd1dHRlcm1vdXNlbW92ZSIpKSxyLmFkZExpc3RlbmVyKHUsIm1vdXNlZG93biIsbiksci5hZGRMaXN0ZW5lcihsLCJtb3VzZWRvd24iLG4pLGkuaXNJRSYmZS5yZW5kZXJlci5zY3JvbGxCYXJWJiYoci5hZGRMaXN0ZW5lcihlLnJlbmRlcmVyLnNjcm9sbEJhclYuZWxlbWVudCwibW91c2Vkb3duIixuKSxyLmFkZExpc3RlbmVyKGUucmVuZGVyZXIuc2Nyb2xsQmFySC5lbGVtZW50LCJtb3VzZWRvd24iLG4pKSxlLm9uKCJtb3VzZW1vdmUiLGZ1bmN0aW9uKG4pe2lmKHQuc3RhdGV8fHQuJGRyYWdEZWxheXx8IXQuJGRyYWdFbmFibGVkKXJldHVybjt2YXIgcj1lLnJlbmRlcmVyLnNjcmVlblRvVGV4dENvb3JkaW5hdGVzKG4ueCxuLnkpLGk9ZS5zZXNzaW9uLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHM9ZS5yZW5kZXJlcjshaS5pc0VtcHR5KCkmJmkuaW5zaWRlU3RhcnQoci5yb3csci5jb2x1bW4pP3Muc2V0Q3Vyc29yU3R5bGUoImRlZmF1bHQiKTpzLnNldEN1cnNvclN0eWxlKCIiKX0pfTsoZnVuY3Rpb24oKXt0aGlzLm9uTW91c2VFdmVudD1mdW5jdGlvbihlLHQpe3RoaXMuZWRpdG9yLl9lbWl0KGUsbmV3IHUodCx0aGlzLmVkaXRvcikpfSx0aGlzLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5lZGl0b3IuX2V2ZW50UmVnaXN0cnkmJnRoaXMuZWRpdG9yLl9ldmVudFJlZ2lzdHJ5Lm1vdXNlbW92ZTtpZighbnx8IW4ubGVuZ3RoKXJldHVybjt0aGlzLmVkaXRvci5fZW1pdChlLG5ldyB1KHQsdGhpcy5lZGl0b3IpKX0sdGhpcy5vbk1vdXNlV2hlZWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgdSh0LHRoaXMuZWRpdG9yKTtuLnNwZWVkPXRoaXMuJHNjcm9sbFNwZWVkKjIsbi53aGVlbFg9dC53aGVlbFgsbi53aGVlbFk9dC53aGVlbFksdGhpcy5lZGl0b3IuX2VtaXQoZSxuKX0sdGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihlKXt0aGlzLnN0YXRlPWV9LHRoaXMuY2FwdHVyZU1vdXNlPWZ1bmN0aW9uKGUsdCl7dGhpcy54PWUueCx0aGlzLnk9ZS55LHRoaXMuaXNNb3VzZVByZXNzZWQ9ITA7dmFyIG49dGhpcy5lZGl0b3Iscz10aGlzLmVkaXRvci5yZW5kZXJlcjtzLiRpc01vdXNlUHJlc3NlZD0hMDt2YXIgbz10aGlzLGE9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO2lmKGkuaXNXZWJLaXQmJiFlLndoaWNoJiZvLnJlbGVhc2VNb3VzZSlyZXR1cm4gby5yZWxlYXNlTW91c2UoKTtvLng9ZS5jbGllbnRYLG8ueT1lLmNsaWVudFksdCYmdChlKSxvLm1vdXNlRXZlbnQ9bmV3IHUoZSxvLmVkaXRvciksby4kbW91c2VNb3ZlZD0hMH0sZj1mdW5jdGlvbihlKXtuLm9mZigiYmVmb3JlRW5kT3BlcmF0aW9uIixjKSxjbGVhckludGVydmFsKGgpLGwoKSxvW28uc3RhdGUrIkVuZCJdJiZvW28uc3RhdGUrIkVuZCJdKGUpLG8uc3RhdGU9IiIsby5pc01vdXNlUHJlc3NlZD1zLiRpc01vdXNlUHJlc3NlZD0hMSxzLiRrZWVwVGV4dEFyZWFBdEN1cnNvciYmcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSxvLiRvbkNhcHR1cmVNb3VzZU1vdmU9by5yZWxlYXNlTW91c2U9bnVsbCxlJiZvLm9uTW91c2VFdmVudCgibW91c2V1cCIsZSksbi5lbmRPcGVyYXRpb24oKX0sbD1mdW5jdGlvbigpe29bby5zdGF0ZV0mJm9bby5zdGF0ZV0oKSxvLiRtb3VzZU1vdmVkPSExfTtpZihpLmlzT2xkSUUmJmUuZG9tRXZlbnQudHlwZT09ImRibGNsaWNrIilyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2YoZSl9KTt2YXIgYz1mdW5jdGlvbihlKXtpZighby5yZWxlYXNlTW91c2UpcmV0dXJuO24uY3VyT3AuY29tbWFuZC5uYW1lJiZuLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQmJihvW28uc3RhdGUrIkVuZCJdJiZvW28uc3RhdGUrIkVuZCJdKCksby5zdGF0ZT0iIixvLnJlbGVhc2VNb3VzZSgpKX07bi5vbigiYmVmb3JlRW5kT3BlcmF0aW9uIixjKSxuLnN0YXJ0T3BlcmF0aW9uKHtjb21tYW5kOntuYW1lOiJtb3VzZSJ9fSksby4kb25DYXB0dXJlTW91c2VNb3ZlPWEsby5yZWxlYXNlTW91c2U9ci5jYXB0dXJlKHRoaXMuZWRpdG9yLmNvbnRhaW5lcixhLGYpO3ZhciBoPXNldEludGVydmFsKGwsMjApfSx0aGlzLnJlbGVhc2VNb3VzZT1udWxsLHRoaXMuY2FuY2VsQ29udGV4dE1lbnU9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbih0KXtpZih0JiZ0LmRvbUV2ZW50JiZ0LmRvbUV2ZW50LnR5cGUhPSJjb250ZXh0bWVudSIpcmV0dXJuO3RoaXMuZWRpdG9yLm9mZigibmF0aXZlY29udGV4dG1lbnUiLGUpLHQmJnQuZG9tRXZlbnQmJnIuc3RvcEV2ZW50KHQuZG9tRXZlbnQpfS5iaW5kKHRoaXMpO3NldFRpbWVvdXQoZSwxMCksdGhpcy5lZGl0b3Iub24oIm5hdGl2ZWNvbnRleHRtZW51IixlKX19KS5jYWxsKGMucHJvdG90eXBlKSxsLmRlZmluZU9wdGlvbnMoYy5wcm90b3R5cGUsIm1vdXNlSGFuZGxlciIse3Njcm9sbFNwZWVkOntpbml0aWFsVmFsdWU6Mn0sZHJhZ0RlbGF5Ontpbml0aWFsVmFsdWU6aS5pc01hYz8xNTA6MH0sZHJhZ0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sZm9jdXNUaW1lb3V0Ontpbml0aWFsVmFsdWU6MH0sdG9vbHRpcEZvbGxvd3NNb3VzZTp7aW5pdGlhbFZhbHVlOiEwfX0pLHQuTW91c2VIYW5kbGVyPWN9KSxhY2UuZGVmaW5lKCJhY2UvbW91c2UvZm9sZF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSl7ZS5vbigiY2xpY2siLGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLGk9ZS5zZXNzaW9uLHM9aS5nZXRGb2xkQXQobi5yb3csbi5jb2x1bW4sMSk7cyYmKHQuZ2V0QWNjZWxLZXkoKT9pLnJlbW92ZUZvbGQocyk6aS5leHBhbmRGb2xkKHMpLHQuc3RvcCgpKTt2YXIgbz10LmRvbUV2ZW50JiZ0LmRvbUV2ZW50LnRhcmdldDtvJiZyLmhhc0Nzc0NsYXNzKG8sImFjZV9pbmxpbmVfYnV0dG9uIikmJnIuaGFzQ3NzQ2xhc3MobywiYWNlX3RvZ2dsZV93cmFwIikmJihpLnNldE9wdGlvbigid3JhcCIsIWkuZ2V0VXNlV3JhcE1vZGUoKSksZS5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpKX0pLGUub24oImd1dHRlcmNsaWNrIixmdW5jdGlvbih0KXt2YXIgbj1lLnJlbmRlcmVyLiRndXR0ZXJMYXllci5nZXRSZWdpb24odCk7aWYobj09ImZvbGRXaWRnZXRzIil7dmFyIHI9dC5nZXREb2N1bWVudFBvc2l0aW9uKCkucm93LGk9ZS5zZXNzaW9uO2kuZm9sZFdpZGdldHMmJmkuZm9sZFdpZGdldHNbcl0mJmUuc2Vzc2lvbi5vbkZvbGRXaWRnZXRDbGljayhyLHQpLGUuaXNGb2N1c2VkKCl8fGUuZm9jdXMoKSx0LnN0b3AoKX19KSxlLm9uKCJndXR0ZXJkYmxjbGljayIsZnVuY3Rpb24odCl7dmFyIG49ZS5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuZ2V0UmVnaW9uKHQpO2lmKG49PSJmb2xkV2lkZ2V0cyIpe3ZhciByPXQuZ2V0RG9jdW1lbnRQb3NpdGlvbigpLnJvdyxpPWUuc2Vzc2lvbixzPWkuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YShyLCEwKSxvPXMucmFuZ2V8fHMuZmlyc3RSYW5nZTtpZihvKXtyPW8uc3RhcnQucm93O3ZhciB1PWkuZ2V0Rm9sZEF0KHIsaS5nZXRMaW5lKHIpLmxlbmd0aCwxKTt1P2kucmVtb3ZlRm9sZCh1KTooaS5hZGRGb2xkKCIuLi4iLG8pLGUucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoe3JvdzpvLnN0YXJ0LnJvdyxjb2x1bW46MH0pKX10LnN0b3AoKX19KX12YXIgcj1lKCIuLi9saWIvZG9tIik7dC5Gb2xkSGFuZGxlcj1pfSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL2tleWJpbmRpbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2tleXMiLCJhY2UvbGliL2V2ZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIva2V5cyIpLGk9ZSgiLi4vbGliL2V2ZW50Iikscz1mdW5jdGlvbihlKXt0aGlzLiRlZGl0b3I9ZSx0aGlzLiRkYXRhPXtlZGl0b3I6ZX0sdGhpcy4kaGFuZGxlcnM9W10sdGhpcy5zZXREZWZhdWx0SGFuZGxlcihlLmNvbW1hbmRzKX07KGZ1bmN0aW9uKCl7dGhpcy5zZXREZWZhdWx0SGFuZGxlcj1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcih0aGlzLiRkZWZhdWx0SGFuZGxlciksdGhpcy4kZGVmYXVsdEhhbmRsZXI9ZSx0aGlzLmFkZEtleWJvYXJkSGFuZGxlcihlLDApfSx0aGlzLnNldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRoYW5kbGVycztpZih0W3QubGVuZ3RoLTFdPT1lKXJldHVybjt3aGlsZSh0W3QubGVuZ3RoLTFdJiZ0W3QubGVuZ3RoLTFdIT10aGlzLiRkZWZhdWx0SGFuZGxlcil0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcih0W3QubGVuZ3RoLTFdKTt0aGlzLmFkZEtleWJvYXJkSGFuZGxlcihlLDEpfSx0aGlzLmFkZEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlLHQpe2lmKCFlKXJldHVybjt0eXBlb2YgZT09ImZ1bmN0aW9uIiYmIWUuaGFuZGxlS2V5Ym9hcmQmJihlLmhhbmRsZUtleWJvYXJkPWUpO3ZhciBuPXRoaXMuJGhhbmRsZXJzLmluZGV4T2YoZSk7biE9LTEmJnRoaXMuJGhhbmRsZXJzLnNwbGljZShuLDEpLHQ9PXVuZGVmaW5lZD90aGlzLiRoYW5kbGVycy5wdXNoKGUpOnRoaXMuJGhhbmRsZXJzLnNwbGljZSh0LDAsZSksbj09LTEmJmUuYXR0YWNoJiZlLmF0dGFjaCh0aGlzLiRlZGl0b3IpfSx0aGlzLnJlbW92ZUtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRoYW5kbGVycy5pbmRleE9mKGUpO3JldHVybiB0PT0tMT8hMToodGhpcy4kaGFuZGxlcnMuc3BsaWNlKHQsMSksZS5kZXRhY2gmJmUuZGV0YWNoKHRoaXMuJGVkaXRvciksITApfSx0aGlzLmdldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoYW5kbGVyc1t0aGlzLiRoYW5kbGVycy5sZW5ndGgtMV19LHRoaXMuZ2V0U3RhdHVzVGV4dD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGRhdGEsdD1lLmVkaXRvcjtyZXR1cm4gdGhpcy4kaGFuZGxlcnMubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFN0YXR1c1RleHQmJm4uZ2V0U3RhdHVzVGV4dCh0LGUpfHwiIn0pLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIil9LHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBzLG89ITEsdT10aGlzLiRlZGl0b3IuY29tbWFuZHM7Zm9yKHZhciBhPXRoaXMuJGhhbmRsZXJzLmxlbmd0aDthLS07KXtzPXRoaXMuJGhhbmRsZXJzW2FdLmhhbmRsZUtleWJvYXJkKHRoaXMuJGRhdGEsZSx0LG4scik7aWYoIXN8fCFzLmNvbW1hbmQpY29udGludWU7cy5jb21tYW5kPT0ibnVsbCI/bz0hMDpvPXUuZXhlYyhzLmNvbW1hbmQsdGhpcy4kZWRpdG9yLHMuYXJncyxyKSxvJiZyJiZlIT0tMSYmcy5wYXNzRXZlbnQhPTEmJnMuY29tbWFuZC5wYXNzRXZlbnQhPTEmJmkuc3RvcEV2ZW50KHIpO2lmKG8pYnJlYWt9cmV0dXJuIW8mJmU9PS0xJiYocz17Y29tbWFuZDoiaW5zZXJ0c3RyaW5nIn0sbz11LmV4ZWMoImluc2VydHN0cmluZyIsdGhpcy4kZWRpdG9yLHQpKSxvJiZ0aGlzLiRlZGl0b3IuX3NpZ25hbCYmdGhpcy4kZWRpdG9yLl9zaWduYWwoImtleWJvYXJkQWN0aXZpdHkiLHMpLG99LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT1yLmtleUNvZGVUb1N0cmluZyhuKTtyZXR1cm4gdGhpcy4kY2FsbEtleWJvYXJkSGFuZGxlcnModCxpLG4sZSl9LHRoaXMub25UZXh0SW5wdXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGNhbGxLZXlib2FyZEhhbmRsZXJzKC0xLGUpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuS2V5QmluZGluZz1zfSksYWNlLmRlZmluZSgiYWNlL2xpYi9iaWRpdXRpbCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gRihlLHQsbixyKXt2YXIgaT1zP2Q6cCxjPW51bGwsaD1udWxsLHY9bnVsbCxtPTAsZz1udWxsLHk9bnVsbCxiPS0xLHc9bnVsbCxFPW51bGwsVD1bXTtpZighcilmb3Iodz0wLHI9W107dzxuO3crKylyW3ddPVIoZVt3XSk7bz1zLHU9ITEsYT0hMSxmPSExLGw9ITE7Zm9yKEU9MDtFPG47RSsrKXtjPW0sVFtFXT1oPXEoZSxyLFQsRSksbT1pW2NdW2hdLGc9bSYyNDAsbSY9MTUsdFtFXT12PWlbbV1bNV07aWYoZz4wKWlmKGc9PTE2KXtmb3Iodz1iO3c8RTt3KyspdFt3XT0xO2I9LTF9ZWxzZSBiPS0xO3k9aVttXVs2XTtpZih5KWI9PS0xJiYoYj1FKTtlbHNlIGlmKGI+LTEpe2Zvcih3PWI7dzxFO3crKyl0W3ddPXY7Yj0tMX1yW0VdPT1TJiYodFtFXT0wKSxvfD12fWlmKGwpZm9yKHc9MDt3PG47dysrKWlmKHJbd109PXgpe3Rbd109cztmb3IodmFyIEM9dy0xO0M+PTA7Qy0tKXtpZihyW0NdIT1OKWJyZWFrO3RbQ109c319fWZ1bmN0aW9uIEkoZSx0LG4pe2lmKG88ZSlyZXR1cm47aWYoZT09MSYmcz09bSYmIWYpe24ucmV2ZXJzZSgpO3JldHVybn12YXIgcj1uLmxlbmd0aCxpPTAsdSxhLGwsYzt3aGlsZShpPHIpe2lmKHRbaV0+PWUpe3U9aSsxO3doaWxlKHU8ciYmdFt1XT49ZSl1Kys7Zm9yKGE9aSxsPXUtMTthPGw7YSsrLGwtLSljPW5bYV0sblthXT1uW2xdLG5bbF09YztpPXV9aSsrfX1mdW5jdGlvbiBxKGUsdCxuLHIpe3ZhciBpPXRbcl0sbyxjLGgscDtzd2l0Y2goaSl7Y2FzZSBnOmNhc2UgeTp1PSExO2Nhc2UgRTpjYXNlIHc6cmV0dXJuIGk7Y2FzZSBiOnJldHVybiB1P3c6YjtjYXNlIFQ6cmV0dXJuIHU9ITAsYT0hMCx5O2Nhc2UgTjpyZXR1cm4gRTtjYXNlIEM6aWYocjwxfHxyKzE+PXQubGVuZ3RofHwobz1uW3ItMV0pIT1iJiZvIT13fHwoYz10W3IrMV0pIT1iJiZjIT13KXJldHVybiBFO3JldHVybiB1JiYoYz13KSxjPT1vP2M6RTtjYXNlIGs6bz1yPjA/bltyLTFdOlM7aWYobz09YiYmcisxPHQubGVuZ3RoJiZ0W3IrMV09PWIpcmV0dXJuIGI7cmV0dXJuIEU7Y2FzZSBMOmlmKHI+MCYmbltyLTFdPT1iKXJldHVybiBiO2lmKHUpcmV0dXJuIEU7cD1yKzEsaD10Lmxlbmd0aDt3aGlsZShwPGgmJnRbcF09PUwpcCsrO2lmKHA8aCYmdFtwXT09YilyZXR1cm4gYjtyZXR1cm4gRTtjYXNlIEE6aD10Lmxlbmd0aCxwPXIrMTt3aGlsZShwPGgmJnRbcF09PUEpcCsrO2lmKHA8aCl7dmFyIGQ9ZVtyXSx2PWQ+PTE0MjUmJmQ8PTIzMDN8fGQ9PTY0Mjg2O289dFtwXTtpZih2JiYobz09eXx8bz09VCkpcmV0dXJuIHl9aWYocjwxfHwobz10W3ItMV0pPT1TKXJldHVybiBFO3JldHVybiBuW3ItMV07Y2FzZSBTOnJldHVybiB1PSExLGY9ITAscztjYXNlIHg6cmV0dXJuIGw9ITAsRTtjYXNlIE86Y2FzZSBNOmNhc2UgRDpjYXNlIFA6Y2FzZSBfOnU9ITE7Y2FzZSBIOnJldHVybiBFfX1mdW5jdGlvbiBSKGUpe3ZhciB0PWUuY2hhckNvZGVBdCgwKSxuPXQ+Pjg7cmV0dXJuIG49PTA/dD4xOTE/ZzpCW3RdOm49PTU/L1tcdTA1OTEtXHUwNWY0XS8udGVzdChlKT95Omc6bj09Nj8vW1x1MDYxMC1cdTA2MWFcdTA2NGItXHUwNjVmXHUwNmQ2LVx1MDZlNFx1MDZlNy1cdTA2ZWRdLy50ZXN0KGUpP0E6L1tcdTA2NjAtXHUwNjY5XHUwNjZiLVx1MDY2Y10vLnRlc3QoZSk/dzp0PT0xNjQyP0w6L1tcdTA2ZjAtXHUwNmY5XS8udGVzdChlKT9iOlQ6bj09MzImJnQ8PTgyODc/alt0JjI1NV06bj09MjU0P3Q+PTY1MTM2P1Q6RTpFfWZ1bmN0aW9uIFUoZSl7cmV0dXJuIGU+PSJcdTA2NGIiJiZlPD0iXHUwNjU1In12YXIgcj1bIlx1MDYyMSIsIlx1MDY0MSJdLGk9WyJcdTA2M2EiLCJcdTA2NGEiXSxzPTAsbz0wLHU9ITEsYT0hMSxmPSExLGw9ITEsYz0hMSxoPSExLHA9W1swLDMsMCwxLDAsMCwwXSxbMCwzLDAsMSwyLDIsMF0sWzAsMywwLDE3LDIsMCwxXSxbMCwzLDUsNSw0LDEsMF0sWzAsMywyMSwyMSw0LDAsMV0sWzAsMyw1LDUsNCwyLDBdXSxkPVtbMiwwLDEsMSwwLDEsMF0sWzIsMCwxLDEsMCwyLDBdLFsyLDAsMiwxLDMsMiwwXSxbMiwwLDIsMzMsMywxLDFdXSx2PTAsbT0xLGc9MCx5PTEsYj0yLHc9MyxFPTQsUz01LHg9NixUPTcsTj04LEM9OSxrPTEwLEw9MTEsQT0xMixPPTEzLE09MTQsXz0xNSxEPTE2LFA9MTcsSD0xOCxCPVtILEgsSCxILEgsSCxILEgsSCx4LFMseCxOLFMsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILFMsUyxTLHgsTixFLEUsTCxMLEwsRSxFLEUsRSxFLGssQyxrLEMsQyxiLGIsYixiLGIsYixiLGIsYixiLEMsRSxFLEUsRSxFLEUsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLEUsRSxFLEUsRSxFLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxnLGcsZyxFLEUsRSxFLEgsSCxILEgsSCxILFMsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEgsSCxILEMsRSxMLEwsTCxMLEUsRSxFLEUsZyxFLEUsSCxFLEUsTCxMLGIsYixFLGcsRSxFLEUsYixnLEUsRSxFLEUsRV0saj1bTixOLE4sTixOLE4sTixOLE4sTixOLEgsSCxILGcseSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxOLFMsTyxNLF8sRCxQLEMsTCxMLEwsTCxMLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEMsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLEUsRSxFLE5dO3QuTD1nLHQuUj15LHQuRU49Yix0Lk9OX1I9Myx0LkFOPTQsdC5SX0g9NSx0LkI9Nix0LlJMRT03LHQuRE9UPSJcdTAwYjciLHQuZG9CaWRpUmVvcmRlcj1mdW5jdGlvbihlLG4scil7aWYoZS5sZW5ndGg8MilyZXR1cm57fTt2YXIgaT1lLnNwbGl0KCIiKSxvPW5ldyBBcnJheShpLmxlbmd0aCksdT1uZXcgQXJyYXkoaS5sZW5ndGgpLGE9W107cz1yP206dixGKGksYSxpLmxlbmd0aCxuKTtmb3IodmFyIGY9MDtmPG8ubGVuZ3RoO29bZl09ZixmKyspO0koMixhLG8pLEkoMSxhLG8pO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGgtMTtmKyspbltmXT09PXc/YVtmXT10LkFOOmFbZl09PT15JiYobltmXT5UJiZuW2ZdPE98fG5bZl09PT1FfHxuW2ZdPT09SCk/YVtmXT10Lk9OX1I6Zj4wJiZpW2YtMV09PT0iXHUwNjQ0IiYmL1x1MDYyMnxcdTA2MjN8XHUwNjI1fFx1MDYyNy8udGVzdChpW2ZdKSYmKGFbZi0xXT1hW2ZdPXQuUl9ILGYrKyk7aVtpLmxlbmd0aC0xXT09PXQuRE9UJiYoYVtpLmxlbmd0aC0xXT10LkIpLGlbMF09PT0iXHUyMDJiIiYmKGFbMF09dC5STEUpO2Zvcih2YXIgZj0wO2Y8by5sZW5ndGg7ZisrKXVbZl09YVtvW2ZdXTtyZXR1cm57bG9naWNhbEZyb21WaXN1YWw6byxiaWRpTGV2ZWxzOnV9fSx0Lmhhc0JpZGlDaGFyYWN0ZXJzPWZ1bmN0aW9uKGUsdCl7dmFyIG49ITE7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspdFtyXT1SKGUuY2hhckF0KHIpKSwhbiYmKHRbcl09PXl8fHRbcl09PVR8fHRbcl09PXcpJiYobj0hMCk7cmV0dXJuIG59LHQuZ2V0VmlzdWFsRnJvbUxvZ2ljYWxJZHg9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQubG9naWNhbEZyb21WaXN1YWwubGVuZ3RoO24rKylpZih0LmxvZ2ljYWxGcm9tVmlzdWFsW25dPT1lKXJldHVybiBuO3JldHVybiAwfX0pLGFjZS5kZWZpbmUoImFjZS9iaWRpaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvYmlkaXV0aWwiLCJhY2UvbGliL2xhbmciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2JpZGl1dGlsIiksaT1lKCIuL2xpYi9sYW5nIikscz0vW1x1MDU5MC1cdTA1ZjRcdTA2MDAtXHUwNmZmXHUwNzAwLVx1MDhhY1x1MjAyQl0vLG89ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5iaWRpTWFwPXt9LHRoaXMuY3VycmVudFJvdz1udWxsLHRoaXMuYmlkaVV0aWw9cix0aGlzLmNoYXJXaWR0aHM9W10sdGhpcy5FT0w9Ilx1MDBhYyIsdGhpcy5zaG93SW52aXNpYmxlcz0hMCx0aGlzLmlzUnRsRGlyPSExLHRoaXMuJGlzUnRsPSExLHRoaXMubGluZT0iIix0aGlzLndyYXBJbmRlbnQ9MCx0aGlzLkVPRj0iXHUwMGI2Iix0aGlzLlJMRT0iXHUyMDJiIix0aGlzLmNvbnRlbnRXaWR0aD0wLHRoaXMuZm9udE1ldHJpY3M9bnVsbCx0aGlzLnJ0bExpbmVPZmZzZXQ9MCx0aGlzLndyYXBPZmZzZXQ9MCx0aGlzLmlzTW92ZUxlZnRPcGVyYXRpb249ITEsdGhpcy5zZWVuQmlkaT1zLnRlc3QoZS5nZXRWYWx1ZSgpKX07KGZ1bmN0aW9uKCl7dGhpcy5pc0JpZGlSb3c9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLnNlZW5CaWRpPyhlIT09dGhpcy5jdXJyZW50Um93JiYodGhpcy5jdXJyZW50Um93PWUsdGhpcy51cGRhdGVSb3dMaW5lKHQsbiksdGhpcy51cGRhdGVCaWRpTWFwKCkpLHRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzKTohMX0sdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXt0aGlzLnNlZW5CaWRpP3RoaXMuY3VycmVudFJvdz1udWxsOmUuYWN0aW9uPT0iaW5zZXJ0IiYmcy50ZXN0KGUubGluZXMuam9pbigiXG4iKSkmJih0aGlzLnNlZW5CaWRpPSEwLHRoaXMuY3VycmVudFJvdz1udWxsKX0sdGhpcy5nZXREb2N1bWVudFJvdz1mdW5jdGlvbigpe3ZhciBlPTAsdD10aGlzLnNlc3Npb24uJHNjcmVlblJvd0NhY2hlO2lmKHQubGVuZ3RoKXt2YXIgbj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3cpO24+PTAmJihlPXRoaXMuc2Vzc2lvbi4kZG9jUm93Q2FjaGVbbl0pfXJldHVybiBlfSx0aGlzLmdldFNwbGl0SW5kZXg9ZnVuY3Rpb24oKXt2YXIgZT0wLHQ9dGhpcy5zZXNzaW9uLiRzY3JlZW5Sb3dDYWNoZTtpZih0Lmxlbmd0aCl7dmFyIG4scj10aGlzLnNlc3Npb24uJGdldFJvd0NhY2hlSW5kZXgodCx0aGlzLmN1cnJlbnRSb3cpO3doaWxlKHRoaXMuY3VycmVudFJvdy1lPjApe249dGhpcy5zZXNzaW9uLiRnZXRSb3dDYWNoZUluZGV4KHQsdGhpcy5jdXJyZW50Um93LWUtMSk7aWYobiE9PXIpYnJlYWs7cj1uLGUrK319ZWxzZSBlPXRoaXMuY3VycmVudFJvdztyZXR1cm4gZX0sdGhpcy51cGRhdGVSb3dMaW5lPWZ1bmN0aW9uKGUsdCl7ZT09PXVuZGVmaW5lZCYmKGU9dGhpcy5nZXREb2N1bWVudFJvdygpKTt2YXIgbj1lPT09dGhpcy5zZXNzaW9uLmdldExlbmd0aCgpLTEscz1uP3RoaXMuRU9GOnRoaXMuRU9MO3RoaXMud3JhcEluZGVudD0wLHRoaXMubGluZT10aGlzLnNlc3Npb24uZ2V0TGluZShlKSx0aGlzLmlzUnRsRGlyPXRoaXMuJGlzUnRsfHx0aGlzLmxpbmUuY2hhckF0KDApPT09dGhpcy5STEU7aWYodGhpcy5zZXNzaW9uLiR1c2VXcmFwTW9kZSl7dmFyIG89dGhpcy5zZXNzaW9uLiR3cmFwRGF0YVtlXTtvJiYodD09PXVuZGVmaW5lZCYmKHQ9dGhpcy5nZXRTcGxpdEluZGV4KCkpLHQ+MCYmby5sZW5ndGg/KHRoaXMud3JhcEluZGVudD1vLmluZGVudCx0aGlzLndyYXBPZmZzZXQ9dGhpcy53cmFwSW5kZW50KnRoaXMuY2hhcldpZHRoc1tyLkxdLHRoaXMubGluZT10PG8ubGVuZ3RoP3RoaXMubGluZS5zdWJzdHJpbmcob1t0LTFdLG9bdF0pOnRoaXMubGluZS5zdWJzdHJpbmcob1tvLmxlbmd0aC0xXSkpOnRoaXMubGluZT10aGlzLmxpbmUuc3Vic3RyaW5nKDAsb1t0XSkpLHQ9PW8ubGVuZ3RoJiYodGhpcy5saW5lKz10aGlzLnNob3dJbnZpc2libGVzP3M6ci5ET1QpfWVsc2UgdGhpcy5saW5lKz10aGlzLnNob3dJbnZpc2libGVzP3M6ci5ET1Q7dmFyIHU9dGhpcy5zZXNzaW9uLGE9MCxmO3RoaXMubGluZT10aGlzLmxpbmUucmVwbGFjZSgvXHR8W1x1MTEwMC1cdTIwMjksIFx1MjAyRi1cdUZGRTZdL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSIJInx8dS5pc0Z1bGxXaWR0aChlLmNoYXJDb2RlQXQoMCkpPyhmPWU9PT0iCSI/dS5nZXRTY3JlZW5UYWJTaXplKHQrYSk6MixhKz1mLTEsaS5zdHJpbmdSZXBlYXQoci5ET1QsZikpOmV9KSx0aGlzLmlzUnRsRGlyJiYodGhpcy5mb250TWV0cmljcy4kbWFpbi50ZXh0Q29udGVudD10aGlzLmxpbmUuY2hhckF0KHRoaXMubGluZS5sZW5ndGgtMSk9PXIuRE9UP3RoaXMubGluZS5zdWJzdHIoMCx0aGlzLmxpbmUubGVuZ3RoLTEpOnRoaXMubGluZSx0aGlzLnJ0bExpbmVPZmZzZXQ9dGhpcy5jb250ZW50V2lkdGgtdGhpcy5mb250TWV0cmljcy4kbWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCl9LHRoaXMudXBkYXRlQmlkaU1hcD1mdW5jdGlvbigpe3ZhciBlPVtdO3IuaGFzQmlkaUNoYXJhY3RlcnModGhpcy5saW5lLGUpfHx0aGlzLmlzUnRsRGlyP3RoaXMuYmlkaU1hcD1yLmRvQmlkaVJlb3JkZXIodGhpcy5saW5lLGUsdGhpcy5pc1J0bERpcik6dGhpcy5iaWRpTWFwPXt9fSx0aGlzLm1hcmtBc0RpcnR5PWZ1bmN0aW9uKCl7dGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMudXBkYXRlQ2hhcmFjdGVyV2lkdGhzPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY2hhcmFjdGVyV2lkdGg9PT1lLiRjaGFyYWN0ZXJTaXplLndpZHRoKXJldHVybjt0aGlzLmZvbnRNZXRyaWNzPWU7dmFyIHQ9dGhpcy5jaGFyYWN0ZXJXaWR0aD1lLiRjaGFyYWN0ZXJTaXplLndpZHRoLG49ZS4kbWVhc3VyZUNoYXJXaWR0aCgiXHUwNWQ0Iik7dGhpcy5jaGFyV2lkdGhzW3IuTF09dGhpcy5jaGFyV2lkdGhzW3IuRU5dPXRoaXMuY2hhcldpZHRoc1tyLk9OX1JdPXQsdGhpcy5jaGFyV2lkdGhzW3IuUl09dGhpcy5jaGFyV2lkdGhzW3IuQU5dPW4sdGhpcy5jaGFyV2lkdGhzW3IuUl9IXT1uKi40NSx0aGlzLmNoYXJXaWR0aHNbci5CXT10aGlzLmNoYXJXaWR0aHNbci5STEVdPTAsdGhpcy5jdXJyZW50Um93PW51bGx9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5zaG93SW52aXNpYmxlcz1lLHRoaXMuY3VycmVudFJvdz1udWxsfSx0aGlzLnNldEVvbENoYXI9ZnVuY3Rpb24oZSl7dGhpcy5FT0w9ZX0sdGhpcy5zZXRDb250ZW50V2lkdGg9ZnVuY3Rpb24oZSl7dGhpcy5jb250ZW50V2lkdGg9ZX0sdGhpcy5pc1J0bExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGlzUnRsPyEwOmUhPXVuZGVmaW5lZD90aGlzLnNlc3Npb24uZ2V0TGluZShlKS5jaGFyQXQoMCk9PXRoaXMuUkxFOnRoaXMuaXNSdGxEaXJ9LHRoaXMuc2V0UnRsRGlyZWN0aW9uPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRDdXJzb3JQb3NpdGlvbigpO2Zvcih2YXIgcj1lLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKS5yb3c7cjw9bi5yb3c7cisrKSF0JiZlLnNlc3Npb24uZ2V0TGluZShyKS5jaGFyQXQoMCk9PT1lLnNlc3Npb24uJGJpZGlIYW5kbGVyLlJMRT9lLnNlc3Npb24uZG9jLnJlbW92ZUluTGluZShyLDAsMSk6dCYmZS5zZXNzaW9uLmdldExpbmUocikuY2hhckF0KDApIT09ZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEUmJmUuc2Vzc2lvbi5kb2MuaW5zZXJ0KHtjb2x1bW46MCxyb3c6cn0sZS5zZXNzaW9uLiRiaWRpSGFuZGxlci5STEUpfSx0aGlzLmdldFBvc0xlZnQ9ZnVuY3Rpb24oZSl7ZS09dGhpcy53cmFwSW5kZW50O3ZhciB0PXRoaXMubGluZS5jaGFyQXQoMCk9PT10aGlzLlJMRT8xOjAsbj1lPnQ/dGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpP2U6ZS0xOnQsaT1yLmdldFZpc3VhbEZyb21Mb2dpY2FsSWR4KG4sdGhpcy5iaWRpTWFwKSxzPXRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzLG89MDshdGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpJiZlPD10JiZzW2ldJTIhPT0wJiZpKys7Zm9yKHZhciB1PTA7dTxpO3UrKylvKz10aGlzLmNoYXJXaWR0aHNbc1t1XV07cmV0dXJuIXRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKSYmZT50JiZzW2ldJTI9PT0wJiYobys9dGhpcy5jaGFyV2lkdGhzW3NbaV1dKSx0aGlzLndyYXBJbmRlbnQmJihvKz10aGlzLmlzUnRsRGlyPy0xKnRoaXMud3JhcE9mZnNldDp0aGlzLndyYXBPZmZzZXQpLHRoaXMuaXNSdGxEaXImJihvKz10aGlzLnJ0bExpbmVPZmZzZXQpLG99LHRoaXMuZ2V0U2VsZWN0aW9ucz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYmlkaU1hcCxyPW4uYmlkaUxldmVscyxpLHM9W10sbz0wLHU9TWF0aC5taW4oZSx0KS10aGlzLndyYXBJbmRlbnQsYT1NYXRoLm1heChlLHQpLXRoaXMud3JhcEluZGVudCxmPSExLGw9ITEsYz0wO3RoaXMud3JhcEluZGVudCYmKG8rPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCk7Zm9yKHZhciBoLHA9MDtwPHIubGVuZ3RoO3ArKyloPW4ubG9naWNhbEZyb21WaXN1YWxbcF0saT1yW3BdLGY9aD49dSYmaDxhLGYmJiFsP2M9bzohZiYmbCYmcy5wdXNoKHtsZWZ0OmMsd2lkdGg6by1jfSksbys9dGhpcy5jaGFyV2lkdGhzW2ldLGw9ZjtmJiZwPT09ci5sZW5ndGgmJnMucHVzaCh7bGVmdDpjLHdpZHRoOm8tY30pO2lmKHRoaXMuaXNSdGxEaXIpZm9yKHZhciBkPTA7ZDxzLmxlbmd0aDtkKyspc1tkXS5sZWZ0Kz10aGlzLnJ0bExpbmVPZmZzZXQ7cmV0dXJuIHN9LHRoaXMub2Zmc2V0VG9Db2w9ZnVuY3Rpb24oZSl7dGhpcy5pc1J0bERpciYmKGUtPXRoaXMucnRsTGluZU9mZnNldCk7dmFyIHQ9MCxlPU1hdGgubWF4KGUsMCksbj0wLHI9MCxpPXRoaXMuYmlkaU1hcC5iaWRpTGV2ZWxzLHM9dGhpcy5jaGFyV2lkdGhzW2lbcl1dO3RoaXMud3JhcEluZGVudCYmKGUtPXRoaXMuaXNSdGxEaXI/LTEqdGhpcy53cmFwT2Zmc2V0OnRoaXMud3JhcE9mZnNldCk7d2hpbGUoZT5uK3MvMil7bis9cztpZihyPT09aS5sZW5ndGgtMSl7cz0wO2JyZWFrfXM9dGhpcy5jaGFyV2lkdGhzW2lbKytyXV19cmV0dXJuIHI+MCYmaVtyLTFdJTIhPT0wJiZpW3JdJTI9PT0wPyhlPG4mJnItLSx0PXRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyXSk6cj4wJiZpW3ItMV0lMj09PTAmJmlbcl0lMiE9PTA/dD0xKyhlPm4/dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdOnRoaXMuYmlkaU1hcC5sb2dpY2FsRnJvbVZpc3VhbFtyLTFdKTp0aGlzLmlzUnRsRGlyJiZyPT09aS5sZW5ndGgtMSYmcz09PTAmJmlbci0xXSUyPT09MHx8IXRoaXMuaXNSdGxEaXImJnI9PT0wJiZpW3JdJTIhPT0wP3Q9MSt0aGlzLmJpZGlNYXAubG9naWNhbEZyb21WaXN1YWxbcl06KHI+MCYmaVtyLTFdJTIhPT0wJiZzIT09MCYmci0tLHQ9dGhpcy5iaWRpTWFwLmxvZ2ljYWxGcm9tVmlzdWFsW3JdKSx0PT09MCYmdGhpcy5pc1J0bERpciYmdCsrLHQrdGhpcy53cmFwSW5kZW50fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuQmlkaUhhbmRsZXI9b30pLGFjZS5kZWZpbmUoImFjZS9zZWxlY3Rpb24iLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvbGFuZyIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9sYW5nIikscz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi9yYW5nZSIpLlJhbmdlLHU9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uPWUsdGhpcy5kb2M9ZS5nZXREb2N1bWVudCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLmN1cnNvcj10aGlzLmxlYWQ9dGhpcy5kb2MuY3JlYXRlQW5jaG9yKDAsMCksdGhpcy5hbmNob3I9dGhpcy5kb2MuY3JlYXRlQW5jaG9yKDAsMCksdGhpcy4kc2lsZW50PSExO3ZhciB0PXRoaXM7dGhpcy5jdXJzb3Iub24oImNoYW5nZSIsZnVuY3Rpb24oZSl7dC4kY3Vyc29yQ2hhbmdlZD0hMCx0LiRzaWxlbnR8fHQuX2VtaXQoImNoYW5nZUN1cnNvciIpLCF0LiRpc0VtcHR5JiYhdC4kc2lsZW50JiZ0Ll9lbWl0KCJjaGFuZ2VTZWxlY3Rpb24iKSwhdC4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZSYmZS5vbGQuY29sdW1uIT1lLnZhbHVlLmNvbHVtbiYmKHQuJGRlc2lyZWRDb2x1bW49bnVsbCl9KSx0aGlzLmFuY2hvci5vbigiY2hhbmdlIixmdW5jdGlvbigpe3QuJGFuY2hvckNoYW5nZWQ9ITAsIXQuJGlzRW1wdHkmJiF0LiRzaWxlbnQmJnQuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5pc0VtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGlzRW1wdHl8fHRoaXMuYW5jaG9yLnJvdz09dGhpcy5sZWFkLnJvdyYmdGhpcy5hbmNob3IuY29sdW1uPT10aGlzLmxlYWQuY29sdW1ufSx0aGlzLmlzTXVsdGlMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuJGlzRW1wdHkmJnRoaXMuYW5jaG9yLnJvdyE9dGhpcy5jdXJzb3Iucm93fSx0aGlzLmdldEN1cnNvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxlYWQuZ2V0UG9zaXRpb24oKX0sdGhpcy5zZXRTZWxlY3Rpb25BbmNob3I9ZnVuY3Rpb24oZSx0KXt0aGlzLiRpc0VtcHR5PSExLHRoaXMuYW5jaG9yLnNldFBvc2l0aW9uKGUsdCl9LHRoaXMuZ2V0QW5jaG9yPXRoaXMuZ2V0U2VsZWN0aW9uQW5jaG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGlzRW1wdHk/dGhpcy5nZXRTZWxlY3Rpb25MZWFkKCk6dGhpcy5hbmNob3IuZ2V0UG9zaXRpb24oKX0sdGhpcy5nZXRTZWxlY3Rpb25MZWFkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZC5nZXRQb3NpdGlvbigpfSx0aGlzLmlzQmFja3dhcmRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hbmNob3IsdD10aGlzLmxlYWQ7cmV0dXJuIGUucm93PnQucm93fHxlLnJvdz09dC5yb3cmJmUuY29sdW1uPnQuY29sdW1ufSx0aGlzLmdldFJhbmdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5hbmNob3IsdD10aGlzLmxlYWQ7cmV0dXJuIHRoaXMuJGlzRW1wdHk/by5mcm9tUG9pbnRzKHQsdCk6dGhpcy5pc0JhY2t3YXJkcygpP28uZnJvbVBvaW50cyh0LGUpOm8uZnJvbVBvaW50cyhlLHQpfSx0aGlzLmNsZWFyU2VsZWN0aW9uPWZ1bmN0aW9uKCl7dGhpcy4kaXNFbXB0eXx8KHRoaXMuJGlzRW1wdHk9ITAsdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIikpfSx0aGlzLnNlbGVjdEFsbD1mdW5jdGlvbigpe3RoaXMuJHNldFNlbGVjdGlvbigwLDAsTnVtYmVyLk1BWF9WQUxVRSxOdW1iZXIuTUFYX1ZBTFVFKX0sdGhpcy5zZXRSYW5nZT10aGlzLnNldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dD9lLmVuZDplLnN0YXJ0LHI9dD9lLnN0YXJ0OmUuZW5kO3RoaXMuJHNldFNlbGVjdGlvbihuLnJvdyxuLmNvbHVtbixyLnJvdyxyLmNvbHVtbil9LHRoaXMuJHNldFNlbGVjdGlvbj1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT10aGlzLiRpc0VtcHR5LHM9dGhpcy5pbk11bHRpU2VsZWN0TW9kZTt0aGlzLiRzaWxlbnQ9ITAsdGhpcy4kY3Vyc29yQ2hhbmdlZD10aGlzLiRhbmNob3JDaGFuZ2VkPSExLHRoaXMuYW5jaG9yLnNldFBvc2l0aW9uKGUsdCksdGhpcy5jdXJzb3Iuc2V0UG9zaXRpb24obixyKSx0aGlzLiRpc0VtcHR5PSFvLmNvbXBhcmVQb2ludHModGhpcy5hbmNob3IsdGhpcy5jdXJzb3IpLHRoaXMuJHNpbGVudD0hMSx0aGlzLiRjdXJzb3JDaGFuZ2VkJiZ0aGlzLl9lbWl0KCJjaGFuZ2VDdXJzb3IiKSwodGhpcy4kY3Vyc29yQ2hhbmdlZHx8dGhpcy4kYW5jaG9yQ2hhbmdlZHx8aSE9dGhpcy4kaXNFbXB0eXx8cykmJnRoaXMuX2VtaXQoImNoYW5nZVNlbGVjdGlvbiIpfSx0aGlzLiRtb3ZlU2VsZWN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVhZDt0aGlzLiRpc0VtcHR5JiZ0aGlzLnNldFNlbGVjdGlvbkFuY2hvcih0LnJvdyx0LmNvbHVtbiksZS5jYWxsKHRoaXMpfSx0aGlzLnNlbGVjdFRvPWZ1bmN0aW9uKGUsdCl7dGhpcy4kbW92ZVNlbGVjdGlvbihmdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvclRvKGUsdCl9KX0sdGhpcy5zZWxlY3RUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuJG1vdmVTZWxlY3Rpb24oZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSl9LHRoaXMubW92ZVRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvKGUsdCl9LHRoaXMubW92ZVRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5jbGVhclNlbGVjdGlvbigpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMuc2VsZWN0VXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvclVwKX0sdGhpcy5zZWxlY3REb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JEb3duKX0sdGhpcy5zZWxlY3RSaWdodD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yUmlnaHQpfSx0aGlzLnNlbGVjdExlZnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckxlZnQpfSx0aGlzLnNlbGVjdExpbmVTdGFydD1mdW5jdGlvbigpe3RoaXMuJG1vdmVTZWxlY3Rpb24odGhpcy5tb3ZlQ3Vyc29yTGluZVN0YXJ0KX0sdGhpcy5zZWxlY3RMaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JMaW5lRW5kKX0sdGhpcy5zZWxlY3RGaWxlRW5kPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JGaWxlRW5kKX0sdGhpcy5zZWxlY3RGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlU2VsZWN0aW9uKHRoaXMubW92ZUN1cnNvckZpbGVTdGFydCl9LHRoaXMuc2VsZWN0V29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQpfSx0aGlzLnNlbGVjdFdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy4kbW92ZVNlbGVjdGlvbih0aGlzLm1vdmVDdXJzb3JXb3JkTGVmdCl9LHRoaXMuZ2V0V29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIHQ9PSJ1bmRlZmluZWQiKXt2YXIgbj1lfHx0aGlzLmxlYWQ7ZT1uLnJvdyx0PW4uY29sdW1ufXJldHVybiB0aGlzLnNlc3Npb24uZ2V0V29yZFJhbmdlKGUsdCl9LHRoaXMuc2VsZWN0V29yZD1mdW5jdGlvbigpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodGhpcy5nZXRXb3JkUmFuZ2UoKSl9LHRoaXMuc2VsZWN0QVdvcmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEN1cnNvcigpLHQ9dGhpcy5zZXNzaW9uLmdldEFXb3JkUmFuZ2UoZS5yb3csZS5jb2x1bW4pO3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UodCl9LHRoaXMuZ2V0TGluZVJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGU9PSJudW1iZXIiP2U6dGhpcy5sZWFkLnJvdyxyLGk9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKG4pO3JldHVybiBpPyhuPWkuc3RhcnQucm93LHI9aS5lbmQucm93KTpyPW4sdD09PSEwP25ldyBvKG4sMCxyLHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHIpLmxlbmd0aCk6bmV3IG8obiwwLHIrMSwwKX0sdGhpcy5zZWxlY3RMaW5lPWZ1bmN0aW9uKCl7dGhpcy5zZXRTZWxlY3Rpb25SYW5nZSh0aGlzLmdldExpbmVSYW5nZSgpKX0sdGhpcy5tb3ZlQ3Vyc29yVXA9ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JCeSgtMSwwKX0sdGhpcy5tb3ZlQ3Vyc29yRG93bj1mdW5jdGlvbigpe3RoaXMubW92ZUN1cnNvckJ5KDEsMCl9LHRoaXMud291bGRNb3ZlSW50b1NvZnRUYWI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY29sdW1uLGk9ZS5jb2x1bW4rdDtyZXR1cm4gbjwwJiYocj1lLmNvbHVtbi10LGk9ZS5jb2x1bW4pLHRoaXMuc2Vzc2lvbi5pc1RhYlN0b3AoZSkmJnRoaXMuZG9jLmdldExpbmUoZS5yb3cpLnNsaWNlKHIsaSkuc3BsaXQoIiAiKS5sZW5ndGgtMT09dH0sdGhpcy5tb3ZlQ3Vyc29yTGVmdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5nZXRQb3NpdGlvbigpLHQ7aWYodD10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LGUuY29sdW1uLC0xKSl0aGlzLm1vdmVDdXJzb3JUbyh0LnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbik7ZWxzZSBpZihlLmNvbHVtbj09PTApZS5yb3c+MCYmdGhpcy5tb3ZlQ3Vyc29yVG8oZS5yb3ctMSx0aGlzLmRvYy5nZXRMaW5lKGUucm93LTEpLmxlbmd0aCk7ZWxzZXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpO3RoaXMud291bGRNb3ZlSW50b1NvZnRUYWIoZSxuLC0xKSYmIXRoaXMuc2Vzc2lvbi5nZXROYXZpZ2F0ZVdpdGhpblNvZnRUYWJzKCk/dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtbik6dGhpcy5tb3ZlQ3Vyc29yQnkoMCwtMSl9fSx0aGlzLm1vdmVDdXJzb3JSaWdodD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZC5nZXRQb3NpdGlvbigpLHQ7aWYodD10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LGUuY29sdW1uLDEpKXRoaXMubW92ZUN1cnNvclRvKHQuZW5kLnJvdyx0LmVuZC5jb2x1bW4pO2Vsc2UgaWYodGhpcy5sZWFkLmNvbHVtbj09dGhpcy5kb2MuZ2V0TGluZSh0aGlzLmxlYWQucm93KS5sZW5ndGgpdGhpcy5sZWFkLnJvdzx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xJiZ0aGlzLm1vdmVDdXJzb3JUbyh0aGlzLmxlYWQucm93KzEsMCk7ZWxzZXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGFiU2l6ZSgpLGU9dGhpcy5sZWFkO3RoaXMud291bGRNb3ZlSW50b1NvZnRUYWIoZSxuLDEpJiYhdGhpcy5zZXNzaW9uLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnMoKT90aGlzLm1vdmVDdXJzb3JCeSgwLG4pOnRoaXMubW92ZUN1cnNvckJ5KDAsMSl9fSx0aGlzLm1vdmVDdXJzb3JMaW5lU3RhcnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCkscj10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKG4sMCksaT10aGlzLnNlc3Npb24uZ2V0RGlzcGxheUxpbmUoZSxudWxsLHIucm93LHIuY29sdW1uKSxzPWkubWF0Y2goL15ccyovKTtzWzBdLmxlbmd0aCE9dCYmIXRoaXMuc2Vzc2lvbi4kdXNlRW1hY3NTdHlsZUxpbmVTdGFydCYmKHIuY29sdW1uKz1zWzBdLmxlbmd0aCksdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbihyKX0sdGhpcy5tb3ZlQ3Vyc29yTGluZUVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVhZCx0PXRoaXMuc2Vzc2lvbi5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbihlLnJvdyxlLmNvbHVtbik7aWYodGhpcy5sZWFkLmNvbHVtbj09dC5jb2x1bW4pe3ZhciBuPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHQucm93KTtpZih0LmNvbHVtbj09bi5sZW5ndGgpe3ZhciByPW4uc2VhcmNoKC9ccyskLyk7cj4wJiYodC5jb2x1bW49cil9fXRoaXMubW92ZUN1cnNvclRvKHQucm93LHQuY29sdW1uKX0sdGhpcy5tb3ZlQ3Vyc29yRmlsZUVuZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZG9jLmdldExlbmd0aCgpLTEsdD10aGlzLmRvYy5nZXRMaW5lKGUpLmxlbmd0aDt0aGlzLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JGaWxlU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLm1vdmVDdXJzb3JUbygwLDApfSx0aGlzLm1vdmVDdXJzb3JMb25nV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbj10aGlzLmRvYy5nZXRMaW5lKGUpLHI9bi5zdWJzdHJpbmcodCk7dGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAsdGhpcy5zZXNzaW9uLnRva2VuUmUubGFzdEluZGV4PTA7dmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7aWYoaSl7dGhpcy5tb3ZlQ3Vyc29yVG8oaS5lbmQucm93LGkuZW5kLmNvbHVtbik7cmV0dXJufXRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMocikmJih0Kz10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgsdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTAscj1uLnN1YnN0cmluZyh0KSk7aWYodD49bi5sZW5ndGgpe3RoaXMubW92ZUN1cnNvclRvKGUsbi5sZW5ndGgpLHRoaXMubW92ZUN1cnNvclJpZ2h0KCksZTx0aGlzLmRvYy5nZXRMZW5ndGgoKS0xJiZ0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQoKTtyZXR1cm59dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhyKSYmKHQrPXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy5tb3ZlQ3Vyc29yTG9uZ1dvcmRMZWZ0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZWFkLnJvdyx0PXRoaXMubGVhZC5jb2x1bW4sbjtpZihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LC0xKSl7dGhpcy5tb3ZlQ3Vyc29yVG8obi5zdGFydC5yb3csbi5zdGFydC5jb2x1bW4pO3JldHVybn12YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZFN0cmluZ0F0KGUsdCwtMSk7cj09bnVsbCYmKHI9dGhpcy5kb2MuZ2V0TGluZShlKS5zdWJzdHJpbmcoMCx0KSk7dmFyIHM9aS5zdHJpbmdSZXZlcnNlKHIpO3RoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleD0wLHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmV4ZWMocykmJih0LT10aGlzLnNlc3Npb24ubm9uVG9rZW5SZS5sYXN0SW5kZXgscz1zLnNsaWNlKHRoaXMuc2Vzc2lvbi5ub25Ub2tlblJlLmxhc3RJbmRleCksdGhpcy5zZXNzaW9uLm5vblRva2VuUmUubGFzdEluZGV4PTApO2lmKHQ8PTApe3RoaXMubW92ZUN1cnNvclRvKGUsMCksdGhpcy5tb3ZlQ3Vyc29yTGVmdCgpLGU+MCYmdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQoKTtyZXR1cm59dGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhzKSYmKHQtPXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleCx0aGlzLnNlc3Npb24udG9rZW5SZS5sYXN0SW5kZXg9MCksdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0KX0sdGhpcy4kc2hvcnRXb3JkRW5kSW5kZXg9ZnVuY3Rpb24oZSl7dmFyIHQ9MCxuLHI9L1xzLyxpPXRoaXMuc2Vzc2lvbi50b2tlblJlO2kubGFzdEluZGV4PTA7aWYodGhpcy5zZXNzaW9uLnRva2VuUmUuZXhlYyhlKSl0PXRoaXMuc2Vzc2lvbi50b2tlblJlLmxhc3RJbmRleDtlbHNle3doaWxlKChuPWVbdF0pJiZyLnRlc3QobikpdCsrO2lmKHQ8MSl7aS5sYXN0SW5kZXg9MDt3aGlsZSgobj1lW3RdKSYmIWkudGVzdChuKSl7aS5sYXN0SW5kZXg9MCx0Kys7aWYoci50ZXN0KG4pKXtpZih0PjIpe3QtLTticmVha313aGlsZSgobj1lW3RdKSYmci50ZXN0KG4pKXQrKztpZih0PjIpYnJlYWt9fX19cmV0dXJuIGkubGFzdEluZGV4PTAsdH0sdGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuPXRoaXMuZG9jLmdldExpbmUoZSkscj1uLnN1YnN0cmluZyh0KSxpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkQXQoZSx0LDEpO2lmKGkpcmV0dXJuIHRoaXMubW92ZUN1cnNvclRvKGkuZW5kLnJvdyxpLmVuZC5jb2x1bW4pO2lmKHQ9PW4ubGVuZ3RoKXt2YXIgcz10aGlzLmRvYy5nZXRMZW5ndGgoKTtkbyBlKysscj10aGlzLmRvYy5nZXRMaW5lKGUpO3doaWxlKGU8cyYmL15ccyokLy50ZXN0KHIpKTsvXlxzKy8udGVzdChyKXx8KHI9IiIpLHQ9MH12YXIgbz10aGlzLiRzaG9ydFdvcmRFbmRJbmRleChyKTt0aGlzLm1vdmVDdXJzb3JUbyhlLHQrbyl9LHRoaXMubW92ZUN1cnNvclNob3J0V29yZExlZnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmxlYWQucm93LHQ9dGhpcy5sZWFkLmNvbHVtbixuO2lmKG49dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsLTEpKXJldHVybiB0aGlzLm1vdmVDdXJzb3JUbyhuLnN0YXJ0LnJvdyxuLnN0YXJ0LmNvbHVtbik7dmFyIHI9dGhpcy5zZXNzaW9uLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCk7aWYodD09PTApe2RvIGUtLSxyPXRoaXMuZG9jLmdldExpbmUoZSk7d2hpbGUoZT4wJiYvXlxzKiQvLnRlc3QocikpO3Q9ci5sZW5ndGgsL1xzKyQvLnRlc3Qocil8fChyPSIiKX12YXIgcz1pLnN0cmluZ1JldmVyc2Uociksbz10aGlzLiRzaG9ydFdvcmRFbmRJbmRleChzKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG8oZSx0LW8pfSx0aGlzLm1vdmVDdXJzb3JXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJHNlbGVjdExvbmdXb3Jkcz90aGlzLm1vdmVDdXJzb3JMb25nV29yZFJpZ2h0KCk6dGhpcy5tb3ZlQ3Vyc29yU2hvcnRXb3JkUmlnaHQoKX0sdGhpcy5tb3ZlQ3Vyc29yV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uJHNlbGVjdExvbmdXb3Jkcz90aGlzLm1vdmVDdXJzb3JMb25nV29yZExlZnQoKTp0aGlzLm1vdmVDdXJzb3JTaG9ydFdvcmRMZWZ0KCl9LHRoaXMubW92ZUN1cnNvckJ5PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmxlYWQucm93LHRoaXMubGVhZC5jb2x1bW4pLHI7dD09PTAmJihlIT09MCYmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KG4ucm93LHRoaXMubGVhZC5yb3cpPyhyPXRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuZ2V0UG9zTGVmdChuLmNvbHVtbiksbi5jb2x1bW49TWF0aC5yb3VuZChyL3RoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuY2hhcldpZHRoc1swXSkpOnI9bi5jb2x1bW4qdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5jaGFyV2lkdGhzWzBdKSx0aGlzLiRkZXNpcmVkQ29sdW1uP24uY29sdW1uPXRoaXMuJGRlc2lyZWRDb2x1bW46dGhpcy4kZGVzaXJlZENvbHVtbj1uLmNvbHVtbik7dmFyIGk9dGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLnJvdytlLG4uY29sdW1uLHIpO2UhPT0wJiZ0PT09MCYmaS5yb3c9PT10aGlzLmxlYWQucm93JiZpLmNvbHVtbj09PXRoaXMubGVhZC5jb2x1bW4mJnRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cyYmdGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2kucm93XSYmKGkucm93PjB8fGU+MCkmJmkucm93KyssdGhpcy5tb3ZlQ3Vyc29yVG8oaS5yb3csaS5jb2x1bW4rdCx0PT09MCl9LHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb249ZnVuY3Rpb24oZSl7dGhpcy5tb3ZlQ3Vyc29yVG8oZS5yb3csZS5jb2x1bW4pfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5zZXNzaW9uLmdldEZvbGRBdChlLHQsMSk7ciYmKGU9ci5zdGFydC5yb3csdD1yLnN0YXJ0LmNvbHVtbiksdGhpcy4ka2VlcERlc2lyZWRDb2x1bW5PbkNoYW5nZT0hMDt2YXIgaT10aGlzLnNlc3Npb24uZ2V0TGluZShlKTsvW1x1REMwMC1cdURGRkZdLy50ZXN0KGkuY2hhckF0KHQpKSYmaS5jaGFyQXQodC0xKSYmKHRoaXMubGVhZC5yb3c9PWUmJnRoaXMubGVhZC5jb2x1bW49PXQrMT90LT0xOnQrPTEpLHRoaXMubGVhZC5zZXRQb3NpdGlvbihlLHQpLHRoaXMuJGtlZXBEZXNpcmVkQ29sdW1uT25DaGFuZ2U9ITEsbnx8KHRoaXMuJGRlc2lyZWRDb2x1bW49bnVsbCl9LHRoaXMubW92ZUN1cnNvclRvU2NyZWVuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnNlc3Npb24uc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCk7dGhpcy5tb3ZlQ3Vyc29yVG8oci5yb3csci5jb2x1bW4sbil9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5sZWFkLmRldGFjaCgpLHRoaXMuYW5jaG9yLmRldGFjaCgpLHRoaXMuc2Vzc2lvbj10aGlzLmRvYz1udWxsfSx0aGlzLmZyb21PcmllbnRlZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0U2VsZWN0aW9uUmFuZ2UoZSxlLmN1cnNvcj09ZS5zdGFydCksdGhpcy4kZGVzaXJlZENvbHVtbj1lLmRlc2lyZWRDb2x1bW58fHRoaXMuJGRlc2lyZWRDb2x1bW59LHRoaXMudG9PcmllbnRlZFJhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0UmFuZ2UoKTtyZXR1cm4gZT8oZS5zdGFydC5jb2x1bW49dC5zdGFydC5jb2x1bW4sZS5zdGFydC5yb3c9dC5zdGFydC5yb3csZS5lbmQuY29sdW1uPXQuZW5kLmNvbHVtbixlLmVuZC5yb3c9dC5lbmQucm93KTplPXQsZS5jdXJzb3I9dGhpcy5pc0JhY2t3YXJkcygpP2Uuc3RhcnQ6ZS5lbmQsZS5kZXNpcmVkQ29sdW1uPXRoaXMuJGRlc2lyZWRDb2x1bW4sZX0sdGhpcy5nZXRSYW5nZU9mTW92ZW1lbnRzPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0Q3Vyc29yKCk7dHJ5e2UodGhpcyk7dmFyIG49dGhpcy5nZXRDdXJzb3IoKTtyZXR1cm4gby5mcm9tUG9pbnRzKHQsbil9Y2F0Y2gocil7cmV0dXJuIG8uZnJvbVBvaW50cyh0LHQpfWZpbmFsbHl7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX19LHRoaXMudG9KU09OPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50KXZhciBlPXRoaXMucmFuZ2VzLm1hcChmdW5jdGlvbihlKXt2YXIgdD1lLmNsb25lKCk7cmV0dXJuIHQuaXNCYWNrd2FyZHM9ZS5jdXJzb3I9PWUuc3RhcnQsdH0pO2Vsc2V7dmFyIGU9dGhpcy5nZXRSYW5nZSgpO2UuaXNCYWNrd2FyZHM9dGhpcy5pc0JhY2t3YXJkcygpfXJldHVybiBlfSx0aGlzLmZyb21KU09OPWZ1bmN0aW9uKGUpe2lmKGUuc3RhcnQ9PXVuZGVmaW5lZCl7aWYodGhpcy5yYW5nZUxpc3QmJmUubGVuZ3RoPjEpe3RoaXMudG9TaW5nbGVSYW5nZShlWzBdKTtmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyl7dmFyIG49by5mcm9tUG9pbnRzKGVbdF0uc3RhcnQsZVt0XS5lbmQpO2VbdF0uaXNCYWNrd2FyZHMmJihuLmN1cnNvcj1uLnN0YXJ0KSx0aGlzLmFkZFJhbmdlKG4sITApfXJldHVybn1lPWVbMF19dGhpcy5yYW5nZUxpc3QmJnRoaXMudG9TaW5nbGVSYW5nZShlKSx0aGlzLnNldFNlbGVjdGlvblJhbmdlKGUsZS5pc0JhY2t3YXJkcyl9LHRoaXMuaXNFcXVhbD1mdW5jdGlvbihlKXtpZigoZS5sZW5ndGh8fHRoaXMucmFuZ2VDb3VudCkmJmUubGVuZ3RoIT10aGlzLnJhbmdlQ291bnQpcmV0dXJuITE7aWYoIWUubGVuZ3RofHwhdGhpcy5yYW5nZXMpcmV0dXJuIHRoaXMuZ2V0UmFuZ2UoKS5pc0VxdWFsKGUpO2Zvcih2YXIgdD10aGlzLnJhbmdlcy5sZW5ndGg7dC0tOylpZighdGhpcy5yYW5nZXNbdF0uaXNFcXVhbChlW3RdKSlyZXR1cm4hMTtyZXR1cm4hMH19KS5jYWxsKHUucHJvdG90eXBlKSx0LlNlbGVjdGlvbj11fSksYWNlLmRlZmluZSgiYWNlL3Rva2VuaXplciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vY29uZmlnIiksaT0yZTMscz1mdW5jdGlvbihlKXt0aGlzLnN0YXRlcz1lLHRoaXMucmVnRXhwcz17fSx0aGlzLm1hdGNoTWFwcGluZ3M9e307Zm9yKHZhciB0IGluIHRoaXMuc3RhdGVzKXt2YXIgbj10aGlzLnN0YXRlc1t0XSxyPVtdLGk9MCxzPXRoaXMubWF0Y2hNYXBwaW5nc1t0XT17ZGVmYXVsdFRva2VuOiJ0ZXh0In0sbz0iZyIsdT1bXTtmb3IodmFyIGE9MDthPG4ubGVuZ3RoO2ErKyl7dmFyIGY9blthXTtmLmRlZmF1bHRUb2tlbiYmKHMuZGVmYXVsdFRva2VuPWYuZGVmYXVsdFRva2VuKSxmLmNhc2VJbnNlbnNpdGl2ZSYmKG89ImdpIik7aWYoZi5yZWdleD09bnVsbCljb250aW51ZTtmLnJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwJiYoZi5yZWdleD1mLnJlZ2V4LnRvU3RyaW5nKCkuc2xpY2UoMSwtMSkpO3ZhciBsPWYucmVnZXgsYz0obmV3IFJlZ0V4cCgiKD86KCIrbCsiKXwoLikpIikpLmV4ZWMoImEiKS5sZW5ndGgtMjtBcnJheS5pc0FycmF5KGYudG9rZW4pP2YudG9rZW4ubGVuZ3RoPT0xfHxjPT0xP2YudG9rZW49Zi50b2tlblswXTpjLTEhPWYudG9rZW4ubGVuZ3RoPyh0aGlzLnJlcG9ydEVycm9yKCJudW1iZXIgb2YgY2xhc3NlcyBhbmQgcmVnZXhwIGdyb3VwcyBkb2Vzbid0IG1hdGNoIix7cnVsZTpmLGdyb3VwQ291bnQ6Yy0xfSksZi50b2tlbj1mLnRva2VuWzBdKTooZi50b2tlbkFycmF5PWYudG9rZW4sZi50b2tlbj1udWxsLGYub25NYXRjaD10aGlzLiRhcnJheVRva2Vucyk6dHlwZW9mIGYudG9rZW49PSJmdW5jdGlvbiImJiFmLm9uTWF0Y2gmJihjPjE/Zi5vbk1hdGNoPXRoaXMuJGFwcGx5VG9rZW46Zi5vbk1hdGNoPWYudG9rZW4pLGM+MSYmKC9cXFxkLy50ZXN0KGYucmVnZXgpP2w9Zi5yZWdleC5yZXBsYWNlKC9cXChbMC05XSspL2csZnVuY3Rpb24oZSx0KXtyZXR1cm4iXFwiKyhwYXJzZUludCh0LDEwKStpKzEpfSk6KGM9MSxsPXRoaXMucmVtb3ZlQ2FwdHVyaW5nR3JvdXBzKGYucmVnZXgpKSwhZi5zcGxpdFJlZ2V4JiZ0eXBlb2YgZi50b2tlbiE9InN0cmluZyImJnUucHVzaChmKSksc1tpXT1hLGkrPWMsci5wdXNoKGwpLGYub25NYXRjaHx8KGYub25NYXRjaD1udWxsKX1yLmxlbmd0aHx8KHNbMF09MCxyLnB1c2goIiQiKSksdS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uuc3BsaXRSZWdleD10aGlzLmNyZWF0ZVNwbGl0dGVyUmVnZXhwKGUucmVnZXgsbyl9LHRoaXMpLHRoaXMucmVnRXhwc1t0XT1uZXcgUmVnRXhwKCIoIityLmpvaW4oIil8KCIpKyIpfCgkKSIsbyl9fTsoZnVuY3Rpb24oKXt0aGlzLiRzZXRNYXhUb2tlbkNvdW50PWZ1bmN0aW9uKGUpe2k9ZXwwfSx0aGlzLiRhcHBseVRva2VuPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc3BsaXRSZWdleC5leGVjKGUpLnNsaWNlKDEpLG49dGhpcy50b2tlbi5hcHBseSh0aGlzLHQpO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm5be3R5cGU6bix2YWx1ZTplfV07dmFyIHI9W107Zm9yKHZhciBpPTAscz1uLmxlbmd0aDtpPHM7aSsrKXRbaV0mJihyW3IubGVuZ3RoXT17dHlwZTpuW2ldLHZhbHVlOnRbaV19KTtyZXR1cm4gcn0sdGhpcy4kYXJyYXlUb2tlbnM9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuW107dmFyIHQ9dGhpcy5zcGxpdFJlZ2V4LmV4ZWMoZSk7aWYoIXQpcmV0dXJuInRleHQiO3ZhciBuPVtdLHI9dGhpcy50b2tlbkFycmF5O2Zvcih2YXIgaT0wLHM9ci5sZW5ndGg7aTxzO2krKyl0W2krMV0mJihuW24ubGVuZ3RoXT17dHlwZTpyW2ldLHZhbHVlOnRbaSsxXX0pO3JldHVybiBufSx0aGlzLnJlbW92ZUNhcHR1cmluZ0dyb3Vwcz1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoL1xcLnxcWyg/OlxcLnxbXlxcXF1dKSp8XChcP1s6PSFdfChcKCkvZyxmdW5jdGlvbihlLHQpe3JldHVybiB0PyIoPzoiOmV9KTtyZXR1cm4gdH0sdGhpcy5jcmVhdGVTcGxpdHRlclJlZ2V4cD1mdW5jdGlvbihlLHQpe2lmKGUuaW5kZXhPZigiKD89IikhPS0xKXt2YXIgbj0wLHI9ITEsaT17fTtlLnJlcGxhY2UoLyhcXC4pfChcKCg/Olw/Wz0hXSk/KXwoXCkpfChbXFtcXV0pL2csZnVuY3Rpb24oZSx0LHMsbyx1LGEpe3JldHVybiByP3I9dSE9Il0iOnU/cj0hMDpvPyhuPT1pLnN0YWNrJiYoaS5lbmQ9YSsxLGkuc3RhY2s9LTEpLG4tLSk6cyYmKG4rKyxzLmxlbmd0aCE9MSYmKGkuc3RhY2s9bixpLnN0YXJ0PWEpKSxlfSksaS5lbmQhPW51bGwmJi9eXCkqJC8udGVzdChlLnN1YnN0cihpLmVuZCkpJiYoZT1lLnN1YnN0cmluZygwLGkuc3RhcnQpK2Uuc3Vic3RyKGkuZW5kKSl9cmV0dXJuIGUuY2hhckF0KDApIT0iXiImJihlPSJeIitlKSxlLmNoYXJBdChlLmxlbmd0aC0xKSE9IiQiJiYoZSs9IiQiKSxuZXcgUmVnRXhwKGUsKHR8fCIiKS5yZXBsYWNlKCJnIiwiIikpfSx0aGlzLmdldExpbmVUb2tlbnM9ZnVuY3Rpb24oZSx0KXtpZih0JiZ0eXBlb2YgdCE9InN0cmluZyIpe3ZhciBuPXQuc2xpY2UoMCk7dD1uWzBdLHQ9PT0iI3RtcCImJihuLnNoaWZ0KCksdD1uLnNoaWZ0KCkpfWVsc2UgdmFyIG49W107dmFyIHI9dHx8InN0YXJ0IixzPXRoaXMuc3RhdGVzW3JdO3N8fChyPSJzdGFydCIscz10aGlzLnN0YXRlc1tyXSk7dmFyIG89dGhpcy5tYXRjaE1hcHBpbmdzW3JdLHU9dGhpcy5yZWdFeHBzW3JdO3UubGFzdEluZGV4PTA7dmFyIGEsZj1bXSxsPTAsYz0wLGg9e3R5cGU6bnVsbCx2YWx1ZToiIn07d2hpbGUoYT11LmV4ZWMoZSkpe3ZhciBwPW8uZGVmYXVsdFRva2VuLGQ9bnVsbCx2PWFbMF0sbT11Lmxhc3RJbmRleDtpZihtLXYubGVuZ3RoPmwpe3ZhciBnPWUuc3Vic3RyaW5nKGwsbS12Lmxlbmd0aCk7aC50eXBlPT1wP2gudmFsdWUrPWc6KGgudHlwZSYmZi5wdXNoKGgpLGg9e3R5cGU6cCx2YWx1ZTpnfSl9Zm9yKHZhciB5PTA7eTxhLmxlbmd0aC0yO3krKyl7aWYoYVt5KzFdPT09dW5kZWZpbmVkKWNvbnRpbnVlO2Q9c1tvW3ldXSxkLm9uTWF0Y2g/cD1kLm9uTWF0Y2godixyLG4sZSk6cD1kLnRva2VuLGQubmV4dCYmKHR5cGVvZiBkLm5leHQ9PSJzdHJpbmciP3I9ZC5uZXh0OnI9ZC5uZXh0KHIsbikscz10aGlzLnN0YXRlc1tyXSxzfHwodGhpcy5yZXBvcnRFcnJvcigic3RhdGUgZG9lc24ndCBleGlzdCIscikscj0ic3RhcnQiLHM9dGhpcy5zdGF0ZXNbcl0pLG89dGhpcy5tYXRjaE1hcHBpbmdzW3JdLGw9bSx1PXRoaXMucmVnRXhwc1tyXSx1Lmxhc3RJbmRleD1tKSxkLmNvbnN1bWVMaW5lRW5kJiYobD1tKTticmVha31pZih2KWlmKHR5cGVvZiBwPT0ic3RyaW5nIikhIWQmJmQubWVyZ2U9PT0hMXx8aC50eXBlIT09cD8oaC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpwLHZhbHVlOnZ9KTpoLnZhbHVlKz12O2Vsc2UgaWYocCl7aC50eXBlJiZmLnB1c2goaCksaD17dHlwZTpudWxsLHZhbHVlOiIifTtmb3IodmFyIHk9MDt5PHAubGVuZ3RoO3krKylmLnB1c2gocFt5XSl9aWYobD09ZS5sZW5ndGgpYnJlYWs7bD1tO2lmKGMrKz5pKXtjPjIqZS5sZW5ndGgmJnRoaXMucmVwb3J0RXJyb3IoImluZmluaXRlIGxvb3Agd2l0aCBpbiBhY2UgdG9rZW5pemVyIix7c3RhcnRTdGF0ZTp0LGxpbmU6ZX0pO3doaWxlKGw8ZS5sZW5ndGgpaC50eXBlJiZmLnB1c2goaCksaD17dmFsdWU6ZS5zdWJzdHJpbmcobCxsKz01MDApLHR5cGU6Im92ZXJmbG93In07cj0ic3RhcnQiLG49W107YnJlYWt9fXJldHVybiBoLnR5cGUmJmYucHVzaChoKSxuLmxlbmd0aD4xJiZuWzBdIT09ciYmbi51bnNoaWZ0KCIjdG1wIixyKSx7dG9rZW5zOmYsc3RhdGU6bi5sZW5ndGg/bjpyfX0sdGhpcy5yZXBvcnRFcnJvcj1yLnJlcG9ydEVycm9yfSkuY2FsbChzLnByb3RvdHlwZSksdC5Ub2tlbml6ZXI9c30pLGFjZS5kZWZpbmUoImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvbGFuZyIpLGk9ZnVuY3Rpb24oKXt0aGlzLiRydWxlcz17c3RhcnQ6W3t0b2tlbjoiZW1wdHlfbGluZSIscmVnZXg6Il4kIn0se2RlZmF1bHRUb2tlbjoidGV4dCJ9XX19OyhmdW5jdGlvbigpe3RoaXMuYWRkUnVsZXM9ZnVuY3Rpb24oZSx0KXtpZighdCl7Zm9yKHZhciBuIGluIGUpdGhpcy4kcnVsZXNbbl09ZVtuXTtyZXR1cm59Zm9yKHZhciBuIGluIGUpe3ZhciByPWVbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV07aWYocy5uZXh0fHxzLm9uTWF0Y2gpdHlwZW9mIHMubmV4dD09InN0cmluZyImJnMubmV4dC5pbmRleE9mKHQpIT09MCYmKHMubmV4dD10K3MubmV4dCkscy5uZXh0U3RhdGUmJnMubmV4dFN0YXRlLmluZGV4T2YodCkhPT0wJiYocy5uZXh0U3RhdGU9dCtzLm5leHRTdGF0ZSl9dGhpcy4kcnVsZXNbdCtuXT1yfX0sdGhpcy5nZXRSdWxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRydWxlc30sdGhpcy5lbWJlZFJ1bGVzPWZ1bmN0aW9uKGUsdCxuLGkscyl7dmFyIG89dHlwZW9mIGU9PSJmdW5jdGlvbiI/KG5ldyBlKS5nZXRSdWxlcygpOmU7aWYoaSlmb3IodmFyIHU9MDt1PGkubGVuZ3RoO3UrKylpW3VdPXQraVt1XTtlbHNle2k9W107Zm9yKHZhciBhIGluIG8paS5wdXNoKHQrYSl9dGhpcy5hZGRSdWxlcyhvLHQpO2lmKG4pe3ZhciBmPUFycmF5LnByb3RvdHlwZVtzPyJwdXNoIjoidW5zaGlmdCJdO2Zvcih2YXIgdT0wO3U8aS5sZW5ndGg7dSsrKWYuYXBwbHkodGhpcy4kcnVsZXNbaVt1XV0sci5kZWVwQ29weShuKSl9dGhpcy4kZW1iZWRzfHwodGhpcy4kZW1iZWRzPVtdKSx0aGlzLiRlbWJlZHMucHVzaCh0KX0sdGhpcy5nZXRFbWJlZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZW1iZWRzfTt2YXIgZT1mdW5jdGlvbihlLHQpe3JldHVybihlIT0ic3RhcnQifHx0Lmxlbmd0aCkmJnQudW5zaGlmdCh0aGlzLm5leHRTdGF0ZSxlKSx0aGlzLm5leHRTdGF0ZX0sdD1mdW5jdGlvbihlLHQpe3JldHVybiB0LnNoaWZ0KCksdC5zaGlmdCgpfHwic3RhcnQifTt0aGlzLm5vcm1hbGl6ZVJ1bGVzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaShzKXt2YXIgbz1yW3NdO28ucHJvY2Vzc2VkPSEwO2Zvcih2YXIgdT0wO3U8by5sZW5ndGg7dSsrKXt2YXIgYT1vW3VdLGY9bnVsbDtBcnJheS5pc0FycmF5KGEpJiYoZj1hLGE9e30pLCFhLnJlZ2V4JiZhLnN0YXJ0JiYoYS5yZWdleD1hLnN0YXJ0LGEubmV4dHx8KGEubmV4dD1bXSksYS5uZXh0LnB1c2goe2RlZmF1bHRUb2tlbjphLnRva2VufSx7dG9rZW46YS50b2tlbisiLmVuZCIscmVnZXg6YS5lbmR8fGEuc3RhcnQsbmV4dDoicG9wIn0pLGEudG9rZW49YS50b2tlbisiLnN0YXJ0IixhLnB1c2g9ITApO3ZhciBsPWEubmV4dHx8YS5wdXNoO2lmKGwmJkFycmF5LmlzQXJyYXkobCkpe3ZhciBjPWEuc3RhdGVOYW1lO2N8fChjPWEudG9rZW4sdHlwZW9mIGMhPSJzdHJpbmciJiYoYz1jWzBdfHwiIikscltjXSYmKGMrPW4rKykpLHJbY109bCxhLm5leHQ9YyxpKGMpfWVsc2UgbD09InBvcCImJihhLm5leHQ9dCk7YS5wdXNoJiYoYS5uZXh0U3RhdGU9YS5uZXh0fHxhLnB1c2gsYS5uZXh0PWUsZGVsZXRlIGEucHVzaCk7aWYoYS5ydWxlcylmb3IodmFyIGggaW4gYS5ydWxlcylyW2hdP3JbaF0ucHVzaCYmcltoXS5wdXNoLmFwcGx5KHJbaF0sYS5ydWxlc1toXSk6cltoXT1hLnJ1bGVzW2hdO3ZhciBwPXR5cGVvZiBhPT0ic3RyaW5nIj9hOmEuaW5jbHVkZTtwJiYoQXJyYXkuaXNBcnJheShwKT9mPXAubWFwKGZ1bmN0aW9uKGUpe3JldHVybiByW2VdfSk6Zj1yW3BdKTtpZihmKXt2YXIgZD1bdSwxXS5jb25jYXQoZik7YS5ub0VzY2FwZSYmKGQ9ZC5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUubmV4dH0pKSxvLnNwbGljZS5hcHBseShvLGQpLHUtLX1hLmtleXdvcmRNYXAmJihhLnRva2VuPXRoaXMuY3JlYXRlS2V5d29yZE1hcHBlcihhLmtleXdvcmRNYXAsYS5kZWZhdWx0VG9rZW58fCJ0ZXh0IixhLmNhc2VJbnNlbnNpdGl2ZSksZGVsZXRlIGEuZGVmYXVsdFRva2VuKX19dmFyIG49MCxyPXRoaXMuJHJ1bGVzO09iamVjdC5rZXlzKHIpLmZvckVhY2goaSx0aGlzKX0sdGhpcy5jcmVhdGVLZXl3b3JkTWFwcGVyPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIHM9ZVt0XTtuJiYocz1zLnRvTG93ZXJDYXNlKCkpO3ZhciBvPXMuc3BsaXQocnx8InwiKTtmb3IodmFyIHU9by5sZW5ndGg7dS0tOylpW29bdV1dPXR9KSxPYmplY3QuZ2V0UHJvdG90eXBlT2YoaSkmJihpLl9fcHJvdG9fXz1udWxsKSx0aGlzLiRrZXl3b3JkTGlzdD1PYmplY3Qua2V5cyhpKSxlPW51bGwsbj9mdW5jdGlvbihlKXtyZXR1cm4gaVtlLnRvTG93ZXJDYXNlKCldfHx0fTpmdW5jdGlvbihlKXtyZXR1cm4gaVtlXXx8dH19LHRoaXMuZ2V0S2V5d29yZHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4ka2V5d29yZHN9fSkuY2FsbChpLnByb3RvdHlwZSksdC5UZXh0SGlnaGxpZ2h0UnVsZXM9aX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oKXt0aGlzLiRiZWhhdmlvdXJzPXt9fTsoZnVuY3Rpb24oKXt0aGlzLmFkZD1mdW5jdGlvbihlLHQsbil7c3dpdGNoKHVuZGVmaW5lZCl7Y2FzZSB0aGlzLiRiZWhhdmlvdXJzOnRoaXMuJGJlaGF2aW91cnM9e307Y2FzZSB0aGlzLiRiZWhhdmlvdXJzW2VdOnRoaXMuJGJlaGF2aW91cnNbZV09e319dGhpcy4kYmVoYXZpb3Vyc1tlXVt0XT1ufSx0aGlzLmFkZEJlaGF2aW91cnM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpZm9yKHZhciBuIGluIGVbdF0pdGhpcy5hZGQodCxuLGVbdF1bbl0pfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt0aGlzLiRiZWhhdmlvdXJzJiZ0aGlzLiRiZWhhdmlvdXJzW2VdJiZkZWxldGUgdGhpcy4kYmVoYXZpb3Vyc1tlXX0sdGhpcy5pbmhlcml0PWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpdmFyIG49KG5ldyBlKS5nZXRCZWhhdmlvdXJzKHQpO2Vsc2UgdmFyIG49ZS5nZXRCZWhhdmlvdXJzKHQpO3RoaXMuYWRkQmVoYXZpb3VycyhuKX0sdGhpcy5nZXRCZWhhdmlvdXJzPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiB0aGlzLiRiZWhhdmlvdXJzO3ZhciB0PXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuJGJlaGF2aW91cnNbZVtuXV0mJih0W2Vbbl1dPXRoaXMuJGJlaGF2aW91cnNbZVtuXV0pO3JldHVybiB0fX0pLmNhbGwoci5wcm90b3R5cGUpLHQuQmVoYXZpb3VyPXJ9KSxhY2UuZGVmaW5lKCJhY2UvdG9rZW5faXRlcmF0b3IiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRzZXNzaW9uPWUsdGhpcy4kcm93PXQsdGhpcy4kcm93VG9rZW5zPWUuZ2V0VG9rZW5zKHQpO3ZhciByPWUuZ2V0VG9rZW5BdCh0LG4pO3RoaXMuJHRva2VuSW5kZXg9cj9yLmluZGV4Oi0xfTsoZnVuY3Rpb24oKXt0aGlzLnN0ZXBCYWNrd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgtPTE7d2hpbGUodGhpcy4kdG9rZW5JbmRleDwwKXt0aGlzLiRyb3ctPTE7aWYodGhpcy4kcm93PDApcmV0dXJuIHRoaXMuJHJvdz0wLG51bGw7dGhpcy4kcm93VG9rZW5zPXRoaXMuJHNlc3Npb24uZ2V0VG9rZW5zKHRoaXMuJHJvdyksdGhpcy4kdG9rZW5JbmRleD10aGlzLiRyb3dUb2tlbnMubGVuZ3RoLTF9cmV0dXJuIHRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XX0sdGhpcy5zdGVwRm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuJHRva2VuSW5kZXgrPTE7dmFyIGU7d2hpbGUodGhpcy4kdG9rZW5JbmRleD49dGhpcy4kcm93VG9rZW5zLmxlbmd0aCl7dGhpcy4kcm93Kz0xLGV8fChlPXRoaXMuJHNlc3Npb24uZ2V0TGVuZ3RoKCkpO2lmKHRoaXMuJHJvdz49ZSlyZXR1cm4gdGhpcy4kcm93PWUtMSxudWxsO3RoaXMuJHJvd1Rva2Vucz10aGlzLiRzZXNzaW9uLmdldFRva2Vucyh0aGlzLiRyb3cpLHRoaXMuJHRva2VuSW5kZXg9MH1yZXR1cm4gdGhpcy4kcm93VG9rZW5zW3RoaXMuJHRva2VuSW5kZXhdfSx0aGlzLmdldEN1cnJlbnRUb2tlbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRyb3dUb2tlbnNbdGhpcy4kdG9rZW5JbmRleF19LHRoaXMuZ2V0Q3VycmVudFRva2VuUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJvd30sdGhpcy5nZXRDdXJyZW50VG9rZW5Db2x1bW49ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRyb3dUb2tlbnMsdD10aGlzLiR0b2tlbkluZGV4LG49ZVt0XS5zdGFydDtpZihuIT09dW5kZWZpbmVkKXJldHVybiBuO249MDt3aGlsZSh0PjApdC09MSxuKz1lW3RdLnZhbHVlLmxlbmd0aDtyZXR1cm4gbn0sdGhpcy5nZXRDdXJyZW50VG9rZW5Qb3NpdGlvbj1mdW5jdGlvbigpe3JldHVybntyb3c6dGhpcy4kcm93LGNvbHVtbjp0aGlzLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX0sdGhpcy5nZXRDdXJyZW50VG9rZW5SYW5nZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHJvd1Rva2Vuc1t0aGlzLiR0b2tlbkluZGV4XSx0PXRoaXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCk7cmV0dXJuIG5ldyByKHRoaXMuJHJvdyx0LHRoaXMuJHJvdyx0K2UudmFsdWUubGVuZ3RoKX19KS5jYWxsKGkucHJvdG90eXBlKSx0LlRva2VuSXRlcmF0b3I9aX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2JlaGF2aW91ciIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9saWIvbGFuZyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vLi4vbGliL29vcCIpLGk9ZSgiLi4vYmVoYXZpb3VyIikuQmVoYXZpb3VyLHM9ZSgiLi4vLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLG89ZSgiLi4vLi4vbGliL2xhbmciKSx1PVsidGV4dCIsInBhcmVuLnJwYXJlbiIsInJwYXJlbiIsInBhcmVuIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiXSxhPVsidGV4dCIsInBhcmVuLnJwYXJlbiIsInJwYXJlbiIsInBhcmVuIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJjb21tZW50Il0sZixsPXt9LGM9eyciJzonIicsIiciOiInIn0saD1mdW5jdGlvbihlKXt2YXIgdD0tMTtlLm11bHRpU2VsZWN0JiYodD1lLnNlbGVjdGlvbi5pbmRleCxsLnJhbmdlQ291bnQhPWUubXVsdGlTZWxlY3QucmFuZ2VDb3VudCYmKGw9e3JhbmdlQ291bnQ6ZS5tdWx0aVNlbGVjdC5yYW5nZUNvdW50fSkpO2lmKGxbdF0pcmV0dXJuIGY9bFt0XTtmPWxbdF09e2F1dG9JbnNlcnRlZEJyYWNrZXRzOjAsYXV0b0luc2VydGVkUm93Oi0xLGF1dG9JbnNlcnRlZExpbmVFbmQ6IiIsbWF5YmVJbnNlcnRlZEJyYWNrZXRzOjAsbWF5YmVJbnNlcnRlZFJvdzotMSxtYXliZUluc2VydGVkTGluZVN0YXJ0OiIiLG1heWJlSW5zZXJ0ZWRMaW5lRW5kOiIifX0scD1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmVuZC5yb3ctZS5zdGFydC5yb3c7cmV0dXJue3RleHQ6bit0K3Isc2VsZWN0aW9uOlswLGUuc3RhcnQuY29sdW1uKzEsaSxlLmVuZC5jb2x1bW4rKGk/MDoxKV19fSxkPWZ1bmN0aW9uKGUpe3RoaXMuYWRkKCJicmFjZXMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKHQsbixyLGkscyl7dmFyIHU9ci5nZXRDdXJzb3JQb3NpdGlvbigpLGE9aS5kb2MuZ2V0TGluZSh1LnJvdyk7aWYocz09InsiKXtoKHIpO3ZhciBsPXIuZ2V0U2VsZWN0aW9uUmFuZ2UoKSxjPWkuZG9jLmdldFRleHRSYW5nZShsKTtpZihjIT09IiImJmMhPT0ieyImJnIuZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAobCxjLCJ7IiwifSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKHIsaSkpcmV0dXJuL1tcXVx9XCldLy50ZXN0KGFbdS5jb2x1bW5dKXx8ci5pbk11bHRpU2VsZWN0TW9kZXx8ZSYmZS5icmFjZXM/KGQucmVjb3JkQXV0b0luc2VydChyLGksIn0iKSx7dGV4dDoie30iLHNlbGVjdGlvbjpbMSwxXX0pOihkLnJlY29yZE1heWJlSW5zZXJ0KHIsaSwieyIpLHt0ZXh0OiJ7IixzZWxlY3Rpb246WzEsMV19KX1lbHNlIGlmKHM9PSJ9Iil7aChyKTt2YXIgdj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZih2PT0ifSIpe3ZhciBtPWkuJGZpbmRPcGVuaW5nQnJhY2tldCgifSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKG0hPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEscykpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fWVsc2V7aWYocz09IlxuInx8cz09IlxyXG4iKXtoKHIpO3ZhciBnPSIiO2QuaXNNYXliZUluc2VydGVkQ2xvc2luZyh1LGEpJiYoZz1vLnN0cmluZ1JlcGVhdCgifSIsZi5tYXliZUluc2VydGVkQnJhY2tldHMpLGQuY2xlYXJNYXliZUluc2VydGVkQ2xvc2luZygpKTt2YXIgdj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZih2PT09In0iKXt2YXIgeT1pLmZpbmRNYXRjaGluZ0JyYWNrZXQoe3Jvdzp1LnJvdyxjb2x1bW46dS5jb2x1bW4rMX0sIn0iKTtpZigheSlyZXR1cm4gbnVsbDt2YXIgYj10aGlzLiRnZXRJbmRlbnQoaS5nZXRMaW5lKHkucm93KSl9ZWxzZXtpZighZyl7ZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCk7cmV0dXJufXZhciBiPXRoaXMuJGdldEluZGVudChhKX12YXIgdz1iK2kuZ2V0VGFiU3RyaW5nKCk7cmV0dXJue3RleHQ6IlxuIit3KyJcbiIrYitnLHNlbGVjdGlvbjpbMSx3Lmxlbmd0aCwxLHcubGVuZ3RoXX19ZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nKCl9fSksdGhpcy5hZGQoImJyYWNlcyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzPT0ieyIpe2gobik7dmFyIG89ci5kb2MuZ2V0TGluZShpLnN0YXJ0LnJvdyksdT1vLnN1YnN0cmluZyhpLmVuZC5jb2x1bW4saS5lbmQuY29sdW1uKzEpO2lmKHU9PSJ9IilyZXR1cm4gaS5lbmQuY29sdW1uKyssaTtmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cy0tfX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJpbnNlcnRpb24iLGZ1bmN0aW9uKGUsdCxuLHIsaSl7aWYoaT09IigiKXtoKG4pO3ZhciBzPW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxvPXIuZG9jLmdldFRleHRSYW5nZShzKTtpZihvIT09IiImJm4uZ2V0V3JhcEJlaGF2aW91cnNFbmFibGVkKCkpcmV0dXJuIHAocyxvLCIoIiwiKSIpO2lmKGQuaXNTYW5lSW5zZXJ0aW9uKG4scikpcmV0dXJuIGQucmVjb3JkQXV0b0luc2VydChuLHIsIikiKSx7dGV4dDoiKCkiLHNlbGVjdGlvbjpbMSwxXX19ZWxzZSBpZihpPT0iKSIpe2gobik7dmFyIHU9bi5nZXRDdXJzb3JQb3NpdGlvbigpLGE9ci5kb2MuZ2V0TGluZSh1LnJvdyksZj1hLnN1YnN0cmluZyh1LmNvbHVtbix1LmNvbHVtbisxKTtpZihmPT0iKSIpe3ZhciBsPXIuJGZpbmRPcGVuaW5nQnJhY2tldCgiKSIse2NvbHVtbjp1LmNvbHVtbisxLHJvdzp1LnJvd30pO2lmKGwhPT1udWxsJiZkLmlzQXV0b0luc2VydGVkQ2xvc2luZyh1LGEsaSkpcmV0dXJuIGQucG9wQXV0b0luc2VydGVkQ2xvc2luZygpLHt0ZXh0OiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJwYXJlbnMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09IigiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZih1PT0iKSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSksdGhpcy5hZGQoImJyYWNrZXRzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe2lmKGk9PSJbIil7aChuKTt2YXIgcz1uLmdldFNlbGVjdGlvblJhbmdlKCksbz1yLmRvYy5nZXRUZXh0UmFuZ2Uocyk7aWYobyE9PSIiJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHMsbywiWyIsIl0iKTtpZihkLmlzU2FuZUluc2VydGlvbihuLHIpKXJldHVybiBkLnJlY29yZEF1dG9JbnNlcnQobixyLCJdIikse3RleHQ6IltdIixzZWxlY3Rpb246WzEsMV19fWVsc2UgaWYoaT09Il0iKXtoKG4pO3ZhciB1PW4uZ2V0Q3Vyc29yUG9zaXRpb24oKSxhPXIuZG9jLmdldExpbmUodS5yb3cpLGY9YS5zdWJzdHJpbmcodS5jb2x1bW4sdS5jb2x1bW4rMSk7aWYoZj09Il0iKXt2YXIgbD1yLiRmaW5kT3BlbmluZ0JyYWNrZXQoIl0iLHtjb2x1bW46dS5jb2x1bW4rMSxyb3c6dS5yb3d9KTtpZihsIT09bnVsbCYmZC5pc0F1dG9JbnNlcnRlZENsb3NpbmcodSxhLGkpKXJldHVybiBkLnBvcEF1dG9JbnNlcnRlZENsb3NpbmcoKSx7dGV4dDoiIixzZWxlY3Rpb246WzEsMV19fX19KSx0aGlzLmFkZCgiYnJhY2tldHMiLCJkZWxldGlvbiIsZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz1yLmRvYy5nZXRUZXh0UmFuZ2UoaSk7aWYoIWkuaXNNdWx0aUxpbmUoKSYmcz09IlsiKXtoKG4pO3ZhciBvPXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLHU9by5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZih1PT0iXSIpcmV0dXJuIGkuZW5kLmNvbHVtbisrLGl9fSksdGhpcy5hZGQoInN0cmluZ19kcXVvdGVzIiwiaW5zZXJ0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuJG1vZGUuJHF1b3Rlc3x8YztpZihpLmxlbmd0aD09MSYmc1tpXSl7aWYodGhpcy5saW5lQ29tbWVudFN0YXJ0JiZ0aGlzLmxpbmVDb21tZW50U3RhcnQuaW5kZXhPZihpKSE9LTEpcmV0dXJuO2gobik7dmFyIG89aSx1PW4uZ2V0U2VsZWN0aW9uUmFuZ2UoKSxhPXIuZG9jLmdldFRleHRSYW5nZSh1KTtpZihhIT09IiImJihhLmxlbmd0aCE9MXx8IXNbYV0pJiZuLmdldFdyYXBCZWhhdmlvdXJzRW5hYmxlZCgpKXJldHVybiBwKHUsYSxvLG8pO2lmKCFhKXt2YXIgZj1uLmdldEN1cnNvclBvc2l0aW9uKCksbD1yLmRvYy5nZXRMaW5lKGYucm93KSxkPWwuc3Vic3RyaW5nKGYuY29sdW1uLTEsZi5jb2x1bW4pLHY9bC5zdWJzdHJpbmcoZi5jb2x1bW4sZi5jb2x1bW4rMSksbT1yLmdldFRva2VuQXQoZi5yb3csZi5jb2x1bW4pLGc9ci5nZXRUb2tlbkF0KGYucm93LGYuY29sdW1uKzEpO2lmKGQ9PSJcXCImJm0mJi9lc2NhcGUvLnRlc3QobS50eXBlKSlyZXR1cm4gbnVsbDt2YXIgeT1tJiYvc3RyaW5nfGVzY2FwZS8udGVzdChtLnR5cGUpLGI9IWd8fC9zdHJpbmd8ZXNjYXBlLy50ZXN0KGcudHlwZSksdztpZih2PT1vKXc9eSE9PWIsdyYmL3N0cmluZ1wuZW5kLy50ZXN0KGcudHlwZSkmJih3PSExKTtlbHNle2lmKHkmJiFiKXJldHVybiBudWxsO2lmKHkmJmIpcmV0dXJuIG51bGw7dmFyIEU9ci4kbW9kZS50b2tlblJlO0UubGFzdEluZGV4PTA7dmFyIFM9RS50ZXN0KGQpO0UubGFzdEluZGV4PTA7dmFyIHg9RS50ZXN0KGQpO2lmKFN8fHgpcmV0dXJuIG51bGw7aWYodiYmIS9bXHM7LC59KVxdXFxdLy50ZXN0KHYpKXJldHVybiBudWxsO3ZhciBUPWxbZi5jb2x1bW4tMl07aWYoIShkIT1vfHxUIT1vJiYhRS50ZXN0KFQpKSlyZXR1cm4gbnVsbDt3PSEwfXJldHVybnt0ZXh0Onc/bytvOiIiLHNlbGVjdGlvbjpbMSwxXX19fX0pLHRoaXMuYWRkKCJzdHJpbmdfZHF1b3RlcyIsImRlbGV0aW9uIixmdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXIuJG1vZGUuJHF1b3Rlc3x8YyxvPXIuZG9jLmdldFRleHRSYW5nZShpKTtpZighaS5pc011bHRpTGluZSgpJiZzLmhhc093blByb3BlcnR5KG8pKXtoKG4pO3ZhciB1PXIuZG9jLmdldExpbmUoaS5zdGFydC5yb3cpLGE9dS5zdWJzdHJpbmcoaS5zdGFydC5jb2x1bW4rMSxpLnN0YXJ0LmNvbHVtbisyKTtpZihhPT1vKXJldHVybiBpLmVuZC5jb2x1bW4rKyxpfX0pfTtkLmlzU2FuZUluc2VydGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxyPW5ldyBzKHQsbi5yb3csbi5jb2x1bW4pO2lmKCF0aGlzLiRtYXRjaFRva2VuVHlwZShyLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsdSkpe2lmKC9bKX1cXV0vLnRlc3QoZS5zZXNzaW9uLmdldExpbmUobi5yb3cpW24uY29sdW1uXSkpcmV0dXJuITA7dmFyIGk9bmV3IHModCxuLnJvdyxuLmNvbHVtbisxKTtpZighdGhpcy4kbWF0Y2hUb2tlblR5cGUoaS5nZXRDdXJyZW50VG9rZW4oKXx8InRleHQiLHUpKXJldHVybiExfXJldHVybiByLnN0ZXBGb3J3YXJkKCksci5nZXRDdXJyZW50VG9rZW5Sb3coKSE9PW4ucm93fHx0aGlzLiRtYXRjaFRva2VuVHlwZShyLmdldEN1cnJlbnRUb2tlbigpfHwidGV4dCIsYSl9LGQuJG1hdGNoVG9rZW5UeXBlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZihlLnR5cGV8fGUpPi0xfSxkLnJlY29yZEF1dG9JbnNlcnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxpPXQuZG9jLmdldExpbmUoci5yb3cpO3RoaXMuaXNBdXRvSW5zZXJ0ZWRDbG9zaW5nKHIsaSxmLmF1dG9JbnNlcnRlZExpbmVFbmRbMF0pfHwoZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cz0wKSxmLmF1dG9JbnNlcnRlZFJvdz1yLnJvdyxmLmF1dG9JbnNlcnRlZExpbmVFbmQ9bitpLnN1YnN0cihyLmNvbHVtbiksZi5hdXRvSW5zZXJ0ZWRCcmFja2V0cysrfSxkLnJlY29yZE1heWJlSW5zZXJ0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldEN1cnNvclBvc2l0aW9uKCksaT10LmRvYy5nZXRMaW5lKHIucm93KTt0aGlzLmlzTWF5YmVJbnNlcnRlZENsb3NpbmcocixpKXx8KGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPTApLGYubWF5YmVJbnNlcnRlZFJvdz1yLnJvdyxmLm1heWJlSW5zZXJ0ZWRMaW5lU3RhcnQ9aS5zdWJzdHIoMCxyLmNvbHVtbikrbixmLm1heWJlSW5zZXJ0ZWRMaW5lRW5kPWkuc3Vic3RyKHIuY29sdW1uKSxmLm1heWJlSW5zZXJ0ZWRCcmFja2V0cysrfSxkLmlzQXV0b0luc2VydGVkQ2xvc2luZz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGYuYXV0b0luc2VydGVkQnJhY2tldHM+MCYmZS5yb3c9PT1mLmF1dG9JbnNlcnRlZFJvdyYmbj09PWYuYXV0b0luc2VydGVkTGluZUVuZFswXSYmdC5zdWJzdHIoZS5jb2x1bW4pPT09Zi5hdXRvSW5zZXJ0ZWRMaW5lRW5kfSxkLmlzTWF5YmVJbnNlcnRlZENsb3Npbmc9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5tYXliZUluc2VydGVkQnJhY2tldHM+MCYmZS5yb3c9PT1mLm1heWJlSW5zZXJ0ZWRSb3cmJnQuc3Vic3RyKGUuY29sdW1uKT09PWYubWF5YmVJbnNlcnRlZExpbmVFbmQmJnQuc3Vic3RyKDAsZS5jb2x1bW4pPT1mLm1heWJlSW5zZXJ0ZWRMaW5lU3RhcnR9LGQucG9wQXV0b0luc2VydGVkQ2xvc2luZz1mdW5jdGlvbigpe2YuYXV0b0luc2VydGVkTGluZUVuZD1mLmF1dG9JbnNlcnRlZExpbmVFbmQuc3Vic3RyKDEpLGYuYXV0b0luc2VydGVkQnJhY2tldHMtLX0sZC5jbGVhck1heWJlSW5zZXJ0ZWRDbG9zaW5nPWZ1bmN0aW9uKCl7ZiYmKGYubWF5YmVJbnNlcnRlZEJyYWNrZXRzPTAsZi5tYXliZUluc2VydGVkUm93PS0xKX0sci5pbmhlcml0cyhkLGkpLHQuQ3N0eWxlQmVoYXZpb3VyPWR9KSxhY2UuZGVmaW5lKCJhY2UvdW5pY29kZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9WzQ4LDksOCwyNSw1LDAsMiwyNSw0OCwwLDExLDAsNSwwLDYsMjIsMiwzMCwyLDQ1Nyw1LDExLDE1LDQsOCwwLDIsMCwxOCwxMTYsMiwxLDMsMyw5LDAsMiwyLDIsMCwyLDE5LDIsODIsMiwxMzgsMiw0LDMsMTU1LDEyLDM3LDMsMCw4LDM4LDEwLDQ0LDIsMCwyLDEsMiwxLDIsMCw5LDI2LDYsMiwzMCwxMCw3LDYxLDIsOSw1LDEwMSwyLDcsMyw5LDIsMTgsMywwLDE3LDU4LDMsMTAwLDE1LDUzLDUsMCw2LDQ1LDIxMSw1NywzLDE4LDIsNSwzLDExLDMsOSwyLDEsNyw2LDIsMiwyLDcsMywxLDMsMjEsMiw2LDIsMCw0LDMsMyw4LDMsMSwzLDMsOSwwLDUsMSwyLDQsMywxMSwxNiwyLDIsNSw1LDEsMywyMSwyLDYsMiwxLDIsMSwyLDEsMywwLDIsNCw1LDEsMywyLDQsMCw4LDMsMiwwLDgsMTUsMTIsMiwyLDgsMiwyLDIsMjEsMiw2LDIsMSwyLDQsMyw5LDIsMiwyLDIsMywwLDE2LDMsMyw5LDE4LDIsMiw3LDMsMSwzLDIxLDIsNiwyLDEsMiw0LDMsOCwzLDEsMywyLDksMSw1LDEsMiw0LDMsOSwyLDAsMTcsMSwyLDUsNCwyLDIsMyw0LDEsMiwwLDIsMSw0LDEsNCwyLDQsMTEsNSw0LDQsMiwyLDMsMywwLDcsMCwxNSw5LDE4LDIsMiw3LDIsMiwyLDIyLDIsOSwyLDQsNCw3LDIsMiwyLDMsOCwxLDIsMSw3LDMsMyw5LDE5LDEsMiw3LDIsMiwyLDIyLDIsOSwyLDQsMyw4LDIsMiwyLDMsOCwxLDgsMCwyLDMsMyw5LDE5LDEsMiw3LDIsMiwyLDIyLDIsMTUsNCw3LDIsMiwyLDMsMTAsMCw5LDMsMyw5LDExLDUsMywxLDIsMTcsNCwyMywyLDgsMiwwLDMsNiw0LDAsNSw1LDIsMCwyLDcsMTksMSwxNCw1Nyw2LDE0LDIsOSw0MCwxLDIsMCwzLDEsMiwwLDMsMCw3LDMsMiw2LDIsMiwyLDAsMiwwLDMsMSwyLDEyLDIsMiwzLDQsMiwwLDIsNSwzLDksMywxLDM1LDAsMjQsMSw3LDksMTIsMCwyLDAsMiwwLDUsOSwyLDM1LDUsMTksMiw1LDUsNywyLDM1LDEwLDAsNTgsNzMsNyw3NywzLDM3LDExLDQyLDIsMCw0LDMyOCwyLDMsMyw2LDIsMCwyLDMsMyw0MCwyLDMsMywzMiwyLDMsMyw2LDIsMCwyLDMsMywxNCwyLDU2LDIsMywzLDY2LDUsMCwzMywxNSwxNyw4NCwxMyw2MTksMywxNiwyLDI1LDYsNzQsMjIsMTIsMiw2LDEyLDIwLDEyLDE5LDEzLDEyLDIsMiwyLDEsMTMsNTEsMywyOSw0LDAsNSwxLDMsOSwzNCwyLDMsOSw3LDg3LDksNDIsNiw2OSwxMSwyOCw0LDExLDUsMTEsMTEsMzksMyw0LDEyLDQzLDUsMjUsNywxMCwzOCwyNyw1LDYyLDIsMjgsMywxMCw3LDksMTQsMCw4OSw3NSw1LDksMTgsOCwxMyw0Miw0LDExLDcxLDU1LDksOSw0LDQ4LDgzLDIsMiwzMCwxNCwyMzAsMjMsMjgwLDMsNSwzLDM3LDMsNSwzLDcsMiwwLDIsMCwyLDAsMiwzMCwzLDUyLDIsNiwyLDAsNCwyLDIsNiw0LDMsMyw1LDUsMTIsNiwyLDIsNiw2NywxLDIwLDAsMjksMCwxNCwwLDE3LDQsNjAsMTIsNSwwLDQsMTEsMTgsMCw1LDAsMyw5LDIsMCw0LDQsNywwLDIsMCwyLDAsMiwzLDIsMTAsMywzLDYsNCw1LDAsNTMsMSwyNjg0LDQ2LDIsNDYsMiwxMzIsNyw2LDE1LDM3LDExLDUzLDEwLDAsMTcsMjIsMTAsNiwyLDYsMiw2LDIsNiwyLDYsMiw2LDIsNiwyLDYsMiwzMSw0OCwwLDQ3MCwxLDM2LDUsMiw0LDYsMSw1LDg1LDMsMSwzLDIsMiw4OSwyLDMsNiw0MCw0LDkzLDE4LDIzLDU3LDE1LDUxMyw2NTgxLDc1LDIwOTM5LDUzLDExNjQsNjgsNDUsMywyNjgsNCwyNywyMSwzMSwzLDEzLDEzLDEsMiwyNCw5LDY5LDExLDEsMzgsOCwzLDEwMiwzLDEsMTExLDQ0LDI1LDUxLDEzLDY4LDEyLDksNywyMyw0LDAsNSw0NSwzLDM1LDEzLDI4LDQsNjQsMTUsMTAsMzksNTQsMTAsMTMsMyw5LDcsMjIsNCwxLDUsNjYsMjUsMiwyMjcsNDIsMiwxLDMsOSw3LDExMTcxLDEzLDIyLDUsNDgsODQ1MywzMDEsMyw2MSwzLDEwNSwzOSw2LDEzLDQsNiwxMSwyLDEyLDIsNCwyLDAsMiwxLDIsMSwyLDEwNywzNCwzNjIsMTksNjMsMyw1Myw0MSwxMSw1LDE1LDE3LDYsMTMsMSwyNSwyLDMzLDQsMiwxMzQsMjAsOSw4LDI1LDUsMCwyLDI1LDEyLDg4LDQsNSwzLDUsMyw1LDMsMl0saT0wLHM9W107Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKz0yKXMucHVzaChpKz1yW29dKSxyW28rMV0mJnMucHVzaCg0NSxpKz1yW28rMV0pO3Qud29yZENoYXJzPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCxzKX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL3RleHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvY29uZmlnIiwiYWNlL3Rva2VuaXplciIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS91bmljb2RlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9jb25maWciKSxpPWUoIi4uL3Rva2VuaXplciIpLlRva2VuaXplcixzPWUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsbz1lKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsdT1lKCIuLi91bmljb2RlIiksYT1lKCIuLi9saWIvbGFuZyIpLGY9ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yLGw9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxjPWZ1bmN0aW9uKCl7dGhpcy5IaWdobGlnaHRSdWxlcz1zfTsoZnVuY3Rpb24oKXt0aGlzLiRkZWZhdWx0QmVoYXZpb3VyPW5ldyBvLHRoaXMudG9rZW5SZT1uZXcgUmVnRXhwKCJeWyIrdS53b3JkQ2hhcnMrIlxcJF9dKyIsImciKSx0aGlzLm5vblRva2VuUmU9bmV3IFJlZ0V4cCgiXig/OlteIit1LndvcmRDaGFycysiXFwkX118XFxzXSkrIiwiZyIpLHRoaXMuZ2V0VG9rZW5pemVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRva2VuaXplcnx8KHRoaXMuJGhpZ2hsaWdodFJ1bGVzPXRoaXMuJGhpZ2hsaWdodFJ1bGVzfHxuZXcgdGhpcy5IaWdobGlnaHRSdWxlcyh0aGlzLiRoaWdobGlnaHRSdWxlQ29uZmlnKSx0aGlzLiR0b2tlbml6ZXI9bmV3IGkodGhpcy4kaGlnaGxpZ2h0UnVsZXMuZ2V0UnVsZXMoKSkpLHRoaXMuJHRva2VuaXplcn0sdGhpcy5saW5lQ29tbWVudFN0YXJ0PSIiLHRoaXMuYmxvY2tDb21tZW50PSIiLHRoaXMudG9nZ2xlQ29tbWVudExpbmVzPWZ1bmN0aW9uKGUsdCxuLHIpe2Z1bmN0aW9uIHcoZSl7Zm9yKHZhciB0PW47dDw9cjt0KyspZShpLmdldExpbmUodCksdCl9dmFyIGk9dC5kb2Mscz0hMCxvPSEwLHU9SW5maW5pdHksZj10LmdldFRhYlNpemUoKSxsPSExO2lmKCF0aGlzLmxpbmVDb21tZW50U3RhcnQpe2lmKCF0aGlzLmJsb2NrQ29tbWVudClyZXR1cm4hMTt2YXIgYz10aGlzLmJsb2NrQ29tbWVudC5zdGFydCxoPXRoaXMuYmxvY2tDb21tZW50LmVuZCxwPW5ldyBSZWdFeHAoIl4oXFxzKikoPzoiK2EuZXNjYXBlUmVnRXhwKGMpKyIpIiksZD1uZXcgUmVnRXhwKCIoPzoiK2EuZXNjYXBlUmVnRXhwKGgpKyIpXFxzKiQiKSx2PWZ1bmN0aW9uKGUsdCl7aWYoZyhlLHQpKXJldHVybjtpZighc3x8L1xTLy50ZXN0KGUpKWkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46ZS5sZW5ndGh9LGgpLGkuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0sYyl9LG09ZnVuY3Rpb24oZSx0KXt2YXIgbjsobj1lLm1hdGNoKGQpKSYmaS5yZW1vdmVJbkxpbmUodCxlLmxlbmd0aC1uWzBdLmxlbmd0aCxlLmxlbmd0aCksKG49ZS5tYXRjaChwKSkmJmkucmVtb3ZlSW5MaW5lKHQsblsxXS5sZW5ndGgsblswXS5sZW5ndGgpfSxnPWZ1bmN0aW9uKGUsbil7aWYocC50ZXN0KGUpKXJldHVybiEwO3ZhciByPXQuZ2V0VG9rZW5zKG4pO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKWlmKHJbaV0udHlwZT09PSJjb21tZW50IilyZXR1cm4hMH19ZWxzZXtpZihBcnJheS5pc0FycmF5KHRoaXMubGluZUNvbW1lbnRTdGFydCkpdmFyIHA9dGhpcy5saW5lQ29tbWVudFN0YXJ0Lm1hcChhLmVzY2FwZVJlZ0V4cCkuam9pbigifCIpLGM9dGhpcy5saW5lQ29tbWVudFN0YXJ0WzBdO2Vsc2UgdmFyIHA9YS5lc2NhcGVSZWdFeHAodGhpcy5saW5lQ29tbWVudFN0YXJ0KSxjPXRoaXMubGluZUNvbW1lbnRTdGFydDtwPW5ldyBSZWdFeHAoIl4oXFxzKikoPzoiK3ArIikgPyIpLGw9dC5nZXRVc2VTb2Z0VGFicygpO3ZhciBtPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5tYXRjaChwKTtpZighbilyZXR1cm47dmFyIHI9blsxXS5sZW5ndGgscz1uWzBdLmxlbmd0aDshYihlLHIscykmJm5bMF1bcy0xXT09IiAiJiZzLS0saS5yZW1vdmVJbkxpbmUodCxyLHMpfSx5PWMrIiAiLHY9ZnVuY3Rpb24oZSx0KXtpZighc3x8L1xTLy50ZXN0KGUpKWIoZSx1LHUpP2kuaW5zZXJ0SW5MaW5lKHtyb3c6dCxjb2x1bW46dX0seSk6aS5pbnNlcnRJbkxpbmUoe3Jvdzp0LGNvbHVtbjp1fSxjKX0sZz1mdW5jdGlvbihlLHQpe3JldHVybiBwLnRlc3QoZSl9LGI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPTA7d2hpbGUodC0tJiZlLmNoYXJBdCh0KT09IiAiKXIrKztpZihyJWYhPTApcmV0dXJuITE7dmFyIHI9MDt3aGlsZShlLmNoYXJBdChuKyspPT0iICIpcisrO3JldHVybiBmPjI/ciVmIT1mLTE6ciVmPT0wfX12YXIgRT1JbmZpbml0eTt3KGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5zZWFyY2goL1xTLyk7biE9PS0xPyhuPHUmJih1PW4pLG8mJiFnKGUsdCkmJihvPSExKSk6RT5lLmxlbmd0aCYmKEU9ZS5sZW5ndGgpfSksdT09SW5maW5pdHkmJih1PUUscz0hMSxvPSExKSxsJiZ1JWYhPTAmJih1PU1hdGguZmxvb3IodS9mKSpmKSx3KG8/bTp2KX0sdGhpcy50b2dnbGVCbG9ja0NvbW1lbnQ9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5ibG9ja0NvbW1lbnQ7aWYoIWkpcmV0dXJuOyFpLnN0YXJ0JiZpWzBdJiYoaT1pWzBdKTt2YXIgcz1uZXcgZih0LHIucm93LHIuY29sdW1uKSxvPXMuZ2V0Q3VycmVudFRva2VuKCksdT10LnNlbGVjdGlvbixhPXQuc2VsZWN0aW9uLnRvT3JpZW50ZWRSYW5nZSgpLGMsaDtpZihvJiYvY29tbWVudC8udGVzdChvLnR5cGUpKXt2YXIgcCxkO3doaWxlKG8mJi9jb21tZW50Ly50ZXN0KG8udHlwZSkpe3ZhciB2PW8udmFsdWUuaW5kZXhPZihpLnN0YXJ0KTtpZih2IT0tMSl7dmFyIG09cy5nZXRDdXJyZW50VG9rZW5Sb3coKSxnPXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrdjtwPW5ldyBsKG0sZyxtLGcraS5zdGFydC5sZW5ndGgpO2JyZWFrfW89cy5zdGVwQmFja3dhcmQoKX12YXIgcz1uZXcgZih0LHIucm93LHIuY29sdW1uKSxvPXMuZ2V0Q3VycmVudFRva2VuKCk7d2hpbGUobyYmL2NvbW1lbnQvLnRlc3Qoby50eXBlKSl7dmFyIHY9by52YWx1ZS5pbmRleE9mKGkuZW5kKTtpZih2IT0tMSl7dmFyIG09cy5nZXRDdXJyZW50VG9rZW5Sb3coKSxnPXMuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrdjtkPW5ldyBsKG0sZyxtLGcraS5lbmQubGVuZ3RoKTticmVha31vPXMuc3RlcEZvcndhcmQoKX1kJiZ0LnJlbW92ZShkKSxwJiYodC5yZW1vdmUocCksYz1wLnN0YXJ0LnJvdyxoPS1pLnN0YXJ0Lmxlbmd0aCl9ZWxzZSBoPWkuc3RhcnQubGVuZ3RoLGM9bi5zdGFydC5yb3csdC5pbnNlcnQobi5lbmQsaS5lbmQpLHQuaW5zZXJ0KG4uc3RhcnQsaS5zdGFydCk7YS5zdGFydC5yb3c9PWMmJihhLnN0YXJ0LmNvbHVtbis9aCksYS5lbmQucm93PT1jJiYoYS5lbmQuY29sdW1uKz1oKSx0LnNlbGVjdGlvbi5mcm9tT3JpZW50ZWRSYW5nZShhKX0sdGhpcy5nZXROZXh0TGluZUluZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuJGdldEluZGVudCh0KX0sdGhpcy5jaGVja091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXt9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvXlxzKi8pWzBdfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbH0sdGhpcy5jcmVhdGVNb2RlRGVsZWdhdGVzPWZ1bmN0aW9uKGUpe3RoaXMuJGVtYmVkcz1bXSx0aGlzLiRtb2Rlcz17fTtmb3IodmFyIHQgaW4gZSlpZihlW3RdKXt2YXIgbj1lW3RdLGk9bi5wcm90b3R5cGUuJGlkLHM9ci4kbW9kZXNbaV07c3x8KHIuJG1vZGVzW2ldPXM9bmV3IG4pLHIuJG1vZGVzW3RdfHwoci4kbW9kZXNbdF09cyksdGhpcy4kZW1iZWRzLnB1c2godCksdGhpcy4kbW9kZXNbdF09c312YXIgbz1bInRvZ2dsZUJsb2NrQ29tbWVudCIsInRvZ2dsZUNvbW1lbnRMaW5lcyIsImdldE5leHRMaW5lSW5kZW50IiwiY2hlY2tPdXRkZW50IiwiYXV0b091dGRlbnQiLCJ0cmFuc2Zvcm1BY3Rpb24iLCJnZXRDb21wbGV0aW9ucyJdO2Zvcih2YXIgdD0wO3Q8by5sZW5ndGg7dCsrKShmdW5jdGlvbihlKXt2YXIgbj1vW3RdLHI9ZVtuXTtlW29bdF1dPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGRlbGVnYXRvcihuLGFyZ3VtZW50cyxyKX19KSh0aGlzKX0sdGhpcy4kZGVsZWdhdG9yPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdfHwic3RhcnQiO2lmKHR5cGVvZiByIT0ic3RyaW5nIil7aWYoQXJyYXkuaXNBcnJheShyWzJdKSl7dmFyIGk9clsyXVtyWzJdLmxlbmd0aC0xXSxzPXRoaXMuJG1vZGVzW2ldO2lmKHMpcmV0dXJuIHNbZV0uYXBwbHkocyxbclsxXV0uY29uY2F0KFtdLnNsaWNlLmNhbGwodCwxKSkpfXI9clswXXx8InN0YXJ0In1mb3IodmFyIG89MDtvPHRoaXMuJGVtYmVkcy5sZW5ndGg7bysrKXtpZighdGhpcy4kbW9kZXNbdGhpcy4kZW1iZWRzW29dXSljb250aW51ZTt2YXIgdT1yLnNwbGl0KHRoaXMuJGVtYmVkc1tvXSk7aWYoIXVbMF0mJnVbMV0pe3RbMF09dVsxXTt2YXIgcz10aGlzLiRtb2Rlc1t0aGlzLiRlbWJlZHNbb11dO3JldHVybiBzW2VdLmFwcGx5KHMsdCl9fXZhciBhPW4uYXBwbHkodGhpcyx0KTtyZXR1cm4gbj9hOnVuZGVmaW5lZH0sdGhpcy50cmFuc2Zvcm1BY3Rpb249ZnVuY3Rpb24oZSx0LG4scixpKXtpZih0aGlzLiRiZWhhdmlvdXIpe3ZhciBzPXRoaXMuJGJlaGF2aW91ci5nZXRCZWhhdmlvdXJzKCk7Zm9yKHZhciBvIGluIHMpaWYoc1tvXVt0XSl7dmFyIHU9c1tvXVt0XS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYodSlyZXR1cm4gdX19fSx0aGlzLmdldEtleXdvcmRzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmNvbXBsZXRpb25LZXl3b3Jkcyl7dmFyIHQ9dGhpcy4kdG9rZW5pemVyLnJ1bGVzLG49W107Zm9yKHZhciByIGluIHQpe3ZhciBpPXRbcl07Zm9yKHZhciBzPTAsbz1pLmxlbmd0aDtzPG87cysrKWlmKHR5cGVvZiBpW3NdLnRva2VuPT0ic3RyaW5nIikva2V5d29yZHxzdXBwb3J0fHN0b3JhZ2UvLnRlc3QoaVtzXS50b2tlbikmJm4ucHVzaChpW3NdLnJlZ2V4KTtlbHNlIGlmKHR5cGVvZiBpW3NdLnRva2VuPT0ib2JqZWN0Iilmb3IodmFyIHU9MCxhPWlbc10udG9rZW4ubGVuZ3RoO3U8YTt1KyspaWYoL2tleXdvcmR8c3VwcG9ydHxzdG9yYWdlLy50ZXN0KGlbc10udG9rZW5bdV0pKXt2YXIgcj1pW3NdLnJlZ2V4Lm1hdGNoKC9cKC4rP1wpL2cpW3VdO24ucHVzaChyLnN1YnN0cigxLHIubGVuZ3RoLTIpKX19dGhpcy5jb21wbGV0aW9uS2V5d29yZHM9bn1yZXR1cm4gZT9uLmNvbmNhdCh0aGlzLiRrZXl3b3JkTGlzdHx8W10pOnRoaXMuJGtleXdvcmRMaXN0fSx0aGlzLiRjcmVhdGVLZXl3b3JkTGlzdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRSdWxlc3x8dGhpcy5nZXRUb2tlbml6ZXIoKSx0aGlzLiRrZXl3b3JkTGlzdD10aGlzLiRoaWdobGlnaHRSdWxlcy4ka2V5d29yZExpc3R8fFtdfSx0aGlzLmdldENvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuJGtleXdvcmRMaXN0fHx0aGlzLiRjcmVhdGVLZXl3b3JkTGlzdCgpO3JldHVybiBpLm1hcChmdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLHZhbHVlOmUsc2NvcmU6MCxtZXRhOiJrZXl3b3JkIn19KX0sdGhpcy4kaWQ9ImFjZS9tb2RlL3RleHQifSkuY2FsbChjLnByb3RvdHlwZSksdC5Nb2RlPWN9KSxhY2UuZGVmaW5lKCJhY2UvYXBwbHlfZGVsdGEiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt0aHJvdyBjb25zb2xlLmxvZygiSW52YWxpZCBEZWx0YToiLGUpLCJJbnZhbGlkIERlbHRhOiAiK3R9ZnVuY3Rpb24gaShlLHQpe3JldHVybiB0LnJvdz49MCYmdC5yb3c8ZS5sZW5ndGgmJnQuY29sdW1uPj0wJiZ0LmNvbHVtbjw9ZVt0LnJvd10ubGVuZ3RofWZ1bmN0aW9uIHMoZSx0KXt0LmFjdGlvbiE9Imluc2VydCImJnQuYWN0aW9uIT0icmVtb3ZlIiYmcih0LCJkZWx0YS5hY3Rpb24gbXVzdCBiZSAnaW5zZXJ0JyBvciAncmVtb3ZlJyIpLHQubGluZXMgaW5zdGFuY2VvZiBBcnJheXx8cih0LCJkZWx0YS5saW5lcyBtdXN0IGJlIGFuIEFycmF5IiksKCF0LnN0YXJ0fHwhdC5lbmQpJiZyKHQsImRlbHRhLnN0YXJ0L2VuZCBtdXN0IGJlIGFuIHByZXNlbnQiKTt2YXIgbj10LnN0YXJ0O2koZSx0LnN0YXJ0KXx8cih0LCJkZWx0YS5zdGFydCBtdXN0IGJlIGNvbnRhaW5lZCBpbiBkb2N1bWVudCIpO3ZhciBzPXQuZW5kO3QuYWN0aW9uPT0icmVtb3ZlIiYmIWkoZSxzKSYmcih0LCJkZWx0YS5lbmQgbXVzdCBjb250YWluZWQgaW4gZG9jdW1lbnQgZm9yICdyZW1vdmUnIGFjdGlvbnMiKTt2YXIgbz1zLnJvdy1uLnJvdyx1PXMuY29sdW1uLShvPT0wP24uY29sdW1uOjApOyhvIT10LmxpbmVzLmxlbmd0aC0xfHx0LmxpbmVzW29dLmxlbmd0aCE9dSkmJnIodCwiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpfXQuYXBwbHlEZWx0YT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zdGFydC5yb3csaT10LnN0YXJ0LmNvbHVtbixzPWVbcl18fCIiO3N3aXRjaCh0LmFjdGlvbil7Y2FzZSJpbnNlcnQiOnZhciBvPXQubGluZXM7aWYoby5sZW5ndGg9PT0xKWVbcl09cy5zdWJzdHJpbmcoMCxpKSt0LmxpbmVzWzBdK3Muc3Vic3RyaW5nKGkpO2Vsc2V7dmFyIHU9W3IsMV0uY29uY2F0KHQubGluZXMpO2Uuc3BsaWNlLmFwcGx5KGUsdSksZVtyXT1zLnN1YnN0cmluZygwLGkpK2Vbcl0sZVtyK3QubGluZXMubGVuZ3RoLTFdKz1zLnN1YnN0cmluZyhpKX1icmVhaztjYXNlInJlbW92ZSI6dmFyIGE9dC5lbmQuY29sdW1uLGY9dC5lbmQucm93O3I9PT1mP2Vbcl09cy5zdWJzdHJpbmcoMCxpKStzLnN1YnN0cmluZyhhKTplLnNwbGljZShyLGYtcisxLHMuc3Vic3RyaW5nKDAsaSkrZVtmXS5zdWJzdHJpbmcoYSkpfX19KSxhY2UuZGVmaW5lKCJhY2UvYW5jaG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPXQuQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRvbkNoYW5nZT10aGlzLm9uQ2hhbmdlLmJpbmQodGhpcyksdGhpcy5hdHRhY2goZSksdHlwZW9mIG49PSJ1bmRlZmluZWQiP3RoaXMuc2V0UG9zaXRpb24odC5yb3csdC5jb2x1bW4pOnRoaXMuc2V0UG9zaXRpb24odCxuKX07KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlLHQsbil7dmFyIHI9bj9lLmNvbHVtbjw9dC5jb2x1bW46ZS5jb2x1bW48dC5jb2x1bW47cmV0dXJuIGUucm93PHQucm93fHxlLnJvdz09dC5yb3cmJnJ9ZnVuY3Rpb24gdCh0LG4scil7dmFyIGk9dC5hY3Rpb249PSJpbnNlcnQiLHM9KGk/MTotMSkqKHQuZW5kLnJvdy10LnN0YXJ0LnJvdyksbz0oaT8xOi0xKSoodC5lbmQuY29sdW1uLXQuc3RhcnQuY29sdW1uKSx1PXQuc3RhcnQsYT1pP3U6dC5lbmQ7cmV0dXJuIGUobix1LHIpP3tyb3c6bi5yb3csY29sdW1uOm4uY29sdW1ufTplKGEsbiwhcik/e3JvdzpuLnJvdytzLGNvbHVtbjpuLmNvbHVtbisobi5yb3c9PWEucm93P286MCl9Ontyb3c6dS5yb3csY29sdW1uOnUuY29sdW1ufX1yLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuZ2V0UG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCh0aGlzLnJvdyx0aGlzLmNvbHVtbil9LHRoaXMuZ2V0RG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2N1bWVudH0sdGhpcy4kaW5zZXJ0UmlnaHQ9ITEsdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXtpZihlLnN0YXJ0LnJvdz09ZS5lbmQucm93JiZlLnN0YXJ0LnJvdyE9dGhpcy5yb3cpcmV0dXJuO2lmKGUuc3RhcnQucm93PnRoaXMucm93KXJldHVybjt2YXIgbj10KGUse3Jvdzp0aGlzLnJvdyxjb2x1bW46dGhpcy5jb2x1bW59LHRoaXMuJGluc2VydFJpZ2h0KTt0aGlzLnNldFBvc2l0aW9uKG4ucm93LG4uY29sdW1uLCEwKX0sdGhpcy5zZXRQb3NpdGlvbj1mdW5jdGlvbihlLHQsbil7dmFyIHI7bj9yPXtyb3c6ZSxjb2x1bW46dH06cj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUsdCk7aWYodGhpcy5yb3c9PXIucm93JiZ0aGlzLmNvbHVtbj09ci5jb2x1bW4pcmV0dXJuO3ZhciBpPXtyb3c6dGhpcy5yb3csY29sdW1uOnRoaXMuY29sdW1ufTt0aGlzLnJvdz1yLnJvdyx0aGlzLmNvbHVtbj1yLmNvbHVtbix0aGlzLl9zaWduYWwoImNoYW5nZSIse29sZDppLHZhbHVlOnJ9KX0sdGhpcy5kZXRhY2g9ZnVuY3Rpb24oKXt0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpfSx0aGlzLmF0dGFjaD1mdW5jdGlvbihlKXt0aGlzLmRvY3VtZW50PWV8fHRoaXMuZG9jdW1lbnQsdGhpcy5kb2N1bWVudC5vbigiY2hhbmdlIix0aGlzLiRvbkNoYW5nZSl9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gZT49dGhpcy5kb2N1bWVudC5nZXRMZW5ndGgoKT8obi5yb3c9TWF0aC5tYXgoMCx0aGlzLmRvY3VtZW50LmdldExlbmd0aCgpLTEpLG4uY29sdW1uPXRoaXMuZG9jdW1lbnQuZ2V0TGluZShuLnJvdykubGVuZ3RoKTplPDA/KG4ucm93PTAsbi5jb2x1bW49MCk6KG4ucm93PWUsbi5jb2x1bW49TWF0aC5taW4odGhpcy5kb2N1bWVudC5nZXRMaW5lKG4ucm93KS5sZW5ndGgsTWF0aC5tYXgoMCx0KSkpLHQ8MCYmKG4uY29sdW1uPTApLG59fSkuY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9hcHBseV9kZWx0YSIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9yYW5nZSIsImFjZS9hbmNob3IiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9hcHBseV9kZWx0YSIpLmFwcGx5RGVsdGEscz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLG89ZSgiLi9yYW5nZSIpLlJhbmdlLHU9ZSgiLi9hbmNob3IiKS5BbmNob3IsYT1mdW5jdGlvbihlKXt0aGlzLiRsaW5lcz1bIiJdLGUubGVuZ3RoPT09MD90aGlzLiRsaW5lcz1bIiJdOkFycmF5LmlzQXJyYXkoZSk/dGhpcy5pbnNlcnRNZXJnZWRMaW5lcyh7cm93OjAsY29sdW1uOjB9LGUpOnRoaXMuaW5zZXJ0KHtyb3c6MCxjb2x1bW46MH0sZSl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMscyksdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpLTE7dGhpcy5yZW1vdmUobmV3IG8oMCwwLHQsdGhpcy5nZXRMaW5lKHQpLmxlbmd0aCkpLHRoaXMuaW5zZXJ0KHtyb3c6MCxjb2x1bW46MH0sZSl9LHRoaXMuZ2V0VmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBbGxMaW5lcygpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLmNyZWF0ZUFuY2hvcj1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgdSh0aGlzLGUsdCl9LCJhYWEiLnNwbGl0KC9hLykubGVuZ3RoPT09MD90aGlzLiRzcGxpdD1mdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9cclxufFxyL2csIlxuIikuc3BsaXQoIlxuIil9OnRoaXMuJHNwbGl0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KC9cclxufFxyfFxuLyl9LHRoaXMuJGRldGVjdE5ld0xpbmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTt0aGlzLiRhdXRvTmV3TGluZT10P3RbMV06IlxuIix0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIil9LHRoaXMuZ2V0TmV3TGluZUNoYXJhY3Rlcj1mdW5jdGlvbigpe3N3aXRjaCh0aGlzLiRuZXdMaW5lTW9kZSl7Y2FzZSJ3aW5kb3dzIjpyZXR1cm4iXHJcbiI7Y2FzZSJ1bml4IjpyZXR1cm4iXG4iO2RlZmF1bHQ6cmV0dXJuIHRoaXMuJGF1dG9OZXdMaW5lfHwiXG4ifX0sdGhpcy4kYXV0b05ld0xpbmU9IiIsdGhpcy4kbmV3TGluZU1vZGU9ImF1dG8iLHRoaXMuc2V0TmV3TGluZU1vZGU9ZnVuY3Rpb24oZSl7aWYodGhpcy4kbmV3TGluZU1vZGU9PT1lKXJldHVybjt0aGlzLiRuZXdMaW5lTW9kZT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKX0sdGhpcy5nZXROZXdMaW5lTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRuZXdMaW5lTW9kZX0sdGhpcy5pc05ld0xpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PSJcclxuInx8ZT09IlxyInx8ZT09IlxuIn0sdGhpcy5nZXRMaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLiRsaW5lc1tlXXx8IiJ9LHRoaXMuZ2V0TGluZXM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbGluZXMuc2xpY2UoZSx0KzEpfSx0aGlzLmdldEFsbExpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGluZXMoMCx0aGlzLmdldExlbmd0aCgpKX0sdGhpcy5nZXRMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbGluZXMubGVuZ3RofSx0aGlzLmdldFRleHRSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5nZXRMaW5lc0ZvclJhbmdlKGUpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpfSx0aGlzLmdldExpbmVzRm9yUmFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZS5zdGFydC5yb3c9PT1lLmVuZC5yb3cpdD1bdGhpcy5nZXRMaW5lKGUuc3RhcnQucm93KS5zdWJzdHJpbmcoZS5zdGFydC5jb2x1bW4sZS5lbmQuY29sdW1uKV07ZWxzZXt0PXRoaXMuZ2V0TGluZXMoZS5zdGFydC5yb3csZS5lbmQucm93KSx0WzBdPSh0WzBdfHwiIikuc3Vic3RyaW5nKGUuc3RhcnQuY29sdW1uKTt2YXIgbj10Lmxlbmd0aC0xO2UuZW5kLnJvdy1lLnN0YXJ0LnJvdz09biYmKHRbbl09dFtuXS5zdWJzdHJpbmcoMCxlLmVuZC5jb2x1bW4pKX1yZXR1cm4gdH0sdGhpcy5pbnNlcnRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5pbnNlcnRMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIGluc2VydEZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKSx0aGlzLmluc2VydEZ1bGxMaW5lcyhlLHQpfSx0aGlzLnJlbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50LnJlbW92ZUxpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVtb3ZlRnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpLHRoaXMucmVtb3ZlRnVsbExpbmVzKGUsdCl9LHRoaXMuaW5zZXJ0TmV3TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoZSxbIiIsIiJdKX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5nZXRMZW5ndGgoKTw9MSYmdGhpcy4kZGV0ZWN0TmV3TGluZSh0KSx0aGlzLmluc2VydE1lcmdlZExpbmVzKGUsdGhpcy4kc3BsaXQodCkpfSx0aGlzLmluc2VydEluTGluZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2xpcHBlZFBvcyhlLnJvdyxlLmNvbHVtbikscj10aGlzLnBvcyhlLnJvdyxlLmNvbHVtbit0Lmxlbmd0aCk7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6bixlbmQ6cixhY3Rpb246Imluc2VydCIsbGluZXM6W3RdfSwhMCksdGhpcy5jbG9uZVBvcyhyKX0sdGhpcy5jbGlwcGVkUG9zPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRMZW5ndGgoKTtlPT09dW5kZWZpbmVkP2U9bjplPDA/ZT0wOmU+PW4mJihlPW4tMSx0PXVuZGVmaW5lZCk7dmFyIHI9dGhpcy5nZXRMaW5lKGUpO3JldHVybiB0PT11bmRlZmluZWQmJih0PXIubGVuZ3RoKSx0PU1hdGgubWluKE1hdGgubWF4KHQsMCksci5sZW5ndGgpLHtyb3c6ZSxjb2x1bW46dH19LHRoaXMuY2xvbmVQb3M9ZnVuY3Rpb24oZSl7cmV0dXJue3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW59fSx0aGlzLnBvcz1mdW5jdGlvbihlLHQpe3JldHVybntyb3c6ZSxjb2x1bW46dH19LHRoaXMuJGNsaXBQb3NpdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExlbmd0aCgpO3JldHVybiBlLnJvdz49dD8oZS5yb3c9TWF0aC5tYXgoMCx0LTEpLGUuY29sdW1uPXRoaXMuZ2V0TGluZSh0LTEpLmxlbmd0aCk6KGUucm93PU1hdGgubWF4KDAsZS5yb3cpLGUuY29sdW1uPU1hdGgubWluKE1hdGgubWF4KGUuY29sdW1uLDApLHRoaXMuZ2V0TGluZShlLnJvdykubGVuZ3RoKSksZX0sdGhpcy5pbnNlcnRGdWxsTGluZXM9ZnVuY3Rpb24oZSx0KXtlPU1hdGgubWluKE1hdGgubWF4KGUsMCksdGhpcy5nZXRMZW5ndGgoKSk7dmFyIG49MDtlPHRoaXMuZ2V0TGVuZ3RoKCk/KHQ9dC5jb25jYXQoWyIiXSksbj0wKToodD1bIiJdLmNvbmNhdCh0KSxlLS0sbj10aGlzLiRsaW5lc1tlXS5sZW5ndGgpLHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMoe3JvdzplLGNvbHVtbjpufSx0KX0sdGhpcy5pbnNlcnRNZXJnZWRMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuY2xpcHBlZFBvcyhlLnJvdyxlLmNvbHVtbikscj17cm93Om4ucm93K3QubGVuZ3RoLTEsY29sdW1uOih0Lmxlbmd0aD09MT9uLmNvbHVtbjowKSt0W3QubGVuZ3RoLTFdLmxlbmd0aH07cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6bixlbmQ6cixhY3Rpb246Imluc2VydCIsbGluZXM6dH0pLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2xpcHBlZFBvcyhlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbiksbj10aGlzLmNsaXBwZWRQb3MoZS5lbmQucm93LGUuZW5kLmNvbHVtbik7cmV0dXJuIHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dCxlbmQ6bixhY3Rpb246InJlbW92ZSIsbGluZXM6dGhpcy5nZXRMaW5lc0ZvclJhbmdlKHtzdGFydDp0LGVuZDpufSl9KSx0aGlzLmNsb25lUG9zKHQpfSx0aGlzLnJlbW92ZUluTGluZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5jbGlwcGVkUG9zKGUsdCksaT10aGlzLmNsaXBwZWRQb3MoZSxuKTtyZXR1cm4gdGhpcy5hcHBseURlbHRhKHtzdGFydDpyLGVuZDppLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2Uoe3N0YXJ0OnIsZW5kOml9KX0sITApLHRoaXMuY2xvbmVQb3Mocil9LHRoaXMucmVtb3ZlRnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7ZT1NYXRoLm1pbihNYXRoLm1heCgwLGUpLHRoaXMuZ2V0TGVuZ3RoKCktMSksdD1NYXRoLm1pbihNYXRoLm1heCgwLHQpLHRoaXMuZ2V0TGVuZ3RoKCktMSk7dmFyIG49dD09dGhpcy5nZXRMZW5ndGgoKS0xJiZlPjAscj10PHRoaXMuZ2V0TGVuZ3RoKCktMSxpPW4/ZS0xOmUscz1uP3RoaXMuZ2V0TGluZShpKS5sZW5ndGg6MCx1PXI/dCsxOnQsYT1yPzA6dGhpcy5nZXRMaW5lKHUpLmxlbmd0aCxmPW5ldyBvKGkscyx1LGEpLGw9dGhpcy4kbGluZXMuc2xpY2UoZSx0KzEpO3JldHVybiB0aGlzLmFwcGx5RGVsdGEoe3N0YXJ0OmYuc3RhcnQsZW5kOmYuZW5kLGFjdGlvbjoicmVtb3ZlIixsaW5lczp0aGlzLmdldExpbmVzRm9yUmFuZ2UoZil9KSxsfSx0aGlzLnJlbW92ZU5ld0xpbmU9ZnVuY3Rpb24oZSl7ZTx0aGlzLmdldExlbmd0aCgpLTEmJmU+PTAmJnRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5wb3MoZSx0aGlzLmdldExpbmUoZSkubGVuZ3RoKSxlbmQ6dGhpcy5wb3MoZSsxLDApLGFjdGlvbjoicmVtb3ZlIixsaW5lczpbIiIsIiJdfSl9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe2UgaW5zdGFuY2VvZiBvfHwoZT1vLmZyb21Qb2ludHMoZS5zdGFydCxlLmVuZCkpO2lmKHQubGVuZ3RoPT09MCYmZS5pc0VtcHR5KCkpcmV0dXJuIGUuc3RhcnQ7aWYodD09dGhpcy5nZXRUZXh0UmFuZ2UoZSkpcmV0dXJuIGUuZW5kO3RoaXMucmVtb3ZlKGUpO3ZhciBuO3JldHVybiB0P249dGhpcy5pbnNlcnQoZS5zdGFydCx0KTpuPWUuc3RhcnQsbn0sdGhpcy5hcHBseURlbHRhcz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLmFwcGx5RGVsdGEoZVt0XSl9LHRoaXMucmV2ZXJ0RGVsdGFzPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmxlbmd0aC0xO3Q+PTA7dC0tKXRoaXMucmV2ZXJ0RGVsdGEoZVt0XSl9LHRoaXMuYXBwbHlEZWx0YT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IjtpZihuP2UubGluZXMubGVuZ3RoPD0xJiYhZS5saW5lc1swXTohby5jb21wYXJlUG9pbnRzKGUuc3RhcnQsZS5lbmQpKXJldHVybjtuJiZlLmxpbmVzLmxlbmd0aD4yZTQ/dGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEoZSwyZTQpOihpKHRoaXMuJGxpbmVzLGUsdCksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpKX0sdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGE9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmxpbmVzLHI9bi5sZW5ndGgtdCsxLGk9ZS5zdGFydC5yb3cscz1lLnN0YXJ0LmNvbHVtbjtmb3IodmFyIG89MCx1PTA7bzxyO289dSl7dSs9dC0xO3ZhciBhPW4uc2xpY2Uobyx1KTthLnB1c2goIiIpLHRoaXMuYXBwbHlEZWx0YSh7c3RhcnQ6dGhpcy5wb3MoaStvLHMpLGVuZDp0aGlzLnBvcyhpK3Uscz0wKSxhY3Rpb246ZS5hY3Rpb24sbGluZXM6YX0sITApfWUubGluZXM9bi5zbGljZShvKSxlLnN0YXJ0LnJvdz1pK28sZS5zdGFydC5jb2x1bW49cyx0aGlzLmFwcGx5RGVsdGEoZSwhMCl9LHRoaXMucmV2ZXJ0RGVsdGE9ZnVuY3Rpb24oZSl7dGhpcy5hcHBseURlbHRhKHtzdGFydDp0aGlzLmNsb25lUG9zKGUuc3RhcnQpLGVuZDp0aGlzLmNsb25lUG9zKGUuZW5kKSxhY3Rpb246ZS5hY3Rpb249PSJpbnNlcnQiPyJyZW1vdmUiOiJpbnNlcnQiLGxpbmVzOmUubGluZXMuc2xpY2UoKX0pfSx0aGlzLmluZGV4VG9Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGxpbmVzfHx0aGlzLmdldEFsbExpbmVzKCkscj10aGlzLmdldE5ld0xpbmVDaGFyYWN0ZXIoKS5sZW5ndGg7Zm9yKHZhciBpPXR8fDAscz1uLmxlbmd0aDtpPHM7aSsrKXtlLT1uW2ldLmxlbmd0aCtyO2lmKGU8MClyZXR1cm57cm93OmksY29sdW1uOmUrbltpXS5sZW5ndGgrcn19cmV0dXJue3JvdzpzLTEsY29sdW1uOmUrbltzLTFdLmxlbmd0aCtyfX0sdGhpcy5wb3NpdGlvblRvSW5kZXg9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRsaW5lc3x8dGhpcy5nZXRBbGxMaW5lcygpLHI9dGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoLGk9MCxzPU1hdGgubWluKGUucm93LG4ubGVuZ3RoKTtmb3IodmFyIG89dHx8MDtvPHM7KytvKWkrPW5bb10ubGVuZ3RoK3I7cmV0dXJuIGkrZS5jb2x1bW59fSkuY2FsbChhLnByb3RvdHlwZSksdC5Eb2N1bWVudD1hfSksYWNlLmRlZmluZSgiYWNlL2JhY2tncm91bmRfdG9rZW5pemVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL29vcCIpLGk9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixzPWZ1bmN0aW9uKGUsdCl7dGhpcy5ydW5uaW5nPSExLHRoaXMubGluZXM9W10sdGhpcy5zdGF0ZXM9W10sdGhpcy5jdXJyZW50TGluZT0wLHRoaXMudG9rZW5pemVyPWU7dmFyIG49dGhpczt0aGlzLiR3b3JrZXI9ZnVuY3Rpb24oKXtpZighbi5ydW5uaW5nKXJldHVybjt2YXIgZT1uZXcgRGF0ZSx0PW4uY3VycmVudExpbmUscj0tMSxpPW4uZG9jLHM9dDt3aGlsZShuLmxpbmVzW3RdKXQrKzt2YXIgbz1pLmdldExlbmd0aCgpLHU9MDtuLnJ1bm5pbmc9ITE7d2hpbGUodDxvKXtuLiR0b2tlbml6ZVJvdyh0KSxyPXQ7ZG8gdCsrO3doaWxlKG4ubGluZXNbdF0pO3UrKztpZih1JTU9PT0wJiZuZXcgRGF0ZS1lPjIwKXtuLnJ1bm5pbmc9c2V0VGltZW91dChuLiR3b3JrZXIsMjApO2JyZWFrfX1uLmN1cnJlbnRMaW5lPXQscj09LTEmJihyPXQpLHM8PXImJm4uZmlyZVVwZGF0ZUV2ZW50KHMscil9fTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGkpLHRoaXMuc2V0VG9rZW5pemVyPWZ1bmN0aW9uKGUpe3RoaXMudG9rZW5pemVyPWUsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLnN0YXJ0KDApfSx0aGlzLnNldERvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuZG9jPWUsdGhpcy5saW5lcz1bXSx0aGlzLnN0YXRlcz1bXSx0aGlzLnN0b3AoKX0sdGhpcy5maXJlVXBkYXRlRXZlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17Zmlyc3Q6ZSxsYXN0OnR9O3RoaXMuX3NpZ25hbCgidXBkYXRlIix7ZGF0YTpufSl9LHRoaXMuc3RhcnQ9ZnVuY3Rpb24oZSl7dGhpcy5jdXJyZW50TGluZT1NYXRoLm1pbihlfHwwLHRoaXMuY3VycmVudExpbmUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCkpLHRoaXMubGluZXMuc3BsaWNlKHRoaXMuY3VycmVudExpbmUsdGhpcy5saW5lcy5sZW5ndGgpLHRoaXMuc3RhdGVzLnNwbGljZSh0aGlzLmN1cnJlbnRMaW5lLHRoaXMuc3RhdGVzLmxlbmd0aCksdGhpcy5zdG9wKCksdGhpcy5ydW5uaW5nPXNldFRpbWVvdXQodGhpcy4kd29ya2VyLDcwMCl9LHRoaXMuc2NoZWR1bGVTdGFydD1mdW5jdGlvbigpe3RoaXMucnVubmluZ3x8KHRoaXMucnVubmluZz1zZXRUaW1lb3V0KHRoaXMuJHdvcmtlciw3MDApKX0sdGhpcy4kdXBkYXRlT25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdGFydC5yb3csbj1lLmVuZC5yb3ctdDtpZihuPT09MCl0aGlzLmxpbmVzW3RdPW51bGw7ZWxzZSBpZihlLmFjdGlvbj09InJlbW92ZSIpdGhpcy5saW5lcy5zcGxpY2UodCxuKzEsbnVsbCksdGhpcy5zdGF0ZXMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9QXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLmxpbmVzLnNwbGljZS5hcHBseSh0aGlzLmxpbmVzLHIpLHRoaXMuc3RhdGVzLnNwbGljZS5hcHBseSh0aGlzLnN0YXRlcyxyKX10aGlzLmN1cnJlbnRMaW5lPU1hdGgubWluKHQsdGhpcy5jdXJyZW50TGluZSx0aGlzLmRvYy5nZXRMZW5ndGgoKSksdGhpcy5zdG9wKCl9LHRoaXMuc3RvcD1mdW5jdGlvbigpe3RoaXMucnVubmluZyYmY2xlYXJUaW1lb3V0KHRoaXMucnVubmluZyksdGhpcy5ydW5uaW5nPSExfSx0aGlzLmdldFRva2Vucz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5saW5lc1tlXXx8dGhpcy4kdG9rZW5pemVSb3coZSl9LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY3VycmVudExpbmU9PWUmJnRoaXMuJHRva2VuaXplUm93KGUpLHRoaXMuc3RhdGVzW2VdfHwic3RhcnQifSx0aGlzLiR0b2tlbml6ZVJvdz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmRvYy5nZXRMaW5lKGUpLG49dGhpcy5zdGF0ZXNbZS0xXSxyPXRoaXMudG9rZW5pemVyLmdldExpbmVUb2tlbnModCxuLGUpO3JldHVybiB0aGlzLnN0YXRlc1tlXSsiIiE9ci5zdGF0ZSsiIj8odGhpcy5zdGF0ZXNbZV09ci5zdGF0ZSx0aGlzLmxpbmVzW2UrMV09bnVsbCx0aGlzLmN1cnJlbnRMaW5lPmUrMSYmKHRoaXMuY3VycmVudExpbmU9ZSsxKSk6dGhpcy5jdXJyZW50TGluZT09ZSYmKHRoaXMuY3VycmVudExpbmU9ZSsxKSx0aGlzLmxpbmVzW2VdPXIudG9rZW5zfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuQmFja2dyb3VuZFRva2VuaXplcj1zfSksYWNlLmRlZmluZSgiYWNlL3NlYXJjaF9oaWdobGlnaHQiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL29vcCIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvbGFuZyIpLGk9ZSgiLi9saWIvb29wIikscz1lKCIuL3JhbmdlIikuUmFuZ2Usbz1mdW5jdGlvbihlLHQsbil7dGhpcy5zZXRSZWdleHAoZSksdGhpcy5jbGF6ej10LHRoaXMudHlwZT1ufHwidGV4dCJ9OyhmdW5jdGlvbigpe3RoaXMuTUFYX1JBTkdFUz01MDAsdGhpcy5zZXRSZWdleHA9ZnVuY3Rpb24oZSl7aWYodGhpcy5yZWdFeHArIiI9PWUrIiIpcmV0dXJuO3RoaXMucmVnRXhwPWUsdGhpcy5jYWNoZT1bXX0sdGhpcy51cGRhdGU9ZnVuY3Rpb24oZSx0LG4saSl7aWYoIXRoaXMucmVnRXhwKXJldHVybjt2YXIgbz1pLmZpcnN0Um93LHU9aS5sYXN0Um93O2Zvcih2YXIgYT1vO2E8PXU7YSsrKXt2YXIgZj10aGlzLmNhY2hlW2FdO2Y9PW51bGwmJihmPXIuZ2V0TWF0Y2hPZmZzZXRzKG4uZ2V0TGluZShhKSx0aGlzLnJlZ0V4cCksZi5sZW5ndGg+dGhpcy5NQVhfUkFOR0VTJiYoZj1mLnNsaWNlKDAsdGhpcy5NQVhfUkFOR0VTKSksZj1mLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gbmV3IHMoYSxlLm9mZnNldCxhLGUub2Zmc2V0K2UubGVuZ3RoKX0pLHRoaXMuY2FjaGVbYV09Zi5sZW5ndGg/ZjoiIik7Zm9yKHZhciBsPWYubGVuZ3RoO2wtLTspdC5kcmF3U2luZ2xlTGluZU1hcmtlcihlLGZbbF0udG9TY3JlZW5SYW5nZShuKSx0aGlzLmNsYXp6LGkpfX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlNlYXJjaEhpZ2hsaWdodD1vfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkX2xpbmUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGkoZSx0KXt0aGlzLmZvbGREYXRhPWUsQXJyYXkuaXNBcnJheSh0KT90aGlzLmZvbGRzPXQ6dD10aGlzLmZvbGRzPVt0XTt2YXIgbj10W3QubGVuZ3RoLTFdO3RoaXMucmFuZ2U9bmV3IHIodFswXS5zdGFydC5yb3csdFswXS5zdGFydC5jb2x1bW4sbi5lbmQucm93LG4uZW5kLmNvbHVtbiksdGhpcy5zdGFydD10aGlzLnJhbmdlLnN0YXJ0LHRoaXMuZW5kPXRoaXMucmFuZ2UuZW5kLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNldEZvbGRMaW5lKHRoaXMpfSx0aGlzKX12YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlOyhmdW5jdGlvbigpe3RoaXMuc2hpZnRSb3c9ZnVuY3Rpb24oZSl7dGhpcy5zdGFydC5yb3crPWUsdGhpcy5lbmQucm93Kz1lLHRoaXMuZm9sZHMuZm9yRWFjaChmdW5jdGlvbih0KXt0LnN0YXJ0LnJvdys9ZSx0LmVuZC5yb3crPWV9KX0sdGhpcy5hZGRGb2xkPWZ1bmN0aW9uKGUpe2lmKGUuc2FtZVJvdyl7aWYoZS5zdGFydC5yb3c8dGhpcy5zdGFydFJvd3x8ZS5lbmRSb3c+dGhpcy5lbmRSb3cpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBhZGQgYSBmb2xkIHRvIHRoaXMgRm9sZExpbmUgYXMgaXQgaGFzIG5vIGNvbm5lY3Rpb24iKTt0aGlzLmZvbGRzLnB1c2goZSksdGhpcy5mb2xkcy5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuLWUucmFuZ2UuY29tcGFyZUVuZCh0LnN0YXJ0LnJvdyx0LnN0YXJ0LmNvbHVtbil9KSx0aGlzLnJhbmdlLmNvbXBhcmVFbmQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pPjA/KHRoaXMuZW5kLnJvdz1lLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWUuZW5kLmNvbHVtbik6dGhpcy5yYW5nZS5jb21wYXJlU3RhcnQoZS5lbmQucm93LGUuZW5kLmNvbHVtbik8MCYmKHRoaXMuc3RhcnQucm93PWUuc3RhcnQucm93LHRoaXMuc3RhcnQuY29sdW1uPWUuc3RhcnQuY29sdW1uKX1lbHNlIGlmKGUuc3RhcnQucm93PT10aGlzLmVuZC5yb3cpdGhpcy5mb2xkcy5wdXNoKGUpLHRoaXMuZW5kLnJvdz1lLmVuZC5yb3csdGhpcy5lbmQuY29sdW1uPWUuZW5kLmNvbHVtbjtlbHNle2lmKGUuZW5kLnJvdyE9dGhpcy5zdGFydC5yb3cpdGhyb3cgbmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGZvbGQgdG8gRm9sZFJvdyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIG1hdGNoaW5nIHJvdyIpO3RoaXMuZm9sZHMudW5zaGlmdChlKSx0aGlzLnN0YXJ0LnJvdz1lLnN0YXJ0LnJvdyx0aGlzLnN0YXJ0LmNvbHVtbj1lLnN0YXJ0LmNvbHVtbn1lLmZvbGRMaW5lPXRoaXN9LHRoaXMuY29udGFpbnNSb3c9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuc3RhcnQucm93JiZlPD10aGlzLmVuZC5yb3d9LHRoaXMud2Fsaz1mdW5jdGlvbihlLHQsbil7dmFyIHI9MCxpPXRoaXMuZm9sZHMscyxvLHUsYT0hMDt0PT1udWxsJiYodD10aGlzLmVuZC5yb3csbj10aGlzLmVuZC5jb2x1bW4pO2Zvcih2YXIgZj0wO2Y8aS5sZW5ndGg7ZisrKXtzPWlbZl0sbz1zLnJhbmdlLmNvbXBhcmVTdGFydCh0LG4pO2lmKG89PS0xKXtlKG51bGwsdCxuLHIsYSk7cmV0dXJufXU9ZShudWxsLHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uLHIsYSksdT0hdSYmZShzLnBsYWNlaG9sZGVyLHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uLHIpO2lmKHV8fG89PT0wKXJldHVybjthPSFzLnNhbWVSb3cscj1zLmVuZC5jb2x1bW59ZShudWxsLHQsbixyLGEpfSx0aGlzLmdldE5leHRGb2xkVG89ZnVuY3Rpb24oZSx0KXt2YXIgbixyO2Zvcih2YXIgaT0wO2k8dGhpcy5mb2xkcy5sZW5ndGg7aSsrKXtuPXRoaXMuZm9sZHNbaV0scj1uLnJhbmdlLmNvbXBhcmVFbmQoZSx0KTtpZihyPT0tMSlyZXR1cm57Zm9sZDpuLGtpbmQ6ImFmdGVyIn07aWYocj09PTApcmV0dXJue2ZvbGQ6bixraW5kOiJpbnNpZGUifX1yZXR1cm4gbnVsbH0sdGhpcy5hZGRSZW1vdmVDaGFycz1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5nZXROZXh0Rm9sZFRvKGUsdCksaSxzO2lmKHIpe2k9ci5mb2xkO2lmKHIua2luZD09Imluc2lkZSImJmkuc3RhcnQuY29sdW1uIT10JiZpLnN0YXJ0LnJvdyE9ZSl3aW5kb3cuY29uc29sZSYmd2luZG93LmNvbnNvbGUubG9nKGUsdCxpKTtlbHNlIGlmKGkuc3RhcnQucm93PT1lKXtzPXRoaXMuZm9sZHM7dmFyIG89cy5pbmRleE9mKGkpO289PT0wJiYodGhpcy5zdGFydC5jb2x1bW4rPW4pO2ZvcihvO288cy5sZW5ndGg7bysrKXtpPXNbb10saS5zdGFydC5jb2x1bW4rPW47aWYoIWkuc2FtZVJvdylyZXR1cm47aS5lbmQuY29sdW1uKz1ufXRoaXMuZW5kLmNvbHVtbis9bn19fSx0aGlzLnNwbGl0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXROZXh0Rm9sZFRvKGUsdCk7aWYoIW58fG4ua2luZD09Imluc2lkZSIpcmV0dXJuIG51bGw7dmFyIHI9bi5mb2xkLHM9dGhpcy5mb2xkcyxvPXRoaXMuZm9sZERhdGEsdT1zLmluZGV4T2YociksYT1zW3UtMV07dGhpcy5lbmQucm93PWEuZW5kLnJvdyx0aGlzLmVuZC5jb2x1bW49YS5lbmQuY29sdW1uLHM9cy5zcGxpY2UodSxzLmxlbmd0aC11KTt2YXIgZj1uZXcgaShvLHMpO3JldHVybiBvLnNwbGljZShvLmluZGV4T2YodGhpcykrMSwwLGYpLGZ9LHRoaXMubWVyZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5mb2xkcztmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0aGlzLmFkZEZvbGQodFtuXSk7dmFyIHI9dGhpcy5mb2xkRGF0YTtyLnNwbGljZShyLmluZGV4T2YoZSksMSl9LHRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXt2YXIgZT1bdGhpcy5yYW5nZS50b1N0cmluZygpKyI6IFsiXTtyZXR1cm4gdGhpcy5mb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UucHVzaCgiICAiK3QudG9TdHJpbmcoKSl9KSxlLnB1c2goIl0iKSxlLmpvaW4oIlxuIil9LHRoaXMuaWR4VG9Qb3NpdGlvbj1mdW5jdGlvbihlKXt2YXIgdD0wO2Zvcih2YXIgbj0wO248dGhpcy5mb2xkcy5sZW5ndGg7bisrKXt2YXIgcj10aGlzLmZvbGRzW25dO2UtPXIuc3RhcnQuY29sdW1uLXQ7aWYoZTwwKXJldHVybntyb3c6ci5zdGFydC5yb3csY29sdW1uOnIuc3RhcnQuY29sdW1uK2V9O2UtPXIucGxhY2Vob2xkZXIubGVuZ3RoO2lmKGU8MClyZXR1cm4gci5zdGFydDt0PXIuZW5kLmNvbHVtbn1yZXR1cm57cm93OnRoaXMuZW5kLnJvdyxjb2x1bW46dGhpcy5lbmQuY29sdW1uK2V9fX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuRm9sZExpbmU9aX0pLGFjZS5kZWZpbmUoImFjZS9yYW5nZV9saXN0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuL3JhbmdlIikuUmFuZ2UsaT1yLmNvbXBhcmVQb2ludHMscz1mdW5jdGlvbigpe3RoaXMucmFuZ2VzPVtdLHRoaXMuJGJpYXM9MX07KGZ1bmN0aW9uKCl7dGhpcy5jb21wYXJlUG9pbnRzPWksdGhpcy5wb2ludEluZGV4PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLnJhbmdlcztmb3IodmFyIHM9bnx8MDtzPHIubGVuZ3RoO3MrKyl7dmFyIG89cltzXSx1PWkoZSxvLmVuZCk7aWYodT4wKWNvbnRpbnVlO3ZhciBhPWkoZSxvLnN0YXJ0KTtyZXR1cm4gdT09PTA/dCYmYSE9PTA/LXMtMjpzOmE+MHx8YT09PTAmJiF0P3M6LXMtMX1yZXR1cm4tcy0xfSx0aGlzLmFkZD1mdW5jdGlvbihlKXt2YXIgdD0hZS5pc0VtcHR5KCksbj10aGlzLnBvaW50SW5kZXgoZS5zdGFydCx0KTtuPDAmJihuPS1uLTEpO3ZhciByPXRoaXMucG9pbnRJbmRleChlLmVuZCx0LG4pO3JldHVybiByPDA/cj0tci0xOnIrKyx0aGlzLnJhbmdlcy5zcGxpY2UobixyLW4sZSl9LHRoaXMuYWRkTGlzdD1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49ZS5sZW5ndGg7bi0tOyl0LnB1c2guYXBwbHkodCx0aGlzLmFkZChlW25dKSk7cmV0dXJuIHR9LHRoaXMuc3Vic3RyYWN0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5wb2ludEluZGV4KGUpO2lmKHQ+PTApcmV0dXJuIHRoaXMucmFuZ2VzLnNwbGljZSh0LDEpfSx0aGlzLm1lcmdlPWZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJhbmdlczt0PXQuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBpKGUuc3RhcnQsdC5zdGFydCl9KTt2YXIgbj10WzBdLHI7Zm9yKHZhciBzPTE7czx0Lmxlbmd0aDtzKyspe3I9bixuPXRbc107dmFyIG89aShyLmVuZCxuLnN0YXJ0KTtpZihvPDApY29udGludWU7aWYobz09MCYmIXIuaXNFbXB0eSgpJiYhbi5pc0VtcHR5KCkpY29udGludWU7aShyLmVuZCxuLmVuZCk8MCYmKHIuZW5kLnJvdz1uLmVuZC5yb3csci5lbmQuY29sdW1uPW4uZW5kLmNvbHVtbiksdC5zcGxpY2UocywxKSxlLnB1c2gobiksbj1yLHMtLX1yZXR1cm4gdGhpcy5yYW5nZXM9dCxlfSx0aGlzLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMucG9pbnRJbmRleCh7cm93OmUsY29sdW1uOnR9KT49MH0sdGhpcy5jb250YWluc1BvaW50PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBvaW50SW5kZXgoZSk+PTB9LHRoaXMucmFuZ2VBdFBvaW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucG9pbnRJbmRleChlKTtpZih0Pj0wKXJldHVybiB0aGlzLnJhbmdlc1t0XX0sdGhpcy5jbGlwUm93cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmFuZ2VzO2lmKG5bMF0uc3RhcnQucm93PnR8fG5bbi5sZW5ndGgtMV0uc3RhcnQucm93PGUpcmV0dXJuW107dmFyIHI9dGhpcy5wb2ludEluZGV4KHtyb3c6ZSxjb2x1bW46MH0pO3I8MCYmKHI9LXItMSk7dmFyIGk9dGhpcy5wb2ludEluZGV4KHtyb3c6dCxjb2x1bW46MH0scik7aTwwJiYoaT0taS0xKTt2YXIgcz1bXTtmb3IodmFyIG89cjtvPGk7bysrKXMucHVzaChuW29dKTtyZXR1cm4gc30sdGhpcy5yZW1vdmVBbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yYW5nZXMuc3BsaWNlKDAsdGhpcy5yYW5nZXMubGVuZ3RoKX0sdGhpcy5hdHRhY2g9ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLmRldGFjaCgpLHRoaXMuc2Vzc2lvbj1lLHRoaXMub25DaGFuZ2U9dGhpcy4kb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZSIsdGhpcy5vbkNoYW5nZSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7aWYoIXRoaXMuc2Vzc2lvbilyZXR1cm47dGhpcy5zZXNzaW9uLnJlbW92ZUxpc3RlbmVyKCJjaGFuZ2UiLHRoaXMub25DaGFuZ2UpLHRoaXMuc2Vzc2lvbj1udWxsfSx0aGlzLiRvbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LG49ZS5lbmQscj10LnJvdyxpPW4ucm93LHM9dGhpcy5yYW5nZXM7Zm9yKHZhciBvPTAsdT1zLmxlbmd0aDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuZW5kLnJvdz49cilicmVha31pZihlLmFjdGlvbj09Imluc2VydCIpe3ZhciBmPWktcixsPS10LmNvbHVtbituLmNvbHVtbjtmb3IoO288dTtvKyspe3ZhciBhPXNbb107aWYoYS5zdGFydC5yb3c+cilicmVhazthLnN0YXJ0LnJvdz09ciYmYS5zdGFydC5jb2x1bW4+PXQuY29sdW1uJiYoYS5zdGFydC5jb2x1bW49PXQuY29sdW1uJiZ0aGlzLiRiaWFzPD0wfHwoYS5zdGFydC5jb2x1bW4rPWwsYS5zdGFydC5yb3crPWYpKTtpZihhLmVuZC5yb3c9PXImJmEuZW5kLmNvbHVtbj49dC5jb2x1bW4pe2lmKGEuZW5kLmNvbHVtbj09dC5jb2x1bW4mJnRoaXMuJGJpYXM8MCljb250aW51ZTthLmVuZC5jb2x1bW49PXQuY29sdW1uJiZsPjAmJm88dS0xJiZhLmVuZC5jb2x1bW4+YS5zdGFydC5jb2x1bW4mJmEuZW5kLmNvbHVtbj09c1tvKzFdLnN0YXJ0LmNvbHVtbiYmKGEuZW5kLmNvbHVtbi09bCksYS5lbmQuY29sdW1uKz1sLGEuZW5kLnJvdys9Zn19fWVsc2V7dmFyIGY9ci1pLGw9dC5jb2x1bW4tbi5jb2x1bW47Zm9yKDtvPHU7bysrKXt2YXIgYT1zW29dO2lmKGEuc3RhcnQucm93PmkpYnJlYWs7aWYoYS5lbmQucm93PGkmJihyPGEuZW5kLnJvd3x8cj09YS5lbmQucm93JiZ0LmNvbHVtbjxhLmVuZC5jb2x1bW4pKWEuZW5kLnJvdz1yLGEuZW5kLmNvbHVtbj10LmNvbHVtbjtlbHNlIGlmKGEuZW5kLnJvdz09aSlpZihhLmVuZC5jb2x1bW48PW4uY29sdW1uKXtpZihmfHxhLmVuZC5jb2x1bW4+dC5jb2x1bW4pYS5lbmQuY29sdW1uPXQuY29sdW1uLGEuZW5kLnJvdz10LnJvd31lbHNlIGEuZW5kLmNvbHVtbis9bCxhLmVuZC5yb3crPWY7ZWxzZSBhLmVuZC5yb3c+aSYmKGEuZW5kLnJvdys9Zik7aWYoYS5zdGFydC5yb3c8aSYmKHI8YS5zdGFydC5yb3d8fHI9PWEuc3RhcnQucm93JiZ0LmNvbHVtbjxhLnN0YXJ0LmNvbHVtbikpYS5zdGFydC5yb3c9cixhLnN0YXJ0LmNvbHVtbj10LmNvbHVtbjtlbHNlIGlmKGEuc3RhcnQucm93PT1pKWlmKGEuc3RhcnQuY29sdW1uPD1uLmNvbHVtbil7aWYoZnx8YS5zdGFydC5jb2x1bW4+dC5jb2x1bW4pYS5zdGFydC5jb2x1bW49dC5jb2x1bW4sYS5zdGFydC5yb3c9dC5yb3d9ZWxzZSBhLnN0YXJ0LmNvbHVtbis9bCxhLnN0YXJ0LnJvdys9ZjtlbHNlIGEuc3RhcnQucm93PmkmJihhLnN0YXJ0LnJvdys9Zil9fWlmKGYhPTAmJm88dSlmb3IoO288dTtvKyspe3ZhciBhPXNbb107YS5zdGFydC5yb3crPWYsYS5lbmQucm93Kz1mfX19KS5jYWxsKHMucHJvdG90eXBlKSx0LlJhbmdlTGlzdD1zfSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9mb2xkIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlX2xpc3QiLCJhY2UvbGliL29vcCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlLHQpe2Uucm93LT10LnJvdyxlLnJvdz09MCYmKGUuY29sdW1uLT10LmNvbHVtbil9ZnVuY3Rpb24gdShlLHQpe28oZS5zdGFydCx0KSxvKGUuZW5kLHQpfWZ1bmN0aW9uIGEoZSx0KXtlLnJvdz09MCYmKGUuY29sdW1uKz10LmNvbHVtbiksZS5yb3crPXQucm93fWZ1bmN0aW9uIGYoZSx0KXthKGUuc3RhcnQsdCksYShlLmVuZCx0KX12YXIgcj1lKCIuLi9yYW5nZV9saXN0IikuUmFuZ2VMaXN0LGk9ZSgiLi4vbGliL29vcCIpLHM9dC5Gb2xkPWZ1bmN0aW9uKGUsdCl7dGhpcy5mb2xkTGluZT1udWxsLHRoaXMucGxhY2Vob2xkZXI9dCx0aGlzLnJhbmdlPWUsdGhpcy5zdGFydD1lLnN0YXJ0LHRoaXMuZW5kPWUuZW5kLHRoaXMuc2FtZVJvdz1lLnN0YXJ0LnJvdz09ZS5lbmQucm93LHRoaXMuc3ViRm9sZHM9dGhpcy5yYW5nZXM9W119O2kuaW5oZXJpdHMocyxyKSxmdW5jdGlvbigpe3RoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4nIicrdGhpcy5wbGFjZWhvbGRlcisnIiAnK3RoaXMucmFuZ2UudG9TdHJpbmcoKX0sdGhpcy5zZXRGb2xkTGluZT1mdW5jdGlvbihlKXt0aGlzLmZvbGRMaW5lPWUsdGhpcy5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2V0Rm9sZExpbmUoZSl9KX0sdGhpcy5jbG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMucmFuZ2UuY2xvbmUoKSx0PW5ldyBzKGUsdGhpcy5wbGFjZWhvbGRlcik7cmV0dXJuIHRoaXMuc3ViRm9sZHMuZm9yRWFjaChmdW5jdGlvbihlKXt0LnN1YkZvbGRzLnB1c2goZS5jbG9uZSgpKX0pLHQuY29sbGFwc2VDaGlsZHJlbj10aGlzLmNvbGxhcHNlQ2hpbGRyZW4sdH0sdGhpcy5hZGRTdWJGb2xkPWZ1bmN0aW9uKGUpe2lmKHRoaXMucmFuZ2UuaXNFcXVhbChlKSlyZXR1cm47dShlLHRoaXMuc3RhcnQpO3ZhciB0PWUuc3RhcnQucm93LG49ZS5zdGFydC5jb2x1bW47Zm9yKHZhciByPTAsaT0tMTtyPHRoaXMuc3ViRm9sZHMubGVuZ3RoO3IrKyl7aT10aGlzLnN1YkZvbGRzW3JdLnJhbmdlLmNvbXBhcmUodCxuKTtpZihpIT0xKWJyZWFrfXZhciBzPXRoaXMuc3ViRm9sZHNbcl0sbz0wO2lmKGk9PTApe2lmKHMucmFuZ2UuY29udGFpbnNSYW5nZShlKSlyZXR1cm4gcy5hZGRTdWJGb2xkKGUpO289MX12YXIgdD1lLnJhbmdlLmVuZC5yb3csbj1lLnJhbmdlLmVuZC5jb2x1bW47Zm9yKHZhciBhPXIsaT0tMTthPHRoaXMuc3ViRm9sZHMubGVuZ3RoO2ErKyl7aT10aGlzLnN1YkZvbGRzW2FdLnJhbmdlLmNvbXBhcmUodCxuKTtpZihpIT0xKWJyZWFrfWk9PTAmJmErKzt2YXIgZj10aGlzLnN1YkZvbGRzLnNwbGljZShyLGEtcixlKSxsPWk9PTA/Zi5sZW5ndGgtMTpmLmxlbmd0aDtmb3IodmFyIGM9bztjPGw7YysrKWUuYWRkU3ViRm9sZChmW2NdKTtyZXR1cm4gZS5zZXRGb2xkTGluZSh0aGlzLmZvbGRMaW5lKSxlfSx0aGlzLnJlc3RvcmVSYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gZihlLHRoaXMuc3RhcnQpfX0uY2FsbChzLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRpbmciLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiLCJhY2UvZWRpdF9zZXNzaW9uL2ZvbGRfbGluZSIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZCIsImFjZS90b2tlbl9pdGVyYXRvciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gdSgpe3RoaXMuZ2V0Rm9sZEF0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFyKXJldHVybiBudWxsO3ZhciBpPXIuZm9sZHM7Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBvPWlbc10ucmFuZ2U7aWYoby5jb250YWlucyhlLHQpKXtpZihuPT0xJiZvLmlzRW5kKGUsdCkmJiFvLmlzRW1wdHkoKSljb250aW51ZTtpZihuPT0tMSYmby5pc1N0YXJ0KGUsdCkmJiFvLmlzRW1wdHkoKSljb250aW51ZTtyZXR1cm4gaVtzXX19fSx0aGlzLmdldEZvbGRzSW5SYW5nZT1mdW5jdGlvbihlKXt2YXIgdD1lLnN0YXJ0LG49ZS5lbmQscj10aGlzLiRmb2xkRGF0YSxpPVtdO3QuY29sdW1uKz0xLG4uY29sdW1uLT0xO2Zvcih2YXIgcz0wO3M8ci5sZW5ndGg7cysrKXt2YXIgbz1yW3NdLnJhbmdlLmNvbXBhcmVSYW5nZShlKTtpZihvPT0yKWNvbnRpbnVlO2lmKG89PS0yKWJyZWFrO3ZhciB1PXJbc10uZm9sZHM7Zm9yKHZhciBhPTA7YTx1Lmxlbmd0aDthKyspe3ZhciBmPXVbYV07bz1mLnJhbmdlLmNvbXBhcmVSYW5nZShlKTtpZihvPT0tMilicmVhaztpZihvPT0yKWNvbnRpbnVlO2lmKG89PTQyKWJyZWFrO2kucHVzaChmKX19cmV0dXJuIHQuY29sdW1uLT0xLG4uY29sdW1uKz0xLGl9LHRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgdD1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSl7dD10LmNvbmNhdCh0aGlzLmdldEZvbGRzSW5SYW5nZShlKSl9LHRoaXMpfWVsc2UgdmFyIHQ9dGhpcy5nZXRGb2xkc0luUmFuZ2UoZSk7cmV0dXJuIHR9LHRoaXMuZ2V0QWxsRm9sZHM9ZnVuY3Rpb24oKXt2YXIgZT1bXSx0PXRoaXMuJGZvbGREYXRhO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWZvcih2YXIgcj0wO3I8dFtuXS5mb2xkcy5sZW5ndGg7cisrKWUucHVzaCh0W25dLmZvbGRzW3JdKTtyZXR1cm4gZX0sdGhpcy5nZXRGb2xkU3RyaW5nQXQ9ZnVuY3Rpb24oZSx0LG4scil7cj1yfHx0aGlzLmdldEZvbGRMaW5lKGUpO2lmKCFyKXJldHVybiBudWxsO3ZhciBpPXtlbmQ6e2NvbHVtbjowfX0scyxvO2Zvcih2YXIgdT0wO3U8ci5mb2xkcy5sZW5ndGg7dSsrKXtvPXIuZm9sZHNbdV07dmFyIGE9by5yYW5nZS5jb21wYXJlRW5kKGUsdCk7aWYoYT09LTEpe3M9dGhpcy5nZXRMaW5lKG8uc3RhcnQucm93KS5zdWJzdHJpbmcoaS5lbmQuY29sdW1uLG8uc3RhcnQuY29sdW1uKTticmVha31pZihhPT09MClyZXR1cm4gbnVsbDtpPW99cmV0dXJuIHN8fChzPXRoaXMuZ2V0TGluZShvLnN0YXJ0LnJvdykuc3Vic3RyaW5nKGkuZW5kLmNvbHVtbikpLG49PS0xP3Muc3Vic3RyaW5nKDAsdC1pLmVuZC5jb2x1bW4pOm49PTE/cy5zdWJzdHJpbmcodC1pLmVuZC5jb2x1bW4pOnN9LHRoaXMuZ2V0Rm9sZExpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPTA7dCYmKHI9bi5pbmRleE9mKHQpKSxyPT0tMSYmKHI9MCk7Zm9yKHI7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoaS5zdGFydC5yb3c8PWUmJmkuZW5kLnJvdz49ZSlyZXR1cm4gaTtpZihpLmVuZC5yb3c+ZSlyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH0sdGhpcy5nZXROZXh0Rm9sZExpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRmb2xkRGF0YSxyPTA7dCYmKHI9bi5pbmRleE9mKHQpKSxyPT0tMSYmKHI9MCk7Zm9yKHI7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl07aWYoaS5lbmQucm93Pj1lKXJldHVybiBpfXJldHVybiBudWxsfSx0aGlzLmdldEZvbGRlZFJvd0NvdW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kZm9sZERhdGEscj10LWUrMTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHM9bltpXSxvPXMuZW5kLnJvdyx1PXMuc3RhcnQucm93O2lmKG8+PXQpe3U8dCYmKHU+PWU/ci09dC11OnI9MCk7YnJlYWt9bz49ZSYmKHU+PWU/ci09by11OnItPW8tZSsxKX1yZXR1cm4gcn0sdGhpcy4kYWRkRm9sZExpbmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJGZvbGREYXRhLnB1c2goZSksdGhpcy4kZm9sZERhdGEuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnN0YXJ0LnJvdy10LnN0YXJ0LnJvd30pLGV9LHRoaXMuYWRkRm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuJGZvbGREYXRhLHI9ITEsbztlIGluc3RhbmNlb2Ygcz9vPWU6KG89bmV3IHModCxlKSxvLmNvbGxhcHNlQ2hpbGRyZW49dC5jb2xsYXBzZUNoaWxkcmVuKSx0aGlzLiRjbGlwUmFuZ2VUb0RvY3VtZW50KG8ucmFuZ2UpO3ZhciB1PW8uc3RhcnQucm93LGE9by5zdGFydC5jb2x1bW4sZj1vLmVuZC5yb3csbD1vLmVuZC5jb2x1bW4sYz10aGlzLmdldEZvbGRBdCh1LGEsMSksaD10aGlzLmdldEZvbGRBdChmLGwsLTEpO2lmKGMmJmg9PWMpcmV0dXJuIGMuYWRkU3ViRm9sZChvKTtjJiYhYy5yYW5nZS5pc1N0YXJ0KHUsYSkmJnRoaXMucmVtb3ZlRm9sZChjKSxoJiYhaC5yYW5nZS5pc0VuZChmLGwpJiZ0aGlzLnJlbW92ZUZvbGQoaCk7dmFyIHA9dGhpcy5nZXRGb2xkc0luUmFuZ2Uoby5yYW5nZSk7cC5sZW5ndGg+MCYmKHRoaXMucmVtb3ZlRm9sZHMocCkscC5mb3JFYWNoKGZ1bmN0aW9uKGUpe28uYWRkU3ViRm9sZChlKX0pKTtmb3IodmFyIGQ9MDtkPG4ubGVuZ3RoO2QrKyl7dmFyIHY9bltkXTtpZihmPT12LnN0YXJ0LnJvdyl7di5hZGRGb2xkKG8pLHI9ITA7YnJlYWt9aWYodT09di5lbmQucm93KXt2LmFkZEZvbGQobykscj0hMDtpZighby5zYW1lUm93KXt2YXIgbT1uW2QrMV07aWYobSYmbS5zdGFydC5yb3c9PWYpe3YubWVyZ2UobSk7YnJlYWt9fWJyZWFrfWlmKGY8PXYuc3RhcnQucm93KWJyZWFrfXJldHVybiByfHwodj10aGlzLiRhZGRGb2xkTGluZShuZXcgaSh0aGlzLiRmb2xkRGF0YSxvKSkpLHRoaXMuJHVzZVdyYXBNb2RlP3RoaXMuJHVwZGF0ZVdyYXBEYXRhKHYuc3RhcnQucm93LHYuc3RhcnQucm93KTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZSh2LnN0YXJ0LnJvdyx2LnN0YXJ0LnJvdyksdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy5fc2lnbmFsKCJjaGFuZ2VGb2xkIix7ZGF0YTpvLGFjdGlvbjoiYWRkIn0pLG99LHRoaXMuYWRkRm9sZHM9ZnVuY3Rpb24oZSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuYWRkRm9sZChlKX0sdGhpcyl9LHRoaXMucmVtb3ZlRm9sZD1mdW5jdGlvbihlKXt2YXIgdD1lLmZvbGRMaW5lLG49dC5zdGFydC5yb3cscj10LmVuZC5yb3csaT10aGlzLiRmb2xkRGF0YSxzPXQuZm9sZHM7aWYocy5sZW5ndGg9PTEpaS5zcGxpY2UoaS5pbmRleE9mKHQpLDEpO2Vsc2UgaWYodC5yYW5nZS5pc0VuZChlLmVuZC5yb3csZS5lbmQuY29sdW1uKSlzLnBvcCgpLHQuZW5kLnJvdz1zW3MubGVuZ3RoLTFdLmVuZC5yb3csdC5lbmQuY29sdW1uPXNbcy5sZW5ndGgtMV0uZW5kLmNvbHVtbjtlbHNlIGlmKHQucmFuZ2UuaXNTdGFydChlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbikpcy5zaGlmdCgpLHQuc3RhcnQucm93PXNbMF0uc3RhcnQucm93LHQuc3RhcnQuY29sdW1uPXNbMF0uc3RhcnQuY29sdW1uO2Vsc2UgaWYoZS5zYW1lUm93KXMuc3BsaWNlKHMuaW5kZXhPZihlKSwxKTtlbHNle3ZhciBvPXQuc3BsaXQoZS5zdGFydC5yb3csZS5zdGFydC5jb2x1bW4pO3M9by5mb2xkcyxzLnNoaWZ0KCksby5zdGFydC5yb3c9c1swXS5zdGFydC5yb3csby5zdGFydC5jb2x1bW49c1swXS5zdGFydC5jb2x1bW59dGhpcy4kdXBkYXRpbmd8fCh0aGlzLiR1c2VXcmFwTW9kZT90aGlzLiR1cGRhdGVXcmFwRGF0YShuLHIpOnRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlKG4scikpLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuX3NpZ25hbCgiY2hhbmdlRm9sZCIse2RhdGE6ZSxhY3Rpb246InJlbW92ZSJ9KX0sdGhpcy5yZW1vdmVGb2xkcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goZVtuXSk7dC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMucmVtb3ZlRm9sZChlKX0sdGhpcyksdGhpcy4kbW9kaWZpZWQ9ITB9LHRoaXMuZXhwYW5kRm9sZD1mdW5jdGlvbihlKXt0aGlzLnJlbW92ZUZvbGQoZSksZS5zdWJGb2xkcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe2UucmVzdG9yZVJhbmdlKHQpLHRoaXMuYWRkRm9sZCh0KX0sdGhpcyksZS5jb2xsYXBzZUNoaWxkcmVuPjAmJnRoaXMuZm9sZEFsbChlLnN0YXJ0LnJvdysxLGUuZW5kLnJvdyxlLmNvbGxhcHNlQ2hpbGRyZW4tMSksZS5zdWJGb2xkcz1bXX0sdGhpcy5leHBhbmRGb2xkcz1mdW5jdGlvbihlKXtlLmZvckVhY2goZnVuY3Rpb24oZSl7dGhpcy5leHBhbmRGb2xkKGUpfSx0aGlzKX0sdGhpcy51bmZvbGQ9ZnVuY3Rpb24oZSx0KXt2YXIgbixpO2U9PW51bGw/KG49bmV3IHIoMCwwLHRoaXMuZ2V0TGVuZ3RoKCksMCksdD0hMCk6dHlwZW9mIGU9PSJudW1iZXIiP249bmV3IHIoZSwwLGUsdGhpcy5nZXRMaW5lKGUpLmxlbmd0aCk6InJvdyJpbiBlP249ci5mcm9tUG9pbnRzKGUsZSk6bj1lLGk9dGhpcy5nZXRGb2xkc0luUmFuZ2VMaXN0KG4pO2lmKHQpdGhpcy5yZW1vdmVGb2xkcyhpKTtlbHNle3ZhciBzPWk7d2hpbGUocy5sZW5ndGgpdGhpcy5leHBhbmRGb2xkcyhzKSxzPXRoaXMuZ2V0Rm9sZHNJblJhbmdlTGlzdChuKX1pZihpLmxlbmd0aClyZXR1cm4gaX0sdGhpcy5pc1Jvd0ZvbGRlZD1mdW5jdGlvbihlLHQpe3JldHVybiEhdGhpcy5nZXRGb2xkTGluZShlLHQpfSx0aGlzLmdldFJvd0ZvbGRFbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmdldEZvbGRMaW5lKGUsdCk7cmV0dXJuIG4/bi5lbmQucm93OmV9LHRoaXMuZ2V0Um93Rm9sZFN0YXJ0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRGb2xkTGluZShlLHQpO3JldHVybiBuP24uc3RhcnQucm93OmV9LHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lPWZ1bmN0aW9uKGUsdCxuLHIsaSl7cj09bnVsbCYmKHI9ZS5zdGFydC5yb3cpLGk9PW51bGwmJihpPTApLHQ9PW51bGwmJih0PWUuZW5kLnJvdyksbj09bnVsbCYmKG49dGhpcy5nZXRMaW5lKHQpLmxlbmd0aCk7dmFyIHM9dGhpcy5kb2Msbz0iIjtyZXR1cm4gZS53YWxrKGZ1bmN0aW9uKGUsdCxuLHUpe2lmKHQ8cilyZXR1cm47aWYodD09cil7aWYobjxpKXJldHVybjt1PU1hdGgubWF4KGksdSl9ZSE9bnVsbD9vKz1lOm8rPXMuZ2V0TGluZSh0KS5zdWJzdHJpbmcodSxuKX0sdCxuKSxvfSx0aGlzLmdldERpc3BsYXlMaW5lPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPXRoaXMuZ2V0Rm9sZExpbmUoZSk7aWYoIWkpe3ZhciBzO3JldHVybiBzPXRoaXMuZG9jLmdldExpbmUoZSkscy5zdWJzdHJpbmcocnx8MCx0fHxzLmxlbmd0aCl9cmV0dXJuIHRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGksZSx0LG4scil9LHRoaXMuJGNsb25lRm9sZERhdGE9ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZT10aGlzLiRmb2xkRGF0YS5tYXAoZnVuY3Rpb24odCl7dmFyIG49dC5mb2xkcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xvbmUoKX0pO3JldHVybiBuZXcgaShlLG4pfSksZX0sdGhpcy50b2dnbGVGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLG49dC5nZXRSYW5nZSgpLHIsaTtpZihuLmlzRW1wdHkoKSl7dmFyIHM9bi5zdGFydDtyPXRoaXMuZ2V0Rm9sZEF0KHMucm93LHMuY29sdW1uKTtpZihyKXt0aGlzLmV4cGFuZEZvbGQocik7cmV0dXJufShpPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldChzKSk/bi5jb21wYXJlUG9pbnQoaSk9PTE/bi5lbmQ9aToobi5zdGFydD1pLG4uc3RhcnQuY29sdW1uKyssbi5lbmQuY29sdW1uLS0pOihpPXRoaXMuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnMucm93LGNvbHVtbjpzLmNvbHVtbisxfSkpPyhuLmNvbXBhcmVQb2ludChpKT09MT9uLmVuZD1pOm4uc3RhcnQ9aSxuLnN0YXJ0LmNvbHVtbisrKTpuPXRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZShzLnJvdyxzLmNvbHVtbil8fG59ZWxzZXt2YXIgbz10aGlzLmdldEZvbGRzSW5SYW5nZShuKTtpZihlJiZvLmxlbmd0aCl7dGhpcy5leHBhbmRGb2xkcyhvKTtyZXR1cm59by5sZW5ndGg9PTEmJihyPW9bMF0pfXJ8fChyPXRoaXMuZ2V0Rm9sZEF0KG4uc3RhcnQucm93LG4uc3RhcnQuY29sdW1uKSk7aWYociYmci5yYW5nZS50b1N0cmluZygpPT1uLnRvU3RyaW5nKCkpe3RoaXMuZXhwYW5kRm9sZChyKTtyZXR1cm59dmFyIHU9Ii4uLiI7aWYoIW4uaXNNdWx0aUxpbmUoKSl7dT10aGlzLmdldFRleHRSYW5nZShuKTtpZih1Lmxlbmd0aDw0KXJldHVybjt1PXUudHJpbSgpLnN1YnN0cmluZygwLDIpKyIuLiJ9dGhpcy5hZGRGb2xkKHUsbil9LHRoaXMuZ2V0Q29tbWVudEZvbGRSYW5nZT1mdW5jdGlvbihlLHQsbil7dmFyIGk9bmV3IG8odGhpcyxlLHQpLHM9aS5nZXRDdXJyZW50VG9rZW4oKSx1PXMudHlwZTtpZihzJiYvXmNvbW1lbnR8c3RyaW5nLy50ZXN0KHUpKXt1PXUubWF0Y2goL2NvbW1lbnR8c3RyaW5nLylbMF0sdT09ImNvbW1lbnQiJiYodSs9Inxkb2Mtc3RhcnQiKTt2YXIgYT1uZXcgUmVnRXhwKHUpLGY9bmV3IHI7aWYobiE9MSl7ZG8gcz1pLnN0ZXBCYWNrd2FyZCgpO3doaWxlKHMmJmEudGVzdChzLnR5cGUpKTtpLnN0ZXBGb3J3YXJkKCl9Zi5zdGFydC5yb3c9aS5nZXRDdXJyZW50VG9rZW5Sb3coKSxmLnN0YXJ0LmNvbHVtbj1pLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpKzIsaT1uZXcgbyh0aGlzLGUsdCk7aWYobiE9LTEpe3ZhciBsPS0xO2Rve3M9aS5zdGVwRm9yd2FyZCgpO2lmKGw9PS0xKXt2YXIgYz10aGlzLmdldFN0YXRlKGkuJHJvdyk7YS50ZXN0KGMpfHwobD1pLiRyb3cpfWVsc2UgaWYoaS4kcm93PmwpYnJlYWt9d2hpbGUocyYmYS50ZXN0KHMudHlwZSkpO3M9aS5zdGVwQmFja3dhcmQoKX1lbHNlIHM9aS5nZXRDdXJyZW50VG9rZW4oKTtyZXR1cm4gZi5lbmQucm93PWkuZ2V0Q3VycmVudFRva2VuUm93KCksZi5lbmQuY29sdW1uPWkuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrcy52YWx1ZS5sZW5ndGgtMixmfX0sdGhpcy5mb2xkQWxsPWZ1bmN0aW9uKGUsdCxuKXtuPT11bmRlZmluZWQmJihuPTFlNSk7dmFyIHI9dGhpcy5mb2xkV2lkZ2V0cztpZighcilyZXR1cm47dD10fHx0aGlzLmdldExlbmd0aCgpLGU9ZXx8MDtmb3IodmFyIGk9ZTtpPHQ7aSsrKXtyW2ldPT1udWxsJiYocltpXT10aGlzLmdldEZvbGRXaWRnZXQoaSkpO2lmKHJbaV0hPSJzdGFydCIpY29udGludWU7dmFyIHM9dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoaSk7aWYocyYmcy5pc011bHRpTGluZSgpJiZzLmVuZC5yb3c8PXQmJnMuc3RhcnQucm93Pj1lKXtpPXMuZW5kLnJvdzt0cnl7dmFyIG89dGhpcy5hZGRGb2xkKCIuLi4iLHMpO28mJihvLmNvbGxhcHNlQ2hpbGRyZW49bil9Y2F0Y2godSl7fX19fSx0aGlzLiRmb2xkU3R5bGVzPXttYW51YWw6MSxtYXJrYmVnaW46MSxtYXJrYmVnaW5lbmQ6MX0sdGhpcy4kZm9sZFN0eWxlPSJtYXJrYmVnaW4iLHRoaXMuc2V0Rm9sZFN0eWxlPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRmb2xkU3R5bGVzW2VdKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb2xkIHN0eWxlOiAiK2UrIlsiK09iamVjdC5rZXlzKHRoaXMuJGZvbGRTdHlsZXMpLmpvaW4oIiwgIikrIl0iKTtpZih0aGlzLiRmb2xkU3R5bGU9PWUpcmV0dXJuO3RoaXMuJGZvbGRTdHlsZT1lLGU9PSJtYW51YWwiJiZ0aGlzLnVuZm9sZCgpO3ZhciB0PXRoaXMuJGZvbGRNb2RlO3RoaXMuJHNldEZvbGRpbmcobnVsbCksdGhpcy4kc2V0Rm9sZGluZyh0KX0sdGhpcy4kc2V0Rm9sZGluZz1mdW5jdGlvbihlKXtpZih0aGlzLiRmb2xkTW9kZT09ZSlyZXR1cm47dGhpcy4kZm9sZE1vZGU9ZSx0aGlzLm9mZigiY2hhbmdlIix0aGlzLiR1cGRhdGVGb2xkV2lkZ2V0cyksdGhpcy5vZmYoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kdG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMpLHRoaXMuX3NpZ25hbCgiY2hhbmdlQW5ub3RhdGlvbiIpO2lmKCFlfHx0aGlzLiRmb2xkU3R5bGU9PSJtYW51YWwiKXt0aGlzLmZvbGRXaWRnZXRzPW51bGw7cmV0dXJufXRoaXMuZm9sZFdpZGdldHM9W10sdGhpcy5nZXRGb2xkV2lkZ2V0PWUuZ2V0Rm9sZFdpZGdldC5iaW5kKGUsdGhpcyx0aGlzLiRmb2xkU3R5bGUpLHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWUuZ2V0Rm9sZFdpZGdldFJhbmdlLmJpbmQoZSx0aGlzLHRoaXMuJGZvbGRTdHlsZSksdGhpcy4kdXBkYXRlRm9sZFdpZGdldHM9dGhpcy51cGRhdGVGb2xkV2lkZ2V0cy5iaW5kKHRoaXMpLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzPXRoaXMudG9rZW5pemVyVXBkYXRlRm9sZFdpZGdldHMuYmluZCh0aGlzKSx0aGlzLm9uKCJjaGFuZ2UiLHRoaXMuJHVwZGF0ZUZvbGRXaWRnZXRzKSx0aGlzLm9uKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJHRva2VuaXplclVwZGF0ZUZvbGRXaWRnZXRzKX0sdGhpcy5nZXRQYXJlbnRGb2xkUmFuZ2VEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mb2xkV2lkZ2V0cztpZighbnx8dCYmbltlXSlyZXR1cm57fTt2YXIgcj1lLTEsaTt3aGlsZShyPj0wKXt2YXIgcz1uW3JdO3M9PW51bGwmJihzPW5bcl09dGhpcy5nZXRGb2xkV2lkZ2V0KHIpKTtpZihzPT0ic3RhcnQiKXt2YXIgbz10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShyKTtpfHwoaT1vKTtpZihvJiZvLmVuZC5yb3c+PWUpYnJlYWt9ci0tfXJldHVybntyYW5nZTpyIT09LTEmJm8sZmlyc3RSYW5nZTppfX0sdGhpcy5vbkZvbGRXaWRnZXRDbGljaz1mdW5jdGlvbihlLHQpe3Q9dC5kb21FdmVudDt2YXIgbj17Y2hpbGRyZW46dC5zaGlmdEtleSxhbGw6dC5jdHJsS2V5fHx0Lm1ldGFLZXksc2libGluZ3M6dC5hbHRLZXl9LHI9dGhpcy4kdG9nZ2xlRm9sZFdpZGdldChlLG4pO2lmKCFyKXt2YXIgaT10LnRhcmdldHx8dC5zcmNFbGVtZW50O2kmJi9hY2VfZm9sZC13aWRnZXQvLnRlc3QoaS5jbGFzc05hbWUpJiYoaS5jbGFzc05hbWUrPSIgYWNlX2ludmFsaWQiKX19LHRoaXMuJHRvZ2dsZUZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5nZXRGb2xkV2lkZ2V0KXJldHVybjt2YXIgbj10aGlzLmdldEZvbGRXaWRnZXQoZSkscj10aGlzLmdldExpbmUoZSksaT1uPT09ImVuZCI/LTE6MSxzPXRoaXMuZ2V0Rm9sZEF0KGUsaT09PS0xPzA6ci5sZW5ndGgsaSk7aWYocylyZXR1cm4gdC5jaGlsZHJlbnx8dC5hbGw/dGhpcy5yZW1vdmVGb2xkKHMpOnRoaXMuZXhwYW5kRm9sZChzKSxzO3ZhciBvPXRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlKGUsITApO2lmKG8mJiFvLmlzTXVsdGlMaW5lKCkpe3M9dGhpcy5nZXRGb2xkQXQoby5zdGFydC5yb3csby5zdGFydC5jb2x1bW4sMSk7aWYocyYmby5pc0VxdWFsKHMucmFuZ2UpKXJldHVybiB0aGlzLnJlbW92ZUZvbGQocyksc31pZih0LnNpYmxpbmdzKXt2YXIgdT10aGlzLmdldFBhcmVudEZvbGRSYW5nZURhdGEoZSk7aWYodS5yYW5nZSl2YXIgYT11LnJhbmdlLnN0YXJ0LnJvdysxLGY9dS5yYW5nZS5lbmQucm93O3RoaXMuZm9sZEFsbChhLGYsdC5hbGw/MWU0OjApfWVsc2UgdC5jaGlsZHJlbj8oZj1vP28uZW5kLnJvdzp0aGlzLmdldExlbmd0aCgpLHRoaXMuZm9sZEFsbChlKzEsZix0LmFsbD8xZTQ6MCkpOm8mJih0LmFsbCYmKG8uY29sbGFwc2VDaGlsZHJlbj0xZTQpLHRoaXMuYWRkRm9sZCgiLi4uIixvKSk7cmV0dXJuIG99LHRoaXMudG9nZ2xlRm9sZFdpZGdldD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3c7dD10aGlzLmdldFJvd0ZvbGRTdGFydCh0KTt2YXIgbj10aGlzLiR0b2dnbGVGb2xkV2lkZ2V0KHQse30pO2lmKG4pcmV0dXJuO3ZhciByPXRoaXMuZ2V0UGFyZW50Rm9sZFJhbmdlRGF0YSh0LCEwKTtuPXIucmFuZ2V8fHIuZmlyc3RSYW5nZTtpZihuKXt0PW4uc3RhcnQucm93O3ZhciBpPXRoaXMuZ2V0Rm9sZEF0KHQsdGhpcy5nZXRMaW5lKHQpLmxlbmd0aCwxKTtpP3RoaXMucmVtb3ZlRm9sZChpKTp0aGlzLmFkZEZvbGQoIi4uLiIsbil9fSx0aGlzLnVwZGF0ZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobj09PTApdGhpcy5mb2xkV2lkZ2V0c1t0XT1udWxsO2Vsc2UgaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMuZm9sZFdpZGdldHMuc3BsaWNlKHQsbisxLG51bGwpO2Vsc2V7dmFyIHI9QXJyYXkobisxKTtyLnVuc2hpZnQodCwxKSx0aGlzLmZvbGRXaWRnZXRzLnNwbGljZS5hcHBseSh0aGlzLmZvbGRXaWRnZXRzLHIpfX0sdGhpcy50b2tlbml6ZXJVcGRhdGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dC5maXJzdCE9dC5sYXN0JiZ0aGlzLmZvbGRXaWRnZXRzLmxlbmd0aD50LmZpcnN0JiZ0aGlzLmZvbGRXaWRnZXRzLnNwbGljZSh0LmZpcnN0LHRoaXMuZm9sZFdpZGdldHMubGVuZ3RoKX19dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4vZm9sZF9saW5lIikuRm9sZExpbmUscz1lKCIuL2ZvbGQiKS5Gb2xkLG89ZSgiLi4vdG9rZW5faXRlcmF0b3IiKS5Ub2tlbkl0ZXJhdG9yO3QuRm9sZGluZz11fSksYWNlLmRlZmluZSgiYWNlL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3Rva2VuX2l0ZXJhdG9yIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBzKCl7dGhpcy5maW5kTWF0Y2hpbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCl7aWYoZS5jb2x1bW49PTApcmV0dXJuIG51bGw7dmFyIG49dHx8dGhpcy5nZXRMaW5lKGUucm93KS5jaGFyQXQoZS5jb2x1bW4tMSk7aWYobj09IiIpcmV0dXJuIG51bGw7dmFyIHI9bi5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyk7cmV0dXJuIHI/clsxXT90aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQoclsxXSxlKTp0aGlzLiRmaW5kT3BlbmluZ0JyYWNrZXQoclsyXSxlKTpudWxsfSx0aGlzLmdldEJyYWNrZXRSYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExpbmUoZS5yb3cpLG49ITAscixzPXQuY2hhckF0KGUuY29sdW1uLTEpLG89cyYmcy5tYXRjaCgvKFtcKFxbXHtdKXwoW1wpXF1cfV0pLyk7b3x8KHM9dC5jaGFyQXQoZS5jb2x1bW4pLGU9e3JvdzplLnJvdyxjb2x1bW46ZS5jb2x1bW4rMX0sbz1zJiZzLm1hdGNoKC8oW1woXFtce10pfChbXClcXVx9XSkvKSxuPSExKTtpZighbylyZXR1cm4gbnVsbDtpZihvWzFdKXt2YXIgdT10aGlzLiRmaW5kQ2xvc2luZ0JyYWNrZXQob1sxXSxlKTtpZighdSlyZXR1cm4gbnVsbDtyPWkuZnJvbVBvaW50cyhlLHUpLG58fChyLmVuZC5jb2x1bW4rKyxyLnN0YXJ0LmNvbHVtbi0tKSxyLmN1cnNvcj1yLmVuZH1lbHNle3ZhciB1PXRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldChvWzJdLGUpO2lmKCF1KXJldHVybiBudWxsO3I9aS5mcm9tUG9pbnRzKHUsZSksbnx8KHIuc3RhcnQuY29sdW1uKyssci5lbmQuY29sdW1uLS0pLHIuY3Vyc29yPXIuc3RhcnR9cmV0dXJuIHJ9LHRoaXMuJGJyYWNrZXRzPXsiKSI6IigiLCIoIjoiKSIsIl0iOiJbIiwiWyI6Il0iLCJ7IjoifSIsIn0iOiJ7IiwiPCI6Ij4iLCI+IjoiPCJ9LHRoaXMuJGZpbmRPcGVuaW5nQnJhY2tldD1mdW5jdGlvbihlLHQsbil7dmFyIGk9dGhpcy4kYnJhY2tldHNbZV0scz0xLG89bmV3IHIodGhpcyx0LnJvdyx0LmNvbHVtbiksdT1vLmdldEN1cnJlbnRUb2tlbigpO3V8fCh1PW8uc3RlcEZvcndhcmQoKSk7aWYoIXUpcmV0dXJuO258fChuPW5ldyBSZWdFeHAoIihcXC4/Iit1LnR5cGUucmVwbGFjZSgiLiIsIlxcLiIpLnJlcGxhY2UoInJwYXJlbiIsIi5wYXJlbiIpLnJlcGxhY2UoL1xiKD86ZW5kKVxiLywiKD86c3RhcnR8YmVnaW58ZW5kKSIpKyIpKyIpKTt2YXIgYT10LmNvbHVtbi1vLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLTIsZj11LnZhbHVlO2Zvcig7Oyl7d2hpbGUoYT49MCl7dmFyIGw9Zi5jaGFyQXQoYSk7aWYobD09aSl7cy09MTtpZihzPT0wKXJldHVybntyb3c6by5nZXRDdXJyZW50VG9rZW5Sb3coKSxjb2x1bW46YStvLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpfX1lbHNlIGw9PWUmJihzKz0xKTthLT0xfWRvIHU9by5zdGVwQmFja3dhcmQoKTt3aGlsZSh1JiYhbi50ZXN0KHUudHlwZSkpO2lmKHU9PW51bGwpYnJlYWs7Zj11LnZhbHVlLGE9Zi5sZW5ndGgtMX1yZXR1cm4gbnVsbH0sdGhpcy4kZmluZENsb3NpbmdCcmFja2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLiRicmFja2V0c1tlXSxzPTEsbz1uZXcgcih0aGlzLHQucm93LHQuY29sdW1uKSx1PW8uZ2V0Q3VycmVudFRva2VuKCk7dXx8KHU9by5zdGVwRm9yd2FyZCgpKTtpZighdSlyZXR1cm47bnx8KG49bmV3IFJlZ0V4cCgiKFxcLj8iK3UudHlwZS5yZXBsYWNlKCIuIiwiXFwuIikucmVwbGFjZSgibHBhcmVuIiwiLnBhcmVuIikucmVwbGFjZSgvXGIoPzpzdGFydHxiZWdpbilcYi8sIig/OnN0YXJ0fGJlZ2lufGVuZCkiKSsiKSsiKSk7dmFyIGE9dC5jb2x1bW4tby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKTtmb3IoOzspe3ZhciBmPXUudmFsdWUsbD1mLmxlbmd0aDt3aGlsZShhPGwpe3ZhciBjPWYuY2hhckF0KGEpO2lmKGM9PWkpe3MtPTE7aWYocz09MClyZXR1cm57cm93Om8uZ2V0Q3VycmVudFRva2VuUm93KCksY29sdW1uOmErby5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKX19ZWxzZSBjPT1lJiYocys9MSk7YSs9MX1kbyB1PW8uc3RlcEZvcndhcmQoKTt3aGlsZSh1JiYhbi50ZXN0KHUudHlwZSkpO2lmKHU9PW51bGwpYnJlYWs7YT0wfXJldHVybiBudWxsfX12YXIgcj1lKCIuLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsaT1lKCIuLi9yYW5nZSIpLlJhbmdlO3QuQnJhY2tldE1hdGNoPXN9KSxhY2UuZGVmaW5lKCJhY2UvZWRpdF9zZXNzaW9uIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvYmlkaWhhbmRsZXIiLCJhY2UvY29uZmlnIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL3NlbGVjdGlvbiIsImFjZS9tb2RlL3RleHQiLCJhY2UvcmFuZ2UiLCJhY2UvZG9jdW1lbnQiLCJhY2UvYmFja2dyb3VuZF90b2tlbml6ZXIiLCJhY2Uvc2VhcmNoX2hpZ2hsaWdodCIsImFjZS9lZGl0X3Nlc3Npb24vZm9sZGluZyIsImFjZS9lZGl0X3Nlc3Npb24vYnJhY2tldF9tYXRjaCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9sYW5nIikscz1lKCIuL2JpZGloYW5kbGVyIikuQmlkaUhhbmRsZXIsbz1lKCIuL2NvbmZpZyIpLHU9ZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixhPWUoIi4vc2VsZWN0aW9uIikuU2VsZWN0aW9uLGY9ZSgiLi9tb2RlL3RleHQiKS5Nb2RlLGw9ZSgiLi9yYW5nZSIpLlJhbmdlLGM9ZSgiLi9kb2N1bWVudCIpLkRvY3VtZW50LGg9ZSgiLi9iYWNrZ3JvdW5kX3Rva2VuaXplciIpLkJhY2tncm91bmRUb2tlbml6ZXIscD1lKCIuL3NlYXJjaF9oaWdobGlnaHQiKS5TZWFyY2hIaWdobGlnaHQsZD1mdW5jdGlvbihlLHQpe3RoaXMuJGJyZWFrcG9pbnRzPVtdLHRoaXMuJGRlY29yYXRpb25zPVtdLHRoaXMuJGZyb250TWFya2Vycz17fSx0aGlzLiRiYWNrTWFya2Vycz17fSx0aGlzLiRtYXJrZXJJZD0xLHRoaXMuJHVuZG9TZWxlY3Q9ITAsdGhpcy4kZm9sZERhdGE9W10sdGhpcy5pZD0ic2Vzc2lvbiIrICsrZC4kdWlkLHRoaXMuJGZvbGREYXRhLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuam9pbigiXG4iKX0sdGhpcy5vbigiY2hhbmdlRm9sZCIsdGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSksdGhpcy4kb25DaGFuZ2U9dGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpO2lmKHR5cGVvZiBlIT0ib2JqZWN0Inx8IWUuZ2V0TGluZSllPW5ldyBjKGUpO3RoaXMuc2V0RG9jdW1lbnQoZSksdGhpcy5zZWxlY3Rpb249bmV3IGEodGhpcyksdGhpcy4kYmlkaUhhbmRsZXI9bmV3IHModGhpcyksby5yZXNldE9wdGlvbnModGhpcyksdGhpcy5zZXRNb2RlKHQpLG8uX3NpZ25hbCgic2Vzc2lvbiIsdGhpcyl9O2QuJHVpZD0wLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gbShlKXtyZXR1cm4gZTw0MzUyPyExOmU+PTQzNTImJmU8PTQ0NDd8fGU+PTQ1MTUmJmU8PTQ1MTl8fGU+PTQ2MDImJmU8PTQ2MDd8fGU+PTkwMDEmJmU8PTkwMDJ8fGU+PTExOTA0JiZlPD0xMTkyOXx8ZT49MTE5MzEmJmU8PTEyMDE5fHxlPj0xMjAzMiYmZTw9MTIyNDV8fGU+PTEyMjcyJiZlPD0xMjI4M3x8ZT49MTIyODgmJmU8PTEyMzUwfHxlPj0xMjM1MyYmZTw9MTI0Mzh8fGU+PTEyNDQxJiZlPD0xMjU0M3x8ZT49MTI1NDkmJmU8PTEyNTg5fHxlPj0xMjU5MyYmZTw9MTI2ODZ8fGU+PTEyNjg4JiZlPD0xMjczMHx8ZT49MTI3MzYmJmU8PTEyNzcxfHxlPj0xMjc4NCYmZTw9MTI4MzB8fGU+PTEyODMyJiZlPD0xMjg3MXx8ZT49MTI4ODAmJmU8PTEzMDU0fHxlPj0xMzA1NiYmZTw9MTk5MDN8fGU+PTE5OTY4JiZlPD00MjEyNHx8ZT49NDIxMjgmJmU8PTQyMTgyfHxlPj00MzM2MCYmZTw9NDMzODh8fGU+PTQ0MDMyJiZlPD01NTIwM3x8ZT49NTUyMTYmJmU8PTU1MjM4fHxlPj01NTI0MyYmZTw9NTUyOTF8fGU+PTYzNzQ0JiZlPD02NDI1NXx8ZT49NjUwNDAmJmU8PTY1MDQ5fHxlPj02NTA3MiYmZTw9NjUxMDZ8fGU+PTY1MTA4JiZlPD02NTEyNnx8ZT49NjUxMjgmJmU8PTY1MTMxfHxlPj02NTI4MSYmZTw9NjUzNzZ8fGU+PTY1NTA0JiZlPD02NTUxMH1yLmltcGxlbWVudCh0aGlzLHUpLHRoaXMuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dGhpcy5kb2MmJnRoaXMuZG9jLnJlbW92ZUxpc3RlbmVyKCJjaGFuZ2UiLHRoaXMuJG9uQ2hhbmdlKSx0aGlzLmRvYz1lLGUub24oImNoYW5nZSIsdGhpcy4kb25DaGFuZ2UpLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuc2V0RG9jdW1lbnQodGhpcy5nZXREb2N1bWVudCgpKSx0aGlzLnJlc2V0Q2FjaGVzKCl9LHRoaXMuZ2V0RG9jdW1lbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2N9LHRoaXMuJHJlc2V0Um93Q2FjaGU9ZnVuY3Rpb24oZSl7aWYoIWUpe3RoaXMuJGRvY1Jvd0NhY2hlPVtdLHRoaXMuJHNjcmVlblJvd0NhY2hlPVtdO3JldHVybn12YXIgdD10aGlzLiRkb2NSb3dDYWNoZS5sZW5ndGgsbj10aGlzLiRnZXRSb3dDYWNoZUluZGV4KHRoaXMuJGRvY1Jvd0NhY2hlLGUpKzE7dD5uJiYodGhpcy4kZG9jUm93Q2FjaGUuc3BsaWNlKG4sdCksdGhpcy4kc2NyZWVuUm93Q2FjaGUuc3BsaWNlKG4sdCkpfSx0aGlzLiRnZXRSb3dDYWNoZUluZGV4PWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPWUubGVuZ3RoLTE7d2hpbGUobjw9cil7dmFyIGk9bityPj4xLHM9ZVtpXTtpZih0PnMpbj1pKzE7ZWxzZXtpZighKHQ8cykpcmV0dXJuIGk7cj1pLTF9fXJldHVybiBuLTF9LHRoaXMucmVzZXRDYWNoZXM9ZnVuY3Rpb24oKXt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiR3cmFwRGF0YT1bXSx0aGlzLiRyb3dMZW5ndGhDYWNoZT1bXSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCl9LHRoaXMub25DaGFuZ2VGb2xkPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLiRyZXNldFJvd0NhY2hlKHQuc3RhcnQucm93KX0sdGhpcy5vbkNoYW5nZT1mdW5jdGlvbihlKXt0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRiaWRpSGFuZGxlci5vbkNoYW5nZShlKSx0aGlzLiRyZXNldFJvd0NhY2hlKGUuc3RhcnQucm93KTt2YXIgdD10aGlzLiR1cGRhdGVJbnRlcm5hbERhdGFPbkNoYW5nZShlKTshdGhpcy4kZnJvbVVuZG8mJnRoaXMuJHVuZG9NYW5hZ2VyJiYodCYmdC5sZW5ndGgmJih0aGlzLiR1bmRvTWFuYWdlci5hZGQoe2FjdGlvbjoicmVtb3ZlRm9sZHMiLGZvbGRzOnR9LHRoaXMubWVyZ2VVbmRvRGVsdGFzKSx0aGlzLm1lcmdlVW5kb0RlbHRhcz0hMCksdGhpcy4kdW5kb01hbmFnZXIuYWRkKGUsdGhpcy5tZXJnZVVuZG9EZWx0YXMpLHRoaXMubWVyZ2VVbmRvRGVsdGFzPSEwLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyLnNjaGVkdWxlKCkpLHRoaXMuYmdUb2tlbml6ZXImJnRoaXMuYmdUb2tlbml6ZXIuJHVwZGF0ZU9uQ2hhbmdlKGUpLHRoaXMuX3NpZ25hbCgiY2hhbmdlIixlKX0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlKXt0aGlzLmRvYy5zZXRWYWx1ZShlKSx0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oMCwwKSx0aGlzLiRyZXNldFJvd0NhY2hlKDApLHRoaXMuc2V0VW5kb01hbmFnZXIodGhpcy4kdW5kb01hbmFnZXIpLHRoaXMuZ2V0VW5kb01hbmFnZXIoKS5yZXNldCgpfSx0aGlzLmdldFZhbHVlPXRoaXMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0VmFsdWUoKX0sdGhpcy5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb259LHRoaXMuZ2V0U3RhdGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYmdUb2tlbml6ZXIuZ2V0U3RhdGUoZSl9LHRoaXMuZ2V0VG9rZW5zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmJnVG9rZW5pemVyLmdldFRva2VucyhlKX0sdGhpcy5nZXRUb2tlbkF0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5iZ1Rva2VuaXplci5nZXRUb2tlbnMoZSkscixpPTA7aWYodD09bnVsbCl7dmFyIHM9bi5sZW5ndGgtMTtpPXRoaXMuZ2V0TGluZShlKS5sZW5ndGh9ZWxzZSBmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7aSs9bltzXS52YWx1ZS5sZW5ndGg7aWYoaT49dClicmVha31yZXR1cm4gcj1uW3NdLHI/KHIuaW5kZXg9cyxyLnN0YXJ0PWktci52YWx1ZS5sZW5ndGgscik6bnVsbH0sdGhpcy5zZXRVbmRvTWFuYWdlcj1mdW5jdGlvbihlKXt0aGlzLiR1bmRvTWFuYWdlcj1lLHRoaXMuJGluZm9ybVVuZG9NYW5hZ2VyJiZ0aGlzLiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKTtpZihlKXt2YXIgdD10aGlzO2UuYWRkU2Vzc2lvbih0aGlzKSx0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXI9ZnVuY3Rpb24oKXt0LiRpbmZvcm1VbmRvTWFuYWdlci5jYW5jZWwoKSx0Lm1lcmdlVW5kb0RlbHRhcz0hMX0sdGhpcy4kaW5mb3JtVW5kb01hbmFnZXI9aS5kZWxheWVkQ2FsbCh0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIpfWVsc2UgdGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7fX0sdGhpcy5tYXJrVW5kb0dyb3VwPWZ1bmN0aW9uKCl7dGhpcy4kc3luY0luZm9ybVVuZG9NYW5hZ2VyJiZ0aGlzLiRzeW5jSW5mb3JtVW5kb01hbmFnZXIoKX0sdGhpcy4kZGVmYXVsdFVuZG9NYW5hZ2VyPXt1bmRvOmZ1bmN0aW9uKCl7fSxyZWRvOmZ1bmN0aW9uKCl7fSxoYXNVbmRvOmZ1bmN0aW9uKCl7fSxoYXNSZWRvOmZ1bmN0aW9uKCl7fSxyZXNldDpmdW5jdGlvbigpe30sYWRkOmZ1bmN0aW9uKCl7fSxhZGRTZWxlY3Rpb246ZnVuY3Rpb24oKXt9LHN0YXJ0TmV3R3JvdXA6ZnVuY3Rpb24oKXt9LGFkZFNlc3Npb246ZnVuY3Rpb24oKXt9fSx0aGlzLmdldFVuZG9NYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVuZG9NYW5hZ2VyfHx0aGlzLiRkZWZhdWx0VW5kb01hbmFnZXJ9LHRoaXMuZ2V0VGFiU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXNlU29mdFRhYnMoKT9pLnN0cmluZ1JlcGVhdCgiICIsdGhpcy5nZXRUYWJTaXplKCkpOiIJIn0sdGhpcy5zZXRVc2VTb2Z0VGFicz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidXNlU29mdFRhYnMiLGUpfSx0aGlzLmdldFVzZVNvZnRUYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHVzZVNvZnRUYWJzJiYhdGhpcy4kbW9kZS4kaW5kZW50V2l0aFRhYnN9LHRoaXMuc2V0VGFiU2l6ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidGFiU2l6ZSIsZSl9LHRoaXMuZ2V0VGFiU2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR0YWJTaXplfSx0aGlzLmlzVGFiU3RvcD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdXNlU29mdFRhYnMmJmUuY29sdW1uJXRoaXMuJHRhYlNpemU9PT0wfSx0aGlzLnNldE5hdmlnYXRlV2l0aGluU29mdFRhYnM9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oIm5hdmlnYXRlV2l0aGluU29mdFRhYnMiLGUpfSx0aGlzLmdldE5hdmlnYXRlV2l0aGluU29mdFRhYnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbmF2aWdhdGVXaXRoaW5Tb2Z0VGFic30sdGhpcy4kb3ZlcndyaXRlPSExLHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJvdmVyd3JpdGUiLGUpfSx0aGlzLmdldE92ZXJ3cml0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRvdmVyd3JpdGV9LHRoaXMudG9nZ2xlT3ZlcndyaXRlPWZ1bmN0aW9uKCl7dGhpcy5zZXRPdmVyd3JpdGUoIXRoaXMuJG92ZXJ3cml0ZSl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGRlY29yYXRpb25zW2VdfHwodGhpcy4kZGVjb3JhdGlvbnNbZV09IiIpLHRoaXMuJGRlY29yYXRpb25zW2VdKz0iICIrdCx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7dGhpcy4kZGVjb3JhdGlvbnNbZV09KHRoaXMuJGRlY29yYXRpb25zW2VdfHwiIikucmVwbGFjZSgiICIrdCwiIiksdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuZ2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kYnJlYWtwb2ludHN9LHRoaXMuc2V0QnJlYWtwb2ludHM9ZnVuY3Rpb24oZSl7dGhpcy4kYnJlYWtwb2ludHM9W107Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspdGhpcy4kYnJlYWtwb2ludHNbZVt0XV09ImFjZV9icmVha3BvaW50Ijt0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5jbGVhckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dGhpcy4kYnJlYWtwb2ludHM9W10sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuc2V0QnJlYWtwb2ludD1mdW5jdGlvbihlLHQpe3Q9PT11bmRlZmluZWQmJih0PSJhY2VfYnJlYWtwb2ludCIpLHQ/dGhpcy4kYnJlYWtwb2ludHNbZV09dDpkZWxldGUgdGhpcy4kYnJlYWtwb2ludHNbZV0sdGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iix7fSl9LHRoaXMuY2xlYXJCcmVha3BvaW50PWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLiRicmVha3BvaW50c1tlXSx0aGlzLl9zaWduYWwoImNoYW5nZUJyZWFrcG9pbnQiLHt9KX0sdGhpcy5hZGRNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kbWFya2VySWQrKyxzPXtyYW5nZTplLHR5cGU6bnx8ImxpbmUiLHJlbmRlcmVyOnR5cGVvZiBuPT0iZnVuY3Rpb24iP246bnVsbCxjbGF6ejp0LGluRnJvbnQ6ISFyLGlkOml9O3JldHVybiByPyh0aGlzLiRmcm9udE1hcmtlcnNbaV09cyx0aGlzLl9zaWduYWwoImNoYW5nZUZyb250TWFya2VyIikpOih0aGlzLiRiYWNrTWFya2Vyc1tpXT1zLHRoaXMuX3NpZ25hbCgiY2hhbmdlQmFja01hcmtlciIpKSxpfSx0aGlzLmFkZER5bmFtaWNNYXJrZXI9ZnVuY3Rpb24oZSx0KXtpZighZS51cGRhdGUpcmV0dXJuO3ZhciBuPXRoaXMuJG1hcmtlcklkKys7cmV0dXJuIGUuaWQ9bixlLmluRnJvbnQ9ISF0LHQ/KHRoaXMuJGZyb250TWFya2Vyc1tuXT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlRnJvbnRNYXJrZXIiKSk6KHRoaXMuJGJhY2tNYXJrZXJzW25dPWUsdGhpcy5fc2lnbmFsKCJjaGFuZ2VCYWNrTWFya2VyIikpLGV9LHRoaXMucmVtb3ZlTWFya2VyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJGZyb250TWFya2Vyc1tlXXx8dGhpcy4kYmFja01hcmtlcnNbZV07aWYoIXQpcmV0dXJuO3ZhciBuPXQuaW5Gcm9udD90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnM7ZGVsZXRlIG5bZV0sdGhpcy5fc2lnbmFsKHQuaW5Gcm9udD8iY2hhbmdlRnJvbnRNYXJrZXIiOiJjaGFuZ2VCYWNrTWFya2VyIil9LHRoaXMuZ2V0TWFya2Vycz1mdW5jdGlvbihlKXtyZXR1cm4gZT90aGlzLiRmcm9udE1hcmtlcnM6dGhpcy4kYmFja01hcmtlcnN9LHRoaXMuaGlnaGxpZ2h0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRzZWFyY2hIaWdobGlnaHQpe3ZhciB0PW5ldyBwKG51bGwsImFjZV9zZWxlY3RlZC13b3JkIiwidGV4dCIpO3RoaXMuJHNlYXJjaEhpZ2hsaWdodD10aGlzLmFkZER5bmFtaWNNYXJrZXIodCl9dGhpcy4kc2VhcmNoSGlnaGxpZ2h0LnNldFJlZ2V4cChlKX0sdGhpcy5oaWdobGlnaHRMaW5lcz1mdW5jdGlvbihlLHQsbixyKXt0eXBlb2YgdCE9Im51bWJlciImJihuPXQsdD1lKSxufHwobj0iYWNlX3N0ZXAiKTt2YXIgaT1uZXcgbChlLDAsdCxJbmZpbml0eSk7cmV0dXJuIGkuaWQ9dGhpcy5hZGRNYXJrZXIoaSxuLCJmdWxsTGluZSIsciksaX0sdGhpcy5zZXRBbm5vdGF0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRhbm5vdGF0aW9ucz1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlQW5ub3RhdGlvbiIse30pfSx0aGlzLmdldEFubm90YXRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFubm90YXRpb25zfHxbXX0sdGhpcy5jbGVhckFubm90YXRpb25zPWZ1bmN0aW9uKCl7dGhpcy5zZXRBbm5vdGF0aW9ucyhbXSl9LHRoaXMuJGRldGVjdE5ld0xpbmU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tYXRjaCgvXi4qPyhccj9cbikvbSk7dD90aGlzLiRhdXRvTmV3TGluZT10WzFdOnRoaXMuJGF1dG9OZXdMaW5lPSJcbiJ9LHRoaXMuZ2V0V29yZFJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRMaW5lKGUpLHI9ITE7dD4wJiYocj0hIW4uY2hhckF0KHQtMSkubWF0Y2godGhpcy50b2tlblJlKSkscnx8KHI9ISFuLmNoYXJBdCh0KS5tYXRjaCh0aGlzLnRva2VuUmUpKTtpZihyKXZhciBpPXRoaXMudG9rZW5SZTtlbHNlIGlmKC9eXHMrJC8udGVzdChuLnNsaWNlKHQtMSx0KzEpKSl2YXIgaT0vXHMvO2Vsc2UgdmFyIGk9dGhpcy5ub25Ub2tlblJlO3ZhciBzPXQ7aWYocz4wKXtkbyBzLS07d2hpbGUocz49MCYmbi5jaGFyQXQocykubWF0Y2goaSkpO3MrK312YXIgbz10O3doaWxlKG88bi5sZW5ndGgmJm4uY2hhckF0KG8pLm1hdGNoKGkpKW8rKztyZXR1cm4gbmV3IGwoZSxzLGUsbyl9LHRoaXMuZ2V0QVdvcmRSYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZ2V0V29yZFJhbmdlKGUsdCkscj10aGlzLmdldExpbmUobi5lbmQucm93KTt3aGlsZShyLmNoYXJBdChuLmVuZC5jb2x1bW4pLm1hdGNoKC9bIFx0XS8pKW4uZW5kLmNvbHVtbis9MTtyZXR1cm4gbn0sdGhpcy5zZXROZXdMaW5lTW9kZT1mdW5jdGlvbihlKXt0aGlzLmRvYy5zZXROZXdMaW5lTW9kZShlKX0sdGhpcy5nZXROZXdMaW5lTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXROZXdMaW5lTW9kZSgpfSx0aGlzLnNldFVzZVdvcmtlcj1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigidXNlV29ya2VyIixlKX0sdGhpcy5nZXRVc2VXb3JrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdXNlV29ya2VyfSx0aGlzLm9uUmVsb2FkVG9rZW5pemVyPWZ1bmN0aW9uKGUpe3ZhciB0PWUuZGF0YTt0aGlzLmJnVG9rZW5pemVyLnN0YXJ0KHQuZmlyc3QpLHRoaXMuX3NpZ25hbCgidG9rZW5pemVyVXBkYXRlIixlKX0sdGhpcy4kbW9kZXM9by4kbW9kZXMsdGhpcy4kbW9kZT1udWxsLHRoaXMuJG1vZGVJZD1udWxsLHRoaXMuc2V0TW9kZT1mdW5jdGlvbihlLHQpe2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoZS5nZXRUb2tlbml6ZXIpcmV0dXJuIHRoaXMuJG9uQ2hhbmdlTW9kZShlKTt2YXIgbj1lLHI9bi5wYXRofWVsc2Ugcj1lfHwiYWNlL21vZGUvdGV4dCI7dGhpcy4kbW9kZXNbImFjZS9tb2RlL3RleHQiXXx8KHRoaXMuJG1vZGVzWyJhY2UvbW9kZS90ZXh0Il09bmV3IGYpO2lmKHRoaXMuJG1vZGVzW3JdJiYhbil7dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzW3JdKSx0JiZ0KCk7cmV0dXJufXRoaXMuJG1vZGVJZD1yLG8ubG9hZE1vZHVsZShbIm1vZGUiLHJdLGZ1bmN0aW9uKGUpe2lmKHRoaXMuJG1vZGVJZCE9PXIpcmV0dXJuIHQmJnQoKTt0aGlzLiRtb2Rlc1tyXSYmIW4/dGhpcy4kb25DaGFuZ2VNb2RlKHRoaXMuJG1vZGVzW3JdKTplJiZlLk1vZGUmJihlPW5ldyBlLk1vZGUobiksbnx8KHRoaXMuJG1vZGVzW3JdPWUsZS4kaWQ9ciksdGhpcy4kb25DaGFuZ2VNb2RlKGUpKSx0JiZ0KCl9LmJpbmQodGhpcykpLHRoaXMuJG1vZGV8fHRoaXMuJG9uQ2hhbmdlTW9kZSh0aGlzLiRtb2Rlc1siYWNlL21vZGUvdGV4dCJdLCEwKX0sdGhpcy4kb25DaGFuZ2VNb2RlPWZ1bmN0aW9uKGUsdCl7dHx8KHRoaXMuJG1vZGVJZD1lLiRpZCk7aWYodGhpcy4kbW9kZT09PWUpcmV0dXJuO3RoaXMuJG1vZGU9ZSx0aGlzLiRzdG9wV29ya2VyKCksdGhpcy4kdXNlV29ya2VyJiZ0aGlzLiRzdGFydFdvcmtlcigpO3ZhciBuPWUuZ2V0VG9rZW5pemVyKCk7aWYobi5hZGRFdmVudExpc3RlbmVyIT09dW5kZWZpbmVkKXt2YXIgcj10aGlzLm9uUmVsb2FkVG9rZW5pemVyLmJpbmQodGhpcyk7bi5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLHIpfWlmKCF0aGlzLmJnVG9rZW5pemVyKXt0aGlzLmJnVG9rZW5pemVyPW5ldyBoKG4pO3ZhciBpPXRoaXM7dGhpcy5iZ1Rva2VuaXplci5hZGRFdmVudExpc3RlbmVyKCJ1cGRhdGUiLGZ1bmN0aW9uKGUpe2kuX3NpZ25hbCgidG9rZW5pemVyVXBkYXRlIixlKX0pfWVsc2UgdGhpcy5iZ1Rva2VuaXplci5zZXRUb2tlbml6ZXIobik7dGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudCh0aGlzLmdldERvY3VtZW50KCkpLHRoaXMudG9rZW5SZT1lLnRva2VuUmUsdGhpcy5ub25Ub2tlblJlPWUubm9uVG9rZW5SZSx0fHwoZS5hdHRhY2hUb1Nlc3Npb24mJmUuYXR0YWNoVG9TZXNzaW9uKHRoaXMpLHRoaXMuJG9wdGlvbnMud3JhcE1ldGhvZC5zZXQuY2FsbCh0aGlzLHRoaXMuJHdyYXBNZXRob2QpLHRoaXMuJHNldEZvbGRpbmcoZS5mb2xkaW5nUnVsZXMpLHRoaXMuYmdUb2tlbml6ZXIuc3RhcnQoMCksdGhpcy5fZW1pdCgiY2hhbmdlTW9kZSIpKX0sdGhpcy4kc3RvcFdvcmtlcj1mdW5jdGlvbigpe3RoaXMuJHdvcmtlciYmKHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCl9LHRoaXMuJHN0YXJ0V29ya2VyPWZ1bmN0aW9uKCl7dHJ5e3RoaXMuJHdvcmtlcj10aGlzLiRtb2RlLmNyZWF0ZVdvcmtlcih0aGlzKX1jYXRjaChlKXtvLndhcm4oIkNvdWxkIG5vdCBsb2FkIHdvcmtlciIsZSksdGhpcy4kd29ya2VyPW51bGx9fSx0aGlzLmdldE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbW9kZX0sdGhpcy4kc2Nyb2xsVG9wPTAsdGhpcy5zZXRTY3JvbGxUb3A9ZnVuY3Rpb24oZSl7aWYodGhpcy4kc2Nyb2xsVG9wPT09ZXx8aXNOYU4oZSkpcmV0dXJuO3RoaXMuJHNjcm9sbFRvcD1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Nyb2xsVG9wIixlKX0sdGhpcy5nZXRTY3JvbGxUb3A9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2Nyb2xsVG9wfSx0aGlzLiRzY3JvbGxMZWZ0PTAsdGhpcy5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJHNjcm9sbExlZnQ9PT1lfHxpc05hTihlKSlyZXR1cm47dGhpcy4kc2Nyb2xsTGVmdD1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Nyb2xsTGVmdCIsZSl9LHRoaXMuZ2V0U2Nyb2xsTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzY3JvbGxMZWZ0fSx0aGlzLmdldFNjcmVlbldpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbXB1dGVXaWR0aCgpLHRoaXMubGluZVdpZGdldHM/TWF0aC5tYXgodGhpcy5nZXRMaW5lV2lkZ2V0TWF4V2lkdGgoKSx0aGlzLnNjcmVlbldpZHRoKTp0aGlzLnNjcmVlbldpZHRofSx0aGlzLmdldExpbmVXaWRnZXRNYXhXaWR0aD1mdW5jdGlvbigpe2lmKHRoaXMubGluZVdpZGdldHNXaWR0aCE9bnVsbClyZXR1cm4gdGhpcy5saW5lV2lkZ2V0c1dpZHRoO3ZhciBlPTA7cmV0dXJuIHRoaXMubGluZVdpZGdldHMuZm9yRWFjaChmdW5jdGlvbih0KXt0JiZ0LnNjcmVlbldpZHRoPmUmJihlPXQuc2NyZWVuV2lkdGgpfSksdGhpcy5saW5lV2lkZ2V0V2lkdGg9ZX0sdGhpcy4kY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJG1vZGlmaWVkfHxlKXt0aGlzLiRtb2RpZmllZD0hMTtpZih0aGlzLiR1c2VXcmFwTW9kZSlyZXR1cm4gdGhpcy5zY3JlZW5XaWR0aD10aGlzLiR3cmFwTGltaXQ7dmFyIHQ9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxuPXRoaXMuJHJvd0xlbmd0aENhY2hlLHI9MCxpPTAscz10aGlzLiRmb2xkRGF0YVtpXSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHksdT10Lmxlbmd0aDtmb3IodmFyIGE9MDthPHU7YSsrKXtpZihhPm8pe2E9cy5lbmQucm93KzE7aWYoYT49dSlicmVhaztzPXRoaXMuJGZvbGREYXRhW2krK10sbz1zP3Muc3RhcnQucm93OkluZmluaXR5fW5bYV09PW51bGwmJihuW2FdPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHRbYV0pWzBdKSxuW2FdPnImJihyPW5bYV0pfXRoaXMuc2NyZWVuV2lkdGg9cn19LHRoaXMuZ2V0TGluZT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TGluZShlKX0sdGhpcy5nZXRMaW5lcz1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvYy5nZXRMaW5lcyhlLHQpfSx0aGlzLmdldExlbmd0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRvYy5nZXRMZW5ndGgoKX0sdGhpcy5nZXRUZXh0UmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZG9jLmdldFRleHRSYW5nZShlfHx0aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpKX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MuaW5zZXJ0KGUsdCl9LHRoaXMucmVtb3ZlPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5yZW1vdmUoZSl9LHRoaXMucmVtb3ZlRnVsbExpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jLnJlbW92ZUZ1bGxMaW5lcyhlLHQpfSx0aGlzLnVuZG9DaGFuZ2VzPWZ1bmN0aW9uKGUsdCl7aWYoIWUubGVuZ3RoKXJldHVybjt0aGlzLiRmcm9tVW5kbz0hMDtmb3IodmFyIG49ZS5sZW5ndGgtMTtuIT0tMTtuLS0pe3ZhciByPWVbbl07ci5hY3Rpb249PSJpbnNlcnQifHxyLmFjdGlvbj09InJlbW92ZSI/dGhpcy5kb2MucmV2ZXJ0RGVsdGEocik6ci5mb2xkcyYmdGhpcy5hZGRGb2xkcyhyLmZvbGRzKX0hdCYmdGhpcy4kdW5kb1NlbGVjdCYmKGUuc2VsZWN0aW9uQmVmb3JlP3RoaXMuc2VsZWN0aW9uLmZyb21KU09OKGUuc2VsZWN0aW9uQmVmb3JlKTp0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZSh0aGlzLiRnZXRVbmRvU2VsZWN0aW9uKGUsITApKSksdGhpcy4kZnJvbVVuZG89ITF9LHRoaXMucmVkb0NoYW5nZXM9ZnVuY3Rpb24oZSx0KXtpZighZS5sZW5ndGgpcmV0dXJuO3RoaXMuJGZyb21VbmRvPSEwO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dOyhyLmFjdGlvbj09Imluc2VydCJ8fHIuYWN0aW9uPT0icmVtb3ZlIikmJnRoaXMuZG9jLmFwcGx5RGVsdGEocil9IXQmJnRoaXMuJHVuZG9TZWxlY3QmJihlLnNlbGVjdGlvbkFmdGVyP3RoaXMuc2VsZWN0aW9uLmZyb21KU09OKGUuc2VsZWN0aW9uQWZ0ZXIpOnRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKHRoaXMuJGdldFVuZG9TZWxlY3Rpb24oZSwhMSkpKSx0aGlzLiRmcm9tVW5kbz0hMX0sdGhpcy5zZXRVbmRvU2VsZWN0PWZ1bmN0aW9uKGUpe3RoaXMuJHVuZG9TZWxlY3Q9ZX0sdGhpcy4kZ2V0VW5kb1NlbGVjdGlvbj1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQ/ZS5hY3Rpb24hPT0iaW5zZXJ0IjplLmFjdGlvbj09PSJpbnNlcnQifXZhciByLGkscztmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dmFyIHU9ZVtvXTtpZighdS5zdGFydCljb250aW51ZTtpZighcil7bih1KT8ocj1sLmZyb21Qb2ludHModS5zdGFydCx1LmVuZCkscz0hMCk6KHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5zdGFydCkscz0hMSk7Y29udGludWV9bih1KT8oaT11LnN0YXJ0LHIuY29tcGFyZShpLnJvdyxpLmNvbHVtbik9PS0xJiZyLnNldFN0YXJ0KGkpLGk9dS5lbmQsci5jb21wYXJlKGkucm93LGkuY29sdW1uKT09MSYmci5zZXRFbmQoaSkscz0hMCk6KGk9dS5zdGFydCxyLmNvbXBhcmUoaS5yb3csaS5jb2x1bW4pPT0tMSYmKHI9bC5mcm9tUG9pbnRzKHUuc3RhcnQsdS5zdGFydCkpLHM9ITEpfXJldHVybiByfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5kb2MucmVwbGFjZShlLHQpfSx0aGlzLm1vdmVUZXh0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLmdldFRleHRSYW5nZShlKSxpPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHM9bC5mcm9tUG9pbnRzKHQsdCk7aWYoIW4pe3RoaXMucmVtb3ZlKGUpO3ZhciBvPWUuc3RhcnQucm93LWUuZW5kLnJvdyx1PW8/LWUuZW5kLmNvbHVtbjplLnN0YXJ0LmNvbHVtbi1lLmVuZC5jb2x1bW47dSYmKHMuc3RhcnQucm93PT1lLmVuZC5yb3cmJnMuc3RhcnQuY29sdW1uPmUuZW5kLmNvbHVtbiYmKHMuc3RhcnQuY29sdW1uKz11KSxzLmVuZC5yb3c9PWUuZW5kLnJvdyYmcy5lbmQuY29sdW1uPmUuZW5kLmNvbHVtbiYmKHMuZW5kLmNvbHVtbis9dSkpLG8mJnMuc3RhcnQucm93Pj1lLmVuZC5yb3cmJihzLnN0YXJ0LnJvdys9byxzLmVuZC5yb3crPW8pfXMuZW5kPXRoaXMuaW5zZXJ0KHMuc3RhcnQscik7aWYoaS5sZW5ndGgpe3ZhciBhPWUuc3RhcnQsZj1zLnN0YXJ0LG89Zi5yb3ctYS5yb3csdT1mLmNvbHVtbi1hLmNvbHVtbjt0aGlzLmFkZEZvbGRzKGkubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUuY2xvbmUoKSxlLnN0YXJ0LnJvdz09YS5yb3cmJihlLnN0YXJ0LmNvbHVtbis9dSksZS5lbmQucm93PT1hLnJvdyYmKGUuZW5kLmNvbHVtbis9dSksZS5zdGFydC5yb3crPW8sZS5lbmQucm93Kz1vLGV9KSl9cmV0dXJuIHN9LHRoaXMuaW5kZW50Um93cz1mdW5jdGlvbihlLHQsbil7bj1uLnJlcGxhY2UoL1x0L2csdGhpcy5nZXRUYWJTdHJpbmcoKSk7Zm9yKHZhciByPWU7cjw9dDtyKyspdGhpcy5kb2MuaW5zZXJ0SW5MaW5lKHtyb3c6cixjb2x1bW46MH0sbil9LHRoaXMub3V0ZGVudFJvd3M9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb2xsYXBzZVJvd3MoKSxuPW5ldyBsKDAsMCwwLDApLHI9dGhpcy5nZXRUYWJTaXplKCk7Zm9yKHZhciBpPXQuc3RhcnQucm93O2k8PXQuZW5kLnJvdzsrK2kpe3ZhciBzPXRoaXMuZ2V0TGluZShpKTtuLnN0YXJ0LnJvdz1pLG4uZW5kLnJvdz1pO2Zvcih2YXIgbz0wO288cjsrK28paWYocy5jaGFyQXQobykhPSIgIilicmVhaztvPHImJnMuY2hhckF0KG8pPT0iCSI/KG4uc3RhcnQuY29sdW1uPW8sbi5lbmQuY29sdW1uPW8rMSk6KG4uc3RhcnQuY29sdW1uPTAsbi5lbmQuY29sdW1uPW8pLHRoaXMucmVtb3ZlKG4pfX0sdGhpcy4kbW92ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXtlPXRoaXMuZ2V0Um93Rm9sZFN0YXJ0KGUpLHQ9dGhpcy5nZXRSb3dGb2xkRW5kKHQpO2lmKG48MCl7dmFyIHI9dGhpcy5nZXRSb3dGb2xkU3RhcnQoZStuKTtpZihyPDApcmV0dXJuIDA7dmFyIGk9ci1lfWVsc2UgaWYobj4wKXt2YXIgcj10aGlzLmdldFJvd0ZvbGRFbmQodCtuKTtpZihyPnRoaXMuZG9jLmdldExlbmd0aCgpLTEpcmV0dXJuIDA7dmFyIGk9ci10fWVsc2V7ZT10aGlzLiRjbGlwUm93VG9Eb2N1bWVudChlKSx0PXRoaXMuJGNsaXBSb3dUb0RvY3VtZW50KHQpO3ZhciBpPXQtZSsxfXZhciBzPW5ldyBsKGUsMCx0LE51bWJlci5NQVhfVkFMVUUpLG89dGhpcy5nZXRGb2xkc0luUmFuZ2UocykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlPWUuY2xvbmUoKSxlLnN0YXJ0LnJvdys9aSxlLmVuZC5yb3crPWksZX0pLHU9bj09MD90aGlzLmRvYy5nZXRMaW5lcyhlLHQpOnRoaXMuZG9jLnJlbW92ZUZ1bGxMaW5lcyhlLHQpO3JldHVybiB0aGlzLmRvYy5pbnNlcnRGdWxsTGluZXMoZStpLHUpLG8ubGVuZ3RoJiZ0aGlzLmFkZEZvbGRzKG8pLGl9LHRoaXMubW92ZUxpbmVzVXA9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy4kbW92ZUxpbmVzKGUsdCwtMSl9LHRoaXMubW92ZUxpbmVzRG93bj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLiRtb3ZlTGluZXMoZSx0LDEpfSx0aGlzLmR1cGxpY2F0ZUxpbmVzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuJG1vdmVMaW5lcyhlLHQsMCl9LHRoaXMuJGNsaXBSb3dUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKGUsdGhpcy5kb2MuZ2V0TGVuZ3RoKCktMSkpfSx0aGlzLiRjbGlwQ29sdW1uVG9Sb3c9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdDwwPzA6TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGgsdCl9LHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQ9ZnVuY3Rpb24oZSx0KXt0PU1hdGgubWF4KDAsdCk7aWYoZTwwKWU9MCx0PTA7ZWxzZXt2YXIgbj10aGlzLmRvYy5nZXRMZW5ndGgoKTtlPj1uPyhlPW4tMSx0PXRoaXMuZG9jLmdldExpbmUobi0xKS5sZW5ndGgpOnQ9TWF0aC5taW4odGhpcy5kb2MuZ2V0TGluZShlKS5sZW5ndGgsdCl9cmV0dXJue3JvdzplLGNvbHVtbjp0fX0sdGhpcy4kY2xpcFJhbmdlVG9Eb2N1bWVudD1mdW5jdGlvbihlKXtlLnN0YXJ0LnJvdzwwPyhlLnN0YXJ0LnJvdz0wLGUuc3RhcnQuY29sdW1uPTApOmUuc3RhcnQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhlLnN0YXJ0LnJvdyxlLnN0YXJ0LmNvbHVtbik7dmFyIHQ9dGhpcy5kb2MuZ2V0TGVuZ3RoKCktMTtyZXR1cm4gZS5lbmQucm93PnQ/KGUuZW5kLnJvdz10LGUuZW5kLmNvbHVtbj10aGlzLmRvYy5nZXRMaW5lKHQpLmxlbmd0aCk6ZS5lbmQuY29sdW1uPXRoaXMuJGNsaXBDb2x1bW5Ub1JvdyhlLmVuZC5yb3csZS5lbmQuY29sdW1uKSxlfSx0aGlzLiR3cmFwTGltaXQ9ODAsdGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy4kd3JhcExpbWl0UmFuZ2U9e21pbjpudWxsLG1heDpudWxsfSx0aGlzLnNldFVzZVdyYXBNb2RlPWZ1bmN0aW9uKGUpe2lmKGUhPXRoaXMuJHVzZVdyYXBNb2RlKXt0aGlzLiR1c2VXcmFwTW9kZT1lLHRoaXMuJG1vZGlmaWVkPSEwLHRoaXMuJHJlc2V0Um93Q2FjaGUoMCk7aWYoZSl7dmFyIHQ9dGhpcy5nZXRMZW5ndGgoKTt0aGlzLiR3cmFwRGF0YT1BcnJheSh0KSx0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLHQtMSl9dGhpcy5fc2lnbmFsKCJjaGFuZ2VXcmFwTW9kZSIpfX0sdGhpcy5nZXRVc2VXcmFwTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLiR1c2VXcmFwTW9kZX0sdGhpcy5zZXRXcmFwTGltaXRSYW5nZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1pbiE9PWV8fHRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heCE9PXQpdGhpcy4kd3JhcExpbWl0UmFuZ2U9e21pbjplLG1heDp0fSx0aGlzLiRtb2RpZmllZD0hMCx0aGlzLiRiaWRpSGFuZGxlci5tYXJrQXNEaXJ0eSgpLHRoaXMuJHVzZVdyYXBNb2RlJiZ0aGlzLl9zaWduYWwoImNoYW5nZVdyYXBNb2RlIil9LHRoaXMuYWRqdXN0V3JhcExpbWl0PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kd3JhcExpbWl0UmFuZ2U7bi5tYXg8MCYmKG49e21pbjp0LG1heDp0fSk7dmFyIHI9dGhpcy4kY29uc3RyYWluV3JhcExpbWl0KGUsbi5taW4sbi5tYXgpO3JldHVybiByIT10aGlzLiR3cmFwTGltaXQmJnI+MT8odGhpcy4kd3JhcExpbWl0PXIsdGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kdXNlV3JhcE1vZGUmJih0aGlzLiR1cGRhdGVXcmFwRGF0YSgwLHRoaXMuZ2V0TGVuZ3RoKCktMSksdGhpcy4kcmVzZXRSb3dDYWNoZSgwKSx0aGlzLl9zaWduYWwoImNoYW5nZVdyYXBMaW1pdCIpKSwhMCk6ITF9LHRoaXMuJGNvbnN0cmFpbldyYXBMaW1pdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHQmJihlPU1hdGgubWF4KHQsZSkpLG4mJihlPU1hdGgubWluKG4sZSkpLGV9LHRoaXMuZ2V0V3JhcExpbWl0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHdyYXBMaW1pdH0sdGhpcy5zZXRXcmFwTGltaXQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRXcmFwTGltaXRSYW5nZShlLGUpfSx0aGlzLmdldFdyYXBMaW1pdFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJue21pbjp0aGlzLiR3cmFwTGltaXRSYW5nZS5taW4sbWF4OnRoaXMuJHdyYXBMaW1pdFJhbmdlLm1heH19LHRoaXMuJHVwZGF0ZUludGVybmFsRGF0YU9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHVzZVdyYXBNb2RlLG49ZS5hY3Rpb24scj1lLnN0YXJ0LGk9ZS5lbmQscz1yLnJvdyxvPWkucm93LHU9by1zLGE9bnVsbDt0aGlzLiR1cGRhdGluZz0hMDtpZih1IT0wKWlmKG49PT0icmVtb3ZlIil7dGhpc1t0PyIkd3JhcERhdGEiOiIkcm93TGVuZ3RoQ2FjaGUiXS5zcGxpY2Uocyx1KTt2YXIgZj10aGlzLiRmb2xkRGF0YTthPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHRoaXMucmVtb3ZlRm9sZHMoYSk7dmFyIGw9dGhpcy5nZXRGb2xkTGluZShpLnJvdyksYz0wO2lmKGwpe2wuYWRkUmVtb3ZlQ2hhcnMoaS5yb3csaS5jb2x1bW4sci5jb2x1bW4taS5jb2x1bW4pLGwuc2hpZnRSb3coLXUpO3ZhciBoPXRoaXMuZ2V0Rm9sZExpbmUocyk7aCYmaCE9PWwmJihoLm1lcmdlKGwpLGw9aCksYz1mLmluZGV4T2YobCkrMX1mb3IoYztjPGYubGVuZ3RoO2MrKyl7dmFyIGw9ZltjXTtsLnN0YXJ0LnJvdz49aS5yb3cmJmwuc2hpZnRSb3coLXUpfW89c31lbHNle3ZhciBwPUFycmF5KHUpO3AudW5zaGlmdChzLDApO3ZhciBkPXQ/dGhpcy4kd3JhcERhdGE6dGhpcy4kcm93TGVuZ3RoQ2FjaGU7ZC5zcGxpY2UuYXBwbHkoZCxwKTt2YXIgZj10aGlzLiRmb2xkRGF0YSxsPXRoaXMuZ2V0Rm9sZExpbmUocyksYz0wO2lmKGwpe3ZhciB2PWwucmFuZ2UuY29tcGFyZUluc2lkZShyLnJvdyxyLmNvbHVtbik7dj09MD8obD1sLnNwbGl0KHIucm93LHIuY29sdW1uKSxsJiYobC5zaGlmdFJvdyh1KSxsLmFkZFJlbW92ZUNoYXJzKG8sMCxpLmNvbHVtbi1yLmNvbHVtbikpKTp2PT0tMSYmKGwuYWRkUmVtb3ZlQ2hhcnMocywwLGkuY29sdW1uLXIuY29sdW1uKSxsLnNoaWZ0Um93KHUpKSxjPWYuaW5kZXhPZihsKSsxfWZvcihjO2M8Zi5sZW5ndGg7YysrKXt2YXIgbD1mW2NdO2wuc3RhcnQucm93Pj1zJiZsLnNoaWZ0Um93KHUpfX1lbHNle3U9TWF0aC5hYnMoZS5zdGFydC5jb2x1bW4tZS5lbmQuY29sdW1uKSxuPT09InJlbW92ZSImJihhPXRoaXMuZ2V0Rm9sZHNJblJhbmdlKGUpLHRoaXMucmVtb3ZlRm9sZHMoYSksdT0tdSk7dmFyIGw9dGhpcy5nZXRGb2xkTGluZShzKTtsJiZsLmFkZFJlbW92ZUNoYXJzKHMsci5jb2x1bW4sdSl9cmV0dXJuIHQmJnRoaXMuJHdyYXBEYXRhLmxlbmd0aCE9dGhpcy5kb2MuZ2V0TGVuZ3RoKCkmJmNvbnNvbGUuZXJyb3IoImRvYy5nZXRMZW5ndGgoKSBhbmQgJHdyYXBEYXRhLmxlbmd0aCBoYXZlIHRvIGJlIHRoZSBzYW1lISIpLHRoaXMuJHVwZGF0aW5nPSExLHQ/dGhpcy4kdXBkYXRlV3JhcERhdGEocyxvKTp0aGlzLiR1cGRhdGVSb3dMZW5ndGhDYWNoZShzLG8pLGF9LHRoaXMuJHVwZGF0ZVJvd0xlbmd0aENhY2hlPWZ1bmN0aW9uKGUsdCxuKXt0aGlzLiRyb3dMZW5ndGhDYWNoZVtlXT1udWxsLHRoaXMuJHJvd0xlbmd0aENhY2hlW3RdPW51bGx9LHRoaXMuJHVwZGF0ZVdyYXBEYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIHI9dGhpcy5kb2MuZ2V0QWxsTGluZXMoKSxpPXRoaXMuZ2V0VGFiU2l6ZSgpLG89dGhpcy4kd3JhcERhdGEsdT10aGlzLiR3cmFwTGltaXQsYSxmLGw9ZTt0PU1hdGgubWluKHQsci5sZW5ndGgtMSk7d2hpbGUobDw9dClmPXRoaXMuZ2V0Rm9sZExpbmUobCxmKSxmPyhhPVtdLGYud2FsayhmdW5jdGlvbihlLHQsaSxvKXt2YXIgdTtpZihlIT1udWxsKXt1PXRoaXMuJGdldERpc3BsYXlUb2tlbnMoZSxhLmxlbmd0aCksdVswXT1uO2Zvcih2YXIgZj0xO2Y8dS5sZW5ndGg7ZisrKXVbZl09c31lbHNlIHU9dGhpcy4kZ2V0RGlzcGxheVRva2VucyhyW3RdLnN1YnN0cmluZyhvLGkpLGEubGVuZ3RoKTthPWEuY29uY2F0KHUpfS5iaW5kKHRoaXMpLGYuZW5kLnJvdyxyW2YuZW5kLnJvd10ubGVuZ3RoKzEpLG9bZi5zdGFydC5yb3ddPXRoaXMuJGNvbXB1dGVXcmFwU3BsaXRzKGEsdSxpKSxsPWYuZW5kLnJvdysxKTooYT10aGlzLiRnZXREaXNwbGF5VG9rZW5zKHJbbF0pLG9bbF09dGhpcy4kY29tcHV0ZVdyYXBTcGxpdHMoYSx1LGkpLGwrKyl9O3ZhciBlPTEsdD0yLG49MyxzPTQsYT05LGM9MTAsZD0xMSx2PTEyO3RoaXMuJGNvbXB1dGVXcmFwU3BsaXRzPWZ1bmN0aW9uKGUscixpKXtmdW5jdGlvbiBnKCl7dmFyIHQ9MDtpZihtPT09MClyZXR1cm4gdDtpZihwKWZvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO2lmKHI9PWMpdCs9MTtlbHNle2lmKHIhPWQpe2lmKHI9PXYpY29udGludWU7YnJlYWt9dCs9aX19cmV0dXJuIGgmJnAhPT0hMSYmKHQrPWkpLE1hdGgubWluKHQsbSl9ZnVuY3Rpb24geSh0KXt2YXIgbj10LWY7Zm9yKHZhciByPWY7cjx0O3IrKyl7dmFyIGk9ZVtyXTtpZihpPT09MTJ8fGk9PT0yKW4tPTF9by5sZW5ndGh8fChiPWcoKSxvLmluZGVudD1iKSxsKz1uLG8ucHVzaChsKSxmPXR9aWYoZS5sZW5ndGg9PTApcmV0dXJuW107dmFyIG89W10sdT1lLmxlbmd0aCxmPTAsbD0wLGg9dGhpcy4kd3JhcEFzQ29kZSxwPXRoaXMuJGluZGVudGVkU29mdFdyYXAsbT1yPD1NYXRoLm1heCgyKmksOCl8fHA9PT0hMT8wOk1hdGguZmxvb3Ioci8yKSxiPTA7d2hpbGUodS1mPnItYil7dmFyIHc9ZityLWI7aWYoZVt3LTFdPj1jJiZlW3ddPj1jKXt5KHcpO2NvbnRpbnVlfWlmKGVbd109PW58fGVbd109PXMpe2Zvcih3O3chPWYtMTt3LS0paWYoZVt3XT09bilicmVhaztpZih3PmYpe3kodyk7Y29udGludWV9dz1mK3I7Zm9yKHc7dzxlLmxlbmd0aDt3KyspaWYoZVt3XSE9cylicmVhaztpZih3PT1lLmxlbmd0aClicmVhazt5KHcpO2NvbnRpbnVlfXZhciBFPU1hdGgubWF4KHctKHItKHI+PjIpKSxmLTEpO3doaWxlKHc+RSYmZVt3XTxuKXctLTtpZihoKXt3aGlsZSh3PkUmJmVbd108bil3LS07d2hpbGUodz5FJiZlW3ddPT1hKXctLX1lbHNlIHdoaWxlKHc+RSYmZVt3XTxjKXctLTtpZih3PkUpe3koKyt3KTtjb250aW51ZX13PWYrcixlW3ddPT10JiZ3LS0seSh3LWIpfXJldHVybiBvfSx0aGlzLiRnZXREaXNwbGF5VG9rZW5zPWZ1bmN0aW9uKG4scil7dmFyIGk9W10scztyPXJ8fDA7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciB1PW4uY2hhckNvZGVBdChvKTtpZih1PT05KXtzPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShpLmxlbmd0aCtyKSxpLnB1c2goZCk7Zm9yKHZhciBmPTE7ZjxzO2YrKylpLnB1c2godil9ZWxzZSB1PT0zMj9pLnB1c2goYyk6dT4zOSYmdTw0OHx8dT41NyYmdTw2ND9pLnB1c2goYSk6dT49NDM1MiYmbSh1KT9pLnB1c2goZSx0KTppLnB1c2goZSl9cmV0dXJuIGl9LHRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoPWZ1bmN0aW9uKGUsdCxuKXtpZih0PT0wKXJldHVyblswLDBdO3Q9PW51bGwmJih0PUluZmluaXR5KSxuPW58fDA7dmFyIHIsaTtmb3IoaT0wO2k8ZS5sZW5ndGg7aSsrKXtyPWUuY2hhckNvZGVBdChpKSxyPT05P24rPXRoaXMuZ2V0U2NyZWVuVGFiU2l6ZShuKTpyPj00MzUyJiZtKHIpP24rPTI6bis9MTtpZihuPnQpYnJlYWt9cmV0dXJuW24saV19LHRoaXMubGluZVdpZGdldHM9bnVsbCx0aGlzLmdldFJvd0xlbmd0aD1mdW5jdGlvbihlKXtpZih0aGlzLmxpbmVXaWRnZXRzKXZhciB0PXRoaXMubGluZVdpZGdldHNbZV0mJnRoaXMubGluZVdpZGdldHNbZV0ucm93Q291bnR8fDA7ZWxzZSB0PTA7cmV0dXJuIXRoaXMuJHVzZVdyYXBNb2RlfHwhdGhpcy4kd3JhcERhdGFbZV0/MSt0OnRoaXMuJHdyYXBEYXRhW2VdLmxlbmd0aCsxK3R9LHRoaXMuZ2V0Um93TGluZUNvdW50PWZ1bmN0aW9uKGUpe3JldHVybiF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzE6dGhpcy4kd3JhcERhdGFbZV0ubGVuZ3RoKzF9LHRoaXMuZ2V0Um93V3JhcEluZGVudD1mdW5jdGlvbihlKXtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIHQ9dGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSxOdW1iZXIuTUFYX1ZBTFVFKSxuPXRoaXMuJHdyYXBEYXRhW3Qucm93XTtyZXR1cm4gbi5sZW5ndGgmJm5bMF08dC5jb2x1bW4/bi5pbmRlbnQ6MH1yZXR1cm4gMH0sdGhpcy5nZXRTY3JlZW5MYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsTnVtYmVyLk1BWF9WQUxVRSk7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbih0LnJvdyx0LmNvbHVtbil9LHRoaXMuZ2V0RG9jdW1lbnRMYXN0Um93Q29sdW1uPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5kb2N1bWVudFRvU2NyZWVuUm93KGUsdCk7cmV0dXJuIHRoaXMuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihuKX0sdGhpcy5nZXREb2N1bWVudExhc3RSb3dDb2x1bW5Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuZG9jdW1lbnRUb1NjcmVlblJvdyhlLHQpO3JldHVybiB0aGlzLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihuLE51bWJlci5NQVhfVkFMVUUvMTApfSx0aGlzLmdldFJvd1NwbGl0RGF0YT1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy4kdXNlV3JhcE1vZGU/dGhpcy4kd3JhcERhdGFbZV06dW5kZWZpbmVkfSx0aGlzLmdldFNjcmVlblRhYlNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuJHRhYlNpemUtKGUldGhpcy4kdGFiU2l6ZXwwKX0sdGhpcy5zY3JlZW5Ub0RvY3VtZW50Um93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uKGUsdCkucm93fSx0aGlzLnNjcmVlblRvRG9jdW1lbnRDb2x1bW49ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZSx0KS5jb2x1bW59LHRoaXMuc2NyZWVuVG9Eb2N1bWVudFBvc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXtpZihlPDApcmV0dXJue3JvdzowLGNvbHVtbjowfTt2YXIgcixpPTAscz0wLG8sdT0wLGE9MCxmPXRoaXMuJHNjcmVlblJvd0NhY2hlLGw9dGhpcy4kZ2V0Um93Q2FjaGVJbmRleChmLGUpLGM9Zi5sZW5ndGg7aWYoYyYmbD49MCl2YXIgdT1mW2xdLGk9dGhpcy4kZG9jUm93Q2FjaGVbbF0saD1lPmZbYy0xXTtlbHNlIHZhciBoPSFjO3ZhciBwPXRoaXMuZ2V0TGVuZ3RoKCktMSxkPXRoaXMuZ2V0TmV4dEZvbGRMaW5lKGkpLHY9ZD9kLnN0YXJ0LnJvdzpJbmZpbml0eTt3aGlsZSh1PD1lKXthPXRoaXMuZ2V0Um93TGVuZ3RoKGkpO2lmKHUrYT5lfHxpPj1wKWJyZWFrO3UrPWEsaSsrLGk+diYmKGk9ZC5lbmQucm93KzEsZD10aGlzLmdldE5leHRGb2xkTGluZShpLGQpLHY9ZD9kLnN0YXJ0LnJvdzpJbmZpbml0eSksaCYmKHRoaXMuJGRvY1Jvd0NhY2hlLnB1c2goaSksdGhpcy4kc2NyZWVuUm93Q2FjaGUucHVzaCh1KSl9aWYoZCYmZC5zdGFydC5yb3c8PWkpcj10aGlzLmdldEZvbGREaXNwbGF5TGluZShkKSxpPWQuc3RhcnQucm93O2Vsc2V7aWYodSthPD1lfHxpPnApcmV0dXJue3JvdzpwLGNvbHVtbjp0aGlzLmdldExpbmUocCkubGVuZ3RofTtyPXRoaXMuZ2V0TGluZShpKSxkPW51bGx9dmFyIG09MCxnPU1hdGguZmxvb3IoZS11KTtpZih0aGlzLiR1c2VXcmFwTW9kZSl7dmFyIHk9dGhpcy4kd3JhcERhdGFbaV07eSYmKG89eVtnXSxnPjAmJnkubGVuZ3RoJiYobT15LmluZGVudCxzPXlbZy0xXXx8eVt5Lmxlbmd0aC0xXSxyPXIuc3Vic3RyaW5nKHMpKSl9cmV0dXJuIG4hPT11bmRlZmluZWQmJnRoaXMuJGJpZGlIYW5kbGVyLmlzQmlkaVJvdyh1K2csaSxnKSYmKHQ9dGhpcy4kYmlkaUhhbmRsZXIub2Zmc2V0VG9Db2wobikpLHMrPXRoaXMuJGdldFN0cmluZ1NjcmVlbldpZHRoKHIsdC1tKVsxXSx0aGlzLiR1c2VXcmFwTW9kZSYmcz49byYmKHM9by0xKSxkP2QuaWR4VG9Qb3NpdGlvbihzKTp7cm93OmksY29sdW1uOnN9fSx0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbj1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiB0PT0idW5kZWZpbmVkIil2YXIgbj10aGlzLiRjbGlwUG9zaXRpb25Ub0RvY3VtZW50KGUucm93LGUuY29sdW1uKTtlbHNlIG49dGhpcy4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChlLHQpO2U9bi5yb3csdD1uLmNvbHVtbjt2YXIgcj0wLGk9bnVsbCxzPW51bGw7cz10aGlzLmdldEZvbGRBdChlLHQsMSkscyYmKGU9cy5zdGFydC5yb3csdD1zLnN0YXJ0LmNvbHVtbik7dmFyIG8sdT0wLGE9dGhpcy4kZG9jUm93Q2FjaGUsZj10aGlzLiRnZXRSb3dDYWNoZUluZGV4KGEsZSksbD1hLmxlbmd0aDtpZihsJiZmPj0wKXZhciB1PWFbZl0scj10aGlzLiRzY3JlZW5Sb3dDYWNoZVtmXSxjPWU+YVtsLTFdO2Vsc2UgdmFyIGM9IWw7dmFyIGg9dGhpcy5nZXROZXh0Rm9sZExpbmUodSkscD1oP2guc3RhcnQucm93OkluZmluaXR5O3doaWxlKHU8ZSl7aWYodT49cCl7bz1oLmVuZC5yb3crMTtpZihvPmUpYnJlYWs7aD10aGlzLmdldE5leHRGb2xkTGluZShvLGgpLHA9aD9oLnN0YXJ0LnJvdzpJbmZpbml0eX1lbHNlIG89dSsxO3IrPXRoaXMuZ2V0Um93TGVuZ3RoKHUpLHU9byxjJiYodGhpcy4kZG9jUm93Q2FjaGUucHVzaCh1KSx0aGlzLiRzY3JlZW5Sb3dDYWNoZS5wdXNoKHIpKX12YXIgZD0iIjtoJiZ1Pj1wPyhkPXRoaXMuZ2V0Rm9sZERpc3BsYXlMaW5lKGgsZSx0KSxpPWguc3RhcnQucm93KTooZD10aGlzLmdldExpbmUoZSkuc3Vic3RyaW5nKDAsdCksaT1lKTt2YXIgdj0wO2lmKHRoaXMuJHVzZVdyYXBNb2RlKXt2YXIgbT10aGlzLiR3cmFwRGF0YVtpXTtpZihtKXt2YXIgZz0wO3doaWxlKGQubGVuZ3RoPj1tW2ddKXIrKyxnKys7ZD1kLnN1YnN0cmluZyhtW2ctMV18fDAsZC5sZW5ndGgpLHY9Zz4wP20uaW5kZW50OjB9fXJldHVybntyb3c6cixjb2x1bW46dit0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aChkKVswXX19LHRoaXMuZG9jdW1lbnRUb1NjcmVlbkNvbHVtbj1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLmNvbHVtbn0sdGhpcy5kb2N1bWVudFRvU2NyZWVuUm93PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKGUsdCkucm93fSx0aGlzLmdldFNjcmVlbkxlbmd0aD1mdW5jdGlvbigpe3ZhciBlPTAsdD1udWxsO2lmKCF0aGlzLiR1c2VXcmFwTW9kZSl7ZT10aGlzLmdldExlbmd0aCgpO3ZhciBuPXRoaXMuJGZvbGREYXRhO2Zvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQ9bltyXSxlLT10LmVuZC5yb3ctdC5zdGFydC5yb3d9ZWxzZXt2YXIgaT10aGlzLiR3cmFwRGF0YS5sZW5ndGgscz0wLHI9MCx0PXRoaXMuJGZvbGREYXRhW3IrK10sbz10P3Quc3RhcnQucm93OkluZmluaXR5O3doaWxlKHM8aSl7dmFyIHU9dGhpcy4kd3JhcERhdGFbc107ZSs9dT91Lmxlbmd0aCsxOjEscysrLHM+byYmKHM9dC5lbmQucm93KzEsdD10aGlzLiRmb2xkRGF0YVtyKytdLG89dD90LnN0YXJ0LnJvdzpJbmZpbml0eSl9fXJldHVybiB0aGlzLmxpbmVXaWRnZXRzJiYoZSs9dGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoKCkpLGV9LHRoaXMuJHNldEZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRlbmFibGVWYXJDaGFyKXJldHVybjt0aGlzLiRnZXRTdHJpbmdTY3JlZW5XaWR0aD1mdW5jdGlvbih0LG4scil7aWYobj09PTApcmV0dXJuWzAsMF07bnx8KG49SW5maW5pdHkpLHI9cnx8MDt2YXIgaSxzO2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspe2k9dC5jaGFyQXQocyksaT09PSIJIj9yKz10aGlzLmdldFNjcmVlblRhYlNpemUocik6cis9ZS5nZXRDaGFyYWN0ZXJXaWR0aChpKTtpZihyPm4pYnJlYWt9cmV0dXJuW3Isc119fSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJnVG9rZW5pemVyJiYodGhpcy5iZ1Rva2VuaXplci5zZXREb2N1bWVudChudWxsKSx0aGlzLmJnVG9rZW5pemVyPW51bGwpLHRoaXMuJHN0b3BXb3JrZXIoKX0sdGhpcy5pc0Z1bGxXaWR0aD1tfS5jYWxsKGQucHJvdG90eXBlKSxlKCIuL2VkaXRfc2Vzc2lvbi9mb2xkaW5nIikuRm9sZGluZy5jYWxsKGQucHJvdG90eXBlKSxlKCIuL2VkaXRfc2Vzc2lvbi9icmFja2V0X21hdGNoIikuQnJhY2tldE1hdGNoLmNhbGwoZC5wcm90b3R5cGUpLG8uZGVmaW5lT3B0aW9ucyhkLnByb3RvdHlwZSwic2Vzc2lvbiIse3dyYXA6e3NldDpmdW5jdGlvbihlKXshZXx8ZT09Im9mZiI/ZT0hMTplPT0iZnJlZSI/ZT0hMDplPT0icHJpbnRNYXJnaW4iP2U9LTE6dHlwZW9mIGU9PSJzdHJpbmciJiYoZT1wYXJzZUludChlLDEwKXx8ITEpO2lmKHRoaXMuJHdyYXA9PWUpcmV0dXJuO3RoaXMuJHdyYXA9ZTtpZighZSl0aGlzLnNldFVzZVdyYXBNb2RlKCExKTtlbHNle3ZhciB0PXR5cGVvZiBlPT0ibnVtYmVyIj9lOm51bGw7dGhpcy5zZXRXcmFwTGltaXRSYW5nZSh0LHQpLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApfX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0VXNlV3JhcE1vZGUoKT90aGlzLiR3cmFwPT0tMT8icHJpbnRNYXJnaW4iOnRoaXMuZ2V0V3JhcExpbWl0UmFuZ2UoKS5taW4/dGhpcy4kd3JhcDoiZnJlZSI6Im9mZiJ9LGhhbmRsZXNTZXQ6ITB9LHdyYXBNZXRob2Q6e3NldDpmdW5jdGlvbihlKXtlPWU9PSJhdXRvIj90aGlzLiRtb2RlLnR5cGUhPSJ0ZXh0IjplIT0idGV4dCIsZSE9dGhpcy4kd3JhcEFzQ29kZSYmKHRoaXMuJHdyYXBBc0NvZGU9ZSx0aGlzLiR1c2VXcmFwTW9kZSYmKHRoaXMuJHVzZVdyYXBNb2RlPSExLHRoaXMuc2V0VXNlV3JhcE1vZGUoITApKSl9LGluaXRpYWxWYWx1ZToiYXV0byJ9LGluZGVudGVkU29mdFdyYXA6e3NldDpmdW5jdGlvbigpe3RoaXMuJHVzZVdyYXBNb2RlJiYodGhpcy4kdXNlV3JhcE1vZGU9ITEsdGhpcy5zZXRVc2VXcmFwTW9kZSghMCkpfSxpbml0aWFsVmFsdWU6ITB9LGZpcnN0TGluZU51bWJlcjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VCcmVha3BvaW50Iil9LGluaXRpYWxWYWx1ZToxfSx1c2VXb3JrZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR1c2VXb3JrZXI9ZSx0aGlzLiRzdG9wV29ya2VyKCksZSYmdGhpcy4kc3RhcnRXb3JrZXIoKX0saW5pdGlhbFZhbHVlOiEwfSx1c2VTb2Z0VGFiczp7aW5pdGlhbFZhbHVlOiEwfSx0YWJTaXplOntzZXQ6ZnVuY3Rpb24oZSl7ZT1wYXJzZUludChlKSxlPjAmJnRoaXMuJHRhYlNpemUhPT1lJiYodGhpcy4kbW9kaWZpZWQ9ITAsdGhpcy4kcm93TGVuZ3RoQ2FjaGU9W10sdGhpcy4kdGFiU2l6ZT1lLHRoaXMuX3NpZ25hbCgiY2hhbmdlVGFiU2l6ZSIpKX0saW5pdGlhbFZhbHVlOjQsaGFuZGxlc1NldDohMH0sbmF2aWdhdGVXaXRoaW5Tb2Z0VGFiczp7aW5pdGlhbFZhbHVlOiExfSxmb2xkU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEZvbGRTdHlsZShlKX0saGFuZGxlc1NldDohMH0sb3ZlcndyaXRlOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5fc2lnbmFsKCJjaGFuZ2VPdmVyd3JpdGUiKX0saW5pdGlhbFZhbHVlOiExfSxuZXdMaW5lTW9kZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuZG9jLnNldE5ld0xpbmVNb2RlKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb2MuZ2V0TmV3TGluZU1vZGUoKX0saGFuZGxlc1NldDohMH0sbW9kZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0TW9kZShlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1vZGVJZH0saGFuZGxlc1NldDohMH19KSx0LkVkaXRTZXNzaW9uPWR9KSxhY2UuZGVmaW5lKCJhY2Uvc2VhcmNoIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9sYW5nIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSx0KXtmdW5jdGlvbiBuKGUpe3JldHVybi9cdy8udGVzdChlKXx8dC5yZWdFeHA/IlxcYiI6IiJ9cmV0dXJuIG4oZVswXSkrZStuKGVbZS5sZW5ndGgtMV0pfXZhciByPWUoIi4vbGliL2xhbmciKSxpPWUoIi4vbGliL29vcCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZnVuY3Rpb24oKXt0aGlzLiRvcHRpb25zPXt9fTsoZnVuY3Rpb24oKXt0aGlzLnNldD1mdW5jdGlvbihlKXtyZXR1cm4gaS5taXhpbih0aGlzLiRvcHRpb25zLGUpLHRoaXN9LHRoaXMuZ2V0T3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiByLmNvcHlPYmplY3QodGhpcy4kb3B0aW9ucyl9LHRoaXMuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXt0aGlzLiRvcHRpb25zPWV9LHRoaXMuZmluZD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLiRvcHRpb25zLG49dGhpcy4kbWF0Y2hJdGVyYXRvcihlLHQpO2lmKCFuKXJldHVybiExO3ZhciByPW51bGw7cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihlLG4saSxvKXtyZXR1cm4gcj1uZXcgcyhlLG4saSxvKSxuPT1vJiZ0LnN0YXJ0JiZ0LnN0YXJ0LnN0YXJ0JiZ0LnNraXBDdXJyZW50IT0wJiZyLmlzRXF1YWwodC5zdGFydCk/KHI9bnVsbCwhMSk6ITB9KSxyfSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kb3B0aW9ucztpZighdC5uZWVkbGUpcmV0dXJuW107dGhpcy4kYXNzZW1ibGVSZWdFeHAodCk7dmFyIG49dC5yYW5nZSxpPW4/ZS5nZXRMaW5lcyhuLnN0YXJ0LnJvdyxuLmVuZC5yb3cpOmUuZG9jLmdldEFsbExpbmVzKCksbz1bXSx1PXQucmU7aWYodC4kaXNNdWx0aUxpbmUpe3ZhciBhPXUubGVuZ3RoLGY9aS5sZW5ndGgtYSxsO2U6Zm9yKHZhciBjPXUub2Zmc2V0fHwwO2M8PWY7YysrKXtmb3IodmFyIGg9MDtoPGE7aCsrKWlmKGlbYytoXS5zZWFyY2godVtoXSk9PS0xKWNvbnRpbnVlIGU7dmFyIHA9aVtjXSxkPWlbYythLTFdLHY9cC5sZW5ndGgtcC5tYXRjaCh1WzBdKVswXS5sZW5ndGgsbT1kLm1hdGNoKHVbYS0xXSlbMF0ubGVuZ3RoO2lmKGwmJmwuZW5kLnJvdz09PWMmJmwuZW5kLmNvbHVtbj52KWNvbnRpbnVlO28ucHVzaChsPW5ldyBzKGMsdixjK2EtMSxtKSksYT4yJiYoYz1jK2EtMil9fWVsc2UgZm9yKHZhciBnPTA7ZzxpLmxlbmd0aDtnKyspe3ZhciB5PXIuZ2V0TWF0Y2hPZmZzZXRzKGlbZ10sdSk7Zm9yKHZhciBoPTA7aDx5Lmxlbmd0aDtoKyspe3ZhciBiPXlbaF07by5wdXNoKG5ldyBzKGcsYi5vZmZzZXQsZyxiLm9mZnNldCtiLmxlbmd0aCkpfX1pZihuKXt2YXIgdz1uLnN0YXJ0LmNvbHVtbixFPW4uc3RhcnQuY29sdW1uLGc9MCxoPW8ubGVuZ3RoLTE7d2hpbGUoZzxoJiZvW2ddLnN0YXJ0LmNvbHVtbjx3JiZvW2ddLnN0YXJ0LnJvdz09bi5zdGFydC5yb3cpZysrO3doaWxlKGc8aCYmb1toXS5lbmQuY29sdW1uPkUmJm9baF0uZW5kLnJvdz09bi5lbmQucm93KWgtLTtvPW8uc2xpY2UoZyxoKzEpO2ZvcihnPTAsaD1vLmxlbmd0aDtnPGg7ZysrKW9bZ10uc3RhcnQucm93Kz1uLnN0YXJ0LnJvdyxvW2ddLmVuZC5yb3crPW4uc3RhcnQucm93fXJldHVybiBvfSx0aGlzLnJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLiRvcHRpb25zLHI9dGhpcy4kYXNzZW1ibGVSZWdFeHAobik7aWYobi4kaXNNdWx0aUxpbmUpcmV0dXJuIHQ7aWYoIXIpcmV0dXJuO3ZhciBpPXIuZXhlYyhlKTtpZighaXx8aVswXS5sZW5ndGghPWUubGVuZ3RoKXJldHVybiBudWxsO3Q9ZS5yZXBsYWNlKHIsdCk7aWYobi5wcmVzZXJ2ZUNhc2Upe3Q9dC5zcGxpdCgiIik7Zm9yKHZhciBzPU1hdGgubWluKGUubGVuZ3RoLGUubGVuZ3RoKTtzLS07KXt2YXIgbz1lW3NdO28mJm8udG9Mb3dlckNhc2UoKSE9bz90W3NdPXRbc10udG9VcHBlckNhc2UoKTp0W3NdPXRbc10udG9Mb3dlckNhc2UoKX10PXQuam9pbigiIil9cmV0dXJuIHR9LHRoaXMuJGFzc2VtYmxlUmVnRXhwPWZ1bmN0aW9uKGUsdCl7aWYoZS5uZWVkbGUgaW5zdGFuY2VvZiBSZWdFeHApcmV0dXJuIGUucmU9ZS5uZWVkbGU7dmFyIG49ZS5uZWVkbGU7aWYoIWUubmVlZGxlKXJldHVybiBlLnJlPSExO2UucmVnRXhwfHwobj1yLmVzY2FwZVJlZ0V4cChuKSksZS53aG9sZVdvcmQmJihuPXUobixlKSk7dmFyIGk9ZS5jYXNlU2Vuc2l0aXZlPyJnbSI6ImdtaSI7ZS4kaXNNdWx0aUxpbmU9IXQmJi9bXG5ccl0vLnRlc3Qobik7aWYoZS4kaXNNdWx0aUxpbmUpcmV0dXJuIGUucmU9dGhpcy4kYXNzZW1ibGVNdWx0aWxpbmVSZWdFeHAobixpKTt0cnl7dmFyIHM9bmV3IFJlZ0V4cChuLGkpfWNhdGNoKG8pe3M9ITF9cmV0dXJuIGUucmU9c30sdGhpcy4kYXNzZW1ibGVNdWx0aWxpbmVSZWdFeHA9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnJlcGxhY2UoL1xyXG58XHJ8XG4vZywiJFxuXiIpLnNwbGl0KCJcbiIpLHI9W107Zm9yKHZhciBpPTA7aTxuLmxlbmd0aDtpKyspdHJ5e3IucHVzaChuZXcgUmVnRXhwKG5baV0sdCkpfWNhdGNoKHMpe3JldHVybiExfXJldHVybiByfSx0aGlzLiRtYXRjaEl0ZXJhdG9yPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy4kYXNzZW1ibGVSZWdFeHAodCk7aWYoIW4pcmV0dXJuITE7dmFyIHI9dC5iYWNrd2FyZHM9PTEsaT10LnNraXBDdXJyZW50IT0wLHM9dC5yYW5nZSxvPXQuc3RhcnQ7b3x8KG89cz9zW3I/ImVuZCI6InN0YXJ0Il06ZS5zZWxlY3Rpb24uZ2V0UmFuZ2UoKSksby5zdGFydCYmKG89b1tpIT1yPyJlbmQiOiJzdGFydCJdKTt2YXIgdT1zP3Muc3RhcnQucm93OjAsYT1zP3MuZW5kLnJvdzplLmdldExlbmd0aCgpLTE7aWYocil2YXIgZj1mdW5jdGlvbihlKXt2YXIgbj1vLnJvdztpZihjKG4sby5jb2x1bW4sZSkpcmV0dXJuO2ZvcihuLS07bj49dTtuLS0paWYoYyhuLE51bWJlci5NQVhfVkFMVUUsZSkpcmV0dXJuO2lmKHQud3JhcD09MClyZXR1cm47Zm9yKG49YSx1PW8ucm93O24+PXU7bi0tKWlmKGMobixOdW1iZXIuTUFYX1ZBTFVFLGUpKXJldHVybn07ZWxzZSB2YXIgZj1mdW5jdGlvbihlKXt2YXIgbj1vLnJvdztpZihjKG4sby5jb2x1bW4sZSkpcmV0dXJuO2ZvcihuKz0xO248PWE7bisrKWlmKGMobiwwLGUpKXJldHVybjtpZih0LndyYXA9PTApcmV0dXJuO2ZvcihuPXUsYT1vLnJvdztuPD1hO24rKylpZihjKG4sMCxlKSlyZXR1cm59O2lmKHQuJGlzTXVsdGlMaW5lKXZhciBsPW4ubGVuZ3RoLGM9ZnVuY3Rpb24odCxpLHMpe3ZhciBvPXI/dC1sKzE6dDtpZihvPDApcmV0dXJuO3ZhciB1PWUuZ2V0TGluZShvKSxhPXUuc2VhcmNoKG5bMF0pO2lmKCFyJiZhPGl8fGE9PT0tMSlyZXR1cm47Zm9yKHZhciBmPTE7ZjxsO2YrKyl7dT1lLmdldExpbmUobytmKTtpZih1LnNlYXJjaChuW2ZdKT09LTEpcmV0dXJufXZhciBjPXUubWF0Y2gobltsLTFdKVswXS5sZW5ndGg7aWYociYmYz5pKXJldHVybjtpZihzKG8sYSxvK2wtMSxjKSlyZXR1cm4hMH07ZWxzZSBpZihyKXZhciBjPWZ1bmN0aW9uKHQscixpKXt2YXIgcz1lLmdldExpbmUodCksbz1bXSx1LGE9MDtuLmxhc3RJbmRleD0wO3doaWxlKHU9bi5leGVjKHMpKXt2YXIgZj11WzBdLmxlbmd0aDthPXUuaW5kZXg7aWYoIWYpe2lmKGE+PXMubGVuZ3RoKWJyZWFrO24ubGFzdEluZGV4PWErPTF9aWYodS5pbmRleCtmPnIpYnJlYWs7by5wdXNoKHUuaW5kZXgsZil9Zm9yKHZhciBsPW8ubGVuZ3RoLTE7bD49MDtsLT0yKXt2YXIgYz1vW2wtMV0sZj1vW2xdO2lmKGkodCxjLHQsYytmKSlyZXR1cm4hMH19O2Vsc2UgdmFyIGM9ZnVuY3Rpb24odCxyLGkpe3ZhciBzPWUuZ2V0TGluZSh0KSxvLHU7bi5sYXN0SW5kZXg9cjt3aGlsZSh1PW4uZXhlYyhzKSl7dmFyIGE9dVswXS5sZW5ndGg7bz11LmluZGV4O2lmKGkodCxvLHQsbythKSlyZXR1cm4hMDtpZighYSl7bi5sYXN0SW5kZXg9bys9MTtpZihvPj1zLmxlbmd0aClyZXR1cm4hMX19fTtyZXR1cm57Zm9yRWFjaDpmfX19KS5jYWxsKG8ucHJvdG90eXBlKSx0LlNlYXJjaD1vfSksYWNlLmRlZmluZSgiYWNlL2tleWJvYXJkL2hhc2hfaGFuZGxlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIva2V5cyIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCl7dGhpcy5wbGF0Zm9ybT10fHwoaS5pc01hYz8ibWFjIjoid2luIiksdGhpcy5jb21tYW5kcz17fSx0aGlzLmNvbW1hbmRLZXlCaW5kaW5nPXt9LHRoaXMuYWRkQ29tbWFuZHMoZSksdGhpcy4kc2luZ2xlQ29tbWFuZD0hMH1mdW5jdGlvbiB1KGUsdCl7by5jYWxsKHRoaXMsZSx0KSx0aGlzLiRzaW5nbGVDb21tYW5kPSExfXZhciByPWUoIi4uL2xpYi9rZXlzIiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iikscz1yLktFWV9NT0RTO3UucHJvdG90eXBlPW8ucHJvdG90eXBlLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlLmJpbmRLZXkmJmUuYmluZEtleS5wb3NpdGlvbnx8KGUuaXNEZWZhdWx0Py0xMDA6MCl9dGhpcy5hZGRDb21tYW5kPWZ1bmN0aW9uKGUpe3RoaXMuY29tbWFuZHNbZS5uYW1lXSYmdGhpcy5yZW1vdmVDb21tYW5kKGUpLHRoaXMuY29tbWFuZHNbZS5uYW1lXT1lLGUuYmluZEtleSYmdGhpcy5fYnVpbGRLZXlIYXNoKGUpfSx0aGlzLnJlbW92ZUNvbW1hbmQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lJiYodHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5uYW1lKTtlPXRoaXMuY29tbWFuZHNbbl0sdHx8ZGVsZXRlIHRoaXMuY29tbWFuZHNbbl07dmFyIHI9dGhpcy5jb21tYW5kS2V5QmluZGluZztmb3IodmFyIGkgaW4gcil7dmFyIHM9cltpXTtpZihzPT1lKWRlbGV0ZSByW2ldO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShzKSl7dmFyIG89cy5pbmRleE9mKGUpO28hPS0xJiYocy5zcGxpY2UobywxKSxzLmxlbmd0aD09MSYmKHJbaV09c1swXSkpfX19LHRoaXMuYmluZEtleT1mdW5jdGlvbihlLHQsbil7dHlwZW9mIGU9PSJvYmplY3QiJiZlJiYobj09dW5kZWZpbmVkJiYobj1lLnBvc2l0aW9uKSxlPWVbdGhpcy5wbGF0Zm9ybV0pO2lmKCFlKXJldHVybjtpZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gdGhpcy5hZGRDb21tYW5kKHtleGVjOnQsYmluZEtleTplLG5hbWU6dC5uYW1lfHxlfSk7ZS5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9IiI7aWYoZS5pbmRleE9mKCIgIikhPS0xKXt2YXIgaT1lLnNwbGl0KC9ccysvKTtlPWkucG9wKCksaS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMucGFyc2VLZXlzKGUpLG49c1t0Lmhhc2hJZF0rdC5rZXk7cis9KHI/IiAiOiIiKStuLHRoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmcociwiY2hhaW5LZXlzIil9LHRoaXMpLHIrPSIgIn12YXIgbz10aGlzLnBhcnNlS2V5cyhlKSx1PXNbby5oYXNoSWRdK28ua2V5O3RoaXMuX2FkZENvbW1hbmRUb0JpbmRpbmcocit1LHQsbil9LHRoaXMpfSx0aGlzLl9hZGRDb21tYW5kVG9CaW5kaW5nPWZ1bmN0aW9uKHQsbixyKXt2YXIgaT10aGlzLmNvbW1hbmRLZXlCaW5kaW5nLHM7aWYoIW4pZGVsZXRlIGlbdF07ZWxzZSBpZighaVt0XXx8dGhpcy4kc2luZ2xlQ29tbWFuZClpW3RdPW47ZWxzZXtBcnJheS5pc0FycmF5KGlbdF0pPyhzPWlbdF0uaW5kZXhPZihuKSkhPS0xJiZpW3RdLnNwbGljZShzLDEpOmlbdF09W2lbdF1dLHR5cGVvZiByIT0ibnVtYmVyIiYmKHI9ZShuKSk7dmFyIG89aVt0XTtmb3Iocz0wO3M8by5sZW5ndGg7cysrKXt2YXIgdT1vW3NdLGE9ZSh1KTtpZihhPnIpYnJlYWt9by5zcGxpY2UocywwLG4pfX0sdGhpcy5hZGRDb21tYW5kcz1mdW5jdGlvbihlKXtlJiZPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBuPWVbdF07aWYoIW4pcmV0dXJuO2lmKHR5cGVvZiBuPT0ic3RyaW5nIilyZXR1cm4gdGhpcy5iaW5kS2V5KG4sdCk7dHlwZW9mIG49PSJmdW5jdGlvbiImJihuPXtleGVjOm59KTtpZih0eXBlb2YgbiE9Im9iamVjdCIpcmV0dXJuO24ubmFtZXx8KG4ubmFtZT10KSx0aGlzLmFkZENvbW1hbmQobil9LHRoaXMpfSx0aGlzLnJlbW92ZUNvbW1hbmRzPWZ1bmN0aW9uKGUpe09iamVjdC5rZXlzKGUpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5yZW1vdmVDb21tYW5kKGVbdF0pfSx0aGlzKX0sdGhpcy5iaW5kS2V5cz1mdW5jdGlvbihlKXtPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMuYmluZEtleSh0LGVbdF0pfSx0aGlzKX0sdGhpcy5fYnVpbGRLZXlIYXNoPWZ1bmN0aW9uKGUpe3RoaXMuYmluZEtleShlLmJpbmRLZXksZSl9LHRoaXMucGFyc2VLZXlzPWZ1bmN0aW9uKGUpe3ZhciB0PWUudG9Mb3dlckNhc2UoKS5zcGxpdCgvW1wtXCtdKFtcLVwrXSk/LykuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSksbj10LnBvcCgpLGk9cltuXTtpZihyLkZVTkNUSU9OX0tFWVNbaV0pbj1yLkZVTkNUSU9OX0tFWVNbaV0udG9Mb3dlckNhc2UoKTtlbHNle2lmKCF0Lmxlbmd0aClyZXR1cm57a2V5Om4saGFzaElkOi0xfTtpZih0Lmxlbmd0aD09MSYmdFswXT09InNoaWZ0IilyZXR1cm57a2V5Om4udG9VcHBlckNhc2UoKSxoYXNoSWQ6LTF9fXZhciBzPTA7Zm9yKHZhciBvPXQubGVuZ3RoO28tLTspe3ZhciB1PXIuS0VZX01PRFNbdFtvXV07aWYodT09bnVsbClyZXR1cm4gdHlwZW9mIGNvbnNvbGUhPSJ1bmRlZmluZWQiJiZjb25zb2xlLmVycm9yKCJpbnZhbGlkIG1vZGlmaWVyICIrdFtvXSsiIGluICIrZSksITE7c3w9dX1yZXR1cm57a2V5Om4saGFzaElkOnN9fSx0aGlzLmZpbmRLZXlDb21tYW5kPWZ1bmN0aW9uKHQsbil7dmFyIHI9c1t0XStuO3JldHVybiB0aGlzLmNvbW1hbmRLZXlCaW5kaW5nW3JdfSx0aGlzLmhhbmRsZUtleWJvYXJkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKHI8MClyZXR1cm47dmFyIGk9c1t0XStuLG89dGhpcy5jb21tYW5kS2V5QmluZGluZ1tpXTtlLiRrZXlDaGFpbiYmKGUuJGtleUNoYWluKz0iICIraSxvPXRoaXMuY29tbWFuZEtleUJpbmRpbmdbZS4ka2V5Q2hhaW5dfHxvKTtpZihvKWlmKG89PSJjaGFpbktleXMifHxvW28ubGVuZ3RoLTFdPT0iY2hhaW5LZXlzIilyZXR1cm4gZS4ka2V5Q2hhaW49ZS4ka2V5Q2hhaW58fGkse2NvbW1hbmQ6Im51bGwifTtpZihlLiRrZXlDaGFpbilpZighIXQmJnQhPTR8fG4ubGVuZ3RoIT0xKXtpZih0PT0tMXx8cj4wKWUuJGtleUNoYWluPSIifWVsc2UgZS4ka2V5Q2hhaW49ZS4ka2V5Q2hhaW4uc2xpY2UoMCwtaS5sZW5ndGgtMSk7cmV0dXJue2NvbW1hbmQ6b319LHRoaXMuZ2V0U3RhdHVzVGV4dD1mdW5jdGlvbihlLHQpe3JldHVybiB0LiRrZXlDaGFpbnx8IiJ9fS5jYWxsKG8ucHJvdG90eXBlKSx0Lkhhc2hIYW5kbGVyPW8sdC5NdWx0aUhhc2hIYW5kbGVyPXV9KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvY29tbWFuZF9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2Uva2V5Ym9hcmQvaGFzaF9oYW5kbGVyIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuLi9rZXlib2FyZC9oYXNoX2hhbmRsZXIiKS5NdWx0aUhhc2hIYW5kbGVyLHM9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1mdW5jdGlvbihlLHQpe2kuY2FsbCh0aGlzLHQsZSksdGhpcy5ieU5hbWU9dGhpcy5jb21tYW5kcyx0aGlzLnNldERlZmF1bHRIYW5kbGVyKCJleGVjIixmdW5jdGlvbihlKXtyZXR1cm4gZS5jb21tYW5kLmV4ZWMoZS5lZGl0b3IsZS5hcmdzfHx7fSl9KX07ci5pbmhlcml0cyhvLGkpLGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLmV4ZWM9ZnVuY3Rpb24oZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgcj1lLmxlbmd0aDtyLS07KWlmKHRoaXMuZXhlYyhlW3JdLHQsbikpcmV0dXJuITA7cmV0dXJuITF9dHlwZW9mIGU9PSJzdHJpbmciJiYoZT10aGlzLmNvbW1hbmRzW2VdKTtpZighZSlyZXR1cm4hMTtpZih0JiZ0LiRyZWFkT25seSYmIWUucmVhZE9ubHkpcmV0dXJuITE7aWYodGhpcy4kY2hlY2tDb21tYW5kU3RhdGUhPTAmJmUuaXNBdmFpbGFibGUmJiFlLmlzQXZhaWxhYmxlKHQpKXJldHVybiExO3ZhciBpPXtlZGl0b3I6dCxjb21tYW5kOmUsYXJnczpufTtyZXR1cm4gaS5yZXR1cm5WYWx1ZT10aGlzLl9lbWl0KCJleGVjIixpKSx0aGlzLl9zaWduYWwoImFmdGVyRXhlYyIsaSksaS5yZXR1cm5WYWx1ZT09PSExPyExOiEwfSx0aGlzLnRvZ2dsZVJlY29yZGluZz1mdW5jdGlvbihlKXtpZih0aGlzLiRpblJlcGxheSlyZXR1cm47cmV0dXJuIGUmJmUuX2VtaXQoImNoYW5nZVN0YXR1cyIpLHRoaXMucmVjb3JkaW5nPyh0aGlzLm1hY3JvLnBvcCgpLHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZXhlYyIsdGhpcy4kYWRkQ29tbWFuZFRvTWFjcm8pLHRoaXMubWFjcm8ubGVuZ3RofHwodGhpcy5tYWNybz10aGlzLm9sZE1hY3JvKSx0aGlzLnJlY29yZGluZz0hMSk6KHRoaXMuJGFkZENvbW1hbmRUb01hY3JvfHwodGhpcy4kYWRkQ29tbWFuZFRvTWFjcm89ZnVuY3Rpb24oZSl7dGhpcy5tYWNyby5wdXNoKFtlLmNvbW1hbmQsZS5hcmdzXSl9LmJpbmQodGhpcykpLHRoaXMub2xkTWFjcm89dGhpcy5tYWNybyx0aGlzLm1hY3JvPVtdLHRoaXMub24oImV4ZWMiLHRoaXMuJGFkZENvbW1hbmRUb01hY3JvKSx0aGlzLnJlY29yZGluZz0hMCl9LHRoaXMucmVwbGF5PWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGluUmVwbGF5fHwhdGhpcy5tYWNybylyZXR1cm47aWYodGhpcy5yZWNvcmRpbmcpcmV0dXJuIHRoaXMudG9nZ2xlUmVjb3JkaW5nKGUpO3RyeXt0aGlzLiRpblJlcGxheT0hMCx0aGlzLm1hY3JvLmZvckVhY2goZnVuY3Rpb24odCl7dHlwZW9mIHQ9PSJzdHJpbmciP3RoaXMuZXhlYyh0LGUpOnRoaXMuZXhlYyh0WzBdLGUsdFsxXSl9LHRoaXMpfWZpbmFsbHl7dGhpcy4kaW5SZXBsYXk9ITF9fSx0aGlzLnRyaW1NYWNybz1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlWzBdIT0ic3RyaW5nIiYmKGVbMF09ZVswXS5uYW1lKSxlWzFdfHwoZT1lWzBdKSxlfSl9fS5jYWxsKG8ucHJvdG90eXBlKSx0LkNvbW1hbmRNYW5hZ2VyPW99KSxhY2UuZGVmaW5lKCJhY2UvY29tbWFuZHMvZGVmYXVsdF9jb21tYW5kcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvbGFuZyIsImFjZS9jb25maWciLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG8oZSx0KXtyZXR1cm57d2luOmUsbWFjOnR9fXZhciByPWUoIi4uL2xpYi9sYW5nIiksaT1lKCIuLi9jb25maWciKSxzPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5jb21tYW5kcz1be25hbWU6InNob3dTZXR0aW5nc01lbnUiLGJpbmRLZXk6bygiQ3RybC0sIiwiQ29tbWFuZC0sIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2V0dGluZ3NfbWVudSIsZnVuY3Rpb24odCl7dC5pbml0KGUpLGUuc2hvd1NldHRpbmdzTWVudSgpfSl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZ29Ub05leHRFcnJvciIsYmluZEtleTpvKCJBbHQtRSIsIkY0IiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoIi4vZXh0L2Vycm9yX21hcmtlciIsZnVuY3Rpb24odCl7dC5zaG93RXJyb3JNYXJrZXIoZSwxKX0pfSxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb1RvUHJldmlvdXNFcnJvciIsYmluZEtleTpvKCJBbHQtU2hpZnQtRSIsIlNoaWZ0LUY0IiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoIi4vZXh0L2Vycm9yX21hcmtlciIsZnVuY3Rpb24odCl7dC5zaG93RXJyb3JNYXJrZXIoZSwtMSl9KX0sc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0YWxsIixkZXNjcmlwdGlvbjoiU2VsZWN0IGFsbCIsYmluZEtleTpvKCJDdHJsLUEiLCJDb21tYW5kLUEiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0QWxsKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToiY2VudGVyc2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiQ2VudGVyIHNlbGVjdGlvbiIsYmluZEtleTpvKG51bGwsIkN0cmwtTCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jZW50ZXJTZWxlY3Rpb24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvbGluZSIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUuLi4iLGJpbmRLZXk6bygiQ3RybC1MIiwiQ29tbWFuZC1MIiksZXhlYzpmdW5jdGlvbihlLHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmIWlzTmFOKHQpJiZlLmdvdG9MaW5lKHQpLGUucHJvbXB0KHskdHlwZToiZ290b0xpbmUifSl9LHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZCIsYmluZEtleTpvKCJBbHQtTHxDdHJsLUYxIiwiQ29tbWFuZC1BbHQtTHxDb21tYW5kLUYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZCghMSl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InVuZm9sZCIsYmluZEtleTpvKCJBbHQtU2hpZnQtTHxDdHJsLVNoaWZ0LUYxIiwiQ29tbWFuZC1BbHQtU2hpZnQtTHxDb21tYW5kLVNoaWZ0LUYxIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udG9nZ2xlRm9sZCghMCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InRvZ2dsZUZvbGRXaWRnZXQiLGJpbmRLZXk6bygiRjIiLCJGMiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZXNzaW9uLnRvZ2dsZUZvbGRXaWRnZXQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToidG9nZ2xlUGFyZW50Rm9sZFdpZGdldCIsYmluZEtleTpvKCJBbHQtRjIiLCJBbHQtRjIiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Vzc2lvbi50b2dnbGVGb2xkV2lkZ2V0KCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZm9sZGFsbCIsZGVzY3JpcHRpb246IkZvbGQgYWxsIixiaW5kS2V5Om8obnVsbCwiQ3RybC1Db21tYW5kLU9wdGlvbi0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24uZm9sZEFsbCgpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZvbGRPdGhlciIsZGVzY3JpcHRpb246IkZvbGQgb3RoZXIiLGJpbmRLZXk6bygiQWx0LTAiLCJDb21tYW5kLU9wdGlvbi0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24uZm9sZEFsbCgpLGUuc2Vzc2lvbi51bmZvbGQoZS5zZWxlY3Rpb24uZ2V0QWxsUmFuZ2VzKCkpfSxzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6InVuZm9sZGFsbCIsZGVzY3JpcHRpb246IlVuZm9sZCBhbGwiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LTAiLCJDb21tYW5kLU9wdGlvbi1TaGlmdC0wIiksZXhlYzpmdW5jdGlvbihlKXtlLnNlc3Npb24udW5mb2xkKCl9LHNjcm9sbEludG9WaWV3OiJjZW50ZXIiLHJlYWRPbmx5OiEwfSx7bmFtZToiZmluZG5leHQiLGRlc2NyaXB0aW9uOiJGaW5kIG5leHQiLGJpbmRLZXk6bygiQ3RybC1LIiwiQ29tbWFuZC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLmZpbmROZXh0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY2VudGVyIixyZWFkT25seTohMH0se25hbWU6ImZpbmRwcmV2aW91cyIsZGVzY3JpcHRpb246IkZpbmQgcHJldmlvdXMiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1LIiwiQ29tbWFuZC1TaGlmdC1HIiksZXhlYzpmdW5jdGlvbihlKXtlLmZpbmRQcmV2aW91cygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImNlbnRlciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RPckZpbmROZXh0IixkZXNjcmlwdGlvbjoiU2VsZWN0IG9yIGZpbmQgbmV4dCIsYmluZEtleTpvKCJBbHQtSyIsIkN0cmwtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24uaXNFbXB0eSgpP2Uuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTplLmZpbmROZXh0KCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0T3JGaW5kUHJldmlvdXMiLGRlc2NyaXB0aW9uOiJTZWxlY3Qgb3IgZmluZCBwcmV2aW91cyIsYmluZEtleTpvKCJBbHQtU2hpZnQtSyIsIkN0cmwtU2hpZnQtRyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3Rpb24uaXNFbXB0eSgpP2Uuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTplLmZpbmRQcmV2aW91cygpfSxyZWFkT25seTohMH0se25hbWU6ImZpbmQiLGRlc2NyaXB0aW9uOiJGaW5kIixiaW5kS2V5Om8oIkN0cmwtRiIsIkNvbW1hbmQtRiIpLGV4ZWM6ZnVuY3Rpb24oZSl7aS5sb2FkTW9kdWxlKCJhY2UvZXh0L3NlYXJjaGJveCIsZnVuY3Rpb24odCl7dC5TZWFyY2goZSl9KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJvdmVyd3JpdGUiLGRlc2NyaXB0aW9uOiJPdmVyd3JpdGUiLGJpbmRLZXk6Ikluc2VydCIsZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZU92ZXJ3cml0ZSgpfSxyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvc3RhcnQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gc3RhcnQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1Ib21lIiwiQ29tbWFuZC1TaGlmdC1Ib21lfENvbW1hbmQtU2hpZnQtVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0RmlsZVN0YXJ0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJnb3Rvc3RhcnQiLGRlc2NyaXB0aW9uOiJHbyB0byBzdGFydCIsYmluZEtleTpvKCJDdHJsLUhvbWUiLCJDb21tYW5kLUhvbWV8Q29tbWFuZC1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUZpbGVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITAsc2Nyb2xsSW50b1ZpZXc6ImFuaW1hdGUiLGFjZUNvbW1hbmRHcm91cDoiZmlsZUp1bXAifSx7bmFtZToic2VsZWN0dXAiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdXAiLGJpbmRLZXk6bygiU2hpZnQtVXAiLCJTaGlmdC1VcHxDdHJsLVNoaWZ0LVAiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0VXAoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5ldXAiLGRlc2NyaXB0aW9uOiJHbyBsaW5lIHVwIixiaW5kS2V5Om8oIlVwIiwiVXB8Q3RybC1QIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVVcCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0dG9lbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gZW5kIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRW5kIiwiQ29tbWFuZC1TaGlmdC1FbmR8Q29tbWFuZC1TaGlmdC1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdEZpbGVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixhY2VDb21tYW5kR3JvdXA6ImZpbGVKdW1wIn0se25hbWU6ImdvdG9lbmQiLGRlc2NyaXB0aW9uOiJHbyB0byBlbmQiLGJpbmRLZXk6bygiQ3RybC1FbmQiLCJDb21tYW5kLUVuZHxDb21tYW5kLURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVGaWxlRW5kKCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixyZWFkT25seTohMCxzY3JvbGxJbnRvVmlldzoiYW5pbWF0ZSIsYWNlQ29tbWFuZEdyb3VwOiJmaWxlSnVtcCJ9LHtuYW1lOiJzZWxlY3Rkb3duIixkZXNjcmlwdGlvbjoiU2VsZWN0IGRvd24iLGJpbmRLZXk6bygiU2hpZnQtRG93biIsIlNoaWZ0LURvd258Q3RybC1TaGlmdC1OIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdERvd24oKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ29saW5lZG93biIsZGVzY3JpcHRpb246IkdvIGxpbmUgZG93biIsYmluZEtleTpvKCJEb3duIiwiRG93bnxDdHJsLU4iKSxleGVjOmZ1bmN0aW9uKGUsdCl7ZS5uYXZpZ2F0ZURvd24odC50aW1lcyl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHdvcmRsZWZ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHdvcmQgbGVmdCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUxlZnQiLCJPcHRpb24tU2hpZnQtTGVmdCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJnb3Rvd29yZGxlZnQiLGRlc2NyaXB0aW9uOiJHbyB0byB3b3JkIGxlZnQiLGJpbmRLZXk6bygiQ3RybC1MZWZ0IiwiT3B0aW9uLUxlZnQiKSxleGVjOmZ1bmN0aW9uKGUpe2UubmF2aWdhdGVXb3JkTGVmdCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IlNlbGVjdCB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1TaGlmdC1MZWZ0IiwiQ29tbWFuZC1TaGlmdC1MZWZ0fEN0cmwtU2hpZnQtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IkdvIHRvIGxpbmUgc3RhcnQiLGJpbmRLZXk6bygiQWx0LUxlZnR8SG9tZSIsIkNvbW1hbmQtTGVmdHxIb21lfEN0cmwtQSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZUxpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RsZWZ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IGxlZnQiLGJpbmRLZXk6bygiU2hpZnQtTGVmdCIsIlNoaWZ0LUxlZnR8Q3RybC1TaGlmdC1CIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xlZnQiLGRlc2NyaXB0aW9uOiJHbyB0byBsZWZ0IixiaW5kS2V5Om8oIkxlZnQiLCJMZWZ0fEN0cmwtQiIpLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLm5hdmlnYXRlTGVmdCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0d29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiU2VsZWN0IHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1SaWdodCIsIk9wdGlvbi1TaGlmdC1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RXb3JkUmlnaHQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b3dvcmRyaWdodCIsZGVzY3JpcHRpb246IkdvIHRvIHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1SaWdodCIsIk9wdGlvbi1SaWdodCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5uYXZpZ2F0ZVdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3R0b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LVNoaWZ0LVJpZ2h0IiwiQ29tbWFuZC1TaGlmdC1SaWdodHxTaGlmdC1FbmR8Q3RybC1TaGlmdC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdExpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToiZ290b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJHbyB0byBsaW5lIGVuZCIsYmluZEtleTpvKCJBbHQtUmlnaHR8RW5kIiwiQ29tbWFuZC1SaWdodHxFbmR8Q3RybC1FIiksZXhlYzpmdW5jdGlvbihlKXtlLm5hdmlnYXRlTGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3RyaWdodCIsZGVzY3JpcHRpb246IlNlbGVjdCByaWdodCIsYmluZEtleTpvKCJTaGlmdC1SaWdodCIsIlNoaWZ0LVJpZ2h0IiksZXhlYzpmdW5jdGlvbihlKXtlLmdldFNlbGVjdGlvbigpLnNlbGVjdFJpZ2h0KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImdvdG9yaWdodCIsZGVzY3JpcHRpb246IkdvIHRvIHJpZ2h0IixiaW5kS2V5Om8oIlJpZ2h0IiwiUmlnaHR8Q3RybC1GIiksZXhlYzpmdW5jdGlvbihlLHQpe2UubmF2aWdhdGVSaWdodCh0LnRpbWVzKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZWRvd24iLGRlc2NyaXB0aW9uOiJTZWxlY3QgcGFnZSBkb3duIixiaW5kS2V5OiJTaGlmdC1QYWdlRG93biIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdFBhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToicGFnZWRvd24iLGRlc2NyaXB0aW9uOiJQYWdlIGRvd24iLGJpbmRLZXk6byhudWxsLCJPcHRpb24tUGFnZURvd24iKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc2Nyb2xsUGFnZURvd24oKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJnb3RvcGFnZWRvd24iLGRlc2NyaXB0aW9uOiJHbyB0byBwYWdlIGRvd24iLGJpbmRLZXk6bygiUGFnZURvd24iLCJQYWdlRG93bnxDdHJsLVYiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZ290b1BhZ2VEb3duKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0cGFnZXVwIixkZXNjcmlwdGlvbjoiU2VsZWN0IHBhZ2UgdXAiLGJpbmRLZXk6IlNoaWZ0LVBhZ2VVcCIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6InBhZ2V1cCIsZGVzY3JpcHRpb246IlBhZ2UgdXAiLGJpbmRLZXk6byhudWxsLCJPcHRpb24tUGFnZVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLnNjcm9sbFBhZ2VVcCgpfSxyZWFkT25seTohMH0se25hbWU6ImdvdG9wYWdldXAiLGRlc2NyaXB0aW9uOiJHbyB0byBwYWdlIHVwIixiaW5kS2V5OiJQYWdlVXAiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nb3RvUGFnZVVwKCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2Nyb2xsdXAiLGRlc2NyaXB0aW9uOiJTY3JvbGwgdXAiLGJpbmRLZXk6bygiQ3RybC1VcCIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLnNjcm9sbEJ5KDAsLTIqZS5yZW5kZXJlci5sYXllckNvbmZpZy5saW5lSGVpZ2h0KX0scmVhZE9ubHk6ITB9LHtuYW1lOiJzY3JvbGxkb3duIixkZXNjcmlwdGlvbjoiU2Nyb2xsIGRvd24iLGJpbmRLZXk6bygiQ3RybC1Eb3duIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuc2Nyb2xsQnkoMCwyKmUucmVuZGVyZXIubGF5ZXJDb25maWcubGluZUhlaWdodCl9LHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZXN0YXJ0IixkZXNjcmlwdGlvbjoiU2VsZWN0IGxpbmUgc3RhcnQiLGJpbmRLZXk6IlNoaWZ0LUhvbWUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5nZXRTZWxlY3Rpb24oKS5zZWxlY3RMaW5lU3RhcnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0bGluZWVuZCIsZGVzY3JpcHRpb246IlNlbGVjdCBsaW5lIGVuZCIsYmluZEtleToiU2hpZnQtRW5kIixleGVjOmZ1bmN0aW9uKGUpe2UuZ2V0U2VsZWN0aW9uKCkuc2VsZWN0TGluZUVuZCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJ0b2dnbGVyZWNvcmRpbmciLGRlc2NyaXB0aW9uOiJUb2dnbGUgcmVjb3JkaW5nIixiaW5kS2V5Om8oIkN0cmwtQWx0LUUiLCJDb21tYW5kLU9wdGlvbi1FIiksZXhlYzpmdW5jdGlvbihlKXtlLmNvbW1hbmRzLnRvZ2dsZVJlY29yZGluZyhlKX0scmVhZE9ubHk6ITB9LHtuYW1lOiJyZXBsYXltYWNybyIsZGVzY3JpcHRpb246IlJlcGxheSBtYWNybyIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUUiLCJDb21tYW5kLVNoaWZ0LUUiKSxleGVjOmZ1bmN0aW9uKGUpe2UuY29tbWFuZHMucmVwbGF5KGUpfSxyZWFkT25seTohMH0se25hbWU6Imp1bXB0b21hdGNoaW5nIixkZXNjcmlwdGlvbjoiSnVtcCB0byBtYXRjaGluZyIsYmluZEtleTpvKCJDdHJsLVxcfEN0cmwtUCIsIkNvbW1hbmQtXFwiKSxleGVjOmZ1bmN0aW9uKGUpe2UuanVtcFRvTWF0Y2hpbmcoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InNlbGVjdHRvbWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJTZWxlY3QgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1cXHxDdHJsLVNoaWZ0LVAiLCJDb21tYW5kLVNoaWZ0LVxcIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6ImV4cGFuZFRvTWF0Y2hpbmciLGRlc2NyaXB0aW9uOiJFeHBhbmQgdG8gbWF0Y2hpbmciLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1NIiwiQ3RybC1TaGlmdC1NIiksZXhlYzpmdW5jdGlvbihlKXtlLmp1bXBUb01hdGNoaW5nKCEwLCEwKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJhbmltYXRlIixyZWFkT25seTohMH0se25hbWU6InBhc3NLZXlzVG9Ccm93c2VyIixkZXNjcmlwdGlvbjoiUGFzcyBrZXlzIHRvIGJyb3dzZXIiLGJpbmRLZXk6byhudWxsLG51bGwpLGV4ZWM6ZnVuY3Rpb24oKXt9LHBhc3NFdmVudDohMCxyZWFkT25seTohMH0se25hbWU6ImNvcHkiLGRlc2NyaXB0aW9uOiJDb3B5IixleGVjOmZ1bmN0aW9uKGUpe30scmVhZE9ubHk6ITB9LHtuYW1lOiJjdXQiLGRlc2NyaXB0aW9uOiJDdXQiLGV4ZWM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kY29weVdpdGhFbXB0eVNlbGVjdGlvbiYmZS5zZWxlY3Rpb24uaXNFbXB0eSgpLG49dD9lLnNlbGVjdGlvbi5nZXRMaW5lUmFuZ2UoKTplLnNlbGVjdGlvbi5nZXRSYW5nZSgpO2UuX2VtaXQoImN1dCIsbiksbi5pc0VtcHR5KCl8fGUuc2Vzc2lvbi5yZW1vdmUobiksZS5jbGVhclNlbGVjdGlvbigpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJwYXN0ZSIsZGVzY3JpcHRpb246IlBhc3RlIixleGVjOmZ1bmN0aW9uKGUsdCl7ZS4kaGFuZGxlUGFzdGUodCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZlbGluZSIsZGVzY3JpcHRpb246IlJlbW92ZSBsaW5lIixiaW5kS2V5Om8oIkN0cmwtRCIsIkNvbW1hbmQtRCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVMaW5lcygpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUifSx7bmFtZToiZHVwbGljYXRlU2VsZWN0aW9uIixkZXNjcmlwdGlvbjoiRHVwbGljYXRlIHNlbGVjdGlvbiIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUQiLCJDb21tYW5kLVNoaWZ0LUQiKSxleGVjOmZ1bmN0aW9uKGUpe2UuZHVwbGljYXRlU2VsZWN0aW9uKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIn0se25hbWU6InNvcnRsaW5lcyIsZGVzY3JpcHRpb246IlNvcnQgbGluZXMiLGJpbmRLZXk6bygiQ3RybC1BbHQtUyIsIkNvbW1hbmQtQWx0LVMiKSxleGVjOmZ1bmN0aW9uKGUpe2Uuc29ydExpbmVzKCl9LHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb24iLG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSJ9LHtuYW1lOiJ0b2dnbGVjb21tZW50IixkZXNjcmlwdGlvbjoiVG9nZ2xlIGNvbW1lbnQiLGJpbmRLZXk6bygiQ3RybC0vIiwiQ29tbWFuZC0vIiksZXhlYzpmdW5jdGlvbihlKXtlLnRvZ2dsZUNvbW1lbnRMaW5lcygpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaExpbmUiLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6InRvZ2dsZUJsb2NrQ29tbWVudCIsZGVzY3JpcHRpb246IlRvZ2dsZSBibG9jayBjb21tZW50IixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtLyIsIkNvbW1hbmQtU2hpZnQtLyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b2dnbGVCbG9ja0NvbW1lbnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJzZWxlY3Rpb25QYXJ0In0se25hbWU6Im1vZGlmeU51bWJlclVwIixkZXNjcmlwdGlvbjoiTW9kaWZ5IG51bWJlciB1cCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVVwIiwiQWx0LVNoaWZ0LVVwIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vZGlmeU51bWJlcigxKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIsbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2gifSx7bmFtZToibW9kaWZ5TnVtYmVyRG93biIsZGVzY3JpcHRpb246Ik1vZGlmeSBudW1iZXIgZG93biIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LURvd24iLCJBbHQtU2hpZnQtRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5tb2RpZnlOdW1iZXIoLTEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCJ9LHtuYW1lOiJyZXBsYWNlIixkZXNjcmlwdGlvbjoiUmVwbGFjZSIsYmluZEtleTpvKCJDdHJsLUgiLCJDb21tYW5kLU9wdGlvbi1GIiksZXhlYzpmdW5jdGlvbihlKXtpLmxvYWRNb2R1bGUoImFjZS9leHQvc2VhcmNoYm94IixmdW5jdGlvbih0KXt0LlNlYXJjaChlLCEwKX0pfX0se25hbWU6InVuZG8iLGRlc2NyaXB0aW9uOiJVbmRvIixiaW5kS2V5Om8oIkN0cmwtWiIsIkNvbW1hbmQtWiIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS51bmRvKCl9fSx7bmFtZToicmVkbyIsZGVzY3JpcHRpb246IlJlZG8iLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1afEN0cmwtWSIsIkNvbW1hbmQtU2hpZnQtWnxDb21tYW5kLVkiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVkbygpfX0se25hbWU6ImNvcHlsaW5lc3VwIixkZXNjcmlwdGlvbjoiQ29weSBsaW5lcyB1cCIsYmluZEtleTpvKCJBbHQtU2hpZnQtVXAiLCJDb21tYW5kLU9wdGlvbi1VcCIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb3B5TGluZXNVcCgpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6Im1vdmVsaW5lc3VwIixkZXNjcmlwdGlvbjoiTW92ZSBsaW5lcyB1cCIsYmluZEtleTpvKCJBbHQtVXAiLCJPcHRpb24tVXAiKSxleGVjOmZ1bmN0aW9uKGUpe2UubW92ZUxpbmVzVXAoKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJjb3B5bGluZXNkb3duIixkZXNjcmlwdGlvbjoiQ29weSBsaW5lcyBkb3duIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1Eb3duIiwiQ29tbWFuZC1PcHRpb24tRG93biIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5jb3B5TGluZXNEb3duKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToibW92ZWxpbmVzZG93biIsZGVzY3JpcHRpb246Ik1vdmUgbGluZXMgZG93biIsYmluZEtleTpvKCJBbHQtRG93biIsIk9wdGlvbi1Eb3duIiksZXhlYzpmdW5jdGlvbihlKXtlLm1vdmVMaW5lc0Rvd24oKX0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJkZWwiLGRlc2NyaXB0aW9uOiJEZWxldGUiLGJpbmRLZXk6bygiRGVsZXRlIiwiRGVsZXRlfEN0cmwtRHxTaGlmdC1EZWxldGUiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlKCJyaWdodCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJiYWNrc3BhY2UiLGRlc2NyaXB0aW9uOiJCYWNrc3BhY2UiLGJpbmRLZXk6bygiU2hpZnQtQmFja3NwYWNlfEJhY2tzcGFjZSIsIkN0cmwtQmFja3NwYWNlfFNoaWZ0LUJhY2tzcGFjZXxCYWNrc3BhY2V8Q3RybC1IIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZSgibGVmdCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJjdXRfb3JfZGVsZXRlIixkZXNjcmlwdGlvbjoiQ3V0IG9yIGRlbGV0ZSIsYmluZEtleTpvKCJTaGlmdC1EZWxldGUiLG51bGwpLGV4ZWM6ZnVuY3Rpb24oZSl7aWYoIWUuc2VsZWN0aW9uLmlzRW1wdHkoKSlyZXR1cm4hMTtlLnJlbW92ZSgibGVmdCIpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVzdGFydCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIHN0YXJ0IixiaW5kS2V5Om8oIkFsdC1CYWNrc3BhY2UiLCJDb21tYW5kLUJhY2tzcGFjZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVUb0xpbmVTdGFydCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJyZW1vdmV0b2xpbmVlbmQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgdG8gbGluZSBlbmQiLGJpbmRLZXk6bygiQWx0LURlbGV0ZSIsIkN0cmwtS3xDb21tYW5kLURlbGV0ZSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5yZW1vdmVUb0xpbmVFbmQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lc3RhcnRoYXJkIixkZXNjcmlwdGlvbjoiUmVtb3ZlIHRvIGxpbmUgc3RhcnQgaGFyZCIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LUJhY2tzcGFjZSIsbnVsbCksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3Quc3RhcnQuY29sdW1uPTAsZS5zZXNzaW9uLnJlbW92ZSh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3ZldG9saW5lZW5kaGFyZCIsZGVzY3JpcHRpb246IlJlbW92ZSB0byBsaW5lIGVuZCBoYXJkIixiaW5kS2V5Om8oIkN0cmwtU2hpZnQtRGVsZXRlIixudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5lbmQuY29sdW1uPU51bWJlci5NQVhfVkFMVUUsZS5zZXNzaW9uLnJlbW92ZSh0KX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3Zld29yZGxlZnQiLGRlc2NyaXB0aW9uOiJSZW1vdmUgd29yZCBsZWZ0IixiaW5kS2V5Om8oIkN0cmwtQmFja3NwYWNlIiwiQWx0LUJhY2tzcGFjZXxDdHJsLUFsdC1CYWNrc3BhY2UiKSxleGVjOmZ1bmN0aW9uKGUpe2UucmVtb3ZlV29yZExlZnQoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToicmVtb3Zld29yZHJpZ2h0IixkZXNjcmlwdGlvbjoiUmVtb3ZlIHdvcmQgcmlnaHQiLGJpbmRLZXk6bygiQ3RybC1EZWxldGUiLCJBbHQtRGVsZXRlIiksZXhlYzpmdW5jdGlvbihlKXtlLnJlbW92ZVdvcmRSaWdodCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJvdXRkZW50IixkZXNjcmlwdGlvbjoiT3V0ZGVudCIsYmluZEtleTpvKCJTaGlmdC1UYWIiLCJTaGlmdC1UYWIiKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tPdXRkZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoIixzY3JvbGxJbnRvVmlldzoic2VsZWN0aW9uUGFydCJ9LHtuYW1lOiJpbmRlbnQiLGRlc2NyaXB0aW9uOiJJbmRlbnQiLGJpbmRLZXk6bygiVGFiIiwiVGFiIiksZXhlYzpmdW5jdGlvbihlKXtlLmluZGVudCgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiYmxvY2tvdXRkZW50IixkZXNjcmlwdGlvbjoiQmxvY2sgb3V0ZGVudCIsYmluZEtleTpvKCJDdHJsLVsiLCJDdHJsLVsiKSxleGVjOmZ1bmN0aW9uKGUpe2UuYmxvY2tPdXRkZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiYmxvY2tpbmRlbnQiLGRlc2NyaXB0aW9uOiJCbG9jayBpbmRlbnQiLGJpbmRLZXk6bygiQ3RybC1dIiwiQ3RybC1dIiksZXhlYzpmdW5jdGlvbihlKXtlLmJsb2NrSW5kZW50KCl9LG11bHRpU2VsZWN0QWN0aW9uOiJmb3JFYWNoTGluZSIsc2Nyb2xsSW50b1ZpZXc6InNlbGVjdGlvblBhcnQifSx7bmFtZToiaW5zZXJ0c3RyaW5nIixkZXNjcmlwdGlvbjoiSW5zZXJ0IHN0cmluZyIsZXhlYzpmdW5jdGlvbihlLHQpe2UuaW5zZXJ0KHQpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJpbnNlcnR0ZXh0IixkZXNjcmlwdGlvbjoiSW5zZXJ0IHRleHQiLGV4ZWM6ZnVuY3Rpb24oZSx0KXtlLmluc2VydChyLnN0cmluZ1JlcGVhdCh0LnRleHR8fCIiLHQudGltZXN8fDEpKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToic3BsaXRsaW5lIixkZXNjcmlwdGlvbjoiU3BsaXQgbGluZSIsYmluZEtleTpvKG51bGwsIkN0cmwtTyIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zcGxpdExpbmUoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToidHJhbnNwb3NlbGV0dGVycyIsZGVzY3JpcHRpb246IlRyYW5zcG9zZSBsZXR0ZXJzIixiaW5kS2V5Om8oIkFsdC1TaGlmdC1YIiwiQ3RybC1UIiksZXhlYzpmdW5jdGlvbihlKXtlLnRyYW5zcG9zZUxldHRlcnMoKX0sbXVsdGlTZWxlY3RBY3Rpb246ZnVuY3Rpb24oZSl7ZS50cmFuc3Bvc2VTZWxlY3Rpb25zKDEpfSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIn0se25hbWU6InRvdXBwZXJjYXNlIixkZXNjcmlwdGlvbjoiVG8gdXBwZXJjYXNlIixiaW5kS2V5Om8oIkN0cmwtVSIsIkN0cmwtVSIpLGV4ZWM6ZnVuY3Rpb24oZSl7ZS50b1VwcGVyQ2FzZSgpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJ0b2xvd2VyY2FzZSIsZGVzY3JpcHRpb246IlRvIGxvd2VyY2FzZSIsYmluZEtleTpvKCJDdHJsLVNoaWZ0LVUiLCJDdHJsLVNoaWZ0LVUiKSxleGVjOmZ1bmN0aW9uKGUpe2UudG9Mb3dlckNhc2UoKX0sbXVsdGlTZWxlY3RBY3Rpb246ImZvckVhY2giLHNjcm9sbEludG9WaWV3OiJjdXJzb3IifSx7bmFtZToiZXhwYW5kdG9saW5lIixkZXNjcmlwdGlvbjoiRXhwYW5kIHRvIGxpbmUiLGJpbmRLZXk6bygiQ3RybC1TaGlmdC1MIiwiQ29tbWFuZC1TaGlmdC1MIiksZXhlYzpmdW5jdGlvbihlKXt2YXIgdD1lLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3Quc3RhcnQuY29sdW1uPXQuZW5kLmNvbHVtbj0wLHQuZW5kLnJvdysrLGUuc2VsZWN0aW9uLnNldFJhbmdlKHQsITEpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIsc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJqb2lubGluZXMiLGRlc2NyaXB0aW9uOiJKb2luIGxpbmVzIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCksbj10P2Uuc2VsZWN0aW9uLmdldFNlbGVjdGlvbkxlYWQoKTplLnNlbGVjdGlvbi5nZXRTZWxlY3Rpb25BbmNob3IoKSxpPXQ/ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uQW5jaG9yKCk6ZS5zZWxlY3Rpb24uZ2V0U2VsZWN0aW9uTGVhZCgpLG89ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KS5sZW5ndGgsdT1lLnNlc3Npb24uZG9jLmdldFRleHRSYW5nZShlLnNlbGVjdGlvbi5nZXRSYW5nZSgpKSxhPXUucmVwbGFjZSgvXG5ccyovLCIgIikubGVuZ3RoLGY9ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KTtmb3IodmFyIGw9bi5yb3crMTtsPD1pLnJvdysxO2wrKyl7dmFyIGM9ci5zdHJpbmdUcmltTGVmdChyLnN0cmluZ1RyaW1SaWdodChlLnNlc3Npb24uZG9jLmdldExpbmUobCkpKTtjLmxlbmd0aCE9PTAmJihjPSIgIitjKSxmKz1jfWkucm93KzE8ZS5zZXNzaW9uLmRvYy5nZXRMZW5ndGgoKS0xJiYoZis9ZS5zZXNzaW9uLmRvYy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpLGUuY2xlYXJTZWxlY3Rpb24oKSxlLnNlc3Npb24uZG9jLnJlcGxhY2UobmV3IHMobi5yb3csMCxpLnJvdysyLDApLGYpLGE+MD8oZS5zZWxlY3Rpb24ubW92ZUN1cnNvclRvKG4ucm93LG4uY29sdW1uKSxlLnNlbGVjdGlvbi5zZWxlY3RUbyhuLnJvdyxuLmNvbHVtbithKSk6KG89ZS5zZXNzaW9uLmRvYy5nZXRMaW5lKG4ucm93KS5sZW5ndGg+bz9vKzE6byxlLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yVG8obi5yb3csbykpfSxtdWx0aVNlbGVjdEFjdGlvbjoiZm9yRWFjaCIscmVhZE9ubHk6ITB9LHtuYW1lOiJpbnZlcnRTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJJbnZlcnQgc2VsZWN0aW9uIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Vzc2lvbi5kb2MuZ2V0TGVuZ3RoKCktMSxuPWUuc2Vzc2lvbi5kb2MuZ2V0TGluZSh0KS5sZW5ndGgscj1lLnNlbGVjdGlvbi5yYW5nZUxpc3QucmFuZ2VzLGk9W107ci5sZW5ndGg8MSYmKHI9W2Uuc2VsZWN0aW9uLmdldFJhbmdlKCldKTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylvPT1yLmxlbmd0aC0xJiYocltvXS5lbmQucm93IT09dHx8cltvXS5lbmQuY29sdW1uIT09bikmJmkucHVzaChuZXcgcyhyW29dLmVuZC5yb3cscltvXS5lbmQuY29sdW1uLHQsbikpLG89PT0wPyhyW29dLnN0YXJ0LnJvdyE9PTB8fHJbb10uc3RhcnQuY29sdW1uIT09MCkmJmkucHVzaChuZXcgcygwLDAscltvXS5zdGFydC5yb3cscltvXS5zdGFydC5jb2x1bW4pKTppLnB1c2gobmV3IHMocltvLTFdLmVuZC5yb3cscltvLTFdLmVuZC5jb2x1bW4scltvXS5zdGFydC5yb3cscltvXS5zdGFydC5jb2x1bW4pKTtlLmV4aXRNdWx0aVNlbGVjdE1vZGUoKSxlLmNsZWFyU2VsZWN0aW9uKCk7Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDtvKyspZS5zZWxlY3Rpb24uYWRkUmFuZ2UoaVtvXSwhMSl9LHJlYWRPbmx5OiEwLHNjcm9sbEludG9WaWV3OiJub25lIn0se25hbWU6Im9wZW5Db21tYW5kUGFsbGV0ZSIsZGVzY3JpcHRpb246Ik9wZW4gY29tbWFuZCBwYWxsZXRlIixiaW5kS2V5Om8oIkYxIiwiRjEiKSxleGVjOmZ1bmN0aW9uKGUpe2UucHJvbXB0KHskdHlwZToiY29tbWFuZHMifSl9LHJlYWRPbmx5OiEwfSx7bmFtZToibW9kZVNlbGVjdCIsZGVzY3JpcHRpb246IkNoYW5nZSBsYW5ndWFnZSBtb2RlLi4uIixiaW5kS2V5Om8obnVsbCxudWxsKSxleGVjOmZ1bmN0aW9uKGUpe2UucHJvbXB0KHskdHlwZToibW9kZXMifSl9LHJlYWRPbmx5OiEwfV19KSxhY2UuZGVmaW5lKCJhY2UvZWRpdG9yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9maXhvbGRicm93c2VycyIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL3VzZXJhZ2VudCIsImFjZS9rZXlib2FyZC90ZXh0aW5wdXQiLCJhY2UvbW91c2UvbW91c2VfaGFuZGxlciIsImFjZS9tb3VzZS9mb2xkX2hhbmRsZXIiLCJhY2Uva2V5Ym9hcmQva2V5YmluZGluZyIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2Uvc2VhcmNoIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIsImFjZS9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIiwiYWNlL2NvbmZpZyIsImFjZS90b2tlbl9pdGVyYXRvciIsImFjZS9jbGlwYm9hcmQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vbGliL2xhbmciKSxvPWUoIi4vbGliL3VzZXJhZ2VudCIpLHU9ZSgiLi9rZXlib2FyZC90ZXh0aW5wdXQiKS5UZXh0SW5wdXQsYT1lKCIuL21vdXNlL21vdXNlX2hhbmRsZXIiKS5Nb3VzZUhhbmRsZXIsZj1lKCIuL21vdXNlL2ZvbGRfaGFuZGxlciIpLkZvbGRIYW5kbGVyLGw9ZSgiLi9rZXlib2FyZC9rZXliaW5kaW5nIikuS2V5QmluZGluZyxjPWUoIi4vZWRpdF9zZXNzaW9uIikuRWRpdFNlc3Npb24saD1lKCIuL3NlYXJjaCIpLlNlYXJjaCxwPWUoIi4vcmFuZ2UiKS5SYW5nZSxkPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdj1lKCIuL2NvbW1hbmRzL2NvbW1hbmRfbWFuYWdlciIpLkNvbW1hbmRNYW5hZ2VyLG09ZSgiLi9jb21tYW5kcy9kZWZhdWx0X2NvbW1hbmRzIikuY29tbWFuZHMsZz1lKCIuL2NvbmZpZyIpLHk9ZSgiLi90b2tlbl9pdGVyYXRvciIpLlRva2VuSXRlcmF0b3IsYj1lKCIuL2NsaXBib2FyZCIpLHc9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0Q29udGFpbmVyRWxlbWVudCgpO3RoaXMuY29udGFpbmVyPXIsdGhpcy5yZW5kZXJlcj1lLHRoaXMuaWQ9ImVkaXRvciIrICsrdy4kdWlkLHRoaXMuY29tbWFuZHM9bmV3IHYoby5pc01hYz8ibWFjIjoid2luIixtKSx0eXBlb2YgZG9jdW1lbnQ9PSJvYmplY3QiJiYodGhpcy50ZXh0SW5wdXQ9bmV3IHUoZS5nZXRUZXh0QXJlYUNvbnRhaW5lcigpLHRoaXMpLHRoaXMucmVuZGVyZXIudGV4dGFyZWE9dGhpcy50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpLHRoaXMuJG1vdXNlSGFuZGxlcj1uZXcgYSh0aGlzKSxuZXcgZih0aGlzKSksdGhpcy5rZXlCaW5kaW5nPW5ldyBsKHRoaXMpLHRoaXMuJHNlYXJjaD0obmV3IGgpLnNldCh7d3JhcDohMH0pLHRoaXMuJGhpc3RvcnlUcmFja2VyPXRoaXMuJGhpc3RvcnlUcmFja2VyLmJpbmQodGhpcyksdGhpcy5jb21tYW5kcy5vbigiZXhlYyIsdGhpcy4kaGlzdG9yeVRyYWNrZXIpLHRoaXMuJGluaXRPcGVyYXRpb25MaXN0ZW5lcnMoKSx0aGlzLl8kZW1pdElucHV0RXZlbnQ9cy5kZWxheWVkQ2FsbChmdW5jdGlvbigpe3RoaXMuX3NpZ25hbCgiaW5wdXQiLHt9KSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5iZ1Rva2VuaXplciYmdGhpcy5zZXNzaW9uLmJnVG9rZW5pemVyLnNjaGVkdWxlU3RhcnQoKX0uYmluZCh0aGlzKSksdGhpcy5vbigiY2hhbmdlIixmdW5jdGlvbihlLHQpe3QuXyRlbWl0SW5wdXRFdmVudC5zY2hlZHVsZSgzMSl9KSx0aGlzLnNldFNlc3Npb24odHx8biYmbi5zZXNzaW9ufHxuZXcgYygiIikpLGcucmVzZXRPcHRpb25zKHRoaXMpLG4mJnRoaXMuc2V0T3B0aW9ucyhuKSxnLl9zaWduYWwoImVkaXRvciIsdGhpcyl9O3cuJHVpZD0wLGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxkKSx0aGlzLiRpbml0T3BlcmF0aW9uTGlzdGVuZXJzPWZ1bmN0aW9uKCl7dGhpcy5jb21tYW5kcy5vbigiZXhlYyIsdGhpcy5zdGFydE9wZXJhdGlvbi5iaW5kKHRoaXMpLCEwKSx0aGlzLmNvbW1hbmRzLm9uKCJhZnRlckV4ZWMiLHRoaXMuZW5kT3BlcmF0aW9uLmJpbmQodGhpcyksITApLHRoaXMuJG9wUmVzZXRUaW1lcj1zLmRlbGF5ZWRDYWxsKHRoaXMuZW5kT3BlcmF0aW9uLmJpbmQodGhpcywhMCkpLHRoaXMub24oImNoYW5nZSIsZnVuY3Rpb24oKXt0aGlzLmN1ck9wfHwodGhpcy5zdGFydE9wZXJhdGlvbigpLHRoaXMuY3VyT3Auc2VsZWN0aW9uQmVmb3JlPXRoaXMuJGxhc3RTZWwpLHRoaXMuY3VyT3AuZG9jQ2hhbmdlZD0hMH0uYmluZCh0aGlzKSwhMCksdGhpcy5vbigiY2hhbmdlU2VsZWN0aW9uIixmdW5jdGlvbigpe3RoaXMuY3VyT3B8fCh0aGlzLnN0YXJ0T3BlcmF0aW9uKCksdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy4kbGFzdFNlbCksdGhpcy5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkPSEwfS5iaW5kKHRoaXMpLCEwKX0sdGhpcy5jdXJPcD1udWxsLHRoaXMucHJldk9wPXt9LHRoaXMuc3RhcnRPcGVyYXRpb249ZnVuY3Rpb24oZSl7aWYodGhpcy5jdXJPcCl7aWYoIWV8fHRoaXMuY3VyT3AuY29tbWFuZClyZXR1cm47dGhpcy5wcmV2T3A9dGhpcy5jdXJPcH1lfHwodGhpcy5wcmV2aW91c0NvbW1hbmQ9bnVsbCxlPXt9KSx0aGlzLiRvcFJlc2V0VGltZXIuc2NoZWR1bGUoKSx0aGlzLmN1ck9wPXRoaXMuc2Vzc2lvbi5jdXJPcD17Y29tbWFuZDplLmNvbW1hbmR8fHt9LGFyZ3M6ZS5hcmdzLHNjcm9sbFRvcDp0aGlzLnJlbmRlcmVyLnNjcm9sbFRvcH0sdGhpcy5jdXJPcC5zZWxlY3Rpb25CZWZvcmU9dGhpcy5zZWxlY3Rpb24udG9KU09OKCl9LHRoaXMuZW5kT3BlcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKHRoaXMuY3VyT3Ape2lmKGUmJmUucmV0dXJuVmFsdWU9PT0hMSlyZXR1cm4gdGhpcy5jdXJPcD1udWxsO2lmKGU9PTEmJnRoaXMuY3VyT3AuY29tbWFuZCYmdGhpcy5jdXJPcC5jb21tYW5kLm5hbWU9PSJtb3VzZSIpcmV0dXJuO3RoaXMuX3NpZ25hbCgiYmVmb3JlRW5kT3BlcmF0aW9uIik7aWYoIXRoaXMuY3VyT3ApcmV0dXJuO3ZhciB0PXRoaXMuY3VyT3AuY29tbWFuZCxuPXQmJnQuc2Nyb2xsSW50b1ZpZXc7aWYobil7c3dpdGNoKG4pe2Nhc2UiY2VudGVyLWFuaW1hdGUiOm49ImFuaW1hdGUiO2Nhc2UiY2VudGVyIjp0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpO2JyZWFrO2Nhc2UiYW5pbWF0ZSI6Y2FzZSJjdXJzb3IiOnRoaXMucmVuZGVyZXIuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoKTticmVhaztjYXNlInNlbGVjdGlvblBhcnQiOnZhciByPXRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCksaT10aGlzLnJlbmRlcmVyLmxheWVyQ29uZmlnOyhyLnN0YXJ0LnJvdz49aS5sYXN0Um93fHxyLmVuZC5yb3c8PWkuZmlyc3RSb3cpJiZ0aGlzLnJlbmRlcmVyLnNjcm9sbFNlbGVjdGlvbkludG9WaWV3KHRoaXMuc2VsZWN0aW9uLmFuY2hvcix0aGlzLnNlbGVjdGlvbi5sZWFkKTticmVhaztkZWZhdWx0On1uPT0iYW5pbWF0ZSImJnRoaXMucmVuZGVyZXIuYW5pbWF0ZVNjcm9sbGluZyh0aGlzLmN1ck9wLnNjcm9sbFRvcCl9dmFyIHM9dGhpcy5zZWxlY3Rpb24udG9KU09OKCk7dGhpcy5jdXJPcC5zZWxlY3Rpb25BZnRlcj1zLHRoaXMuJGxhc3RTZWw9dGhpcy5zZWxlY3Rpb24udG9KU09OKCksdGhpcy5zZXNzaW9uLmdldFVuZG9NYW5hZ2VyKCkuYWRkU2VsZWN0aW9uKHMpLHRoaXMucHJldk9wPXRoaXMuY3VyT3AsdGhpcy5jdXJPcD1udWxsfX0sdGhpcy4kbWVyZ2VhYmxlQ29tbWFuZHM9WyJiYWNrc3BhY2UiLCJkZWwiLCJpbnNlcnRzdHJpbmciXSx0aGlzLiRoaXN0b3J5VHJhY2tlcj1mdW5jdGlvbihlKXtpZighdGhpcy4kbWVyZ2VVbmRvRGVsdGFzKXJldHVybjt2YXIgdD10aGlzLnByZXZPcCxuPXRoaXMuJG1lcmdlYWJsZUNvbW1hbmRzLHI9dC5jb21tYW5kJiZlLmNvbW1hbmQubmFtZT09dC5jb21tYW5kLm5hbWU7aWYoZS5jb21tYW5kLm5hbWU9PSJpbnNlcnRzdHJpbmciKXt2YXIgaT1lLmFyZ3M7dGhpcy5tZXJnZU5leHRDb21tYW5kPT09dW5kZWZpbmVkJiYodGhpcy5tZXJnZU5leHRDb21tYW5kPSEwKSxyPXImJnRoaXMubWVyZ2VOZXh0Q29tbWFuZCYmKCEvXHMvLnRlc3QoaSl8fC9ccy8udGVzdCh0LmFyZ3MpKSx0aGlzLm1lcmdlTmV4dENvbW1hbmQ9ITB9ZWxzZSByPXImJm4uaW5kZXhPZihlLmNvbW1hbmQubmFtZSkhPT0tMTt0aGlzLiRtZXJnZVVuZG9EZWx0YXMhPSJhbHdheXMiJiZEYXRlLm5vdygpLXRoaXMuc2VxdWVuY2VTdGFydFRpbWU+MmUzJiYocj0hMSkscj90aGlzLnNlc3Npb24ubWVyZ2VVbmRvRGVsdGFzPSEwOm4uaW5kZXhPZihlLmNvbW1hbmQubmFtZSkhPT0tMSYmKHRoaXMuc2VxdWVuY2VTdGFydFRpbWU9RGF0ZS5ub3coKSl9LHRoaXMuc2V0S2V5Ym9hcmRIYW5kbGVyPWZ1bmN0aW9uKGUsdCl7aWYoZSYmdHlwZW9mIGU9PSJzdHJpbmciJiZlIT0iYWNlIil7dGhpcy4ka2V5YmluZGluZ0lkPWU7dmFyIG49dGhpcztnLmxvYWRNb2R1bGUoWyJrZXliaW5kaW5nIixlXSxmdW5jdGlvbihyKXtuLiRrZXliaW5kaW5nSWQ9PWUmJm4ua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIociYmci5oYW5kbGVyKSx0JiZ0KCl9KX1lbHNlIHRoaXMuJGtleWJpbmRpbmdJZD1udWxsLHRoaXMua2V5QmluZGluZy5zZXRLZXlib2FyZEhhbmRsZXIoZSksdCYmdCgpfSx0aGlzLmdldEtleWJvYXJkSGFuZGxlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmtleUJpbmRpbmcuZ2V0S2V5Ym9hcmRIYW5kbGVyKCl9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXtpZih0aGlzLnNlc3Npb249PWUpcmV0dXJuO3RoaXMuY3VyT3AmJnRoaXMuZW5kT3BlcmF0aW9uKCksdGhpcy5jdXJPcD17fTt2YXIgdD10aGlzLnNlc3Npb247aWYodCl7dGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlIix0aGlzLiRvbkRvY3VtZW50Q2hhbmdlKSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuc2Vzc2lvbi5vZmYoInRva2VuaXplclVwZGF0ZSIsdGhpcy4kb25Ub2tlbml6ZXJVcGRhdGUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVRhYlNpemUiLHRoaXMuJG9uQ2hhbmdlVGFiU2l6ZSksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlV3JhcExpbWl0Iix0aGlzLiRvbkNoYW5nZVdyYXBMaW1pdCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlV3JhcE1vZGUiLHRoaXMuJG9uQ2hhbmdlV3JhcE1vZGUpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUZvbGQiLHRoaXMuJG9uQ2hhbmdlRm9sZCksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlRnJvbnRNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXIpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZUJhY2tNYXJrZXIiLHRoaXMuJG9uQ2hhbmdlQmFja01hcmtlciksdGhpcy5zZXNzaW9uLm9mZigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLnNlc3Npb24ub2ZmKCJjaGFuZ2VBbm5vdGF0aW9uIix0aGlzLiRvbkNoYW5nZUFubm90YXRpb24pLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZU92ZXJ3cml0ZSIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVNjcm9sbFRvcCIsdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vZmYoImNoYW5nZVNjcm9sbExlZnQiLHRoaXMuJG9uU2Nyb2xsTGVmdENoYW5nZSk7dmFyIG49dGhpcy5zZXNzaW9uLmdldFNlbGVjdGlvbigpO24ub2ZmKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKSxuLm9mZigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSl9dGhpcy5zZXNzaW9uPWUsZT8odGhpcy4kb25Eb2N1bWVudENoYW5nZT10aGlzLm9uRG9jdW1lbnRDaGFuZ2UuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2UiLHRoaXMuJG9uRG9jdW1lbnRDaGFuZ2UpLHRoaXMucmVuZGVyZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiRvbkNoYW5nZU1vZGU9dGhpcy5vbkNoYW5nZU1vZGUuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VNb2RlIix0aGlzLiRvbkNoYW5nZU1vZGUpLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlPXRoaXMub25Ub2tlbml6ZXJVcGRhdGUuYmluZCh0aGlzKSxlLm9uKCJ0b2tlbml6ZXJVcGRhdGUiLHRoaXMuJG9uVG9rZW5pemVyVXBkYXRlKSx0aGlzLiRvbkNoYW5nZVRhYlNpemU9dGhpcy5yZW5kZXJlci5vbkNoYW5nZVRhYlNpemUuYmluZCh0aGlzLnJlbmRlcmVyKSxlLm9uKCJjaGFuZ2VUYWJTaXplIix0aGlzLiRvbkNoYW5nZVRhYlNpemUpLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0PXRoaXMub25DaGFuZ2VXcmFwTGltaXQuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VXcmFwTGltaXQiLHRoaXMuJG9uQ2hhbmdlV3JhcExpbWl0KSx0aGlzLiRvbkNoYW5nZVdyYXBNb2RlPXRoaXMub25DaGFuZ2VXcmFwTW9kZS5iaW5kKHRoaXMpLGUub24oImNoYW5nZVdyYXBNb2RlIix0aGlzLiRvbkNoYW5nZVdyYXBNb2RlKSx0aGlzLiRvbkNoYW5nZUZvbGQ9dGhpcy5vbkNoYW5nZUZvbGQuYmluZCh0aGlzKSxlLm9uKCJjaGFuZ2VGb2xkIix0aGlzLiRvbkNoYW5nZUZvbGQpLHRoaXMuJG9uQ2hhbmdlRnJvbnRNYXJrZXI9dGhpcy5vbkNoYW5nZUZyb250TWFya2VyLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VGcm9udE1hcmtlciIsdGhpcy4kb25DaGFuZ2VGcm9udE1hcmtlciksdGhpcy4kb25DaGFuZ2VCYWNrTWFya2VyPXRoaXMub25DaGFuZ2VCYWNrTWFya2VyLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VCYWNrTWFya2VyIix0aGlzLiRvbkNoYW5nZUJhY2tNYXJrZXIpLHRoaXMuJG9uQ2hhbmdlQnJlYWtwb2ludD10aGlzLm9uQ2hhbmdlQnJlYWtwb2ludC5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlQnJlYWtwb2ludCIsdGhpcy4kb25DaGFuZ2VCcmVha3BvaW50KSx0aGlzLiRvbkNoYW5nZUFubm90YXRpb249dGhpcy5vbkNoYW5nZUFubm90YXRpb24uYmluZCh0aGlzKSx0aGlzLnNlc3Npb24ub24oImNoYW5nZUFubm90YXRpb24iLHRoaXMuJG9uQ2hhbmdlQW5ub3RhdGlvbiksdGhpcy4kb25DdXJzb3JDaGFuZ2U9dGhpcy5vbkN1cnNvckNoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlT3ZlcndyaXRlIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy4kb25TY3JvbGxUb3BDaGFuZ2U9dGhpcy5vblNjcm9sbFRvcENoYW5nZS5iaW5kKHRoaXMpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlU2Nyb2xsVG9wIix0aGlzLiRvblNjcm9sbFRvcENoYW5nZSksdGhpcy4kb25TY3JvbGxMZWZ0Q2hhbmdlPXRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2VTY3JvbGxMZWZ0Iix0aGlzLiRvblNjcm9sbExlZnRDaGFuZ2UpLHRoaXMuc2VsZWN0aW9uPWUuZ2V0U2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ub24oImNoYW5nZUN1cnNvciIsdGhpcy4kb25DdXJzb3JDaGFuZ2UpLHRoaXMuJG9uU2VsZWN0aW9uQ2hhbmdlPXRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSx0aGlzLnNlbGVjdGlvbi5vbigiY2hhbmdlU2VsZWN0aW9uIix0aGlzLiRvblNlbGVjdGlvbkNoYW5nZSksdGhpcy5vbkNoYW5nZU1vZGUoKSx0aGlzLm9uQ3Vyc29yQ2hhbmdlKCksdGhpcy5vblNjcm9sbFRvcENoYW5nZSgpLHRoaXMub25TY3JvbGxMZWZ0Q2hhbmdlKCksdGhpcy5vblNlbGVjdGlvbkNoYW5nZSgpLHRoaXMub25DaGFuZ2VGcm9udE1hcmtlcigpLHRoaXMub25DaGFuZ2VCYWNrTWFya2VyKCksdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQoKSx0aGlzLm9uQ2hhbmdlQW5ub3RhdGlvbigpLHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpJiZ0aGlzLnJlbmRlcmVyLmFkanVzdFdyYXBMaW1pdCgpLHRoaXMucmVuZGVyZXIudXBkYXRlRnVsbCgpKToodGhpcy5zZWxlY3Rpb249bnVsbCx0aGlzLnJlbmRlcmVyLnNldFNlc3Npb24oZSkpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2Vzc2lvbiIse3Nlc3Npb246ZSxvbGRTZXNzaW9uOnR9KSx0aGlzLmN1ck9wPW51bGwsdCYmdC5fc2lnbmFsKCJjaGFuZ2VFZGl0b3IiLHtvbGRFZGl0b3I6dGhpc30pLGUmJmUuX3NpZ25hbCgiY2hhbmdlRWRpdG9yIix7ZWRpdG9yOnRoaXN9KSxlJiZlLmJnVG9rZW5pemVyJiZlLmJnVG9rZW5pemVyLnNjaGVkdWxlU3RhcnQoKX0sdGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbn0sdGhpcy5zZXRWYWx1ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnNlc3Npb24uZG9jLnNldFZhbHVlKGUpLHQ/dD09MT90aGlzLm5hdmlnYXRlRmlsZUVuZCgpOnQ9PS0xJiZ0aGlzLm5hdmlnYXRlRmlsZVN0YXJ0KCk6dGhpcy5zZWxlY3RBbGwoKSxlfSx0aGlzLmdldFZhbHVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRWYWx1ZSgpfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbn0sdGhpcy5yZXNpemU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5vblJlc2l6ZShlKX0sdGhpcy5zZXRUaGVtZT1mdW5jdGlvbihlLHQpe3RoaXMucmVuZGVyZXIuc2V0VGhlbWUoZSx0KX0sdGhpcy5nZXRUaGVtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFRoZW1lKCl9LHRoaXMuc2V0U3R5bGU9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTdHlsZShlKX0sdGhpcy51bnNldFN0eWxlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIudW5zZXRTdHlsZShlKX0sdGhpcy5nZXRGb250U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZm9udFNpemUiKXx8aS5jb21wdXRlZFN0eWxlKHRoaXMuY29udGFpbmVyKS5mb250U2l6ZX0sdGhpcy5zZXRGb250U2l6ZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZm9udFNpemUiLGUpfSx0aGlzLiRoaWdobGlnaHRCcmFja2V0cz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi4kYnJhY2tldEhpZ2hsaWdodCYmKHRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy5zZXNzaW9uLiRicmFja2V0SGlnaGxpZ2h0KSx0aGlzLnNlc3Npb24uJGJyYWNrZXRIaWdobGlnaHQ9bnVsbCk7aWYodGhpcy4kaGlnaGxpZ2h0UGVuZGluZylyZXR1cm47dmFyIGU9dGhpczt0aGlzLiRoaWdobGlnaHRQZW5kaW5nPSEwLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLiRoaWdobGlnaHRQZW5kaW5nPSExO3ZhciB0PWUuc2Vzc2lvbjtpZighdHx8IXQuYmdUb2tlbml6ZXIpcmV0dXJuO3ZhciBuPXQuZmluZE1hdGNoaW5nQnJhY2tldChlLmdldEN1cnNvclBvc2l0aW9uKCkpO2lmKG4pdmFyIHI9bmV3IHAobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rMSk7ZWxzZSBpZih0LiRtb2RlLmdldE1hdGNoaW5nKXZhciByPXQuJG1vZGUuZ2V0TWF0Y2hpbmcoZS5zZXNzaW9uKTtyJiYodC4kYnJhY2tldEhpZ2hsaWdodD10LmFkZE1hcmtlcihyLCJhY2VfYnJhY2tldCIsInRleHQiKSl9LDUwKX0sdGhpcy4kaGlnaGxpZ2h0VGFncz1mdW5jdGlvbigpe2lmKHRoaXMuJGhpZ2hsaWdodFRhZ1BlbmRpbmcpcmV0dXJuO3ZhciBlPXRoaXM7dGhpcy4kaGlnaGxpZ2h0VGFnUGVuZGluZz0hMCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS4kaGlnaGxpZ2h0VGFnUGVuZGluZz0hMTt2YXIgdD1lLnNlc3Npb247aWYoIXR8fCF0LmJnVG9rZW5pemVyKXJldHVybjt2YXIgbj1lLmdldEN1cnNvclBvc2l0aW9uKCkscj1uZXcgeShlLnNlc3Npb24sbi5yb3csbi5jb2x1bW4pLGk9ci5nZXRDdXJyZW50VG9rZW4oKTtpZighaXx8IS9cYig/OnRhZy1vcGVufHRhZy1uYW1lKS8udGVzdChpLnR5cGUpKXt0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsO3JldHVybn1pZihpLnR5cGUuaW5kZXhPZigidGFnLW9wZW4iKSE9LTEpe2k9ci5zdGVwRm9yd2FyZCgpO2lmKCFpKXJldHVybn12YXIgcz1pLnZhbHVlLG89MCx1PXIuc3RlcEJhY2t3YXJkKCk7aWYodS52YWx1ZT09IjwiKXtkbyB1PWksaT1yLnN0ZXBGb3J3YXJkKCksaSYmaS52YWx1ZT09PXMmJmkudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJih1LnZhbHVlPT09IjwiP28rKzp1LnZhbHVlPT09IjwvIiYmby0tKTt3aGlsZShpJiZvPj0wKX1lbHNle2RvIGk9dSx1PXIuc3RlcEJhY2t3YXJkKCksaSYmaS52YWx1ZT09PXMmJmkudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJih1LnZhbHVlPT09IjwiP28rKzp1LnZhbHVlPT09IjwvIiYmby0tKTt3aGlsZSh1JiZvPD0wKTtyLnN0ZXBGb3J3YXJkKCl9aWYoIWkpe3QucmVtb3ZlTWFya2VyKHQuJHRhZ0hpZ2hsaWdodCksdC4kdGFnSGlnaGxpZ2h0PW51bGw7cmV0dXJufXZhciBhPXIuZ2V0Q3VycmVudFRva2VuUm93KCksZj1yLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpLGw9bmV3IHAoYSxmLGEsZitpLnZhbHVlLmxlbmd0aCksYz10LiRiYWNrTWFya2Vyc1t0LiR0YWdIaWdobGlnaHRdO3QuJHRhZ0hpZ2hsaWdodCYmYyE9dW5kZWZpbmVkJiZsLmNvbXBhcmVSYW5nZShjLnJhbmdlKSE9PTAmJih0LnJlbW92ZU1hcmtlcih0LiR0YWdIaWdobGlnaHQpLHQuJHRhZ0hpZ2hsaWdodD1udWxsKSx0LiR0YWdIaWdobGlnaHR8fCh0LiR0YWdIaWdobGlnaHQ9dC5hZGRNYXJrZXIobCwiYWNlX2JyYWNrZXQiLCJ0ZXh0IikpfSw1MCl9LHRoaXMuZm9jdXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLmlzRm9jdXNlZCgpfHxlLnRleHRJbnB1dC5mb2N1cygpfSksdGhpcy50ZXh0SW5wdXQuZm9jdXMoKX0sdGhpcy5pc0ZvY3VzZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50ZXh0SW5wdXQuaXNGb2N1c2VkKCl9LHRoaXMuYmx1cj1mdW5jdGlvbigpe3RoaXMudGV4dElucHV0LmJsdXIoKX0sdGhpcy5vbkZvY3VzPWZ1bmN0aW9uKGUpe2lmKHRoaXMuJGlzRm9jdXNlZClyZXR1cm47dGhpcy4kaXNGb2N1c2VkPSEwLHRoaXMucmVuZGVyZXIuc2hvd0N1cnNvcigpLHRoaXMucmVuZGVyZXIudmlzdWFsaXplRm9jdXMoKSx0aGlzLl9lbWl0KCJmb2N1cyIsZSl9LHRoaXMub25CbHVyPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRpc0ZvY3VzZWQpcmV0dXJuO3RoaXMuJGlzRm9jdXNlZD0hMSx0aGlzLnJlbmRlcmVyLmhpZGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnZpc3VhbGl6ZUJsdXIoKSx0aGlzLl9lbWl0KCJibHVyIixlKX0sdGhpcy4kY3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKX0sdGhpcy5vbkRvY3VtZW50Q2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi4kdXNlV3JhcE1vZGUsbj1lLnN0YXJ0LnJvdz09ZS5lbmQucm93P2UuZW5kLnJvdzpJbmZpbml0eTt0aGlzLnJlbmRlcmVyLnVwZGF0ZUxpbmVzKGUuc3RhcnQucm93LG4sdCksdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLGUpLHRoaXMuJGN1cnNvckNoYW5nZSgpLHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKX0sdGhpcy5vblRva2VuaXplclVwZGF0ZT1mdW5jdGlvbihlKXt2YXIgdD1lLmRhdGE7dGhpcy5yZW5kZXJlci51cGRhdGVMaW5lcyh0LmZpcnN0LHQubGFzdCl9LHRoaXMub25TY3JvbGxUb3BDaGFuZ2U9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvWSh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkpfSx0aGlzLm9uU2Nyb2xsTGVmdENoYW5nZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIuc2Nyb2xsVG9YKHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkpfSx0aGlzLm9uQ3Vyc29yQ2hhbmdlPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yQ2hhbmdlKCksdGhpcy4kaGlnaGxpZ2h0QnJhY2tldHMoKSx0aGlzLiRoaWdobGlnaHRUYWdzKCksdGhpcy4kdXBkYXRlSGlnaGxpZ2h0QWN0aXZlTGluZSgpLHRoaXMuX3NpZ25hbCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlc3Npb24oKSx0O2lmKHRoaXMuJGhpZ2hsaWdodEFjdGl2ZUxpbmUpe2lmKHRoaXMuJHNlbGVjdGlvblN0eWxlIT0ibGluZSJ8fCF0aGlzLnNlbGVjdGlvbi5pc011bHRpTGluZSgpKXQ9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO3RoaXMucmVuZGVyZXIudGhlbWUmJnRoaXMucmVuZGVyZXIudGhlbWUuJHNlbGVjdGlvbkNvbG9yQ29uZmxpY3QmJiF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJih0PSExKSx0aGlzLnJlbmRlcmVyLiRtYXhMaW5lcyYmdGhpcy5zZXNzaW9uLmdldExlbmd0aCgpPT09MSYmISh0aGlzLnJlbmRlcmVyLiRtaW5MaW5lcz4xKSYmKHQ9ITEpfWlmKGUuJGhpZ2hsaWdodExpbmVNYXJrZXImJiF0KWUucmVtb3ZlTWFya2VyKGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuaWQpLGUuJGhpZ2hsaWdodExpbmVNYXJrZXI9bnVsbDtlbHNlIGlmKCFlLiRoaWdobGlnaHRMaW5lTWFya2VyJiZ0KXt2YXIgbj1uZXcgcCh0LnJvdyx0LmNvbHVtbix0LnJvdyxJbmZpbml0eSk7bi5pZD1lLmFkZE1hcmtlcihuLCJhY2VfYWN0aXZlLWxpbmUiLCJzY3JlZW5MaW5lIiksZS4kaGlnaGxpZ2h0TGluZU1hcmtlcj1ufWVsc2UgdCYmKGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuc3RhcnQucm93PXQucm93LGUuJGhpZ2hsaWdodExpbmVNYXJrZXIuZW5kLnJvdz10LnJvdyxlLiRoaWdobGlnaHRMaW5lTWFya2VyLnN0YXJ0LmNvbHVtbj10LmNvbHVtbixlLl9zaWduYWwoImNoYW5nZUJhY2tNYXJrZXIiKSl9LHRoaXMub25TZWxlY3Rpb25DaGFuZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uO3QuJHNlbGVjdGlvbk1hcmtlciYmdC5yZW1vdmVNYXJrZXIodC4kc2VsZWN0aW9uTWFya2VyKSx0LiRzZWxlY3Rpb25NYXJrZXI9bnVsbDtpZighdGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHI9dGhpcy5nZXRTZWxlY3Rpb25TdHlsZSgpO3QuJHNlbGVjdGlvbk1hcmtlcj10LmFkZE1hcmtlcihuLCJhY2Vfc2VsZWN0aW9uIixyKX1lbHNlIHRoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKTt2YXIgaT10aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmQmJnRoaXMuJGdldFNlbGVjdGlvbkhpZ2hMaWdodFJlZ2V4cCgpO3RoaXMuc2Vzc2lvbi5oaWdobGlnaHQoaSksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb24iKX0sdGhpcy4kZ2V0U2VsZWN0aW9uSGlnaExpZ2h0UmVnZXhwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuaXNFbXB0eSgpfHx0LmlzTXVsdGlMaW5lKCkpcmV0dXJuO3ZhciBuPXQuc3RhcnQuY29sdW1uLHI9dC5lbmQuY29sdW1uLGk9ZS5nZXRMaW5lKHQuc3RhcnQucm93KSxzPWkuc3Vic3RyaW5nKG4scik7aWYocy5sZW5ndGg+NWUzfHwhL1tcd1xkXS8udGVzdChzKSlyZXR1cm47dmFyIG89dGhpcy4kc2VhcmNoLiRhc3NlbWJsZVJlZ0V4cCh7d2hvbGVXb3JkOiEwLGNhc2VTZW5zaXRpdmU6ITAsbmVlZGxlOnN9KSx1PWkuc3Vic3RyaW5nKG4tMSxyKzEpO2lmKCFvLnRlc3QodSkpcmV0dXJuO3JldHVybiBvfSx0aGlzLm9uQ2hhbmdlRnJvbnRNYXJrZXI9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUZyb250TWFya2VycygpfSx0aGlzLm9uQ2hhbmdlQmFja01hcmtlcj1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy5vbkNoYW5nZUJyZWFrcG9pbnQ9ZnVuY3Rpb24oKXt0aGlzLnJlbmRlcmVyLnVwZGF0ZUJyZWFrcG9pbnRzKCl9LHRoaXMub25DaGFuZ2VBbm5vdGF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5zZXRBbm5vdGF0aW9ucyh0aGlzLnNlc3Npb24uZ2V0QW5ub3RhdGlvbnMoKSl9LHRoaXMub25DaGFuZ2VNb2RlPWZ1bmN0aW9uKGUpe3RoaXMucmVuZGVyZXIudXBkYXRlVGV4dCgpLHRoaXMuX2VtaXQoImNoYW5nZU1vZGUiLGUpfSx0aGlzLm9uQ2hhbmdlV3JhcExpbWl0PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVGdWxsKCl9LHRoaXMub25DaGFuZ2VXcmFwTW9kZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyZXIub25SZXNpemUoITApfSx0aGlzLm9uQ2hhbmdlRm9sZD1mdW5jdGlvbigpe3RoaXMuJHVwZGF0ZUhpZ2hsaWdodEFjdGl2ZUxpbmUoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5nZXRTZWxlY3RlZFRleHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpfSx0aGlzLmdldENvcHlUZXh0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRTZWxlY3RlZFRleHQoKSx0PXRoaXMuc2Vzc2lvbi5kb2MuZ2V0TmV3TGluZUNoYXJhY3RlcigpLG49ITE7aWYoIWUmJnRoaXMuJGNvcHlXaXRoRW1wdHlTZWxlY3Rpb24pe249ITA7dmFyIHI9dGhpcy5zZWxlY3Rpb24uZ2V0QWxsUmFuZ2VzKCk7Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspe3ZhciBzPXJbaV07aWYoaSYmcltpLTFdLnN0YXJ0LnJvdz09cy5zdGFydC5yb3cpY29udGludWU7ZSs9dGhpcy5zZXNzaW9uLmdldExpbmUocy5zdGFydC5yb3cpK3R9fXZhciBvPXt0ZXh0OmV9O3JldHVybiB0aGlzLl9zaWduYWwoImNvcHkiLG8pLGIubGluZU1vZGU9bj9vLnRleHQ6IiIsby50ZXh0fSx0aGlzLm9uQ29weT1mdW5jdGlvbigpe3RoaXMuY29tbWFuZHMuZXhlYygiY29weSIsdGhpcyl9LHRoaXMub25DdXQ9ZnVuY3Rpb24oKXt0aGlzLmNvbW1hbmRzLmV4ZWMoImN1dCIsdGhpcyl9LHRoaXMub25QYXN0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXt0ZXh0OmUsZXZlbnQ6dH07dGhpcy5jb21tYW5kcy5leGVjKCJwYXN0ZSIsdGhpcyxuKX0sdGhpcy4kaGFuZGxlUGFzdGU9ZnVuY3Rpb24oZSl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17dGV4dDplfSksdGhpcy5fc2lnbmFsKCJwYXN0ZSIsZSk7dmFyIHQ9ZS50ZXh0LG49dD09Yi5saW5lTW9kZSxyPXRoaXMuc2Vzc2lvbjtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKW4/ci5pbnNlcnQoe3Jvdzp0aGlzLnNlbGVjdGlvbi5sZWFkLnJvdyxjb2x1bW46MH0sdCk6dGhpcy5pbnNlcnQodCk7ZWxzZSBpZihuKXRoaXMuc2VsZWN0aW9uLnJhbmdlTGlzdC5yYW5nZXMuZm9yRWFjaChmdW5jdGlvbihlKXtyLmluc2VydCh7cm93OmUuc3RhcnQucm93LGNvbHVtbjowfSx0KX0pO2Vsc2V7dmFyIGk9dC5zcGxpdCgvXHJcbnxccnxcbi8pLHM9dGhpcy5zZWxlY3Rpb24ucmFuZ2VMaXN0LnJhbmdlcyxvPWkubGVuZ3RoPT0yJiYoIWlbMF18fCFpWzFdKTtpZihpLmxlbmd0aCE9cy5sZW5ndGh8fG8pcmV0dXJuIHRoaXMuY29tbWFuZHMuZXhlYygiaW5zZXJ0c3RyaW5nIix0aGlzLHQpO2Zvcih2YXIgdT1zLmxlbmd0aDt1LS07KXt2YXIgYT1zW3VdO2EuaXNFbXB0eSgpfHxyLnJlbW92ZShhKSxyLmluc2VydChhLnN0YXJ0LGlbdV0pfX19LHRoaXMuZXhlY0NvbW1hbmQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5jb21tYW5kcy5leGVjKGUsdGhpcyx0KX0sdGhpcy5pbnNlcnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24scj1uLmdldE1vZGUoKSxpPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkmJiF0KXt2YXIgcz1yLnRyYW5zZm9ybUFjdGlvbihuLmdldFN0YXRlKGkucm93KSwiaW5zZXJ0aW9uIix0aGlzLG4sZSk7cyYmKGUhPT1zLnRleHQmJih0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGV8fCh0aGlzLnNlc3Npb24ubWVyZ2VVbmRvRGVsdGFzPSExLHRoaXMubWVyZ2VOZXh0Q29tbWFuZD0hMSkpLGU9cy50ZXh0KX1lPT0iCSImJihlPXRoaXMuc2Vzc2lvbi5nZXRUYWJTdHJpbmcoKSk7aWYoIXRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSl7dmFyIG89dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2k9dGhpcy5zZXNzaW9uLnJlbW92ZShvKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9ZWxzZSBpZih0aGlzLnNlc3Npb24uZ2V0T3ZlcndyaXRlKCkmJmUuaW5kZXhPZigiXG4iKT09LTEpe3ZhciBvPW5ldyBwLmZyb21Qb2ludHMoaSxpKTtvLmVuZC5jb2x1bW4rPWUubGVuZ3RoLHRoaXMuc2Vzc2lvbi5yZW1vdmUobyl9aWYoZT09IlxuInx8ZT09IlxyXG4iKXt2YXIgdT1uLmdldExpbmUoaS5yb3cpO2lmKGkuY29sdW1uPnUuc2VhcmNoKC9cU3wkLykpe3ZhciBhPXUuc3Vic3RyKGkuY29sdW1uKS5zZWFyY2goL1xTfCQvKTtuLmRvYy5yZW1vdmVJbkxpbmUoaS5yb3csaS5jb2x1bW4saS5jb2x1bW4rYSl9fXRoaXMuY2xlYXJTZWxlY3Rpb24oKTt2YXIgZj1pLmNvbHVtbixsPW4uZ2V0U3RhdGUoaS5yb3cpLHU9bi5nZXRMaW5lKGkucm93KSxjPXIuY2hlY2tPdXRkZW50KGwsdSxlKTtuLmluc2VydChpLGUpLHMmJnMuc2VsZWN0aW9uJiYocy5zZWxlY3Rpb24ubGVuZ3RoPT0yP3RoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG5ldyBwKGkucm93LGYrcy5zZWxlY3Rpb25bMF0saS5yb3csZitzLnNlbGVjdGlvblsxXSkpOnRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKG5ldyBwKGkucm93K3Muc2VsZWN0aW9uWzBdLHMuc2VsZWN0aW9uWzFdLGkucm93K3Muc2VsZWN0aW9uWzJdLHMuc2VsZWN0aW9uWzNdKSkpO2lmKG4uZ2V0RG9jdW1lbnQoKS5pc05ld0xpbmUoZSkpe3ZhciBoPXIuZ2V0TmV4dExpbmVJbmRlbnQobCx1LnNsaWNlKDAsaS5jb2x1bW4pLG4uZ2V0VGFiU3RyaW5nKCkpO24uaW5zZXJ0KHtyb3c6aS5yb3crMSxjb2x1bW46MH0saCl9YyYmci5hdXRvT3V0ZGVudChsLG4saS5yb3cpfSx0aGlzLm9uVGV4dElucHV0PWZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuIHRoaXMua2V5QmluZGluZy5vblRleHRJbnB1dChlKTt0aGlzLnN0YXJ0T3BlcmF0aW9uKHtjb21tYW5kOntuYW1lOiJpbnNlcnRzdHJpbmcifX0pO3ZhciBuPXRoaXMuYXBwbHlDb21wb3NpdGlvbi5iaW5kKHRoaXMsZSx0KTt0aGlzLnNlbGVjdGlvbi5yYW5nZUNvdW50P3RoaXMuZm9yRWFjaFNlbGVjdGlvbihuKTpuKCksdGhpcy5lbmRPcGVyYXRpb24oKX0sdGhpcy5hcHBseUNvbXBvc2l0aW9uPWZ1bmN0aW9uKGUsdCl7aWYodC5leHRlbmRMZWZ0fHx0LmV4dGVuZFJpZ2h0KXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO24uc3RhcnQuY29sdW1uLT10LmV4dGVuZExlZnQsbi5lbmQuY29sdW1uKz10LmV4dGVuZFJpZ2h0LHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG4pLCFlJiYhbi5pc0VtcHR5KCkmJnRoaXMucmVtb3ZlKCl9KGV8fCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpJiZ0aGlzLmluc2VydChlLCEwKTtpZih0LnJlc3RvcmVTdGFydHx8dC5yZXN0b3JlRW5kKXt2YXIgbj10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO24uc3RhcnQuY29sdW1uLT10LnJlc3RvcmVTdGFydCxuLmVuZC5jb2x1bW4tPXQucmVzdG9yZUVuZCx0aGlzLnNlbGVjdGlvbi5zZXRSYW5nZShuKX19LHRoaXMub25Db21tYW5kS2V5PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5rZXlCaW5kaW5nLm9uQ29tbWFuZEtleShlLHQsbil9LHRoaXMuc2V0T3ZlcndyaXRlPWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRPdmVyd3JpdGUoZSl9LHRoaXMuZ2V0T3ZlcndyaXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRPdmVyd3JpdGUoKX0sdGhpcy50b2dnbGVPdmVyd3JpdGU9ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24udG9nZ2xlT3ZlcndyaXRlKCl9LHRoaXMuc2V0U2Nyb2xsU3BlZWQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInNjcm9sbFNwZWVkIixlKX0sdGhpcy5nZXRTY3JvbGxTcGVlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2Nyb2xsU3BlZWQiKX0sdGhpcy5zZXREcmFnRGVsYXk9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImRyYWdEZWxheSIsZSl9LHRoaXMuZ2V0RHJhZ0RlbGF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJkcmFnRGVsYXkiKX0sdGhpcy5zZXRTZWxlY3Rpb25TdHlsZT1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2VsZWN0aW9uU3R5bGUiLGUpfSx0aGlzLmdldFNlbGVjdGlvblN0eWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzZWxlY3Rpb25TdHlsZSIpfSx0aGlzLnNldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEFjdGl2ZUxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEFjdGl2ZUxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEFjdGl2ZUxpbmUiKX0sdGhpcy5zZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIixlKX0sdGhpcy5nZXRIaWdobGlnaHRHdXR0ZXJMaW5lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJoaWdobGlnaHRHdXR0ZXJMaW5lIil9LHRoaXMuc2V0SGlnaGxpZ2h0U2VsZWN0ZWRXb3JkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoaWdobGlnaHRTZWxlY3RlZFdvcmQiLGUpfSx0aGlzLmdldEhpZ2hsaWdodFNlbGVjdGVkV29yZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRoaWdobGlnaHRTZWxlY3RlZFdvcmR9LHRoaXMuc2V0QW5pbWF0ZWRTY3JvbGw9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRBbmltYXRlZFNjcm9sbChlKX0sdGhpcy5nZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldEFuaW1hdGVkU2Nyb2xsKCl9LHRoaXMuc2V0U2hvd0ludmlzaWJsZXM9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTaG93SW52aXNpYmxlcyhlKX0sdGhpcy5nZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNob3dJbnZpc2libGVzKCl9LHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldERpc3BsYXlJbmRlbnRHdWlkZXMoZSl9LHRoaXMuZ2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldERpc3BsYXlJbmRlbnRHdWlkZXMoKX0sdGhpcy5zZXRTaG93UHJpbnRNYXJnaW49ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRTaG93UHJpbnRNYXJnaW4oZSl9LHRoaXMuZ2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVuZGVyZXIuZ2V0U2hvd1ByaW50TWFyZ2luKCl9LHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zZXRQcmludE1hcmdpbkNvbHVtbihlKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFByaW50TWFyZ2luQ29sdW1uKCl9LHRoaXMuc2V0UmVhZE9ubHk9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInJlYWRPbmx5IixlKX0sdGhpcy5nZXRSZWFkT25seT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigicmVhZE9ubHkiKX0sdGhpcy5zZXRCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiYmVoYXZpb3Vyc0VuYWJsZWQiLGUpfSx0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJiZWhhdmlvdXJzRW5hYmxlZCIpfSx0aGlzLnNldFdyYXBCZWhhdmlvdXJzRW5hYmxlZD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigid3JhcEJlaGF2aW91cnNFbmFibGVkIixlKX0sdGhpcy5nZXRXcmFwQmVoYXZpb3Vyc0VuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oIndyYXBCZWhhdmlvdXJzRW5hYmxlZCIpfSx0aGlzLnNldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigic2hvd0ZvbGRXaWRnZXRzIixlKX0sdGhpcy5nZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oInNob3dGb2xkV2lkZ2V0cyIpfSx0aGlzLnNldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIixlKX0sdGhpcy5nZXRGYWRlRm9sZFdpZGdldHM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImZhZGVGb2xkV2lkZ2V0cyIpfSx0aGlzLnJlbW92ZT1mdW5jdGlvbihlKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJihlPT0ibGVmdCI/dGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCgpOnRoaXMuc2VsZWN0aW9uLnNlbGVjdFJpZ2h0KCkpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKTtpZih0aGlzLmdldEJlaGF2aW91cnNFbmFibGVkKCkpe3ZhciBuPXRoaXMuc2Vzc2lvbixyPW4uZ2V0U3RhdGUodC5zdGFydC5yb3cpLGk9bi5nZXRNb2RlKCkudHJhbnNmb3JtQWN0aW9uKHIsImRlbGV0aW9uIix0aGlzLG4sdCk7aWYodC5lbmQuY29sdW1uPT09MCl7dmFyIHM9bi5nZXRUZXh0UmFuZ2UodCk7aWYoc1tzLmxlbmd0aC0xXT09IlxuIil7dmFyIG89bi5nZXRMaW5lKHQuZW5kLnJvdyk7L15ccyskLy50ZXN0KG8pJiYodC5lbmQuY29sdW1uPW8ubGVuZ3RoKX19aSYmKHQ9aSl9dGhpcy5zZXNzaW9uLnJlbW92ZSh0KSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlV29yZFJpZ2h0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkUmlnaHQoKSx0aGlzLnNlc3Npb24ucmVtb3ZlKHRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKSksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLnJlbW92ZVdvcmRMZWZ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkTGVmdCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lU3RhcnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkmJnRoaXMuc2VsZWN0aW9uLnNlbGVjdExpbmVTdGFydCgpLHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKSYmdGhpcy5zZWxlY3Rpb24uc2VsZWN0TGVmdCgpLHRoaXMuc2Vzc2lvbi5yZW1vdmUodGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVtb3ZlVG9MaW5lRW5kPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RMaW5lRW5kKCk7dmFyIGU9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2Uuc3RhcnQuY29sdW1uPT1lLmVuZC5jb2x1bW4mJmUuc3RhcnQucm93PT1lLmVuZC5yb3cmJihlLmVuZC5jb2x1bW49MCxlLmVuZC5yb3crKyksdGhpcy5zZXNzaW9uLnJlbW92ZShlKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMuc3BsaXRMaW5lPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpfHwodGhpcy5zZXNzaW9uLnJlbW92ZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKSk7dmFyIGU9dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpO3RoaXMuaW5zZXJ0KCJcbiIpLHRoaXMubW92ZUN1cnNvclRvUG9zaXRpb24oZSl9LHRoaXMudHJhbnNwb3NlTGV0dGVycz1mdW5jdGlvbigpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpcmV0dXJuO3ZhciBlPXRoaXMuZ2V0Q3Vyc29yUG9zaXRpb24oKSx0PWUuY29sdW1uO2lmKHQ9PT0wKXJldHVybjt2YXIgbj10aGlzLnNlc3Npb24uZ2V0TGluZShlLnJvdykscixpO3Q8bi5sZW5ndGg/KHI9bi5jaGFyQXQodCkrbi5jaGFyQXQodC0xKSxpPW5ldyBwKGUucm93LHQtMSxlLnJvdyx0KzEpKToocj1uLmNoYXJBdCh0LTEpK24uY2hhckF0KHQtMiksaT1uZXcgcChlLnJvdyx0LTIsZS5yb3csdCkpLHRoaXMuc2Vzc2lvbi5yZXBsYWNlKGksciksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5tb3ZlVG9Qb3NpdGlvbihpLmVuZCl9LHRoaXMudG9Mb3dlckNhc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0KTt0aGlzLnNlc3Npb24ucmVwbGFjZSh0LG4udG9Mb3dlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSl9LHRoaXMudG9VcHBlckNhc2U9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpJiZ0aGlzLnNlbGVjdGlvbi5zZWxlY3RXb3JkKCk7dmFyIHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpLG49dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0KTt0aGlzLnNlc3Npb24ucmVwbGFjZSh0LG4udG9VcHBlckNhc2UoKSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UoZSl9LHRoaXMuaW5kZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO2lmKHQuc3RhcnQucm93PHQuZW5kLnJvdyl7dmFyIG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7ZS5pbmRlbnRSb3dzKG4uZmlyc3Qsbi5sYXN0LCIJIik7cmV0dXJufWlmKHQuc3RhcnQuY29sdW1uPHQuZW5kLmNvbHVtbil7dmFyIHI9ZS5nZXRUZXh0UmFuZ2UodCk7aWYoIS9eXHMrJC8udGVzdChyKSl7dmFyIG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7ZS5pbmRlbnRSb3dzKG4uZmlyc3Qsbi5sYXN0LCIJIik7cmV0dXJufX12YXIgaT1lLmdldExpbmUodC5zdGFydC5yb3cpLG89dC5zdGFydCx1PWUuZ2V0VGFiU2l6ZSgpLGE9ZS5kb2N1bWVudFRvU2NyZWVuQ29sdW1uKG8ucm93LG8uY29sdW1uKTtpZih0aGlzLnNlc3Npb24uZ2V0VXNlU29mdFRhYnMoKSl2YXIgZj11LWEldSxsPXMuc3RyaW5nUmVwZWF0KCIgIixmKTtlbHNle3ZhciBmPWEldTt3aGlsZShpW3Quc3RhcnQuY29sdW1uLTFdPT0iICImJmYpdC5zdGFydC5jb2x1bW4tLSxmLS07dGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UodCksbD0iCSJ9cmV0dXJuIHRoaXMuaW5zZXJ0KGwpfSx0aGlzLmJsb2NrSW5kZW50PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCk7dGhpcy5zZXNzaW9uLmluZGVudFJvd3MoZS5maXJzdCxlLmxhc3QsIgkiKX0sdGhpcy5ibG9ja091dGRlbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlc3Npb24uZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXNzaW9uLm91dGRlbnRSb3dzKGUuZ2V0UmFuZ2UoKSl9LHRoaXMuc29ydExpbmVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKCksdD10aGlzLnNlc3Npb24sbj1bXTtmb3IodmFyIHI9ZS5maXJzdDtyPD1lLmxhc3Q7cisrKW4ucHVzaCh0LmdldExpbmUocikpO24uc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLnRvTG93ZXJDYXNlKCk8dC50b0xvd2VyQ2FzZSgpPy0xOmUudG9Mb3dlckNhc2UoKT50LnRvTG93ZXJDYXNlKCk/MTowfSk7dmFyIGk9bmV3IHAoMCwwLDAsMCk7Zm9yKHZhciByPWUuZmlyc3Q7cjw9ZS5sYXN0O3IrKyl7dmFyIHM9dC5nZXRMaW5lKHIpO2kuc3RhcnQucm93PXIsaS5lbmQucm93PXIsaS5lbmQuY29sdW1uPXMubGVuZ3RoLHQucmVwbGFjZShpLG5bci1lLmZpcnN0XSl9fSx0aGlzLnRvZ2dsZUNvbW1lbnRMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTdGF0ZSh0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkucm93KSx0PXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQ29tbWVudExpbmVzKGUsdGhpcy5zZXNzaW9uLHQuZmlyc3QsdC5sYXN0KX0sdGhpcy50b2dnbGVCbG9ja0NvbW1lbnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEN1cnNvclBvc2l0aW9uKCksdD10aGlzLnNlc3Npb24uZ2V0U3RhdGUoZS5yb3cpLG49dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpO3RoaXMuc2Vzc2lvbi5nZXRNb2RlKCkudG9nZ2xlQmxvY2tDb21tZW50KHQsdGhpcy5zZXNzaW9uLG4sZSl9LHRoaXMuZ2V0TnVtYmVyQXQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj0vW1wtXT9bMC05XSsoPzpcLlswLTldKyk/L2c7bi5sYXN0SW5kZXg9MDt2YXIgcj10aGlzLnNlc3Npb24uZ2V0TGluZShlKTt3aGlsZShuLmxhc3RJbmRleDx0KXt2YXIgaT1uLmV4ZWMocik7aWYoaS5pbmRleDw9dCYmaS5pbmRleCtpWzBdLmxlbmd0aD49dCl7dmFyIHM9e3ZhbHVlOmlbMF0sc3RhcnQ6aS5pbmRleCxlbmQ6aS5pbmRleCtpWzBdLmxlbmd0aH07cmV0dXJuIHN9fXJldHVybiBudWxsfSx0aGlzLm1vZGlmeU51bWJlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5yb3csbj10aGlzLnNlbGVjdGlvbi5nZXRDdXJzb3IoKS5jb2x1bW4scj1uZXcgcCh0LG4tMSx0LG4pLGk9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyKTtpZighaXNOYU4ocGFyc2VGbG9hdChpKSkmJmlzRmluaXRlKGkpKXt2YXIgcz10aGlzLmdldE51bWJlckF0KHQsbik7aWYocyl7dmFyIG89cy52YWx1ZS5pbmRleE9mKCIuIik+PTA/cy5zdGFydCtzLnZhbHVlLmluZGV4T2YoIi4iKSsxOnMuZW5kLHU9cy5zdGFydCtzLnZhbHVlLmxlbmd0aC1vLGE9cGFyc2VGbG9hdChzLnZhbHVlKTthKj1NYXRoLnBvdygxMCx1KSxvIT09cy5lbmQmJm48bz9lKj1NYXRoLnBvdygxMCxzLmVuZC1uLTEpOmUqPU1hdGgucG93KDEwLHMuZW5kLW4pLGErPWUsYS89TWF0aC5wb3coMTAsdSk7dmFyIGY9YS50b0ZpeGVkKHUpLGw9bmV3IHAodCxzLnN0YXJ0LHQscy5lbmQpO3RoaXMuc2Vzc2lvbi5yZXBsYWNlKGwsZiksdGhpcy5tb3ZlQ3Vyc29yVG8odCxNYXRoLm1heChzLnN0YXJ0KzEsbitmLmxlbmd0aC1zLnZhbHVlLmxlbmd0aCkpfX1lbHNlIHRoaXMudG9nZ2xlV29yZCgpfSx0aGlzLiR0b2dnbGVXb3JkUGFpcnM9W1siZmlyc3QiLCJsYXN0Il0sWyJ0cnVlIiwiZmFsc2UiXSxbInllcyIsIm5vIl0sWyJ3aWR0aCIsImhlaWdodCJdLFsidG9wIiwiYm90dG9tIl0sWyJyaWdodCIsImxlZnQiXSxbIm9uIiwib2ZmIl0sWyJ4IiwieSJdLFsiZ2V0Iiwic2V0Il0sWyJtYXgiLCJtaW4iXSxbImhvcml6b250YWwiLCJ2ZXJ0aWNhbCJdLFsic2hvdyIsImhpZGUiXSxbImFkZCIsInJlbW92ZSJdLFsidXAiLCJkb3duIl0sWyJiZWZvcmUiLCJhZnRlciJdLFsiZXZlbiIsIm9kZCJdLFsiaW5zaWRlIiwib3V0c2lkZSJdLFsibmV4dCIsInByZXZpb3VzIl0sWyJpbmNyZWFzZSIsImRlY3JlYXNlIl0sWyJhdHRhY2giLCJkZXRhY2giXSxbIiYmIiwifHwiXSxbIj09IiwiIT0iXV0sdGhpcy50b2dnbGVXb3JkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkucm93LHQ9dGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCkuY29sdW1uO3RoaXMuc2VsZWN0aW9uLnNlbGVjdFdvcmQoKTt2YXIgbj10aGlzLmdldFNlbGVjdGVkVGV4dCgpLHI9dGhpcy5zZWxlY3Rpb24uZ2V0V29yZFJhbmdlKCkuc3RhcnQuY29sdW1uLGk9bi5yZXBsYWNlKC8oW2Etel0rfFtBLVpdKykoPz1bQS1aX118JCkvZywiJDEgIikuc3BsaXQoL1xzLyksbz10LXItMTtvPDAmJihvPTApO3ZhciB1PTAsYT0wLGY9dGhpcztuLm1hdGNoKC9bQS1aYS16MC05X10rLykmJmkuZm9yRWFjaChmdW5jdGlvbih0LGkpe2E9dSt0Lmxlbmd0aCxvPj11JiZvPD1hJiYobj10LGYuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksZi5tb3ZlQ3Vyc29yVG8oZSx1K3IpLGYuc2VsZWN0aW9uLnNlbGVjdFRvKGUsYStyKSksdT1hfSk7dmFyIGw9dGhpcy4kdG9nZ2xlV29yZFBhaXJzLGM7Zm9yKHZhciBoPTA7aDxsLmxlbmd0aDtoKyspe3ZhciBwPWxbaF07Zm9yKHZhciBkPTA7ZDw9MTtkKyspe3ZhciB2PSshZCxtPW4ubWF0Y2gobmV3IFJlZ0V4cCgiXlxccz9fPygiK3MuZXNjYXBlUmVnRXhwKHBbZF0pKyIpXFxzPyQiLCJpIikpO2lmKG0pe3ZhciBnPW4ubWF0Y2gobmV3IFJlZ0V4cCgiKFtfXXxefFxccykoIitzLmVzY2FwZVJlZ0V4cChtWzFdKSsiKSgkfFxccykiLCJnIikpO2cmJihjPW4ucmVwbGFjZShuZXcgUmVnRXhwKHMuZXNjYXBlUmVnRXhwKHBbZF0pLCJpIiksZnVuY3Rpb24oZSl7dmFyIHQ9cFt2XTtyZXR1cm4gZS50b1VwcGVyQ2FzZSgpPT1lP3Q9dC50b1VwcGVyQ2FzZSgpOmUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCk9PWUuY2hhckF0KDApJiYodD10LnN1YnN0cigwLDApK3Bbdl0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHIoMSkpLHR9KSx0aGlzLmluc2VydChjKSxjPSIiKX19fX0sdGhpcy5yZW1vdmVMaW5lcz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGdldFNlbGVjdGVkUm93cygpO3RoaXMuc2Vzc2lvbi5yZW1vdmVGdWxsTGluZXMoZS5maXJzdCxlLmxhc3QpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5kdXBsaWNhdGVTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnNlbGVjdGlvbix0PXRoaXMuc2Vzc2lvbixuPWUuZ2V0UmFuZ2UoKSxyPWUuaXNCYWNrd2FyZHMoKTtpZihuLmlzRW1wdHkoKSl7dmFyIGk9bi5zdGFydC5yb3c7dC5kdXBsaWNhdGVMaW5lcyhpLGkpfWVsc2V7dmFyIHM9cj9uLnN0YXJ0Om4uZW5kLG89dC5pbnNlcnQocyx0LmdldFRleHRSYW5nZShuKSwhMSk7bi5zdGFydD1zLG4uZW5kPW8sZS5zZXRTZWxlY3Rpb25SYW5nZShuLHIpfX0sdGhpcy5tb3ZlTGluZXNEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKDEsITEpfSx0aGlzLm1vdmVMaW5lc1VwPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUxpbmVzKC0xLCExKX0sdGhpcy5tb3ZlVGV4dD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuc2Vzc2lvbi5tb3ZlVGV4dChlLHQsbil9LHRoaXMuY29weUxpbmVzVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoLTEsITApfSx0aGlzLmNvcHlMaW5lc0Rvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlTGluZXMoMSwhMCl9LHRoaXMuJG1vdmVMaW5lcz1mdW5jdGlvbihlLHQpe3ZhciBuLHIsaT10aGlzLnNlbGVjdGlvbjtpZighaS5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgcz1pLnRvT3JpZW50ZWRSYW5nZSgpO249dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKHMpLHI9dGhpcy5zZXNzaW9uLiRtb3ZlTGluZXMobi5maXJzdCxuLmxhc3QsdD8wOmUpLHQmJmU9PS0xJiYocj0wKSxzLm1vdmVCeShyLDApLGkuZnJvbU9yaWVudGVkUmFuZ2Uocyl9ZWxzZXt2YXIgbz1pLnJhbmdlTGlzdC5yYW5nZXM7aS5yYW5nZUxpc3QuZGV0YWNoKHRoaXMuc2Vzc2lvbiksdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwO3ZhciB1PTAsYT0wLGY9by5sZW5ndGg7Zm9yKHZhciBsPTA7bDxmO2wrKyl7dmFyIGM9bDtvW2xdLm1vdmVCeSh1LDApLG49dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKG9bbF0pO3ZhciBoPW4uZmlyc3QscD1uLmxhc3Q7d2hpbGUoKytsPGYpe2EmJm9bbF0ubW92ZUJ5KGEsMCk7dmFyIGQ9dGhpcy4kZ2V0U2VsZWN0ZWRSb3dzKG9bbF0pO2lmKHQmJmQuZmlyc3QhPXApYnJlYWs7aWYoIXQmJmQuZmlyc3Q+cCsxKWJyZWFrO3A9ZC5sYXN0fWwtLSx1PXRoaXMuc2Vzc2lvbi4kbW92ZUxpbmVzKGgscCx0PzA6ZSksdCYmZT09LTEmJihjPWwrMSk7d2hpbGUoYzw9bClvW2NdLm1vdmVCeSh1LDApLGMrKzt0fHwodT0wKSxhKz11fWkuZnJvbU9yaWVudGVkUmFuZ2UoaS5yYW5nZXNbMF0pLGkucmFuZ2VMaXN0LmF0dGFjaCh0aGlzLnNlc3Npb24pLHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMX19LHRoaXMuJGdldFNlbGVjdGVkUm93cz1mdW5jdGlvbihlKXtyZXR1cm4gZT0oZXx8dGhpcy5nZXRTZWxlY3Rpb25SYW5nZSgpKS5jb2xsYXBzZVJvd3MoKSx7Zmlyc3Q6dGhpcy5zZXNzaW9uLmdldFJvd0ZvbGRTdGFydChlLnN0YXJ0LnJvdyksbGFzdDp0aGlzLnNlc3Npb24uZ2V0Um93Rm9sZEVuZChlLmVuZC5yb3cpfX0sdGhpcy5vbkNvbXBvc2l0aW9uU3RhcnQ9ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci5zaG93Q29tcG9zaXRpb24oZSl9LHRoaXMub25Db21wb3NpdGlvblVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNldENvbXBvc2l0aW9uVGV4dChlKX0sdGhpcy5vbkNvbXBvc2l0aW9uRW5kPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5oaWRlQ29tcG9zaXRpb24oKX0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRGaXJzdFZpc2libGVSb3coKX0sdGhpcy5nZXRMYXN0VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dWaXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiBlPj10aGlzLmdldEZpcnN0VmlzaWJsZVJvdygpJiZlPD10aGlzLmdldExhc3RWaXNpYmxlUm93KCl9LHRoaXMuaXNSb3dGdWxseVZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMucmVuZGVyZXIuZ2V0Rmlyc3RGdWxseVZpc2libGVSb3coKSYmZTw9dGhpcy5yZW5kZXJlci5nZXRMYXN0RnVsbHlWaXNpYmxlUm93KCl9LHRoaXMuJGdldFZpc2libGVSb3dDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLmdldFNjcm9sbEJvdHRvbVJvdygpLXRoaXMucmVuZGVyZXIuZ2V0U2Nyb2xsVG9wUm93KCkrMX0sdGhpcy4kbW92ZUJ5UGFnZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMucmVuZGVyZXIscj10aGlzLnJlbmRlcmVyLmxheWVyQ29uZmlnLGk9ZSpNYXRoLmZsb29yKHIuaGVpZ2h0L3IubGluZUhlaWdodCk7dD09PSEwP3RoaXMuc2VsZWN0aW9uLiRtb3ZlU2VsZWN0aW9uKGZ1bmN0aW9uKCl7dGhpcy5tb3ZlQ3Vyc29yQnkoaSwwKX0pOnQ9PT0hMSYmKHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeShpLDApLHRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCkpO3ZhciBzPW4uc2Nyb2xsVG9wO24uc2Nyb2xsQnkoMCxpKnIubGluZUhlaWdodCksdCE9bnVsbCYmbi5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KSxuLmFuaW1hdGVTY3JvbGxpbmcocyl9LHRoaXMuc2VsZWN0UGFnZURvd249ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKDEsITApfSx0aGlzLnNlbGVjdFBhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEsITApfSx0aGlzLmdvdG9QYWdlRG93bj1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoMSwhMSl9LHRoaXMuZ290b1BhZ2VVcD1mdW5jdGlvbigpe3RoaXMuJG1vdmVCeVBhZ2UoLTEsITEpfSx0aGlzLnNjcm9sbFBhZ2VEb3duPWZ1bmN0aW9uKCl7dGhpcy4kbW92ZUJ5UGFnZSgxKX0sdGhpcy5zY3JvbGxQYWdlVXA9ZnVuY3Rpb24oKXt0aGlzLiRtb3ZlQnlQYWdlKC0xKX0sdGhpcy5zY3JvbGxUb1Jvdz1mdW5jdGlvbihlKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvUm93KGUpfSx0aGlzLnNjcm9sbFRvTGluZT1mdW5jdGlvbihlLHQsbixyKXt0aGlzLnJlbmRlcmVyLnNjcm9sbFRvTGluZShlLHQsbixyKX0sdGhpcy5jZW50ZXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCksdD17cm93Ok1hdGguZmxvb3IoZS5zdGFydC5yb3crKGUuZW5kLnJvdy1lLnN0YXJ0LnJvdykvMiksY29sdW1uOk1hdGguZmxvb3IoZS5zdGFydC5jb2x1bW4rKGUuZW5kLmNvbHVtbi1lLnN0YXJ0LmNvbHVtbikvMil9O3RoaXMucmVuZGVyZXIuYWxpZ25DdXJzb3IodCwuNSl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCl9LHRoaXMuZ2V0Q3Vyc29yUG9zaXRpb25TY3JlZW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmdldEN1cnNvclBvc2l0aW9uKCkpfSx0aGlzLmdldFNlbGVjdGlvblJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCl9LHRoaXMuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24uc2VsZWN0QWxsKCl9LHRoaXMuY2xlYXJTZWxlY3Rpb249ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm1vdmVDdXJzb3JUbz1mdW5jdGlvbihlLHQpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUbyhlLHQpfSx0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uPWZ1bmN0aW9uKGUpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKGUpfSx0aGlzLmp1bXBUb01hdGNoaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRDdXJzb3JQb3NpdGlvbigpLHI9bmV3IHkodGhpcy5zZXNzaW9uLG4ucm93LG4uY29sdW1uKSxpPXIuZ2V0Q3VycmVudFRva2VuKCkscz1pfHxyLnN0ZXBGb3J3YXJkKCk7aWYoIXMpcmV0dXJuO3ZhciBvLHU9ITEsYT17fSxmPW4uY29sdW1uLXMuc3RhcnQsbCxjPXsiKSI6IigiLCIoIjoiKCIsIl0iOiJbIiwiWyI6IlsiLCJ7IjoieyIsIn0iOiJ7In07ZG97aWYocy52YWx1ZS5tYXRjaCgvW3t9KClcW1xdXS9nKSlmb3IoO2Y8cy52YWx1ZS5sZW5ndGgmJiF1O2YrKyl7aWYoIWNbcy52YWx1ZVtmXV0pY29udGludWU7bD1jW3MudmFsdWVbZl1dKyIuIitzLnR5cGUucmVwbGFjZSgicnBhcmVuIiwibHBhcmVuIiksaXNOYU4oYVtsXSkmJihhW2xdPTApO3N3aXRjaChzLnZhbHVlW2ZdKXtjYXNlIigiOmNhc2UiWyI6Y2FzZSJ7IjphW2xdKys7YnJlYWs7Y2FzZSIpIjpjYXNlIl0iOmNhc2UifSI6YVtsXS0tLGFbbF09PT0tMSYmKG89ImJyYWNrZXQiLHU9ITApfX1lbHNlIHMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpIT09LTEmJihpc05hTihhW3MudmFsdWVdKSYmKGFbcy52YWx1ZV09MCksaS52YWx1ZT09PSI8Ij9hW3MudmFsdWVdKys6aS52YWx1ZT09PSI8LyImJmFbcy52YWx1ZV0tLSxhW3MudmFsdWVdPT09LTEmJihvPSJ0YWciLHU9ITApKTt1fHwoaT1zLHM9ci5zdGVwRm9yd2FyZCgpLGY9MCl9d2hpbGUocyYmIXUpO2lmKCFvKXJldHVybjt2YXIgaCxkO2lmKG89PT0iYnJhY2tldCIpe2g9dGhpcy5zZXNzaW9uLmdldEJyYWNrZXRSYW5nZShuKTtpZighaCl7aD1uZXcgcChyLmdldEN1cnJlbnRUb2tlblJvdygpLHIuZ2V0Q3VycmVudFRva2VuQ29sdW1uKCkrZi0xLHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKStmLTEpLGQ9aC5zdGFydDtpZih0fHxkLnJvdz09PW4ucm93JiZNYXRoLmFicyhkLmNvbHVtbi1uLmNvbHVtbik8MiloPXRoaXMuc2Vzc2lvbi5nZXRCcmFja2V0UmFuZ2UoZCl9fWVsc2UgaWYobz09PSJ0YWciKXtpZighc3x8cy50eXBlLmluZGV4T2YoInRhZy1uYW1lIik9PT0tMSlyZXR1cm47dmFyIHY9cy52YWx1ZTtoPW5ldyBwKHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yLHIuZ2V0Q3VycmVudFRva2VuUm93KCksci5nZXRDdXJyZW50VG9rZW5Db2x1bW4oKS0yKTtpZihoLmNvbXBhcmUobi5yb3csbi5jb2x1bW4pPT09MCl7dT0hMTtkbyBzPWksaT1yLnN0ZXBCYWNrd2FyZCgpLGkmJihpLnR5cGUuaW5kZXhPZigidGFnLWNsb3NlIikhPT0tMSYmaC5zZXRFbmQoci5nZXRDdXJyZW50VG9rZW5Sb3coKSxyLmdldEN1cnJlbnRUb2tlbkNvbHVtbigpKzEpLHMudmFsdWU9PT12JiZzLnR5cGUuaW5kZXhPZigidGFnLW5hbWUiKSE9PS0xJiYoaS52YWx1ZT09PSI8Ij9hW3ZdKys6aS52YWx1ZT09PSI8LyImJmFbdl0tLSxhW3ZdPT09MCYmKHU9ITApKSk7d2hpbGUoaSYmIXUpfXMmJnMudHlwZS5pbmRleE9mKCJ0YWctbmFtZSIpJiYoZD1oLnN0YXJ0LGQucm93PT1uLnJvdyYmTWF0aC5hYnMoZC5jb2x1bW4tbi5jb2x1bW4pPDImJihkPWguZW5kKSl9ZD1oJiZoLmN1cnNvcnx8ZCxkJiYoZT9oJiZ0P3RoaXMuc2VsZWN0aW9uLnNldFJhbmdlKGgpOmgmJmguaXNFcXVhbCh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpP3RoaXMuY2xlYXJTZWxlY3Rpb24oKTp0aGlzLnNlbGVjdGlvbi5zZWxlY3RUbyhkLnJvdyxkLmNvbHVtbik6dGhpcy5zZWxlY3Rpb24ubW92ZVRvKGQucm93LGQuY29sdW1uKSl9LHRoaXMuZ290b0xpbmU9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZXNzaW9uLnVuZm9sZCh7cm93OmUtMSxjb2x1bW46dHx8MH0pLHRoaXMuZXhpdE11bHRpU2VsZWN0TW9kZSYmdGhpcy5leGl0TXVsdGlTZWxlY3RNb2RlKCksdGhpcy5tb3ZlQ3Vyc29yVG8oZS0xLHR8fDApLHRoaXMuaXNSb3dGdWxseVZpc2libGUoZS0xKXx8dGhpcy5zY3JvbGxUb0xpbmUoZS0xLCEwLG4pfSx0aGlzLm5hdmlnYXRlVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbi5tb3ZlVG8oZSx0KX0sdGhpcy5uYXZpZ2F0ZVVwPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkmJiF0aGlzLnNlbGVjdGlvbi5pc0JhY2t3YXJkcygpKXt2YXIgdD10aGlzLnNlbGVjdGlvbi5hbmNob3IuZ2V0UG9zaXRpb24oKTtyZXR1cm4gdGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX10aGlzLnNlbGVjdGlvbi5jbGVhclNlbGVjdGlvbigpLHRoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JCeSgtZXx8LTEsMCl9LHRoaXMubmF2aWdhdGVEb3duPWZ1bmN0aW9uKGUpe2lmKHRoaXMuc2VsZWN0aW9uLmlzTXVsdGlMaW5lKCkmJnRoaXMuc2VsZWN0aW9uLmlzQmFja3dhcmRzKCkpe3ZhciB0PXRoaXMuc2VsZWN0aW9uLmFuY2hvci5nZXRQb3NpdGlvbigpO3JldHVybiB0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfXRoaXMuc2VsZWN0aW9uLmNsZWFyU2VsZWN0aW9uKCksdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckJ5KGV8fDEsMCl9LHRoaXMubmF2aWdhdGVMZWZ0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5zdGFydDt0aGlzLm1vdmVDdXJzb3JUb1Bvc2l0aW9uKHQpfWVsc2V7ZT1lfHwxO3doaWxlKGUtLSl0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGVmdCgpfXRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZVJpZ2h0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpe3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uUmFuZ2UoKS5lbmQ7dGhpcy5tb3ZlQ3Vyc29yVG9Qb3NpdGlvbih0KX1lbHNle2U9ZXx8MTt3aGlsZShlLS0pdGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvclJpZ2h0KCl9dGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlTGluZVN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb24ubW92ZUN1cnNvckxpbmVTdGFydCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUxpbmVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yTGluZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVFbmQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yRmlsZUVuZCgpLHRoaXMuY2xlYXJTZWxlY3Rpb24oKX0sdGhpcy5uYXZpZ2F0ZUZpbGVTdGFydD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0aW9uLm1vdmVDdXJzb3JGaWxlU3RhcnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMubmF2aWdhdGVXb3JkUmlnaHQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZFJpZ2h0KCksdGhpcy5jbGVhclNlbGVjdGlvbigpfSx0aGlzLm5hdmlnYXRlV29yZExlZnQ9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGlvbi5tb3ZlQ3Vyc29yV29yZExlZnQoKSx0aGlzLmNsZWFyU2VsZWN0aW9uKCl9LHRoaXMucmVwbGFjZT1mdW5jdGlvbihlLHQpe3QmJnRoaXMuJHNlYXJjaC5zZXQodCk7dmFyIG49dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKSxyPTA7cmV0dXJuIG4/KHRoaXMuJHRyeVJlcGxhY2UobixlKSYmKHI9MSksdGhpcy5zZWxlY3Rpb24uc2V0U2VsZWN0aW9uUmFuZ2UobiksdGhpcy5yZW5kZXJlci5zY3JvbGxTZWxlY3Rpb25JbnRvVmlldyhuLnN0YXJ0LG4uZW5kKSxyKTpyfSx0aGlzLnJlcGxhY2VBbGw9ZnVuY3Rpb24oZSx0KXt0JiZ0aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBuPXRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbikscj0wO2lmKCFuLmxlbmd0aClyZXR1cm4gcjt2YXIgaT10aGlzLmdldFNlbGVjdGlvblJhbmdlKCk7dGhpcy5zZWxlY3Rpb24ubW92ZVRvKDAsMCk7Zm9yKHZhciBzPW4ubGVuZ3RoLTE7cz49MDstLXMpdGhpcy4kdHJ5UmVwbGFjZShuW3NdLGUpJiZyKys7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGkpLHJ9LHRoaXMuJHRyeVJlcGxhY2U9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGUpO3JldHVybiB0PXRoaXMuJHNlYXJjaC5yZXBsYWNlKG4sdCksdCE9PW51bGw/KGUuZW5kPXRoaXMuc2Vzc2lvbi5yZXBsYWNlKGUsdCksZSk6bnVsbH0sdGhpcy5nZXRMYXN0U2VhcmNoT3B0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWFyY2guZ2V0T3B0aW9ucygpfSx0aGlzLmZpbmQ9ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KSx0eXBlb2YgZT09InN0cmluZyJ8fGUgaW5zdGFuY2VvZiBSZWdFeHA/dC5uZWVkbGU9ZTp0eXBlb2YgZT09Im9iamVjdCImJnIubWl4aW4odCxlKTt2YXIgaT10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpO3QubmVlZGxlPT1udWxsJiYoZT10aGlzLnNlc3Npb24uZ2V0VGV4dFJhbmdlKGkpfHx0aGlzLiRzZWFyY2guJG9wdGlvbnMubmVlZGxlLGV8fChpPXRoaXMuc2Vzc2lvbi5nZXRXb3JkUmFuZ2UoaS5zdGFydC5yb3csaS5zdGFydC5jb2x1bW4pLGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShpKSksdGhpcy4kc2VhcmNoLnNldCh7bmVlZGxlOmV9KSksdGhpcy4kc2VhcmNoLnNldCh0KSx0LnN0YXJ0fHx0aGlzLiRzZWFyY2guc2V0KHtzdGFydDppfSk7dmFyIHM9dGhpcy4kc2VhcmNoLmZpbmQodGhpcy5zZXNzaW9uKTtpZih0LnByZXZlbnRTY3JvbGwpcmV0dXJuIHM7aWYocylyZXR1cm4gdGhpcy5yZXZlYWxSYW5nZShzLG4pLHM7dC5iYWNrd2FyZHM/aS5zdGFydD1pLmVuZDppLmVuZD1pLnN0YXJ0LHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKGkpfSx0aGlzLmZpbmROZXh0PWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5kKHtza2lwQ3VycmVudDohMCxiYWNrd2FyZHM6ITF9LGUsdCl9LHRoaXMuZmluZFByZXZpb3VzPWZ1bmN0aW9uKGUsdCl7dGhpcy5maW5kKGUse3NraXBDdXJyZW50OiEwLGJhY2t3YXJkczohMH0sdCl9LHRoaXMucmV2ZWFsUmFuZ2U9ZnVuY3Rpb24oZSx0KXt0aGlzLnNlc3Npb24udW5mb2xkKGUpLHRoaXMuc2VsZWN0aW9uLnNldFNlbGVjdGlvblJhbmdlKGUpO3ZhciBuPXRoaXMucmVuZGVyZXIuc2Nyb2xsVG9wO3RoaXMucmVuZGVyZXIuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXcoZS5zdGFydCxlLmVuZCwuNSksdCE9PSExJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcobil9LHRoaXMudW5kbz1mdW5jdGlvbigpe3RoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLnVuZG8odGhpcy5zZXNzaW9uKSx0aGlzLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUpfSx0aGlzLnJlZG89ZnVuY3Rpb24oKXt0aGlzLnNlc3Npb24uZ2V0VW5kb01hbmFnZXIoKS5yZWRvKHRoaXMuc2Vzc2lvbiksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci5kZXN0cm95KCksdGhpcy5fc2lnbmFsKCJkZXN0cm95Iix0aGlzKSx0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5kZXN0cm95KCl9LHRoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3PWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybjt2YXIgdCxuPXRoaXMscj0hMTt0aGlzLiRzY3JvbGxBbmNob3J8fCh0aGlzLiRzY3JvbGxBbmNob3I9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpO3ZhciBpPXRoaXMuJHNjcm9sbEFuY2hvcjtpLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlIix0aGlzLmNvbnRhaW5lci5pbnNlcnRCZWZvcmUoaSx0aGlzLmNvbnRhaW5lci5maXJzdENoaWxkKTt2YXIgcz10aGlzLm9uKCJjaGFuZ2VTZWxlY3Rpb24iLGZ1bmN0aW9uKCl7cj0hMH0pLG89dGhpcy5yZW5kZXJlci5vbigiYmVmb3JlUmVuZGVyIixmdW5jdGlvbigpe3ImJih0PW4ucmVuZGVyZXIuY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKX0pLHU9dGhpcy5yZW5kZXJlci5vbigiYWZ0ZXJSZW5kZXIiLGZ1bmN0aW9uKCl7aWYociYmdCYmKG4uaXNGb2N1c2VkKCl8fG4uc2VhcmNoQm94JiZuLnNlYXJjaEJveC5pc0ZvY3VzZWQoKSkpe3ZhciBlPW4ucmVuZGVyZXIscz1lLiRjdXJzb3JMYXllci4kcGl4ZWxQb3Msbz1lLmxheWVyQ29uZmlnLHU9cy50b3Atby5vZmZzZXQ7cy50b3A+PTAmJnUrdC50b3A8MD9yPSEwOnMudG9wPG8uaGVpZ2h0JiZzLnRvcCt0LnRvcCtvLmxpbmVIZWlnaHQ+d2luZG93LmlubmVySGVpZ2h0P3I9ITE6cj1udWxsLHIhPW51bGwmJihpLnN0eWxlLnRvcD11KyJweCIsaS5zdHlsZS5sZWZ0PXMubGVmdCsicHgiLGkuc3R5bGUuaGVpZ2h0PW8ubGluZUhlaWdodCsicHgiLGkuc2Nyb2xsSW50b1ZpZXcocikpLHI9dD1udWxsfX0pO3RoaXMuc2V0QXV0b1Njcm9sbEVkaXRvckludG9WaWV3PWZ1bmN0aW9uKGUpe2lmKGUpcmV0dXJuO2RlbGV0ZSB0aGlzLnNldEF1dG9TY3JvbGxFZGl0b3JJbnRvVmlldyx0aGlzLm9mZigiY2hhbmdlU2VsZWN0aW9uIixzKSx0aGlzLnJlbmRlcmVyLm9mZigiYWZ0ZXJSZW5kZXIiLHUpLHRoaXMucmVuZGVyZXIub2ZmKCJiZWZvcmVSZW5kZXIiLG8pfX0sdGhpcy4kcmVzZXRDdXJzb3JTdHlsZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJGN1cnNvclN0eWxlfHwiYWNlIix0PXRoaXMucmVuZGVyZXIuJGN1cnNvckxheWVyO2lmKCF0KXJldHVybjt0LnNldFNtb290aEJsaW5raW5nKC9zbW9vdGgvLnRlc3QoZSkpLHQuaXNCbGlua2luZz0hdGhpcy4kcmVhZE9ubHkmJmUhPSJ3aWRlIixpLnNldENzc0NsYXNzKHQuZWxlbWVudCwiYWNlX3NsaW0tY3Vyc29ycyIsL3NsaW0vLnRlc3QoZSkpfSx0aGlzLnByb21wdD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztnLmxvYWRNb2R1bGUoIi4vZXh0L3Byb21wdCIsZnVuY3Rpb24oaSl7aS5wcm9tcHQocixlLHQsbil9KX19LmNhbGwody5wcm90b3R5cGUpLGcuZGVmaW5lT3B0aW9ucyh3LnByb3RvdHlwZSwiZWRpdG9yIix7c2VsZWN0aW9uU3R5bGU6e3NldDpmdW5jdGlvbihlKXt0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5fc2lnbmFsKCJjaGFuZ2VTZWxlY3Rpb25TdHlsZSIse2RhdGE6ZX0pfSxpbml0aWFsVmFsdWU6ImxpbmUifSxoaWdobGlnaHRBY3RpdmVMaW5lOntzZXQ6ZnVuY3Rpb24oKXt0aGlzLiR1cGRhdGVIaWdobGlnaHRBY3RpdmVMaW5lKCl9LGluaXRpYWxWYWx1ZTohMH0saGlnaGxpZ2h0U2VsZWN0ZWRXb3JkOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kb25TZWxlY3Rpb25DaGFuZ2UoKX0saW5pdGlhbFZhbHVlOiEwfSxyZWFkT25seTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudGV4dElucHV0LnNldFJlYWRPbmx5KGUpLHRoaXMuJHJlc2V0Q3Vyc29yU3R5bGUoKX0saW5pdGlhbFZhbHVlOiExfSxjb3B5V2l0aEVtcHR5U2VsZWN0aW9uOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy50ZXh0SW5wdXQuc2V0Q29weVdpdGhFbXB0eVNlbGVjdGlvbihlKX0saW5pdGlhbFZhbHVlOiExfSxjdXJzb3JTdHlsZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJHJlc2V0Q3Vyc29yU3R5bGUoKX0sdmFsdWVzOlsiYWNlIiwic2xpbSIsInNtb290aCIsIndpZGUiXSxpbml0aWFsVmFsdWU6ImFjZSJ9LG1lcmdlVW5kb0RlbHRhczp7dmFsdWVzOlshMSwhMCwiYWx3YXlzIl0saW5pdGlhbFZhbHVlOiEwfSxiZWhhdmlvdXJzRW5hYmxlZDp7aW5pdGlhbFZhbHVlOiEwfSx3cmFwQmVoYXZpb3Vyc0VuYWJsZWQ6e2luaXRpYWxWYWx1ZTohMH0sYXV0b1Njcm9sbEVkaXRvckludG9WaWV3OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRBdXRvU2Nyb2xsRWRpdG9ySW50b1ZpZXcoZSl9fSxrZXlib2FyZEhhbmRsZXI6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNldEtleWJvYXJkSGFuZGxlcihlKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGtleWJpbmRpbmdJZH0saGFuZGxlc1NldDohMH0sdmFsdWU6e3NldDpmdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uc2V0VmFsdWUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFZhbHVlKCl9LGhhbmRsZXNTZXQ6ITAsaGlkZGVuOiEwfSxzZXNzaW9uOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5zZXRTZXNzaW9uKGUpfSxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZXNzaW9ufSxoYW5kbGVzU2V0OiEwLGhpZGRlbjohMH0sc2hvd0xpbmVOdW1iZXJzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy5yZW5kZXJlci4kZ3V0dGVyTGF5ZXIuc2V0U2hvd0xpbmVOdW1iZXJzKGUpLHRoaXMucmVuZGVyZXIuJGxvb3Auc2NoZWR1bGUodGhpcy5yZW5kZXJlci5DSEFOR0VfR1VUVEVSKSxlJiZ0aGlzLiRyZWxhdGl2ZUxpbmVOdW1iZXJzP0UuYXR0YWNoKHRoaXMpOkUuZGV0YWNoKHRoaXMpfSxpbml0aWFsVmFsdWU6ITB9LHJlbGF0aXZlTGluZU51bWJlcnM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRzaG93TGluZU51bWJlcnMmJmU/RS5hdHRhY2godGhpcyk6RS5kZXRhY2godGhpcyl9fSxoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZToicmVuZGVyZXIiLHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlOiJyZW5kZXJlciIsaGlnaGxpZ2h0R3V0dGVyTGluZToicmVuZGVyZXIiLGFuaW1hdGVkU2Nyb2xsOiJyZW5kZXJlciIsc2hvd0ludmlzaWJsZXM6InJlbmRlcmVyIixzaG93UHJpbnRNYXJnaW46InJlbmRlcmVyIixwcmludE1hcmdpbkNvbHVtbjoicmVuZGVyZXIiLHByaW50TWFyZ2luOiJyZW5kZXJlciIsZmFkZUZvbGRXaWRnZXRzOiJyZW5kZXJlciIsc2hvd0ZvbGRXaWRnZXRzOiJyZW5kZXJlciIsZGlzcGxheUluZGVudEd1aWRlczoicmVuZGVyZXIiLHNob3dHdXR0ZXI6InJlbmRlcmVyIixmb250U2l6ZToicmVuZGVyZXIiLGZvbnRGYW1pbHk6InJlbmRlcmVyIixtYXhMaW5lczoicmVuZGVyZXIiLG1pbkxpbmVzOiJyZW5kZXJlciIsc2Nyb2xsUGFzdEVuZDoicmVuZGVyZXIiLGZpeGVkV2lkdGhHdXR0ZXI6InJlbmRlcmVyIix0aGVtZToicmVuZGVyZXIiLGhhc0Nzc1RyYW5zZm9ybXM6InJlbmRlcmVyIixtYXhQaXhlbEhlaWdodDoicmVuZGVyZXIiLHVzZVRleHRhcmVhRm9ySU1FOiJyZW5kZXJlciIsc2Nyb2xsU3BlZWQ6IiRtb3VzZUhhbmRsZXIiLGRyYWdEZWxheToiJG1vdXNlSGFuZGxlciIsZHJhZ0VuYWJsZWQ6IiRtb3VzZUhhbmRsZXIiLGZvY3VzVGltZW91dDoiJG1vdXNlSGFuZGxlciIsdG9vbHRpcEZvbGxvd3NNb3VzZToiJG1vdXNlSGFuZGxlciIsZmlyc3RMaW5lTnVtYmVyOiJzZXNzaW9uIixvdmVyd3JpdGU6InNlc3Npb24iLG5ld0xpbmVNb2RlOiJzZXNzaW9uIix1c2VXb3JrZXI6InNlc3Npb24iLHVzZVNvZnRUYWJzOiJzZXNzaW9uIixuYXZpZ2F0ZVdpdGhpblNvZnRUYWJzOiJzZXNzaW9uIix0YWJTaXplOiJzZXNzaW9uIix3cmFwOiJzZXNzaW9uIixpbmRlbnRlZFNvZnRXcmFwOiJzZXNzaW9uIixmb2xkU3R5bGU6InNlc3Npb24iLG1vZGU6InNlc3Npb24ifSk7dmFyIEU9e2dldFRleHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4oTWF0aC5hYnMoZS5zZWxlY3Rpb24ubGVhZC5yb3ctdCl8fHQrMSsodDw5PyJcdTAwYjciOiIiKSkrIiJ9LGdldFdpZHRoOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gTWF0aC5tYXgodC50b1N0cmluZygpLmxlbmd0aCwobi5sYXN0Um93KzEpLnRvU3RyaW5nKCkubGVuZ3RoLDIpKm4uY2hhcmFjdGVyV2lkdGh9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3QucmVuZGVyZXIuJGxvb3Auc2NoZWR1bGUodC5yZW5kZXJlci5DSEFOR0VfR1VUVEVSKX0sYXR0YWNoOmZ1bmN0aW9uKGUpe2UucmVuZGVyZXIuJGd1dHRlckxheWVyLiRyZW5kZXJlcj10aGlzLGUub24oImNoYW5nZVNlbGVjdGlvbiIsdGhpcy51cGRhdGUpLHRoaXMudXBkYXRlKG51bGwsZSl9LGRldGFjaDpmdW5jdGlvbihlKXtlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9PXRoaXMmJihlLnJlbmRlcmVyLiRndXR0ZXJMYXllci4kcmVuZGVyZXI9bnVsbCksZS5vZmYoImNoYW5nZVNlbGVjdGlvbiIsdGhpcy51cGRhdGUpLHRoaXMudXBkYXRlKG51bGwsZSl9fTt0LkVkaXRvcj13fSksYWNlLmRlZmluZSgiYWNlL3VuZG9tYW5hZ2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBpKGUsdCl7Zm9yKHZhciBuPXQ7bi0tOyl7dmFyIHI9ZVtuXTtpZihyJiYhclswXS5pZ25vcmUpe3doaWxlKG48dC0xKXt2YXIgaT1kKGVbbl0sZVtuKzFdKTtlW25dPWlbMF0sZVtuKzFdPWlbMV0sbisrfXJldHVybiEwfX19ZnVuY3Rpb24gYShlKXt2YXIgdD1lLmFjdGlvbj09Imluc2VydCIsbj1lLnN0YXJ0LHI9ZS5lbmQsaT0oci5yb3ctbi5yb3cpKih0PzE6LTEpLHM9KHIuY29sdW1uLW4uY29sdW1uKSoodD8xOi0xKTt0JiYocj1uKTtmb3IodmFyIG8gaW4gdGhpcy5tYXJrcyl7dmFyIGE9dGhpcy5tYXJrc1tvXSxmPXUoYSxuKTtpZihmPDApY29udGludWU7aWYoZj09PTAmJnQpe2lmKGEuYmlhcyE9MSl7YS5iaWFzPT0tMTtjb250aW51ZX1mPTF9dmFyIGw9dD9mOnUoYSxyKTtpZihsPjApe2Eucm93Kz1pLGEuY29sdW1uKz1hLnJvdz09ci5yb3c/czowO2NvbnRpbnVlfSF0JiZsPD0wJiYoYS5yb3c9bi5yb3csYS5jb2x1bW49bi5jb2x1bW4sbD09PTAmJihhLmJpYXM9MSkpfX1mdW5jdGlvbiBmKGUpe3JldHVybntyb3c6ZS5yb3csY29sdW1uOmUuY29sdW1ufX1mdW5jdGlvbiBsKGUpe3JldHVybntzdGFydDpmKGUuc3RhcnQpLGVuZDpmKGUuZW5kKSxhY3Rpb246ZS5hY3Rpb24sbGluZXM6ZS5saW5lcy5zbGljZSgpfX1mdW5jdGlvbiBjKGUpe2U9ZXx8dGhpcztpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChjKS5qb2luKCJcbiIpO3ZhciB0PSIiO2UuYWN0aW9uPyh0PWUuYWN0aW9uPT0iaW5zZXJ0Ij8iKyI6Ii0iLHQrPSJbIitlLmxpbmVzKyJdIik6ZS52YWx1ZSYmKEFycmF5LmlzQXJyYXkoZS52YWx1ZSk/dD1lLnZhbHVlLm1hcChoKS5qb2luKCJcbiIpOnQ9aChlLnZhbHVlKSksZS5zdGFydCYmKHQrPWgoZSkpO2lmKGUuaWR8fGUucmV2KXQrPSIJKCIrKGUuaWR8fGUucmV2KSsiKSI7cmV0dXJuIHR9ZnVuY3Rpb24gaChlKXtyZXR1cm4gZS5zdGFydC5yb3crIjoiK2Uuc3RhcnQuY29sdW1uKyI9PiIrZS5lbmQucm93KyI6IitlLmVuZC5jb2x1bW59ZnVuY3Rpb24gcChlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IixyPXQuYWN0aW9uPT0iaW5zZXJ0IjtpZihuJiZyKWlmKG8odC5zdGFydCxlLmVuZCk+PTApbSh0LGUsLTEpO2Vsc2V7aWYoIShvKHQuc3RhcnQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LDEpfWVsc2UgaWYobiYmIXIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LC0xKX1lbHNlIGlmKCFuJiZyKWlmKG8odC5zdGFydCxlLnN0YXJ0KT49MCltKHQsZSwxKTtlbHNle2lmKCEobyh0LnN0YXJ0LGUuc3RhcnQpPD0wKSlyZXR1cm4gbnVsbDttKGUsdCwxKX1lbHNlIGlmKCFuJiYhcilpZihvKHQuc3RhcnQsZS5zdGFydCk+PTApbSh0LGUsMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXJldHVybiBudWxsO20oZSx0LC0xKX1yZXR1cm5bdCxlXX1mdW5jdGlvbiBkKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspZm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspaWYoIXAoZVtuXSx0W3JdKSl7d2hpbGUobjxlLmxlbmd0aCl7d2hpbGUoci0tKXAodFtyXSxlW25dKTtyPXQubGVuZ3RoLG4rK31yZXR1cm5bZSx0XX1yZXR1cm4gZS5zZWxlY3Rpb25CZWZvcmU9dC5zZWxlY3Rpb25CZWZvcmU9ZS5zZWxlY3Rpb25BZnRlcj10LnNlbGVjdGlvbkFmdGVyPW51bGwsW3QsZV19ZnVuY3Rpb24gdihlLHQpe3ZhciBuPWUuYWN0aW9uPT0iaW5zZXJ0IixyPXQuYWN0aW9uPT0iaW5zZXJ0IjtpZihuJiZyKW8oZS5zdGFydCx0LnN0YXJ0KTwwP20odCxlLDEpOm0oZSx0LDEpO2Vsc2UgaWYobiYmIXIpbyhlLnN0YXJ0LHQuZW5kKT49MD9tKGUsdCwtMSk6byhlLnN0YXJ0LHQuc3RhcnQpPD0wP20odCxlLDEpOihtKGUscy5mcm9tUG9pbnRzKHQuc3RhcnQsZS5zdGFydCksLTEpLG0odCxlLDEpKTtlbHNlIGlmKCFuJiZyKW8odC5zdGFydCxlLmVuZCk+PTA/bSh0LGUsLTEpOm8odC5zdGFydCxlLnN0YXJ0KTw9MD9tKGUsdCwxKToobSh0LHMuZnJvbVBvaW50cyhlLnN0YXJ0LHQuc3RhcnQpLC0xKSxtKGUsdCwxKSk7ZWxzZSBpZighbiYmIXIpaWYobyh0LnN0YXJ0LGUuZW5kKT49MCltKHQsZSwtMSk7ZWxzZXtpZighKG8odC5lbmQsZS5zdGFydCk8PTApKXt2YXIgaSx1O3JldHVybiBvKGUuc3RhcnQsdC5zdGFydCk8MCYmKGk9ZSxlPXkoZSx0LnN0YXJ0KSksbyhlLmVuZCx0LmVuZCk+MCYmKHU9eShlLHQuZW5kKSksZyh0LmVuZCxlLnN0YXJ0LGUuZW5kLC0xKSx1JiYhaSYmKGUubGluZXM9dS5saW5lcyxlLnN0YXJ0PXUuc3RhcnQsZS5lbmQ9dS5lbmQsdT1lKSxbdCxpLHVdLmZpbHRlcihCb29sZWFuKX1tKGUsdCwtMSl9cmV0dXJuW3QsZV19ZnVuY3Rpb24gbShlLHQsbil7ZyhlLnN0YXJ0LHQuc3RhcnQsdC5lbmQsbiksZyhlLmVuZCx0LnN0YXJ0LHQuZW5kLG4pfWZ1bmN0aW9uIGcoZSx0LG4scil7ZS5yb3c9PShyPT0xP3Q6bikucm93JiYoZS5jb2x1bW4rPXIqKG4uY29sdW1uLXQuY29sdW1uKSksZS5yb3crPXIqKG4ucm93LXQucm93KX1mdW5jdGlvbiB5KGUsdCl7dmFyIG49ZS5saW5lcyxyPWUuZW5kO2UuZW5kPWYodCk7dmFyIGk9ZS5lbmQucm93LWUuc3RhcnQucm93LHM9bi5zcGxpY2UoaSxuLmxlbmd0aCksbz1pP3QuY29sdW1uOnQuY29sdW1uLWUuc3RhcnQuY29sdW1uO24ucHVzaChzWzBdLnN1YnN0cmluZygwLG8pKSxzWzBdPXNbMF0uc3Vic3RyKG8pO3ZhciB1PXtzdGFydDpmKHQpLGVuZDpyLGxpbmVzOnMsYWN0aW9uOmUuYWN0aW9ufTtyZXR1cm4gdX1mdW5jdGlvbiBiKGUsdCl7dD1sKHQpO2Zvcih2YXIgbj1lLmxlbmd0aDtuLS07KXt2YXIgcj1lW25dO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgcz1yW2ldLG89dihzLHQpO3Q9b1swXSxvLmxlbmd0aCE9MiYmKG9bMl0/KHIuc3BsaWNlKGkrMSwxLG9bMV0sb1syXSksaSsrKTpvWzFdfHwoci5zcGxpY2UoaSwxKSxpLS0pKX1yLmxlbmd0aHx8ZS5zcGxpY2UobiwxKX1yZXR1cm4gZX1mdW5jdGlvbiB3KGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07Zm9yKHZhciBpPTA7aTxyLmxlbmd0aDtpKyspYihlLHJbaV0pfX12YXIgcj1mdW5jdGlvbigpe3RoaXMuJG1heFJldj0wLHRoaXMuJGZyb21VbmRvPSExLHRoaXMucmVzZXQoKX07KGZ1bmN0aW9uKCl7dGhpcy5hZGRTZXNzaW9uPWZ1bmN0aW9uKGUpe3RoaXMuJHNlc3Npb249ZX0sdGhpcy5hZGQ9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuJGZyb21VbmRvKXJldHVybjtpZihlPT10aGlzLiRsYXN0RGVsdGEpcmV0dXJuO2lmKHQ9PT0hMXx8IXRoaXMubGFzdERlbHRhcyl0aGlzLmxhc3REZWx0YXM9W10sdGhpcy4kdW5kb1N0YWNrLnB1c2godGhpcy5sYXN0RGVsdGFzKSxlLmlkPXRoaXMuJHJldj0rK3RoaXMuJG1heFJldjtpZihlLmFjdGlvbj09InJlbW92ZSJ8fGUuYWN0aW9uPT0iaW5zZXJ0Iil0aGlzLiRsYXN0RGVsdGE9ZTt0aGlzLmxhc3REZWx0YXMucHVzaChlKX0sdGhpcy5hZGRTZWxlY3Rpb249ZnVuY3Rpb24oZSx0KXt0aGlzLnNlbGVjdGlvbnMucHVzaCh7dmFsdWU6ZSxyZXY6dHx8dGhpcy4kcmV2fSl9LHRoaXMuc3RhcnROZXdHcm91cD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxhc3REZWx0YXM9bnVsbCx0aGlzLiRyZXZ9LHRoaXMubWFya0lnbm9yZWQ9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSk7dmFyIG49dGhpcy4kdW5kb1N0YWNrO2Zvcih2YXIgcj1uLmxlbmd0aDtyLS07KXt2YXIgaT1uW3JdWzBdO2lmKGkuaWQ8PWUpYnJlYWs7aS5pZDx0JiYoaS5pZ25vcmU9ITApfXRoaXMubGFzdERlbHRhcz1udWxsfSx0aGlzLmdldFNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2VsZWN0aW9ucztmb3IodmFyIHI9bi5sZW5ndGg7ci0tOyl7dmFyIGk9bltyXTtpZihpLnJldjxlKXJldHVybiB0JiYoaT1uW3IrMV0pLGl9fSx0aGlzLmdldFJldmlzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHJldn0sdGhpcy5nZXREZWx0YXM9ZnVuY3Rpb24oZSx0KXt0PT1udWxsJiYodD10aGlzLiRyZXYrMSk7dmFyIG49dGhpcy4kdW5kb1N0YWNrLHI9bnVsbCxpPTA7Zm9yKHZhciBzPW4ubGVuZ3RoO3MtLTspe3ZhciBvPW5bc11bMF07by5pZDx0JiYhciYmKHI9cysxKTtpZihvLmlkPD1lKXtpPXMrMTticmVha319cmV0dXJuIG4uc2xpY2UoaSxyKX0sdGhpcy5nZXRDaGFuZ2VkUmFuZ2VzPWZ1bmN0aW9uKGUsdCl7dD09bnVsbCYmKHQ9dGhpcy4kcmV2KzEpfSx0aGlzLmdldENoYW5nZWRMaW5lcz1mdW5jdGlvbihlLHQpe3Q9PW51bGwmJih0PXRoaXMuJHJldisxKX0sdGhpcy51bmRvPWZ1bmN0aW9uKGUsdCl7dGhpcy5sYXN0RGVsdGFzPW51bGw7dmFyIG49dGhpcy4kdW5kb1N0YWNrO2lmKCFpKG4sbi5sZW5ndGgpKXJldHVybjtlfHwoZT10aGlzLiRzZXNzaW9uKSx0aGlzLiRyZWRvU3RhY2tCYXNlUmV2IT09dGhpcy4kcmV2JiZ0aGlzLiRyZWRvU3RhY2subGVuZ3RoJiYodGhpcy4kcmVkb1N0YWNrPVtdKSx0aGlzLiRmcm9tVW5kbz0hMDt2YXIgcj1uLnBvcCgpLHM9bnVsbDtyZXR1cm4gciYmci5sZW5ndGgmJihzPWUudW5kb0NoYW5nZXMocix0KSx0aGlzLiRyZWRvU3RhY2sucHVzaChyKSx0aGlzLiRzeW5jUmV2KCkpLHRoaXMuJGZyb21VbmRvPSExLHN9LHRoaXMucmVkbz1mdW5jdGlvbihlLHQpe3RoaXMubGFzdERlbHRhcz1udWxsLGV8fChlPXRoaXMuJHNlc3Npb24pLHRoaXMuJGZyb21VbmRvPSEwO2lmKHRoaXMuJHJlZG9TdGFja0Jhc2VSZXYhPXRoaXMuJHJldil7dmFyIG49dGhpcy5nZXREZWx0YXModGhpcy4kcmVkb1N0YWNrQmFzZVJldix0aGlzLiRyZXYrMSk7dyh0aGlzLiRyZWRvU3RhY2ssbiksdGhpcy4kcmVkb1N0YWNrQmFzZVJldj10aGlzLiRyZXYsdGhpcy4kcmVkb1N0YWNrLmZvckVhY2goZnVuY3Rpb24oZSl7ZVswXS5pZD0rK3RoaXMuJG1heFJldn0sdGhpcyl9dmFyIHI9dGhpcy4kcmVkb1N0YWNrLnBvcCgpLGk9bnVsbDtyZXR1cm4gciYmKGk9ZS5yZWRvQ2hhbmdlcyhyLHQpLHRoaXMuJHVuZG9TdGFjay5wdXNoKHIpLHRoaXMuJHN5bmNSZXYoKSksdGhpcy4kZnJvbVVuZG89ITEsaX0sdGhpcy4kc3luY1Jldj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHVuZG9TdGFjayx0PWVbZS5sZW5ndGgtMV0sbj10JiZ0WzBdLmlkfHwwO3RoaXMuJHJlZG9TdGFja0Jhc2VSZXY9bix0aGlzLiRyZXY9bn0sdGhpcy5yZXNldD1mdW5jdGlvbigpe3RoaXMubGFzdERlbHRhcz1udWxsLHRoaXMuJGxhc3REZWx0YT1udWxsLHRoaXMuJHVuZG9TdGFjaz1bXSx0aGlzLiRyZWRvU3RhY2s9W10sdGhpcy4kcmV2PTAsdGhpcy5tYXJrPTAsdGhpcy4kcmVkb1N0YWNrQmFzZVJldj10aGlzLiRyZXYsdGhpcy5zZWxlY3Rpb25zPVtdfSx0aGlzLmNhblVuZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdW5kb1N0YWNrLmxlbmd0aD4wfSx0aGlzLmNhblJlZG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmVkb1N0YWNrLmxlbmd0aD4wfSx0aGlzLmJvb2ttYXJrPWZ1bmN0aW9uKGUpe2U9PXVuZGVmaW5lZCYmKGU9dGhpcy4kcmV2KSx0aGlzLm1hcms9ZX0sdGhpcy5pc0F0Qm9va21hcms9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kcmV2PT09dGhpcy5tYXJrfSx0aGlzLnRvSlNPTj1mdW5jdGlvbigpe30sdGhpcy5mcm9tSlNPTj1mdW5jdGlvbigpe30sdGhpcy5oYXNVbmRvPXRoaXMuY2FuVW5kbyx0aGlzLmhhc1JlZG89dGhpcy5jYW5SZWRvLHRoaXMuaXNDbGVhbj10aGlzLmlzQXRCb29rbWFyayx0aGlzLm1hcmtDbGVhbj10aGlzLmJvb2ttYXJrLHRoaXMuJHByZXR0eVByaW50PWZ1bmN0aW9uKGUpe3JldHVybiBlP2MoZSk6Yyh0aGlzLiR1bmRvU3RhY2spKyJcbi0tLVxuIitjKHRoaXMuJHJlZG9TdGFjayl9fSkuY2FsbChyLnByb3RvdHlwZSk7dmFyIHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89cy5jb21wYXJlUG9pbnRzLHU9cy5jb21wYXJlUG9pbnRzO3QuVW5kb01hbmFnZXI9cn0pLGFjZS5kZWZpbmUoImFjZS9sYXllci9saW5lcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvZG9tIiksaT1mdW5jdGlvbihlLHQpe3RoaXMuZWxlbWVudD1lLHRoaXMuY2FudmFzSGVpZ2h0PXR8fDVlNSx0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PXRoaXMuY2FudmFzSGVpZ2h0KjIrInB4Iix0aGlzLmNlbGxzPVtdLHRoaXMuY2VsbENhY2hlPVtdLHRoaXMuJG9mZnNldENvZWZmaWNpZW50PTB9OyhmdW5jdGlvbigpe3RoaXMubW92ZUNvbnRhaW5lcj1mdW5jdGlvbihlKXtyLnRyYW5zbGF0ZSh0aGlzLmVsZW1lbnQsMCwtKGUuZmlyc3RSb3dTY3JlZW4qZS5saW5lSGVpZ2h0JXRoaXMuY2FudmFzSGVpZ2h0KS1lLm9mZnNldCp0aGlzLiRvZmZzZXRDb2VmZmljaWVudCl9LHRoaXMucGFnZUNoYW5nZWQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gTWF0aC5mbG9vcihlLmZpcnN0Um93U2NyZWVuKmUubGluZUhlaWdodC90aGlzLmNhbnZhc0hlaWdodCkhPT1NYXRoLmZsb29yKHQuZmlyc3RSb3dTY3JlZW4qdC5saW5lSGVpZ2h0L3RoaXMuY2FudmFzSGVpZ2h0KX0sdGhpcy5jb21wdXRlTGluZVRvcD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5maXJzdFJvd1NjcmVlbip0LmxpbmVIZWlnaHQsaT1NYXRoLmZsb29yKHIvdGhpcy5jYW52YXNIZWlnaHQpLHM9bi5kb2N1bWVudFRvU2NyZWVuUm93KGUsMCkqdC5saW5lSGVpZ2h0O3JldHVybiBzLWkqdGhpcy5jYW52YXNIZWlnaHR9LHRoaXMuY29tcHV0ZUxpbmVIZWlnaHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0LmxpbmVIZWlnaHQqbi5nZXRSb3dMZW5ndGgoZSl9LHRoaXMuZ2V0TGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2VsbHMubGVuZ3RofSx0aGlzLmdldD1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5jZWxsc1tlXX0sdGhpcy5zaGlmdD1mdW5jdGlvbigpe3RoaXMuJGNhY2hlQ2VsbCh0aGlzLmNlbGxzLnNoaWZ0KCkpfSx0aGlzLnBvcD1mdW5jdGlvbigpe3RoaXMuJGNhY2hlQ2VsbCh0aGlzLmNlbGxzLnBvcCgpKX0sdGhpcy5wdXNoPWZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpe3RoaXMuY2VsbHMucHVzaC5hcHBseSh0aGlzLmNlbGxzLGUpO3ZhciB0PXIuY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0LmFwcGVuZENoaWxkKGVbbl0uZWxlbWVudCk7dGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKHQpfWVsc2UgdGhpcy5jZWxscy5wdXNoKGUpLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZChlLmVsZW1lbnQpfSx0aGlzLnVuc2hpZnQ9ZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7dGhpcy5jZWxscy51bnNoaWZ0LmFwcGx5KHRoaXMuY2VsbHMsZSk7dmFyIHQ9ci5jcmVhdGVGcmFnbWVudCh0aGlzLmVsZW1lbnQpO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXQuYXBwZW5kQ2hpbGQoZVtuXS5lbGVtZW50KTt0aGlzLmVsZW1lbnQuZmlyc3RDaGlsZD90aGlzLmVsZW1lbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5lbGVtZW50LmZpcnN0Q2hpbGQpOnRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0KX1lbHNlIHRoaXMuY2VsbHMudW5zaGlmdChlKSx0aGlzLmVsZW1lbnQuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmJlZ2luIixlLmVsZW1lbnQpfSx0aGlzLmxhc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jZWxscy5sZW5ndGg/dGhpcy5jZWxsc1t0aGlzLmNlbGxzLmxlbmd0aC0xXTpudWxsfSx0aGlzLiRjYWNoZUNlbGw9ZnVuY3Rpb24oZSl7aWYoIWUpcmV0dXJuO2UuZWxlbWVudC5yZW1vdmUoKSx0aGlzLmNlbGxDYWNoZS5wdXNoKGUpfSx0aGlzLmNyZWF0ZUNlbGw9ZnVuY3Rpb24oZSx0LG4saSl7dmFyIHM9dGhpcy5jZWxsQ2FjaGUucG9wKCk7aWYoIXMpe3ZhciBvPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7aSYmaShvKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobykscz17ZWxlbWVudDpvLHRleHQ6IiIscm93OmV9fXJldHVybiBzLnJvdz1lLHN9fSkuY2FsbChpLnByb3RvdHlwZSksdC5MaW5lcz1pfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2d1dHRlciIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGF5ZXIvbGluZXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGYoZSl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO2UuYXBwZW5kQ2hpbGQodCk7dmFyIG49ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGUuYXBwZW5kQ2hpbGQobiksZX12YXIgcj1lKCIuLi9saWIvZG9tIiksaT1lKCIuLi9saWIvb29wIikscz1lKCIuLi9saWIvbGFuZyIpLG89ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsdT1lKCIuL2xpbmVzIikuTGluZXMsYT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9ci5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX2d1dHRlci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuc2V0U2hvd0ZvbGRXaWRnZXRzKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyksdGhpcy5ndXR0ZXJXaWR0aD0wLHRoaXMuJGFubm90YXRpb25zPVtdLHRoaXMuJHVwZGF0ZUFubm90YXRpb25zPXRoaXMuJHVwZGF0ZUFubm90YXRpb25zLmJpbmQodGhpcyksdGhpcy4kbGluZXM9bmV3IHUodGhpcy5lbGVtZW50KSx0aGlzLiRsaW5lcy4kb2Zmc2V0Q29lZmZpY2llbnQ9MX07KGZ1bmN0aW9uKCl7aS5pbXBsZW1lbnQodGhpcyxvKSx0aGlzLnNldFNlc3Npb249ZnVuY3Rpb24oZSl7dGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucyksdGhpcy5zZXNzaW9uPWUsZSYmZS5vbigiY2hhbmdlIix0aGlzLiR1cGRhdGVBbm5vdGF0aW9ucyl9LHRoaXMuYWRkR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3dpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybigiZGVwcmVjYXRlZCB1c2Ugc2Vzc2lvbi5hZGRHdXR0ZXJEZWNvcmF0aW9uIiksdGhpcy5zZXNzaW9uLmFkZEd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy5yZW1vdmVHdXR0ZXJEZWNvcmF0aW9uPWZ1bmN0aW9uKGUsdCl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCJkZXByZWNhdGVkIHVzZSBzZXNzaW9uLnJlbW92ZUd1dHRlckRlY29yYXRpb24iKSx0aGlzLnNlc3Npb24ucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbihlLHQpfSx0aGlzLnNldEFubm90YXRpb25zPWZ1bmN0aW9uKGUpe3RoaXMuJGFubm90YXRpb25zPVtdO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9bi5yb3csaT10aGlzLiRhbm5vdGF0aW9uc1tyXTtpfHwoaT10aGlzLiRhbm5vdGF0aW9uc1tyXT17dGV4dDpbXX0pO3ZhciBvPW4udGV4dDtvPW8/cy5lc2NhcGVIVE1MKG8pOm4uaHRtbHx8IiIsaS50ZXh0LmluZGV4T2Yobyk9PT0tMSYmaS50ZXh0LnB1c2gobyk7dmFyIHU9bi50eXBlO3U9PSJlcnJvciI/aS5jbGFzc05hbWU9IiBhY2VfZXJyb3IiOnU9PSJ3YXJuaW5nIiYmaS5jbGFzc05hbWUhPSIgYWNlX2Vycm9yIj9pLmNsYXNzTmFtZT0iIGFjZV93YXJuaW5nIjp1PT0iaW5mbyImJiFpLmNsYXNzTmFtZSYmKGkuY2xhc3NOYW1lPSIgYWNlX2luZm8iKX19LHRoaXMuJHVwZGF0ZUFubm90YXRpb25zPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLiRhbm5vdGF0aW9ucy5sZW5ndGgpcmV0dXJuO3ZhciB0PWUuc3RhcnQucm93LG49ZS5lbmQucm93LXQ7aWYobiE9PTApaWYoZS5hY3Rpb249PSJyZW1vdmUiKXRoaXMuJGFubm90YXRpb25zLnNwbGljZSh0LG4rMSxudWxsKTtlbHNle3ZhciByPW5ldyBBcnJheShuKzEpO3IudW5zaGlmdCh0LDEpLHRoaXMuJGFubm90YXRpb25zLnNwbGljZS5hcHBseSh0aGlzLiRhbm5vdGF0aW9ucyxyKX19LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuY29uZmlnPWU7dmFyIHQ9dGhpcy5zZXNzaW9uLG49ZS5maXJzdFJvdyxyPU1hdGgubWluKGUubGFzdFJvdytlLmd1dHRlck9mZnNldCx0LmdldExlbmd0aCgpLTEpO3RoaXMub2xkTGFzdFJvdz1yLHRoaXMuY29uZmlnPWUsdGhpcy4kbGluZXMubW92ZUNvbnRhaW5lcihlKSx0aGlzLiR1cGRhdGVDdXJzb3JSb3coKTt2YXIgaT10LmdldE5leHRGb2xkTGluZShuKSxzPWk/aS5zdGFydC5yb3c6SW5maW5pdHksbz1udWxsLHU9LTEsYT1uO2Zvcig7Oyl7YT5zJiYoYT1pLmVuZC5yb3crMSxpPXQuZ2V0TmV4dEZvbGRMaW5lKGEsaSkscz1pP2kuc3RhcnQucm93OkluZmluaXR5KTtpZihhPnIpe3doaWxlKHRoaXMuJGxpbmVzLmdldExlbmd0aCgpPnUrMSl0aGlzLiRsaW5lcy5wb3AoKTticmVha31vPXRoaXMuJGxpbmVzLmdldCgrK3UpLG8/by5yb3c9YToobz10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKGEsZSx0aGlzLnNlc3Npb24sZiksdGhpcy4kbGluZXMucHVzaChvKSksdGhpcy4kcmVuZGVyQ2VsbChvLGUsaSxhKSxhKyt9dGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpLHRoaXMuJHVwZGF0ZUd1dHRlcldpZHRoKGUpfSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24sbj10Lmd1dHRlclJlbmRlcmVyfHx0aGlzLiRyZW5kZXJlcixyPXQuJGZpcnN0TGluZU51bWJlcixpPXRoaXMuJGxpbmVzLmxhc3QoKT90aGlzLiRsaW5lcy5sYXN0KCkudGV4dDoiIjtpZih0aGlzLiRmaXhlZFdpZHRofHx0LiR1c2VXcmFwTW9kZSlpPXQuZ2V0TGVuZ3RoKCkrci0xO3ZhciBzPW4/bi5nZXRXaWR0aCh0LGksZSk6aS50b1N0cmluZygpLmxlbmd0aCplLmNoYXJhY3RlcldpZHRoLG89dGhpcy4kcGFkZGluZ3x8dGhpcy4kY29tcHV0ZVBhZGRpbmcoKTtzKz1vLmxlZnQrby5yaWdodCxzIT09dGhpcy5ndXR0ZXJXaWR0aCYmIWlzTmFOKHMpJiYodGhpcy5ndXR0ZXJXaWR0aD1zLHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnN0eWxlLndpZHRoPXRoaXMuZWxlbWVudC5zdHlsZS53aWR0aD1NYXRoLmNlaWwodGhpcy5ndXR0ZXJXaWR0aCkrInB4Iix0aGlzLl9zaWduYWwoImNoYW5nZUd1dHRlcldpZHRoIixzKSl9LHRoaXMuJHVwZGF0ZUN1cnNvclJvdz1mdW5jdGlvbigpe2lmKCF0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmdldEN1cnNvcigpO2lmKHRoaXMuJGN1cnNvclJvdz09PWUucm93KXJldHVybjt0aGlzLiRjdXJzb3JSb3c9ZS5yb3d9LHRoaXMudXBkYXRlTGluZUhpZ2hsaWdodD1mdW5jdGlvbigpe2lmKCF0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lKXJldHVybjt2YXIgZT10aGlzLnNlc3Npb24uc2VsZWN0aW9uLmN1cnNvci5yb3c7dGhpcy4kY3Vyc29yUm93PWU7aWYodGhpcy4kY3Vyc29yQ2VsbCYmdGhpcy4kY3Vyc29yQ2VsbC5yb3c9PWUpcmV0dXJuO3RoaXMuJGN1cnNvckNlbGwmJih0aGlzLiRjdXJzb3JDZWxsLmVsZW1lbnQuY2xhc3NOYW1lPXRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWUucmVwbGFjZSgiYWNlX2d1dHRlci1hY3RpdmUtbGluZSAiLCIiKSk7dmFyIHQ9dGhpcy4kbGluZXMuY2VsbHM7dGhpcy4kY3Vyc29yQ2VsbD1udWxsO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO2lmKHIucm93Pj10aGlzLiRjdXJzb3JSb3cpe2lmKHIucm93PnRoaXMuJGN1cnNvclJvdyl7dmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRMaW5lKHRoaXMuJGN1cnNvclJvdyk7aWYoIShuPjAmJmkmJmkuc3RhcnQucm93PT10W24tMV0ucm93KSlicmVhaztyPXRbbi0xXX1yLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIrci5lbGVtZW50LmNsYXNzTmFtZSx0aGlzLiRjdXJzb3JDZWxsPXI7YnJlYWt9fX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmZpZzt0aGlzLmNvbmZpZz1lLHRoaXMuJHVwZGF0ZUN1cnNvclJvdygpO2lmKHRoaXMuJGxpbmVzLnBhZ2VDaGFuZ2VkKHQsZSkpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSk7dmFyIG49TWF0aC5taW4oZS5sYXN0Um93K2UuZ3V0dGVyT2Zmc2V0LHRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xKSxyPXRoaXMub2xkTGFzdFJvdzt0aGlzLm9sZExhc3RSb3c9bjtpZighdHx8cjxlLmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZihuPHQuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKHQuZmlyc3RSb3c8ZS5maXJzdFJvdylmb3IodmFyIGk9dGhpcy5zZXNzaW9uLmdldEZvbGRlZFJvd0NvdW50KHQuZmlyc3RSb3csZS5maXJzdFJvdy0xKTtpPjA7aS0tKXRoaXMuJGxpbmVzLnNoaWZ0KCk7aWYocj5uKWZvcih2YXIgaT10aGlzLnNlc3Npb24uZ2V0Rm9sZGVkUm93Q291bnQobisxLHIpO2k+MDtpLS0pdGhpcy4kbGluZXMucG9wKCk7ZS5maXJzdFJvdzx0LmZpcnN0Um93JiZ0aGlzLiRsaW5lcy51bnNoaWZ0KHRoaXMuJHJlbmRlckxpbmVzKGUsZS5maXJzdFJvdyx0LmZpcnN0Um93LTEpKSxuPnImJnRoaXMuJGxpbmVzLnB1c2godGhpcy4kcmVuZGVyTGluZXMoZSxyKzEsbikpLHRoaXMudXBkYXRlTGluZUhpZ2hsaWdodCgpLHRoaXMuX3NpZ25hbCgiYWZ0ZXJSZW5kZXIiKSx0aGlzLiR1cGRhdGVHdXR0ZXJXaWR0aChlKX0sdGhpcy4kcmVuZGVyTGluZXM9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPVtdLGk9dCxzPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoaSksbz1zP3Muc3RhcnQucm93OkluZmluaXR5O2Zvcig7Oyl7aT5vJiYoaT1zLmVuZC5yb3crMSxzPXRoaXMuc2Vzc2lvbi5nZXROZXh0Rm9sZExpbmUoaSxzKSxvPXM/cy5zdGFydC5yb3c6SW5maW5pdHkpO2lmKGk+bilicmVhazt2YXIgdT10aGlzLiRsaW5lcy5jcmVhdGVDZWxsKGksZSx0aGlzLnNlc3Npb24sZik7dGhpcy4kcmVuZGVyQ2VsbCh1LGUscyxpKSxyLnB1c2godSksaSsrfXJldHVybiByfSx0aGlzLiRyZW5kZXJDZWxsPWZ1bmN0aW9uKGUsdCxuLGkpe3ZhciBzPWUuZWxlbWVudCxvPXRoaXMuc2Vzc2lvbix1PXMuY2hpbGROb2Rlc1swXSxhPXMuY2hpbGROb2Rlc1sxXSxmPW8uJGZpcnN0TGluZU51bWJlcixsPW8uJGJyZWFrcG9pbnRzLGM9by4kZGVjb3JhdGlvbnMsaD1vLmd1dHRlclJlbmRlcmVyfHx0aGlzLiRyZW5kZXJlcixwPXRoaXMuJHNob3dGb2xkV2lkZ2V0cyYmby5mb2xkV2lkZ2V0cyxkPW4/bi5zdGFydC5yb3c6TnVtYmVyLk1BWF9WQUxVRSx2PSJhY2VfZ3V0dGVyLWNlbGwgIjt0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lJiYoaT09dGhpcy4kY3Vyc29yUm93fHxuJiZpPHRoaXMuJGN1cnNvclJvdyYmaT49ZCYmdGhpcy4kY3Vyc29yUm93PD1uLmVuZC5yb3cpJiYodis9ImFjZV9ndXR0ZXItYWN0aXZlLWxpbmUgIix0aGlzLiRjdXJzb3JDZWxsIT1lJiYodGhpcy4kY3Vyc29yQ2VsbCYmKHRoaXMuJGN1cnNvckNlbGwuZWxlbWVudC5jbGFzc05hbWU9dGhpcy4kY3Vyc29yQ2VsbC5lbGVtZW50LmNsYXNzTmFtZS5yZXBsYWNlKCJhY2VfZ3V0dGVyLWFjdGl2ZS1saW5lICIsIiIpKSx0aGlzLiRjdXJzb3JDZWxsPWUpKSxsW2ldJiYodis9bFtpXSksY1tpXSYmKHYrPWNbaV0pLHRoaXMuJGFubm90YXRpb25zW2ldJiYodis9dGhpcy4kYW5ub3RhdGlvbnNbaV0uY2xhc3NOYW1lKSxzLmNsYXNzTmFtZSE9diYmKHMuY2xhc3NOYW1lPXYpO2lmKHApe3ZhciBtPXBbaV07bT09bnVsbCYmKG09cFtpXT1vLmdldEZvbGRXaWRnZXQoaSkpfWlmKG0pe3ZhciB2PSJhY2VfZm9sZC13aWRnZXQgYWNlXyIrbTttPT0ic3RhcnQiJiZpPT1kJiZpPG4uZW5kLnJvdz92Kz0iIGFjZV9jbG9zZWQiOnYrPSIgYWNlX29wZW4iLGEuY2xhc3NOYW1lIT12JiYoYS5jbGFzc05hbWU9dik7dmFyIGc9dC5saW5lSGVpZ2h0KyJweCI7ci5zZXRTdHlsZShhLnN0eWxlLCJoZWlnaHQiLGcpLHIuc2V0U3R5bGUoYS5zdHlsZSwiZGlzcGxheSIsImlubGluZS1ibG9jayIpfWVsc2UgYSYmci5zZXRTdHlsZShhLnN0eWxlLCJkaXNwbGF5Iiwibm9uZSIpO3ZhciB5PShoP2guZ2V0VGV4dChvLGkpOmkrZikudG9TdHJpbmcoKTtyZXR1cm4geSE9PXUuZGF0YSYmKHUuZGF0YT15KSxyLnNldFN0eWxlKGUuZWxlbWVudC5zdHlsZSwiaGVpZ2h0Iix0aGlzLiRsaW5lcy5jb21wdXRlTGluZUhlaWdodChpLHQsbykrInB4Iiksci5zZXRTdHlsZShlLmVsZW1lbnQuc3R5bGUsInRvcCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVUb3AoaSx0LG8pKyJweCIpLGUudGV4dD15LGV9LHRoaXMuJGZpeGVkV2lkdGg9ITEsdGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZT0hMCx0aGlzLiRyZW5kZXJlcj0iIix0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy4kaGlnaGxpZ2h0R3V0dGVyTGluZT1lfSx0aGlzLiRzaG93TGluZU51bWJlcnM9ITAsdGhpcy4kcmVuZGVyZXI9IiIsdGhpcy5zZXRTaG93TGluZU51bWJlcnM9ZnVuY3Rpb24oZSl7dGhpcy4kcmVuZGVyZXI9IWUmJntnZXRXaWR0aDpmdW5jdGlvbigpe3JldHVybiAwfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuIiJ9fX0sdGhpcy5nZXRTaG93TGluZU51bWJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kc2hvd0xpbmVOdW1iZXJzfSx0aGlzLiRzaG93Rm9sZFdpZGdldHM9ITAsdGhpcy5zZXRTaG93Rm9sZFdpZGdldHM9ZnVuY3Rpb24oZSl7ZT9yLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2ZvbGRpbmctZW5hYmxlZCIpOnIucmVtb3ZlQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2VfZm9sZGluZy1lbmFibGVkIiksdGhpcy4kc2hvd0ZvbGRXaWRnZXRzPWUsdGhpcy4kcGFkZGluZz1udWxsfSx0aGlzLmdldFNob3dGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzaG93Rm9sZFdpZGdldHN9LHRoaXMuJGNvbXB1dGVQYWRkaW5nPWZ1bmN0aW9uKCl7aWYoIXRoaXMuZWxlbWVudC5maXJzdENoaWxkKXJldHVybntsZWZ0OjAscmlnaHQ6MH07dmFyIGU9ci5jb21wdXRlZFN0eWxlKHRoaXMuZWxlbWVudC5maXJzdENoaWxkKTtyZXR1cm4gdGhpcy4kcGFkZGluZz17fSx0aGlzLiRwYWRkaW5nLmxlZnQ9KHBhcnNlSW50KGUuYm9yZGVyTGVmdFdpZHRoKXx8MCkrKHBhcnNlSW50KGUucGFkZGluZ0xlZnQpfHwwKSsxLHRoaXMuJHBhZGRpbmcucmlnaHQ9KHBhcnNlSW50KGUuYm9yZGVyUmlnaHRXaWR0aCl8fDApKyhwYXJzZUludChlLnBhZGRpbmdSaWdodCl8fDApLHRoaXMuJHBhZGRpbmd9LHRoaXMuZ2V0UmVnaW9uPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuJHBhZGRpbmd8fHRoaXMuJGNvbXB1dGVQYWRkaW5nKCksbj10aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoZS54PHQubGVmdCtuLmxlZnQpcmV0dXJuIm1hcmtlcnMiO2lmKHRoaXMuJHNob3dGb2xkV2lkZ2V0cyYmZS54Pm4ucmlnaHQtdC5yaWdodClyZXR1cm4iZm9sZFdpZGdldHMifX0pLmNhbGwoYS5wcm90b3R5cGUpLHQuR3V0dGVyPWF9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL3JhbmdlIikuUmFuZ2UsaT1lKCIuLi9saWIvZG9tIikscz1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2VfbGF5ZXIgYWNlX21hcmtlci1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpfTsoZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCxuLHIpe3JldHVybihlPzE6MCl8KHQ/MjowKXwobj80OjApfChyPzg6MCl9dGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWV9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZX0sdGhpcy5zZXRNYXJrZXJzPWZ1bmN0aW9uKGUpe3RoaXMubWFya2Vycz1lfSx0aGlzLmVsdD1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuaSE9LTEmJnRoaXMuZWxlbWVudC5jaGlsZE5vZGVzW3RoaXMuaV07bj90aGlzLmkrKzoobj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQobiksdGhpcy5pPS0xKSxuLnN0eWxlLmNzc1RleHQ9dCxuLmNsYXNzTmFtZT1lfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXtpZighZSlyZXR1cm47dGhpcy5jb25maWc9ZSx0aGlzLmk9MDt2YXIgdDtmb3IodmFyIG4gaW4gdGhpcy5tYXJrZXJzKXt2YXIgcj10aGlzLm1hcmtlcnNbbl07aWYoIXIucmFuZ2Upe3IudXBkYXRlKHQsdGhpcyx0aGlzLnNlc3Npb24sZSk7Y29udGludWV9dmFyIGk9ci5yYW5nZS5jbGlwUm93cyhlLmZpcnN0Um93LGUubGFzdFJvdyk7aWYoaS5pc0VtcHR5KCkpY29udGludWU7aT1pLnRvU2NyZWVuUmFuZ2UodGhpcy5zZXNzaW9uKTtpZihyLnJlbmRlcmVyKXt2YXIgcz10aGlzLiRnZXRUb3AoaS5zdGFydC5yb3csZSksbz10aGlzLiRwYWRkaW5nK2kuc3RhcnQuY29sdW1uKmUuY2hhcmFjdGVyV2lkdGg7ci5yZW5kZXJlcih0LGksbyxzLGUpfWVsc2Ugci50eXBlPT0iZnVsbExpbmUiP3RoaXMuZHJhd0Z1bGxMaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOnIudHlwZT09InNjcmVlbkxpbmUiP3RoaXMuZHJhd1NjcmVlbkxpbmVNYXJrZXIodCxpLHIuY2xhenosZSk6aS5pc011bHRpTGluZSgpP3IudHlwZT09InRleHQiP3RoaXMuZHJhd1RleHRNYXJrZXIodCxpLHIuY2xhenosZSk6dGhpcy5kcmF3TXVsdGlMaW5lTWFya2VyKHQsaSxyLmNsYXp6LGUpOnRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXIodCxpLHIuY2xhenorIiBhY2Vfc3RhcnQiKyIgYWNlX2JyMTUiLGUpfWlmKHRoaXMuaSE9LTEpd2hpbGUodGhpcy5pPHRoaXMuZWxlbWVudC5jaGlsZEVsZW1lbnRDb3VudCl0aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5lbGVtZW50Lmxhc3RDaGlsZCl9LHRoaXMuJGdldFRvcD1mdW5jdGlvbihlLHQpe3JldHVybihlLXQuZmlyc3RSb3dTY3JlZW4pKnQubGluZUhlaWdodH0sdGhpcy5kcmF3VGV4dE1hcmtlcj1mdW5jdGlvbih0LG4saSxzLG8pe3ZhciB1PXRoaXMuc2Vzc2lvbixhPW4uc3RhcnQucm93LGY9bi5lbmQucm93LGw9YSxjPTAsaD0wLHA9dS5nZXRTY3JlZW5MYXN0Um93Q29sdW1uKGwpLGQ9bmV3IHIobCxuLnN0YXJ0LmNvbHVtbixsLGgpO2Zvcig7bDw9ZjtsKyspZC5zdGFydC5yb3c9ZC5lbmQucm93PWwsZC5zdGFydC5jb2x1bW49bD09YT9uLnN0YXJ0LmNvbHVtbjp1LmdldFJvd1dyYXBJbmRlbnQobCksZC5lbmQuY29sdW1uPXAsYz1oLGg9cCxwPWwrMTxmP3UuZ2V0U2NyZWVuTGFzdFJvd0NvbHVtbihsKzEpOmw9PWY/MDpuLmVuZC5jb2x1bW4sdGhpcy5kcmF3U2luZ2xlTGluZU1hcmtlcih0LGQsaSsobD09YT8iIGFjZV9zdGFydCI6IiIpKyIgYWNlX2JyIitlKGw9PWF8fGw9PWErMSYmbi5zdGFydC5jb2x1bW4sYzxoLGg+cCxsPT1mKSxzLGw9PWY/MDoxLG8pfSx0aGlzLmRyYXdNdWx0aUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRwYWRkaW5nLG89ci5saW5lSGVpZ2h0LHU9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGE9cyt0LnN0YXJ0LmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO2k9aXx8IiI7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5zdGFydC5yb3cpKXt2YXIgZj10LmNsb25lKCk7Zi5lbmQucm93PWYuc3RhcnQucm93LGYuZW5kLmNvbHVtbj10aGlzLnNlc3Npb24uZ2V0TGluZShmLnN0YXJ0LnJvdykubGVuZ3RoLHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsZixuKyIgYWNlX2JyMSBhY2Vfc3RhcnQiLHIsbnVsbCxpKX1lbHNlIHRoaXMuZWx0KG4rIiBhY2VfYnIxIGFjZV9zdGFydCIsImhlaWdodDoiK28rInB4OyIrInJpZ2h0OjA7IisidG9wOiIrdSsicHg7bGVmdDoiK2ErInB4OyIrKGl8fCIiKSk7aWYodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3codC5lbmQucm93KSl7dmFyIGY9dC5jbG9uZSgpO2Yuc3RhcnQucm93PWYuZW5kLnJvdyxmLnN0YXJ0LmNvbHVtbj0wLHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyKGUsZixuKyIgYWNlX2JyMTIiLHIsbnVsbCxpKX1lbHNle3U9dGhpcy4kZ2V0VG9wKHQuZW5kLnJvdyxyKTt2YXIgbD10LmVuZC5jb2x1bW4qci5jaGFyYWN0ZXJXaWR0aDt0aGlzLmVsdChuKyIgYWNlX2JyMTIiLCJoZWlnaHQ6IitvKyJweDsiKyJ3aWR0aDoiK2wrInB4OyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IitzKyJweDsiKyhpfHwiIikpfW89KHQuZW5kLnJvdy10LnN0YXJ0LnJvdy0xKSpyLmxpbmVIZWlnaHQ7aWYobzw9MClyZXR1cm47dT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3crMSxyKTt2YXIgYz0odC5zdGFydC5jb2x1bW4/MTowKXwodC5lbmQuY29sdW1uPzA6OCk7dGhpcy5lbHQobisoYz8iIGFjZV9iciIrYzoiIiksImhlaWdodDoiK28rInB4OyIrInJpZ2h0OjA7IisidG9wOiIrdSsicHg7IisibGVmdDoiK3MrInB4OyIrKGl8fCIiKSl9LHRoaXMuZHJhd1NpbmdsZUxpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpLHMpe2lmKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KHQuc3RhcnQucm93KSlyZXR1cm4gdGhpcy5kcmF3QmlkaVNpbmdsZUxpbmVNYXJrZXIoZSx0LG4scixpLHMpO3ZhciBvPXIubGluZUhlaWdodCx1PSh0LmVuZC5jb2x1bW4rKGl8fDApLXQuc3RhcnQuY29sdW1uKSpyLmNoYXJhY3RlcldpZHRoLGE9dGhpcy4kZ2V0VG9wKHQuc3RhcnQucm93LHIpLGY9dGhpcy4kcGFkZGluZyt0LnN0YXJ0LmNvbHVtbipyLmNoYXJhY3RlcldpZHRoO3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrdSsicHg7IisidG9wOiIrYSsicHg7IisibGVmdDoiK2YrInB4OyIrKHN8fCIiKSl9LHRoaXMuZHJhd0JpZGlTaW5nbGVMaW5lTWFya2VyPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt2YXIgbz1yLmxpbmVIZWlnaHQsdT10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksYT10aGlzLiRwYWRkaW5nLGY9dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRTZWxlY3Rpb25zKHQuc3RhcnQuY29sdW1uLHQuZW5kLmNvbHVtbik7Zi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3RoaXMuZWx0KG4sImhlaWdodDoiK28rInB4OyIrIndpZHRoOiIrZS53aWR0aCsoaXx8MCkrInB4OyIrInRvcDoiK3UrInB4OyIrImxlZnQ6IisoYStlLmxlZnQpKyJweDsiKyhzfHwiIikpfSx0aGlzKX0sdGhpcy5kcmF3RnVsbExpbmVNYXJrZXI9ZnVuY3Rpb24oZSx0LG4scixpKXt2YXIgcz10aGlzLiRnZXRUb3AodC5zdGFydC5yb3csciksbz1yLmxpbmVIZWlnaHQ7dC5zdGFydC5yb3chPXQuZW5kLnJvdyYmKG8rPXRoaXMuJGdldFRvcCh0LmVuZC5yb3csciktcyksdGhpcy5lbHQobiwiaGVpZ2h0OiIrbysicHg7IisidG9wOiIrcysicHg7IisibGVmdDowO3JpZ2h0OjA7IisoaXx8IiIpKX0sdGhpcy5kcmF3U2NyZWVuTGluZU1hcmtlcj1mdW5jdGlvbihlLHQsbixyLGkpe3ZhciBzPXRoaXMuJGdldFRvcCh0LnN0YXJ0LnJvdyxyKSxvPXIubGluZUhlaWdodDt0aGlzLmVsdChuLCJoZWlnaHQ6IitvKyJweDsiKyJ0b3A6IitzKyJweDsiKyJsZWZ0OjA7cmlnaHQ6MDsiKyhpfHwiIikpfX0pLmNhbGwocy5wcm90b3R5cGUpLHQuTWFya2VyPXN9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvdGV4dCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGF5ZXIvbGluZXMiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL2xpYi9sYW5nIiksbz1lKCIuL2xpbmVzIikuTGluZXMsdT1lKCIuLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcixhPWZ1bmN0aW9uKGUpe3RoaXMuZG9tPWksdGhpcy5lbGVtZW50PXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfdGV4dC1sYXllciIsZS5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpLHRoaXMuJHVwZGF0ZUVvbENoYXI9dGhpcy4kdXBkYXRlRW9sQ2hhci5iaW5kKHRoaXMpLHRoaXMuJGxpbmVzPW5ldyBvKHRoaXMuZWxlbWVudCl9OyhmdW5jdGlvbigpe3IuaW1wbGVtZW50KHRoaXMsdSksdGhpcy5FT0ZfQ0hBUj0iXHUwMGI2Iix0aGlzLkVPTF9DSEFSX0xGPSJcdTAwYWMiLHRoaXMuRU9MX0NIQVJfQ1JMRj0iXHUwMGE0Iix0aGlzLkVPTF9DSEFSPXRoaXMuRU9MX0NIQVJfTEYsdGhpcy5UQUJfQ0hBUj0iXHUyMDE0Iix0aGlzLlNQQUNFX0NIQVI9Ilx1MDBiNyIsdGhpcy4kcGFkZGluZz0wLHRoaXMuTUFYX0xJTkVfTEVOR1RIPTFlNCx0aGlzLiR1cGRhdGVFb2xDaGFyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmRvYyx0PWUuZ2V0TmV3TGluZUNoYXJhY3RlcigpPT0iXG4iJiZlLmdldE5ld0xpbmVNb2RlKCkhPSJ3aW5kb3dzIixuPXQ/dGhpcy5FT0xfQ0hBUl9MRjp0aGlzLkVPTF9DSEFSX0NSTEY7aWYodGhpcy5FT0xfQ0hBUiE9bilyZXR1cm4gdGhpcy5FT0xfQ0hBUj1uLCEwfSx0aGlzLnNldFBhZGRpbmc9ZnVuY3Rpb24oZSl7dGhpcy4kcGFkZGluZz1lLHRoaXMuZWxlbWVudC5zdHlsZS5tYXJnaW49IjAgIitlKyJweCJ9LHRoaXMuZ2V0TGluZUhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRmb250TWV0cmljcy4kY2hhcmFjdGVyU2l6ZS5oZWlnaHR8fDB9LHRoaXMuZ2V0Q2hhcmFjdGVyV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kZm9udE1ldHJpY3MuJGNoYXJhY3RlclNpemUud2lkdGh8fDB9LHRoaXMuJHNldEZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe3RoaXMuJGZvbnRNZXRyaWNzPWUsdGhpcy4kZm9udE1ldHJpY3Mub24oImNoYW5nZUNoYXJhY3RlclNpemUiLGZ1bmN0aW9uKGUpe3RoaXMuX3NpZ25hbCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZSl9LmJpbmQodGhpcykpLHRoaXMuJHBvbGxTaXplQ2hhbmdlcygpfSx0aGlzLmNoZWNrRm9yU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXt0aGlzLiRmb250TWV0cmljcy5jaGVja0ZvclNpemVDaGFuZ2VzKCl9LHRoaXMuJHBvbGxTaXplQ2hhbmdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcj10aGlzLiRmb250TWV0cmljcy4kcG9sbFNpemVDaGFuZ2VzKCl9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZSxlJiZ0aGlzLiRjb21wdXRlVGFiU3RyaW5nKCl9LHRoaXMuc2hvd0ludmlzaWJsZXM9ITEsdGhpcy5zZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zaG93SW52aXNpYmxlcz09ZT8hMToodGhpcy5zaG93SW52aXNpYmxlcz1lLHRoaXMuJGNvbXB1dGVUYWJTdHJpbmcoKSwhMCl9LHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz0hMCx0aGlzLnNldERpc3BsYXlJbmRlbnRHdWlkZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZGlzcGxheUluZGVudEd1aWRlcz09ZT8hMToodGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzPWUsdGhpcy4kY29tcHV0ZVRhYlN0cmluZygpLCEwKX0sdGhpcy4kdGFiU3RyaW5ncz1bXSx0aGlzLm9uQ2hhbmdlVGFiU2l6ZT10aGlzLiRjb21wdXRlVGFiU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFRhYlNpemUoKTt0aGlzLnRhYlNpemU9ZTt2YXIgdD10aGlzLiR0YWJTdHJpbmdzPVswXTtmb3IodmFyIG49MTtuPGUrMTtuKyspaWYodGhpcy5zaG93SW52aXNpYmxlcyl7dmFyIHI9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3IuY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfdGFiIixyLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KHRoaXMuVEFCX0NIQVIsbiksdC5wdXNoKHIpfWVsc2UgdC5wdXNoKHRoaXMuZG9tLmNyZWF0ZVRleHROb2RlKHMuc3RyaW5nUmVwZWF0KCIgIixuKSx0aGlzLmVsZW1lbnQpKTtpZih0aGlzLmRpc3BsYXlJbmRlbnRHdWlkZXMpe3RoaXMuJGluZGVudEd1aWRlUmU9L1xzXFN8IFx0fFx0IHxccyQvO3ZhciBpPSJhY2VfaW5kZW50LWd1aWRlIixvPSIiLHU9IiI7aWYodGhpcy5zaG93SW52aXNpYmxlcyl7aSs9IiBhY2VfaW52aXNpYmxlIixvPSIgYWNlX2ludmlzaWJsZV9zcGFjZSIsdT0iIGFjZV9pbnZpc2libGVfdGFiIjt2YXIgYT1zLnN0cmluZ1JlcGVhdCh0aGlzLlNQQUNFX0NIQVIsdGhpcy50YWJTaXplKSxmPXMuc3RyaW5nUmVwZWF0KHRoaXMuVEFCX0NIQVIsdGhpcy50YWJTaXplKX1lbHNlIHZhciBhPXMuc3RyaW5nUmVwZWF0KCIgIix0aGlzLnRhYlNpemUpLGY9YTt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9aStvLHIudGV4dENvbnRlbnQ9YSx0aGlzLiR0YWJTdHJpbmdzWyIgIl09cjt2YXIgcj10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7ci5jbGFzc05hbWU9aSt1LHIudGV4dENvbnRlbnQ9Zix0aGlzLiR0YWJTdHJpbmdzWyIJIl09cn19LHRoaXMudXBkYXRlTGluZXM9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuY29uZmlnLmxhc3RSb3chPWUubGFzdFJvd3x8dGhpcy5jb25maWcuZmlyc3RSb3chPWUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuY29uZmlnPWU7dmFyIHI9TWF0aC5tYXgodCxlLmZpcnN0Um93KSxpPU1hdGgubWluKG4sZS5sYXN0Um93KSxzPXRoaXMuZWxlbWVudC5jaGlsZE5vZGVzLG89MDtmb3IodmFyIHU9ZS5maXJzdFJvdzt1PHI7dSsrKXt2YXIgYT10aGlzLnNlc3Npb24uZ2V0Rm9sZExpbmUodSk7aWYoYSl7aWYoYS5jb250YWluc1JvdyhyKSl7cj1hLnN0YXJ0LnJvdzticmVha311PWEuZW5kLnJvd31vKyt9dmFyIGY9ITEsdT1yLGE9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZSh1KSxsPWE/YS5zdGFydC5yb3c6SW5maW5pdHk7Zm9yKDs7KXt1PmwmJih1PWEuZW5kLnJvdysxLGE9dGhpcy5zZXNzaW9uLmdldE5leHRGb2xkTGluZSh1LGEpLGw9YT9hLnN0YXJ0LnJvdzpJbmZpbml0eSk7aWYodT5pKWJyZWFrO3ZhciBjPXNbbysrXTtpZihjKXt0aGlzLmRvbS5yZW1vdmVDaGlsZHJlbihjKSx0aGlzLiRyZW5kZXJMaW5lKGMsdSx1PT1sP2E6ITEpLGYmJihjLnN0eWxlLnRvcD10aGlzLiRsaW5lcy5jb21wdXRlTGluZVRvcCh1LGUsdGhpcy5zZXNzaW9uKSsicHgiKTt2YXIgaD1lLmxpbmVIZWlnaHQqdGhpcy5zZXNzaW9uLmdldFJvd0xlbmd0aCh1KSsicHgiO2Muc3R5bGUuaGVpZ2h0IT1oJiYoZj0hMCxjLnN0eWxlLmhlaWdodD1oKX11Kyt9aWYoZil3aGlsZShvPHRoaXMuJGxpbmVzLmNlbGxzLmxlbmd0aCl7dmFyIHA9dGhpcy4kbGluZXMuY2VsbHNbbysrXTtwLmVsZW1lbnQuc3R5bGUudG9wPXRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHAucm93LGUsdGhpcy5zZXNzaW9uKSsicHgifX0sdGhpcy5zY3JvbGxMaW5lcz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmZpZzt0aGlzLmNvbmZpZz1lO2lmKHRoaXMuJGxpbmVzLnBhZ2VDaGFuZ2VkKHQsZSkpcmV0dXJuIHRoaXMudXBkYXRlKGUpO3RoaXMuJGxpbmVzLm1vdmVDb250YWluZXIoZSk7dmFyIG49ZS5sYXN0Um93LHI9dD90Lmxhc3RSb3c6LTE7aWYoIXR8fHI8ZS5maXJzdFJvdylyZXR1cm4gdGhpcy51cGRhdGUoZSk7aWYobjx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZighdHx8dC5sYXN0Um93PGUuZmlyc3RSb3cpcmV0dXJuIHRoaXMudXBkYXRlKGUpO2lmKGUubGFzdFJvdzx0LmZpcnN0Um93KXJldHVybiB0aGlzLnVwZGF0ZShlKTtpZih0LmZpcnN0Um93PGUuZmlyc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudCh0LmZpcnN0Um93LGUuZmlyc3RSb3ctMSk7aT4wO2ktLSl0aGlzLiRsaW5lcy5zaGlmdCgpO2lmKHQubGFzdFJvdz5lLmxhc3RSb3cpZm9yKHZhciBpPXRoaXMuc2Vzc2lvbi5nZXRGb2xkZWRSb3dDb3VudChlLmxhc3RSb3crMSx0Lmxhc3RSb3cpO2k+MDtpLS0pdGhpcy4kbGluZXMucG9wKCk7ZS5maXJzdFJvdzx0LmZpcnN0Um93JiZ0aGlzLiRsaW5lcy51bnNoaWZ0KHRoaXMuJHJlbmRlckxpbmVzRnJhZ21lbnQoZSxlLmZpcnN0Um93LHQuZmlyc3RSb3ctMSkpLGUubGFzdFJvdz50Lmxhc3RSb3cmJnRoaXMuJGxpbmVzLnB1c2godGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLHQubGFzdFJvdysxLGUubGFzdFJvdykpfSx0aGlzLiRyZW5kZXJMaW5lc0ZyYWdtZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxzPXQsbz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHMpLHU9bz9vLnN0YXJ0LnJvdzpJbmZpbml0eTtmb3IoOzspe3M+dSYmKHM9by5lbmQucm93KzEsbz10aGlzLnNlc3Npb24uZ2V0TmV4dEZvbGRMaW5lKHMsbyksdT1vP28uc3RhcnQucm93OkluZmluaXR5KTtpZihzPm4pYnJlYWs7dmFyIGE9dGhpcy4kbGluZXMuY3JlYXRlQ2VsbChzLGUsdGhpcy5zZXNzaW9uKSxmPWEuZWxlbWVudDt0aGlzLmRvbS5yZW1vdmVDaGlsZHJlbihmKSxpLnNldFN0eWxlKGYuc3R5bGUsImhlaWdodCIsdGhpcy4kbGluZXMuY29tcHV0ZUxpbmVIZWlnaHQocyxlLHRoaXMuc2Vzc2lvbikrInB4IiksaS5zZXRTdHlsZShmLnN0eWxlLCJ0b3AiLHRoaXMuJGxpbmVzLmNvbXB1dGVMaW5lVG9wKHMsZSx0aGlzLnNlc3Npb24pKyJweCIpLHRoaXMuJHJlbmRlckxpbmUoZixzLHM9PXU/bzohMSksdGhpcy4kdXNlTGluZUdyb3VwcygpP2YuY2xhc3NOYW1lPSJhY2VfbGluZV9ncm91cCI6Zi5jbGFzc05hbWU9ImFjZV9saW5lIixyLnB1c2goYSkscysrfXJldHVybiByfSx0aGlzLnVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLiRsaW5lcy5tb3ZlQ29udGFpbmVyKGUpLHRoaXMuY29uZmlnPWU7dmFyIHQ9ZS5maXJzdFJvdyxuPWUubGFzdFJvdyxyPXRoaXMuJGxpbmVzO3doaWxlKHIuZ2V0TGVuZ3RoKCkpci5wb3AoKTtyLnB1c2godGhpcy4kcmVuZGVyTGluZXNGcmFnbWVudChlLHQsbikpfSx0aGlzLiR0ZXh0VG9rZW49e3RleHQ6ITAscnBhcmVuOiEwLGxwYXJlbjohMH0sdGhpcy4kcmVuZGVyVG9rZW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcyxvPS8oXHQpfCggKyl8KFtceDAwLVx4MWZceDgwLVx4YTBceGFkXHUxNjgwXHUxODBFXHUyMDAwLVx1MjAwZlx1MjAyOFx1MjAyOVx1MjAyRlx1MjA1Rlx1RkVGRlx1RkZGOS1cdUZGRkNdKyl8KFx1MzAwMCl8KFtcdTExMDAtXHUxMTVGXHUxMUEzLVx1MTFBN1x1MTFGQS1cdTExRkZcdTIzMjktXHUyMzJBXHUyRTgwLVx1MkU5OVx1MkU5Qi1cdTJFRjNcdTJGMDAtXHUyRkQ1XHUyRkYwLVx1MkZGQlx1MzAwMS1cdTMwM0VcdTMwNDEtXHUzMDk2XHUzMDk5LVx1MzBGRlx1MzEwNS1cdTMxMkRcdTMxMzEtXHUzMThFXHUzMTkwLVx1MzFCQVx1MzFDMC1cdTMxRTNcdTMxRjAtXHUzMjFFXHUzMjIwLVx1MzI0N1x1MzI1MC1cdTMyRkVcdTMzMDAtXHU0REJGXHU0RTAwLVx1QTQ4Q1x1QTQ5MC1cdUE0QzZcdUE5NjAtXHVBOTdDXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkFGRlx1RkUxMC1cdUZFMTlcdUZFMzAtXHVGRTUyXHVGRTU0LVx1RkU2Nlx1RkU2OC1cdUZFNkJcdUZGMDEtXHVGRjYwXHVGRkUwLVx1RkZFNl18W1x1RDgwMC1cdURCRkZdW1x1REMwMC1cdURGRkZdKS9nLHU9dGhpcy5kb20uY3JlYXRlRnJhZ21lbnQodGhpcy5lbGVtZW50KSxhLGY9MDt3aGlsZShhPW8uZXhlYyhyKSl7dmFyIGw9YVsxXSxjPWFbMl0saD1hWzNdLHA9YVs0XSxkPWFbNV07aWYoIWkuc2hvd0ludmlzaWJsZXMmJmMpY29udGludWU7dmFyIHY9ZiE9YS5pbmRleD9yLnNsaWNlKGYsYS5pbmRleCk6IiI7Zj1hLmluZGV4K2FbMF0ubGVuZ3RoLHYmJnUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUodix0aGlzLmVsZW1lbnQpKTtpZihsKXt2YXIgbT1pLnNlc3Npb24uZ2V0U2NyZWVuVGFiU2l6ZSh0K2EuaW5kZXgpO3UuYXBwZW5kQ2hpbGQoaS4kdGFiU3RyaW5nc1ttXS5jbG9uZU5vZGUoITApKSx0Kz1tLTF9ZWxzZSBpZihjKWlmKGkuc2hvd0ludmlzaWJsZXMpe3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIixnLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KGkuU1BBQ0VfQ0hBUixjLmxlbmd0aCksdS5hcHBlbmRDaGlsZChnKX1lbHNlIHUuYXBwZW5kQ2hpbGQodGhpcy5jb20uY3JlYXRlVGV4dE5vZGUoYyx0aGlzLmVsZW1lbnQpKTtlbHNlIGlmKGgpe3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLmNsYXNzTmFtZT0iYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIGFjZV9pbnZhbGlkIixnLnRleHRDb250ZW50PXMuc3RyaW5nUmVwZWF0KGkuU1BBQ0VfQ0hBUixoLmxlbmd0aCksdS5hcHBlbmRDaGlsZChnKX1lbHNlIGlmKHApe3QrPTE7dmFyIGc9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO2cuc3R5bGUud2lkdGg9aS5jb25maWcuY2hhcmFjdGVyV2lkdGgqMisicHgiLGcuY2xhc3NOYW1lPWkuc2hvd0ludmlzaWJsZXM/ImFjZV9jamsgYWNlX2ludmlzaWJsZSBhY2VfaW52aXNpYmxlX3NwYWNlIjoiYWNlX2NqayIsZy50ZXh0Q29udGVudD1pLnNob3dJbnZpc2libGVzP2kuU1BBQ0VfQ0hBUjpwLHUuYXBwZW5kQ2hpbGQoZyl9ZWxzZSBpZihkKXt0Kz0xO3ZhciBnPXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtnLnN0eWxlLndpZHRoPWkuY29uZmlnLmNoYXJhY3RlcldpZHRoKjIrInB4IixnLmNsYXNzTmFtZT0iYWNlX2NqayIsZy50ZXh0Q29udGVudD1kLHUuYXBwZW5kQ2hpbGQoZyl9fXUuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUoZj9yLnNsaWNlKGYpOnIsdGhpcy5lbGVtZW50KSk7aWYoIXRoaXMuJHRleHRUb2tlbltuLnR5cGVdKXt2YXIgeT0iYWNlXyIrbi50eXBlLnJlcGxhY2UoL1wuL2csIiBhY2VfIiksZz10aGlzLmRvbS5jcmVhdGVFbGVtZW50KCJzcGFuIik7bi50eXBlPT0iZm9sZCImJihnLnN0eWxlLndpZHRoPW4udmFsdWUubGVuZ3RoKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKyJweCIpLGcuY2xhc3NOYW1lPXksZy5hcHBlbmRDaGlsZCh1KSxlLmFwcGVuZENoaWxkKGcpfWVsc2UgZS5hcHBlbmRDaGlsZCh1KTtyZXR1cm4gdCtyLmxlbmd0aH0sdGhpcy5yZW5kZXJJbmRlbnRHdWlkZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5zZWFyY2godGhpcy4kaW5kZW50R3VpZGVSZSk7aWYocjw9MHx8cj49bilyZXR1cm4gdDtpZih0WzBdPT0iICIpe3ItPXIldGhpcy50YWJTaXplO3ZhciBpPXIvdGhpcy50YWJTaXplO2Zvcih2YXIgcz0wO3M8aTtzKyspZS5hcHBlbmRDaGlsZCh0aGlzLiR0YWJTdHJpbmdzWyIgIl0uY2xvbmVOb2RlKCEwKSk7cmV0dXJuIHQuc3Vic3RyKHIpfWlmKHRbMF09PSIJIil7Zm9yKHZhciBzPTA7czxyO3MrKyllLmFwcGVuZENoaWxkKHRoaXMuJHRhYlN0cmluZ3NbIgkiXS5jbG9uZU5vZGUoITApKTtyZXR1cm4gdC5zdWJzdHIocil9cmV0dXJuIHR9LHRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZG9tLmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmNsYXNzTmFtZT0iYWNlX2xpbmUiLHQuc3R5bGUuaGVpZ2h0PXRoaXMuY29uZmlnLmxpbmVIZWlnaHQrInB4Iix0fSx0aGlzLiRyZW5kZXJXcmFwcGVkTGluZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9MCxpPTAsbz1uWzBdLHU9MCxhPXRoaXMuJGNyZWF0ZUxpbmVFbGVtZW50KCk7ZS5hcHBlbmRDaGlsZChhKTtmb3IodmFyIGY9MDtmPHQubGVuZ3RoO2YrKyl7dmFyIGw9dFtmXSxjPWwudmFsdWU7aWYoZj09MCYmdGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzKXtyPWMubGVuZ3RoLGM9dGhpcy5yZW5kZXJJbmRlbnRHdWlkZShhLGMsbyk7aWYoIWMpY29udGludWU7ci09Yy5sZW5ndGh9aWYocitjLmxlbmd0aDxvKXU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYykscis9Yy5sZW5ndGg7ZWxzZXt3aGlsZShyK2MubGVuZ3RoPj1vKXU9dGhpcy4kcmVuZGVyVG9rZW4oYSx1LGwsYy5zdWJzdHJpbmcoMCxvLXIpKSxjPWMuc3Vic3RyaW5nKG8tcikscj1vLGE9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGEpLGEuYXBwZW5kQ2hpbGQodGhpcy5kb20uY3JlYXRlVGV4dE5vZGUocy5zdHJpbmdSZXBlYXQoIlx1MDBhMCIsbi5pbmRlbnQpLHRoaXMuZWxlbWVudCkpLGkrKyx1PTAsbz1uW2ldfHxOdW1iZXIuTUFYX1ZBTFVFO2MubGVuZ3RoIT0wJiYocis9Yy5sZW5ndGgsdT10aGlzLiRyZW5kZXJUb2tlbihhLHUsbCxjKSl9fW5bbi5sZW5ndGgtMV0+dGhpcy5NQVhfTElORV9MRU5HVEgmJnRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZShhLHUsbnVsbCwiIiwhMCl9LHRoaXMuJHJlbmRlclNpbXBsZUxpbmU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0wLHI9dFswXSxpPXIudmFsdWU7dGhpcy5kaXNwbGF5SW5kZW50R3VpZGVzJiYoaT10aGlzLnJlbmRlckluZGVudEd1aWRlKGUsaSkpLGkmJihuPXRoaXMuJHJlbmRlclRva2VuKGUsbixyLGkpKTtmb3IodmFyIHM9MTtzPHQubGVuZ3RoO3MrKyl7cj10W3NdLGk9ci52YWx1ZTtpZihuK2kubGVuZ3RoPnRoaXMuTUFYX0xJTkVfTEVOR1RIKXJldHVybiB0aGlzLiRyZW5kZXJPdmVyZmxvd01lc3NhZ2UoZSxuLHIsaSk7bj10aGlzLiRyZW5kZXJUb2tlbihlLG4scixpKX19LHRoaXMuJHJlbmRlck92ZXJmbG93TWVzc2FnZT1mdW5jdGlvbihlLHQsbixyLGkpe24mJnRoaXMuJHJlbmRlclRva2VuKGUsdCxuLHIuc2xpY2UoMCx0aGlzLk1BWF9MSU5FX0xFTkdUSC10KSk7dmFyIHM9dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO3MuY2xhc3NOYW1lPSJhY2VfaW5saW5lX2J1dHRvbiBhY2Vfa2V5d29yZCBhY2VfdG9nZ2xlX3dyYXAiLHMudGV4dENvbnRlbnQ9aT8iPGhpZGU+IjoiPGNsaWNrIHRvIHNlZSBtb3JlLi4uPiIsZS5hcHBlbmRDaGlsZChzKX0sdGhpcy4kcmVuZGVyTGluZT1mdW5jdGlvbihlLHQsbil7IW4mJm4hPTAmJihuPXRoaXMuc2Vzc2lvbi5nZXRGb2xkTGluZSh0KSk7aWYobil2YXIgcj10aGlzLiRnZXRGb2xkTGluZVRva2Vucyh0LG4pO2Vsc2UgdmFyIHI9dGhpcy5zZXNzaW9uLmdldFRva2Vucyh0KTt2YXIgaT1lO2lmKHIubGVuZ3RoKXt2YXIgcz10aGlzLnNlc3Npb24uZ2V0Um93U3BsaXREYXRhKHQpO2lmKHMmJnMubGVuZ3RoKXt0aGlzLiRyZW5kZXJXcmFwcGVkTGluZShlLHIscyk7dmFyIGk9ZS5sYXN0Q2hpbGR9ZWxzZXt2YXIgaT1lO3RoaXMuJHVzZUxpbmVHcm91cHMoKSYmKGk9dGhpcy4kY3JlYXRlTGluZUVsZW1lbnQoKSxlLmFwcGVuZENoaWxkKGkpKSx0aGlzLiRyZW5kZXJTaW1wbGVMaW5lKGkscil9fWVsc2UgdGhpcy4kdXNlTGluZUdyb3VwcygpJiYoaT10aGlzLiRjcmVhdGVMaW5lRWxlbWVudCgpLGUuYXBwZW5kQ2hpbGQoaSkpO2lmKHRoaXMuc2hvd0ludmlzaWJsZXMmJmkpe24mJih0PW4uZW5kLnJvdyk7dmFyIG89dGhpcy5kb20uY3JlYXRlRWxlbWVudCgic3BhbiIpO28uY2xhc3NOYW1lPSJhY2VfaW52aXNpYmxlIGFjZV9pbnZpc2libGVfZW9sIixvLnRleHRDb250ZW50PXQ9PXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKS0xP3RoaXMuRU9GX0NIQVI6dGhpcy5FT0xfQ0hBUixpLmFwcGVuZENoaWxkKG8pfX0sdGhpcy4kZ2V0Rm9sZExpbmVUb2tlbnM9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBpKGUsdCxuKXt2YXIgaT0wLHM9MDt3aGlsZShzK2VbaV0udmFsdWUubGVuZ3RoPHQpe3MrPWVbaV0udmFsdWUubGVuZ3RoLGkrKztpZihpPT1lLmxlbmd0aClyZXR1cm59aWYocyE9dCl7dmFyIG89ZVtpXS52YWx1ZS5zdWJzdHJpbmcodC1zKTtvLmxlbmd0aD5uLXQmJihvPW8uc3Vic3RyaW5nKDAsbi10KSksci5wdXNoKHt0eXBlOmVbaV0udHlwZSx2YWx1ZTpvfSkscz10K28ubGVuZ3RoLGkrPTF9d2hpbGUoczxuJiZpPGUubGVuZ3RoKXt2YXIgbz1lW2ldLnZhbHVlO28ubGVuZ3RoK3M+bj9yLnB1c2goe3R5cGU6ZVtpXS50eXBlLHZhbHVlOm8uc3Vic3RyaW5nKDAsbi1zKX0pOnIucHVzaChlW2ldKSxzKz1vLmxlbmd0aCxpKz0xfX12YXIgbj10aGlzLnNlc3Npb24scj1bXSxzPW4uZ2V0VG9rZW5zKGUpO3JldHVybiB0LndhbGsoZnVuY3Rpb24oZSx0LG8sdSxhKXtlIT1udWxsP3IucHVzaCh7dHlwZToiZm9sZCIsdmFsdWU6ZX0pOihhJiYocz1uLmdldFRva2Vucyh0KSkscy5sZW5ndGgmJmkocyx1LG8pKX0sdC5lbmQucm93LHRoaXMuc2Vzc2lvbi5nZXRMaW5lKHQuZW5kLnJvdykubGVuZ3RoKSxyfSx0aGlzLiR1c2VMaW5lR3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRVc2VXcmFwTW9kZSgpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9fSkuY2FsbChhLnByb3RvdHlwZSksdC5UZXh0PWF9KSxhY2UuZGVmaW5lKCJhY2UvbGF5ZXIvY3Vyc29yIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9kb20iXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9kb20iKSxpPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudD1yLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuZWxlbWVudC5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfY3Vyc29yLWxheWVyIixlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5pc1Zpc2libGU9ITEsdGhpcy5pc0JsaW5raW5nPSEwLHRoaXMuYmxpbmtJbnRlcnZhbD0xZTMsdGhpcy5zbW9vdGhCbGlua2luZz0hMSx0aGlzLmN1cnNvcnM9W10sdGhpcy5jdXJzb3I9dGhpcy5hZGRDdXJzb3IoKSxyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy4kdXBkYXRlQ3Vyc29ycz10aGlzLiR1cGRhdGVPcGFjaXR5LmJpbmQodGhpcyl9OyhmdW5jdGlvbigpe3RoaXMuJHVwZGF0ZU9wYWNpdHk9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jdXJzb3JzO2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KXIuc2V0U3R5bGUodFtuXS5zdHlsZSwib3BhY2l0eSIsZT8iIjoiMCIpfSx0aGlzLiRzdGFydENzc0FuaW1hdGlvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuY3Vyc29ycztmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyllW3RdLnN0eWxlLmFuaW1hdGlvbkR1cmF0aW9uPXRoaXMuYmxpbmtJbnRlcnZhbCsibXMiO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2FuaW1hdGUtYmxpbmtpbmciKX0uYmluZCh0aGlzKSl9LHRoaXMuJHN0b3BDc3NBbmltYXRpb249ZnVuY3Rpb24oKXtyLnJlbW92ZUNzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2FuaW1hdGUtYmxpbmtpbmciKX0sdGhpcy4kcGFkZGluZz0wLHRoaXMuc2V0UGFkZGluZz1mdW5jdGlvbihlKXt0aGlzLiRwYWRkaW5nPWV9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb249ZX0sdGhpcy5zZXRCbGlua2luZz1mdW5jdGlvbihlKXtlIT10aGlzLmlzQmxpbmtpbmcmJih0aGlzLmlzQmxpbmtpbmc9ZSx0aGlzLnJlc3RhcnRUaW1lcigpKX0sdGhpcy5zZXRCbGlua0ludGVydmFsPWZ1bmN0aW9uKGUpe2UhPXRoaXMuYmxpbmtJbnRlcnZhbCYmKHRoaXMuYmxpbmtJbnRlcnZhbD1lLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLnNldFNtb290aEJsaW5raW5nPWZ1bmN0aW9uKGUpe2UhPXRoaXMuc21vb3RoQmxpbmtpbmcmJih0aGlzLnNtb290aEJsaW5raW5nPWUsci5zZXRDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciLGUpLHRoaXMuJHVwZGF0ZUN1cnNvcnMoITApLHRoaXMucmVzdGFydFRpbWVyKCkpfSx0aGlzLmFkZEN1cnNvcj1mdW5jdGlvbigpe3ZhciBlPXIuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuY2xhc3NOYW1lPSJhY2VfY3Vyc29yIix0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoZSksdGhpcy5jdXJzb3JzLnB1c2goZSksZX0sdGhpcy5yZW1vdmVDdXJzb3I9ZnVuY3Rpb24oKXtpZih0aGlzLmN1cnNvcnMubGVuZ3RoPjEpe3ZhciBlPXRoaXMuY3Vyc29ycy5wb3AoKTtyZXR1cm4gZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGV9fSx0aGlzLmhpZGVDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT0hMSxyLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX2hpZGRlbi1jdXJzb3JzIiksdGhpcy5yZXN0YXJ0VGltZXIoKX0sdGhpcy5zaG93Q3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy5pc1Zpc2libGU9ITAsci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9oaWRkZW4tY3Vyc29ycyIpLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMucmVzdGFydFRpbWVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy4kdXBkYXRlQ3Vyc29ycztjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKSx0aGlzLiRzdG9wQ3NzQW5pbWF0aW9uKCksdGhpcy5zbW9vdGhCbGlua2luZyYmci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9zbW9vdGgtYmxpbmtpbmciKSxlKCEwKTtpZighdGhpcy5pc0JsaW5raW5nfHwhdGhpcy5ibGlua0ludGVydmFsfHwhdGhpcy5pc1Zpc2libGUpe3RoaXMuJHN0b3BDc3NBbmltYXRpb24oKTtyZXR1cm59dGhpcy5zbW9vdGhCbGlua2luZyYmc2V0VGltZW91dChmdW5jdGlvbigpe3IuYWRkQ3NzQ2xhc3ModGhpcy5lbGVtZW50LCJhY2Vfc21vb3RoLWJsaW5raW5nIil9LmJpbmQodGhpcykpO2lmKHIuSEFTX0NTU19BTklNQVRJT04pdGhpcy4kc3RhcnRDc3NBbmltYXRpb24oKTtlbHNle3ZhciB0PWZ1bmN0aW9uKCl7dGhpcy50aW1lb3V0SWQ9c2V0VGltZW91dChmdW5jdGlvbigpe2UoITEpfSwuNip0aGlzLmJsaW5rSW50ZXJ2YWwpfS5iaW5kKHRoaXMpO3RoaXMuaW50ZXJ2YWxJZD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe2UoITApLHQoKX0sdGhpcy5ibGlua0ludGVydmFsKSx0KCl9fSx0aGlzLmdldFBpeGVsUG9zaXRpb249ZnVuY3Rpb24oZSx0KXtpZighdGhpcy5jb25maWd8fCF0aGlzLnNlc3Npb24pcmV0dXJue2xlZnQ6MCx0b3A6MH07ZXx8KGU9dGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5nZXRDdXJzb3IoKSk7dmFyIG49dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlKSxyPXRoaXMuJHBhZGRpbmcrKHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuaXNCaWRpUm93KG4ucm93LGUucm93KT90aGlzLnNlc3Npb24uJGJpZGlIYW5kbGVyLmdldFBvc0xlZnQobi5jb2x1bW4pOm4uY29sdW1uKnRoaXMuY29uZmlnLmNoYXJhY3RlcldpZHRoKSxpPShuLnJvdy0odD90aGlzLmNvbmZpZy5maXJzdFJvd1NjcmVlbjowKSkqdGhpcy5jb25maWcubGluZUhlaWdodDtyZXR1cm57bGVmdDpyLHRvcDppfX0sdGhpcy5pc0N1cnNvckluVmlldz1mdW5jdGlvbihlLHQpe3JldHVybiBlLnRvcD49MCYmZS50b3A8dC5tYXhIZWlnaHR9LHRoaXMudXBkYXRlPWZ1bmN0aW9uKGUpe3RoaXMuY29uZmlnPWU7dmFyIHQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLG49MCxpPTA7aWYodD09PXVuZGVmaW5lZHx8dC5sZW5ndGg9PT0wKXQ9W3tjdXJzb3I6bnVsbH1dO2Zvcih2YXIgbj0wLHM9dC5sZW5ndGg7bjxzO24rKyl7dmFyIG89dGhpcy5nZXRQaXhlbFBvc2l0aW9uKHRbbl0uY3Vyc29yLCEwKTtpZigoby50b3A+ZS5oZWlnaHQrZS5vZmZzZXR8fG8udG9wPDApJiZuPjEpY29udGludWU7dmFyIHU9dGhpcy5jdXJzb3JzW2krK118fHRoaXMuYWRkQ3Vyc29yKCksYT11LnN0eWxlO3RoaXMuZHJhd0N1cnNvcj90aGlzLmRyYXdDdXJzb3IodSxvLGUsdFtuXSx0aGlzLnNlc3Npb24pOnRoaXMuaXNDdXJzb3JJblZpZXcobyxlKT8oci5zZXRTdHlsZShhLCJkaXNwbGF5IiwiYmxvY2siKSxyLnRyYW5zbGF0ZSh1LG8ubGVmdCxvLnRvcCksci5zZXRTdHlsZShhLCJ3aWR0aCIsTWF0aC5yb3VuZChlLmNoYXJhY3RlcldpZHRoKSsicHgiKSxyLnNldFN0eWxlKGEsImhlaWdodCIsZS5saW5lSGVpZ2h0KyJweCIpKTpyLnNldFN0eWxlKGEsImRpc3BsYXkiLCJub25lIil9d2hpbGUodGhpcy5jdXJzb3JzLmxlbmd0aD5pKXRoaXMucmVtb3ZlQ3Vyc29yKCk7dmFyIGY9dGhpcy5zZXNzaW9uLmdldE92ZXJ3cml0ZSgpO3RoaXMuJHNldE92ZXJ3cml0ZShmKSx0aGlzLiRwaXhlbFBvcz1vLHRoaXMucmVzdGFydFRpbWVyKCl9LHRoaXMuZHJhd0N1cnNvcj1udWxsLHRoaXMuJHNldE92ZXJ3cml0ZT1mdW5jdGlvbihlKXtlIT10aGlzLm92ZXJ3cml0ZSYmKHRoaXMub3ZlcndyaXRlPWUsZT9yLmFkZENzc0NsYXNzKHRoaXMuZWxlbWVudCwiYWNlX292ZXJ3cml0ZS1jdXJzb3JzIik6ci5yZW1vdmVDc3NDbGFzcyh0aGlzLmVsZW1lbnQsImFjZV9vdmVyd3JpdGUtY3Vyc29ycyIpKX0sdGhpcy5kZXN0cm95PWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpLGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCl9fSkuY2FsbChpLnByb3RvdHlwZSksdC5DdXJzb3I9aX0pLGFjZS5kZWZpbmUoImFjZS9zY3JvbGxiYXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vbGliL2V2ZW50Iiksbz1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHU9MzI3NjgsYT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQ9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmVsZW1lbnQuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsYmFyIGFjZV9zY3JvbGxiYXIiK3RoaXMuY2xhc3NTdWZmaXgsdGhpcy5pbm5lcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuaW5uZXIuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsYmFyLWlubmVyIix0aGlzLmlubmVyLnRleHRDb250ZW50PSJcdTAwYTAiLHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmlubmVyKSxlLmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCksdGhpcy5zZXRWaXNpYmxlKCExKSx0aGlzLnNraXBFdmVudD0hMSxzLmFkZExpc3RlbmVyKHRoaXMuZWxlbWVudCwic2Nyb2xsIix0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcykpLHMuYWRkTGlzdGVuZXIodGhpcy5lbGVtZW50LCJtb3VzZWRvd24iLHMucHJldmVudERlZmF1bHQpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLG8pLHRoaXMuc2V0VmlzaWJsZT1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUuZGlzcGxheT1lPyIiOiJub25lIix0aGlzLmlzVmlzaWJsZT1lLHRoaXMuY29lZmY9MX19KS5jYWxsKGEucHJvdG90eXBlKTt2YXIgZj1mdW5jdGlvbihlLHQpe2EuY2FsbCh0aGlzLGUpLHRoaXMuc2Nyb2xsVG9wPTAsdGhpcy5zY3JvbGxIZWlnaHQ9MCx0LiRzY3JvbGxiYXJXaWR0aD10aGlzLndpZHRoPWkuc2Nyb2xsYmFyV2lkdGgoZS5vd25lckRvY3VtZW50KSx0aGlzLmlubmVyLnN0eWxlLndpZHRoPXRoaXMuZWxlbWVudC5zdHlsZS53aWR0aD0odGhpcy53aWR0aHx8MTUpKzUrInB4Iix0aGlzLiRtaW5XaWR0aD0wfTtyLmluaGVyaXRzKGYsYSksZnVuY3Rpb24oKXt0aGlzLmNsYXNzU3VmZml4PSItdiIsdGhpcy5vblNjcm9sbD1mdW5jdGlvbigpe2lmKCF0aGlzLnNraXBFdmVudCl7dGhpcy5zY3JvbGxUb3A9dGhpcy5lbGVtZW50LnNjcm9sbFRvcDtpZih0aGlzLmNvZWZmIT0xKXt2YXIgZT10aGlzLmVsZW1lbnQuY2xpZW50SGVpZ2h0L3RoaXMuc2Nyb2xsSGVpZ2h0O3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wKigxLWUpLyh0aGlzLmNvZWZmLWUpfXRoaXMuX2VtaXQoInNjcm9sbCIse2RhdGE6dGhpcy5zY3JvbGxUb3B9KX10aGlzLnNraXBFdmVudD0hMX0sdGhpcy5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1heCh0aGlzLmlzVmlzaWJsZT90aGlzLndpZHRoOjAsdGhpcy4kbWluV2lkdGh8fDApfSx0aGlzLnNldEhlaWdodD1mdW5jdGlvbihlKXt0aGlzLmVsZW1lbnQuc3R5bGUuaGVpZ2h0PWUrInB4In0sdGhpcy5zZXRJbm5lckhlaWdodD10aGlzLnNldFNjcm9sbEhlaWdodD1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbEhlaWdodD1lLGU+dT8odGhpcy5jb2VmZj11L2UsZT11KTp0aGlzLmNvZWZmIT0xJiYodGhpcy5jb2VmZj0xKSx0aGlzLmlubmVyLnN0eWxlLmhlaWdodD1lKyJweCJ9LHRoaXMuc2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsVG9wIT1lJiYodGhpcy5za2lwRXZlbnQ9ITAsdGhpcy5zY3JvbGxUb3A9ZSx0aGlzLmVsZW1lbnQuc2Nyb2xsVG9wPWUqdGhpcy5jb2VmZil9fS5jYWxsKGYucHJvdG90eXBlKTt2YXIgbD1mdW5jdGlvbihlLHQpe2EuY2FsbCh0aGlzLGUpLHRoaXMuc2Nyb2xsTGVmdD0wLHRoaXMuaGVpZ2h0PXQuJHNjcm9sbGJhcldpZHRoLHRoaXMuaW5uZXIuc3R5bGUuaGVpZ2h0PXRoaXMuZWxlbWVudC5zdHlsZS5oZWlnaHQ9KHRoaXMuaGVpZ2h0fHwxNSkrNSsicHgifTtyLmluaGVyaXRzKGwsYSksZnVuY3Rpb24oKXt0aGlzLmNsYXNzU3VmZml4PSItaCIsdGhpcy5vblNjcm9sbD1mdW5jdGlvbigpe3RoaXMuc2tpcEV2ZW50fHwodGhpcy5zY3JvbGxMZWZ0PXRoaXMuZWxlbWVudC5zY3JvbGxMZWZ0LHRoaXMuX2VtaXQoInNjcm9sbCIse2RhdGE6dGhpcy5zY3JvbGxMZWZ0fSkpLHRoaXMuc2tpcEV2ZW50PSExfSx0aGlzLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmlzaWJsZT90aGlzLmhlaWdodDowfSx0aGlzLnNldFdpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuZWxlbWVudC5zdHlsZS53aWR0aD1lKyJweCJ9LHRoaXMuc2V0SW5uZXJXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmlubmVyLnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRTY3JvbGxXaWR0aD1mdW5jdGlvbihlKXt0aGlzLmlubmVyLnN0eWxlLndpZHRoPWUrInB4In0sdGhpcy5zZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsTGVmdCE9ZSYmKHRoaXMuc2tpcEV2ZW50PSEwLHRoaXMuc2Nyb2xsTGVmdD10aGlzLmVsZW1lbnQuc2Nyb2xsTGVmdD1lKX19LmNhbGwobC5wcm90b3R5cGUpLHQuU2Nyb2xsQmFyPWYsdC5TY3JvbGxCYXJWPWYsdC5TY3JvbGxCYXJIPWwsdC5WU2Nyb2xsQmFyPWYsdC5IU2Nyb2xsQmFyPWx9KSxhY2UuZGVmaW5lKCJhY2UvcmVuZGVybG9vcCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvZXZlbnQiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vbGliL2V2ZW50IiksaT1mdW5jdGlvbihlLHQpe3RoaXMub25SZW5kZXI9ZSx0aGlzLnBlbmRpbmc9ITEsdGhpcy5jaGFuZ2VzPTAsdGhpcy4kcmVjdXJzaW9uTGltaXQ9Mix0aGlzLndpbmRvdz10fHx3aW5kb3c7dmFyIG49dGhpczt0aGlzLl9mbHVzaD1mdW5jdGlvbihlKXtuLnBlbmRpbmc9ITE7dmFyIHQ9bi5jaGFuZ2VzO3QmJihyLmJsb2NrSWRsZSgxMDApLG4uY2hhbmdlcz0wLG4ub25SZW5kZXIodCkpO2lmKG4uY2hhbmdlcyl7aWYobi4kcmVjdXJzaW9uTGltaXQtLTwwKXJldHVybjtuLnNjaGVkdWxlKCl9ZWxzZSBuLiRyZWN1cnNpb25MaW1pdD0yfX07KGZ1bmN0aW9uKCl7dGhpcy5zY2hlZHVsZT1mdW5jdGlvbihlKXt0aGlzLmNoYW5nZXM9dGhpcy5jaGFuZ2VzfGUsdGhpcy5jaGFuZ2VzJiYhdGhpcy5wZW5kaW5nJiYoci5uZXh0RnJhbWUodGhpcy5fZmx1c2gpLHRoaXMucGVuZGluZz0hMCl9LHRoaXMuY2xlYXI9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5jaGFuZ2VzO3JldHVybiB0aGlzLmNoYW5nZXM9MCx0fX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuUmVuZGVyTG9vcD1pfSksYWNlLmRlZmluZSgiYWNlL2xheWVyL2ZvbnRfbWV0cmljcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2xhbmciLCJhY2UvbGliL2V2ZW50IiwiYWNlL2xpYi91c2VyYWdlbnQiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiXSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL2RvbSIpLHM9ZSgiLi4vbGliL2xhbmciKSxvPWUoIi4uL2xpYi9ldmVudCIpLHU9ZSgiLi4vbGliL3VzZXJhZ2VudCIpLGE9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsZj0yNTYsbD10eXBlb2YgUmVzaXplT2JzZXJ2ZXI9PSJmdW5jdGlvbiIsYz0yMDAsaD10LkZvbnRNZXRyaWNzPWZ1bmN0aW9uKGUpe3RoaXMuZWw9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLmVsLnN0eWxlLCEwKSx0aGlzLiRtYWluPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kc2V0TWVhc3VyZU5vZGVTdHlsZXModGhpcy4kbWFpbi5zdHlsZSksdGhpcy4kbWVhc3VyZU5vZGU9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRzZXRNZWFzdXJlTm9kZVN0eWxlcyh0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZSksdGhpcy5lbC5hcHBlbmRDaGlsZCh0aGlzLiRtYWluKSx0aGlzLmVsLmFwcGVuZENoaWxkKHRoaXMuJG1lYXN1cmVOb2RlKSxlLmFwcGVuZENoaWxkKHRoaXMuZWwpLHRoaXMuJG1lYXN1cmVOb2RlLmlubmVySFRNTD1zLnN0cmluZ1JlcGVhdCgiWCIsZiksdGhpcy4kY2hhcmFjdGVyU2l6ZT17d2lkdGg6MCxoZWlnaHQ6MH0sbD90aGlzLiRhZGRPYnNlcnZlcigpOnRoaXMuY2hlY2tGb3JTaXplQ2hhbmdlcygpfTsoZnVuY3Rpb24oKXtyLmltcGxlbWVudCh0aGlzLGEpLHRoaXMuJGNoYXJhY3RlclNpemU9e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMuJHNldE1lYXN1cmVOb2RlU3R5bGVzPWZ1bmN0aW9uKGUsdCl7ZS53aWR0aD1lLmhlaWdodD0iYXV0byIsZS5sZWZ0PWUudG9wPSIwcHgiLGUudmlzaWJpbGl0eT0iaGlkZGVuIixlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS53aGl0ZVNwYWNlPSJwcmUiLHUuaXNJRTw4P2VbImZvbnQtZmFtaWx5Il09ImluaGVyaXQiOmUuZm9udD0iaW5oZXJpdCIsZS5vdmVyZmxvdz10PyJoaWRkZW4iOiJ2aXNpYmxlIn0sdGhpcy5jaGVja0ZvclNpemVDaGFuZ2VzPWZ1bmN0aW9uKGUpe2U9PT11bmRlZmluZWQmJihlPXRoaXMuJG1lYXN1cmVTaXplcygpKTtpZihlJiYodGhpcy4kY2hhcmFjdGVyU2l6ZS53aWR0aCE9PWUud2lkdGh8fHRoaXMuJGNoYXJhY3RlclNpemUuaGVpZ2h0IT09ZS5oZWlnaHQpKXt0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZS5mb250V2VpZ2h0PSJib2xkIjt2YXIgdD10aGlzLiRtZWFzdXJlU2l6ZXMoKTt0aGlzLiRtZWFzdXJlTm9kZS5zdHlsZS5mb250V2VpZ2h0PSIiLHRoaXMuJGNoYXJhY3RlclNpemU9ZSx0aGlzLmNoYXJTaXplcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuYWxsb3dCb2xkRm9udHM9dCYmdC53aWR0aD09PWUud2lkdGgmJnQuaGVpZ2h0PT09ZS5oZWlnaHQsdGhpcy5fZW1pdCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIse2RhdGE6ZX0pfX0sdGhpcy4kYWRkT2JzZXJ2ZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuJG9ic2VydmVyPW5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24odCl7dmFyIG49dFswXS5jb250ZW50UmVjdDtlLmNoZWNrRm9yU2l6ZUNoYW5nZXMoe2hlaWdodDpuLmhlaWdodCx3aWR0aDpuLndpZHRoL2Z9KX0pLHRoaXMuJG9ic2VydmVyLm9ic2VydmUodGhpcy4kbWVhc3VyZU5vZGUpfSx0aGlzLiRwb2xsU2l6ZUNoYW5nZXM9ZnVuY3Rpb24oKXtpZih0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lcnx8dGhpcy4kb2JzZXJ2ZXIpcmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyO3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyPW8ub25JZGxlKGZ1bmN0aW9uIHQoKXtlLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKSxvLm9uSWRsZSh0LDUwMCl9LDUwMCl9LHRoaXMuc2V0UG9sbGluZz1mdW5jdGlvbihlKXtlP3RoaXMuJHBvbGxTaXplQ2hhbmdlcygpOnRoaXMuJHBvbGxTaXplQ2hhbmdlc1RpbWVyJiYoY2xlYXJJbnRlcnZhbCh0aGlzLiRwb2xsU2l6ZUNoYW5nZXNUaW1lciksdGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXI9MCl9LHRoaXMuJG1lYXN1cmVTaXplcz1mdW5jdGlvbihlKXt2YXIgdD17aGVpZ2h0OihlfHx0aGlzLiRtZWFzdXJlTm9kZSkuY2xpZW50SGVpZ2h0LHdpZHRoOihlfHx0aGlzLiRtZWFzdXJlTm9kZSkuY2xpZW50V2lkdGgvZn07cmV0dXJuIHQud2lkdGg9PT0wfHx0LmhlaWdodD09PTA/bnVsbDp0fSx0aGlzLiRtZWFzdXJlQ2hhcldpZHRoPWZ1bmN0aW9uKGUpe3RoaXMuJG1haW4uaW5uZXJIVE1MPXMuc3RyaW5nUmVwZWF0KGUsZik7dmFyIHQ9dGhpcy4kbWFpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm4gdC53aWR0aC9mfSx0aGlzLmdldENoYXJhY3RlcldpZHRoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY2hhclNpemVzW2VdO3JldHVybiB0PT09dW5kZWZpbmVkJiYodD10aGlzLmNoYXJTaXplc1tlXT10aGlzLiRtZWFzdXJlQ2hhcldpZHRoKGUpL3RoaXMuJGNoYXJhY3RlclNpemUud2lkdGgpLHR9LHRoaXMuZGVzdHJveT1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy4kcG9sbFNpemVDaGFuZ2VzVGltZXIpLHRoaXMuJG9ic2VydmVyJiZ0aGlzLiRvYnNlcnZlci5kaXNjb25uZWN0KCksdGhpcy5lbCYmdGhpcy5lbC5wYXJlbnROb2RlJiZ0aGlzLmVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5lbCl9LHRoaXMuJGdldFpvb209ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD8od2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuem9vbXx8MSkqZSh0LnBhcmVudEVsZW1lbnQpOjF9LHRoaXMuJGluaXRUcmFuc2Zvcm1NZWFzdXJlTm9kZXM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQpe3JldHVyblsiZGl2Iix7c3R5bGU6InBvc2l0aW9uOiBhYnNvbHV0ZTt0b3A6IitlKyJweDtsZWZ0OiIrdCsicHg7In1dfTt0aGlzLmVscz1pLmJ1aWxkRG9tKFtlKDAsMCksZShjLDApLGUoMCxjKSxlKGMsYyldLHRoaXMuZWwpfSx0aGlzLnRyYW5zZm9ybUNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9ZVsxXSp0WzBdLWVbMF0qdFsxXTtyZXR1cm5bKC10WzFdKm5bMF0rdFswXSpuWzFdKS9yLCgrZVsxXSpuWzBdLWVbMF0qblsxXSkvcl19ZnVuY3Rpb24gaShlLHQpe3JldHVybltlWzBdLXRbMF0sZVsxXS10WzFdXX1mdW5jdGlvbiBzKGUsdCl7cmV0dXJuW2VbMF0rdFswXSxlWzFdK3RbMV1dfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm5bZSp0WzBdLGUqdFsxXV19ZnVuY3Rpb24gdShlKXt2YXIgdD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVyblt0LmxlZnQsdC50b3BdfWlmKGUpe3ZhciBuPXRoaXMuJGdldFpvb20odGhpcy5lbCk7ZT1vKDEvbixlKX10aGlzLmVsc3x8dGhpcy4kaW5pdFRyYW5zZm9ybU1lYXN1cmVOb2RlcygpO3ZhciBhPXUodGhpcy5lbHNbMF0pLGY9dSh0aGlzLmVsc1sxXSksbD11KHRoaXMuZWxzWzJdKSxoPXUodGhpcy5lbHNbM10pLHA9cihpKGgsZiksaShoLGwpLGkocyhmLGwpLHMoaCxhKSkpLGQ9bygxK3BbMF0saShmLGEpKSx2PW8oMStwWzFdLGkobCxhKSk7aWYodCl7dmFyIG09dCxnPXBbMF0qbVswXS9jK3BbMV0qbVsxXS9jKzEseT1zKG8obVswXSxkKSxvKG1bMV0sdikpO3JldHVybiBzKG8oMS9nL2MseSksYSl9dmFyIGI9aShlLGEpLHc9cihpKGQsbyhwWzBdLGIpKSxpKHYsbyhwWzFdLGIpKSxiKTtyZXR1cm4gbyhjLHcpfX0pLmNhbGwoaC5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL3ZpcnR1YWxfcmVuZGVyZXIiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9saWIvZG9tIiwiYWNlL2NvbmZpZyIsImFjZS9sYXllci9ndXR0ZXIiLCJhY2UvbGF5ZXIvbWFya2VyIiwiYWNlL2xheWVyL3RleHQiLCJhY2UvbGF5ZXIvY3Vyc29yIiwiYWNlL3Njcm9sbGJhciIsImFjZS9zY3JvbGxiYXIiLCJhY2UvcmVuZGVybG9vcCIsImFjZS9sYXllci9mb250X21ldHJpY3MiLCJhY2UvbGliL2V2ZW50X2VtaXR0ZXIiLCJhY2UvbGliL3VzZXJhZ2VudCJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vY29uZmlnIiksbz1lKCIuL2xheWVyL2d1dHRlciIpLkd1dHRlcix1PWUoIi4vbGF5ZXIvbWFya2VyIikuTWFya2VyLGE9ZSgiLi9sYXllci90ZXh0IikuVGV4dCxmPWUoIi4vbGF5ZXIvY3Vyc29yIikuQ3Vyc29yLGw9ZSgiLi9zY3JvbGxiYXIiKS5IU2Nyb2xsQmFyLGM9ZSgiLi9zY3JvbGxiYXIiKS5WU2Nyb2xsQmFyLGg9ZSgiLi9yZW5kZXJsb29wIikuUmVuZGVyTG9vcCxwPWUoIi4vbGF5ZXIvZm9udF9tZXRyaWNzIikuRm9udE1ldHJpY3MsZD1lKCIuL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyLHY9Jy5hY2VfYnIxIHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4O30uYWNlX2JyMiB7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDt9LmFjZV9icjMge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7fS5hY2VfYnI0IHtib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyNSB7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDt9LmFjZV9icjYge2JvcmRlci10b3AtcmlnaHQtcmFkaXVzICAgOiAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7fS5hY2VfYnI3IHtib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogICAgM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4O30uYWNlX2JyOCB7Ym9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyA6IDNweDt9LmFjZV9icjkge2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxMHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyAgIDogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTF7Ym9yZGVyLXRvcC1sZWZ0LXJhZGl1cyAgICA6IDNweDsgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6ICAgIDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjEye2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6ICAzcHg7fS5hY2VfYnIxM3tib3JkZXItdG9wLWxlZnQtcmFkaXVzICAgIDogM3B4OyBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogM3B4OyBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAgM3B4O30uYWNlX2JyMTR7Ym9yZGVyLXRvcC1yaWdodC1yYWRpdXMgICA6IDNweDsgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDNweDsgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogIDNweDt9LmFjZV9icjE1e2JvcmRlci10b3AtbGVmdC1yYWRpdXMgICAgOiAzcHg7IGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAgICAzcHg7IGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAzcHg7IGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDNweDt9LmFjZV9lZGl0b3Ige3Bvc2l0aW9uOiByZWxhdGl2ZTtvdmVyZmxvdzogaGlkZGVuO2ZvbnQ6IDEycHgvbm9ybWFsIFwnTW9uYWNvXCcsIFwnTWVubG9cJywgXCdVYnVudHUgTW9ub1wnLCBcJ0NvbnNvbGFzXCcsIFwnc291cmNlLWNvZGUtcHJvXCcsIG1vbm9zcGFjZTtkaXJlY3Rpb246IGx0cjt0ZXh0LWFsaWduOiBsZWZ0Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTt9LmFjZV9zY3JvbGxlciB7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBoaWRkZW47dG9wOiAwO2JvdHRvbTogMDtiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0Oy1tcy11c2VyLXNlbGVjdDogbm9uZTstbW96LXVzZXItc2VsZWN0OiBub25lOy13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7dXNlci1zZWxlY3Q6IG5vbmU7Y3Vyc29yOiB0ZXh0O30uYWNlX2NvbnRlbnQge3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3gtc2l6aW5nOiBib3JkZXItYm94O21pbi13aWR0aDogMTAwJTtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV9kcmFnZ2luZyAuYWNlX3Njcm9sbGVyOmJlZm9yZXtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7Ym90dG9tOiAwO2NvbnRlbnQ6IFwnXCc7YmFja2dyb3VuZDogcmdiYSgyNTAsIDI1MCwgMjUwLCAwLjAxKTt6LWluZGV4OiAxMDAwO30uYWNlX2RyYWdnaW5nLmFjZV9kYXJrIC5hY2Vfc2Nyb2xsZXI6YmVmb3Jle2JhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4wMSk7fS5hY2Vfc2VsZWN0aW5nLCAuYWNlX3NlbGVjdGluZyAqIHtjdXJzb3I6IHRleHQgIWltcG9ydGFudDt9LmFjZV9ndXR0ZXIge3Bvc2l0aW9uOiBhYnNvbHV0ZTtvdmVyZmxvdyA6IGhpZGRlbjt3aWR0aDogYXV0bzt0b3A6IDA7Ym90dG9tOiAwO2xlZnQ6IDA7Y3Vyc29yOiBkZWZhdWx0O3otaW5kZXg6IDQ7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV9ndXR0ZXItYWN0aXZlLWxpbmUge3Bvc2l0aW9uOiBhYnNvbHV0ZTtsZWZ0OiAwO3JpZ2h0OiAwO30uYWNlX3Njcm9sbGVyLmFjZV9zY3JvbGwtbGVmdCB7Ym94LXNoYWRvdzogMTdweCAwIDE2cHggLTE2cHggcmdiYSgwLCAwLCAwLCAwLjQpIGluc2V0O30uYWNlX2d1dHRlci1jZWxsIHtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7cGFkZGluZy1sZWZ0OiAxOXB4O3BhZGRpbmctcmlnaHQ6IDZweDtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O30uYWNlX2d1dHRlci1jZWxsLmFjZV9lcnJvciB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFCT0ZCTVZFWC8vLy8vLy8vL1FSc3dGQWIvVWk0d0ZBWXdGQVl3RkFhV0dBZkRSeW16T1NIL1B4c3dGQWIvU2lVd0ZBWXdGQWJVUFJ2alFpRGxsb2c1SGhIZFJ5YnNUaTMvVHl2OVRpcitTeWovVUMzLy8vL1h1cmViTUJJd0ZBYi9SU0hiUHgvZ1V6ZmR3TDNrek1pdktCQXdGQWJidmJuaFB4NjZOaG93RkFZd0ZBYVpKZzh3RkFheEtCRFp1cmYvUkI2bU14Yi9TQ013RkFZd0ZBYnhRQjMrUkI0d0ZBYi9RaHk0T2grNFFpZmJOUmN3RkFZd0ZBWXdGQWIvUVJ6ZE5oZ3dGQVl3RkFiYXY3di9VeTdvYUU2OE1CSzVMeExld3IvcjJOWGV3THN3RkFheEp3NHdGQWJrUFJ5MlB5WXdGQWF4S2hMbTF0TXdGQWF6UGlRd0ZBYVVHQWIvUUJyZk94M2J2cnYvVkMvbWFFNHdGQWJSUEJxNk1STzhReW5ldzhEcDJ0amZ3YjB3RkFieDZlanU1K2J5NnVuczR1SDkvZjM2K3ZyL0drSGpBQUFBWW5SU1RsTUFHdCs2NHJuV3UvYm84ZUFBNEluSDMrRHdvTjdqNGVMaTR4UDk5TmZnNCtiKy91OUIvZURzMU1EMW1PNys0UEhnMk1YYTM0N2c3dkRpek1MTjRlRytQdjdpNWV2cy92Nzl5dTdTMy9EVjcvNDk4WXYyNGVIKzR1ZlEzT3p1L3Y3K3kxM3NScXdBQUFETFNVUkJWSGphWmMvWERzRmdHSUJodERyc2hsaXRtazJJcmJIRnFMMnB2WGYvKzc4RFBva2o3K0Z6OXFwVS85VVhKSWxobVBhVGFRNlFQYXowbW0rNWd3a2dvdmNWNkdaemQ1SnRDUXdnc3hvSE92Sk8xNWtsZVJMQW5NZ0hGSUVTVUVQbWF3QjluZ21lbFR0aXB3d2ZBU2lseE9MeWlWNVVWVXlWQWZiRzBjQ1BIaWcrR0JrekFFTkhTMEFzdFZGNmJhY1pJT3pnTG14c0hidDJPZWNOZ0pDODNKRVJtZVBVWXE4QVJHa0p4Nlh0RnNkZGRCUWdaRTJuUFI2Q0lDWmhhd2pBNEZiL2NodiszOTlrZlIrTU1NREdPUUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjogMnB4IGNlbnRlcjt9LmFjZV9ndXR0ZXItY2VsbC5hY2Vfd2FybmluZyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBbVZCTVZFWC8vLzhBQUFELy8vOEFBQUFBQUFCUFN6Yi81c0FBQUFCL2JsSC83M3ovdWxrQUFBQUFBQUQ4NXBrQUFBQUFBQUFDQWdQL3ZHei9ya0RlckdiR3JWNy9wa1FJQ0FmLy8vL2UwSXNBQUFEL29FRC9xVHZocm5VQUFBRC95SEQvbmpjQUFBRHV2MnIvbnovL29Uai9wMDY0b0dmL3pIQUFBQUE5TmlyL3RGSUFBQUQvdGxUaXVXZi90a0lBQUFDeW5YRUFBQUFBQUFBdElSVzd6QnBCQUFBQU0zUlNUbE1BQUJSMW03UlhPOExuMzFaMzZ6VCtuZVhlNU96b29SRGZuK1RaNHAzaDJoVGY0dDNrM3VjeXJOMUs1K1hha3M1MlNmczlDWGdyQUFBQWprbEVRVlI0Mm8zUGJRK0NJQlFGWUV3Ym9QaFNZZ29ZdW5JcXFMbjYvejh1WWRIOFZtZG51OXZ6NFd3WGdOL3hUUFJEMitzZ09jWmpzZ2Uvd2hYWmdVYVlZdlQ4UW51SmFVcmpySFVRcmVHY3p1RWFmUUNPL1NKVHVmVGJyb1dzUGdzbGxWaHEzd0pFazJqVVN6WDNDVUVESkM4NDcwN2RqUmM1TVRBUXhvTGd1cFdSd1c2VUI1ZlMrK05WOEFiT1pnbnNDN0JwRUFBQUFBQkpSVTVFcmtKZ2dnPT0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2d1dHRlci1jZWxsLmFjZV9pbmZvIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBQUFBQUE2bUtDOUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBQUowVWs1VEFBQjJrODA0QUFBQVBrbEVRVlFZMDJOZ0lCNjhRdU8zdGlMem5qQXdwS1RnTnlEYk1lZ3dpc0NIWlVFVFVaVjBacU9xdUJwWGoycnRucFNKVDFBRW5uUm1MMk9nR2dBQUlLa1JRYXAyaHRnQUFBQUFTVVZPUks1Q1lJST0iKTtiYWNrZ3JvdW5kLXBvc2l0aW9uOiAycHggY2VudGVyO30uYWNlX2RhcmsgLmFjZV9ndXR0ZXItY2VsbC5hY2VfaW5mbyB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFCQU1BQUFEdDNlSlNBQUFBSkZCTVZFVUFBQUNob2FHQWdJQXFLaXErdnI2dHJhMVpXVm1VbEpTYm01czhQRHh1Ym01NmVucmRnemczQUFBQUFYUlNUbE1BUU9iWVpnQUFBQ2xKUkVGVWVOcGpZTUFQZHNNWUhlZ3lKWkZRQmxzVWxNRlZDV1VZS2tBWk14WkFHZHhsRE1RQkFHK1RCUDRCNlJ5SkFBQUFBRWxGVGtTdVFtQ0MiKTt9LmFjZV9zY3JvbGxiYXIge2NvbnRhaW46IHN0cmljdDtwb3NpdGlvbjogYWJzb2x1dGU7cmlnaHQ6IDA7Ym90dG9tOiAwO3otaW5kZXg6IDY7fS5hY2Vfc2Nyb2xsYmFyLWlubmVyIHtwb3NpdGlvbjogYWJzb2x1dGU7Y3Vyc29yOiB0ZXh0O2xlZnQ6IDA7dG9wOiAwO30uYWNlX3Njcm9sbGJhci12e292ZXJmbG93LXg6IGhpZGRlbjtvdmVyZmxvdy15OiBzY3JvbGw7dG9wOiAwO30uYWNlX3Njcm9sbGJhci1oIHtvdmVyZmxvdy14OiBzY3JvbGw7b3ZlcmZsb3cteTogaGlkZGVuO2xlZnQ6IDA7fS5hY2VfcHJpbnQtbWFyZ2luIHtwb3NpdGlvbjogYWJzb2x1dGU7aGVpZ2h0OiAxMDAlO30uYWNlX3RleHQtaW5wdXQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAwO3dpZHRoOiAwLjVlbTtoZWlnaHQ6IDFlbTtvcGFjaXR5OiAwO2JhY2tncm91bmQ6IHRyYW5zcGFyZW50Oy1tb3otYXBwZWFyYW5jZTogbm9uZTthcHBlYXJhbmNlOiBub25lO2JvcmRlcjogbm9uZTtyZXNpemU6IG5vbmU7b3V0bGluZTogbm9uZTtvdmVyZmxvdzogaGlkZGVuO2ZvbnQ6IGluaGVyaXQ7cGFkZGluZzogMCAxcHg7bWFyZ2luOiAwIC0xcHg7Y29udGFpbjogc3RyaWN0Oy1tcy11c2VyLXNlbGVjdDogdGV4dDstbW96LXVzZXItc2VsZWN0OiB0ZXh0Oy13ZWJraXQtdXNlci1zZWxlY3Q6IHRleHQ7dXNlci1zZWxlY3Q6IHRleHQ7d2hpdGUtc3BhY2U6IHByZSFpbXBvcnRhbnQ7fS5hY2VfdGV4dC1pbnB1dC5hY2VfY29tcG9zaXRpb24ge2JhY2tncm91bmQ6IHRyYW5zcGFyZW50O2NvbG9yOiBpbmhlcml0O3otaW5kZXg6IDEwMDA7b3BhY2l0eTogMTt9LmFjZV9jb21wb3NpdGlvbl9wbGFjZWhvbGRlciB7IGNvbG9yOiB0cmFuc3BhcmVudCB9LmFjZV9jb21wb3NpdGlvbl9tYXJrZXIgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQ7cG9zaXRpb246IGFic29sdXRlO2JvcmRlci1yYWRpdXM6IDA7bWFyZ2luLXRvcDogMXB4O31bYWNlX25vY29udGV4dD10cnVlXSB7dHJhbnNmb3JtOiBub25lIWltcG9ydGFudDtmaWx0ZXI6IG5vbmUhaW1wb3J0YW50O3BlcnNwZWN0aXZlOiBub25lIWltcG9ydGFudDtjbGlwLXBhdGg6IG5vbmUhaW1wb3J0YW50O21hc2sgOiBub25lIWltcG9ydGFudDtjb250YWluOiBub25lIWltcG9ydGFudDtwZXJzcGVjdGl2ZTogbm9uZSFpbXBvcnRhbnQ7bWl4LWJsZW5kLW1vZGU6IGluaXRpYWwhaW1wb3J0YW50O3otaW5kZXg6IGF1dG87fS5hY2VfbGF5ZXIge3otaW5kZXg6IDE7cG9zaXRpb246IGFic29sdXRlO292ZXJmbG93OiBoaWRkZW47d29yZC13cmFwOiBub3JtYWw7d2hpdGUtc3BhY2U6IHByZTtoZWlnaHQ6IDEwMCU7d2lkdGg6IDEwMCU7Ym94LXNpemluZzogYm9yZGVyLWJveDtwb2ludGVyLWV2ZW50czogbm9uZTt9LmFjZV9ndXR0ZXItbGF5ZXIge3Bvc2l0aW9uOiByZWxhdGl2ZTt3aWR0aDogYXV0bzt0ZXh0LWFsaWduOiByaWdodDtwb2ludGVyLWV2ZW50czogYXV0bztoZWlnaHQ6IDEwMDAwMDBweDtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDt9LmFjZV90ZXh0LWxheWVyIHtmb250OiBpbmhlcml0ICFpbXBvcnRhbnQ7cG9zaXRpb246IGFic29sdXRlO2hlaWdodDogMTAwMDAwMHB4O3dpZHRoOiAxMDAwMDAwcHg7Y29udGFpbjogc3R5bGUgc2l6ZSBsYXlvdXQ7fS5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZSwgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lX2dyb3VwIHtjb250YWluOiBzdHlsZSBzaXplIGxheW91dDtwb3NpdGlvbjogYWJzb2x1dGU7dG9wOiAwO2xlZnQ6IDA7cmlnaHQ6IDA7fS5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyLC5hY2VfaGlkcGkgLmFjZV9ndXR0ZXItbGF5ZXIsLmFjZV9oaWRwaSAuYWNlX2NvbnRlbnQsLmFjZV9oaWRwaSAuYWNlX2d1dHRlciB7Y29udGFpbjogc3RyaWN0O3dpbGwtY2hhbmdlOiB0cmFuc2Zvcm07fS5hY2VfaGlkcGkgLmFjZV90ZXh0LWxheWVyID4gLmFjZV9saW5lLCAuYWNlX2hpZHBpIC5hY2VfdGV4dC1sYXllciA+IC5hY2VfbGluZV9ncm91cCB7Y29udGFpbjogc3RyaWN0O30uYWNlX2NqayB7ZGlzcGxheTogaW5saW5lLWJsb2NrO3RleHQtYWxpZ246IGNlbnRlcjt9LmFjZV9jdXJzb3ItbGF5ZXIge3otaW5kZXg6IDQ7fS5hY2VfY3Vyc29yIHt6LWluZGV4OiA0O3Bvc2l0aW9uOiBhYnNvbHV0ZTtib3gtc2l6aW5nOiBib3JkZXItYm94O2JvcmRlci1sZWZ0OiAycHggc29saWQ7dHJhbnNmb3JtOiB0cmFuc2xhdGV6KDApO30uYWNlX211bHRpc2VsZWN0IC5hY2VfY3Vyc29yIHtib3JkZXItbGVmdC13aWR0aDogMXB4O30uYWNlX3NsaW0tY3Vyc29ycyAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDFweDt9LmFjZV9vdmVyd3JpdGUtY3Vyc29ycyAuYWNlX2N1cnNvciB7Ym9yZGVyLWxlZnQtd2lkdGg6IDA7Ym9yZGVyLWJvdHRvbTogMXB4IHNvbGlkO30uYWNlX2hpZGRlbi1jdXJzb3JzIC5hY2VfY3Vyc29yIHtvcGFjaXR5OiAwLjI7fS5hY2Vfc21vb3RoLWJsaW5raW5nIC5hY2VfY3Vyc29yIHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMThzO30uYWNlX2FuaW1hdGUtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige2FuaW1hdGlvbi1kdXJhdGlvbjogMTAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IHN0ZXAtZW5kO2FuaW1hdGlvbi1uYW1lOiBibGluay1hY2UtYW5pbWF0ZTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTt9LmFjZV9hbmltYXRlLWJsaW5raW5nLmFjZV9zbW9vdGgtYmxpbmtpbmcgLmFjZV9jdXJzb3Ige2FuaW1hdGlvbi1kdXJhdGlvbjogMTAwMG1zO2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW4tb3V0O2FuaW1hdGlvbi1uYW1lOiBibGluay1hY2UtYW5pbWF0ZS1zbW9vdGg7fUBrZXlmcmFtZXMgYmxpbmstYWNlLWFuaW1hdGUge2Zyb20sIHRvIHsgb3BhY2l0eTogMTsgfTYwJSB7IG9wYWNpdHk6IDA7IH19QGtleWZyYW1lcyBibGluay1hY2UtYW5pbWF0ZS1zbW9vdGgge2Zyb20sIHRvIHsgb3BhY2l0eTogMTsgfTQ1JSB7IG9wYWNpdHk6IDE7IH02MCUgeyBvcGFjaXR5OiAwOyB9ODUlIHsgb3BhY2l0eTogMDsgfX0uYWNlX21hcmtlci1sYXllciAuYWNlX3N0ZXAsIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAzO30uYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGlvbiB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDU7fS5hY2VfbWFya2VyLWxheWVyIC5hY2VfYnJhY2tldCB7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDY7fS5hY2VfbWFya2VyLWxheWVyIC5hY2VfYWN0aXZlLWxpbmUge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiAyO30uYWNlX21hcmtlci1sYXllciAuYWNlX3NlbGVjdGVkLXdvcmQge3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA0O2JveC1zaXppbmc6IGJvcmRlci1ib3g7fS5hY2VfbGluZSAuYWNlX2ZvbGQge2JveC1zaXppbmc6IGJvcmRlci1ib3g7ZGlzcGxheTogaW5saW5lLWJsb2NrO2hlaWdodDogMTFweDttYXJnaW4tdG9wOiAtMnB4O3ZlcnRpY2FsLWFsaWduOiBtaWRkbGU7YmFja2dyb3VuZC1pbWFnZTp1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkVBQUFBSkNBWUFBQURVNk1jTUFBQUFHWFJGV0hSVGIyWjBkMkZ5WlFCQlpHOWlaU0JKYldGblpWSmxZV1I1Y2NsbFBBQUFBSnBKUkVGVWVOcGkvUC8vUHdPbGdBWEdZR1JrbEFWU29rRDhHbWp3WTF3YXNLbGpRcFlBQ3RwQ0ZlQURjSFZRZlF5TVFBd3p3QVpJM3dKS3ZDTGtmS0JhTVNDbEJsUjdCT1Fpa0NGR1FFRXJJSDBWcWthYmlHQ0Fxd1VhZEF6WkpSeFFyLzBnd2lYSWFsOHpRUVBuTlZUZ0oxVGRhd0wwVDVnQklQMU1VSk5oQnYySEtvUUhIanFOckE0V080elkwZ2x5TktMVDJLSWZJTUFBUXNkZ0dpWHZnbllBQUFBQVNVVk9SSzVDWUlJPSIpLHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBRUFBQUEzQ0FZQUFBRE5OaUE1QUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFDSkpSRUZVZU5waStQLy9meGdUQXdQREJ4RHhEMDc4UlNYK1llRXlERk1DSU1BQUkzSU5tWGl3ZjJZQUFBQUFTVVZPUks1Q1lJST0iKTtiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0LCByZXBlYXQteDtiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyLCB0b3AgbGVmdDtjb2xvcjogdHJhbnNwYXJlbnQ7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7Ym9yZGVyLXJhZGl1czogMnB4O2N1cnNvcjogcG9pbnRlcjtwb2ludGVyLWV2ZW50czogYXV0bzt9LmFjZV9kYXJrIC5hY2VfZm9sZCB7fS5hY2VfZm9sZDpob3ZlcntiYWNrZ3JvdW5kLWltYWdlOnVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCRUFBQUFKQ0FZQUFBRFU2TWNNQUFBQUdYUkZXSFJUYjJaMGQyRnlaUUJCWkc5aVpTQkpiV0ZuWlZKbFlXUjVjY2xsUEFBQUFKcEpSRUZVZU5waS9QLy9Qd09sZ0FYR1lHUmtsQVZTb2tEOEdtandZMXdhc0tsalFwWUFDdHBDRmVBRGNIVlFmUXlNUUF3endBWkkzd0pLdkNMa2ZLQmFNU0NsQmxSN0JPUWlrQ0ZHUUVFcklIMFZxa2FiaUdDQXF3VWFkQXpaSlJ4UXIvMGd3aVhJYWw4elFRUG5OVlRnSjFUZGF3TDBUNWdCSVAxTVVKTmhCdjJIS29RSEhqcU5yQTRXTzR6WTBnbHlOS0xUMktJZklNQUFRc2RnR2lYdmduWUFBQUFBU1VWT1JLNUNZSUk9IiksdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFFQUFBQTNDQVlBQUFETk5pQTVBQUFBR1hSRldIUlRiMlowZDJGeVpRQkJaRzlpWlNCSmJXRm5aVkpsWVdSNWNjbGxQQUFBQUNCSlJFRlVlTnBpK1AvL2Z6NFRBd1BEWnhEeEQ1WDRpNWZMTUV3SmdBQURBRVBWRGJqTnc4N1pBQUFBQUVsRlRrU3VRbUNDIik7fS5hY2VfdG9vbHRpcCB7YmFja2dyb3VuZC1jb2xvcjogI0ZGRjtiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCB0cmFuc3BhcmVudCwgcmdiYSgwLCAwLCAwLCAwLjEpKTtib3JkZXI6IDFweCBzb2xpZCBncmF5O2JvcmRlci1yYWRpdXM6IDFweDtib3gtc2hhZG93OiAwIDFweCAycHggcmdiYSgwLCAwLCAwLCAwLjMpO2NvbG9yOiBibGFjazttYXgtd2lkdGg6IDEwMCU7cGFkZGluZzogM3B4IDRweDtwb3NpdGlvbjogZml4ZWQ7ei1pbmRleDogOTk5OTk5O2JveC1zaXppbmc6IGJvcmRlci1ib3g7Y3Vyc29yOiBkZWZhdWx0O3doaXRlLXNwYWNlOiBwcmU7d29yZC13cmFwOiBicmVhay13b3JkO2xpbmUtaGVpZ2h0OiBub3JtYWw7Zm9udC1zdHlsZTogbm9ybWFsO2ZvbnQtd2VpZ2h0OiBub3JtYWw7bGV0dGVyLXNwYWNpbmc6IG5vcm1hbDtwb2ludGVyLWV2ZW50czogbm9uZTt9LmFjZV9mb2xkaW5nLWVuYWJsZWQgPiAuYWNlX2d1dHRlci1jZWxsIHtwYWRkaW5nLXJpZ2h0OiAxM3B4O30uYWNlX2ZvbGQtd2lkZ2V0IHtib3gtc2l6aW5nOiBib3JkZXItYm94O21hcmdpbjogMCAtMTJweCAwIDFweDtkaXNwbGF5OiBub25lO3dpZHRoOiAxMXB4O3ZlcnRpY2FsLWFsaWduOiB0b3A7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFVQUFBQUZDQVlBQUFDTmJ5YmxBQUFBTkVsRVFWUjQybVdLc1EwQU1BekM4aXhMbHJ6UWp6bUJpRWpwMEE2V3dCQ1NQZ0tBWG9Ma3FTb3Q3bk4zeU13UjdwWjMyTnpwS2tWb0RCVXhLQUFBQUFCSlJVNUVya0pnZ2c9PSIpO2JhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7YmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO2JvcmRlci1yYWRpdXM6IDNweDtib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtjdXJzb3I6IHBvaW50ZXI7fS5hY2VfZm9sZGluZy1lbmFibGVkIC5hY2VfZm9sZC13aWRnZXQge2Rpc3BsYXk6IGlubGluZS1ibG9jazsgICB9LmFjZV9mb2xkLXdpZGdldC5hY2VfZW5kIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFORWxFUVZSNDJtM0h3UWtBTUFoRDBZenNSY2hGS0k3c0Fpa2VXa3J4d1NjRUIwbmg1ZTdLVFBXaW1aa2k0dFlmVmJYK01ObDRweVpYZWpVTzFRQUFBQUJKUlU1RXJrSmdnZz09Iik7fS5hY2VfZm9sZC13aWRnZXQuYWNlX2Nsb3NlZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFNQUFBQUdDQVlBQUFBRzVTUU1BQUFBT1VsRVFWUjQyalhLd1FrQU1BZ0R3S3dxS0Q0RXdRMjZzU09rVldqZ0lJSEF6UGlDZ2FxaXFuSkhabktJQ0JFUkhOMTk0TzViOXZiTHVBVlJMK2wwWVduWkFBQUFBRWxGVGtTdVFtQ0NYQT09Iik7fS5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge2JvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4zKTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7Ym94LXNoYWRvdzogMCAxcHggMXB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTt9LmFjZV9mb2xkLXdpZGdldDphY3RpdmUge2JvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC40KTtiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMDUpO2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuOCk7fS5hY2VfZGFyayAuYWNlX2ZvbGQtd2lkZ2V0IHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFIa2xFUVZRSVcyUDQvLzgvQXpvR0VRN29HQ2FMTEFoV2lTd0IxNDZCQVFDU1RQWW9jcVQwQUFBQUFFbEZUa1N1UW1DQyIpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldC5hY2VfZW5kIHtiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVVBQUFBRkNBWUFBQUNOYnlibEFBQUFIMGxFUVZRSVcyUDQvLzgvQXhRN3dOaklBakRNZ0M0QXhqQ1ZLQmlySUFBRjBrejJybGh4cEFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQuYWNlX2Nsb3NlZCB7YmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFNQUFBQUZDQVlBQUFDQWNWYWlBQUFBSEVsRVFWUUlXMlA0Ly8rL0F4QXpnREFEbE9PQXpuSEFLZ1BXQXdBUmppOFVJRFRmUVFBQUFBQkpSVTVFcmtKZ2dnPT0iKTt9LmFjZV9kYXJrIC5hY2VfZm9sZC13aWRnZXQ6aG92ZXIge2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpO30uYWNlX2RhcmsgLmFjZV9mb2xkLXdpZGdldDphY3RpdmUge2JveC1zaGFkb3c6IDAgMXB4IDFweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7fS5hY2VfaW5saW5lX2J1dHRvbiB7Ym9yZGVyOiAxcHggc29saWQgbGlnaHRncmF5O2Rpc3BsYXk6IGlubGluZS1ibG9jazttYXJnaW46IC0xcHggOHB4O3BhZGRpbmc6IDAgNXB4O3BvaW50ZXItZXZlbnRzOiBhdXRvO2N1cnNvcjogcG9pbnRlcjt9LmFjZV9pbmxpbmVfYnV0dG9uOmhvdmVyIHtib3JkZXItY29sb3I6IGdyYXk7YmFja2dyb3VuZDogcmdiYSgyMDAsMjAwLDIwMCwwLjIpO2Rpc3BsYXk6IGlubGluZS1ibG9jaztwb2ludGVyLWV2ZW50czogYXV0bzt9LmFjZV9mb2xkLXdpZGdldC5hY2VfaW52YWxpZCB7YmFja2dyb3VuZC1jb2xvcjogI0ZGQjRCNDtib3JkZXItY29sb3I6ICNERTU1NTU7fS5hY2VfZmFkZS1mb2xkLXdpZGdldHMgLmFjZV9mb2xkLXdpZGdldCB7dHJhbnNpdGlvbjogb3BhY2l0eSAwLjRzIGVhc2UgMC4wNXM7b3BhY2l0eTogMDt9LmFjZV9mYWRlLWZvbGQtd2lkZ2V0czpob3ZlciAuYWNlX2ZvbGQtd2lkZ2V0IHt0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMDVzIGVhc2UgMC4wNXM7b3BhY2l0eToxO30uYWNlX3VuZGVybGluZSB7dGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7fS5hY2VfYm9sZCB7Zm9udC13ZWlnaHQ6IGJvbGQ7fS5hY2Vfbm9ib2xkIC5hY2VfYm9sZCB7Zm9udC13ZWlnaHQ6IG5vcm1hbDt9LmFjZV9pdGFsaWMge2ZvbnQtc3R5bGU6IGl0YWxpYzt9LmFjZV9lcnJvci1tYXJrZXIge2JhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAwLCAwLDAuMik7cG9zaXRpb246IGFic29sdXRlO3otaW5kZXg6IDk7fS5hY2VfaGlnaGxpZ2h0LW1hcmtlciB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMCwwLjIpO3Bvc2l0aW9uOiBhYnNvbHV0ZTt6LWluZGV4OiA4O30uYWNlX21vYmlsZS1tZW51IHtwb3NpdGlvbjogYWJzb2x1dGU7bGluZS1oZWlnaHQ6IDEuNTtib3JkZXItcmFkaXVzOiA0cHg7LW1zLXVzZXItc2VsZWN0OiBub25lOy1tb3otdXNlci1zZWxlY3Q6IG5vbmU7LXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTt1c2VyLXNlbGVjdDogbm9uZTtiYWNrZ3JvdW5kOiB3aGl0ZTtib3gtc2hhZG93OiAxcHggM3B4IDJweCBncmV5O2JvcmRlcjogMXB4IHNvbGlkICNkY2RjZGM7Y29sb3I6IGJsYWNrO30uYWNlX2RhcmsgPiAuYWNlX21vYmlsZS1tZW51IHtiYWNrZ3JvdW5kOiAjMzMzO2NvbG9yOiAjY2NjO2JveC1zaGFkb3c6IDFweCAzcHggMnB4IGdyZXk7Ym9yZGVyOiAxcHggc29saWQgIzQ0NDt9LmFjZV9tb2JpbGUtYnV0dG9uIHtwYWRkaW5nOiAycHg7Y3Vyc29yOiBwb2ludGVyO292ZXJmbG93OiBoaWRkZW47fS5hY2VfbW9iaWxlLWJ1dHRvbjpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjogI2VlZTtvcGFjaXR5OjE7fS5hY2VfbW9iaWxlLWJ1dHRvbjphY3RpdmUge2JhY2tncm91bmQtY29sb3I6ICNkZGQ7fScsbT1lKCIuL2xpYi91c2VyYWdlbnQiKSxnPW0uaXNJRTtpLmltcG9ydENzc1N0cmluZyh2LCJhY2VfZWRpdG9yLmNzcyIpO3ZhciB5PWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpczt0aGlzLmNvbnRhaW5lcj1lfHxpLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGkuYWRkQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9lZGl0b3IiKSxpLkhJX0RQSSYmaS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2hpZHBpIiksdGhpcy5zZXRUaGVtZSh0KSx0aGlzLiRndXR0ZXI9aS5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLiRndXR0ZXIuY2xhc3NOYW1lPSJhY2VfZ3V0dGVyIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLiRndXR0ZXIpLHRoaXMuJGd1dHRlci5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwhMCksdGhpcy5zY3JvbGxlcj1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2Nyb2xsZXIuY2xhc3NOYW1lPSJhY2Vfc2Nyb2xsZXIiLHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuc2Nyb2xsZXIpLHRoaXMuY29udGVudD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuY29udGVudC5jbGFzc05hbWU9ImFjZV9jb250ZW50Iix0aGlzLnNjcm9sbGVyLmFwcGVuZENoaWxkKHRoaXMuY29udGVudCksdGhpcy4kZ3V0dGVyTGF5ZXI9bmV3IG8odGhpcy4kZ3V0dGVyKSx0aGlzLiRndXR0ZXJMYXllci5vbigiY2hhbmdlR3V0dGVyV2lkdGgiLHRoaXMub25HdXR0ZXJSZXNpemUuYmluZCh0aGlzKSksdGhpcy4kbWFya2VyQmFjaz1uZXcgdSh0aGlzLmNvbnRlbnQpO3ZhciByPXRoaXMuJHRleHRMYXllcj1uZXcgYSh0aGlzLmNvbnRlbnQpO3RoaXMuY2FudmFzPXIuZWxlbWVudCx0aGlzLiRtYXJrZXJGcm9udD1uZXcgdSh0aGlzLmNvbnRlbnQpLHRoaXMuJGN1cnNvckxheWVyPW5ldyBmKHRoaXMuY29udGVudCksdGhpcy4kaG9yaXpTY3JvbGw9ITEsdGhpcy4kdlNjcm9sbD0hMSx0aGlzLnNjcm9sbEJhcj10aGlzLnNjcm9sbEJhclY9bmV3IGModGhpcy5jb250YWluZXIsdGhpcyksdGhpcy5zY3JvbGxCYXJIPW5ldyBsKHRoaXMuY29udGFpbmVyLHRoaXMpLHRoaXMuc2Nyb2xsQmFyVi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe24uJHNjcm9sbEFuaW1hdGlvbnx8bi5zZXNzaW9uLnNldFNjcm9sbFRvcChlLmRhdGEtbi5zY3JvbGxNYXJnaW4udG9wKX0pLHRoaXMuc2Nyb2xsQmFySC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGZ1bmN0aW9uKGUpe24uJHNjcm9sbEFuaW1hdGlvbnx8bi5zZXNzaW9uLnNldFNjcm9sbExlZnQoZS5kYXRhLW4uc2Nyb2xsTWFyZ2luLmxlZnQpfSksdGhpcy5zY3JvbGxUb3A9MCx0aGlzLnNjcm9sbExlZnQ9MCx0aGlzLmN1cnNvclBvcz17cm93OjAsY29sdW1uOjB9LHRoaXMuJGZvbnRNZXRyaWNzPW5ldyBwKHRoaXMuY29udGFpbmVyKSx0aGlzLiR0ZXh0TGF5ZXIuJHNldEZvbnRNZXRyaWNzKHRoaXMuJGZvbnRNZXRyaWNzKSx0aGlzLiR0ZXh0TGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZnVuY3Rpb24oZSl7bi51cGRhdGVDaGFyYWN0ZXJTaXplKCksbi5vblJlc2l6ZSghMCxuLmd1dHRlcldpZHRoLG4uJHNpemUud2lkdGgsbi4kc2l6ZS5oZWlnaHQpLG4uX3NpZ25hbCgiY2hhbmdlQ2hhcmFjdGVyU2l6ZSIsZSl9KSx0aGlzLiRzaXplPXt3aWR0aDowLGhlaWdodDowLHNjcm9sbGVySGVpZ2h0OjAsc2Nyb2xsZXJXaWR0aDowLCRkaXJ0eTohMH0sdGhpcy5sYXllckNvbmZpZz17d2lkdGg6MSxwYWRkaW5nOjAsZmlyc3RSb3c6MCxmaXJzdFJvd1NjcmVlbjowLGxhc3RSb3c6MCxsaW5lSGVpZ2h0OjAsY2hhcmFjdGVyV2lkdGg6MCxtaW5IZWlnaHQ6MSxtYXhIZWlnaHQ6MSxvZmZzZXQ6MCxoZWlnaHQ6MSxndXR0ZXJPZmZzZXQ6MX0sdGhpcy5zY3JvbGxNYXJnaW49e2xlZnQ6MCxyaWdodDowLHRvcDowLGJvdHRvbTowLHY6MCxoOjB9LHRoaXMubWFyZ2luPXtsZWZ0OjAscmlnaHQ6MCx0b3A6MCxib3R0b206MCx2OjAsaDowfSx0aGlzLiRrZWVwVGV4dEFyZWFBdEN1cnNvcj0hbS5pc0lPUyx0aGlzLiRsb29wPW5ldyBoKHRoaXMuJHJlbmRlckNoYW5nZXMuYmluZCh0aGlzKSx0aGlzLmNvbnRhaW5lci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMudXBkYXRlQ2hhcmFjdGVyU2l6ZSgpLHRoaXMuc2V0UGFkZGluZyg0KSxzLnJlc2V0T3B0aW9ucyh0aGlzKSxzLl9zaWduYWwoInJlbmRlcmVyIix0aGlzKX07KGZ1bmN0aW9uKCl7dGhpcy5DSEFOR0VfQ1VSU09SPTEsdGhpcy5DSEFOR0VfTUFSS0VSPTIsdGhpcy5DSEFOR0VfR1VUVEVSPTQsdGhpcy5DSEFOR0VfU0NST0xMPTgsdGhpcy5DSEFOR0VfTElORVM9MTYsdGhpcy5DSEFOR0VfVEVYVD0zMix0aGlzLkNIQU5HRV9TSVpFPTY0LHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLPTEyOCx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQ9MjU2LHRoaXMuQ0hBTkdFX0ZVTEw9NTEyLHRoaXMuQ0hBTkdFX0hfU0NST0xMPTEwMjQsci5pbXBsZW1lbnQodGhpcyxkKSx0aGlzLnVwZGF0ZUNoYXJhY3RlclNpemU9ZnVuY3Rpb24oKXt0aGlzLiR0ZXh0TGF5ZXIuYWxsb3dCb2xkRm9udHMhPXRoaXMuJGFsbG93Qm9sZEZvbnRzJiYodGhpcy4kYWxsb3dCb2xkRm9udHM9dGhpcy4kdGV4dExheWVyLmFsbG93Qm9sZEZvbnRzLHRoaXMuc2V0U3R5bGUoImFjZV9ub2JvbGQiLCF0aGlzLiRhbGxvd0JvbGRGb250cykpLHRoaXMubGF5ZXJDb25maWcuY2hhcmFjdGVyV2lkdGg9dGhpcy5jaGFyYWN0ZXJXaWR0aD10aGlzLiR0ZXh0TGF5ZXIuZ2V0Q2hhcmFjdGVyV2lkdGgoKSx0aGlzLmxheWVyQ29uZmlnLmxpbmVIZWlnaHQ9dGhpcy5saW5lSGVpZ2h0PXRoaXMuJHRleHRMYXllci5nZXRMaW5lSGVpZ2h0KCksdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImxpbmUtaGVpZ2h0Iix0aGlzLmxpbmVIZWlnaHQrInB4Iil9LHRoaXMuc2V0U2Vzc2lvbj1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5kb2Mub2ZmKCJjaGFuZ2VOZXdMaW5lTW9kZSIsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlKSx0aGlzLnNlc3Npb249ZSxlJiZ0aGlzLnNjcm9sbE1hcmdpbi50b3AmJmUuZ2V0U2Nyb2xsVG9wKCk8PTAmJmUuc2V0U2Nyb2xsVG9wKC10aGlzLnNjcm9sbE1hcmdpbi50b3ApLHRoaXMuJGN1cnNvckxheWVyLnNldFNlc3Npb24oZSksdGhpcy4kbWFya2VyQmFjay5zZXRTZXNzaW9uKGUpLHRoaXMuJG1hcmtlckZyb250LnNldFNlc3Npb24oZSksdGhpcy4kZ3V0dGVyTGF5ZXIuc2V0U2Vzc2lvbihlKSx0aGlzLiR0ZXh0TGF5ZXIuc2V0U2Vzc2lvbihlKTtpZighZSlyZXR1cm47dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKSx0aGlzLnNlc3Npb24uJHNldEZvbnRNZXRyaWNzKHRoaXMuJGZvbnRNZXRyaWNzKSx0aGlzLnNjcm9sbEJhckguc2Nyb2xsTGVmdD10aGlzLnNjcm9sbEJhclYuc2Nyb2xsVG9wPW51bGwsdGhpcy5vbkNoYW5nZU5ld0xpbmVNb2RlPXRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZS5iaW5kKHRoaXMpLHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZSgpLHRoaXMuc2Vzc2lvbi5kb2Mub24oImNoYW5nZU5ld0xpbmVNb2RlIix0aGlzLm9uQ2hhbmdlTmV3TGluZU1vZGUpfSx0aGlzLnVwZGF0ZUxpbmVzPWZ1bmN0aW9uKGUsdCxuKXt0PT09dW5kZWZpbmVkJiYodD1JbmZpbml0eSksdGhpcy4kY2hhbmdlZExpbmVzPyh0aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3c+ZSYmKHRoaXMuJGNoYW5nZWRMaW5lcy5maXJzdFJvdz1lKSx0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzx0JiYodGhpcy4kY2hhbmdlZExpbmVzLmxhc3RSb3c9dCkpOnRoaXMuJGNoYW5nZWRMaW5lcz17Zmlyc3RSb3c6ZSxsYXN0Um93OnR9O2lmKHRoaXMuJGNoYW5nZWRMaW5lcy5sYXN0Um93PHRoaXMubGF5ZXJDb25maWcuZmlyc3RSb3cpe2lmKCFuKXJldHVybjt0aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdz10aGlzLmxheWVyQ29uZmlnLmxhc3RSb3d9aWYodGhpcy4kY2hhbmdlZExpbmVzLmZpcnN0Um93PnRoaXMubGF5ZXJDb25maWcubGFzdFJvdylyZXR1cm47dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9MSU5FUyl9LHRoaXMub25DaGFuZ2VOZXdMaW5lTW9kZT1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfVEVYVCksdGhpcy4kdGV4dExheWVyLiR1cGRhdGVFb2xDaGFyKCksdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRFb2xDaGFyKHRoaXMuJHRleHRMYXllci5FT0xfQ0hBUil9LHRoaXMub25DaGFuZ2VUYWJTaXplPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUfHRoaXMuQ0hBTkdFX01BUktFUiksdGhpcy4kdGV4dExheWVyLm9uQ2hhbmdlVGFiU2l6ZSgpfSx0aGlzLnVwZGF0ZVRleHQ9ZnVuY3Rpb24oKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSx0aGlzLnVwZGF0ZUZ1bGw9ZnVuY3Rpb24oZSl7ZT90aGlzLiRyZW5kZXJDaGFuZ2VzKHRoaXMuQ0hBTkdFX0ZVTEwsITApOnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCl9LHRoaXMudXBkYXRlRm9udFNpemU9ZnVuY3Rpb24oKXt0aGlzLiR0ZXh0TGF5ZXIuY2hlY2tGb3JTaXplQ2hhbmdlcygpfSx0aGlzLiRjaGFuZ2VzPTAsdGhpcy4kdXBkYXRlU2l6ZUFzeW5jPWZ1bmN0aW9uKCl7dGhpcy4kbG9vcC5wZW5kaW5nP3RoaXMuJHNpemUuJGRpcnR5PSEwOnRoaXMub25SZXNpemUoKX0sdGhpcy5vblJlc2l6ZT1mdW5jdGlvbihlLHQsbixyKXtpZih0aGlzLnJlc2l6aW5nPjIpcmV0dXJuO3RoaXMucmVzaXppbmc+MD90aGlzLnJlc2l6aW5nKys6dGhpcy5yZXNpemluZz1lPzE6MDt2YXIgaT10aGlzLmNvbnRhaW5lcjtyfHwocj1pLmNsaWVudEhlaWdodHx8aS5zY3JvbGxIZWlnaHQpLG58fChuPWkuY2xpZW50V2lkdGh8fGkuc2Nyb2xsV2lkdGgpO3ZhciBzPXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoZSx0LG4scik7aWYoIXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHR8fCFuJiYhcilyZXR1cm4gdGhpcy5yZXNpemluZz0wO2UmJih0aGlzLiRndXR0ZXJMYXllci4kcGFkZGluZz1udWxsKSxlP3RoaXMuJHJlbmRlckNoYW5nZXMoc3x0aGlzLiRjaGFuZ2VzLCEwKTp0aGlzLiRsb29wLnNjaGVkdWxlKHN8dGhpcy4kY2hhbmdlcyksdGhpcy5yZXNpemluZyYmKHRoaXMucmVzaXppbmc9MCksdGhpcy5zY3JvbGxCYXJWLnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxCYXJWLnNjcm9sbFRvcD1udWxsfSx0aGlzLiR1cGRhdGVDYWNoZWRTaXplPWZ1bmN0aW9uKGUsdCxuLHIpe3ItPXRoaXMuJGV4dHJhSGVpZ2h0fHwwO3ZhciBzPTAsbz10aGlzLiRzaXplLHU9e3dpZHRoOm8ud2lkdGgsaGVpZ2h0Om8uaGVpZ2h0LHNjcm9sbGVySGVpZ2h0Om8uc2Nyb2xsZXJIZWlnaHQsc2Nyb2xsZXJXaWR0aDpvLnNjcm9sbGVyV2lkdGh9O3ImJihlfHxvLmhlaWdodCE9cikmJihvLmhlaWdodD1yLHN8PXRoaXMuQ0hBTkdFX1NJWkUsby5zY3JvbGxlckhlaWdodD1vLmhlaWdodCx0aGlzLiRob3JpelNjcm9sbCYmKG8uc2Nyb2xsZXJIZWlnaHQtPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSksdGhpcy5zY3JvbGxCYXJWLmVsZW1lbnQuc3R5bGUuYm90dG9tPXRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSsicHgiLHN8PXRoaXMuQ0hBTkdFX1NDUk9MTCk7aWYobiYmKGV8fG8ud2lkdGghPW4pKXtzfD10aGlzLkNIQU5HRV9TSVpFLG8ud2lkdGg9bix0PT1udWxsJiYodD10aGlzLiRzaG93R3V0dGVyP3RoaXMuJGd1dHRlci5vZmZzZXRXaWR0aDowKSx0aGlzLmd1dHRlcldpZHRoPXQsaS5zZXRTdHlsZSh0aGlzLnNjcm9sbEJhckguZWxlbWVudC5zdHlsZSwibGVmdCIsdCsicHgiKSxpLnNldFN0eWxlKHRoaXMuc2Nyb2xsZXIuc3R5bGUsImxlZnQiLHQrdGhpcy5tYXJnaW4ubGVmdCsicHgiKSxvLnNjcm9sbGVyV2lkdGg9TWF0aC5tYXgoMCxuLXQtdGhpcy5zY3JvbGxCYXJWLmdldFdpZHRoKCktdGhpcy5tYXJnaW4uaCksaS5zZXRTdHlsZSh0aGlzLiRndXR0ZXIuc3R5bGUsImxlZnQiLHRoaXMubWFyZ2luLmxlZnQrInB4Iik7dmFyIGE9dGhpcy5zY3JvbGxCYXJWLmdldFdpZHRoKCkrInB4IjtpLnNldFN0eWxlKHRoaXMuc2Nyb2xsQmFySC5lbGVtZW50LnN0eWxlLCJyaWdodCIsYSksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJyaWdodCIsYSksaS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJib3R0b20iLHRoaXMuc2Nyb2xsQmFySC5nZXRIZWlnaHQoKSk7aWYodGhpcy5zZXNzaW9uJiZ0aGlzLnNlc3Npb24uZ2V0VXNlV3JhcE1vZGUoKSYmdGhpcy5hZGp1c3RXcmFwTGltaXQoKXx8ZSlzfD10aGlzLkNIQU5HRV9GVUxMfXJldHVybiBvLiRkaXJ0eT0hbnx8IXIscyYmdGhpcy5fc2lnbmFsKCJyZXNpemUiLHUpLHN9LHRoaXMub25HdXR0ZXJSZXNpemU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy4kc2hvd0d1dHRlcj9lOjA7dCE9dGhpcy5ndXR0ZXJXaWR0aCYmKHRoaXMuJGNoYW5nZXN8PXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdCx0aGlzLiRzaXplLndpZHRoLHRoaXMuJHNpemUuaGVpZ2h0KSksdGhpcy5zZXNzaW9uLmdldFVzZVdyYXBNb2RlKCkmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCk/dGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9GVUxMKTp0aGlzLiRzaXplLiRkaXJ0eT90aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpOnRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfSx0aGlzLmFkanVzdFdyYXBMaW1pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC10aGlzLiRwYWRkaW5nKjIsdD1NYXRoLmZsb29yKGUvdGhpcy5jaGFyYWN0ZXJXaWR0aCk7cmV0dXJuIHRoaXMuc2Vzc2lvbi5hZGp1c3RXcmFwTGltaXQodCx0aGlzLiRzaG93UHJpbnRNYXJnaW4mJnRoaXMuJHByaW50TWFyZ2luQ29sdW1uKX0sdGhpcy5zZXRBbmltYXRlZFNjcm9sbD1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiYW5pbWF0ZWRTY3JvbGwiLGUpfSx0aGlzLmdldEFuaW1hdGVkU2Nyb2xsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGFuaW1hdGVkU2Nyb2xsfSx0aGlzLnNldFNob3dJbnZpc2libGVzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93SW52aXNpYmxlcyIsZSksdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5zZXRTaG93SW52aXNpYmxlcyhlKX0sdGhpcy5nZXRTaG93SW52aXNpYmxlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd0ludmlzaWJsZXMiKX0sdGhpcy5nZXREaXNwbGF5SW5kZW50R3VpZGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJkaXNwbGF5SW5kZW50R3VpZGVzIil9LHRoaXMuc2V0RGlzcGxheUluZGVudEd1aWRlcz1mdW5jdGlvbihlKXt0aGlzLnNldE9wdGlvbigiZGlzcGxheUluZGVudEd1aWRlcyIsZSl9LHRoaXMuc2V0U2hvd1ByaW50TWFyZ2luPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJzaG93UHJpbnRNYXJnaW4iLGUpfSx0aGlzLmdldFNob3dQcmludE1hcmdpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigic2hvd1ByaW50TWFyZ2luIil9LHRoaXMuc2V0UHJpbnRNYXJnaW5Db2x1bW49ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInByaW50TWFyZ2luQ29sdW1uIixlKX0sdGhpcy5nZXRQcmludE1hcmdpbkNvbHVtbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigicHJpbnRNYXJnaW5Db2x1bW4iKX0sdGhpcy5nZXRTaG93R3V0dGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0T3B0aW9uKCJzaG93R3V0dGVyIil9LHRoaXMuc2V0U2hvd0d1dHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zZXRPcHRpb24oInNob3dHdXR0ZXIiLGUpfSx0aGlzLmdldEZhZGVGb2xkV2lkZ2V0cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE9wdGlvbigiZmFkZUZvbGRXaWRnZXRzIil9LHRoaXMuc2V0RmFkZUZvbGRXaWRnZXRzPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJmYWRlRm9sZFdpZGdldHMiLGUpfSx0aGlzLnNldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiLGUpfSx0aGlzLmdldEhpZ2hsaWdodEd1dHRlckxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRPcHRpb24oImhpZ2hsaWdodEd1dHRlckxpbmUiKX0sdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW49ZnVuY3Rpb24oKXtpZighdGhpcy4kc2hvd1ByaW50TWFyZ2luJiYhdGhpcy4kcHJpbnRNYXJnaW5FbClyZXR1cm47aWYoIXRoaXMuJHByaW50TWFyZ2luRWwpe3ZhciBlPWkuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZS5jbGFzc05hbWU9ImFjZV9sYXllciBhY2VfcHJpbnQtbWFyZ2luLWxheWVyIix0aGlzLiRwcmludE1hcmdpbkVsPWkuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy4kcHJpbnRNYXJnaW5FbC5jbGFzc05hbWU9ImFjZV9wcmludC1tYXJnaW4iLGUuYXBwZW5kQ2hpbGQodGhpcy4kcHJpbnRNYXJnaW5FbCksdGhpcy5jb250ZW50Lmluc2VydEJlZm9yZShlLHRoaXMuY29udGVudC5maXJzdENoaWxkKX12YXIgdD10aGlzLiRwcmludE1hcmdpbkVsLnN0eWxlO3QubGVmdD1NYXRoLnJvdW5kKHRoaXMuY2hhcmFjdGVyV2lkdGgqdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW4rdGhpcy4kcGFkZGluZykrInB4Iix0LnZpc2liaWxpdHk9dGhpcy4kc2hvd1ByaW50TWFyZ2luPyJ2aXNpYmxlIjoiaGlkZGVuIix0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi4kd3JhcD09LTEmJnRoaXMuYWRqdXN0V3JhcExpbWl0KCl9LHRoaXMuZ2V0Q29udGFpbmVyRWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhaW5lcn0sdGhpcy5nZXRNb3VzZUV2ZW50VGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsZXJ9LHRoaXMuZ2V0VGV4dEFyZWFDb250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWluZXJ9LHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yPWZ1bmN0aW9uKCl7aWYodGhpcy4kaXNNb3VzZVByZXNzZWQpcmV0dXJuO3ZhciBlPXRoaXMudGV4dGFyZWEuc3R5bGUsdD10aGlzLiRjb21wb3NpdGlvbjtpZighdGhpcy4ka2VlcFRleHRBcmVhQXRDdXJzb3ImJiF0KXtpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLC0xMDAsMCk7cmV0dXJufXZhciBuPXRoaXMuJGN1cnNvckxheWVyLiRwaXhlbFBvcztpZighbilyZXR1cm47dCYmdC5tYXJrZXJSYW5nZSYmKG49dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih0Lm1hcmtlclJhbmdlLnN0YXJ0LCEwKSk7dmFyIHI9dGhpcy5sYXllckNvbmZpZyxzPW4udG9wLG89bi5sZWZ0O3MtPXIub2Zmc2V0O3ZhciB1PXQmJnQudXNlVGV4dGFyZWFGb3JJTUU/dGhpcy5saW5lSGVpZ2h0Omc/MDoxO2lmKHM8MHx8cz5yLmhlaWdodC11KXtpLnRyYW5zbGF0ZSh0aGlzLnRleHRhcmVhLDAsMCk7cmV0dXJufXZhciBhPTEsZj10aGlzLiRzaXplLmhlaWdodC11O2lmKCF0KXMrPXRoaXMubGluZUhlaWdodDtlbHNlIGlmKHQudXNlVGV4dGFyZWFGb3JJTUUpe3ZhciBsPXRoaXMudGV4dGFyZWEudmFsdWU7YT10aGlzLmNoYXJhY3RlcldpZHRoKnRoaXMuc2Vzc2lvbi4kZ2V0U3RyaW5nU2NyZWVuV2lkdGgobClbMF0sdSs9Mn1lbHNlIHMrPXRoaXMubGluZUhlaWdodCsyO28tPXRoaXMuc2Nyb2xsTGVmdCxvPnRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hJiYobz10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgtYSksbys9dGhpcy5ndXR0ZXJXaWR0aCt0aGlzLm1hcmdpbi5sZWZ0LGkuc2V0U3R5bGUoZSwiaGVpZ2h0Iix1KyJweCIpLGkuc2V0U3R5bGUoZSwid2lkdGgiLGErInB4IiksaS50cmFuc2xhdGUodGhpcy50ZXh0YXJlYSxNYXRoLm1pbihvLHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC1hKSxNYXRoLm1pbihzLGYpKX0sdGhpcy5nZXRGaXJzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5maXJzdFJvd30sdGhpcy5nZXRGaXJzdEZ1bGx5VmlzaWJsZVJvdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93Kyh0aGlzLmxheWVyQ29uZmlnLm9mZnNldD09PTA/MDoxKX0sdGhpcy5nZXRMYXN0RnVsbHlWaXNpYmxlUm93PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sYXllckNvbmZpZyx0PWUubGFzdFJvdyxuPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUm93KHQsMCkqZS5saW5lSGVpZ2h0O3JldHVybiBuLXRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKT5lLmhlaWdodC1lLmxpbmVIZWlnaHQ/dC0xOnR9LHRoaXMuZ2V0TGFzdFZpc2libGVSb3c9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYXllckNvbmZpZy5sYXN0Um93fSx0aGlzLiRwYWRkaW5nPW51bGwsdGhpcy5zZXRQYWRkaW5nPWZ1bmN0aW9uKGUpe3RoaXMuJHBhZGRpbmc9ZSx0aGlzLiR0ZXh0TGF5ZXIuc2V0UGFkZGluZyhlKSx0aGlzLiRjdXJzb3JMYXllci5zZXRQYWRkaW5nKGUpLHRoaXMuJG1hcmtlckZyb250LnNldFBhZGRpbmcoZSksdGhpcy4kbWFya2VyQmFjay5zZXRQYWRkaW5nKGUpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfRlVMTCksdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sdGhpcy5zZXRTY3JvbGxNYXJnaW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5zY3JvbGxNYXJnaW47aS50b3A9ZXwwLGkuYm90dG9tPXR8MCxpLnJpZ2h0PXJ8MCxpLmxlZnQ9bnwwLGkudj1pLnRvcCtpLmJvdHRvbSxpLmg9aS5sZWZ0K2kucmlnaHQsaS50b3AmJnRoaXMuc2Nyb2xsVG9wPD0wJiZ0aGlzLnNlc3Npb24mJnRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoLWkudG9wKSx0aGlzLnVwZGF0ZUZ1bGwoKX0sdGhpcy5zZXRNYXJnaW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5tYXJnaW47aS50b3A9ZXwwLGkuYm90dG9tPXR8MCxpLnJpZ2h0PXJ8MCxpLmxlZnQ9bnwwLGkudj1pLnRvcCtpLmJvdHRvbSxpLmg9aS5sZWZ0K2kucmlnaHQsdGhpcy4kdXBkYXRlQ2FjaGVkU2l6ZSghMCx0aGlzLmd1dHRlcldpZHRoLHRoaXMuJHNpemUud2lkdGgsdGhpcy4kc2l6ZS5oZWlnaHQpLHRoaXMudXBkYXRlRnVsbCgpfSx0aGlzLmdldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfSx0aGlzLnNldEhTY3JvbGxCYXJBbHdheXNWaXNpYmxlPWZ1bmN0aW9uKGUpe3RoaXMuc2V0T3B0aW9uKCJoU2Nyb2xsQmFyQWx3YXlzVmlzaWJsZSIsZSl9LHRoaXMuZ2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kdlNjcm9sbEJhckFsd2F5c1Zpc2libGV9LHRoaXMuc2V0VlNjcm9sbEJhckFsd2F5c1Zpc2libGU9ZnVuY3Rpb24oZSl7dGhpcy5zZXRPcHRpb24oInZTY3JvbGxCYXJBbHdheXNWaXNpYmxlIixlKX0sdGhpcy4kdXBkYXRlU2Nyb2xsQmFyVj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0LHQ9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodDshdGhpcy4kbWF4TGluZXMmJnRoaXMuJHNjcm9sbFBhc3RFbmQmJihlLT0odC10aGlzLmxpbmVIZWlnaHQpKnRoaXMuJHNjcm9sbFBhc3RFbmQsdGhpcy5zY3JvbGxUb3A+ZS10JiYoZT10aGlzLnNjcm9sbFRvcCt0LHRoaXMuc2Nyb2xsQmFyVi5zY3JvbGxUb3A9bnVsbCkpLHRoaXMuc2Nyb2xsQmFyVi5zZXRTY3JvbGxIZWlnaHQoZSt0aGlzLnNjcm9sbE1hcmdpbi52KSx0aGlzLnNjcm9sbEJhclYuc2V0U2Nyb2xsVG9wKHRoaXMuc2Nyb2xsVG9wK3RoaXMuc2Nyb2xsTWFyZ2luLnRvcCl9LHRoaXMuJHVwZGF0ZVNjcm9sbEJhckg9ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbEJhckguc2V0U2Nyb2xsV2lkdGgodGhpcy5sYXllckNvbmZpZy53aWR0aCsyKnRoaXMuJHBhZGRpbmcrdGhpcy5zY3JvbGxNYXJnaW4uaCksdGhpcy5zY3JvbGxCYXJILnNldFNjcm9sbExlZnQodGhpcy5zY3JvbGxMZWZ0K3RoaXMuc2Nyb2xsTWFyZ2luLmxlZnQpfSx0aGlzLiRmcm96ZW49ITEsdGhpcy5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLiRmcm96ZW49ITB9LHRoaXMudW5mcmVlemU9ZnVuY3Rpb24oKXt0aGlzLiRmcm96ZW49ITF9LHRoaXMuJHJlbmRlckNoYW5nZXM9ZnVuY3Rpb24oZSx0KXt0aGlzLiRjaGFuZ2VzJiYoZXw9dGhpcy4kY2hhbmdlcyx0aGlzLiRjaGFuZ2VzPTApO2lmKCF0aGlzLnNlc3Npb258fCF0aGlzLmNvbnRhaW5lci5vZmZzZXRXaWR0aHx8dGhpcy4kZnJvemVufHwhZSYmIXQpe3RoaXMuJGNoYW5nZXN8PWU7cmV0dXJufWlmKHRoaXMuJHNpemUuJGRpcnR5KXJldHVybiB0aGlzLiRjaGFuZ2VzfD1lLHRoaXMub25SZXNpemUoITApO3RoaXMubGluZUhlaWdodHx8dGhpcy4kdGV4dExheWVyLmNoZWNrRm9yU2l6ZUNoYW5nZXMoKSx0aGlzLl9zaWduYWwoImJlZm9yZVJlbmRlciIpLHRoaXMuc2Vzc2lvbiYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlciYmdGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci51cGRhdGVDaGFyYWN0ZXJXaWR0aHModGhpcy4kZm9udE1ldHJpY3MpO3ZhciBuPXRoaXMubGF5ZXJDb25maWc7aWYoZSZ0aGlzLkNIQU5HRV9GVUxMfHxlJnRoaXMuQ0hBTkdFX1NJWkV8fGUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9MSU5FU3x8ZSZ0aGlzLkNIQU5HRV9TQ1JPTEx8fGUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwpe2V8PXRoaXMuJGNvbXB1dGVMYXllckNvbmZpZygpfHRoaXMuJGxvb3AuY2xlYXIoKTtpZihuLmZpcnN0Um93IT10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93JiZuLmZpcnN0Um93U2NyZWVuPT10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93U2NyZWVuKXt2YXIgcj10aGlzLnNjcm9sbFRvcCsobi5maXJzdFJvdy10aGlzLmxheWVyQ29uZmlnLmZpcnN0Um93KSp0aGlzLmxpbmVIZWlnaHQ7cj4wJiYodGhpcy5zY3JvbGxUb3A9cixlfD10aGlzLkNIQU5HRV9TQ1JPTEwsZXw9dGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnKCl8dGhpcy4kbG9vcC5jbGVhcigpKX1uPXRoaXMubGF5ZXJDb25maWcsdGhpcy4kdXBkYXRlU2Nyb2xsQmFyVigpLGUmdGhpcy5DSEFOR0VfSF9TQ1JPTEwmJnRoaXMuJHVwZGF0ZVNjcm9sbEJhckgoKSxpLnRyYW5zbGF0ZSh0aGlzLmNvbnRlbnQsLXRoaXMuc2Nyb2xsTGVmdCwtbi5vZmZzZXQpO3ZhciBzPW4ud2lkdGgrMip0aGlzLiRwYWRkaW5nKyJweCIsbz1uLm1pbkhlaWdodCsicHgiO2kuc2V0U3R5bGUodGhpcy5jb250ZW50LnN0eWxlLCJ3aWR0aCIscyksaS5zZXRTdHlsZSh0aGlzLmNvbnRlbnQuc3R5bGUsImhlaWdodCIsbyl9ZSZ0aGlzLkNIQU5HRV9IX1NDUk9MTCYmKGkudHJhbnNsYXRlKHRoaXMuY29udGVudCwtdGhpcy5zY3JvbGxMZWZ0LC1uLm9mZnNldCksdGhpcy5zY3JvbGxlci5jbGFzc05hbWU9dGhpcy5zY3JvbGxMZWZ0PD0wPyJhY2Vfc2Nyb2xsZXIiOiJhY2Vfc2Nyb2xsZXIgYWNlX3Njcm9sbC1sZWZ0Iik7aWYoZSZ0aGlzLkNIQU5HRV9GVUxMKXt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbCx0aGlzLiR0ZXh0TGF5ZXIudXBkYXRlKG4pLHRoaXMuJHNob3dHdXR0ZXImJnRoaXMuJGd1dHRlckxheWVyLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJCYWNrLnVwZGF0ZShuKSx0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksdGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpO3JldHVybn1pZihlJnRoaXMuQ0hBTkdFX1NDUk9MTCl7dGhpcy4kY2hhbmdlZExpbmVzPW51bGwsZSZ0aGlzLkNIQU5HRV9URVhUfHxlJnRoaXMuQ0hBTkdFX0xJTkVTP3RoaXMuJHRleHRMYXllci51cGRhdGUobik6dGhpcy4kdGV4dExheWVyLnNjcm9sbExpbmVzKG4pLHRoaXMuJHNob3dHdXR0ZXImJihlJnRoaXMuQ0hBTkdFX0dVVFRFUnx8ZSZ0aGlzLkNIQU5HRV9MSU5FUz90aGlzLiRndXR0ZXJMYXllci51cGRhdGUobik6dGhpcy4kZ3V0dGVyTGF5ZXIuc2Nyb2xsTGluZXMobikpLHRoaXMuJG1hcmtlckJhY2sudXBkYXRlKG4pLHRoaXMuJG1hcmtlckZyb250LnVwZGF0ZShuKSx0aGlzLiRjdXJzb3JMYXllci51cGRhdGUobiksdGhpcy4kbW92ZVRleHRBcmVhVG9DdXJzb3IoKSx0aGlzLl9zaWduYWwoImFmdGVyUmVuZGVyIik7cmV0dXJufWUmdGhpcy5DSEFOR0VfVEVYVD8odGhpcy4kY2hhbmdlZExpbmVzPW51bGwsdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKSx0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobikpOmUmdGhpcy5DSEFOR0VfTElORVM/KHRoaXMuJHVwZGF0ZUxpbmVzKCl8fGUmdGhpcy5DSEFOR0VfR1VUVEVSJiZ0aGlzLiRzaG93R3V0dGVyKSYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOmUmdGhpcy5DSEFOR0VfVEVYVHx8ZSZ0aGlzLkNIQU5HRV9HVVRURVI/dGhpcy4kc2hvd0d1dHRlciYmdGhpcy4kZ3V0dGVyTGF5ZXIudXBkYXRlKG4pOmUmdGhpcy5DSEFOR0VfQ1VSU09SJiZ0aGlzLiRoaWdobGlnaHRHdXR0ZXJMaW5lJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGVMaW5lSGlnaGxpZ2h0KG4pLGUmdGhpcy5DSEFOR0VfQ1VSU09SJiYodGhpcy4kY3Vyc29yTGF5ZXIudXBkYXRlKG4pLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCkpLGUmKHRoaXMuQ0hBTkdFX01BUktFUnx0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpJiZ0aGlzLiRtYXJrZXJGcm9udC51cGRhdGUobiksZSYodGhpcy5DSEFOR0VfTUFSS0VSfHRoaXMuQ0hBTkdFX01BUktFUl9CQUNLKSYmdGhpcy4kbWFya2VyQmFjay51cGRhdGUobiksdGhpcy5fc2lnbmFsKCJhZnRlclJlbmRlciIpfSx0aGlzLiRhdXRvc2l6ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MZW5ndGgoKSp0aGlzLmxpbmVIZWlnaHQsdD10aGlzLiRtYXhMaW5lcyp0aGlzLmxpbmVIZWlnaHQsbj1NYXRoLm1pbih0LE1hdGgubWF4KCh0aGlzLiRtaW5MaW5lc3x8MSkqdGhpcy5saW5lSGVpZ2h0LGUpKSt0aGlzLnNjcm9sbE1hcmdpbi52Kyh0aGlzLiRleHRyYUhlaWdodHx8MCk7dGhpcy4kaG9yaXpTY3JvbGwmJihuKz10aGlzLnNjcm9sbEJhckguZ2V0SGVpZ2h0KCkpLHRoaXMuJG1heFBpeGVsSGVpZ2h0JiZuPnRoaXMuJG1heFBpeGVsSGVpZ2h0JiYobj10aGlzLiRtYXhQaXhlbEhlaWdodCk7dmFyIHI9bjw9Mip0aGlzLmxpbmVIZWlnaHQsaT0hciYmZT50O2lmKG4hPXRoaXMuZGVzaXJlZEhlaWdodHx8dGhpcy4kc2l6ZS5oZWlnaHQhPXRoaXMuZGVzaXJlZEhlaWdodHx8aSE9dGhpcy4kdlNjcm9sbCl7aSE9dGhpcy4kdlNjcm9sbCYmKHRoaXMuJHZTY3JvbGw9aSx0aGlzLnNjcm9sbEJhclYuc2V0VmlzaWJsZShpKSk7dmFyIHM9dGhpcy5jb250YWluZXIuY2xpZW50V2lkdGg7dGhpcy5jb250YWluZXIuc3R5bGUuaGVpZ2h0PW4rInB4Iix0aGlzLiR1cGRhdGVDYWNoZWRTaXplKCEwLHRoaXMuJGd1dHRlcldpZHRoLHMsbiksdGhpcy5kZXNpcmVkSGVpZ2h0PW4sdGhpcy5fc2lnbmFsKCJhdXRvc2l6ZSIpfX0sdGhpcy4kY29tcHV0ZUxheWVyQ29uZmlnPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpcy4kc2l6ZSxuPXQuaGVpZ2h0PD0yKnRoaXMubGluZUhlaWdodCxyPXRoaXMuc2Vzc2lvbi5nZXRTY3JlZW5MZW5ndGgoKSxpPXIqdGhpcy5saW5lSGVpZ2h0LHM9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSxvPSFuJiYodGhpcy4kaFNjcm9sbEJhckFsd2F5c1Zpc2libGV8fHQuc2Nyb2xsZXJXaWR0aC1zLTIqdGhpcy4kcGFkZGluZzwwKSx1PXRoaXMuJGhvcml6U2Nyb2xsIT09bzt1JiYodGhpcy4kaG9yaXpTY3JvbGw9byx0aGlzLnNjcm9sbEJhckguc2V0VmlzaWJsZShvKSk7dmFyIGE9dGhpcy4kdlNjcm9sbDt0aGlzLiRtYXhMaW5lcyYmdGhpcy5saW5lSGVpZ2h0PjEmJnRoaXMuJGF1dG9zaXplKCk7dmFyIGY9dC5zY3JvbGxlckhlaWdodCt0aGlzLmxpbmVIZWlnaHQsbD0hdGhpcy4kbWF4TGluZXMmJnRoaXMuJHNjcm9sbFBhc3RFbmQ/KHQuc2Nyb2xsZXJIZWlnaHQtdGhpcy5saW5lSGVpZ2h0KSp0aGlzLiRzY3JvbGxQYXN0RW5kOjA7aSs9bDt2YXIgYz10aGlzLnNjcm9sbE1hcmdpbjt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKE1hdGgubWF4KC1jLnRvcCxNYXRoLm1pbih0aGlzLnNjcm9sbFRvcCxpLXQuc2Nyb2xsZXJIZWlnaHQrYy5ib3R0b20pKSksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoTWF0aC5tYXgoLWMubGVmdCxNYXRoLm1pbih0aGlzLnNjcm9sbExlZnQscysyKnRoaXMuJHBhZGRpbmctdC5zY3JvbGxlcldpZHRoK2MucmlnaHQpKSk7dmFyIGg9IW4mJih0aGlzLiR2U2Nyb2xsQmFyQWx3YXlzVmlzaWJsZXx8dC5zY3JvbGxlckhlaWdodC1pK2w8MHx8dGhpcy5zY3JvbGxUb3A+Yy50b3ApLHA9YSE9PWg7cCYmKHRoaXMuJHZTY3JvbGw9aCx0aGlzLnNjcm9sbEJhclYuc2V0VmlzaWJsZShoKSk7dmFyIGQ9dGhpcy5zY3JvbGxUb3AldGhpcy5saW5lSGVpZ2h0LHY9TWF0aC5jZWlsKGYvdGhpcy5saW5lSGVpZ2h0KS0xLG09TWF0aC5tYXgoMCxNYXRoLnJvdW5kKCh0aGlzLnNjcm9sbFRvcC1kKS90aGlzLmxpbmVIZWlnaHQpKSxnPW0rdix5LGIsdz10aGlzLmxpbmVIZWlnaHQ7bT1lLnNjcmVlblRvRG9jdW1lbnRSb3cobSwwKTt2YXIgRT1lLmdldEZvbGRMaW5lKG0pO0UmJihtPUUuc3RhcnQucm93KSx5PWUuZG9jdW1lbnRUb1NjcmVlblJvdyhtLDApLGI9ZS5nZXRSb3dMZW5ndGgobSkqdyxnPU1hdGgubWluKGUuc2NyZWVuVG9Eb2N1bWVudFJvdyhnLDApLGUuZ2V0TGVuZ3RoKCktMSksZj10LnNjcm9sbGVySGVpZ2h0K2UuZ2V0Um93TGVuZ3RoKGcpKncrYixkPXRoaXMuc2Nyb2xsVG9wLXkqdzt2YXIgUz0wO2lmKHRoaXMubGF5ZXJDb25maWcud2lkdGghPXN8fHUpUz10aGlzLkNIQU5HRV9IX1NDUk9MTDtpZih1fHxwKVN8PXRoaXMuJHVwZGF0ZUNhY2hlZFNpemUoITAsdGhpcy5ndXR0ZXJXaWR0aCx0LndpZHRoLHQuaGVpZ2h0KSx0aGlzLl9zaWduYWwoInNjcm9sbGJhclZpc2liaWxpdHlDaGFuZ2VkIikscCYmKHM9dGhpcy4kZ2V0TG9uZ2VzdExpbmUoKSk7cmV0dXJuIHRoaXMubGF5ZXJDb25maWc9e3dpZHRoOnMscGFkZGluZzp0aGlzLiRwYWRkaW5nLGZpcnN0Um93Om0sZmlyc3RSb3dTY3JlZW46eSxsYXN0Um93OmcsbGluZUhlaWdodDp3LGNoYXJhY3RlcldpZHRoOnRoaXMuY2hhcmFjdGVyV2lkdGgsbWluSGVpZ2h0OmYsbWF4SGVpZ2h0Omksb2Zmc2V0OmQsZ3V0dGVyT2Zmc2V0Onc/TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGQrdC5oZWlnaHQtdC5zY3JvbGxlckhlaWdodCkvdykpOjAsaGVpZ2h0OnRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHR9LHRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXImJnRoaXMuc2Vzc2lvbi4kYmlkaUhhbmRsZXIuc2V0Q29udGVudFdpZHRoKHMtdGhpcy4kcGFkZGluZyksU30sdGhpcy4kdXBkYXRlTGluZXM9ZnVuY3Rpb24oKXtpZighdGhpcy4kY2hhbmdlZExpbmVzKXJldHVybjt2YXIgZT10aGlzLiRjaGFuZ2VkTGluZXMuZmlyc3RSb3csdD10aGlzLiRjaGFuZ2VkTGluZXMubGFzdFJvdzt0aGlzLiRjaGFuZ2VkTGluZXM9bnVsbDt2YXIgbj10aGlzLmxheWVyQ29uZmlnO2lmKGU+bi5sYXN0Um93KzEpcmV0dXJuO2lmKHQ8bi5maXJzdFJvdylyZXR1cm47aWYodD09PUluZmluaXR5KXt0aGlzLiRzaG93R3V0dGVyJiZ0aGlzLiRndXR0ZXJMYXllci51cGRhdGUobiksdGhpcy4kdGV4dExheWVyLnVwZGF0ZShuKTtyZXR1cm59cmV0dXJuIHRoaXMuJHRleHRMYXllci51cGRhdGVMaW5lcyhuLGUsdCksITB9LHRoaXMuJGdldExvbmdlc3RMaW5lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLmdldFNjcmVlbldpZHRoKCk7cmV0dXJuIHRoaXMuc2hvd0ludmlzaWJsZXMmJiF0aGlzLnNlc3Npb24uJHVzZVdyYXBNb2RlJiYoZSs9MSksdGhpcy4kdGV4dExheWVyJiZlPnRoaXMuJHRleHRMYXllci5NQVhfTElORV9MRU5HVEgmJihlPXRoaXMuJHRleHRMYXllci5NQVhfTElORV9MRU5HVEgrMzApLE1hdGgubWF4KHRoaXMuJHNpemUuc2Nyb2xsZXJXaWR0aC0yKnRoaXMuJHBhZGRpbmcsTWF0aC5yb3VuZChlKnRoaXMuY2hhcmFjdGVyV2lkdGgpKX0sdGhpcy51cGRhdGVGcm9udE1hcmtlcnM9ZnVuY3Rpb24oKXt0aGlzLiRtYXJrZXJGcm9udC5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCEwKSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9NQVJLRVJfRlJPTlQpfSx0aGlzLnVwZGF0ZUJhY2tNYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy4kbWFya2VyQmFjay5zZXRNYXJrZXJzKHRoaXMuc2Vzc2lvbi5nZXRNYXJrZXJzKCkpLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfTUFSS0VSX0JBQ0spfSx0aGlzLmFkZEd1dHRlckRlY29yYXRpb249ZnVuY3Rpb24oZSx0KXt0aGlzLiRndXR0ZXJMYXllci5hZGRHdXR0ZXJEZWNvcmF0aW9uKGUsdCl9LHRoaXMucmVtb3ZlR3V0dGVyRGVjb3JhdGlvbj1mdW5jdGlvbihlLHQpe3RoaXMuJGd1dHRlckxheWVyLnJlbW92ZUd1dHRlckRlY29yYXRpb24oZSx0KX0sdGhpcy51cGRhdGVCcmVha3BvaW50cz1mdW5jdGlvbihlKXt0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LHRoaXMuc2V0QW5ub3RhdGlvbnM9ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0QW5ub3RhdGlvbnMoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSx0aGlzLnVwZGF0ZUN1cnNvcj1mdW5jdGlvbigpe3RoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfQ1VSU09SKX0sdGhpcy5oaWRlQ3Vyc29yPWZ1bmN0aW9uKCl7dGhpcy4kY3Vyc29yTGF5ZXIuaGlkZUN1cnNvcigpfSx0aGlzLnNob3dDdXJzb3I9ZnVuY3Rpb24oKXt0aGlzLiRjdXJzb3JMYXllci5zaG93Q3Vyc29yKCl9LHRoaXMuc2Nyb2xsU2VsZWN0aW9uSW50b1ZpZXc9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXcoZSxuKSx0aGlzLnNjcm9sbEN1cnNvckludG9WaWV3KHQsbil9LHRoaXMuc2Nyb2xsQ3Vyc29ySW50b1ZpZXc9ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQ9PT0wKXJldHVybjt2YXIgcj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKGUpLGk9ci5sZWZ0LHM9ci50b3Asbz1uJiZuLnRvcHx8MCx1PW4mJm4uYm90dG9tfHwwLGE9dGhpcy4kc2Nyb2xsQW5pbWF0aW9uP3RoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKTp0aGlzLnNjcm9sbFRvcDthK28+cz8odCYmYStvPnMrdGhpcy5saW5lSGVpZ2h0JiYocy09dCp0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KSxzPT09MCYmKHM9LXRoaXMuc2Nyb2xsTWFyZ2luLnRvcCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzKSk6YSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXU8cyt0aGlzLmxpbmVIZWlnaHQmJih0JiZhK3RoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQtdTxzLXRoaXMubGluZUhlaWdodCYmKHMrPXQqdGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChzK3RoaXMubGluZUhlaWdodCt1LXRoaXMuJHNpemUuc2Nyb2xsZXJIZWlnaHQpKTt2YXIgZj10aGlzLnNjcm9sbExlZnQ7Zj5pPyhpPHRoaXMuJHBhZGRpbmcrMip0aGlzLmxheWVyQ29uZmlnLmNoYXJhY3RlcldpZHRoJiYoaT0tdGhpcy5zY3JvbGxNYXJnaW4ubGVmdCksdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoaSkpOmYrdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoPGkrdGhpcy5jaGFyYWN0ZXJXaWR0aD90aGlzLnNlc3Npb24uc2V0U2Nyb2xsTGVmdChNYXRoLnJvdW5kKGkrdGhpcy5jaGFyYWN0ZXJXaWR0aC10aGlzLiRzaXplLnNjcm9sbGVyV2lkdGgpKTpmPD10aGlzLiRwYWRkaW5nJiZpLWY8dGhpcy5jaGFyYWN0ZXJXaWR0aCYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQoMCl9LHRoaXMuZ2V0U2Nyb2xsVG9wPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKX0sdGhpcy5nZXRTY3JvbGxMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCl9LHRoaXMuZ2V0U2Nyb2xsVG9wUm93PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVG9wL3RoaXMubGluZUhlaWdodH0sdGhpcy5nZXRTY3JvbGxCb3R0b21Sb3c9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLmZsb29yKCh0aGlzLnNjcm9sbFRvcCt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0KS90aGlzLmxpbmVIZWlnaHQpLTEpfSx0aGlzLnNjcm9sbFRvUm93PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AoZSp0aGlzLmxpbmVIZWlnaHQpfSx0aGlzLmFsaWduQ3Vyc29yPWZ1bmN0aW9uKGUsdCl7dHlwZW9mIGU9PSJudW1iZXIiJiYoZT17cm93OmUsY29sdW1uOjB9KTt2YXIgbj10aGlzLiRjdXJzb3JMYXllci5nZXRQaXhlbFBvc2l0aW9uKGUpLHI9dGhpcy4kc2l6ZS5zY3JvbGxlckhlaWdodC10aGlzLmxpbmVIZWlnaHQsaT1uLnRvcC1yKih0fHwwKTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcChpKSxpfSx0aGlzLlNURVBTPTgsdGhpcy4kY2FsY1N0ZXBzPWZ1bmN0aW9uKGUsdCl7dmFyIG49MCxyPXRoaXMuU1RFUFMsaT1bXSxzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbiooTWF0aC5wb3coZS0xLDMpKzEpK3R9O2ZvcihuPTA7bjxyOysrbilpLnB1c2gocyhuL3RoaXMuU1RFUFMsZSx0LWUpKTtyZXR1cm4gaX0sdGhpcy5zY3JvbGxUb0xpbmU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93OmUsY29sdW1uOjB9KSxzPWkudG9wO3QmJihzLT10aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LzIpO3ZhciBvPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc2Vzc2lvbi5zZXRTY3JvbGxUb3AocyksbiE9PSExJiZ0aGlzLmFuaW1hdGVTY3JvbGxpbmcobyxyKX0sdGhpcy5hbmltYXRlU2Nyb2xsaW5nPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5zY3JvbGxUb3A7aWYoIXRoaXMuJGFuaW1hdGVkU2Nyb2xsKXJldHVybjt2YXIgcj10aGlzO2lmKGU9PW4pcmV0dXJuO2lmKHRoaXMuJHNjcm9sbEFuaW1hdGlvbil7dmFyIGk9dGhpcy4kc2Nyb2xsQW5pbWF0aW9uLnN0ZXBzO2lmKGkubGVuZ3RoKXtlPWlbMF07aWYoZT09bilyZXR1cm59fXZhciBzPXIuJGNhbGNTdGVwcyhlLG4pO3RoaXMuJHNjcm9sbEFuaW1hdGlvbj17ZnJvbTplLHRvOm4sc3RlcHM6c30sY2xlYXJJbnRlcnZhbCh0aGlzLiR0aW1lciksci5zZXNzaW9uLnNldFNjcm9sbFRvcChzLnNoaWZ0KCkpLHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPW4sdGhpcy4kdGltZXI9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXtzLmxlbmd0aD8oci5zZXNzaW9uLnNldFNjcm9sbFRvcChzLnNoaWZ0KCkpLHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPW4pOm4hPW51bGw/KHIuc2Vzc2lvbi4kc2Nyb2xsVG9wPS0xLHIuc2Vzc2lvbi5zZXRTY3JvbGxUb3Aobiksbj1udWxsKTooci4kdGltZXI9Y2xlYXJJbnRlcnZhbChyLiR0aW1lciksci4kc2Nyb2xsQW5pbWF0aW9uPW51bGwsdCYmdCgpKX0sMTApfSx0aGlzLnNjcm9sbFRvWT1mdW5jdGlvbihlKXt0aGlzLnNjcm9sbFRvcCE9PWUmJih0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCksdGhpcy5zY3JvbGxUb3A9ZSl9LHRoaXMuc2Nyb2xsVG9YPWZ1bmN0aW9uKGUpe3RoaXMuc2Nyb2xsTGVmdCE9PWUmJih0aGlzLnNjcm9sbExlZnQ9ZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9IX1NDUk9MTCl9LHRoaXMuc2Nyb2xsVG89ZnVuY3Rpb24oZSx0KXt0aGlzLnNlc3Npb24uc2V0U2Nyb2xsVG9wKHQpLHRoaXMuc2Vzc2lvbi5zZXRTY3JvbGxMZWZ0KHQpfSx0aGlzLnNjcm9sbEJ5PWZ1bmN0aW9uKGUsdCl7dCYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbFRvcCh0aGlzLnNlc3Npb24uZ2V0U2Nyb2xsVG9wKCkrdCksZSYmdGhpcy5zZXNzaW9uLnNldFNjcm9sbExlZnQodGhpcy5zZXNzaW9uLmdldFNjcm9sbExlZnQoKStlKX0sdGhpcy5pc1Njcm9sbGFibGVCeT1mdW5jdGlvbihlLHQpe2lmKHQ8MCYmdGhpcy5zZXNzaW9uLmdldFNjcm9sbFRvcCgpPj0xLXRoaXMuc2Nyb2xsTWFyZ2luLnRvcClyZXR1cm4hMDtpZih0PjAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxUb3AoKSt0aGlzLiRzaXplLnNjcm9sbGVySGVpZ2h0LXRoaXMubGF5ZXJDb25maWcubWF4SGVpZ2h0PC0xK3RoaXMuc2Nyb2xsTWFyZ2luLmJvdHRvbSlyZXR1cm4hMDtpZihlPDAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCk+PTEtdGhpcy5zY3JvbGxNYXJnaW4ubGVmdClyZXR1cm4hMDtpZihlPjAmJnRoaXMuc2Vzc2lvbi5nZXRTY3JvbGxMZWZ0KCkrdGhpcy4kc2l6ZS5zY3JvbGxlcldpZHRoLXRoaXMubGF5ZXJDb25maWcud2lkdGg8LTErdGhpcy5zY3JvbGxNYXJnaW4ucmlnaHQpcmV0dXJuITB9LHRoaXMucGl4ZWxUb1NjcmVlbkNvb3JkaW5hdGVzPWZ1bmN0aW9uKGUsdCl7dmFyIG47aWYodGhpcy4kaGFzQ3NzVHJhbnNmb3Jtcyl7bj17dG9wOjAsbGVmdDowfTt2YXIgcj10aGlzLiRmb250TWV0cmljcy50cmFuc2Zvcm1Db29yZGluYXRlcyhbZSx0XSk7ZT1yWzFdLXRoaXMuZ3V0dGVyV2lkdGgtdGhpcy5tYXJnaW4ubGVmdCx0PXJbMF19ZWxzZSBuPXRoaXMuc2Nyb2xsZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dmFyIGk9ZSt0aGlzLnNjcm9sbExlZnQtbi5sZWZ0LXRoaXMuJHBhZGRpbmcscz1pL3RoaXMuY2hhcmFjdGVyV2lkdGgsbz1NYXRoLmZsb29yKCh0K3RoaXMuc2Nyb2xsVG9wLW4udG9wKS90aGlzLmxpbmVIZWlnaHQpLHU9dGhpcy4kYmxvY2tDdXJzb3I/TWF0aC5mbG9vcihzKTpNYXRoLnJvdW5kKHMpO3JldHVybntyb3c6byxjb2x1bW46dSxzaWRlOnMtdT4wPzE6LTEsb2Zmc2V0WDppfX0sdGhpcy5zY3JlZW5Ub1RleHRDb29yZGluYXRlcz1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKHRoaXMuJGhhc0Nzc1RyYW5zZm9ybXMpe249e3RvcDowLGxlZnQ6MH07dmFyIHI9dGhpcy4kZm9udE1ldHJpY3MudHJhbnNmb3JtQ29vcmRpbmF0ZXMoW2UsdF0pO2U9clsxXS10aGlzLmd1dHRlcldpZHRoLXRoaXMubWFyZ2luLmxlZnQsdD1yWzBdfWVsc2Ugbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBpPWUrdGhpcy5zY3JvbGxMZWZ0LW4ubGVmdC10aGlzLiRwYWRkaW5nLHM9aS90aGlzLmNoYXJhY3RlcldpZHRoLG89dGhpcy4kYmxvY2tDdXJzb3I/TWF0aC5mbG9vcihzKTpNYXRoLnJvdW5kKHMpLHU9TWF0aC5mbG9vcigodCt0aGlzLnNjcm9sbFRvcC1uLnRvcCkvdGhpcy5saW5lSGVpZ2h0KTtyZXR1cm4gdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbih1LE1hdGgubWF4KG8sMCksaSl9LHRoaXMudGV4dFRvU2NyZWVuQ29vcmRpbmF0ZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9dGhpcy5zZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihlLHQpLGk9dGhpcy4kcGFkZGluZysodGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5pc0JpZGlSb3coci5yb3csZSk/dGhpcy5zZXNzaW9uLiRiaWRpSGFuZGxlci5nZXRQb3NMZWZ0KHIuY29sdW1uKTpNYXRoLnJvdW5kKHIuY29sdW1uKnRoaXMuY2hhcmFjdGVyV2lkdGgpKSxzPXIucm93KnRoaXMubGluZUhlaWdodDtyZXR1cm57cGFnZVg6bi5sZWZ0K2ktdGhpcy5zY3JvbGxMZWZ0LHBhZ2VZOm4udG9wK3MtdGhpcy5zY3JvbGxUb3B9fSx0aGlzLnZpc3VhbGl6ZUZvY3VzPWZ1bmN0aW9uKCl7aS5hZGRDc3NDbGFzcyh0aGlzLmNvbnRhaW5lciwiYWNlX2ZvY3VzIil9LHRoaXMudmlzdWFsaXplQmx1cj1mdW5jdGlvbigpe2kucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsImFjZV9mb2N1cyIpfSx0aGlzLnNob3dDb21wb3NpdGlvbj1mdW5jdGlvbihlKXt0aGlzLiRjb21wb3NpdGlvbj1lLGUuY3NzVGV4dHx8KGUuY3NzVGV4dD10aGlzLnRleHRhcmVhLnN0eWxlLmNzc1RleHQpLGUudXNlVGV4dGFyZWFGb3JJTUU9dGhpcy4kdXNlVGV4dGFyZWFGb3JJTUUsdGhpcy4kdXNlVGV4dGFyZWFGb3JJTUU/KGkuYWRkQ3NzQ2xhc3ModGhpcy50ZXh0YXJlYSwiYWNlX2NvbXBvc2l0aW9uIiksdGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0PSIiLHRoaXMuJG1vdmVUZXh0QXJlYVRvQ3Vyc29yKCksdGhpcy4kY3Vyc29yTGF5ZXIuZWxlbWVudC5zdHlsZS5kaXNwbGF5PSJub25lIik6ZS5tYXJrZXJJZD10aGlzLnNlc3Npb24uYWRkTWFya2VyKGUubWFya2VyUmFuZ2UsImFjZV9jb21wb3NpdGlvbl9tYXJrZXIiLCJ0ZXh0Iil9LHRoaXMuc2V0Q29tcG9zaXRpb25UZXh0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uY3Vyc29yO3RoaXMuYWRkVG9rZW4oZSwiY29tcG9zaXRpb25fcGxhY2Vob2xkZXIiLHQucm93LHQuY29sdW1uKSx0aGlzLiRtb3ZlVGV4dEFyZWFUb0N1cnNvcigpfSx0aGlzLmhpZGVDb21wb3NpdGlvbj1mdW5jdGlvbigpe2lmKCF0aGlzLiRjb21wb3NpdGlvbilyZXR1cm47dGhpcy4kY29tcG9zaXRpb24ubWFya2VySWQmJnRoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIodGhpcy4kY29tcG9zaXRpb24ubWFya2VySWQpLGkucmVtb3ZlQ3NzQ2xhc3ModGhpcy50ZXh0YXJlYSwiYWNlX2NvbXBvc2l0aW9uIiksdGhpcy50ZXh0YXJlYS5zdHlsZS5jc3NUZXh0PXRoaXMuJGNvbXBvc2l0aW9uLmNzc1RleHQsdGhpcy4kY29tcG9zaXRpb249bnVsbCx0aGlzLiRjdXJzb3JMYXllci5lbGVtZW50LnN0eWxlLmRpc3BsYXk9IiJ9LHRoaXMuYWRkVG9rZW49ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9dGhpcy5zZXNzaW9uO2kuYmdUb2tlbml6ZXIubGluZXNbbl09bnVsbDt2YXIgcz17dHlwZTp0LHZhbHVlOmV9LG89aS5nZXRUb2tlbnMobik7aWYocj09bnVsbClvLnB1c2gocyk7ZWxzZXt2YXIgdT0wO2Zvcih2YXIgYT0wO2E8by5sZW5ndGg7YSsrKXt2YXIgZj1vW2FdO3UrPWYudmFsdWUubGVuZ3RoO2lmKHI8PXUpe3ZhciBsPWYudmFsdWUubGVuZ3RoLSh1LXIpLGM9Zi52YWx1ZS5zbGljZSgwLGwpLGg9Zi52YWx1ZS5zbGljZShsKTtvLnNwbGljZShhLDEse3R5cGU6Zi50eXBlLHZhbHVlOmN9LHMse3R5cGU6Zi50eXBlLHZhbHVlOmh9KTticmVha319fXRoaXMudXBkYXRlTGluZXMobixuKX0sdGhpcy5zZXRUaGVtZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG8ocil7aWYobi4kdGhlbWVJZCE9ZSlyZXR1cm4gdCYmdCgpO2lmKCFyfHwhci5jc3NDbGFzcyl0aHJvdyBuZXcgRXJyb3IoImNvdWxkbid0IGxvYWQgbW9kdWxlICIrZSsiIG9yIGl0IGRpZG4ndCBjYWxsIGRlZmluZSIpO3IuJGlkJiYobi4kdGhlbWVJZD1yLiRpZCksaS5pbXBvcnRDc3NTdHJpbmcoci5jc3NUZXh0LHIuY3NzQ2xhc3Msbi5jb250YWluZXIpLG4udGhlbWUmJmkucmVtb3ZlQ3NzQ2xhc3Mobi5jb250YWluZXIsbi50aGVtZS5jc3NDbGFzcyk7dmFyIHM9InBhZGRpbmciaW4gcj9yLnBhZGRpbmc6InBhZGRpbmciaW4obi50aGVtZXx8e30pPzQ6bi4kcGFkZGluZztuLiRwYWRkaW5nJiZzIT1uLiRwYWRkaW5nJiZuLnNldFBhZGRpbmcocyksbi4kdGhlbWU9ci5jc3NDbGFzcyxuLnRoZW1lPXIsaS5hZGRDc3NDbGFzcyhuLmNvbnRhaW5lcixyLmNzc0NsYXNzKSxpLnNldENzc0NsYXNzKG4uY29udGFpbmVyLCJhY2VfZGFyayIsci5pc0RhcmspLG4uJHNpemUmJihuLiRzaXplLndpZHRoPTAsbi4kdXBkYXRlU2l6ZUFzeW5jKCkpLG4uX2Rpc3BhdGNoRXZlbnQoInRoZW1lTG9hZGVkIix7dGhlbWU6cn0pLHQmJnQoKX12YXIgbj10aGlzO3RoaXMuJHRoZW1lSWQ9ZSxuLl9kaXNwYXRjaEV2ZW50KCJ0aGVtZUNoYW5nZSIse3RoZW1lOmV9KTtpZighZXx8dHlwZW9mIGU9PSJzdHJpbmciKXt2YXIgcj1lfHx0aGlzLiRvcHRpb25zLnRoZW1lLmluaXRpYWxWYWx1ZTtzLmxvYWRNb2R1bGUoWyJ0aGVtZSIscl0sbyl9ZWxzZSBvKGUpfSx0aGlzLmdldFRoZW1lPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHRoZW1lSWR9LHRoaXMuc2V0U3R5bGU9ZnVuY3Rpb24oZSx0KXtpLnNldENzc0NsYXNzKHRoaXMuY29udGFpbmVyLGUsdCE9PSExKX0sdGhpcy51bnNldFN0eWxlPWZ1bmN0aW9uKGUpe2kucmVtb3ZlQ3NzQ2xhc3ModGhpcy5jb250YWluZXIsZSl9LHRoaXMuc2V0Q3Vyc29yU3R5bGU9ZnVuY3Rpb24oZSl7aS5zZXRTdHlsZSh0aGlzLnNjcm9sbGVyLnN0eWxlLCJjdXJzb3IiLGUpfSx0aGlzLnNldE1vdXNlQ3Vyc29yPWZ1bmN0aW9uKGUpe2kuc2V0U3R5bGUodGhpcy5zY3JvbGxlci5zdHlsZSwiY3Vyc29yIixlKX0sdGhpcy5hdHRhY2hUb1NoYWRvd1Jvb3Q9ZnVuY3Rpb24oKXtpLmltcG9ydENzc1N0cmluZyh2LCJhY2VfZWRpdG9yLmNzcyIsdGhpcy5jb250YWluZXIpfSx0aGlzLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmZyZWV6ZSgpLHRoaXMuJGZvbnRNZXRyaWNzLmRlc3Ryb3koKSx0aGlzLiRjdXJzb3JMYXllci5kZXN0cm95KCl9fSkuY2FsbCh5LnByb3RvdHlwZSkscy5kZWZpbmVPcHRpb25zKHkucHJvdG90eXBlLCJyZW5kZXJlciIse2FuaW1hdGVkU2Nyb2xsOntpbml0aWFsVmFsdWU6ITF9LHNob3dJbnZpc2libGVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kdGV4dExheWVyLnNldFNob3dJbnZpc2libGVzKGUpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1RFWFQpfSxpbml0aWFsVmFsdWU6ITF9LHNob3dQcmludE1hcmdpbjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0saW5pdGlhbFZhbHVlOiEwfSxwcmludE1hcmdpbkNvbHVtbjp7c2V0OmZ1bmN0aW9uKCl7dGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0saW5pdGlhbFZhbHVlOjgwfSxwcmludE1hcmdpbjp7c2V0OmZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKHRoaXMuJHByaW50TWFyZ2luQ29sdW1uPWUpLHRoaXMuJHNob3dQcmludE1hcmdpbj0hIWUsdGhpcy4kdXBkYXRlUHJpbnRNYXJnaW4oKX0sZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHNob3dQcmludE1hcmdpbiYmdGhpcy4kcHJpbnRNYXJnaW5Db2x1bW59fSxzaG93R3V0dGVyOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyLnN0eWxlLmRpc3BsYXk9ZT8iYmxvY2siOiJub25lIix0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0ZVTEwpLHRoaXMub25HdXR0ZXJSZXNpemUoKX0saW5pdGlhbFZhbHVlOiEwfSxmYWRlRm9sZFdpZGdldHM6e3NldDpmdW5jdGlvbihlKXtpLnNldENzc0NsYXNzKHRoaXMuJGd1dHRlciwiYWNlX2ZhZGUtZm9sZC13aWRnZXRzIixlKX0saW5pdGlhbFZhbHVlOiExfSxzaG93Rm9sZFdpZGdldHM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiRndXR0ZXJMYXllci5zZXRTaG93Rm9sZFdpZGdldHMoZSksdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9HVVRURVIpfSxpbml0aWFsVmFsdWU6ITB9LGRpc3BsYXlJbmRlbnRHdWlkZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLiR0ZXh0TGF5ZXIuc2V0RGlzcGxheUluZGVudEd1aWRlcyhlKSYmdGhpcy4kbG9vcC5zY2hlZHVsZSh0aGlzLkNIQU5HRV9URVhUKX0saW5pdGlhbFZhbHVlOiEwfSxoaWdobGlnaHRHdXR0ZXJMaW5lOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kZ3V0dGVyTGF5ZXIuc2V0SGlnaGxpZ2h0R3V0dGVyTGluZShlKSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9LGluaXRpYWxWYWx1ZTohMH0saFNjcm9sbEJhckFsd2F5c1Zpc2libGU6e3NldDpmdW5jdGlvbihlKXsoIXRoaXMuJGhTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHwhdGhpcy4kaG9yaXpTY3JvbGwpJiZ0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX1NDUk9MTCl9LGluaXRpYWxWYWx1ZTohMX0sdlNjcm9sbEJhckFsd2F5c1Zpc2libGU6e3NldDpmdW5jdGlvbihlKXsoIXRoaXMuJHZTY3JvbGxCYXJBbHdheXNWaXNpYmxlfHwhdGhpcy4kdlNjcm9sbCkmJnRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOiExfSxmb250U2l6ZTp7c2V0OmZ1bmN0aW9uKGUpe3R5cGVvZiBlPT0ibnVtYmVyIiYmKGUrPSJweCIpLHRoaXMuY29udGFpbmVyLnN0eWxlLmZvbnRTaXplPWUsdGhpcy51cGRhdGVGb250U2l6ZSgpfSxpbml0aWFsVmFsdWU6MTJ9LGZvbnRGYW1pbHk6e3NldDpmdW5jdGlvbihlKXt0aGlzLmNvbnRhaW5lci5zdHlsZS5mb250RmFtaWx5PWUsdGhpcy51cGRhdGVGb250U2l6ZSgpfX0sbWF4TGluZXM6e3NldDpmdW5jdGlvbihlKXt0aGlzLnVwZGF0ZUZ1bGwoKX19LG1pbkxpbmVzOntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kbWluTGluZXM8NTYyOTQ5OTUzNDIxMzExfHwodGhpcy4kbWluTGluZXM9MCksdGhpcy51cGRhdGVGdWxsKCl9fSxtYXhQaXhlbEhlaWdodDp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMudXBkYXRlRnVsbCgpfSxpbml0aWFsVmFsdWU6MH0sc2Nyb2xsUGFzdEVuZDp7c2V0OmZ1bmN0aW9uKGUpe2U9K2V8fDA7aWYodGhpcy4kc2Nyb2xsUGFzdEVuZD09ZSlyZXR1cm47dGhpcy4kc2Nyb2xsUGFzdEVuZD1lLHRoaXMuJGxvb3Auc2NoZWR1bGUodGhpcy5DSEFOR0VfU0NST0xMKX0saW5pdGlhbFZhbHVlOjAsaGFuZGxlc1NldDohMH0sZml4ZWRXaWR0aEd1dHRlcjp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuJGd1dHRlckxheWVyLiRmaXhlZFdpZHRoPSEhZSx0aGlzLiRsb29wLnNjaGVkdWxlKHRoaXMuQ0hBTkdFX0dVVFRFUil9fSx0aGVtZTp7c2V0OmZ1bmN0aW9uKGUpe3RoaXMuc2V0VGhlbWUoZSl9LGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR0aGVtZUlkfHx0aGlzLnRoZW1lfSxpbml0aWFsVmFsdWU6Ii4vdGhlbWUvdGV4dG1hdGUiLGhhbmRsZXNTZXQ6ITB9LGhhc0Nzc1RyYW5zZm9ybXM6e30sdXNlVGV4dGFyZWFGb3JJTUU6e2luaXRpYWxWYWx1ZTohbS5pc01vYmlsZSYmIW0uaXNJRX19KSx0LlZpcnR1YWxSZW5kZXJlcj15fSksYWNlLmRlZmluZSgiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL25ldCIsImFjZS9saWIvZXZlbnRfZW1pdHRlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHUoZSl7dmFyIHQ9ImltcG9ydFNjcmlwdHMoJyIraS5xdWFsaWZ5VVJMKGUpKyInKTsiO3RyeXtyZXR1cm4gbmV3IEJsb2IoW3RdLHt0eXBlOiJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pfWNhdGNoKG4pe3ZhciByPXdpbmRvdy5CbG9iQnVpbGRlcnx8d2luZG93LldlYktpdEJsb2JCdWlsZGVyfHx3aW5kb3cuTW96QmxvYkJ1aWxkZXIscz1uZXcgcjtyZXR1cm4gcy5hcHBlbmQodCkscy5nZXRCbG9iKCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0Iil9fWZ1bmN0aW9uIGEoZSl7aWYodHlwZW9mIFdvcmtlcj09InVuZGVmaW5lZCIpcmV0dXJue3Bvc3RNZXNzYWdlOmZ1bmN0aW9uKCl7fSx0ZXJtaW5hdGU6ZnVuY3Rpb24oKXt9fTtpZihvLmdldCgibG9hZFdvcmtlckZyb21CbG9iIikpe3ZhciB0PXUoZSksbj13aW5kb3cuVVJMfHx3aW5kb3cud2Via2l0VVJMLHI9bi5jcmVhdGVPYmplY3RVUkwodCk7cmV0dXJuIG5ldyBXb3JrZXIocil9cmV0dXJuIG5ldyBXb3JrZXIoZSl9dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi4vbGliL25ldCIpLHM9ZSgiLi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIsbz1lKCIuLi9jb25maWciKSxmPWZ1bmN0aW9uKGUpe2UucG9zdE1lc3NhZ2V8fChlPXRoaXMuJGNyZWF0ZVdvcmtlckZyb21PbGRDb25maWcuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0aGlzLiR3b3JrZXI9ZSx0aGlzLiRzZW5kRGVsdGFRdWV1ZT10aGlzLiRzZW5kRGVsdGFRdWV1ZS5iaW5kKHRoaXMpLHRoaXMuY2hhbmdlTGlzdGVuZXI9dGhpcy5jaGFuZ2VMaXN0ZW5lci5iaW5kKHRoaXMpLHRoaXMub25NZXNzYWdlPXRoaXMub25NZXNzYWdlLmJpbmQodGhpcyksdGhpcy5jYWxsYmFja0lkPTEsdGhpcy5jYWxsYmFja3M9e30sdGhpcy4kd29ya2VyLm9ubWVzc2FnZT10aGlzLm9uTWVzc2FnZX07KGZ1bmN0aW9uKCl7ci5pbXBsZW1lbnQodGhpcyxzKSx0aGlzLiRjcmVhdGVXb3JrZXJGcm9tT2xkQ29uZmlnPWZ1bmN0aW9uKHQsbixyLGkscyl7ZS5uYW1lVG9VcmwmJiFlLnRvVXJsJiYoZS50b1VybD1lLm5hbWVUb1VybCk7aWYoby5nZXQoInBhY2thZ2VkIil8fCFlLnRvVXJsKWk9aXx8by5tb2R1bGVVcmwobiwid29ya2VyIik7ZWxzZXt2YXIgdT10aGlzLiRub3JtYWxpemVQYXRoO2k9aXx8dShlLnRvVXJsKCJhY2Uvd29ya2VyL3dvcmtlci5qcyIsbnVsbCwiXyIpKTt2YXIgZj17fTt0LmZvckVhY2goZnVuY3Rpb24odCl7Zlt0XT11KGUudG9VcmwodCxudWxsLCJfIikucmVwbGFjZSgvKFwuanMpPyhcPy4qKT8kLywiIikpfSl9cmV0dXJuIHRoaXMuJHdvcmtlcj1hKGkpLHMmJnRoaXMuc2VuZCgiaW1wb3J0U2NyaXB0cyIscyksdGhpcy4kd29ya2VyLnBvc3RNZXNzYWdlKHtpbml0OiEwLHRsbnM6Zixtb2R1bGU6bixjbGFzc25hbWU6cn0pLHRoaXMuJHdvcmtlcn0sdGhpcy5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5kYXRhO3N3aXRjaCh0LnR5cGUpe2Nhc2UiZXZlbnQiOnRoaXMuX3NpZ25hbCh0Lm5hbWUse2RhdGE6dC5kYXRhfSk7YnJlYWs7Y2FzZSJjYWxsIjp2YXIgbj10aGlzLmNhbGxiYWNrc1t0LmlkXTtuJiYobih0LmRhdGEpLGRlbGV0ZSB0aGlzLmNhbGxiYWNrc1t0LmlkXSk7YnJlYWs7Y2FzZSJlcnJvciI6dGhpcy5yZXBvcnRFcnJvcih0LmRhdGEpO2JyZWFrO2Nhc2UibG9nIjp3aW5kb3cuY29uc29sZSYmY29uc29sZS5sb2cmJmNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsdC5kYXRhKX19LHRoaXMucmVwb3J0RXJyb3I9ZnVuY3Rpb24oZSl7d2luZG93LmNvbnNvbGUmJmNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3IoZSl9LHRoaXMuJG5vcm1hbGl6ZVBhdGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGkucXVhbGlmeVVSTChlKX0sdGhpcy50ZXJtaW5hdGU9ZnVuY3Rpb24oKXt0aGlzLl9zaWduYWwoInRlcm1pbmF0ZSIse30pLHRoaXMuZGVsdGFRdWV1ZT1udWxsLHRoaXMuJHdvcmtlci50ZXJtaW5hdGUoKSx0aGlzLiR3b3JrZXI9bnVsbCx0aGlzLiRkb2MmJnRoaXMuJGRvYy5vZmYoImNoYW5nZSIsdGhpcy5jaGFuZ2VMaXN0ZW5lciksdGhpcy4kZG9jPW51bGx9LHRoaXMuc2VuZD1mdW5jdGlvbihlLHQpe3RoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7Y29tbWFuZDplLGFyZ3M6dH0pfSx0aGlzLmNhbGw9ZnVuY3Rpb24oZSx0LG4pe2lmKG4pe3ZhciByPXRoaXMuY2FsbGJhY2tJZCsrO3RoaXMuY2FsbGJhY2tzW3JdPW4sdC5wdXNoKHIpfXRoaXMuc2VuZChlLHQpfSx0aGlzLmVtaXQ9ZnVuY3Rpb24oZSx0KXt0cnl7dC5kYXRhJiZ0LmRhdGEuZXJyJiYodC5kYXRhLmVycj17bWVzc2FnZTp0LmRhdGEuZXJyLm1lc3NhZ2Usc3RhY2s6dC5kYXRhLmVyci5zdGFjayxjb2RlOnQuZGF0YS5lcnIuY29kZX0pLHRoaXMuJHdvcmtlci5wb3N0TWVzc2FnZSh7ZXZlbnQ6ZSxkYXRhOntkYXRhOnQuZGF0YX19KX1jYXRjaChuKXtjb25zb2xlLmVycm9yKG4uc3RhY2spfX0sdGhpcy5hdHRhY2hUb0RvY3VtZW50PWZ1bmN0aW9uKGUpe3RoaXMuJGRvYyYmdGhpcy50ZXJtaW5hdGUoKSx0aGlzLiRkb2M9ZSx0aGlzLmNhbGwoInNldFZhbHVlIixbZS5nZXRWYWx1ZSgpXSksZS5vbigiY2hhbmdlIix0aGlzLmNoYW5nZUxpc3RlbmVyKX0sdGhpcy5jaGFuZ2VMaXN0ZW5lcj1mdW5jdGlvbihlKXt0aGlzLmRlbHRhUXVldWV8fCh0aGlzLmRlbHRhUXVldWU9W10sc2V0VGltZW91dCh0aGlzLiRzZW5kRGVsdGFRdWV1ZSwwKSksZS5hY3Rpb249PSJpbnNlcnQiP3RoaXMuZGVsdGFRdWV1ZS5wdXNoKGUuc3RhcnQsZS5saW5lcyk6dGhpcy5kZWx0YVF1ZXVlLnB1c2goZS5zdGFydCxlLmVuZCl9LHRoaXMuJHNlbmREZWx0YVF1ZXVlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5kZWx0YVF1ZXVlO2lmKCFlKXJldHVybjt0aGlzLmRlbHRhUXVldWU9bnVsbCxlLmxlbmd0aD41MCYmZS5sZW5ndGg+dGhpcy4kZG9jLmdldExlbmd0aCgpPj4xP3RoaXMuY2FsbCgic2V0VmFsdWUiLFt0aGlzLiRkb2MuZ2V0VmFsdWUoKV0pOnRoaXMuZW1pdCgiY2hhbmdlIix7ZGF0YTplfSl9fSkuY2FsbChmLnByb3RvdHlwZSk7dmFyIGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW51bGwsaT0hMSx1PU9iamVjdC5jcmVhdGUocyksYT1bXSxsPW5ldyBmKHttZXNzYWdlQnVmZmVyOmEsdGVybWluYXRlOmZ1bmN0aW9uKCl7fSxwb3N0TWVzc2FnZTpmdW5jdGlvbihlKXthLnB1c2goZSk7aWYoIXIpcmV0dXJuO2k/c2V0VGltZW91dChjKTpjKCl9fSk7bC5zZXRFbWl0U3luYz1mdW5jdGlvbihlKXtpPWV9O3ZhciBjPWZ1bmN0aW9uKCl7dmFyIGU9YS5zaGlmdCgpO2UuY29tbWFuZD9yW2UuY29tbWFuZF0uYXBwbHkocixlLmFyZ3MpOmUuZXZlbnQmJnUuX3NpZ25hbChlLmV2ZW50LGUuZGF0YSl9O3JldHVybiB1LnBvc3RNZXNzYWdlPWZ1bmN0aW9uKGUpe2wub25NZXNzYWdlKHtkYXRhOmV9KX0sdS5jYWxsYmFjaz1mdW5jdGlvbihlLHQpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImNhbGwiLGlkOnQsZGF0YTplfSl9LHUuZW1pdD1mdW5jdGlvbihlLHQpe3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV2ZW50IixuYW1lOmUsZGF0YTp0fSl9LG8ubG9hZE1vZHVsZShbIndvcmtlciIsdF0sZnVuY3Rpb24oZSl7cj1uZXcgZVtuXSh1KTt3aGlsZShhLmxlbmd0aCljKCl9KSxsfTt0LlVJV29ya2VyQ2xpZW50PWwsdC5Xb3JrZXJDbGllbnQ9Zix0LmNyZWF0ZVdvcmtlcj1hfSksYWNlLmRlZmluZSgiYWNlL3BsYWNlaG9sZGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIiwiYWNlL2xpYi9ldmVudF9lbWl0dGVyIiwiYWNlL2xpYi9vb3AiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4vcmFuZ2UiKS5SYW5nZSxpPWUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXIscz1lKCIuL2xpYi9vb3AiKSxvPWZ1bmN0aW9uKGUsdCxuLHIsaSxzKXt2YXIgbz10aGlzO3RoaXMubGVuZ3RoPXQsdGhpcy5zZXNzaW9uPWUsdGhpcy5kb2M9ZS5nZXREb2N1bWVudCgpLHRoaXMubWFpbkNsYXNzPWksdGhpcy5vdGhlcnNDbGFzcz1zLHRoaXMuJG9uVXBkYXRlPXRoaXMub25VcGRhdGUuYmluZCh0aGlzKSx0aGlzLmRvYy5vbigiY2hhbmdlIix0aGlzLiRvblVwZGF0ZSksdGhpcy4kb3RoZXJzPXIsdGhpcy4kb25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5vbkN1cnNvckNoYW5nZSgpfSl9LHRoaXMuJHBvcz1uO3ZhciB1PWUuZ2V0VW5kb01hbmFnZXIoKS4kdW5kb1N0YWNrfHxlLmdldFVuZG9NYW5hZ2VyKCkuJHVuZG9zdGFja3x8e2xlbmd0aDotMX07dGhpcy4kdW5kb1N0YWNrRGVwdGg9dS5sZW5ndGgsdGhpcy5zZXR1cCgpLGUuc2VsZWN0aW9uLm9uKCJjaGFuZ2VDdXJzb3IiLHRoaXMuJG9uQ3Vyc29yQ2hhbmdlKX07KGZ1bmN0aW9uKCl7cy5pbXBsZW1lbnQodGhpcyxpKSx0aGlzLnNldHVwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuZG9jLG49dGhpcy5zZXNzaW9uO3RoaXMuc2VsZWN0aW9uQmVmb3JlPW4uc2VsZWN0aW9uLnRvSlNPTigpLG4uc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlJiZuLnNlbGVjdGlvbi50b1NpbmdsZVJhbmdlKCksdGhpcy5wb3M9dC5jcmVhdGVBbmNob3IodGhpcy4kcG9zLnJvdyx0aGlzLiRwb3MuY29sdW1uKTt2YXIgaT10aGlzLnBvcztpLiRpbnNlcnRSaWdodD0hMCxpLmRldGFjaCgpLGkubWFya2VySWQ9bi5hZGRNYXJrZXIobmV3IHIoaS5yb3csaS5jb2x1bW4saS5yb3csaS5jb2x1bW4rdGhpcy5sZW5ndGgpLHRoaXMubWFpbkNsYXNzLG51bGwsITEpLHRoaXMub3RoZXJzPVtdLHRoaXMuJG90aGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe3ZhciByPXQuY3JlYXRlQW5jaG9yKG4ucm93LG4uY29sdW1uKTtyLiRpbnNlcnRSaWdodD0hMCxyLmRldGFjaCgpLGUub3RoZXJzLnB1c2gocil9KSxuLnNldFVuZG9TZWxlY3QoITEpfSx0aGlzLnNob3dPdGhlck1hcmtlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLm90aGVyc0FjdGl2ZSlyZXR1cm47dmFyIGU9dGhpcy5zZXNzaW9uLHQ9dGhpczt0aGlzLm90aGVyc0FjdGl2ZT0hMCx0aGlzLm90aGVycy5mb3JFYWNoKGZ1bmN0aW9uKG4pe24ubWFya2VySWQ9ZS5hZGRNYXJrZXIobmV3IHIobi5yb3csbi5jb2x1bW4sbi5yb3csbi5jb2x1bW4rdC5sZW5ndGgpLHQub3RoZXJzQ2xhc3MsbnVsbCwhMSl9KX0sdGhpcy5oaWRlT3RoZXJNYXJrZXJzPWZ1bmN0aW9uKCl7aWYoIXRoaXMub3RoZXJzQWN0aXZlKXJldHVybjt0aGlzLm90aGVyc0FjdGl2ZT0hMTtmb3IodmFyIGU9MDtlPHRoaXMub3RoZXJzLmxlbmd0aDtlKyspdGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLm90aGVyc1tlXS5tYXJrZXJJZCl9LHRoaXMub25VcGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXBkYXRpbmcpcmV0dXJuIHRoaXMudXBkYXRlQW5jaG9ycyhlKTt2YXIgdD1lO2lmKHQuc3RhcnQucm93IT09dC5lbmQucm93KXJldHVybjtpZih0LnN0YXJ0LnJvdyE9PXRoaXMucG9zLnJvdylyZXR1cm47dGhpcy4kdXBkYXRpbmc9ITA7dmFyIG49ZS5hY3Rpb249PT0iaW5zZXJ0Ij90LmVuZC5jb2x1bW4tdC5zdGFydC5jb2x1bW46dC5zdGFydC5jb2x1bW4tdC5lbmQuY29sdW1uLGk9dC5zdGFydC5jb2x1bW4+PXRoaXMucG9zLmNvbHVtbiYmdC5zdGFydC5jb2x1bW48PXRoaXMucG9zLmNvbHVtbit0aGlzLmxlbmd0aCsxLHM9dC5zdGFydC5jb2x1bW4tdGhpcy5wb3MuY29sdW1uO3RoaXMudXBkYXRlQW5jaG9ycyhlKSxpJiYodGhpcy5sZW5ndGgrPW4pO2lmKGkmJiF0aGlzLnNlc3Npb24uJGZyb21VbmRvKWlmKGUuYWN0aW9uPT09Imluc2VydCIpZm9yKHZhciBvPXRoaXMub3RoZXJzLmxlbmd0aC0xO28+PTA7by0tKXt2YXIgdT10aGlzLm90aGVyc1tvXSxhPXtyb3c6dS5yb3csY29sdW1uOnUuY29sdW1uK3N9O3RoaXMuZG9jLmluc2VydE1lcmdlZExpbmVzKGEsZS5saW5lcyl9ZWxzZSBpZihlLmFjdGlvbj09PSJyZW1vdmUiKWZvcih2YXIgbz10aGlzLm90aGVycy5sZW5ndGgtMTtvPj0wO28tLSl7dmFyIHU9dGhpcy5vdGhlcnNbb10sYT17cm93OnUucm93LGNvbHVtbjp1LmNvbHVtbitzfTt0aGlzLmRvYy5yZW1vdmUobmV3IHIoYS5yb3csYS5jb2x1bW4sYS5yb3csYS5jb2x1bW4tbikpfXRoaXMuJHVwZGF0aW5nPSExLHRoaXMudXBkYXRlTWFya2VycygpfSx0aGlzLnVwZGF0ZUFuY2hvcnM9ZnVuY3Rpb24oZSl7dGhpcy5wb3Mub25DaGFuZ2UoZSk7Zm9yKHZhciB0PXRoaXMub3RoZXJzLmxlbmd0aDt0LS07KXRoaXMub3RoZXJzW3RdLm9uQ2hhbmdlKGUpO3RoaXMudXBkYXRlTWFya2VycygpfSx0aGlzLnVwZGF0ZU1hcmtlcnM9ZnVuY3Rpb24oKXtpZih0aGlzLiR1cGRhdGluZylyZXR1cm47dmFyIGU9dGhpcyx0PXRoaXMuc2Vzc2lvbixuPWZ1bmN0aW9uKG4saSl7dC5yZW1vdmVNYXJrZXIobi5tYXJrZXJJZCksbi5tYXJrZXJJZD10LmFkZE1hcmtlcihuZXcgcihuLnJvdyxuLmNvbHVtbixuLnJvdyxuLmNvbHVtbitlLmxlbmd0aCksaSxudWxsLCExKX07bih0aGlzLnBvcyx0aGlzLm1haW5DbGFzcyk7Zm9yKHZhciBpPXRoaXMub3RoZXJzLmxlbmd0aDtpLS07KW4odGhpcy5vdGhlcnNbaV0sdGhpcy5vdGhlcnNDbGFzcyl9LHRoaXMub25DdXJzb3JDaGFuZ2U9ZnVuY3Rpb24oZSl7aWYodGhpcy4kdXBkYXRpbmd8fCF0aGlzLnNlc3Npb24pcmV0dXJuO3ZhciB0PXRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24uZ2V0Q3Vyc29yKCk7dC5yb3c9PT10aGlzLnBvcy5yb3cmJnQuY29sdW1uPj10aGlzLnBvcy5jb2x1bW4mJnQuY29sdW1uPD10aGlzLnBvcy5jb2x1bW4rdGhpcy5sZW5ndGg/KHRoaXMuc2hvd090aGVyTWFya2VycygpLHRoaXMuX2VtaXQoImN1cnNvckVudGVyIixlKSk6KHRoaXMuaGlkZU90aGVyTWFya2VycygpLHRoaXMuX2VtaXQoImN1cnNvckxlYXZlIixlKSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5zZXNzaW9uLnJlbW92ZU1hcmtlcih0aGlzLnBvcyYmdGhpcy5wb3MubWFya2VySWQpLHRoaXMuaGlkZU90aGVyTWFya2VycygpLHRoaXMuZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIsdGhpcy4kb25VcGRhdGUpLHRoaXMuc2Vzc2lvbi5zZWxlY3Rpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlQ3Vyc29yIix0aGlzLiRvbkN1cnNvckNoYW5nZSksdGhpcy5zZXNzaW9uLnNldFVuZG9TZWxlY3QoITApLHRoaXMuc2Vzc2lvbj1udWxsfSx0aGlzLmNhbmNlbD1mdW5jdGlvbigpe2lmKHRoaXMuJHVuZG9TdGFja0RlcHRoPT09LTEpcmV0dXJuO3ZhciBlPXRoaXMuc2Vzc2lvbi5nZXRVbmRvTWFuYWdlcigpLHQ9KGUuJHVuZG9TdGFja3x8ZS4kdW5kb3N0YWNrKS5sZW5ndGgtdGhpcy4kdW5kb1N0YWNrRGVwdGg7Zm9yKHZhciBuPTA7bjx0O24rKyllLnVuZG8odGhpcy5zZXNzaW9uLCEwKTt0aGlzLnNlbGVjdGlvbkJlZm9yZSYmdGhpcy5zZXNzaW9uLnNlbGVjdGlvbi5mcm9tSlNPTih0aGlzLnNlbGVjdGlvbkJlZm9yZSl9fSkuY2FsbChvLnByb3RvdHlwZSksdC5QbGFjZUhvbGRlcj1vfSksYWNlLmRlZmluZSgiYWNlL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvdXNlcmFnZW50Il0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZS5yb3c9PXQucm93JiZlLmNvbHVtbj09dC5jb2x1bW59ZnVuY3Rpb24gbyhlKXt2YXIgdD1lLmRvbUV2ZW50LG49dC5hbHRLZXksbz10LnNoaWZ0S2V5LHU9dC5jdHJsS2V5LGE9ZS5nZXRBY2NlbEtleSgpLGY9ZS5nZXRCdXR0b24oKTt1JiZpLmlzTWFjJiYoZj10LmJ1dHRvbik7aWYoZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJmY9PTIpe2UuZWRpdG9yLnRleHRJbnB1dC5vbkNvbnRleHRNZW51KGUuZG9tRXZlbnQpO3JldHVybn1pZighdSYmIW4mJiFhKXtmPT09MCYmZS5lZGl0b3IuaW5NdWx0aVNlbGVjdE1vZGUmJmUuZWRpdG9yLmV4aXRNdWx0aVNlbGVjdE1vZGUoKTtyZXR1cm59aWYoZiE9PTApcmV0dXJuO3ZhciBsPWUuZWRpdG9yLGM9bC5zZWxlY3Rpb24saD1sLmluTXVsdGlTZWxlY3RNb2RlLHA9ZS5nZXREb2N1bWVudFBvc2l0aW9uKCksZD1jLmdldEN1cnNvcigpLHY9ZS5pblNlbGVjdGlvbigpfHxjLmlzRW1wdHkoKSYmcyhwLGQpLG09ZS54LGc9ZS55LHk9ZnVuY3Rpb24oZSl7bT1lLmNsaWVudFgsZz1lLmNsaWVudFl9LGI9bC5zZXNzaW9uLHc9bC5yZW5kZXJlci5waXhlbFRvU2NyZWVuQ29vcmRpbmF0ZXMobSxnKSxFPXcsUztpZihsLiRtb3VzZUhhbmRsZXIuJGVuYWJsZUp1bXBUb0RlZil1JiZufHxhJiZuP1M9bz8iYmxvY2siOiJhZGQiOm4mJmwuJGJsb2NrU2VsZWN0RW5hYmxlZCYmKFM9ImJsb2NrIik7ZWxzZSBpZihhJiYhbil7Uz0iYWRkIjtpZighaCYmbylyZXR1cm59ZWxzZSBuJiZsLiRibG9ja1NlbGVjdEVuYWJsZWQmJihTPSJibG9jayIpO1MmJmkuaXNNYWMmJnQuY3RybEtleSYmbC4kbW91c2VIYW5kbGVyLmNhbmNlbENvbnRleHRNZW51KCk7aWYoUz09ImFkZCIpe2lmKCFoJiZ2KXJldHVybjtpZighaCl7dmFyIHg9Yy50b09yaWVudGVkUmFuZ2UoKTtsLmFkZFNlbGVjdGlvbk1hcmtlcih4KX12YXIgVD1jLnJhbmdlTGlzdC5yYW5nZUF0UG9pbnQocCk7bC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSEwLG8mJihUPW51bGwseD1jLnJhbmdlc1swXXx8eCxsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcih4KSksbC5vbmNlKCJtb3VzZXVwIixmdW5jdGlvbigpe3ZhciBlPWMudG9PcmllbnRlZFJhbmdlKCk7VCYmZS5pc0VtcHR5KCkmJnMoVC5jdXJzb3IsZS5jdXJzb3IpP2Muc3Vic3RyYWN0UG9pbnQoZS5jdXJzb3IpOihvP2Muc3Vic3RyYWN0UG9pbnQoeC5jdXJzb3IpOngmJihsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcih4KSxjLmFkZFJhbmdlKHgpKSxjLmFkZFJhbmdlKGUpKSxsLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITF9KX1lbHNlIGlmKFM9PSJibG9jayIpe2Uuc3RvcCgpLGwuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDt2YXIgTixDPVtdLGs9ZnVuY3Rpb24oKXt2YXIgZT1sLnJlbmRlcmVyLnBpeGVsVG9TY3JlZW5Db29yZGluYXRlcyhtLGcpLHQ9Yi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24oZS5yb3csZS5jb2x1bW4sZS5vZmZzZXRYKTtpZihzKEUsZSkmJnModCxjLmxlYWQpKXJldHVybjtFPWUsbC5zZWxlY3Rpb24ubW92ZVRvUG9zaXRpb24odCksbC5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldygpLGwucmVtb3ZlU2VsZWN0aW9uTWFya2VycyhDKSxDPWMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrKEUsdyksbC4kbW91c2VIYW5kbGVyLiRjbGlja1NlbGVjdGlvbiYmQy5sZW5ndGg9PTEmJkNbMF0uaXNFbXB0eSgpJiYoQ1swXT1sLiRtb3VzZUhhbmRsZXIuJGNsaWNrU2VsZWN0aW9uLmNsb25lKCkpLEMuZm9yRWFjaChsLmFkZFNlbGVjdGlvbk1hcmtlcixsKSxsLnVwZGF0ZVNlbGVjdGlvbk1hcmtlcnMoKX07aCYmIWE/Yy50b1NpbmdsZVJhbmdlKCk6IWgmJmEmJihOPWMudG9PcmllbnRlZFJhbmdlKCksbC5hZGRTZWxlY3Rpb25NYXJrZXIoTikpLG8/dz1iLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbihjLmxlYWQpOmMubW92ZVRvUG9zaXRpb24ocCksRT17cm93Oi0xLGNvbHVtbjotMX07dmFyIEw9ZnVuY3Rpb24oZSl7aygpLGNsZWFySW50ZXJ2YWwoTyksbC5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKEMpLEMubGVuZ3RofHwoQz1bYy50b09yaWVudGVkUmFuZ2UoKV0pLE4mJihsLnJlbW92ZVNlbGVjdGlvbk1hcmtlcihOKSxjLnRvU2luZ2xlUmFuZ2UoTikpO2Zvcih2YXIgdD0wO3Q8Qy5sZW5ndGg7dCsrKWMuYWRkUmFuZ2UoQ1t0XSk7bC5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlPSExLGwuJG1vdXNlSGFuZGxlci4kY2xpY2tTZWxlY3Rpb249bnVsbH0sQT1rO3IuY2FwdHVyZShsLmNvbnRhaW5lcix5LEwpO3ZhciBPPXNldEludGVydmFsKGZ1bmN0aW9uKCl7QSgpfSwyMCk7cmV0dXJuIGUucHJldmVudERlZmF1bHQoKX19dmFyIHI9ZSgiLi4vbGliL2V2ZW50IiksaT1lKCIuLi9saWIvdXNlcmFnZW50Iik7dC5vbk1vdXNlRG93bj1vfSksYWNlLmRlZmluZSgiYWNlL2NvbW1hbmRzL211bHRpX3NlbGVjdF9jb21tYW5kcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiXSxmdW5jdGlvbihlLHQsbil7dC5kZWZhdWx0Q29tbWFuZHM9W3tuYW1lOiJhZGRDdXJzb3JBYm92ZSIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYWJvdmUiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoLTEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVVwIixtYWM6IkN0cmwtQWx0LVVwIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JCZWxvdyIsZGVzY3JpcHRpb246IkFkZCBjdXJzb3IgYmVsb3ciLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlTGluZXMoMSl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtRG93biIsbWFjOiJDdHJsLUFsdC1Eb3duIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJhZGRDdXJzb3JBYm92ZVNraXBDdXJyZW50IixkZXNjcmlwdGlvbjoiQWRkIGN1cnNvciBhYm92ZSAoc2tpcCBjdXJyZW50KSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmVMaW5lcygtMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtVXAiLG1hYzoiQ3RybC1BbHQtU2hpZnQtVXAifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6ImFkZEN1cnNvckJlbG93U2tpcEN1cnJlbnQiLGRlc2NyaXB0aW9uOiJBZGQgY3Vyc29yIGJlbG93IChza2lwIGN1cnJlbnQpIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZUxpbmVzKDEsITApfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVNoaWZ0LURvd24iLG1hYzoiQ3RybC1BbHQtU2hpZnQtRG93biJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TW9yZUJlZm9yZSIsZGVzY3JpcHRpb246IlNlbGVjdCBtb3JlIGJlZm9yZSIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoLTEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LUxlZnQiLG1hYzoiQ3RybC1BbHQtTGVmdCJ9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwfSx7bmFtZToic2VsZWN0TW9yZUFmdGVyIixkZXNjcmlwdGlvbjoiU2VsZWN0IG1vcmUgYWZ0ZXIiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5zZWxlY3RNb3JlKDEpfSxiaW5kS2V5Ont3aW46IkN0cmwtQWx0LVJpZ2h0IixtYWM6IkN0cmwtQWx0LVJpZ2h0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3ROZXh0QmVmb3JlIixkZXNjcmlwdGlvbjoiU2VsZWN0IG5leHQgYmVmb3JlIixleGVjOmZ1bmN0aW9uKGUpe2Uuc2VsZWN0TW9yZSgtMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtTGVmdCIsbWFjOiJDdHJsLUFsdC1TaGlmdC1MZWZ0In0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9LHtuYW1lOiJzZWxlY3ROZXh0QWZ0ZXIiLGRlc2NyaXB0aW9uOiJTZWxlY3QgbmV4dCBhZnRlciIsZXhlYzpmdW5jdGlvbihlKXtlLnNlbGVjdE1vcmUoMSwhMCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtU2hpZnQtUmlnaHQiLG1hYzoiQ3RybC1BbHQtU2hpZnQtUmlnaHQifSxzY3JvbGxJbnRvVmlldzoiY3Vyc29yIixyZWFkT25seTohMH0se25hbWU6InNwbGl0SW50b0xpbmVzIixkZXNjcmlwdGlvbjoiU3BsaXQgaW50byBsaW5lcyIsZXhlYzpmdW5jdGlvbihlKXtlLm11bHRpU2VsZWN0LnNwbGl0SW50b0xpbmVzKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtTCIsbWFjOiJDdHJsLUFsdC1MIn0scmVhZE9ubHk6ITB9LHtuYW1lOiJhbGlnbkN1cnNvcnMiLGRlc2NyaXB0aW9uOiJBbGlnbiBjdXJzb3JzIixleGVjOmZ1bmN0aW9uKGUpe2UuYWxpZ25DdXJzb3JzKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtQSIsbWFjOiJDdHJsLUFsdC1BIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciJ9LHtuYW1lOiJmaW5kQWxsIixkZXNjcmlwdGlvbjoiRmluZCBhbGwiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5maW5kQWxsKCl9LGJpbmRLZXk6e3dpbjoiQ3RybC1BbHQtSyIsbWFjOiJDdHJsLUFsdC1HIn0sc2Nyb2xsSW50b1ZpZXc6ImN1cnNvciIscmVhZE9ubHk6ITB9XSx0Lm11bHRpU2VsZWN0Q29tbWFuZHM9W3tuYW1lOiJzaW5nbGVTZWxlY3Rpb24iLGRlc2NyaXB0aW9uOiJTaW5nbGUgc2VsZWN0aW9uIixiaW5kS2V5OiJlc2MiLGV4ZWM6ZnVuY3Rpb24oZSl7ZS5leGl0TXVsdGlTZWxlY3RNb2RlKCl9LHNjcm9sbEludG9WaWV3OiJjdXJzb3IiLHJlYWRPbmx5OiEwLGlzQXZhaWxhYmxlOmZ1bmN0aW9uKGUpe3JldHVybiBlJiZlLmluTXVsdGlTZWxlY3RNb2RlfX1dO3ZhciByPWUoIi4uL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLkhhc2hIYW5kbGVyO3Qua2V5Ym9hcmRIYW5kbGVyPW5ldyByKHQubXVsdGlTZWxlY3RDb21tYW5kcyl9KSxhY2UuZGVmaW5lKCJhY2UvbXVsdGlfc2VsZWN0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlX2xpc3QiLCJhY2UvcmFuZ2UiLCJhY2Uvc2VsZWN0aW9uIiwiYWNlL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIiwiYWNlL2xpYi9ldmVudCIsImFjZS9saWIvbGFuZyIsImFjZS9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiLCJhY2Uvc2VhcmNoIiwiYWNlL2VkaXRfc2Vzc2lvbiIsImFjZS9lZGl0b3IiLCJhY2UvY29uZmlnIl0sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIGgoZSx0LG4pe3JldHVybiBjLiRvcHRpb25zLndyYXA9ITAsYy4kb3B0aW9ucy5uZWVkbGU9dCxjLiRvcHRpb25zLmJhY2t3YXJkcz1uPT0tMSxjLmZpbmQoZSl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBlLnJvdz09dC5yb3cmJmUuY29sdW1uPT10LmNvbHVtbn1mdW5jdGlvbiBtKGUpe2lmKGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlKXJldHVybjtlLiRvbkFkZFJhbmdlPWUuJG9uQWRkUmFuZ2UuYmluZChlKSxlLiRvblJlbW92ZVJhbmdlPWUuJG9uUmVtb3ZlUmFuZ2UuYmluZChlKSxlLiRvbk11bHRpU2VsZWN0PWUuJG9uTXVsdGlTZWxlY3QuYmluZChlKSxlLiRvblNpbmdsZVNlbGVjdD1lLiRvblNpbmdsZVNlbGVjdC5iaW5kKGUpLGUuJG11bHRpc2VsZWN0T25TZXNzaW9uQ2hhbmdlPXQub25TZXNzaW9uQ2hhbmdlLmJpbmQoZSksZS4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZT1lLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlLmJpbmQoZSksZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UoZSksZS5vbigiY2hhbmdlU2Vzc2lvbiIsZS4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLGUub24oIm1vdXNlZG93biIsbyksZS5jb21tYW5kcy5hZGRDb21tYW5kcyhmLmRlZmF1bHRDb21tYW5kcyksZyhlKX1mdW5jdGlvbiBnKGUpe2Z1bmN0aW9uIHIodCl7biYmKGUucmVuZGVyZXIuc2V0TW91c2VDdXJzb3IoIiIpLG49ITEpfWlmKCFlLnRleHRJbnB1dClyZXR1cm47dmFyIHQ9ZS50ZXh0SW5wdXQuZ2V0RWxlbWVudCgpLG49ITE7dS5hZGRMaXN0ZW5lcih0LCJrZXlkb3duIixmdW5jdGlvbih0KXt2YXIgaT10LmtleUNvZGU9PTE4JiYhKHQuY3RybEtleXx8dC5zaGlmdEtleXx8dC5tZXRhS2V5KTtlLiRibG9ja1NlbGVjdEVuYWJsZWQmJmk/bnx8KGUucmVuZGVyZXIuc2V0TW91c2VDdXJzb3IoImNyb3NzaGFpciIpLG49ITApOm4mJnIoKX0pLHUuYWRkTGlzdGVuZXIodCwia2V5dXAiLHIpLHUuYWRkTGlzdGVuZXIodCwiYmx1ciIscil9dmFyIHI9ZSgiLi9yYW5nZV9saXN0IikuUmFuZ2VMaXN0LGk9ZSgiLi9yYW5nZSIpLlJhbmdlLHM9ZSgiLi9zZWxlY3Rpb24iKS5TZWxlY3Rpb24sbz1lKCIuL21vdXNlL211bHRpX3NlbGVjdF9oYW5kbGVyIikub25Nb3VzZURvd24sdT1lKCIuL2xpYi9ldmVudCIpLGE9ZSgiLi9saWIvbGFuZyIpLGY9ZSgiLi9jb21tYW5kcy9tdWx0aV9zZWxlY3RfY29tbWFuZHMiKTt0LmNvbW1hbmRzPWYuZGVmYXVsdENvbW1hbmRzLmNvbmNhdChmLm11bHRpU2VsZWN0Q29tbWFuZHMpO3ZhciBsPWUoIi4vc2VhcmNoIikuU2VhcmNoLGM9bmV3IGwscD1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uOyhmdW5jdGlvbigpe3RoaXMuZ2V0U2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRzZWxlY3Rpb25NYXJrZXJzfX0pLmNhbGwocC5wcm90b3R5cGUpLGZ1bmN0aW9uKCl7dGhpcy5yYW5nZXM9bnVsbCx0aGlzLnJhbmdlTGlzdD1udWxsLHRoaXMuYWRkUmFuZ2U9ZnVuY3Rpb24oZSx0KXtpZighZSlyZXR1cm47aWYoIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJnRoaXMucmFuZ2VDb3VudD09PTApe3ZhciBuPXRoaXMudG9PcmllbnRlZFJhbmdlKCk7dGhpcy5yYW5nZUxpc3QuYWRkKG4pLHRoaXMucmFuZ2VMaXN0LmFkZChlKTtpZih0aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoIT0yKXJldHVybiB0aGlzLnJhbmdlTGlzdC5yZW1vdmVBbGwoKSx0fHx0aGlzLmZyb21PcmllbnRlZFJhbmdlKGUpO3RoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpLHRoaXMucmFuZ2VMaXN0LmFkZChuKSx0aGlzLiRvbkFkZFJhbmdlKG4pfWUuY3Vyc29yfHwoZS5jdXJzb3I9ZS5lbmQpO3ZhciByPXRoaXMucmFuZ2VMaXN0LmFkZChlKTtyZXR1cm4gdGhpcy4kb25BZGRSYW5nZShlKSxyLmxlbmd0aCYmdGhpcy4kb25SZW1vdmVSYW5nZShyKSx0aGlzLnJhbmdlQ291bnQ+MSYmIXRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJih0aGlzLl9zaWduYWwoIm11bHRpU2VsZWN0IiksdGhpcy5pbk11bHRpU2VsZWN0TW9kZT0hMCx0aGlzLnNlc3Npb24uJHVuZG9TZWxlY3Q9ITEsdGhpcy5yYW5nZUxpc3QuYXR0YWNoKHRoaXMuc2Vzc2lvbikpLHR8fHRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSl9LHRoaXMudG9TaW5nbGVSYW5nZT1mdW5jdGlvbihlKXtlPWV8fHRoaXMucmFuZ2VzWzBdO3ZhciB0PXRoaXMucmFuZ2VMaXN0LnJlbW92ZUFsbCgpO3QubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKHQpLGUmJnRoaXMuZnJvbU9yaWVudGVkUmFuZ2UoZSl9LHRoaXMuc3Vic3RyYWN0UG9pbnQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5yYW5nZUxpc3Quc3Vic3RyYWN0UG9pbnQoZSk7aWYodClyZXR1cm4gdGhpcy4kb25SZW1vdmVSYW5nZSh0KSx0WzBdfSx0aGlzLm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5tZXJnZSgpO2UubGVuZ3RoJiZ0aGlzLiRvblJlbW92ZVJhbmdlKGUpfSx0aGlzLiRvbkFkZFJhbmdlPWZ1bmN0aW9uKGUpe3RoaXMucmFuZ2VDb3VudD10aGlzLnJhbmdlTGlzdC5yYW5nZXMubGVuZ3RoLHRoaXMucmFuZ2VzLnVuc2hpZnQoZSksdGhpcy5fc2lnbmFsKCJhZGRSYW5nZSIse3JhbmdlOmV9KX0sdGhpcy4kb25SZW1vdmVSYW5nZT1mdW5jdGlvbihlKXt0aGlzLnJhbmdlQ291bnQ9dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmxlbmd0aDtpZih0aGlzLnJhbmdlQ291bnQ9PTEmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUpe3ZhciB0PXRoaXMucmFuZ2VMaXN0LnJhbmdlcy5wb3AoKTtlLnB1c2godCksdGhpcy5yYW5nZUNvdW50PTB9Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPXRoaXMucmFuZ2VzLmluZGV4T2YoZVtuXSk7dGhpcy5yYW5nZXMuc3BsaWNlKHIsMSl9dGhpcy5fc2lnbmFsKCJyZW1vdmVSYW5nZSIse3JhbmdlczplfSksdGhpcy5yYW5nZUNvdW50PT09MCYmdGhpcy5pbk11bHRpU2VsZWN0TW9kZSYmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITEsdGhpcy5fc2lnbmFsKCJzaW5nbGVTZWxlY3QiKSx0aGlzLnNlc3Npb24uJHVuZG9TZWxlY3Q9ITAsdGhpcy5yYW5nZUxpc3QuZGV0YWNoKHRoaXMuc2Vzc2lvbikpLHQ9dHx8dGhpcy5yYW5nZXNbMF0sdCYmIXQuaXNFcXVhbCh0aGlzLmdldFJhbmdlKCkpJiZ0aGlzLmZyb21PcmllbnRlZFJhbmdlKHQpfSx0aGlzLiRpbml0UmFuZ2VMaXN0PWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUxpc3QpcmV0dXJuO3RoaXMucmFuZ2VMaXN0PW5ldyByLHRoaXMucmFuZ2VzPVtdLHRoaXMucmFuZ2VDb3VudD0wfSx0aGlzLmdldEFsbFJhbmdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJhbmdlQ291bnQ/dGhpcy5yYW5nZUxpc3QucmFuZ2VzLmNvbmNhdCgpOlt0aGlzLmdldFJhbmdlKCldfSx0aGlzLnNwbGl0SW50b0xpbmVzPWZ1bmN0aW9uKCl7aWYodGhpcy5yYW5nZUNvdW50PjEpe3ZhciBlPXRoaXMucmFuZ2VMaXN0LnJhbmdlcyx0PWVbZS5sZW5ndGgtMV0sbj1pLmZyb21Qb2ludHMoZVswXS5zdGFydCx0LmVuZCk7dGhpcy50b1NpbmdsZVJhbmdlKCksdGhpcy5zZXRTZWxlY3Rpb25SYW5nZShuLHQuY3Vyc29yPT10LnN0YXJ0KX1lbHNle3ZhciBuPXRoaXMuZ2V0UmFuZ2UoKSxyPXRoaXMuaXNCYWNrd2FyZHMoKSxzPW4uc3RhcnQucm93LG89bi5lbmQucm93O2lmKHM9PW8pe2lmKHIpdmFyIHU9bi5lbmQsYT1uLnN0YXJ0O2Vsc2UgdmFyIHU9bi5zdGFydCxhPW4uZW5kO3RoaXMuYWRkUmFuZ2UoaS5mcm9tUG9pbnRzKGEsYSkpLHRoaXMuYWRkUmFuZ2UoaS5mcm9tUG9pbnRzKHUsdSkpO3JldHVybn12YXIgZj1bXSxsPXRoaXMuZ2V0TGluZVJhbmdlKHMsITApO2wuc3RhcnQuY29sdW1uPW4uc3RhcnQuY29sdW1uLGYucHVzaChsKTtmb3IodmFyIGM9cysxO2M8bztjKyspZi5wdXNoKHRoaXMuZ2V0TGluZVJhbmdlKGMsITApKTtsPXRoaXMuZ2V0TGluZVJhbmdlKG8sITApLGwuZW5kLmNvbHVtbj1uLmVuZC5jb2x1bW4sZi5wdXNoKGwpLGYuZm9yRWFjaCh0aGlzLmFkZFJhbmdlLHRoaXMpfX0sdGhpcy50b2dnbGVCbG9ja1NlbGVjdGlvbj1mdW5jdGlvbigpe2lmKHRoaXMucmFuZ2VDb3VudD4xKXt2YXIgZT10aGlzLnJhbmdlTGlzdC5yYW5nZXMsdD1lW2UubGVuZ3RoLTFdLG49aS5mcm9tUG9pbnRzKGVbMF0uc3RhcnQsdC5lbmQpO3RoaXMudG9TaW5nbGVSYW5nZSgpLHRoaXMuc2V0U2VsZWN0aW9uUmFuZ2Uobix0LmN1cnNvcj09dC5zdGFydCl9ZWxzZXt2YXIgcj10aGlzLnNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuY3Vyc29yKSxzPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24odGhpcy5hbmNob3IpLG89dGhpcy5yZWN0YW5ndWxhclJhbmdlQmxvY2socixzKTtvLmZvckVhY2godGhpcy5hZGRSYW5nZSx0aGlzKX19LHRoaXMucmVjdGFuZ3VsYXJSYW5nZUJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1bXSxzPWUuY29sdW1uPHQuY29sdW1uO2lmKHMpdmFyIG89ZS5jb2x1bW4sdT10LmNvbHVtbixhPWUub2Zmc2V0WCxmPXQub2Zmc2V0WDtlbHNlIHZhciBvPXQuY29sdW1uLHU9ZS5jb2x1bW4sYT10Lm9mZnNldFgsZj1lLm9mZnNldFg7dmFyIGw9ZS5yb3c8dC5yb3c7aWYobCl2YXIgYz1lLnJvdyxoPXQucm93O2Vsc2UgdmFyIGM9dC5yb3csaD1lLnJvdztvPDAmJihvPTApLGM8MCYmKGM9MCksYz09aCYmKG49ITApO3ZhciBwO2Zvcih2YXIgZD1jO2Q8PWg7ZCsrKXt2YXIgbT1pLmZyb21Qb2ludHModGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihkLG8sYSksdGhpcy5zZXNzaW9uLnNjcmVlblRvRG9jdW1lbnRQb3NpdGlvbihkLHUsZikpO2lmKG0uaXNFbXB0eSgpKXtpZihwJiZ2KG0uZW5kLHApKWJyZWFrO3A9bS5lbmR9bS5jdXJzb3I9cz9tLnN0YXJ0Om0uZW5kLHIucHVzaChtKX1sJiZyLnJldmVyc2UoKTtpZighbil7dmFyIGc9ci5sZW5ndGgtMTt3aGlsZShyW2ddLmlzRW1wdHkoKSYmZz4wKWctLTtpZihnPjApe3ZhciB5PTA7d2hpbGUoclt5XS5pc0VtcHR5KCkpeSsrfWZvcih2YXIgYj1nO2I+PXk7Yi0tKXJbYl0uaXNFbXB0eSgpJiZyLnNwbGljZShiLDEpfXJldHVybiByfX0uY2FsbChzLnByb3RvdHlwZSk7dmFyIGQ9ZSgiLi9lZGl0b3IiKS5FZGl0b3I7KGZ1bmN0aW9uKCl7dGhpcy51cGRhdGVTZWxlY3Rpb25NYXJrZXJzPWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuYWRkU2VsZWN0aW9uTWFya2VyPWZ1bmN0aW9uKGUpe2UuY3Vyc29yfHwoZS5jdXJzb3I9ZS5lbmQpO3ZhciB0PXRoaXMuZ2V0U2VsZWN0aW9uU3R5bGUoKTtyZXR1cm4gZS5tYXJrZXI9dGhpcy5zZXNzaW9uLmFkZE1hcmtlcihlLCJhY2Vfc2VsZWN0aW9uIix0KSx0aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMucHVzaChlKSx0aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dGhpcy5zZXNzaW9uLiRzZWxlY3Rpb25NYXJrZXJzLmxlbmd0aCxlfSx0aGlzLnJlbW92ZVNlbGVjdGlvbk1hcmtlcj1mdW5jdGlvbihlKXtpZighZS5tYXJrZXIpcmV0dXJuO3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoZS5tYXJrZXIpO3ZhciB0PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5pbmRleE9mKGUpO3QhPS0xJiZ0aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnMuc3BsaWNlKHQsMSksdGhpcy5zZXNzaW9uLnNlbGVjdGlvbk1hcmtlckNvdW50PXRoaXMuc2Vzc2lvbi4kc2VsZWN0aW9uTWFya2Vycy5sZW5ndGh9LHRoaXMucmVtb3ZlU2VsZWN0aW9uTWFya2Vycz1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24uJHNlbGVjdGlvbk1hcmtlcnM7Zm9yKHZhciBuPWUubGVuZ3RoO24tLTspe3ZhciByPWVbbl07aWYoIXIubWFya2VyKWNvbnRpbnVlO3RoaXMuc2Vzc2lvbi5yZW1vdmVNYXJrZXIoci5tYXJrZXIpO3ZhciBpPXQuaW5kZXhPZihyKTtpIT0tMSYmdC5zcGxpY2UoaSwxKX10aGlzLnNlc3Npb24uc2VsZWN0aW9uTWFya2VyQ291bnQ9dC5sZW5ndGh9LHRoaXMuJG9uQWRkUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5hZGRTZWxlY3Rpb25NYXJrZXIoZS5yYW5nZSksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCl9LHRoaXMuJG9uUmVtb3ZlUmFuZ2U9ZnVuY3Rpb24oZSl7dGhpcy5yZW1vdmVTZWxlY3Rpb25NYXJrZXJzKGUucmFuZ2VzKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25NdWx0aVNlbGVjdD1mdW5jdGlvbihlKXtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlKXJldHVybjt0aGlzLmluTXVsdGlTZWxlY3RNb2RlPSEwLHRoaXMuc2V0U3R5bGUoImFjZV9tdWx0aXNlbGVjdCIpLHRoaXMua2V5QmluZGluZy5hZGRLZXlib2FyZEhhbmRsZXIoZi5rZXlib2FyZEhhbmRsZXIpLHRoaXMuY29tbWFuZHMuc2V0RGVmYXVsdEhhbmRsZXIoImV4ZWMiLHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUN1cnNvcigpLHRoaXMucmVuZGVyZXIudXBkYXRlQmFja01hcmtlcnMoKX0sdGhpcy4kb25TaW5nbGVTZWxlY3Q9ZnVuY3Rpb24oZSl7aWYodGhpcy5zZXNzaW9uLm11bHRpU2VsZWN0LmluVmlydHVhbE1vZGUpcmV0dXJuO3RoaXMuaW5NdWx0aVNlbGVjdE1vZGU9ITEsdGhpcy51bnNldFN0eWxlKCJhY2VfbXVsdGlzZWxlY3QiKSx0aGlzLmtleUJpbmRpbmcucmVtb3ZlS2V5Ym9hcmRIYW5kbGVyKGYua2V5Ym9hcmRIYW5kbGVyKSx0aGlzLmNvbW1hbmRzLnJlbW92ZURlZmF1bHRIYW5kbGVyKCJleGVjIix0aGlzLiRvbk11bHRpU2VsZWN0RXhlYyksdGhpcy5yZW5kZXJlci51cGRhdGVDdXJzb3IoKSx0aGlzLnJlbmRlcmVyLnVwZGF0ZUJhY2tNYXJrZXJzKCksdGhpcy5fZW1pdCgiY2hhbmdlU2VsZWN0aW9uIil9LHRoaXMuJG9uTXVsdGlTZWxlY3RFeGVjPWZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tbWFuZCxuPWUuZWRpdG9yO2lmKCFuLm11bHRpU2VsZWN0KXJldHVybjtpZighdC5tdWx0aVNlbGVjdEFjdGlvbil7dmFyIHI9dC5leGVjKG4sZS5hcmdzfHx7fSk7bi5tdWx0aVNlbGVjdC5hZGRSYW5nZShuLm11bHRpU2VsZWN0LnRvT3JpZW50ZWRSYW5nZSgpKSxuLm11bHRpU2VsZWN0Lm1lcmdlT3ZlcmxhcHBpbmdSYW5nZXMoKX1lbHNlIHQubXVsdGlTZWxlY3RBY3Rpb249PSJmb3JFYWNoIj9yPW4uZm9yRWFjaFNlbGVjdGlvbih0LGUuYXJncyk6dC5tdWx0aVNlbGVjdEFjdGlvbj09ImZvckVhY2hMaW5lIj9yPW4uZm9yRWFjaFNlbGVjdGlvbih0LGUuYXJncywhMCk6dC5tdWx0aVNlbGVjdEFjdGlvbj09InNpbmdsZSI/KG4uZXhpdE11bHRpU2VsZWN0TW9kZSgpLHI9dC5leGVjKG4sZS5hcmdzfHx7fSkpOnI9dC5tdWx0aVNlbGVjdEFjdGlvbihuLGUuYXJnc3x8e30pO3JldHVybiByfSx0aGlzLmZvckVhY2hTZWxlY3Rpb249ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZSlyZXR1cm47dmFyIHI9biYmbi5rZWVwT3JkZXIsaT1uPT0xfHxuJiZuLiRieUxpbmVzLG89dGhpcy5zZXNzaW9uLHU9dGhpcy5zZWxlY3Rpb24sYT11LnJhbmdlTGlzdCxmPShyP3U6YSkucmFuZ2VzLGw7aWYoIWYubGVuZ3RoKXJldHVybiBlLmV4ZWM/ZS5leGVjKHRoaXMsdHx8e30pOmUodGhpcyx0fHx7fSk7dmFyIGM9dS5fZXZlbnRSZWdpc3RyeTt1Ll9ldmVudFJlZ2lzdHJ5PXt9O3ZhciBoPW5ldyBzKG8pO3RoaXMuaW5WaXJ0dWFsU2VsZWN0aW9uTW9kZT0hMDtmb3IodmFyIHA9Zi5sZW5ndGg7cC0tOyl7aWYoaSl3aGlsZShwPjAmJmZbcF0uc3RhcnQucm93PT1mW3AtMV0uZW5kLnJvdylwLS07aC5mcm9tT3JpZW50ZWRSYW5nZShmW3BdKSxoLmluZGV4PXAsdGhpcy5zZWxlY3Rpb249by5zZWxlY3Rpb249aDt2YXIgZD1lLmV4ZWM/ZS5leGVjKHRoaXMsdHx8e30pOmUodGhpcyx0fHx7fSk7IWwmJmQhPT11bmRlZmluZWQmJihsPWQpLGgudG9PcmllbnRlZFJhbmdlKGZbcF0pfWguZGV0YWNoKCksdGhpcy5zZWxlY3Rpb249by5zZWxlY3Rpb249dSx0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGU9ITEsdS5fZXZlbnRSZWdpc3RyeT1jLHUubWVyZ2VPdmVybGFwcGluZ1JhbmdlcygpLHUucmFuZ2VzWzBdJiZ1LmZyb21PcmllbnRlZFJhbmdlKHUucmFuZ2VzWzBdKTt2YXIgdj10aGlzLnJlbmRlcmVyLiRzY3JvbGxBbmltYXRpb247cmV0dXJuIHRoaXMub25DdXJzb3JDaGFuZ2UoKSx0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlKCksdiYmdi5mcm9tPT12LnRvJiZ0aGlzLnJlbmRlcmVyLmFuaW1hdGVTY3JvbGxpbmcodi5mcm9tKSxsfSx0aGlzLmV4aXRNdWx0aVNlbGVjdE1vZGU9ZnVuY3Rpb24oKXtpZighdGhpcy5pbk11bHRpU2VsZWN0TW9kZXx8dGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXJldHVybjt0aGlzLm11bHRpU2VsZWN0LnRvU2luZ2xlUmFuZ2UoKX0sdGhpcy5nZXRTZWxlY3RlZFRleHQ9ZnVuY3Rpb24oKXt2YXIgZT0iIjtpZih0aGlzLmluTXVsdGlTZWxlY3RNb2RlJiYhdGhpcy5pblZpcnR1YWxTZWxlY3Rpb25Nb2RlKXt2YXIgdD10aGlzLm11bHRpU2VsZWN0LnJhbmdlTGlzdC5yYW5nZXMsbj1bXTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2godGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0W3JdKSk7dmFyIGk9dGhpcy5zZXNzaW9uLmdldERvY3VtZW50KCkuZ2V0TmV3TGluZUNoYXJhY3RlcigpO2U9bi5qb2luKGkpLGUubGVuZ3RoPT0obi5sZW5ndGgtMSkqaS5sZW5ndGgmJihlPSIiKX1lbHNlIHRoaXMuc2VsZWN0aW9uLmlzRW1wdHkoKXx8KGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZSh0aGlzLmdldFNlbGVjdGlvblJhbmdlKCkpKTtyZXR1cm4gZX0sdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZT1mdW5jdGlvbihlLHQpe2lmKHRoaXMuaW5NdWx0aVNlbGVjdE1vZGUmJiF0aGlzLmluVmlydHVhbFNlbGVjdGlvbk1vZGUpe3ZhciBuPXRoaXMubXVsdGlTZWxlY3QucmFuZ2VzWzBdO2lmKHRoaXMubXVsdGlTZWxlY3QuaXNFbXB0eSgpJiZ0PT10aGlzLm11bHRpU2VsZWN0LmFuY2hvcilyZXR1cm47dmFyIHI9dD09dGhpcy5tdWx0aVNlbGVjdC5hbmNob3I/bi5jdXJzb3I9PW4uc3RhcnQ/bi5lbmQ6bi5zdGFydDpuLmN1cnNvcjtyLnJvdyE9dC5yb3d8fHRoaXMuc2Vzc2lvbi4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudChyLnJvdyxyLmNvbHVtbikuY29sdW1uIT10LmNvbHVtbj90aGlzLm11bHRpU2VsZWN0LnRvU2luZ2xlUmFuZ2UodGhpcy5tdWx0aVNlbGVjdC50b09yaWVudGVkUmFuZ2UoKSk6dGhpcy5tdWx0aVNlbGVjdC5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCl9fSx0aGlzLmZpbmRBbGw9ZnVuY3Rpb24oZSx0LG4pe3Q9dHx8e30sdC5uZWVkbGU9ZXx8dC5uZWVkbGU7aWYodC5uZWVkbGU9PXVuZGVmaW5lZCl7dmFyIHI9dGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpP3RoaXMuc2VsZWN0aW9uLmdldFdvcmRSYW5nZSgpOnRoaXMuc2VsZWN0aW9uLmdldFJhbmdlKCk7dC5uZWVkbGU9dGhpcy5zZXNzaW9uLmdldFRleHRSYW5nZShyKX10aGlzLiRzZWFyY2guc2V0KHQpO3ZhciBpPXRoaXMuJHNlYXJjaC5maW5kQWxsKHRoaXMuc2Vzc2lvbik7aWYoIWkubGVuZ3RoKXJldHVybiAwO3ZhciBzPXRoaXMubXVsdGlTZWxlY3Q7bnx8cy50b1NpbmdsZVJhbmdlKGlbMF0pO2Zvcih2YXIgbz1pLmxlbmd0aDtvLS07KXMuYWRkUmFuZ2UoaVtvXSwhMCk7cmV0dXJuIHImJnMucmFuZ2VMaXN0LnJhbmdlQXRQb2ludChyLnN0YXJ0KSYmcy5hZGRSYW5nZShyLCEwKSxpLmxlbmd0aH0sdGhpcy5zZWxlY3RNb3JlTGluZXM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLnNlbGVjdGlvbi50b09yaWVudGVkUmFuZ2UoKSxyPW4uY3Vyc29yPT1uLmVuZCxzPXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24obi5jdXJzb3IpO3RoaXMuc2VsZWN0aW9uLiRkZXNpcmVkQ29sdW1uJiYocy5jb2x1bW49dGhpcy5zZWxlY3Rpb24uJGRlc2lyZWRDb2x1bW4pO3ZhciBvPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24ocy5yb3crZSxzLmNvbHVtbik7aWYoIW4uaXNFbXB0eSgpKXZhciB1PXRoaXMuc2Vzc2lvbi5kb2N1bWVudFRvU2NyZWVuUG9zaXRpb24ocj9uLmVuZDpuLnN0YXJ0KSxhPXRoaXMuc2Vzc2lvbi5zY3JlZW5Ub0RvY3VtZW50UG9zaXRpb24odS5yb3crZSx1LmNvbHVtbik7ZWxzZSB2YXIgYT1vO2lmKHIpe3ZhciBmPWkuZnJvbVBvaW50cyhvLGEpO2YuY3Vyc29yPWYuc3RhcnR9ZWxzZXt2YXIgZj1pLmZyb21Qb2ludHMoYSxvKTtmLmN1cnNvcj1mLmVuZH1mLmRlc2lyZWRDb2x1bW49cy5jb2x1bW47aWYoIXRoaXMuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlKXRoaXMuc2VsZWN0aW9uLmFkZFJhbmdlKG4pO2Vsc2UgaWYodCl2YXIgbD1uLmN1cnNvcjt0aGlzLnNlbGVjdGlvbi5hZGRSYW5nZShmKSxsJiZ0aGlzLnNlbGVjdGlvbi5zdWJzdHJhY3RQb2ludChsKX0sdGhpcy50cmFuc3Bvc2VTZWxlY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuc2Vzc2lvbixuPXQubXVsdGlTZWxlY3Qscj1uLnJhbmdlcztmb3IodmFyIGk9ci5sZW5ndGg7aS0tOyl7dmFyIHM9cltpXTtpZihzLmlzRW1wdHkoKSl7dmFyIG89dC5nZXRXb3JkUmFuZ2Uocy5zdGFydC5yb3cscy5zdGFydC5jb2x1bW4pO3Muc3RhcnQucm93PW8uc3RhcnQucm93LHMuc3RhcnQuY29sdW1uPW8uc3RhcnQuY29sdW1uLHMuZW5kLnJvdz1vLmVuZC5yb3cscy5lbmQuY29sdW1uPW8uZW5kLmNvbHVtbn19bi5tZXJnZU92ZXJsYXBwaW5nUmFuZ2VzKCk7dmFyIHU9W107Zm9yKHZhciBpPXIubGVuZ3RoO2ktLTspe3ZhciBzPXJbaV07dS51bnNoaWZ0KHQuZ2V0VGV4dFJhbmdlKHMpKX1lPDA/dS51bnNoaWZ0KHUucG9wKCkpOnUucHVzaCh1LnNoaWZ0KCkpO2Zvcih2YXIgaT1yLmxlbmd0aDtpLS07KXt2YXIgcz1yW2ldLG89cy5jbG9uZSgpO3QucmVwbGFjZShzLHVbaV0pLHMuc3RhcnQucm93PW8uc3RhcnQucm93LHMuc3RhcnQuY29sdW1uPW8uc3RhcnQuY29sdW1ufW4uZnJvbU9yaWVudGVkUmFuZ2Uobi5yYW5nZXNbMF0pfSx0aGlzLnNlbGVjdE1vcmU9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuc2Vzc2lvbixpPXIubXVsdGlTZWxlY3Qscz1pLnRvT3JpZW50ZWRSYW5nZSgpO2lmKHMuaXNFbXB0eSgpKXtzPXIuZ2V0V29yZFJhbmdlKHMuc3RhcnQucm93LHMuc3RhcnQuY29sdW1uKSxzLmN1cnNvcj1lPT0tMT9zLnN0YXJ0OnMuZW5kLHRoaXMubXVsdGlTZWxlY3QuYWRkUmFuZ2Uocyk7aWYobilyZXR1cm59dmFyIG89ci5nZXRUZXh0UmFuZ2UocyksdT1oKHIsbyxlKTt1JiYodS5jdXJzb3I9ZT09LTE/dS5zdGFydDp1LmVuZCx0aGlzLnNlc3Npb24udW5mb2xkKHUpLHRoaXMubXVsdGlTZWxlY3QuYWRkUmFuZ2UodSksdGhpcy5yZW5kZXJlci5zY3JvbGxDdXJzb3JJbnRvVmlldyhudWxsLC41KSksdCYmdGhpcy5tdWx0aVNlbGVjdC5zdWJzdHJhY3RQb2ludChzLmN1cnNvcil9LHRoaXMuYWxpZ25DdXJzb3JzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5zZXNzaW9uLHQ9ZS5tdWx0aVNlbGVjdCxuPXQucmFuZ2VzLHI9LTEscz1uLmZpbHRlcihmdW5jdGlvbihlKXtpZihlLmN1cnNvci5yb3c9PXIpcmV0dXJuITA7cj1lLmN1cnNvci5yb3d9KTtpZighbi5sZW5ndGh8fHMubGVuZ3RoPT1uLmxlbmd0aC0xKXt2YXIgbz10aGlzLnNlbGVjdGlvbi5nZXRSYW5nZSgpLHU9by5zdGFydC5yb3csZj1vLmVuZC5yb3csbD11PT1mO2lmKGwpe3ZhciBjPXRoaXMuc2Vzc2lvbi5nZXRMZW5ndGgoKSxoO2RvIGg9dGhpcy5zZXNzaW9uLmdldExpbmUoZik7d2hpbGUoL1s9Ol0vLnRlc3QoaCkmJisrZjxjKTtkbyBoPXRoaXMuc2Vzc2lvbi5nZXRMaW5lKHUpO3doaWxlKC9bPTpdLy50ZXN0KGgpJiYtLXU+MCk7dTwwJiYodT0wKSxmPj1jJiYoZj1jLTEpfXZhciBwPXRoaXMuc2Vzc2lvbi5yZW1vdmVGdWxsTGluZXModSxmKTtwPXRoaXMuJHJlQWxpZ25UZXh0KHAsbCksdGhpcy5zZXNzaW9uLmluc2VydCh7cm93OnUsY29sdW1uOjB9LHAuam9pbigiXG4iKSsiXG4iKSxsfHwoby5zdGFydC5jb2x1bW49MCxvLmVuZC5jb2x1bW49cFtwLmxlbmd0aC0xXS5sZW5ndGgpLHRoaXMuc2VsZWN0aW9uLnNldFJhbmdlKG8pfWVsc2V7cy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3Quc3Vic3RyYWN0UG9pbnQoZS5jdXJzb3IpfSk7dmFyIGQ9MCx2PUluZmluaXR5LG09bi5tYXAoZnVuY3Rpb24odCl7dmFyIG49dC5jdXJzb3Iscj1lLmdldExpbmUobi5yb3cpLGk9ci5zdWJzdHIobi5jb2x1bW4pLnNlYXJjaCgvXFMvZyk7cmV0dXJuIGk9PS0xJiYoaT0wKSxuLmNvbHVtbj5kJiYoZD1uLmNvbHVtbiksaTx2JiYodj1pKSxpfSk7bi5mb3JFYWNoKGZ1bmN0aW9uKHQsbil7dmFyIHI9dC5jdXJzb3Iscz1kLXIuY29sdW1uLG89bVtuXS12O3M+bz9lLmluc2VydChyLGEuc3RyaW5nUmVwZWF0KCIgIixzLW8pKTplLnJlbW92ZShuZXcgaShyLnJvdyxyLmNvbHVtbixyLnJvdyxyLmNvbHVtbi1zK28pKSx0LnN0YXJ0LmNvbHVtbj10LmVuZC5jb2x1bW49ZCx0LnN0YXJ0LnJvdz10LmVuZC5yb3c9ci5yb3csdC5jdXJzb3I9dC5lbmR9KSx0LmZyb21PcmllbnRlZFJhbmdlKG5bMF0pLHRoaXMucmVuZGVyZXIudXBkYXRlQ3Vyc29yKCksdGhpcy5yZW5kZXJlci51cGRhdGVCYWNrTWFya2VycygpfX0sdGhpcy4kcmVBbGlnblRleHQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiB1KGUpe3JldHVybiBhLnN0cmluZ1JlcGVhdCgiICIsZSl9ZnVuY3Rpb24gZihlKXtyZXR1cm4gZVsyXT91KGkpK2VbMl0rdShzLWVbMl0ubGVuZ3RoK28pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19ZnVuY3Rpb24gbChlKXtyZXR1cm4gZVsyXT91KGkrcy1lWzJdLmxlbmd0aCkrZVsyXSt1KG8pK2VbNF0ucmVwbGFjZSgvXihbPTpdKVxzKy8sIiQxICIpOmVbMF19ZnVuY3Rpb24gYyhlKXtyZXR1cm4gZVsyXT91KGkpK2VbMl0rdShvKStlWzRdLnJlcGxhY2UoL14oWz06XSlccysvLCIkMSAiKTplWzBdfXZhciBuPSEwLHI9ITAsaSxzLG87cmV0dXJuIGUubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PWUubWF0Y2goLyhccyopKC4qPykoXHMqKShbPTpdLiopLyk7cmV0dXJuIHQ/aT09bnVsbD8oaT10WzFdLmxlbmd0aCxzPXRbMl0ubGVuZ3RoLG89dFszXS5sZW5ndGgsdCk6KGkrcytvIT10WzFdLmxlbmd0aCt0WzJdLmxlbmd0aCt0WzNdLmxlbmd0aCYmKHI9ITEpLGkhPXRbMV0ubGVuZ3RoJiYobj0hMSksaT50WzFdLmxlbmd0aCYmKGk9dFsxXS5sZW5ndGgpLHM8dFsyXS5sZW5ndGgmJihzPXRbMl0ubGVuZ3RoKSxvPnRbM10ubGVuZ3RoJiYobz10WzNdLmxlbmd0aCksdCk6W2VdfSkubWFwKHQ/ZjpuP3I/bDpmOmMpfX0pLmNhbGwoZC5wcm90b3R5cGUpLHQub25TZXNzaW9uQ2hhbmdlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Vzc2lvbjt0JiYhdC5tdWx0aVNlbGVjdCYmKHQuJHNlbGVjdGlvbk1hcmtlcnM9W10sdC5zZWxlY3Rpb24uJGluaXRSYW5nZUxpc3QoKSx0Lm11bHRpU2VsZWN0PXQuc2VsZWN0aW9uKSx0aGlzLm11bHRpU2VsZWN0PXQmJnQubXVsdGlTZWxlY3Q7dmFyIG49ZS5vbGRTZXNzaW9uO24mJihuLm11bHRpU2VsZWN0Lm9mZigiYWRkUmFuZ2UiLHRoaXMuJG9uQWRkUmFuZ2UpLG4ubXVsdGlTZWxlY3Qub2ZmKCJyZW1vdmVSYW5nZSIsdGhpcy4kb25SZW1vdmVSYW5nZSksbi5tdWx0aVNlbGVjdC5vZmYoIm11bHRpU2VsZWN0Iix0aGlzLiRvbk11bHRpU2VsZWN0KSxuLm11bHRpU2VsZWN0Lm9mZigic2luZ2xlU2VsZWN0Iix0aGlzLiRvblNpbmdsZVNlbGVjdCksbi5tdWx0aVNlbGVjdC5sZWFkLm9mZigiY2hhbmdlIix0aGlzLiRjaGVja011bHRpc2VsZWN0Q2hhbmdlKSxuLm11bHRpU2VsZWN0LmFuY2hvci5vZmYoImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSkpLHQmJih0Lm11bHRpU2VsZWN0Lm9uKCJhZGRSYW5nZSIsdGhpcy4kb25BZGRSYW5nZSksdC5tdWx0aVNlbGVjdC5vbigicmVtb3ZlUmFuZ2UiLHRoaXMuJG9uUmVtb3ZlUmFuZ2UpLHQubXVsdGlTZWxlY3Qub24oIm11bHRpU2VsZWN0Iix0aGlzLiRvbk11bHRpU2VsZWN0KSx0Lm11bHRpU2VsZWN0Lm9uKCJzaW5nbGVTZWxlY3QiLHRoaXMuJG9uU2luZ2xlU2VsZWN0KSx0Lm11bHRpU2VsZWN0LmxlYWQub24oImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSksdC5tdWx0aVNlbGVjdC5hbmNob3Iub24oImNoYW5nZSIsdGhpcy4kY2hlY2tNdWx0aXNlbGVjdENoYW5nZSkpLHQmJnRoaXMuaW5NdWx0aVNlbGVjdE1vZGUhPXQuc2VsZWN0aW9uLmluTXVsdGlTZWxlY3RNb2RlJiYodC5zZWxlY3Rpb24uaW5NdWx0aVNlbGVjdE1vZGU/dGhpcy4kb25NdWx0aVNlbGVjdCgpOnRoaXMuJG9uU2luZ2xlU2VsZWN0KCkpfSx0Lk11bHRpU2VsZWN0PW0sZSgiLi9jb25maWciKS5kZWZpbmVPcHRpb25zKGQucHJvdG90eXBlLCJlZGl0b3IiLHtlbmFibGVNdWx0aXNlbGVjdDp7c2V0OmZ1bmN0aW9uKGUpe20odGhpcyksZT8odGhpcy5vbigiY2hhbmdlU2Vzc2lvbiIsdGhpcy4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLHRoaXMub24oIm1vdXNlZG93biIsbykpOih0aGlzLm9mZigiY2hhbmdlU2Vzc2lvbiIsdGhpcy4kbXVsdGlzZWxlY3RPblNlc3Npb25DaGFuZ2UpLHRoaXMub2ZmKCJtb3VzZWRvd24iLG8pKX0sdmFsdWU6ITB9LGVuYWJsZUJsb2NrU2VsZWN0OntzZXQ6ZnVuY3Rpb24oZSl7dGhpcy4kYmxvY2tTZWxlY3RFbmFibGVkPWV9LHZhbHVlOiEwfX0pfSksYWNlLmRlZmluZSgiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvcmFuZ2UiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL3JhbmdlIikuUmFuZ2UsaT10LkZvbGRNb2RlPWZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1udWxsLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bnVsbCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0TGluZShuKTtyZXR1cm4gdGhpcy5mb2xkaW5nU3RhcnRNYXJrZXIudGVzdChyKT8ic3RhcnQiOnQ9PSJtYXJrYmVnaW5lbmQiJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyJiZ0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnRlc3Qocik/ImVuZCI6IiJ9LHRoaXMuZ2V0Rm9sZFdpZGdldFJhbmdlPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbnVsbH0sdGhpcy5pbmRlbnRhdGlvbkJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT0vXFMvLHM9ZS5nZXRMaW5lKHQpLG89cy5zZWFyY2goaSk7aWYobz09LTEpcmV0dXJuO3ZhciB1PW58fHMubGVuZ3RoLGE9ZS5nZXRMZW5ndGgoKSxmPXQsbD10O3doaWxlKCsrdDxhKXt2YXIgYz1lLmdldExpbmUodCkuc2VhcmNoKGkpO2lmKGM9PS0xKWNvbnRpbnVlO2lmKGM8PW8pe3ZhciBoPWUuZ2V0VG9rZW5BdCh0LDApO2lmKCFofHxoLnR5cGUhPT0ic3RyaW5nIilicmVha31sPXR9aWYobD5mKXt2YXIgcD1lLmdldExpbmUobCkubGVuZ3RoO3JldHVybiBuZXcgcihmLHUsbCxwKX19LHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jaz1mdW5jdGlvbihlLHQsbixpLHMpe3ZhciBvPXtyb3c6bixjb2x1bW46aSsxfSx1PWUuJGZpbmRDbG9zaW5nQnJhY2tldCh0LG8scyk7aWYoIXUpcmV0dXJuO3ZhciBhPWUuZm9sZFdpZGdldHNbdS5yb3ddO3JldHVybiBhPT1udWxsJiYoYT1lLmdldEZvbGRXaWRnZXQodS5yb3cpKSxhPT0ic3RhcnQiJiZ1LnJvdz5vLnJvdyYmKHUucm93LS0sdS5jb2x1bW49ZS5nZXRMaW5lKHUucm93KS5sZW5ndGgpLHIuZnJvbVBvaW50cyhvLHUpfSx0aGlzLmNsb3NpbmdCcmFja2V0QmxvY2s9ZnVuY3Rpb24oZSx0LG4saSxzKXt2YXIgbz17cm93Om4sY29sdW1uOml9LHU9ZS4kZmluZE9wZW5pbmdCcmFja2V0KHQsbyk7aWYoIXUpcmV0dXJuO3JldHVybiB1LmNvbHVtbisrLG8uY29sdW1uLS0sci5mcm9tUG9pbnRzKHUsbyl9fSkuY2FsbChpLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvdGhlbWUvdGV4dG1hdGUiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2RvbSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dC5pc0Rhcms9ITEsdC5jc3NDbGFzcz0iYWNlLXRtIix0LmNzc1RleHQ9Jy5hY2UtdG0gLmFjZV9ndXR0ZXIge2JhY2tncm91bmQ6ICNmMGYwZjA7Y29sb3I6ICMzMzM7fS5hY2UtdG0gLmFjZV9wcmludC1tYXJnaW4ge3dpZHRoOiAxcHg7YmFja2dyb3VuZDogI2U4ZThlODt9LmFjZS10bSAuYWNlX2ZvbGQge2JhY2tncm91bmQtY29sb3I6ICM2QjcyRTY7fS5hY2UtdG0ge2JhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Y29sb3I6IGJsYWNrO30uYWNlLXRtIC5hY2VfY3Vyc29yIHtjb2xvcjogYmxhY2s7fS5hY2UtdG0gLmFjZV9pbnZpc2libGUge2NvbG9yOiByZ2IoMTkxLCAxOTEsIDE5MSk7fS5hY2UtdG0gLmFjZV9zdG9yYWdlLC5hY2UtdG0gLmFjZV9rZXl3b3JkIHtjb2xvcjogYmx1ZTt9LmFjZS10bSAuYWNlX2NvbnN0YW50IHtjb2xvcjogcmdiKDE5NywgNiwgMTEpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2J1aWxkaW4ge2NvbG9yOiByZ2IoODgsIDcyLCAyNDYpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX2xhbmd1YWdlIHtjb2xvcjogcmdiKDg4LCA5MiwgMjQ2KTt9LmFjZS10bSAuYWNlX2NvbnN0YW50LmFjZV9saWJyYXJ5IHtjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2VfaW52YWxpZCB7YmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDAsIDAsIDAuMSk7Y29sb3I6IHJlZDt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2Z1bmN0aW9uIHtjb2xvcjogcmdiKDYwLCA3NiwgMTE0KTt9LmFjZS10bSAuYWNlX3N1cHBvcnQuYWNlX2NvbnN0YW50IHtjb2xvcjogcmdiKDYsIDE1MCwgMTQpO30uYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfdHlwZSwuYWNlLXRtIC5hY2Vfc3VwcG9ydC5hY2VfY2xhc3Mge2NvbG9yOiByZ2IoMTA5LCAxMjEsIDIyMik7fS5hY2UtdG0gLmFjZV9rZXl3b3JkLmFjZV9vcGVyYXRvciB7Y29sb3I6IHJnYigxMDQsIDExOCwgMTM1KTt9LmFjZS10bSAuYWNlX3N0cmluZyB7Y29sb3I6IHJnYigzLCAxMDYsIDcpO30uYWNlLXRtIC5hY2VfY29tbWVudCB7Y29sb3I6IHJnYig3NiwgMTM2LCAxMDcpO30uYWNlLXRtIC5hY2VfY29tbWVudC5hY2VfZG9jIHtjb2xvcjogcmdiKDAsIDEwMiwgMjU1KTt9LmFjZS10bSAuYWNlX2NvbW1lbnQuYWNlX2RvYy5hY2VfdGFnIHtjb2xvcjogcmdiKDEyOCwgMTU5LCAxOTEpO30uYWNlLXRtIC5hY2VfY29uc3RhbnQuYWNlX251bWVyaWMge2NvbG9yOiByZ2IoMCwgMCwgMjA1KTt9LmFjZS10bSAuYWNlX3ZhcmlhYmxlIHtjb2xvcjogcmdiKDQ5LCAxMzIsIDE0OSk7fS5hY2UtdG0gLmFjZV94bWwtcGUge2NvbG9yOiByZ2IoMTA0LCAxMDQsIDkxKTt9LmFjZS10bSAuYWNlX2VudGl0eS5hY2VfbmFtZS5hY2VfZnVuY3Rpb24ge2NvbG9yOiAjMDAwMEEyO30uYWNlLXRtIC5hY2VfaGVhZGluZyB7Y29sb3I6IHJnYigxMiwgNywgMjU1KTt9LmFjZS10bSAuYWNlX2xpc3Qge2NvbG9yOnJnYigxODUsIDYsIDE0NCk7fS5hY2UtdG0gLmFjZV9tZXRhLmFjZV90YWcge2NvbG9yOnJnYigwLCAyMiwgMTQyKTt9LmFjZS10bSAuYWNlX3N0cmluZy5hY2VfcmVnZXgge2NvbG9yOiByZ2IoMjU1LCAwLCAwKX0uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc2VsZWN0aW9uIHtiYWNrZ3JvdW5kOiByZ2IoMTgxLCAyMTMsIDI1NSk7fS5hY2UtdG0uYWNlX211bHRpc2VsZWN0IC5hY2Vfc2VsZWN0aW9uLmFjZV9zdGFydCB7Ym94LXNoYWRvdzogMCAwIDNweCAwcHggd2hpdGU7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zdGVwIHtiYWNrZ3JvdW5kOiByZ2IoMjUyLCAyNTUsIDApO30uYWNlLXRtIC5hY2VfbWFya2VyLWxheWVyIC5hY2Vfc3RhY2sge2JhY2tncm91bmQ6IHJnYigxNjQsIDIyOSwgMTAxKTt9LmFjZS10bSAuYWNlX21hcmtlci1sYXllciAuYWNlX2JyYWNrZXQge21hcmdpbjogLTFweCAwIDAgLTFweDtib3JkZXI6IDFweCBzb2xpZCByZ2IoMTkyLCAxOTIsIDE5Mik7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9hY3RpdmUtbGluZSB7YmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA3KTt9LmFjZS10bSAuYWNlX2d1dHRlci1hY3RpdmUtbGluZSB7YmFja2dyb3VuZC1jb2xvciA6ICNkY2RjZGM7fS5hY2UtdG0gLmFjZV9tYXJrZXItbGF5ZXIgLmFjZV9zZWxlY3RlZC13b3JkIHtiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1NSk7Ym9yZGVyOiAxcHggc29saWQgcmdiKDIwMCwgMjAwLCAyNTApO30uYWNlLXRtIC5hY2VfaW5kZW50LWd1aWRlIHtiYWNrZ3JvdW5kOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQUVBQUFBQ0NBWUFBQUNaZ2JZbkFBQUFFMGxFUVZRSW1XUDQvLy8vZjRiTGx5Ly9Cd0FtVmdkMS93MTEvZ0FBQUFCSlJVNUVya0pnZ2c9PSIpIHJpZ2h0IHJlcGVhdC15O30nLHQuJGlkPSJhY2UvdGhlbWUvdGV4dG1hdGUiO3ZhciByPWUoIi4uL2xpYi9kb20iKTtyLmltcG9ydENzc1N0cmluZyh0LmNzc1RleHQsdC5jc3NDbGFzcyl9KSxhY2UuZGVmaW5lKCJhY2UvbGluZV93aWRnZXRzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbGliL2RvbSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbyhlKXt0aGlzLnNlc3Npb249ZSx0aGlzLnNlc3Npb24ud2lkZ2V0TWFuYWdlcj10aGlzLHRoaXMuc2Vzc2lvbi5nZXRSb3dMZW5ndGg9dGhpcy5nZXRSb3dMZW5ndGgsdGhpcy5zZXNzaW9uLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGg9dGhpcy4kZ2V0V2lkZ2V0U2NyZWVuTGVuZ3RoLHRoaXMudXBkYXRlT25DaGFuZ2U9dGhpcy51cGRhdGVPbkNoYW5nZS5iaW5kKHRoaXMpLHRoaXMucmVuZGVyV2lkZ2V0cz10aGlzLnJlbmRlcldpZGdldHMuYmluZCh0aGlzKSx0aGlzLm1lYXN1cmVXaWRnZXRzPXRoaXMubWVhc3VyZVdpZGdldHMuYmluZCh0aGlzKSx0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzPVtdLHRoaXMuJG9uQ2hhbmdlRWRpdG9yPXRoaXMuJG9uQ2hhbmdlRWRpdG9yLmJpbmQodGhpcyksdGhpcy5zZXNzaW9uLm9uKCJjaGFuZ2UiLHRoaXMudXBkYXRlT25DaGFuZ2UpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRm9sZCIsdGhpcy51cGRhdGVPbkZvbGQpLHRoaXMuc2Vzc2lvbi5vbigiY2hhbmdlRWRpdG9yIix0aGlzLiRvbkNoYW5nZUVkaXRvcil9dmFyIHI9ZSgiLi9saWIvb29wIiksaT1lKCIuL2xpYi9kb20iKSxzPWUoIi4vcmFuZ2UiKS5SYW5nZTsoZnVuY3Rpb24oKXt0aGlzLmdldFJvd0xlbmd0aD1mdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpcy5saW5lV2lkZ2V0cz90PXRoaXMubGluZVdpZGdldHNbZV0mJnRoaXMubGluZVdpZGdldHNbZV0ucm93Q291bnR8fDA6dD0wLCF0aGlzLiR1c2VXcmFwTW9kZXx8IXRoaXMuJHdyYXBEYXRhW2VdPzErdDp0aGlzLiR3cmFwRGF0YVtlXS5sZW5ndGgrMSt0fSx0aGlzLiRnZXRXaWRnZXRTY3JlZW5MZW5ndGg9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiB0aGlzLmxpbmVXaWRnZXRzLmZvckVhY2goZnVuY3Rpb24odCl7dCYmdC5yb3dDb3VudCYmIXQuaGlkZGVuJiYoZSs9dC5yb3dDb3VudCl9KSxlfSx0aGlzLiRvbkNoYW5nZUVkaXRvcj1mdW5jdGlvbihlKXt0aGlzLmF0dGFjaChlLmVkaXRvcil9LHRoaXMuYXR0YWNoPWZ1bmN0aW9uKGUpe2UmJmUud2lkZ2V0TWFuYWdlciYmZS53aWRnZXRNYW5hZ2VyIT10aGlzJiZlLndpZGdldE1hbmFnZXIuZGV0YWNoKCk7aWYodGhpcy5lZGl0b3I9PWUpcmV0dXJuO3RoaXMuZGV0YWNoKCksdGhpcy5lZGl0b3I9ZSxlJiYoZS53aWRnZXRNYW5hZ2VyPXRoaXMsZS5yZW5kZXJlci5vbigiYmVmb3JlUmVuZGVyIix0aGlzLm1lYXN1cmVXaWRnZXRzKSxlLnJlbmRlcmVyLm9uKCJhZnRlclJlbmRlciIsdGhpcy5yZW5kZXJXaWRnZXRzKSl9LHRoaXMuZGV0YWNoPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZWRpdG9yO2lmKCF0KXJldHVybjt0aGlzLmVkaXRvcj1udWxsLHQud2lkZ2V0TWFuYWdlcj1udWxsLHQucmVuZGVyZXIub2ZmKCJiZWZvcmVSZW5kZXIiLHRoaXMubWVhc3VyZVdpZGdldHMpLHQucmVuZGVyZXIub2ZmKCJhZnRlclJlbmRlciIsdGhpcy5yZW5kZXJXaWRnZXRzKTt2YXIgbj10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7biYmbi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJmUuZWwmJmUuZWwucGFyZW50Tm9kZSYmKGUuX2luRG9jdW1lbnQ9ITEsZS5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUuZWwpKX0pfSx0aGlzLnVwZGF0ZU9uRm9sZD1mdW5jdGlvbihlLHQpe3ZhciBuPXQubGluZVdpZGdldHM7aWYoIW58fCFlLmFjdGlvbilyZXR1cm47dmFyIHI9ZS5kYXRhLGk9ci5zdGFydC5yb3cscz1yLmVuZC5yb3csbz1lLmFjdGlvbj09ImFkZCI7Zm9yKHZhciB1PWkrMTt1PHM7dSsrKW5bdV0mJihuW3VdLmhpZGRlbj1vKTtuW3NdJiYobz9uW2ldP25bc10uaGlkZGVuPW86bltpXT1uW3NdOihuW2ldPT1uW3NdJiYobltpXT11bmRlZmluZWQpLG5bc10uaGlkZGVuPW8pKX0sdGhpcy51cGRhdGVPbkNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7aWYoIXQpcmV0dXJuO3ZhciBuPWUuc3RhcnQucm93LHI9ZS5lbmQucm93LW47aWYociE9PTApaWYoZS5hY3Rpb249PSJyZW1vdmUiKXt2YXIgaT10LnNwbGljZShuKzEscik7aS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UmJnRoaXMucmVtb3ZlTGluZVdpZGdldChlKX0sdGhpcyksdGhpcy4kdXBkYXRlUm93cygpfWVsc2V7dmFyIHM9bmV3IEFycmF5KHIpO3MudW5zaGlmdChuLDApLHQuc3BsaWNlLmFwcGx5KHQscyksdGhpcy4kdXBkYXRlUm93cygpfX0sdGhpcy4kdXBkYXRlUm93cz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighZSlyZXR1cm47dmFyIHQ9ITA7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUsbil7aWYoZSl7dD0hMSxlLnJvdz1uO3doaWxlKGUuJG9sZFdpZGdldCllLiRvbGRXaWRnZXQucm93PW4sZT1lLiRvbGRXaWRnZXR9fSksdCYmKHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cz1udWxsKX0sdGhpcy5hZGRMaW5lV2lkZ2V0PWZ1bmN0aW9uKGUpe3RoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c3x8KHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cz1uZXcgQXJyYXkodGhpcy5zZXNzaW9uLmdldExlbmd0aCgpKSk7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW2Uucm93XTt0JiYoZS4kb2xkV2lkZ2V0PXQsdC5lbCYmdC5lbC5wYXJlbnROb2RlJiYodC5lbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQuZWwpLHQuX2luRG9jdW1lbnQ9ITEpKSx0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddPWUsZS5zZXNzaW9uPXRoaXMuc2Vzc2lvbjt2YXIgbj10aGlzLmVkaXRvci5yZW5kZXJlcjtlLmh0bWwmJiFlLmVsJiYoZS5lbD1pLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuZWwuaW5uZXJIVE1MPWUuaHRtbCksZS5lbCYmKGkuYWRkQ3NzQ2xhc3MoZS5lbCwiYWNlX2xpbmVXaWRnZXRDb250YWluZXIiKSxlLmVsLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsZS5lbC5zdHlsZS56SW5kZXg9NSxuLmNvbnRhaW5lci5hcHBlbmRDaGlsZChlLmVsKSxlLl9pbkRvY3VtZW50PSEwKSxlLmNvdmVyR3V0dGVyfHwoZS5lbC5zdHlsZS56SW5kZXg9MyksZS5waXhlbEhlaWdodD09bnVsbCYmKGUucGl4ZWxIZWlnaHQ9ZS5lbC5vZmZzZXRIZWlnaHQpLGUucm93Q291bnQ9PW51bGwmJihlLnJvd0NvdW50PWUucGl4ZWxIZWlnaHQvbi5sYXllckNvbmZpZy5saW5lSGVpZ2h0KTt2YXIgcj10aGlzLnNlc3Npb24uZ2V0Rm9sZEF0KGUucm93LDApO2UuJGZvbGQ9cjtpZihyKXt2YXIgcz10aGlzLnNlc3Npb24ubGluZVdpZGdldHM7ZS5yb3c9PXIuZW5kLnJvdyYmIXNbci5zdGFydC5yb3ddP3Nbci5zdGFydC5yb3ddPWU6ZS5oaWRkZW49ITB9cmV0dXJuIHRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6ZS5yb3d9fX0pLHRoaXMuJHVwZGF0ZVJvd3MoKSx0aGlzLnJlbmRlcldpZGdldHMobnVsbCxuKSx0aGlzLm9uV2lkZ2V0Q2hhbmdlZChlKSxlfSx0aGlzLnJlbW92ZUxpbmVXaWRnZXQ9ZnVuY3Rpb24oZSl7ZS5faW5Eb2N1bWVudD0hMSxlLnNlc3Npb249bnVsbCxlLmVsJiZlLmVsLnBhcmVudE5vZGUmJmUuZWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlLmVsKTtpZihlLmVkaXRvciYmZS5lZGl0b3IuZGVzdHJveSl0cnl7ZS5lZGl0b3IuZGVzdHJveSgpfWNhdGNoKHQpe31pZih0aGlzLnNlc3Npb24ubGluZVdpZGdldHMpe3ZhciBuPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0c1tlLnJvd107aWYobj09ZSl0aGlzLnNlc3Npb24ubGluZVdpZGdldHNbZS5yb3ddPWUuJG9sZFdpZGdldCxlLiRvbGRXaWRnZXQmJnRoaXMub25XaWRnZXRDaGFuZ2VkKGUuJG9sZFdpZGdldCk7ZWxzZSB3aGlsZShuKXtpZihuLiRvbGRXaWRnZXQ9PWUpe24uJG9sZFdpZGdldD1lLiRvbGRXaWRnZXQ7YnJlYWt9bj1uLiRvbGRXaWRnZXR9fXRoaXMuc2Vzc2lvbi5fZW1pdCgiY2hhbmdlRm9sZCIse2RhdGE6e3N0YXJ0Ontyb3c6ZS5yb3d9fX0pLHRoaXMuJHVwZGF0ZVJvd3MoKX0sdGhpcy5nZXRXaWRnZXRzQXRSb3c9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzLG49dCYmdFtlXSxyPVtdO3doaWxlKG4pci5wdXNoKG4pLG49bi4kb2xkV2lkZ2V0O3JldHVybiByfSx0aGlzLm9uV2lkZ2V0Q2hhbmdlZD1mdW5jdGlvbihlKXt0aGlzLnNlc3Npb24uX2NoYW5nZWRXaWRnZXRzLnB1c2goZSksdGhpcy5lZGl0b3ImJnRoaXMuZWRpdG9yLnJlbmRlcmVyLnVwZGF0ZUZ1bGwoKX0sdGhpcy5tZWFzdXJlV2lkZ2V0cz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuc2Vzc2lvbi5fY2hhbmdlZFdpZGdldHMscj10LmxheWVyQ29uZmlnO2lmKCFufHwhbi5sZW5ndGgpcmV0dXJuO3ZhciBpPUluZmluaXR5O2Zvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgbz1uW3NdO2lmKCFvfHwhby5lbCljb250aW51ZTtpZihvLnNlc3Npb24hPXRoaXMuc2Vzc2lvbiljb250aW51ZTtpZighby5faW5Eb2N1bWVudCl7aWYodGhpcy5zZXNzaW9uLmxpbmVXaWRnZXRzW28ucm93XSE9byljb250aW51ZTtvLl9pbkRvY3VtZW50PSEwLHQuY29udGFpbmVyLmFwcGVuZENoaWxkKG8uZWwpfW8uaD1vLmVsLm9mZnNldEhlaWdodCxvLmZpeGVkV2lkdGh8fChvLnc9by5lbC5vZmZzZXRXaWR0aCxvLnNjcmVlbldpZHRoPU1hdGguY2VpbChvLncvci5jaGFyYWN0ZXJXaWR0aCkpO3ZhciB1PW8uaC9yLmxpbmVIZWlnaHQ7by5jb3ZlckxpbmUmJih1LT10aGlzLnNlc3Npb24uZ2V0Um93TGluZUNvdW50KG8ucm93KSx1PDAmJih1PTApKSxvLnJvd0NvdW50IT11JiYoby5yb3dDb3VudD11LG8ucm93PGkmJihpPW8ucm93KSl9aSE9SW5maW5pdHkmJih0aGlzLnNlc3Npb24uX2VtaXQoImNoYW5nZUZvbGQiLHtkYXRhOntzdGFydDp7cm93Oml9fX0pLHRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0V2lkdGg9bnVsbCksdGhpcy5zZXNzaW9uLl9jaGFuZ2VkV2lkZ2V0cz1bXX0sdGhpcy5yZW5kZXJXaWRnZXRzPWZ1bmN0aW9uKGUsdCl7dmFyIG49dC5sYXllckNvbmZpZyxyPXRoaXMuc2Vzc2lvbi5saW5lV2lkZ2V0cztpZighcilyZXR1cm47dmFyIGk9TWF0aC5taW4odGhpcy5maXJzdFJvdyxuLmZpcnN0Um93KSxzPU1hdGgubWF4KHRoaXMubGFzdFJvdyxuLmxhc3RSb3csci5sZW5ndGgpO3doaWxlKGk+MCYmIXJbaV0paS0tO3RoaXMuZmlyc3RSb3c9bi5maXJzdFJvdyx0aGlzLmxhc3RSb3c9bi5sYXN0Um93LHQuJGN1cnNvckxheWVyLmNvbmZpZz1uO2Zvcih2YXIgbz1pO288PXM7bysrKXt2YXIgdT1yW29dO2lmKCF1fHwhdS5lbCljb250aW51ZTtpZih1LmhpZGRlbil7dS5lbC5zdHlsZS50b3A9LTEwMC0odS5waXhlbEhlaWdodHx8MCkrInB4Ijtjb250aW51ZX11Ll9pbkRvY3VtZW50fHwodS5faW5Eb2N1bWVudD0hMCx0LmNvbnRhaW5lci5hcHBlbmRDaGlsZCh1LmVsKSk7dmFyIGE9dC4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbih7cm93Om8sY29sdW1uOjB9LCEwKS50b3A7dS5jb3ZlckxpbmV8fChhKz1uLmxpbmVIZWlnaHQqdGhpcy5zZXNzaW9uLmdldFJvd0xpbmVDb3VudCh1LnJvdykpLHUuZWwuc3R5bGUudG9wPWEtbi5vZmZzZXQrInB4Ijt2YXIgZj11LmNvdmVyR3V0dGVyPzA6dC5ndXR0ZXJXaWR0aDt1LmZpeGVkV2lkdGh8fChmLT10LnNjcm9sbExlZnQpLHUuZWwuc3R5bGUubGVmdD1mKyJweCIsdS5mdWxsV2lkdGgmJnUuc2NyZWVuV2lkdGgmJih1LmVsLnN0eWxlLm1pbldpZHRoPW4ud2lkdGgrMipuLnBhZGRpbmcrInB4IiksdS5maXhlZFdpZHRoP3UuZWwuc3R5bGUucmlnaHQ9dC5zY3JvbGxCYXIuZ2V0V2lkdGgoKSsicHgiOnUuZWwuc3R5bGUucmlnaHQ9IiJ9fX0pLmNhbGwoby5wcm90b3R5cGUpLHQuTGluZVdpZGdldHM9b30pLGFjZS5kZWZpbmUoImFjZS9leHQvZXJyb3JfbWFya2VyIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpbmVfd2lkZ2V0cyIsImFjZS9saWIvZG9tIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBvKGUsdCxuKXt2YXIgcj0wLGk9ZS5sZW5ndGgtMTt3aGlsZShyPD1pKXt2YXIgcz1yK2k+PjEsbz1uKHQsZVtzXSk7aWYobz4wKXI9cysxO2Vsc2V7aWYoIShvPDApKXJldHVybiBzO2k9cy0xfX1yZXR1cm4tKHIrMSl9ZnVuY3Rpb24gdShlLHQsbil7dmFyIHI9ZS5nZXRBbm5vdGF0aW9ucygpLnNvcnQocy5jb21wYXJlUG9pbnRzKTtpZighci5sZW5ndGgpcmV0dXJuO3ZhciBpPW8ocix7cm93OnQsY29sdW1uOi0xfSxzLmNvbXBhcmVQb2ludHMpO2k8MCYmKGk9LWktMSksaT49ci5sZW5ndGg/aT1uPjA/MDpyLmxlbmd0aC0xOmk9PT0wJiZuPDAmJihpPXIubGVuZ3RoLTEpO3ZhciB1PXJbaV07aWYoIXV8fCFuKXJldHVybjtpZih1LnJvdz09PXQpe2RvIHU9cltpKz1uXTt3aGlsZSh1JiZ1LnJvdz09PXQpO2lmKCF1KXJldHVybiByLnNsaWNlKCl9dmFyIGE9W107dD11LnJvdztkbyBhW248MD8idW5zaGlmdCI6InB1c2giXSh1KSx1PXJbaSs9bl07d2hpbGUodSYmdS5yb3c9PXQpO3JldHVybiBhLmxlbmd0aCYmYX12YXIgcj1lKCIuLi9saW5lX3dpZGdldHMiKS5MaW5lV2lkZ2V0cyxpPWUoIi4uL2xpYi9kb20iKSxzPWUoIi4uL3JhbmdlIikuUmFuZ2U7dC5zaG93RXJyb3JNYXJrZXI9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNlc3Npb247bi53aWRnZXRNYW5hZ2VyfHwobi53aWRnZXRNYW5hZ2VyPW5ldyByKG4pLG4ud2lkZ2V0TWFuYWdlci5hdHRhY2goZSkpO3ZhciBzPWUuZ2V0Q3Vyc29yUG9zaXRpb24oKSxvPXMucm93LGE9bi53aWRnZXRNYW5hZ2VyLmdldFdpZGdldHNBdFJvdyhvKS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09ImVycm9yTWFya2VyIn0pWzBdO2E/YS5kZXN0cm95KCk6by09dDt2YXIgZj11KG4sbyx0KSxsO2lmKGYpe3ZhciBjPWZbMF07cy5jb2x1bW49KGMucG9zJiZ0eXBlb2YgYy5jb2x1bW4hPSJudW1iZXIiP2MucG9zLnNjOmMuY29sdW1uKXx8MCxzLnJvdz1jLnJvdyxsPWUucmVuZGVyZXIuJGd1dHRlckxheWVyLiRhbm5vdGF0aW9uc1tzLnJvd119ZWxzZXtpZihhKXJldHVybjtsPXt0ZXh0OlsiTG9va3MgZ29vZCEiXSxjbGFzc05hbWU6ImFjZV9vayJ9fWUuc2Vzc2lvbi51bmZvbGQocy5yb3cpLGUuc2VsZWN0aW9uLm1vdmVUb1Bvc2l0aW9uKHMpO3ZhciBoPXtyb3c6cy5yb3csZml4ZWRXaWR0aDohMCxjb3Zlckd1dHRlcjohMCxlbDppLmNyZWF0ZUVsZW1lbnQoImRpdiIpLHR5cGU6ImVycm9yTWFya2VyIn0scD1oLmVsLmFwcGVuZENoaWxkKGkuY3JlYXRlRWxlbWVudCgiZGl2IikpLGQ9aC5lbC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTtkLmNsYXNzTmFtZT0iZXJyb3Jfd2lkZ2V0X2Fycm93ICIrbC5jbGFzc05hbWU7dmFyIHY9ZS5yZW5kZXJlci4kY3Vyc29yTGF5ZXIuZ2V0UGl4ZWxQb3NpdGlvbihzKS5sZWZ0O2Quc3R5bGUubGVmdD12K2UucmVuZGVyZXIuZ3V0dGVyV2lkdGgtNSsicHgiLGguZWwuY2xhc3NOYW1lPSJlcnJvcl93aWRnZXRfd3JhcHBlciIscC5jbGFzc05hbWU9ImVycm9yX3dpZGdldCAiK2wuY2xhc3NOYW1lLHAuaW5uZXJIVE1MPWwudGV4dC5qb2luKCI8YnI+IikscC5hcHBlbmRDaGlsZChpLmNyZWF0ZUVsZW1lbnQoImRpdiIpKTt2YXIgbT1mdW5jdGlvbihlLHQsbil7aWYodD09PTAmJihuPT09ImVzYyJ8fG49PT0icmV0dXJuIikpcmV0dXJuIGguZGVzdHJveSgpLHtjb21tYW5kOiJudWxsIn19O2guZGVzdHJveT1mdW5jdGlvbigpe2lmKGUuJG1vdXNlSGFuZGxlci5pc01vdXNlUHJlc3NlZClyZXR1cm47ZS5rZXlCaW5kaW5nLnJlbW92ZUtleWJvYXJkSGFuZGxlcihtKSxuLndpZGdldE1hbmFnZXIucmVtb3ZlTGluZVdpZGdldChoKSxlLm9mZigiY2hhbmdlU2VsZWN0aW9uIixoLmRlc3Ryb3kpLGUub2ZmKCJjaGFuZ2VTZXNzaW9uIixoLmRlc3Ryb3kpLGUub2ZmKCJtb3VzZXVwIixoLmRlc3Ryb3kpLGUub2ZmKCJjaGFuZ2UiLGguZGVzdHJveSl9LGUua2V5QmluZGluZy5hZGRLZXlib2FyZEhhbmRsZXIobSksZS5vbigiY2hhbmdlU2VsZWN0aW9uIixoLmRlc3Ryb3kpLGUub24oImNoYW5nZVNlc3Npb24iLGguZGVzdHJveSksZS5vbigibW91c2V1cCIsaC5kZXN0cm95KSxlLm9uKCJjaGFuZ2UiLGguZGVzdHJveSksZS5zZXNzaW9uLndpZGdldE1hbmFnZXIuYWRkTGluZVdpZGdldChoKSxoLmVsLm9ubW91c2Vkb3duPWUuZm9jdXMuYmluZChlKSxlLnJlbmRlcmVyLnNjcm9sbEN1cnNvckludG9WaWV3KG51bGwsLjUse2JvdHRvbTpoLmVsLm9mZnNldEhlaWdodH0pfSxpLmltcG9ydENzc1N0cmluZygiICAgIC5lcnJvcl93aWRnZXRfd3JhcHBlciB7ICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0OyAgICAgICAgY29sb3I6IGluaGVyaXQ7ICAgICAgICBib3JkZXI6bm9uZSAgICB9ICAgIC5lcnJvcl93aWRnZXQgeyAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMnB4OyAgICAgICAgYm9yZGVyLWJvdHRvbTogc29saWQgMnB4OyAgICAgICAgbWFyZ2luOiA1cHggMDsgICAgICAgIHBhZGRpbmc6IDEwcHggNDBweDsgICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV9lcnJvciwgLmVycm9yX3dpZGdldF9hcnJvdy5hY2VfZXJyb3J7ICAgICAgICBib3JkZXItY29sb3I6ICNmZjVhNWEgICAgfSAgICAuZXJyb3Jfd2lkZ2V0LmFjZV93YXJuaW5nLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV93YXJuaW5neyAgICAgICAgYm9yZGVyLWNvbG9yOiAjRjFEODE3ICAgIH0gICAgLmVycm9yX3dpZGdldC5hY2VfaW5mbywgLmVycm9yX3dpZGdldF9hcnJvdy5hY2VfaW5mb3sgICAgICAgIGJvcmRlci1jb2xvcjogIzVhNWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXQuYWNlX29rLCAuZXJyb3Jfd2lkZ2V0X2Fycm93LmFjZV9va3sgICAgICAgIGJvcmRlci1jb2xvcjogIzVhYWE1YSAgICB9ICAgIC5lcnJvcl93aWRnZXRfYXJyb3cgeyAgICAgICAgcG9zaXRpb246IGFic29sdXRlOyAgICAgICAgYm9yZGVyOiBzb2xpZCA1cHg7ICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50IWltcG9ydGFudDsgICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCFpbXBvcnRhbnQ7ICAgICAgICB0b3A6IC01cHg7ICAgIH0iLCIiKX0pLGFjZS5kZWZpbmUoImFjZS9hY2UiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL2ZpeG9sZGJyb3dzZXJzIiwiYWNlL2xpYi9kb20iLCJhY2UvbGliL2V2ZW50IiwiYWNlL3JhbmdlIiwiYWNlL2VkaXRvciIsImFjZS9lZGl0X3Nlc3Npb24iLCJhY2UvdW5kb21hbmFnZXIiLCJhY2UvdmlydHVhbF9yZW5kZXJlciIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9rZXlib2FyZC9oYXNoX2hhbmRsZXIiLCJhY2UvcGxhY2Vob2xkZXIiLCJhY2UvbXVsdGlfc2VsZWN0IiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiLCJhY2UvdGhlbWUvdGV4dG1hdGUiLCJhY2UvZXh0L2Vycm9yX21hcmtlciIsImFjZS9jb25maWciXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2UoIi4vbGliL2ZpeG9sZGJyb3dzZXJzIik7dmFyIHI9ZSgiLi9saWIvZG9tIiksaT1lKCIuL2xpYi9ldmVudCIpLHM9ZSgiLi9yYW5nZSIpLlJhbmdlLG89ZSgiLi9lZGl0b3IiKS5FZGl0b3IsdT1lKCIuL2VkaXRfc2Vzc2lvbiIpLkVkaXRTZXNzaW9uLGE9ZSgiLi91bmRvbWFuYWdlciIpLlVuZG9NYW5hZ2VyLGY9ZSgiLi92aXJ0dWFsX3JlbmRlcmVyIikuVmlydHVhbFJlbmRlcmVyO2UoIi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKSxlKCIuL2tleWJvYXJkL2hhc2hfaGFuZGxlciIpLGUoIi4vcGxhY2Vob2xkZXIiKSxlKCIuL211bHRpX3NlbGVjdCIpLGUoIi4vbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSIpLGUoIi4vdGhlbWUvdGV4dG1hdGUiKSxlKCIuL2V4dC9lcnJvcl9tYXJrZXIiKSx0LmNvbmZpZz1lKCIuL2NvbmZpZyIpLHQucmVxdWlyZT1lLHR5cGVvZiBkZWZpbmU9PSJmdW5jdGlvbiImJih0LmRlZmluZT1kZWZpbmUpLHQuZWRpdD1mdW5jdGlvbihlLG4pe2lmKHR5cGVvZiBlPT0ic3RyaW5nIil7dmFyIHM9ZTtlPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHMpO2lmKCFlKXRocm93IG5ldyBFcnJvcigiYWNlLmVkaXQgY2FuJ3QgZmluZCBkaXYgIyIrcyl9aWYoZSYmZS5lbnYmJmUuZW52LmVkaXRvciBpbnN0YW5jZW9mIG8pcmV0dXJuIGUuZW52LmVkaXRvcjt2YXIgdT0iIjtpZihlJiYvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGUudGFnTmFtZSkpe3ZhciBhPWU7dT1hLnZhbHVlLGU9ci5jcmVhdGVFbGVtZW50KCJwcmUiKSxhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsYSl9ZWxzZSBlJiYodT1lLnRleHRDb250ZW50LGUuaW5uZXJIVE1MPSIiKTt2YXIgbD10LmNyZWF0ZUVkaXRTZXNzaW9uKHUpLGM9bmV3IG8obmV3IGYoZSksbCxuKSxoPXtkb2N1bWVudDpsLGVkaXRvcjpjLG9uUmVzaXplOmMucmVzaXplLmJpbmQoYyxudWxsKX07cmV0dXJuIGEmJihoLnRleHRhcmVhPWEpLGkuYWRkTGlzdGVuZXIod2luZG93LCJyZXNpemUiLGgub25SZXNpemUpLGMub24oImRlc3Ryb3kiLGZ1bmN0aW9uKCl7aS5yZW1vdmVMaXN0ZW5lcih3aW5kb3csInJlc2l6ZSIsaC5vblJlc2l6ZSksaC5lZGl0b3IuY29udGFpbmVyLmVudj1udWxsfSksYy5jb250YWluZXIuZW52PWMuZW52PWgsY30sdC5jcmVhdGVFZGl0U2Vzc2lvbj1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyB1KGUsdCk7cmV0dXJuIG4uc2V0VW5kb01hbmFnZXIobmV3IGEpLG59LHQuUmFuZ2U9cyx0LkVkaXRvcj1vLHQuRWRpdFNlc3Npb249dSx0LlVuZG9NYW5hZ2VyPWEsdC5WaXJ0dWFsUmVuZGVyZXI9Zix0LnZlcnNpb249dC5jb25maWcudmVyc2lvbn0pOyAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGFjZS5yZXF1aXJlKFsiYWNlL2FjZSJdLCBmdW5jdGlvbihhKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYS5jb25maWcuaW5pdCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYS5kZWZpbmUgPSBhY2UuZGVmaW5lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5hY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hY2UgPSBhOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhKSBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWNlW2tleV0gPSBhW2tleV07CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFjZVsiZGVmYXVsdCJdID0gd2luZG93LmFjZTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSB3aW5kb3cuYWNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSgpOwp9Cg==",
],
[
"ace-режим-js",
-"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LjQoNC10LbQuNC8SmF2YVNjcmlwdCgpCiAgICB7CiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FqYXhvcmcvYWNlLWJ1aWxkcy9ibG9iL21hc3Rlci9zcmMtbWluLW5vY29uZmxpY3QvbW9kZS1qYXZhc2NyaXB0LmpzCmFjZS5kZWZpbmUoImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uL2xpYi9vb3AiKSxpPWUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMscz1mdW5jdGlvbigpe3RoaXMuJHJ1bGVzPXtzdGFydDpbe3Rva2VuOiJjb21tZW50LmRvYy50YWciLHJlZ2V4OiJAW1xcd1xcZF9dKyJ9LHMuZ2V0VGFnUnVsZSgpLHtkZWZhdWx0VG9rZW46ImNvbW1lbnQuZG9jIixjYXNlSW5zZW5zaXRpdmU6ITB9XX19O3IuaW5oZXJpdHMocyxpKSxzLmdldFRhZ1J1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYy50YWcuc3RvcmFnZS50eXBlIixyZWdleDoiXFxiKD86VE9ET3xGSVhNRXxYWFh8SEFDSylcXGIifX0scy5nZXRTdGFydFJ1bGU9ZnVuY3Rpb24oZSl7cmV0dXJue3Rva2VuOiJjb21tZW50LmRvYyIscmVnZXg6IlxcL1xcKig/PVxcKikiLG5leHQ6ZX19LHMuZ2V0RW5kUnVsZT1mdW5jdGlvbihlKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixyZWdleDoiXFwqXFwvIixuZXh0OmV9fSx0LkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcz1zfSksYWNlLmRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLFsicmVxdWlyZSIsImV4cG9ydHMiLCJtb2R1bGUiLCJhY2UvbGliL29vcCIsImFjZS9tb2RlL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIsImFjZS9tb2RlL3RleHRfaGlnaGxpZ2h0X3J1bGVzIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKCl7dmFyIGU9by5yZXBsYWNlKCJcXGQiLCJcXGRcXC0iKSx0PXtvbk1hdGNoOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmNoYXJBdCgxKT09Ii8iPzI6MTtpZihyPT0xKXQhPXRoaXMubmV4dFN0YXRlP24udW5zaGlmdCh0aGlzLm5leHQsdGhpcy5uZXh0U3RhdGUsMCk6bi51bnNoaWZ0KHRoaXMubmV4dCksblsyXSsrO2Vsc2UgaWYocj09MiYmdD09dGhpcy5uZXh0U3RhdGUpe25bMV0tLTtpZighblsxXXx8blsxXTwwKW4uc2hpZnQoKSxuLnNoaWZ0KCl9cmV0dXJuW3t0eXBlOiJtZXRhLnRhZy5wdW5jdHVhdGlvbi4iKyhyPT0xPyIiOiJlbmQtIikrInRhZy1vcGVuLnhtbCIsdmFsdWU6ZS5zbGljZSgwLHIpfSx7dHlwZToibWV0YS50YWcudGFnLW5hbWUueG1sIix2YWx1ZTplLnN1YnN0cihyKX1dfSxyZWdleDoiPC8/IitlKyIiLG5leHQ6ImpzeEF0dHJpYnV0ZXMiLG5leHRTdGF0ZToianN4In07dGhpcy4kcnVsZXMuc3RhcnQudW5zaGlmdCh0KTt2YXIgbj17cmVnZXg6InsiLHRva2VuOiJwYXJlbi5xdWFzaS5zdGFydCIscHVzaDoic3RhcnQifTt0aGlzLiRydWxlcy5qc3g9W24sdCx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nIn1dLHRoaXMuJHJ1bGVzLmpzeEF0dHJpYnV0ZXM9W3t0b2tlbjoibWV0YS50YWcucHVuY3R1YXRpb24udGFnLWNsb3NlLnhtbCIscmVnZXg6Ii8/PiIsb25NYXRjaDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQ9PW5bMF0mJm4uc2hpZnQoKSxlLmxlbmd0aD09MiYmKG5bMF09PXRoaXMubmV4dFN0YXRlJiZuWzFdLS0sKCFuWzFdfHxuWzFdPDApJiZuLnNwbGljZSgwLDIpKSx0aGlzLm5leHQ9blswXXx8InN0YXJ0Iixbe3R5cGU6dGhpcy50b2tlbix2YWx1ZTplfV19LG5leHRTdGF0ZToianN4In0sbixmKCJqc3hBdHRyaWJ1dGVzIikse3Rva2VuOiJlbnRpdHkub3RoZXIuYXR0cmlidXRlLW5hbWUueG1sIixyZWdleDplfSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IuYXR0cmlidXRlLWVxdWFscy54bWwiLHJlZ2V4OiI9In0se3Rva2VuOiJ0ZXh0LnRhZy13aGl0ZXNwYWNlLnhtbCIscmVnZXg6IlxccysifSx7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDoiJyIsc3RhdGVOYW1lOiJqc3hfYXR0cl9xIixwdXNoOlt7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDoiJyIsbmV4dDoicG9wIn0se2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIn1dfSx7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDonIicsc3RhdGVOYW1lOiJqc3hfYXR0cl9xcSIscHVzaDpbe3Rva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCIscmVnZXg6JyInLG5leHQ6InBvcCJ9LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcuYXR0cmlidXRlLXZhbHVlLnhtbCJ9XX0sdF0sdGhpcy4kcnVsZXMucmVmZXJlbmNlPVt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZS5yZWZlcmVuY2UueG1sIixyZWdleDoiKD86JiNbMC05XSs7KXwoPzomI3hbMC05YS1mQS1GXSs7KXwoPzomW2EtekEtWjAtOV86XFwuLV0rOykifV19ZnVuY3Rpb24gZihlKXtyZXR1cm5be3Rva2VuOiJjb21tZW50IixyZWdleDovXC9cKi8sbmV4dDpbaS5nZXRUYWdSdWxlKCkse3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwqXFwvIixuZXh0OmV8fCJwb3AifSx7ZGVmYXVsdFRva2VuOiJjb21tZW50IixjYXNlSW5zZW5zaXRpdmU6ITB9XX0se3Rva2VuOiJjb21tZW50IixyZWdleDoiXFwvXFwvIixuZXh0OltpLmdldFRhZ1J1bGUoKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiIkfF4iLG5leHQ6ZXx8InBvcCJ9LHtkZWZhdWx0VG9rZW46ImNvbW1lbnQiLGNhc2VJbnNlbnNpdGl2ZTohMH1dfV19dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi9kb2NfY29tbWVudF9oaWdobGlnaHRfcnVsZXMiKS5Eb2NDb21tZW50SGlnaGxpZ2h0UnVsZXMscz1lKCIuL3RleHRfaGlnaGxpZ2h0X3J1bGVzIikuVGV4dEhpZ2hsaWdodFJ1bGVzLG89IlthLXpBLVpcXCRfXHUwMGExLVx1ZmZmZl1bYS16QS1aXFxkXFwkX1x1MDBhMS1cdWZmZmZdKiIsdT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmNyZWF0ZUtleXdvcmRNYXBwZXIoeyJ2YXJpYWJsZS5sYW5ndWFnZSI6IkFycmF5fEJvb2xlYW58RGF0ZXxGdW5jdGlvbnxJdGVyYXRvcnxOdW1iZXJ8T2JqZWN0fFJlZ0V4cHxTdHJpbmd8UHJveHl8TmFtZXNwYWNlfFFOYW1lfFhNTHxYTUxMaXN0fEFycmF5QnVmZmVyfEZsb2F0MzJBcnJheXxGbG9hdDY0QXJyYXl8SW50MTZBcnJheXxJbnQzMkFycmF5fEludDhBcnJheXxVaW50MTZBcnJheXxVaW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4Q2xhbXBlZEFycmF5fEVycm9yfEV2YWxFcnJvcnxJbnRlcm5hbEVycm9yfFJhbmdlRXJyb3J8UmVmZXJlbmNlRXJyb3J8U3RvcEl0ZXJhdGlvbnxTeW50YXhFcnJvcnxUeXBlRXJyb3J8VVJJRXJyb3J8ZGVjb2RlVVJJfGRlY29kZVVSSUNvbXBvbmVudHxlbmNvZGVVUkl8ZW5jb2RlVVJJQ29tcG9uZW50fGV2YWx8aXNGaW5pdGV8aXNOYU58cGFyc2VGbG9hdHxwYXJzZUludHxKU09OfE1hdGh8dGhpc3xhcmd1bWVudHN8cHJvdG90eXBlfHdpbmRvd3xkb2N1bWVudCIsa2V5d29yZDoiY29uc3R8eWllbGR8aW1wb3J0fGdldHxzZXR8YXN5bmN8YXdhaXR8YnJlYWt8Y2FzZXxjYXRjaHxjb250aW51ZXxkZWZhdWx0fGRlbGV0ZXxkb3xlbHNlfGZpbmFsbHl8Zm9yfGZ1bmN0aW9ufGlmfGlufG9mfGluc3RhbmNlb2Z8bmV3fHJldHVybnxzd2l0Y2h8dGhyb3d8dHJ5fHR5cGVvZnxsZXR8dmFyfHdoaWxlfHdpdGh8ZGVidWdnZXJ8X19wYXJlbnRfX3xfX2NvdW50X198ZXNjYXBlfHVuZXNjYXBlfHdpdGh8X19wcm90b19ffGNsYXNzfGVudW18ZXh0ZW5kc3xzdXBlcnxleHBvcnR8aW1wbGVtZW50c3xwcml2YXRlfHB1YmxpY3xpbnRlcmZhY2V8cGFja2FnZXxwcm90ZWN0ZWR8c3RhdGljIiwic3RvcmFnZS50eXBlIjoiY29uc3R8bGV0fHZhcnxmdW5jdGlvbiIsImNvbnN0YW50Lmxhbmd1YWdlIjoibnVsbHxJbmZpbml0eXxOYU58dW5kZWZpbmVkIiwic3VwcG9ydC5mdW5jdGlvbiI6ImFsZXJ0IiwiY29uc3RhbnQubGFuZ3VhZ2UuYm9vbGVhbiI6InRydWV8ZmFsc2UifSwiaWRlbnRpZmllciIpLG49ImNhc2V8ZG98ZWxzZXxmaW5hbGx5fGlufGluc3RhbmNlb2Z8cmV0dXJufHRocm93fHRyeXx0eXBlb2Z8eWllbGR8dm9pZCIscj0iXFxcXCg/OnhbMC05YS1mQS1GXXsyfXx1WzAtOWEtZkEtRl17NH18dXtbMC05YS1mQS1GXXsxLDZ9fXxbMC0yXVswLTddezAsMn18M1swLTddWzAtN10/fFs0LTddWzAtN10/fC4pIjt0aGlzLiRydWxlcz17bm9fcmVnZXg6W2kuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSxmKCJub19yZWdleCIpLHt0b2tlbjoic3RyaW5nIixyZWdleDoiJyg/PS4pIixuZXh0OiJxc3RyaW5nIn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiciKD89LiknLG5leHQ6InFxc3RyaW5nIn0se3Rva2VuOiJjb25zdGFudC5udW1lcmljIixyZWdleDovMCg/Olt4WF1bMC05YS1mQS1GXSt8W29PXVswLTddK3xbYkJdWzAxXSspXGIvfSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4Oi8oPzpcZFxkKig/OlwuXGQqKT98XC5cZCspKD86W2VFXVsrLV0/XGQrXGIpPy99LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwic3VwcG9ydC5mdW5jdGlvbiIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciJdLHJlZ2V4OiIoIitvKyIpKFxcLikocHJvdG90eXBlKShcXC4pKCIrbysiKShcXHMqKSg9KSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXC4pKCIrbysiKShcXHMqKSg9KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKFxccyspKFxcdyspKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKGZ1bmN0aW9uKShcXHMrKSgiK28rIikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxccyopKDopKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJ0ZXh0IiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKDopKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiJmcm9tKD89XFxzKignfFwiKSkifSx7dG9rZW46ImtleXdvcmQiLHJlZ2V4OiIoPzoiK24rIilcXGIiLG5leHQ6InN0YXJ0In0se3Rva2VuOlsic3VwcG9ydC5jb25zdGFudCJdLHJlZ2V4Oi90aGF0XGIvfSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInN1cHBvcnQuZnVuY3Rpb24uZmlyZWJ1ZyJdLHJlZ2V4Oi8oY29uc29sZSkoXC4pKHdhcm58aW5mb3xsb2d8ZXJyb3J8dGltZXx0cmFjZXx0aW1lRW5kfGFzc2VydClcYi99LHt0b2tlbjp0LHJlZ2V4Om99LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bLl0oPyFbLl0pLyxuZXh0OiJwcm9wZXJ0eSJ9LHt0b2tlbjoic3RvcmFnZS50eXBlIixyZWdleDovPT4vLG5leHQ6InN0YXJ0In0se3Rva2VuOiJrZXl3b3JkLm9wZXJhdG9yIixyZWdleDovLS18XCtcK3xcLnszfXw9PT18PT18PXwhPXwhPT18PCs9P3w+Kz0/fCF8JiZ8XHxcfHxcPzp8WyEkJSYqK1wtflwvXl09Py8sbmV4dDoic3RhcnQifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWz86LDsuXS8sbmV4dDoic3RhcnQifSx7dG9rZW46InBhcmVuLmxwYXJlbiIscmVnZXg6L1tcWyh7XS8sbmV4dDoic3RhcnQifSx7dG9rZW46InBhcmVuLnJwYXJlbiIscmVnZXg6L1tcXSl9XS99LHt0b2tlbjoiY29tbWVudCIscmVnZXg6L14jIS4qJC99XSxwcm9wZXJ0eTpbe3Rva2VuOiJ0ZXh0IixyZWdleDoiXFxzKyJ9LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0Iiwia2V5d29yZC5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwiZW50aXR5Lm5hbWUuZnVuY3Rpb24iLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFwuKSgiK28rIikoXFxzKikoPSkoXFxzKikoZnVuY3Rpb24pKD86KFxccyspKFxcdyspKT8oXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1suXSg/IVsuXSkvfSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24iLHJlZ2V4Oi8ocyg/OmgoPzppZnR8b3coPzpNb2QoPzplbGVzc0RpYWxvZ3xhbERpYWxvZyl8SGVscCkpfGNyb2xsKD86WHxCeSg/OlBhZ2VzfExpbmVzKT98WXxUbyk/fHQoPzpvcHxyaWtlKXxpKD86bnx6ZVRvQ29udGVudHxkZWJhcnxnblRleHQpfG9ydHx1KD86cHxiKD86c3RyKD86aW5nKT8pPyl8cGxpKD86Y2V8dCl8ZSg/Om5kfHQoPzpSZSg/OnNpemFibGV8cXVlc3RIZWFkZXIpfE0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIbyg/OnRLZXlzfHVycyl8WWVhcnxDdXJzb3J8VGltZSg/Om91dCk/fEludGVydmFsfFpPcHRpb25zfERhdGV8VVRDKD86TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZWNvbmRzfEhvdXJzfERhdGV8RnVsbFllYXIpfEZ1bGxZZWFyfEFjdGl2ZSl8YXJjaCl8cXJ0fGxpY2V8YXZlUHJlZmVyZW5jZXN8bWFsbCl8aCg/Om9tZXxhbmRsZUV2ZW50KXxuYXZpZ2F0ZXxjKD86aGFyKD86Q29kZUF0fEF0KXxvKD86c3xuKD86Y2F0fHRleHR1YWx8ZmlybSl8bXBpbGUpfGVpbHxsZWFyKD86VGltZW91dHxJbnRlcnZhbCk/fGEoPzpwdHVyZUV2ZW50c3xsbCl8cmVhdGUoPzpTdHlsZVNoZWV0fFBvcHVwfEV2ZW50T2JqZWN0KSl8dCg/Om8oPzpHTVRTdHJpbmd8Uyg/OnRyaW5nfG91cmNlKXxVKD86VENTdHJpbmd8cHBlckNhc2UpfExvKD86Y2FsZVN0cmluZ3x3ZXJDYXNlKSl8ZXN0fGEoPzpufGludCg/OkVuYWJsZWQpPykpfGkoPzpzKD86TmFOfEZpbml0ZSl8bmRleE9mfHRhbGljcyl8ZCg/OmlzYWJsZUV4dGVybmFsQ2FwdHVyZXx1bXB8ZXRhY2hFdmVudCl8dSg/Om4oPzpzaGlmdHx0YWludHxlc2NhcGV8d2F0Y2gpfHBkYXRlQ29tbWFuZHMpfGooPzpvaW58YXZhRW5hYmxlZCl8cCg/Om8oPzpwfHcpfHVzaHxsdWdpbnMucmVmcmVzaHxhKD86ZGRpbmdzfHJzZSg/OkludHxGbG9hdCk/KXxyKD86aW50fG9tcHR8ZWZlcmVuY2UpKXxlKD86c2NhcGV8bmFibGVFeHRlcm5hbENhcHR1cmV8dmFsfGxlbWVudEZyb21Qb2ludHx4KD86cHxlYyg/OlNjcmlwdHxDb21tYW5kKT8pKXx2YWx1ZU9mfFVUQ3xxdWVyeUNvbW1hbmQoPzpTdGF0ZXxJbmRldGVybXxFbmFibGVkfFZhbHVlKXxmKD86aSg/Om5kfGxlKD86TW9kaWZpZWREYXRlfFNpemV8Q3JlYXRlZERhdGV8VXBkYXRlZERhdGUpfHhlZCl8byg/Om50KD86c2l6ZXxjb2xvcil8cndhcmQpfGxvb3J8cm9tQ2hhckNvZGUpfHdhdGNofGwoPzppbmt8byg/OmFkfGcpfGFzdEluZGV4T2YpfGEoPzpzaW58bmNob3J8Y29zfHQoPzp0YWNoRXZlbnR8b2J8YW4oPzoyKT8pfHBwbHl8bGVydHxiKD86c3xvcnQpKXxyKD86b3UoPzpuZHx0ZUV2ZW50cyl8ZSg/OnNpemUoPzpCeXxUbyl8Y2FsY3x0dXJuVmFsdWV8cGxhY2V8dmVyc2V8bCg/Om9hZHxlYXNlKD86Q2FwdHVyZXxFdmVudHMpKSl8YW5kb20pfGcoPzpvfGV0KD86UmVzcG9uc2VIZWFkZXJ8TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZSg/OmNvbmRzfGxlY3Rpb24pfEhvdXJzfFllYXJ8VGltZSg/OnpvbmVPZmZzZXQpP3xEYSg/Onl8dGUpfFVUQyg/Ok0oPzppKD86bnV0ZXN8bGxpc2Vjb25kcyl8b250aCl8U2Vjb25kc3xIb3Vyc3xEYSg/Onl8dGUpfEZ1bGxZZWFyKXxGdWxsWWVhcnxBKD86dHRlbnRpb258bGxSZXNwb25zZUhlYWRlcnMpKSl8bSg/OmlufG92ZSg/OkIoPzp5fGVsb3cpfFRvKD86QWJzb2x1dGUpP3xBYm92ZSl8ZXJnZUF0dHJpYnV0ZXN8YSg/OnRjaHxyZ2luc3x4KSl8Yig/OnRvYXxpZ3xvKD86bGR8cmRlcldpZHRocyl8bGlua3xhY2spKVxiKD89XCgpL30se3Rva2VuOiJzdXBwb3J0LmZ1bmN0aW9uLmRvbSIscmVnZXg6LyhzKD86dWIoPzpzdHJpbmdEYXRhfG1pdCl8cGxpdFRleHR8ZSg/OnQoPzpOYW1lZEl0ZW18QXR0cmlidXRlKD86Tm9kZSk/KXxsZWN0KSl8aGFzKD86Q2hpbGROb2Rlc3xGZWF0dXJlKXxuYW1lZEl0ZW18Yyg/OmwoPzppY2t8byg/OnNlfG5lTm9kZSkpfHJlYXRlKD86Qyg/Om9tbWVudHxEQVRBU2VjdGlvbnxhcHRpb24pfFQoPzpIZWFkfGV4dE5vZGV8Rm9vdCl8RG9jdW1lbnRGcmFnbWVudHxQcm9jZXNzaW5nSW5zdHJ1Y3Rpb258RSg/Om50aXR5UmVmZXJlbmNlfGxlbWVudCl8QXR0cmlidXRlKSl8dGFiSW5kZXh8aSg/Om5zZXJ0KD86Um93fEJlZm9yZXxDZWxsfERhdGEpfHRlbSl8b3BlbnxkZWxldGUoPzpSb3d8Qyg/OmVsbHxhcHRpb24pfFQoPzpIZWFkfEZvb3QpfERhdGEpfGZvY3VzfHdyaXRlKD86bG4pP3xhKD86ZGR8cHBlbmQoPzpDaGlsZHxEYXRhKSl8cmUoPzpzZXR8cGxhY2UoPzpDaGlsZHxEYXRhKXxtb3ZlKD86TmFtZWRJdGVtfENoaWxkfEF0dHJpYnV0ZSg/Ok5vZGUpPyk/KXxnZXQoPzpOYW1lZEl0ZW18RWxlbWVudCg/OnNCeSg/Ok5hbWV8VGFnTmFtZXxDbGFzc05hbWUpfEJ5SWQpfEF0dHJpYnV0ZSg/Ok5vZGUpPyl8Ymx1cilcYig/PVwoKS99LHt0b2tlbjoic3VwcG9ydC5jb25zdGFudCIscmVnZXg6LyhzKD86eXN0ZW1MYW5ndWFnZXxjcig/OmlwdHN8b2xsYmFyc3xlZW4oPzpYfFl8VG9wfExlZnQpKXx0KD86eWxlKD86U2hlZXRzKT98YXR1cyg/OlRleHR8YmFyKT8pfGlibGluZyg/OkJlbG93fEFib3ZlKXxvdXJjZXx1ZmZpeGVzfGUoPzpjdXJpdHkoPzpQb2xpY3kpP3xsKD86ZWN0aW9ufGYpKSl8aCg/OmlzdG9yeXxvc3QoPzpuYW1lKT98YXMoPzpofEZvY3VzKSl8eXxYKD86TUxEb2N1bWVudHxTTERvY3VtZW50KXxuKD86ZXh0fGFtZSg/OnNwYWNlKD86c3xVUkkpfFByb3ApKXxNKD86SU5fVkFMVUV8QVhfVkFMVUUpfGMoPzpoYXJhY3RlclNldHxvKD86big/OnN0cnVjdG9yfHRyb2xsZXJzKXxva2llRW5hYmxlZHxsb3JEZXB0aHxtcCg/Om9uZW50c3xsZXRlKSl8dXJyZW50fHB1Q2xhc3N8bCg/OmkoPzpwKD86Ym9hcmREYXRhKT98ZW50SW5mb3JtYXRpb24pfG9zZWR8YXNzZXMpfGFsbGUoPzplfHIpfHJ5cHRvKXx0KD86byg/Om9sYmFyfHApfGV4dCg/OlRyYW5zZm9ybXxJbmRlbnR8RGVjb3JhdGlvbnxBbGlnbil8YWdzKXxTUVJUKD86MV8yfDIpfGkoPzpuKD86bmVyKD86SGVpZ2h0fFdpZHRoKXxwdXQpfGRzfGdub3JlQ2FzZSl8ekluZGV4fG8oPzpzY3B1fG4oPzpyZWFkeXN0YXRlY2hhbmdlfExpbmUpfHV0ZXIoPzpIZWlnaHR8V2lkdGgpfHAoPzpzUHJvZmlsZXxlbmVyKXxmZnNjcmVlbkJ1ZmZlcmluZyl8TkVHQVRJVkVfSU5GSU5JVFl8ZCg/OmkoPzpzcGxheXxhbG9nKD86SGVpZ2h0fFRvcHxXaWR0aHxMZWZ0fEFyZ3VtZW50cyl8cmVjdG9yaWVzKXxlKD86c2NyaXB0aW9ufGZhdWx0KD86U3RhdHVzfENoKD86ZWNrZWR8YXJzZXQpfFZpZXcpKSl8dSg/OnNlcig/OlByb2ZpbGV8TGFuZ3VhZ2V8QWdlbnQpfG4oPzppcXVlSUR8ZGVmaW5lZCl8cGRhdGVJbnRlcnZhbCl8X2NvbnRlbnR8cCg/Oml4ZWxEZXB0aHxvcnR8ZXJzb25hbGJhcnxrY3MxMXxsKD86dWdpbnN8YXRmb3JtKXxhKD86dGhuYW1lfGRkaW5nKD86UmlnaHR8Qm90dG9tfFRvcHxMZWZ0KXxyZW50KD86V2luZG93fExheWVyKT98Z2UoPzpYKD86T2Zmc2V0KT98WSg/Ok9mZnNldCk/KSl8cig/Om8oPzp0byg/OmNvbHx0eXBlKXxkdWN0KD86U3ViKT98bXB0ZXIpfGUoPzp2aW91c3xmaXgpKSl8ZSg/Om4oPzpjb2Rpbmd8YWJsZWRQbHVnaW4pfHgoPzp0ZXJuYWx8cGFuZG8pfG1iZWRzKXx2KD86aXNpYmlsaXR5fGVuZG9yKD86U3ViKT98TGlua2NvbG9yKXxVUkxVbmVuY29kZWR8UCg/Okl8T1NJVElWRV9JTkZJTklUWSl8Zig/OmlsZW5hbWV8byg/Om50KD86U2l6ZXxGYW1pbHl8V2VpZ2h0KXxybU5hbWUpfHJhbWUoPzpzfEVsZW1lbnQpfGdDb2xvcil8RXx3aGl0ZVNwYWNlfGwoPzppKD86c3RTdHlsZVR5cGV8big/OmVIZWlnaHR8a0NvbG9yKSl8byg/OmNhKD86dGlvbig/OmJhcik/fGxOYW1lKXx3c3JjKXxlKD86bmd0aHxmdCg/OkNvbnRleHQpPyl8YSg/OnN0KD86TSg/Om9kaWZpZWR8YXRjaCl8SW5kZXh8UGFyZW4pfHllcig/OnN8WCl8bmd1YWdlKSl8YSg/OnBwKD86TWlub3JWZXJzaW9ufE5hbWV8Q28oPzpkZU5hbWV8cmUpfFZlcnNpb24pfHZhaWwoPzpIZWlnaHR8VG9wfFdpZHRofExlZnQpfGxsfHIoPzppdHl8Z3VtZW50cyl8TGlua2NvbG9yfGJvdmUpfHIoPzppZ2h0KD86Q29udGV4dCk/fGUoPzpzcG9uc2UoPzpYTUx8VGV4dCl8YWR5U3RhdGUpKXxnbG9iYWx8eHxtKD86aW1lVHlwZXN8dWx0aWxpbmV8ZW51YmFyfGFyZ2luKD86UmlnaHR8Qm90dG9tfFRvcHxMZWZ0KSl8TCg/Ok4oPzoxMHwyKXxPRyg/OjEwRXwyRSkpfGIoPzpvKD86dHRvbXxyZGVyKD86V2lkdGh8UmlnaHRXaWR0aHxCb3R0b21XaWR0aHxTdHlsZXxDb2xvcnxUb3BXaWR0aHxMZWZ0V2lkdGgpKXx1ZmZlckRlcHRofGVsb3d8YWNrZ3JvdW5kKD86Q29sb3J8SW1hZ2UpKSlcYi99LHt0b2tlbjoiaWRlbnRpZmllciIscmVnZXg6b30se3JlZ2V4OiIiLHRva2VuOiJlbXB0eSIsbmV4dDoibm9fcmVnZXgifV0sc3RhcnQ6W2kuZ2V0U3RhcnRSdWxlKCJkb2Mtc3RhcnQiKSxmKCJzdGFydCIpLHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6IlxcLyIsbmV4dDoicmVnZXgifSx7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrfF4kIixuZXh0OiJzdGFydCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6Im5vX3JlZ2V4In1dLHJlZ2V4Olt7dG9rZW46InJlZ2V4cC5rZXl3b3JkLm9wZXJhdG9yIixyZWdleDoiXFxcXCg/OnVbXFxkYS1mQS1GXXs0fXx4W1xcZGEtZkEtRl17Mn18LikifSx7dG9rZW46InN0cmluZy5yZWdleHAiLHJlZ2V4OiIvW3N4bmdpbXldKiIsbmV4dDoibm9fcmVnZXgifSx7dG9rZW46ImludmFsaWQiLHJlZ2V4Oi9ce1xkK1xiLD9cZCpcfVsrKl18WysqJF4/XVsrKl18WyReXVs/XXxcP3szLH0vfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6L1woXD9bOj0hXXxcKXxce1xkK1xiLD9cZCpcfXxbKypdXD98WygpJF4rKj8uXS99LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZGVsaW1pdGVyIixyZWdleDovXHwvfSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6L1xbXF4/LyxuZXh0OiJyZWdleF9jaGFyYWN0ZXJfY2xhc3MifSx7dG9rZW46ImVtcHR5IixyZWdleDoiJCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucmVnZXhwIn1dLHJlZ2V4X2NoYXJhY3Rlcl9jbGFzczpbe3Rva2VuOiJyZWdleHAuY2hhcmNsYXNzLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDoiXSIsbmV4dDoicmVnZXgifSx7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6Ii0ifSx7dG9rZW46ImVtcHR5IixyZWdleDoiJCIsbmV4dDoibm9fcmVnZXgifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcucmVnZXhwLmNoYXJhY2h0ZXJjbGFzcyJ9XSxmdW5jdGlvbl9hcmd1bWVudHM6W3t0b2tlbjoidmFyaWFibGUucGFyYW1ldGVyIixyZWdleDpvfSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiWywgXSsifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDoiJCJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIiLG5leHQ6Im5vX3JlZ2V4In1dLHFxc3RyaW5nOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXFxcJCIsY29uc3VtZUxpbmVFbmQ6ITB9LHt0b2tlbjoic3RyaW5nIixyZWdleDonInwkJyxuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XSxxc3RyaW5nOlt7dG9rZW46ImNvbnN0YW50Lmxhbmd1YWdlLmVzY2FwZSIscmVnZXg6cn0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiJcXFxcJCIsY29uc3VtZUxpbmVFbmQ6ITB9LHt0b2tlbjoic3RyaW5nIixyZWdleDoiJ3wkIixuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZyJ9XX07aWYoIWV8fCFlLm5vRVM2KXRoaXMuJHJ1bGVzLm5vX3JlZ2V4LnVuc2hpZnQoe3JlZ2V4OiJbe31dIixvbk1hdGNoOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLm5leHQ9ZT09InsiP3RoaXMubmV4dFN0YXRlOiIiO2lmKGU9PSJ7IiYmbi5sZW5ndGgpbi51bnNoaWZ0KCJzdGFydCIsdCk7ZWxzZSBpZihlPT0ifSImJm4ubGVuZ3RoKXtuLnNoaWZ0KCksdGhpcy5uZXh0PW4uc2hpZnQoKTtpZih0aGlzLm5leHQuaW5kZXhPZigic3RyaW5nIikhPS0xfHx0aGlzLm5leHQuaW5kZXhPZigianN4IikhPS0xKXJldHVybiJwYXJlbi5xdWFzaS5lbmQifXJldHVybiBlPT0ieyI/InBhcmVuLmxwYXJlbiI6InBhcmVuLnJwYXJlbiJ9LG5leHRTdGF0ZToic3RhcnQifSx7dG9rZW46InN0cmluZy5xdWFzaS5zdGFydCIscmVnZXg6L2AvLHB1c2g6W3t0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDpyfSx7dG9rZW46InBhcmVuLnF1YXNpLnN0YXJ0IixyZWdleDovXCR7LyxwdXNoOiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nLnF1YXNpLmVuZCIscmVnZXg6L2AvLG5leHQ6InBvcCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5xdWFzaSJ9XX0pLCghZXx8ZS5qc3ghPTApJiZhLmNhbGwodGhpcyk7dGhpcy5lbWJlZFJ1bGVzKGksImRvYy0iLFtpLmdldEVuZFJ1bGUoIm5vX3JlZ2V4IildKSx0aGlzLm5vcm1hbGl6ZVJ1bGVzKCl9O3IuaW5oZXJpdHModSxzKSx0LkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcz11fSksYWNlLmRlZmluZSgiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9yYW5nZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vcmFuZ2UiKS5SYW5nZSxpPWZ1bmN0aW9uKCl7fTsoZnVuY3Rpb24oKXt0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQpe3JldHVybi9eXHMrJC8udGVzdChlKT8vXlxzKlx9Ly50ZXN0KHQpOiExfSx0aGlzLmF1dG9PdXRkZW50PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRMaW5lKHQpLGk9bi5tYXRjaCgvXihccypcfSkvKTtpZighaSlyZXR1cm4gMDt2YXIgcz1pWzFdLmxlbmd0aCxvPWUuZmluZE1hdGNoaW5nQnJhY2tldCh7cm93OnQsY29sdW1uOnN9KTtpZighb3x8by5yb3c9PXQpcmV0dXJuIDA7dmFyIHU9dGhpcy4kZ2V0SW5kZW50KGUuZ2V0TGluZShvLnJvdykpO2UucmVwbGFjZShuZXcgcih0LDAsdCxzLTEpLHUpfSx0aGlzLiRnZXRJbmRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUubWF0Y2goL15ccyovKVswXX19KS5jYWxsKGkucHJvdG90eXBlKSx0Lk1hdGNoaW5nQnJhY2VPdXRkZW50PWl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL3JhbmdlIiwiYWNlL21vZGUvZm9sZGluZy9mb2xkX21vZGUiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoIi4uLy4uL2xpYi9vb3AiKSxpPWUoIi4uLy4uL3JhbmdlIikuUmFuZ2Uscz1lKCIuL2ZvbGRfbW9kZSIpLkZvbGRNb2RlLG89dC5Gb2xkTW9kZT1mdW5jdGlvbihlKXtlJiYodGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9bmV3IFJlZ0V4cCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlci5zb3VyY2UucmVwbGFjZSgvXHxbXnxdKj8kLywifCIrZS5zdGFydCkpLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9bmV3IFJlZ0V4cCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyLnNvdXJjZS5yZXBsYWNlKC9cfFtefF0qPyQvLCJ8IitlLmVuZCkpKX07ci5pbmhlcml0cyhvLHMpLGZ1bmN0aW9uKCl7dGhpcy5mb2xkaW5nU3RhcnRNYXJrZXI9LyhbXHtcW1woXSlbXlx9XF1cKV0qJHxeXHMqKFwvXCopLyx0aGlzLmZvbGRpbmdTdG9wTWFya2VyPS9eW15cW1x7XChdKihbXH1cXVwpXSl8Xltcc1wqXSooXCpcLykvLHRoaXMuc2luZ2xlTGluZUJsb2NrQ29tbWVudFJlPS9eXHMqKFwvXCopLipcKlwvXHMqJC8sdGhpcy50cmlwbGVTdGFyQmxvY2tDb21tZW50UmU9L15ccyooXC9cKlwqXCopLipcKlwvXHMqJC8sdGhpcy5zdGFydFJlZ2lvblJlPS9eXHMqKFwvXCp8XC9cLykjP3JlZ2lvblxiLyx0aGlzLl9nZXRGb2xkV2lkZ2V0QmFzZT10aGlzLmdldEZvbGRXaWRnZXQsdGhpcy5nZXRGb2xkV2lkZ2V0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmdldExpbmUobik7aWYodGhpcy5zaW5nbGVMaW5lQmxvY2tDb21tZW50UmUudGVzdChyKSYmIXRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KHIpJiYhdGhpcy50cmlwbGVTdGFyQmxvY2tDb21tZW50UmUudGVzdChyKSlyZXR1cm4iIjt2YXIgaT10aGlzLl9nZXRGb2xkV2lkZ2V0QmFzZShlLHQsbik7cmV0dXJuIWkmJnRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KHIpPyJzdGFydCI6aX0sdGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2U9ZnVuY3Rpb24oZSx0LG4scil7dmFyIGk9ZS5nZXRMaW5lKG4pO2lmKHRoaXMuc3RhcnRSZWdpb25SZS50ZXN0KGkpKXJldHVybiB0aGlzLmdldENvbW1lbnRSZWdpb25CbG9jayhlLGksbik7dmFyIHM9aS5tYXRjaCh0aGlzLmZvbGRpbmdTdGFydE1hcmtlcik7aWYocyl7dmFyIG89cy5pbmRleDtpZihzWzFdKXJldHVybiB0aGlzLm9wZW5pbmdCcmFja2V0QmxvY2soZSxzWzFdLG4sbyk7dmFyIHU9ZS5nZXRDb21tZW50Rm9sZFJhbmdlKG4sbytzWzBdLmxlbmd0aCwxKTtyZXR1cm4gdSYmIXUuaXNNdWx0aUxpbmUoKSYmKHI/dT10aGlzLmdldFNlY3Rpb25SYW5nZShlLG4pOnQhPSJhbGwiJiYodT1udWxsKSksdX1pZih0PT09Im1hcmtiZWdpbiIpcmV0dXJuO3ZhciBzPWkubWF0Y2godGhpcy5mb2xkaW5nU3RvcE1hcmtlcik7aWYocyl7dmFyIG89cy5pbmRleCtzWzBdLmxlbmd0aDtyZXR1cm4gc1sxXT90aGlzLmNsb3NpbmdCcmFja2V0QmxvY2soZSxzWzFdLG4sbyk6ZS5nZXRDb21tZW50Rm9sZFJhbmdlKG4sbywtMSl9fSx0aGlzLmdldFNlY3Rpb25SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0TGluZSh0KSxyPW4uc2VhcmNoKC9cUy8pLHM9dCxvPW4ubGVuZ3RoO3QrPTE7dmFyIHU9dCxhPWUuZ2V0TGVuZ3RoKCk7d2hpbGUoKyt0PGEpe249ZS5nZXRMaW5lKHQpO3ZhciBmPW4uc2VhcmNoKC9cUy8pO2lmKGY9PT0tMSljb250aW51ZTtpZihyPmYpYnJlYWs7dmFyIGw9dGhpcy5nZXRGb2xkV2lkZ2V0UmFuZ2UoZSwiYWxsIix0KTtpZihsKXtpZihsLnN0YXJ0LnJvdzw9cylicmVhaztpZihsLmlzTXVsdGlMaW5lKCkpdD1sLmVuZC5yb3c7ZWxzZSBpZihyPT1mKWJyZWFrfXU9dH1yZXR1cm4gbmV3IGkocyxvLHUsZS5nZXRMaW5lKHUpLmxlbmd0aCl9LHRoaXMuZ2V0Q29tbWVudFJlZ2lvbkJsb2NrPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnNlYXJjaCgvXHMqJC8pLHM9ZS5nZXRMZW5ndGgoKSxvPW4sdT0vXlxzKig/OlwvXCp8XC9cL3wtLSkjPyhlbmQpP3JlZ2lvblxiLyxhPTE7d2hpbGUoKytuPHMpe3Q9ZS5nZXRMaW5lKG4pO3ZhciBmPXUuZXhlYyh0KTtpZighZiljb250aW51ZTtmWzFdP2EtLTphKys7aWYoIWEpYnJlYWt9dmFyIGw9bjtpZihsPm8pcmV0dXJuIG5ldyBpKG8scixsLHQubGVuZ3RoKX19LmNhbGwoby5wcm90b3R5cGUpfSksYWNlLmRlZmluZSgiYWNlL21vZGUvamF2YXNjcmlwdCIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvdGV4dCIsImFjZS9tb2RlL2phdmFzY3JpcHRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIsImFjZS93b3JrZXIvd29ya2VyX2NsaWVudCIsImFjZS9tb2RlL2JlaGF2aW91ci9jc3R5bGUiLCJhY2UvbW9kZS9mb2xkaW5nL2NzdHlsZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi90ZXh0IikuTW9kZSxzPWUoIi4vamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiKS5KYXZhU2NyaXB0SGlnaGxpZ2h0UnVsZXMsbz1lKCIuL21hdGNoaW5nX2JyYWNlX291dGRlbnQiKS5NYXRjaGluZ0JyYWNlT3V0ZGVudCx1PWUoIi4uL3dvcmtlci93b3JrZXJfY2xpZW50IikuV29ya2VyQ2xpZW50LGE9ZSgiLi9iZWhhdmlvdXIvY3N0eWxlIikuQ3N0eWxlQmVoYXZpb3VyLGY9ZSgiLi9mb2xkaW5nL2NzdHlsZSIpLkZvbGRNb2RlLGw9ZnVuY3Rpb24oKXt0aGlzLkhpZ2hsaWdodFJ1bGVzPXMsdGhpcy4kb3V0ZGVudD1uZXcgbyx0aGlzLiRiZWhhdmlvdXI9bmV3IGEsdGhpcy5mb2xkaW5nUnVsZXM9bmV3IGZ9O3IuaW5oZXJpdHMobCxpKSxmdW5jdGlvbigpe3RoaXMubGluZUNvbW1lbnRTdGFydD0iLy8iLHRoaXMuYmxvY2tDb21tZW50PXtzdGFydDoiLyoiLGVuZDoiKi8ifSx0aGlzLiRxdW90ZXM9eyciJzonIicsIiciOiInIiwiYCI6ImAifSx0aGlzLmdldE5leHRMaW5lSW5kZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLiRnZXRJbmRlbnQodCksaT10aGlzLmdldFRva2VuaXplcigpLmdldExpbmVUb2tlbnModCxlKSxzPWkudG9rZW5zLG89aS5zdGF0ZTtpZihzLmxlbmd0aCYmc1tzLmxlbmd0aC0xXS50eXBlPT0iY29tbWVudCIpcmV0dXJuIHI7aWYoZT09InN0YXJ0Inx8ZT09Im5vX3JlZ2V4Iil7dmFyIHU9dC5tYXRjaCgvXi4qKD86XGJjYXNlXGIuKjp8W1x7XChcW10pXHMqJC8pO3UmJihyKz1uKX1lbHNlIGlmKGU9PSJkb2Mtc3RhcnQiKXtpZihvPT0ic3RhcnQifHxvPT0ibm9fcmVnZXgiKXJldHVybiIiO3ZhciB1PXQubWF0Y2goL15ccyooXC8/KVwqLyk7dSYmKHVbMV0mJihyKz0iICIpLHIrPSIqICIpfXJldHVybiByfSx0aGlzLmNoZWNrT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuJG91dGRlbnQuY2hlY2tPdXRkZW50KHQsbil9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3RoaXMuJG91dGRlbnQuYXV0b091dGRlbnQodCxuKX0sdGhpcy5jcmVhdGVXb3JrZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHUoWyJhY2UiXSwiYWNlL21vZGUvamF2YXNjcmlwdF93b3JrZXIiLCJKYXZhU2NyaXB0V29ya2VyIik7cmV0dXJuIHQuYXR0YWNoVG9Eb2N1bWVudChlLmdldERvY3VtZW50KCkpLHQub24oImFubm90YXRlIixmdW5jdGlvbih0KXtlLnNldEFubm90YXRpb25zKHQuZGF0YSl9KSx0Lm9uKCJ0ZXJtaW5hdGUiLGZ1bmN0aW9uKCl7ZS5jbGVhckFubm90YXRpb25zKCl9KSx0fSx0aGlzLiRpZD0iYWNlL21vZGUvamF2YXNjcmlwdCJ9LmNhbGwobC5wcm90b3R5cGUpLHQuTW9kZT1sfSk7ICAgICAgICAgICAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBhY2UucmVxdWlyZShbImFjZS9tb2RlL2phdmFzY3JpcHQiXSwgZnVuY3Rpb24obSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IiAmJiB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiBtb2R1bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkoKTsKICAgIH0KICAgINC80YPRgNC+0Lwu0YHRgtCw0YDRgi7Qv9C+0LTQv9C40YHQsNGC0Ywo0LLQstC10YHRgtC40KDQtdC20LjQvEphdmFTY3JpcHQpOwp9Cg==",
+"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWpheG9yZy9hY2UtYnVpbGRzL2Jsb2IvbWFzdGVyL3NyYy1taW4tbm9jb25mbGljdC9tb2RlLWphdmFzY3JpcHQuanMKYWNlLmRlZmluZSgiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0X2hpZ2hsaWdodF9ydWxlcyJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vbGliL29vcCIpLGk9ZSgiLi90ZXh0X2hpZ2hsaWdodF9ydWxlcyIpLlRleHRIaWdobGlnaHRSdWxlcyxzPWZ1bmN0aW9uKCl7dGhpcy4kcnVsZXM9e3N0YXJ0Olt7dG9rZW46ImNvbW1lbnQuZG9jLnRhZyIscmVnZXg6IkBbXFx3XFxkX10rIn0scy5nZXRUYWdSdWxlKCkse2RlZmF1bHRUb2tlbjoiY29tbWVudC5kb2MiLGNhc2VJbnNlbnNpdGl2ZTohMH1dfX07ci5pbmhlcml0cyhzLGkpLHMuZ2V0VGFnUnVsZT1mdW5jdGlvbihlKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jLnRhZy5zdG9yYWdlLnR5cGUiLHJlZ2V4OiJcXGIoPzpUT0RPfEZJWE1FfFhYWHxIQUNLKVxcYiJ9fSxzLmdldFN0YXJ0UnVsZT1mdW5jdGlvbihlKXtyZXR1cm57dG9rZW46ImNvbW1lbnQuZG9jIixyZWdleDoiXFwvXFwqKD89XFwqKSIsbmV4dDplfX0scy5nZXRFbmRSdWxlPWZ1bmN0aW9uKGUpe3JldHVybnt0b2tlbjoiY29tbWVudC5kb2MiLHJlZ2V4OiJcXCpcXC8iLG5leHQ6ZX19LHQuRG9jQ29tbWVudEhpZ2hsaWdodFJ1bGVzPXN9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIsWyJyZXF1aXJlIiwiZXhwb3J0cyIsIm1vZHVsZSIsImFjZS9saWIvb29wIiwiYWNlL21vZGUvZG9jX2NvbW1lbnRfaGlnaGxpZ2h0X3J1bGVzIiwiYWNlL21vZGUvdGV4dF9oaWdobGlnaHRfcnVsZXMiXSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoKXt2YXIgZT1vLnJlcGxhY2UoIlxcZCIsIlxcZFxcLSIpLHQ9e29uTWF0Y2g6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuY2hhckF0KDEpPT0iLyI/MjoxO2lmKHI9PTEpdCE9dGhpcy5uZXh0U3RhdGU/bi51bnNoaWZ0KHRoaXMubmV4dCx0aGlzLm5leHRTdGF0ZSwwKTpuLnVuc2hpZnQodGhpcy5uZXh0KSxuWzJdKys7ZWxzZSBpZihyPT0yJiZ0PT10aGlzLm5leHRTdGF0ZSl7blsxXS0tO2lmKCFuWzFdfHxuWzFdPDApbi5zaGlmdCgpLG4uc2hpZnQoKX1yZXR1cm5be3R5cGU6Im1ldGEudGFnLnB1bmN0dWF0aW9uLiIrKHI9PTE/IiI6ImVuZC0iKSsidGFnLW9wZW4ueG1sIix2YWx1ZTplLnNsaWNlKDAscil9LHt0eXBlOiJtZXRhLnRhZy50YWctbmFtZS54bWwiLHZhbHVlOmUuc3Vic3RyKHIpfV19LHJlZ2V4OiI8Lz8iK2UrIiIsbmV4dDoianN4QXR0cmlidXRlcyIsbmV4dFN0YXRlOiJqc3gifTt0aGlzLiRydWxlcy5zdGFydC51bnNoaWZ0KHQpO3ZhciBuPXtyZWdleDoieyIsdG9rZW46InBhcmVuLnF1YXNpLnN0YXJ0IixwdXNoOiJzdGFydCJ9O3RoaXMuJHJ1bGVzLmpzeD1bbix0LHtpbmNsdWRlOiJyZWZlcmVuY2UifSx7ZGVmYXVsdFRva2VuOiJzdHJpbmcifV0sdGhpcy4kcnVsZXMuanN4QXR0cmlidXRlcz1be3Rva2VuOiJtZXRhLnRhZy5wdW5jdHVhdGlvbi50YWctY2xvc2UueG1sIixyZWdleDoiLz8+Iixvbk1hdGNoOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdD09blswXSYmbi5zaGlmdCgpLGUubGVuZ3RoPT0yJiYoblswXT09dGhpcy5uZXh0U3RhdGUmJm5bMV0tLSwoIW5bMV18fG5bMV08MCkmJm4uc3BsaWNlKDAsMikpLHRoaXMubmV4dD1uWzBdfHwic3RhcnQiLFt7dHlwZTp0aGlzLnRva2VuLHZhbHVlOmV9XX0sbmV4dFN0YXRlOiJqc3gifSxuLGYoImpzeEF0dHJpYnV0ZXMiKSx7dG9rZW46ImVudGl0eS5vdGhlci5hdHRyaWJ1dGUtbmFtZS54bWwiLHJlZ2V4OmV9LHt0b2tlbjoia2V5d29yZC5vcGVyYXRvci5hdHRyaWJ1dGUtZXF1YWxzLnhtbCIscmVnZXg6Ij0ifSx7dG9rZW46InRleHQudGFnLXdoaXRlc3BhY2UueG1sIixyZWdleDoiXFxzKyJ9LHt0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiInIixzdGF0ZU5hbWU6ImpzeF9hdHRyX3EiLHB1c2g6W3t0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiInIixuZXh0OiJwb3AifSx7aW5jbHVkZToicmVmZXJlbmNlIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwifV19LHt0b2tlbjoic3RyaW5nLmF0dHJpYnV0ZS12YWx1ZS54bWwiLHJlZ2V4OiciJyxzdGF0ZU5hbWU6ImpzeF9hdHRyX3FxIixwdXNoOlt7dG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIixyZWdleDonIicsbmV4dDoicG9wIn0se2luY2x1ZGU6InJlZmVyZW5jZSJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5hdHRyaWJ1dGUtdmFsdWUueG1sIn1dfSx0XSx0aGlzLiRydWxlcy5yZWZlcmVuY2U9W3t0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlLnJlZmVyZW5jZS54bWwiLHJlZ2V4OiIoPzomI1swLTldKzspfCg/OiYjeFswLTlhLWZBLUZdKzspfCg/OiZbYS16QS1aMC05XzpcXC4tXSs7KSJ9XX1mdW5jdGlvbiBmKGUpe3JldHVyblt7dG9rZW46ImNvbW1lbnQiLHJlZ2V4Oi9cL1wqLyxuZXh0OltpLmdldFRhZ1J1bGUoKSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXCpcXC8iLG5leHQ6ZXx8InBvcCJ9LHtkZWZhdWx0VG9rZW46ImNvbW1lbnQiLGNhc2VJbnNlbnNpdGl2ZTohMH1dfSx7dG9rZW46ImNvbW1lbnQiLHJlZ2V4OiJcXC9cXC8iLG5leHQ6W2kuZ2V0VGFnUnVsZSgpLHt0b2tlbjoiY29tbWVudCIscmVnZXg6IiR8XiIsbmV4dDplfHwicG9wIn0se2RlZmF1bHRUb2tlbjoiY29tbWVudCIsY2FzZUluc2Vuc2l0aXZlOiEwfV19XX12YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuL2RvY19jb21tZW50X2hpZ2hsaWdodF9ydWxlcyIpLkRvY0NvbW1lbnRIaWdobGlnaHRSdWxlcyxzPWUoIi4vdGV4dF9oaWdobGlnaHRfcnVsZXMiKS5UZXh0SGlnaGxpZ2h0UnVsZXMsbz0iW2EtekEtWlxcJF9cdTAwYTEtXHVmZmZmXVthLXpBLVpcXGRcXCRfXHUwMGExLVx1ZmZmZl0qIix1PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3JlYXRlS2V5d29yZE1hcHBlcih7InZhcmlhYmxlLmxhbmd1YWdlIjoiQXJyYXl8Qm9vbGVhbnxEYXRlfEZ1bmN0aW9ufEl0ZXJhdG9yfE51bWJlcnxPYmplY3R8UmVnRXhwfFN0cmluZ3xQcm94eXxOYW1lc3BhY2V8UU5hbWV8WE1MfFhNTExpc3R8QXJyYXlCdWZmZXJ8RmxvYXQzMkFycmF5fEZsb2F0NjRBcnJheXxJbnQxNkFycmF5fEludDMyQXJyYXl8SW50OEFycmF5fFVpbnQxNkFycmF5fFVpbnQzMkFycmF5fFVpbnQ4QXJyYXl8VWludDhDbGFtcGVkQXJyYXl8RXJyb3J8RXZhbEVycm9yfEludGVybmFsRXJyb3J8UmFuZ2VFcnJvcnxSZWZlcmVuY2VFcnJvcnxTdG9wSXRlcmF0aW9ufFN5bnRheEVycm9yfFR5cGVFcnJvcnxVUklFcnJvcnxkZWNvZGVVUkl8ZGVjb2RlVVJJQ29tcG9uZW50fGVuY29kZVVSSXxlbmNvZGVVUklDb21wb25lbnR8ZXZhbHxpc0Zpbml0ZXxpc05hTnxwYXJzZUZsb2F0fHBhcnNlSW50fEpTT058TWF0aHx0aGlzfGFyZ3VtZW50c3xwcm90b3R5cGV8d2luZG93fGRvY3VtZW50IixrZXl3b3JkOiJjb25zdHx5aWVsZHxpbXBvcnR8Z2V0fHNldHxhc3luY3xhd2FpdHxicmVha3xjYXNlfGNhdGNofGNvbnRpbnVlfGRlZmF1bHR8ZGVsZXRlfGRvfGVsc2V8ZmluYWxseXxmb3J8ZnVuY3Rpb258aWZ8aW58b2Z8aW5zdGFuY2VvZnxuZXd8cmV0dXJufHN3aXRjaHx0aHJvd3x0cnl8dHlwZW9mfGxldHx2YXJ8d2hpbGV8d2l0aHxkZWJ1Z2dlcnxfX3BhcmVudF9ffF9fY291bnRfX3xlc2NhcGV8dW5lc2NhcGV8d2l0aHxfX3Byb3RvX198Y2xhc3N8ZW51bXxleHRlbmRzfHN1cGVyfGV4cG9ydHxpbXBsZW1lbnRzfHByaXZhdGV8cHVibGljfGludGVyZmFjZXxwYWNrYWdlfHByb3RlY3RlZHxzdGF0aWMiLCJzdG9yYWdlLnR5cGUiOiJjb25zdHxsZXR8dmFyfGZ1bmN0aW9uIiwiY29uc3RhbnQubGFuZ3VhZ2UiOiJudWxsfEluZmluaXR5fE5hTnx1bmRlZmluZWQiLCJzdXBwb3J0LmZ1bmN0aW9uIjoiYWxlcnQiLCJjb25zdGFudC5sYW5ndWFnZS5ib29sZWFuIjoidHJ1ZXxmYWxzZSJ9LCJpZGVudGlmaWVyIiksbj0iY2FzZXxkb3xlbHNlfGZpbmFsbHl8aW58aW5zdGFuY2VvZnxyZXR1cm58dGhyb3d8dHJ5fHR5cGVvZnx5aWVsZHx2b2lkIixyPSJcXFxcKD86eFswLTlhLWZBLUZdezJ9fHVbMC05YS1mQS1GXXs0fXx1e1swLTlhLWZBLUZdezEsNn19fFswLTJdWzAtN117MCwyfXwzWzAtN11bMC03XT98WzQtN11bMC03XT98LikiO3RoaXMuJHJ1bGVzPXtub19yZWdleDpbaS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLGYoIm5vX3JlZ2V4Iikse3Rva2VuOiJzdHJpbmciLHJlZ2V4OiInKD89LikiLG5leHQ6InFzdHJpbmcifSx7dG9rZW46InN0cmluZyIscmVnZXg6JyIoPz0uKScsbmV4dDoicXFzdHJpbmcifSx7dG9rZW46ImNvbnN0YW50Lm51bWVyaWMiLHJlZ2V4Oi8wKD86W3hYXVswLTlhLWZBLUZdK3xbb09dWzAtN10rfFtiQl1bMDFdKylcYi99LHt0b2tlbjoiY29uc3RhbnQubnVtZXJpYyIscmVnZXg6Lyg/OlxkXGQqKD86XC5cZCopP3xcLlxkKykoPzpbZUVdWystXT9cZCtcYik/L30se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJzdXBwb3J0LmZ1bmN0aW9uIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIl0scmVnZXg6IigiK28rIikoXFwuKShwcm90b3R5cGUpKFxcLikoIitvKyIpKFxccyopKD0pIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJzdG9yYWdlLnR5cGUiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsImtleXdvcmQub3BlcmF0b3IiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoIitvKyIpKFxcLikoIitvKyIpKFxccyopKD0pKFxccyopKGZ1bmN0aW9uKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXHMqKSg9KShcXHMqKShmdW5jdGlvbikoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXC4pKCIrbysiKShcXHMqKSg9KShcXHMqKShmdW5jdGlvbikoXFxzKykoXFx3KykoXFxzKikoXFwoKSIsbmV4dDoiZnVuY3Rpb25fYXJndW1lbnRzIn0se3Rva2VuOlsic3RvcmFnZS50eXBlIiwidGV4dCIsImVudGl0eS5uYW1lLmZ1bmN0aW9uIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoZnVuY3Rpb24pKFxccyspKCIrbysiKShcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46WyJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJwdW5jdHVhdGlvbi5vcGVyYXRvciIsInRleHQiLCJzdG9yYWdlLnR5cGUiLCJ0ZXh0IiwicGFyZW4ubHBhcmVuIl0scmVnZXg6IigiK28rIikoXFxzKikoOikoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjpbInRleHQiLCJ0ZXh0Iiwic3RvcmFnZS50eXBlIiwidGV4dCIsInBhcmVuLmxwYXJlbiJdLHJlZ2V4OiIoOikoXFxzKikoZnVuY3Rpb24pKFxccyopKFxcKCkiLG5leHQ6ImZ1bmN0aW9uX2FyZ3VtZW50cyJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6ImZyb20oPz1cXHMqKCd8XCIpKSJ9LHt0b2tlbjoia2V5d29yZCIscmVnZXg6Iig/OiIrbisiKVxcYiIsbmV4dDoic3RhcnQifSx7dG9rZW46WyJzdXBwb3J0LmNvbnN0YW50Il0scmVnZXg6L3RoYXRcYi99LHt0b2tlbjpbInN0b3JhZ2UudHlwZSIsInB1bmN0dWF0aW9uLm9wZXJhdG9yIiwic3VwcG9ydC5mdW5jdGlvbi5maXJlYnVnIl0scmVnZXg6Lyhjb25zb2xlKShcLikod2FybnxpbmZvfGxvZ3xlcnJvcnx0aW1lfHRyYWNlfHRpbWVFbmR8YXNzZXJ0KVxiL30se3Rva2VuOnQscmVnZXg6b30se3Rva2VuOiJwdW5jdHVhdGlvbi5vcGVyYXRvciIscmVnZXg6L1suXSg/IVsuXSkvLG5leHQ6InByb3BlcnR5In0se3Rva2VuOiJzdG9yYWdlLnR5cGUiLHJlZ2V4Oi89Pi8sbmV4dDoic3RhcnQifSx7dG9rZW46ImtleXdvcmQub3BlcmF0b3IiLHJlZ2V4Oi8tLXxcK1wrfFwuezN9fD09PXw9PXw9fCE9fCE9PXw8Kz0/fD4rPT98IXwmJnxcfFx8fFw/OnxbISQlJiorXC1+XC9eXT0/LyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4Oi9bPzosOy5dLyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoicGFyZW4ubHBhcmVuIixyZWdleDovW1xbKHtdLyxuZXh0OiJzdGFydCJ9LHt0b2tlbjoicGFyZW4ucnBhcmVuIixyZWdleDovW1xdKX1dL30se3Rva2VuOiJjb21tZW50IixyZWdleDovXiMhLiokL31dLHByb3BlcnR5Olt7dG9rZW46InRleHQiLHJlZ2V4OiJcXHMrIn0se3Rva2VuOlsic3RvcmFnZS50eXBlIiwicHVuY3R1YXRpb24ub3BlcmF0b3IiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJrZXl3b3JkLm9wZXJhdG9yIiwidGV4dCIsInN0b3JhZ2UudHlwZSIsInRleHQiLCJlbnRpdHkubmFtZS5mdW5jdGlvbiIsInRleHQiLCJwYXJlbi5scGFyZW4iXSxyZWdleDoiKCIrbysiKShcXC4pKCIrbysiKShcXHMqKSg9KShcXHMqKShmdW5jdGlvbikoPzooXFxzKykoXFx3KykpPyhcXHMqKShcXCgpIixuZXh0OiJmdW5jdGlvbl9hcmd1bWVudHMifSx7dG9rZW46InB1bmN0dWF0aW9uLm9wZXJhdG9yIixyZWdleDovWy5dKD8hWy5dKS99LHt0b2tlbjoic3VwcG9ydC5mdW5jdGlvbiIscmVnZXg6LyhzKD86aCg/OmlmdHxvdyg/Ok1vZCg/OmVsZXNzRGlhbG9nfGFsRGlhbG9nKXxIZWxwKSl8Y3JvbGwoPzpYfEJ5KD86UGFnZXN8TGluZXMpP3xZfFRvKT98dCg/Om9wfHJpa2UpfGkoPzpufHplVG9Db250ZW50fGRlYmFyfGduVGV4dCl8b3J0fHUoPzpwfGIoPzpzdHIoPzppbmcpPyk/KXxwbGkoPzpjZXx0KXxlKD86bmR8dCg/OlJlKD86c2l6YWJsZXxxdWVzdEhlYWRlcil8TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZWNvbmRzfEhvKD86dEtleXN8dXJzKXxZZWFyfEN1cnNvcnxUaW1lKD86b3V0KT98SW50ZXJ2YWx8Wk9wdGlvbnN8RGF0ZXxVVEMoPzpNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlY29uZHN8SG91cnN8RGF0ZXxGdWxsWWVhcil8RnVsbFllYXJ8QWN0aXZlKXxhcmNoKXxxcnR8bGljZXxhdmVQcmVmZXJlbmNlc3xtYWxsKXxoKD86b21lfGFuZGxlRXZlbnQpfG5hdmlnYXRlfGMoPzpoYXIoPzpDb2RlQXR8QXQpfG8oPzpzfG4oPzpjYXR8dGV4dHVhbHxmaXJtKXxtcGlsZSl8ZWlsfGxlYXIoPzpUaW1lb3V0fEludGVydmFsKT98YSg/OnB0dXJlRXZlbnRzfGxsKXxyZWF0ZSg/OlN0eWxlU2hlZXR8UG9wdXB8RXZlbnRPYmplY3QpKXx0KD86byg/OkdNVFN0cmluZ3xTKD86dHJpbmd8b3VyY2UpfFUoPzpUQ1N0cmluZ3xwcGVyQ2FzZSl8TG8oPzpjYWxlU3RyaW5nfHdlckNhc2UpKXxlc3R8YSg/Om58aW50KD86RW5hYmxlZCk/KSl8aSg/OnMoPzpOYU58RmluaXRlKXxuZGV4T2Z8dGFsaWNzKXxkKD86aXNhYmxlRXh0ZXJuYWxDYXB0dXJlfHVtcHxldGFjaEV2ZW50KXx1KD86big/OnNoaWZ0fHRhaW50fGVzY2FwZXx3YXRjaCl8cGRhdGVDb21tYW5kcyl8aig/Om9pbnxhdmFFbmFibGVkKXxwKD86byg/OnB8dyl8dXNofGx1Z2lucy5yZWZyZXNofGEoPzpkZGluZ3N8cnNlKD86SW50fEZsb2F0KT8pfHIoPzppbnR8b21wdHxlZmVyZW5jZSkpfGUoPzpzY2FwZXxuYWJsZUV4dGVybmFsQ2FwdHVyZXx2YWx8bGVtZW50RnJvbVBvaW50fHgoPzpwfGVjKD86U2NyaXB0fENvbW1hbmQpPykpfHZhbHVlT2Z8VVRDfHF1ZXJ5Q29tbWFuZCg/OlN0YXRlfEluZGV0ZXJtfEVuYWJsZWR8VmFsdWUpfGYoPzppKD86bmR8bGUoPzpNb2RpZmllZERhdGV8U2l6ZXxDcmVhdGVkRGF0ZXxVcGRhdGVkRGF0ZSl8eGVkKXxvKD86bnQoPzpzaXplfGNvbG9yKXxyd2FyZCl8bG9vcnxyb21DaGFyQ29kZSl8d2F0Y2h8bCg/Omlua3xvKD86YWR8Zyl8YXN0SW5kZXhPZil8YSg/OnNpbnxuY2hvcnxjb3N8dCg/OnRhY2hFdmVudHxvYnxhbig/OjIpPyl8cHBseXxsZXJ0fGIoPzpzfG9ydCkpfHIoPzpvdSg/Om5kfHRlRXZlbnRzKXxlKD86c2l6ZSg/OkJ5fFRvKXxjYWxjfHR1cm5WYWx1ZXxwbGFjZXx2ZXJzZXxsKD86b2FkfGVhc2UoPzpDYXB0dXJlfEV2ZW50cykpKXxhbmRvbSl8Zyg/Om98ZXQoPzpSZXNwb25zZUhlYWRlcnxNKD86aSg/Om51dGVzfGxsaXNlY29uZHMpfG9udGgpfFNlKD86Y29uZHN8bGVjdGlvbil8SG91cnN8WWVhcnxUaW1lKD86em9uZU9mZnNldCk/fERhKD86eXx0ZSl8VVRDKD86TSg/OmkoPzpudXRlc3xsbGlzZWNvbmRzKXxvbnRoKXxTZWNvbmRzfEhvdXJzfERhKD86eXx0ZSl8RnVsbFllYXIpfEZ1bGxZZWFyfEEoPzp0dGVudGlvbnxsbFJlc3BvbnNlSGVhZGVycykpKXxtKD86aW58b3ZlKD86Qig/Onl8ZWxvdyl8VG8oPzpBYnNvbHV0ZSk/fEFib3ZlKXxlcmdlQXR0cmlidXRlc3xhKD86dGNofHJnaW5zfHgpKXxiKD86dG9hfGlnfG8oPzpsZHxyZGVyV2lkdGhzKXxsaW5rfGFjaykpXGIoPz1cKCkvfSx7dG9rZW46InN1cHBvcnQuZnVuY3Rpb24uZG9tIixyZWdleDovKHMoPzp1Yig/OnN0cmluZ0RhdGF8bWl0KXxwbGl0VGV4dHxlKD86dCg/Ok5hbWVkSXRlbXxBdHRyaWJ1dGUoPzpOb2RlKT8pfGxlY3QpKXxoYXMoPzpDaGlsZE5vZGVzfEZlYXR1cmUpfG5hbWVkSXRlbXxjKD86bCg/Omlja3xvKD86c2V8bmVOb2RlKSl8cmVhdGUoPzpDKD86b21tZW50fERBVEFTZWN0aW9ufGFwdGlvbil8VCg/OkhlYWR8ZXh0Tm9kZXxGb290KXxEb2N1bWVudEZyYWdtZW50fFByb2Nlc3NpbmdJbnN0cnVjdGlvbnxFKD86bnRpdHlSZWZlcmVuY2V8bGVtZW50KXxBdHRyaWJ1dGUpKXx0YWJJbmRleHxpKD86bnNlcnQoPzpSb3d8QmVmb3JlfENlbGx8RGF0YSl8dGVtKXxvcGVufGRlbGV0ZSg/OlJvd3xDKD86ZWxsfGFwdGlvbil8VCg/OkhlYWR8Rm9vdCl8RGF0YSl8Zm9jdXN8d3JpdGUoPzpsbik/fGEoPzpkZHxwcGVuZCg/OkNoaWxkfERhdGEpKXxyZSg/OnNldHxwbGFjZSg/OkNoaWxkfERhdGEpfG1vdmUoPzpOYW1lZEl0ZW18Q2hpbGR8QXR0cmlidXRlKD86Tm9kZSk/KT8pfGdldCg/Ok5hbWVkSXRlbXxFbGVtZW50KD86c0J5KD86TmFtZXxUYWdOYW1lfENsYXNzTmFtZSl8QnlJZCl8QXR0cmlidXRlKD86Tm9kZSk/KXxibHVyKVxiKD89XCgpL30se3Rva2VuOiJzdXBwb3J0LmNvbnN0YW50IixyZWdleDovKHMoPzp5c3RlbUxhbmd1YWdlfGNyKD86aXB0c3xvbGxiYXJzfGVlbig/Olh8WXxUb3B8TGVmdCkpfHQoPzp5bGUoPzpTaGVldHMpP3xhdHVzKD86VGV4dHxiYXIpPyl8aWJsaW5nKD86QmVsb3d8QWJvdmUpfG91cmNlfHVmZml4ZXN8ZSg/OmN1cml0eSg/OlBvbGljeSk/fGwoPzplY3Rpb258ZikpKXxoKD86aXN0b3J5fG9zdCg/Om5hbWUpP3xhcyg/Omh8Rm9jdXMpKXx5fFgoPzpNTERvY3VtZW50fFNMRG9jdW1lbnQpfG4oPzpleHR8YW1lKD86c3BhY2UoPzpzfFVSSSl8UHJvcCkpfE0oPzpJTl9WQUxVRXxBWF9WQUxVRSl8Yyg/OmhhcmFjdGVyU2V0fG8oPzpuKD86c3RydWN0b3J8dHJvbGxlcnMpfG9raWVFbmFibGVkfGxvckRlcHRofG1wKD86b25lbnRzfGxldGUpKXx1cnJlbnR8cHVDbGFzc3xsKD86aSg/OnAoPzpib2FyZERhdGEpP3xlbnRJbmZvcm1hdGlvbil8b3NlZHxhc3Nlcyl8YWxsZSg/OmV8cil8cnlwdG8pfHQoPzpvKD86b2xiYXJ8cCl8ZXh0KD86VHJhbnNmb3JtfEluZGVudHxEZWNvcmF0aW9ufEFsaWduKXxhZ3MpfFNRUlQoPzoxXzJ8Mil8aSg/Om4oPzpuZXIoPzpIZWlnaHR8V2lkdGgpfHB1dCl8ZHN8Z25vcmVDYXNlKXx6SW5kZXh8byg/OnNjcHV8big/OnJlYWR5c3RhdGVjaGFuZ2V8TGluZSl8dXRlcig/OkhlaWdodHxXaWR0aCl8cCg/OnNQcm9maWxlfGVuZXIpfGZmc2NyZWVuQnVmZmVyaW5nKXxORUdBVElWRV9JTkZJTklUWXxkKD86aSg/OnNwbGF5fGFsb2coPzpIZWlnaHR8VG9wfFdpZHRofExlZnR8QXJndW1lbnRzKXxyZWN0b3JpZXMpfGUoPzpzY3JpcHRpb258ZmF1bHQoPzpTdGF0dXN8Q2goPzplY2tlZHxhcnNldCl8VmlldykpKXx1KD86c2VyKD86UHJvZmlsZXxMYW5ndWFnZXxBZ2VudCl8big/OmlxdWVJRHxkZWZpbmVkKXxwZGF0ZUludGVydmFsKXxfY29udGVudHxwKD86aXhlbERlcHRofG9ydHxlcnNvbmFsYmFyfGtjczExfGwoPzp1Z2luc3xhdGZvcm0pfGEoPzp0aG5hbWV8ZGRpbmcoPzpSaWdodHxCb3R0b218VG9wfExlZnQpfHJlbnQoPzpXaW5kb3d8TGF5ZXIpP3xnZSg/OlgoPzpPZmZzZXQpP3xZKD86T2Zmc2V0KT8pKXxyKD86byg/OnRvKD86Y29sfHR5cGUpfGR1Y3QoPzpTdWIpP3xtcHRlcil8ZSg/OnZpb3VzfGZpeCkpKXxlKD86big/OmNvZGluZ3xhYmxlZFBsdWdpbil8eCg/OnRlcm5hbHxwYW5kbyl8bWJlZHMpfHYoPzppc2liaWxpdHl8ZW5kb3IoPzpTdWIpP3xMaW5rY29sb3IpfFVSTFVuZW5jb2RlZHxQKD86SXxPU0lUSVZFX0lORklOSVRZKXxmKD86aWxlbmFtZXxvKD86bnQoPzpTaXplfEZhbWlseXxXZWlnaHQpfHJtTmFtZSl8cmFtZSg/OnN8RWxlbWVudCl8Z0NvbG9yKXxFfHdoaXRlU3BhY2V8bCg/OmkoPzpzdFN0eWxlVHlwZXxuKD86ZUhlaWdodHxrQ29sb3IpKXxvKD86Y2EoPzp0aW9uKD86YmFyKT98bE5hbWUpfHdzcmMpfGUoPzpuZ3RofGZ0KD86Q29udGV4dCk/KXxhKD86c3QoPzpNKD86b2RpZmllZHxhdGNoKXxJbmRleHxQYXJlbil8eWVyKD86c3xYKXxuZ3VhZ2UpKXxhKD86cHAoPzpNaW5vclZlcnNpb258TmFtZXxDbyg/OmRlTmFtZXxyZSl8VmVyc2lvbil8dmFpbCg/OkhlaWdodHxUb3B8V2lkdGh8TGVmdCl8bGx8cig/Oml0eXxndW1lbnRzKXxMaW5rY29sb3J8Ym92ZSl8cig/OmlnaHQoPzpDb250ZXh0KT98ZSg/OnNwb25zZSg/OlhNTHxUZXh0KXxhZHlTdGF0ZSkpfGdsb2JhbHx4fG0oPzppbWVUeXBlc3x1bHRpbGluZXxlbnViYXJ8YXJnaW4oPzpSaWdodHxCb3R0b218VG9wfExlZnQpKXxMKD86Tig/OjEwfDIpfE9HKD86MTBFfDJFKSl8Yig/Om8oPzp0dG9tfHJkZXIoPzpXaWR0aHxSaWdodFdpZHRofEJvdHRvbVdpZHRofFN0eWxlfENvbG9yfFRvcFdpZHRofExlZnRXaWR0aCkpfHVmZmVyRGVwdGh8ZWxvd3xhY2tncm91bmQoPzpDb2xvcnxJbWFnZSkpKVxiL30se3Rva2VuOiJpZGVudGlmaWVyIixyZWdleDpvfSx7cmVnZXg6IiIsdG9rZW46ImVtcHR5IixuZXh0OiJub19yZWdleCJ9XSxzdGFydDpbaS5nZXRTdGFydFJ1bGUoImRvYy1zdGFydCIpLGYoInN0YXJ0Iikse3Rva2VuOiJzdHJpbmcucmVnZXhwIixyZWdleDoiXFwvIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoidGV4dCIscmVnZXg6Ilxccyt8XiQiLG5leHQ6InN0YXJ0In0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoibm9fcmVnZXgifV0scmVnZXg6W3t0b2tlbjoicmVnZXhwLmtleXdvcmQub3BlcmF0b3IiLHJlZ2V4OiJcXFxcKD86dVtcXGRhLWZBLUZdezR9fHhbXFxkYS1mQS1GXXsyfXwuKSJ9LHt0b2tlbjoic3RyaW5nLnJlZ2V4cCIscmVnZXg6Ii9bc3huZ2lteV0qIixuZXh0OiJub19yZWdleCJ9LHt0b2tlbjoiaW52YWxpZCIscmVnZXg6L1x7XGQrXGIsP1xkKlx9WysqXXxbKyokXj9dWysqXXxbJF5dWz9dfFw/ezMsfS99LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDovXChcP1s6PSFdfFwpfFx7XGQrXGIsP1xkKlx9fFsrKl1cP3xbKCkkXisqPy5dL30se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5kZWxpbWl0ZXIiLHJlZ2V4Oi9cfC99LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDovXFtcXj8vLG5leHQ6InJlZ2V4X2NoYXJhY3Rlcl9jbGFzcyJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIkIixuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5yZWdleHAifV0scmVnZXhfY2hhcmFjdGVyX2NsYXNzOlt7dG9rZW46InJlZ2V4cC5jaGFyY2xhc3Mua2V5d29yZC5vcGVyYXRvciIscmVnZXg6IlxcXFwoPzp1W1xcZGEtZkEtRl17NH18eFtcXGRhLWZBLUZdezJ9fC4pIn0se3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OiJdIixuZXh0OiJyZWdleCJ9LHt0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDoiLSJ9LHt0b2tlbjoiZW1wdHkiLHJlZ2V4OiIkIixuZXh0OiJub19yZWdleCJ9LHtkZWZhdWx0VG9rZW46InN0cmluZy5yZWdleHAuY2hhcmFjaHRlcmNsYXNzIn1dLGZ1bmN0aW9uX2FyZ3VtZW50czpbe3Rva2VuOiJ2YXJpYWJsZS5wYXJhbWV0ZXIiLHJlZ2V4Om99LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiJbLCBdKyJ9LHt0b2tlbjoicHVuY3R1YXRpb24ub3BlcmF0b3IiLHJlZ2V4OiIkIn0se3Rva2VuOiJlbXB0eSIscmVnZXg6IiIsbmV4dDoibm9fcmVnZXgifV0scXFzdHJpbmc6W3t0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDpyfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlxcXFwkIixjb25zdW1lTGluZUVuZDohMH0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OicifCQnLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nIn1dLHFzdHJpbmc6W3t0b2tlbjoiY29uc3RhbnQubGFuZ3VhZ2UuZXNjYXBlIixyZWdleDpyfSx7dG9rZW46InN0cmluZyIscmVnZXg6IlxcXFwkIixjb25zdW1lTGluZUVuZDohMH0se3Rva2VuOiJzdHJpbmciLHJlZ2V4OiInfCQiLG5leHQ6Im5vX3JlZ2V4In0se2RlZmF1bHRUb2tlbjoic3RyaW5nIn1dfTtpZighZXx8IWUubm9FUzYpdGhpcy4kcnVsZXMubm9fcmVnZXgudW5zaGlmdCh7cmVnZXg6Ilt7fV0iLG9uTWF0Y2g6ZnVuY3Rpb24oZSx0LG4pe3RoaXMubmV4dD1lPT0ieyI/dGhpcy5uZXh0U3RhdGU6IiI7aWYoZT09InsiJiZuLmxlbmd0aCluLnVuc2hpZnQoInN0YXJ0Iix0KTtlbHNlIGlmKGU9PSJ9IiYmbi5sZW5ndGgpe24uc2hpZnQoKSx0aGlzLm5leHQ9bi5zaGlmdCgpO2lmKHRoaXMubmV4dC5pbmRleE9mKCJzdHJpbmciKSE9LTF8fHRoaXMubmV4dC5pbmRleE9mKCJqc3giKSE9LTEpcmV0dXJuInBhcmVuLnF1YXNpLmVuZCJ9cmV0dXJuIGU9PSJ7Ij8icGFyZW4ubHBhcmVuIjoicGFyZW4ucnBhcmVuIn0sbmV4dFN0YXRlOiJzdGFydCJ9LHt0b2tlbjoic3RyaW5nLnF1YXNpLnN0YXJ0IixyZWdleDovYC8scHVzaDpbe3Rva2VuOiJjb25zdGFudC5sYW5ndWFnZS5lc2NhcGUiLHJlZ2V4OnJ9LHt0b2tlbjoicGFyZW4ucXVhc2kuc3RhcnQiLHJlZ2V4Oi9cJHsvLHB1c2g6InN0YXJ0In0se3Rva2VuOiJzdHJpbmcucXVhc2kuZW5kIixyZWdleDovYC8sbmV4dDoicG9wIn0se2RlZmF1bHRUb2tlbjoic3RyaW5nLnF1YXNpIn1dfSksKCFlfHxlLmpzeCE9MCkmJmEuY2FsbCh0aGlzKTt0aGlzLmVtYmVkUnVsZXMoaSwiZG9jLSIsW2kuZ2V0RW5kUnVsZSgibm9fcmVnZXgiKV0pLHRoaXMubm9ybWFsaXplUnVsZXMoKX07ci5pbmhlcml0cyh1LHMpLHQuSmF2YVNjcmlwdEhpZ2hsaWdodFJ1bGVzPXV9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL3JhbmdlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9yYW5nZSIpLlJhbmdlLGk9ZnVuY3Rpb24oKXt9OyhmdW5jdGlvbigpe3RoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuL15ccyskLy50ZXN0KGUpPy9eXHMqXH0vLnRlc3QodCk6ITF9LHRoaXMuYXV0b091dGRlbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldExpbmUodCksaT1uLm1hdGNoKC9eKFxzKlx9KS8pO2lmKCFpKXJldHVybiAwO3ZhciBzPWlbMV0ubGVuZ3RoLG89ZS5maW5kTWF0Y2hpbmdCcmFja2V0KHtyb3c6dCxjb2x1bW46c30pO2lmKCFvfHxvLnJvdz09dClyZXR1cm4gMDt2YXIgdT10aGlzLiRnZXRJbmRlbnQoZS5nZXRMaW5lKG8ucm93KSk7ZS5yZXBsYWNlKG5ldyByKHQsMCx0LHMtMSksdSl9LHRoaXMuJGdldEluZGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZS5tYXRjaCgvXlxzKi8pWzBdfX0pLmNhbGwoaS5wcm90b3R5cGUpLHQuTWF0Y2hpbmdCcmFjZU91dGRlbnQ9aX0pLGFjZS5kZWZpbmUoImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvcmFuZ2UiLCJhY2UvbW9kZS9mb2xkaW5nL2ZvbGRfbW9kZSJdLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgiLi4vLi4vbGliL29vcCIpLGk9ZSgiLi4vLi4vcmFuZ2UiKS5SYW5nZSxzPWUoIi4vZm9sZF9tb2RlIikuRm9sZE1vZGUsbz10LkZvbGRNb2RlPWZ1bmN0aW9uKGUpe2UmJih0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj1uZXcgUmVnRXhwKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyLnNvdXJjZS5yZXBsYWNlKC9cfFtefF0qPyQvLCJ8IitlLnN0YXJ0KSksdGhpcy5mb2xkaW5nU3RvcE1hcmtlcj1uZXcgUmVnRXhwKHRoaXMuZm9sZGluZ1N0b3BNYXJrZXIuc291cmNlLnJlcGxhY2UoL1x8W158XSo/JC8sInwiK2UuZW5kKSkpfTtyLmluaGVyaXRzKG8scyksZnVuY3Rpb24oKXt0aGlzLmZvbGRpbmdTdGFydE1hcmtlcj0vKFtce1xbXChdKVteXH1cXVwpXSokfF5ccyooXC9cKikvLHRoaXMuZm9sZGluZ1N0b3BNYXJrZXI9L15bXlxbXHtcKF0qKFtcfVxdXCldKXxeW1xzXCpdKihcKlwvKS8sdGhpcy5zaW5nbGVMaW5lQmxvY2tDb21tZW50UmU9L15ccyooXC9cKikuKlwqXC9ccyokLyx0aGlzLnRyaXBsZVN0YXJCbG9ja0NvbW1lbnRSZT0vXlxzKihcL1wqXCpcKikuKlwqXC9ccyokLyx0aGlzLnN0YXJ0UmVnaW9uUmU9L15ccyooXC9cKnxcL1wvKSM/cmVnaW9uXGIvLHRoaXMuX2dldEZvbGRXaWRnZXRCYXNlPXRoaXMuZ2V0Rm9sZFdpZGdldCx0aGlzLmdldEZvbGRXaWRnZXQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUuZ2V0TGluZShuKTtpZih0aGlzLnNpbmdsZUxpbmVCbG9ja0NvbW1lbnRSZS50ZXN0KHIpJiYhdGhpcy5zdGFydFJlZ2lvblJlLnRlc3QocikmJiF0aGlzLnRyaXBsZVN0YXJCbG9ja0NvbW1lbnRSZS50ZXN0KHIpKXJldHVybiIiO3ZhciBpPXRoaXMuX2dldEZvbGRXaWRnZXRCYXNlKGUsdCxuKTtyZXR1cm4haSYmdGhpcy5zdGFydFJlZ2lvblJlLnRlc3Qocik/InN0YXJ0IjppfSx0aGlzLmdldEZvbGRXaWRnZXRSYW5nZT1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1lLmdldExpbmUobik7aWYodGhpcy5zdGFydFJlZ2lvblJlLnRlc3QoaSkpcmV0dXJuIHRoaXMuZ2V0Q29tbWVudFJlZ2lvbkJsb2NrKGUsaSxuKTt2YXIgcz1pLm1hdGNoKHRoaXMuZm9sZGluZ1N0YXJ0TWFya2VyKTtpZihzKXt2YXIgbz1zLmluZGV4O2lmKHNbMV0pcmV0dXJuIHRoaXMub3BlbmluZ0JyYWNrZXRCbG9jayhlLHNbMV0sbixvKTt2YXIgdT1lLmdldENvbW1lbnRGb2xkUmFuZ2UobixvK3NbMF0ubGVuZ3RoLDEpO3JldHVybiB1JiYhdS5pc011bHRpTGluZSgpJiYocj91PXRoaXMuZ2V0U2VjdGlvblJhbmdlKGUsbik6dCE9ImFsbCImJih1PW51bGwpKSx1fWlmKHQ9PT0ibWFya2JlZ2luIilyZXR1cm47dmFyIHM9aS5tYXRjaCh0aGlzLmZvbGRpbmdTdG9wTWFya2VyKTtpZihzKXt2YXIgbz1zLmluZGV4K3NbMF0ubGVuZ3RoO3JldHVybiBzWzFdP3RoaXMuY2xvc2luZ0JyYWNrZXRCbG9jayhlLHNbMV0sbixvKTplLmdldENvbW1lbnRGb2xkUmFuZ2UobixvLC0xKX19LHRoaXMuZ2V0U2VjdGlvblJhbmdlPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRMaW5lKHQpLHI9bi5zZWFyY2goL1xTLykscz10LG89bi5sZW5ndGg7dCs9MTt2YXIgdT10LGE9ZS5nZXRMZW5ndGgoKTt3aGlsZSgrK3Q8YSl7bj1lLmdldExpbmUodCk7dmFyIGY9bi5zZWFyY2goL1xTLyk7aWYoZj09PS0xKWNvbnRpbnVlO2lmKHI+ZilicmVhazt2YXIgbD10aGlzLmdldEZvbGRXaWRnZXRSYW5nZShlLCJhbGwiLHQpO2lmKGwpe2lmKGwuc3RhcnQucm93PD1zKWJyZWFrO2lmKGwuaXNNdWx0aUxpbmUoKSl0PWwuZW5kLnJvdztlbHNlIGlmKHI9PWYpYnJlYWt9dT10fXJldHVybiBuZXcgaShzLG8sdSxlLmdldExpbmUodSkubGVuZ3RoKX0sdGhpcy5nZXRDb21tZW50UmVnaW9uQmxvY2s9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQuc2VhcmNoKC9ccyokLykscz1lLmdldExlbmd0aCgpLG89bix1PS9eXHMqKD86XC9cKnxcL1wvfC0tKSM/KGVuZCk/cmVnaW9uXGIvLGE9MTt3aGlsZSgrK248cyl7dD1lLmdldExpbmUobik7dmFyIGY9dS5leGVjKHQpO2lmKCFmKWNvbnRpbnVlO2ZbMV0/YS0tOmErKztpZighYSlicmVha312YXIgbD1uO2lmKGw+bylyZXR1cm4gbmV3IGkobyxyLGwsdC5sZW5ndGgpfX0uY2FsbChvLnByb3RvdHlwZSl9KSxhY2UuZGVmaW5lKCJhY2UvbW9kZS9qYXZhc2NyaXB0IixbInJlcXVpcmUiLCJleHBvcnRzIiwibW9kdWxlIiwiYWNlL2xpYi9vb3AiLCJhY2UvbW9kZS90ZXh0IiwiYWNlL21vZGUvamF2YXNjcmlwdF9oaWdobGlnaHRfcnVsZXMiLCJhY2UvbW9kZS9tYXRjaGluZ19icmFjZV9vdXRkZW50IiwiYWNlL3dvcmtlci93b3JrZXJfY2xpZW50IiwiYWNlL21vZGUvYmVoYXZpb3VyL2NzdHlsZSIsImFjZS9tb2RlL2ZvbGRpbmcvY3N0eWxlIl0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKCIuLi9saWIvb29wIiksaT1lKCIuL3RleHQiKS5Nb2RlLHM9ZSgiLi9qYXZhc2NyaXB0X2hpZ2hsaWdodF9ydWxlcyIpLkphdmFTY3JpcHRIaWdobGlnaHRSdWxlcyxvPWUoIi4vbWF0Y2hpbmdfYnJhY2Vfb3V0ZGVudCIpLk1hdGNoaW5nQnJhY2VPdXRkZW50LHU9ZSgiLi4vd29ya2VyL3dvcmtlcl9jbGllbnQiKS5Xb3JrZXJDbGllbnQsYT1lKCIuL2JlaGF2aW91ci9jc3R5bGUiKS5Dc3R5bGVCZWhhdmlvdXIsZj1lKCIuL2ZvbGRpbmcvY3N0eWxlIikuRm9sZE1vZGUsbD1mdW5jdGlvbigpe3RoaXMuSGlnaGxpZ2h0UnVsZXM9cyx0aGlzLiRvdXRkZW50PW5ldyBvLHRoaXMuJGJlaGF2aW91cj1uZXcgYSx0aGlzLmZvbGRpbmdSdWxlcz1uZXcgZn07ci5pbmhlcml0cyhsLGkpLGZ1bmN0aW9uKCl7dGhpcy5saW5lQ29tbWVudFN0YXJ0PSIvLyIsdGhpcy5ibG9ja0NvbW1lbnQ9e3N0YXJ0OiIvKiIsZW5kOiIqLyJ9LHRoaXMuJHF1b3Rlcz17JyInOiciJywiJyI6IiciLCJgIjoiYCJ9LHRoaXMuZ2V0TmV4dExpbmVJbmRlbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuJGdldEluZGVudCh0KSxpPXRoaXMuZ2V0VG9rZW5pemVyKCkuZ2V0TGluZVRva2Vucyh0LGUpLHM9aS50b2tlbnMsbz1pLnN0YXRlO2lmKHMubGVuZ3RoJiZzW3MubGVuZ3RoLTFdLnR5cGU9PSJjb21tZW50IilyZXR1cm4gcjtpZihlPT0ic3RhcnQifHxlPT0ibm9fcmVnZXgiKXt2YXIgdT10Lm1hdGNoKC9eLiooPzpcYmNhc2VcYi4qOnxbXHtcKFxbXSlccyokLyk7dSYmKHIrPW4pfWVsc2UgaWYoZT09ImRvYy1zdGFydCIpe2lmKG89PSJzdGFydCJ8fG89PSJub19yZWdleCIpcmV0dXJuIiI7dmFyIHU9dC5tYXRjaCgvXlxzKihcLz8pXCovKTt1JiYodVsxXSYmKHIrPSIgIikscis9IiogIil9cmV0dXJuIHJ9LHRoaXMuY2hlY2tPdXRkZW50PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy4kb3V0ZGVudC5jaGVja091dGRlbnQodCxuKX0sdGhpcy5hdXRvT3V0ZGVudD1mdW5jdGlvbihlLHQsbil7dGhpcy4kb3V0ZGVudC5hdXRvT3V0ZGVudCh0LG4pfSx0aGlzLmNyZWF0ZVdvcmtlcj1mdW5jdGlvbihlKXt2YXIgdD1uZXcgdShbImFjZSJdLCJhY2UvbW9kZS9qYXZhc2NyaXB0X3dvcmtlciIsIkphdmFTY3JpcHRXb3JrZXIiKTtyZXR1cm4gdC5hdHRhY2hUb0RvY3VtZW50KGUuZ2V0RG9jdW1lbnQoKSksdC5vbigiYW5ub3RhdGUiLGZ1bmN0aW9uKHQpe2Uuc2V0QW5ub3RhdGlvbnModC5kYXRhKX0pLHQub24oInRlcm1pbmF0ZSIsZnVuY3Rpb24oKXtlLmNsZWFyQW5ub3RhdGlvbnMoKX0pLHR9LHRoaXMuJGlkPSJhY2UvbW9kZS9qYXZhc2NyaXB0In0uY2FsbChsLnByb3RvdHlwZSksdC5Nb2RlPWx9KTsgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGFjZS5yZXF1aXJlKFsiYWNlL21vZGUvamF2YXNjcmlwdCJdLCBmdW5jdGlvbihtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiICYmIHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIG1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBtOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSgpOwp9Cg==",
],
[
"редактор",
-"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICBmdW5jdGlvbiDQstCy0LXRgdGC0LjQoNC10LTQsNC60YLQvtGAKCkKICAgIHsKICAgICAgICB2YXIg0YDQtdC00LDQutGC0L7RgCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgINGA0LXQtNCw0LrRgtC+0YAuaWQgPSAi0YDQtdC00LDQutGC0L7RgCI7CiAgICAgICAg0YDQtdC00LDQutGC0L7RgC5zdHlsZS5jc3NUZXh0ID0gYAogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYDsKICAgICAgICB2YXIg0L7QsdC70LDRgdGC0YwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgi0LvQtdCy0LDRjy3QvtCx0LvQsNGB0YLRjCIpOwogICAgICAgINC+0LHQu9Cw0YHRgtGMLmFwcGVuZENoaWxkKNGA0LXQtNCw0LrRgtC+0YApOwogICAgICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgCA9IHdpbmRvdy5hY2UuZWRpdCgi0YDQtdC00LDQutGC0L7RgCIpOwogICAgICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgC5zZXNzaW9uLnNldE1vZGUoImFjZS9tb2RlL2phdmFzY3JpcHQiKTsKICAgIH0KICAgINC80YPRgNC+0Lwu0YHRgtCw0YDRgi7Qv9C+0LTQv9C40YHQsNGC0Ywo0LLQstC10YHRgtC40KDQtdC00LDQutGC0L7RgCk7Cn0=",
+"ZnVuY3Rpb24g0LzRg9GA0L7QvNCh0YLQsNGA0YIoKQp7CiAgICB2YXIg0YDQtdC00LDQutGC0L7RgCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAg0YDQtdC00LDQutGC0L7RgC5pZCA9ICLRgNC10LTQsNC60YLQvtGAIjsKICAgINGA0LXQtNCw0LrRgtC+0YAuc3R5bGUuY3NzVGV4dCA9ICJoZWlnaHQ6IDEwMCU7IjsKICAgIHZhciDQvtCx0LvQsNGB0YLRjCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCLQu9C10LLQsNGPLdC+0LHQu9Cw0YHRgtGMIik7CiAgICDQvtCx0LvQsNGB0YLRjC5hcHBlbmRDaGlsZCjRgNC10LTQsNC60YLQvtGAKTsKICAgINC80YPRgNC+0Lwu0YDQtdC00LDQutGC0L7RgCA9IHdpbmRvdy5hY2UuZWRpdCgi0YDQtdC00LDQutGC0L7RgCIpOwogICAg0LzRg9GA0L7QvC7RgNC10LTQsNC60YLQvtGALnNlc3Npb24uc2V0TW9kZSgiYWNlL21vZGUvamF2YXNjcmlwdCIpOwp9",
],
];