My Life Balance House: a tool for personal reflectionBy Martha Ramirez / August 13, 2026 LinkedIn Twitter/X Facebook WhatsApp Reddit Email Loading… PCFET0NUWVBFIGh0bWw+CjxodG1sPjxoZWFkPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CjxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIGluaXRpYWwtc2NhbGU9MSI+CjxzY3JpcHQ+Ly8gR0VORVJBVEVEIGZyb20gZGMtcnVudGltZS9zcmMvKi50cyDigJQgZG8gbm90IGVkaXQuIFJlYnVpbGQgd2l0aCBgY2QgZGMtcnVudGltZSAmJiBidW4gcnVuIGJ1aWxkYC4KInVzZSBzdHJpY3QiOwooKCkgPT4gewogIHZhciBfX2RlZlByb3AgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgdmFyIF9fZGVmTm9ybWFsUHJvcCA9IChvYmosIGtleSwgdmFsdWUpID0+IGtleSBpbiBvYmogPyBfX2RlZlByb3Aob2JqLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlLCB3cml0YWJsZTogdHJ1ZSwgdmFsdWUgfSkgOiBvYmpba2V5XSA9IHZhbHVlOwogIHZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gInN5bWJvbCIgPyBrZXkgKyAiIiA6IGtleSwgdmFsdWUpOwoKICAvLyBzcmMvcmVhY3QudHMKICBmdW5jdGlvbiBnZXRSZWFjdCgpIHsKICAgIGNvbnN0IFIgPSB3aW5kb3cuUmVhY3Q7CiAgICBpZiAoIVIpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0IGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUjsKICB9CiAgZnVuY3Rpb24gZ2V0UmVhY3RET00oKSB7CiAgICBjb25zdCBSRCA9IHdpbmRvdy5SZWFjdERPTTsKICAgIGlmICghUkQpIHRocm93IG5ldyBFcnJvcigiZGMtcnVudGltZTogd2luZG93LlJlYWN0RE9NIGlzIG5vdCBhdmFpbGFibGUgeWV0Iik7CiAgICByZXR1cm4gUkQ7CiAgfQogIHZhciBoID0gKCguLi5hcmdzKSA9PiBnZXRSZWFjdCgpLmNyZWF0ZUVsZW1lbnQoCiAgICAuLi5hcmdzCiAgKSk7CgogIC8vIHNyYy9wYXJzZS50cwogIGZ1bmN0aW9uIHBhcnNlRGNEb2N1bWVudChkb2MpIHsKICAgIGNvbnN0IGRjID0gZG9jLnF1ZXJ5U2VsZWN0b3IoIngtZGMiKTsKICAgIGlmICghZGMpIHJldHVybiBudWxsOwogICAgY29uc3Qgc2NyaXB0RWwgPSBkb2MucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZGMtc2NyaXB0XSIpOwogICAgY29uc3QgeyBwcm9wcywgcHJldmlldyB9ID0gcGFyc2VEYXRhUHJvcHMoCiAgICAgIHNjcmlwdEVsPy5nZXRBdHRyaWJ1dGUoImRhdGEtcHJvcHMiKSA/PyBudWxsCiAgICApOwogICAgcmV0dXJuIHsKICAgICAgdGVtcGxhdGU6IGRjLmlubmVySFRNTCwKICAgICAganM6IHNjcmlwdEVsID8gc2NyaXB0RWwudGV4dENvbnRlbnQgfHwgIiIgOiAiIiwKICAgICAgcHJvcHMsCiAgICAgIHByZXZpZXcKICAgIH07CiAgfQogIGZ1bmN0aW9uIHBhcnNlRGNUZXh0KHNyYykgewogICAgY29uc3Qgb3Blbk1hdGNoID0gLzx4LWRjKD86XHNbXj5dKik/Pi8uZXhlYyhzcmMpOwogICAgaWYgKCFvcGVuTWF0Y2gpIHJldHVybiBudWxsOwogICAgY29uc3QgY2xvc2UgPSBzcmMubGFzdEluZGV4T2YoIjwveC1kYz4iKTsKICAgIGlmIChjbG9zZSA9PT0gLTEgfHwgY2xvc2UgPCBvcGVuTWF0Y2guaW5kZXgpIHJldHVybiBudWxsOwogICAgY29uc3QgdGVtcGxhdGUgPSBzcmMuc2xpY2Uob3Blbk1hdGNoLmluZGV4ICsgb3Blbk1hdGNoWzBdLmxlbmd0aCwgY2xvc2UpOwogICAgY29uc3QgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhzcmMsICJ0ZXh0L2h0bWwiKTsKICAgIGNvbnN0IHNjcmlwdEVsID0gZG9jLnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWRjLXNjcmlwdF0iKTsKICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKAogICAgICBzY3JpcHRFbD8uZ2V0QXR0cmlidXRlKCJkYXRhLXByb3BzIikgPz8gbnVsbAogICAgKTsKICAgIHJldHVybiB7CiAgICAgIHRlbXBsYXRlLAogICAgICBqczogc2NyaXB0RWwgPyBzY3JpcHRFbC50ZXh0Q29udGVudCB8fCAiIiA6ICIiLAogICAgICBwcm9wcywKICAgICAgcHJldmlldwogICAgfTsKICB9CiAgZnVuY3Rpb24gcGFyc2VEYXRhUHJvcHMocmF3KSB7CiAgICBpZiAoIXJhdykgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIGxldCBwYXJzZWQ7CiAgICB0cnkgewogICAgICBwYXJzZWQgPSBKU09OLnBhcnNlKHJhdyk7CiAgICB9IGNhdGNoIHsKICAgICAgcmV0dXJuIHsgcHJvcHM6IG51bGwsIHByZXZpZXc6IG51bGwgfTsKICAgIH0KICAgIGlmICghcGFyc2VkIHx8IHR5cGVvZiBwYXJzZWQgIT09ICJvYmplY3QiIHx8IEFycmF5LmlzQXJyYXkocGFyc2VkKSkgewogICAgICByZXR1cm4geyBwcm9wczogbnVsbCwgcHJldmlldzogbnVsbCB9OwogICAgfQogICAgY29uc3Qgb2JqID0gcGFyc2VkOwogICAgY29uc3QgcHJldmlldyA9IG9iai4kcHJldmlldyAmJiB0eXBlb2Ygb2JqLiRwcmV2aWV3ID09PSAib2JqZWN0IiA/IG9iai4kcHJldmlldyA6IG51bGw7CiAgICBjb25zdCByZXN0ID0ge307CiAgICBmb3IgKGNvbnN0IGsgb2YgT2JqZWN0LmtleXMob2JqKSkgewogICAgICBpZiAoa1swXSAhPT0gIiQiKSByZXN0W2tdID0gb2JqW2tdOwogICAgfQogICAgcmV0dXJuIHsgcHJvcHM6IE9iamVjdC5rZXlzKHJlc3QpLmxlbmd0aCA/IHJlc3QgOiBudWxsLCBwcmV2aWV3IH07CiAgfQogIGZ1bmN0aW9uIGRjTmFtZUZyb21QYXRoKHBhdGhuYW1lKSB7CiAgICBsZXQgcCA9IHBhdGhuYW1lIHx8ICIiOwogICAgdHJ5IHsKICAgICAgcCA9IGRlY29kZVVSSUNvbXBvbmVudChwKTsKICAgIH0gY2F0Y2ggewogICAgfQogICAgY29uc3QgYmFzZSA9IHAuc3BsaXQoIi8iKS5wb3AoKSB8fCAiUm9vdCI7CiAgICByZXR1cm4gYmFzZS5yZXBsYWNlKC9cLmRjXC5odG1sJC8sICIiKS5yZXBsYWNlKC9cLmh0bWw/JC8sICIiKSB8fCAiUm9vdCI7CiAgfQoKICAvLyBzcmMvYm9vdC50cwogIHZhciBCQVNFX0NTUyA9IGAKICAgIC5zYy1wbGFjZWhvbGRlcntiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjoxcHggc29saWQgY29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUwJSx0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW59CiAgICBAa2V5ZnJhbWVzIHNjLXNoaW5lezAle2JhY2tncm91bmQtcG9zaXRpb246MTAwJSA1MCV9MTAwJXtiYWNrZ3JvdW5kLXBvc2l0aW9uOjAlIDUwJX19CiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtcGxhY2Vob2xkZXIsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmd7cG9zaXRpb246cmVsYXRpdmU7CiAgICAgIGJhY2tncm91bmQ6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDUlLHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOjpiZWZvcmUsCiAgICBodG1sLnNjLWRjLXN0cmVhbWluZyAuc2MtaW50ZXJwLnNjLW1pc3Npbmc6OmJlZm9yZXtjb250ZW50OicnOwogICAgICBwb3NpdGlvbjphYnNvbHV0ZTtpbnNldDowO3BvaW50ZXItZXZlbnRzOm5vbmU7CiAgICAgIGJhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KDkwZGVnLHJnYmEoMjE3LDExOSw4NywwKSAyNSUscmdiYSgyNDcsMjI1LDIxMSwuOTUpIDM3JSxyZ2JhKDIxNywxMTksODcsMCkgNjMlKTsKICAgICAgYmFja2dyb3VuZC1zaXplOjQwMCUgMTAwJTthbmltYXRpb246c2Mtc2hpbmUgMS40cyBlYXNlIGluZmluaXRlfQogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLXBsYWNlaG9sZGVyOm50aC1jaGlsZChuKzkgb2YgLnNjLXBsYWNlaG9sZGVyKTo6YmVmb3JlLAogICAgaHRtbC5zYy1kYy1zdHJlYW1pbmcgLnNjLWludGVycC5zYy1taXNzaW5nOm50aC1jaGlsZChuKzkgb2YgLnNjLWludGVycC5zYy1taXNzaW5nKTo6YmVmb3Jle2FuaW1hdGlvbjpub25lOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA4JSx0cmFuc3BhcmVudCl9CiAgICAuc2MtcGxhY2Vob2xkZXItZXJyb3J7cGFkZGluZzo0cHggOHB4O2ZvbnQ6MTFweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgY29sb3I6Y29sb3ItbWl4KGluIHNyZ2IsY3VycmVudENvbG9yIDcwJSx0cmFuc3BhcmVudCk7d29yZC1icmVhazpicmVhay13b3JkfQogICAgLnNjLWludGVycC5zYy1taXNzaW5ne2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjJlbTtoZWlnaHQ6MWVtO292ZXJmbG93OmhpZGRlbjsKICAgICAgdmVydGljYWwtYWxpZ246dGV4dC1ib3R0b207YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtib3JkZXI6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjUpOwogICAgICBib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7Y29sb3I6dHJhbnNwYXJlbnQ7CiAgICAgIHVzZXItc2VsZWN0Om5vbmV9CiAgICAuc2MtaW50ZXJwLnNjLXVucmVzb2x2ZWR7Zm9udC1mYW1pbHk6dWktbW9ub3NwYWNlLG1vbm9zcGFjZTtmb250LXNpemU6Ljg1ZW07CiAgICAgIGNvbG9yOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciA1MCUsdHJhbnNwYXJlbnQpOwogICAgICBiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLGN1cnJlbnRDb2xvciAxMCUsdHJhbnNwYXJlbnQpO2JvcmRlci1yYWRpdXM6M3B4OwogICAgICBwYWRkaW5nOjAgM3B4fQogICAgLnNjLWhvc3Quc2MtaGFzLWVycm9ye3Bvc2l0aW9uOnJlbGF0aXZlfQogICAgLnNjLWxvZ2ljLWVycm9ye3Bvc2l0aW9uOmFic29sdXRlO3RvcDo4cHg7bGVmdDo4cHg7ei1pbmRleDoyMTQ3NDgzNjQ3O21heC13aWR0aDo2MGNoOwogICAgICBwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6I2IwMDAyMDtjb2xvcjojZmZmO2ZvbnQ6MTJweC8xLjQgdWktbW9ub3NwYWNlLG1vbm9zcGFjZTsKICAgICAgYm9yZGVyLXJhZGl1czo0cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7cG9pbnRlci1ldmVudHM6bm9uZX0KICAgIC8qIE1pcnJvcnMgUFJJTlRfQkFTRUxJTkVfQ1NTIGluIGFwcHMvd2ViIGRlY2stc3RhZ2UtZXhwb3J0LnRzIFx1MjAxNCBrZWVwIGJvdGgKICAgICAgIGluIHN5bmMgdW50aWwgZGMtcnVudGltZSByZWdhaW5zIGEgYnVpbGQgc3RlcC4gKi8KICAgIEBtZWRpYSBwcmludCB7CiAgICAgIEBwYWdlIHsgbWFyZ2luOiAwLjVjbTsgfQogICAgICBmaWd1cmUsIHRhYmxlIHsgYnJlYWstaW5zaWRlOiBhdm9pZDsgfQogICAgICAjZGMtcm9vdCwgI2RjLXJvb3QgPiAuc2MtaG9zdCB7IGhlaWdodDogYXV0bzsgfQogICAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsKICAgICAgICBwcmludC1jb2xvci1hZGp1c3Q6IGV4YWN0OyAtd2Via2l0LXByaW50LWNvbG9yLWFkanVzdDogZXhhY3Q7CiAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7IC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtOTlzICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1kdXJhdGlvbjogLjAwMXMgIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxICFpbXBvcnRhbnQ7IGFuaW1hdGlvbi1maWxsLW1vZGU6IGJvdGggIWltcG9ydGFudDsKICAgICAgICBhbmltYXRpb24tcGxheS1zdGF0ZTogcnVubmluZyAhaW1wb3J0YW50OyB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwcyAhaW1wb3J0YW50OwogICAgICB9CiAgICB9CiAgYDsKICB2YXIgRlVMTF9QQUdFX0NTUyA9ICJodG1sLGJvZHl7aGVpZ2h0OjEwMCU7bWFyZ2luOjB9I2RjLXJvb3QsI2RjLXJvb3Q+LnNjLWhvc3R7aGVpZ2h0OjEwMCV9IjsKICBmdW5jdGlvbiByb290TmFtZUZvckRvY3VtZW50KGRvYywgbG9jKSB7CiAgICBsZXQgYm9vdFBhdGggPSBsb2MucGF0aG5hbWUgfHwgIiI7CiAgICBpZiAoIS9cLmRjXC5odG1sPyQvaS50ZXN0KHNhZmVEZWNvZGUoYm9vdFBhdGgpKSkgewogICAgICB0cnkgewogICAgICAgIGJvb3RQYXRoID0gbmV3IFVSTChkb2MuYmFzZVVSSSB8fCAiLyIpLnBhdGhuYW1lOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRjTmFtZUZyb21QYXRoKGJvb3RQYXRoKTsKICB9CiAgZnVuY3Rpb24gc2FmZURlY29kZShzKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHMpOwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBzOwogICAgfQogIH0KICBmdW5jdGlvbiBib290KHJ1bnRpbWUsIGRvYyA9IGRvY3VtZW50KSB7CiAgICBjb25zdCBwYXJzZWQgPSBwYXJzZURjRG9jdW1lbnQoZG9jKTsKICAgIGlmICghcGFyc2VkKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IFJlYWN0ID0gZ2V0UmVhY3QoKTsKICAgIGNvbnN0IHJvb3ROYW1lID0gcm9vdE5hbWVGb3JEb2N1bWVudChkb2MsIGxvY2F0aW9uKTsKICAgIHJ1bnRpbWUubWFya0ZldGNoZWQocm9vdE5hbWUpOwogICAgcnVudGltZS5zZXRSb290TmFtZShyb290TmFtZSk7CiAgICBydW50aW1lLmFkb3B0UGFyc2VkKHJvb3ROYW1lLCBwYXJzZWQpOwogICAgaWYgKCF3aW5kb3cuX19yZXNvdXJjZXMpIHsKICAgICAgZmV0Y2gobG9jYXRpb24uaHJlZikudGhlbigocmVzKSA9PiByZXMub2sgPyByZXMudGV4dCgpIDogIiIpLnRoZW4oKHQpID0+IHsKICAgICAgICBjb25zdCByYXcgPSB0ID8gcGFyc2VEY1RleHQodCkgOiBudWxsOwogICAgICAgIGlmIChyYXc/LnRlbXBsYXRlKSBydW50aW1lLnVwZGF0ZUh0bWwocm9vdE5hbWUsIHJhdy50ZW1wbGF0ZSk7CiAgICAgIH0pLmNhdGNoKCgpID0+IHsKICAgICAgfSk7CiAgICB9CiAgICBjb25zdCBkYyA9IGRvYy5xdWVyeVNlbGVjdG9yKCJ4LWRjIik7CiAgICBjb25zdCBob3N0RWwgPSBkb2MuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICBob3N0RWwuaWQgPSAiZGMtcm9vdCI7CiAgICBkYy5yZXBsYWNlV2l0aChob3N0RWwpOwogICAgaWYgKCFwYXJzZWQucHJldmlldykgewogICAgICBjb25zdCBzID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgIHMudGV4dENvbnRlbnQgPSBGVUxMX1BBR0VfQ1NTOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0KICAgIGNvbnN0IFJvb3QgPSBydW50aW1lLmdldERDKHJvb3ROYW1lKTsKICAgIGNvbnN0IGVudHJ5ID0gcnVudGltZS5yZWdpc3RyeS5nZXQocm9vdE5hbWUpOwogICAgZnVuY3Rpb24gU3RhbmRhbG9uZVJvb3QoKSB7CiAgICAgIGNvbnN0IFssIHNldFRpY2tdID0gUmVhY3QudXNlU3RhdGUoMCk7CiAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7CiAgICAgICAgY29uc3Qgc3ViID0gKCkgPT4gc2V0VGljaygobikgPT4gbiArIDEpOwogICAgICAgIGVudHJ5LnN1YnMuYWRkKHN1Yik7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgIGVudHJ5LnN1YnMuZGVsZXRlKHN1Yik7CiAgICAgICAgfTsKICAgICAgfSwgW10pOwogICAgICBjb25zdCBkZWZhdWx0cyA9IFJlYWN0LnVzZU1lbW8oKCkgPT4gewogICAgICAgIGNvbnN0IGQgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IGsgaW4gZW50cnkucHJvcHNNZXRhIHx8IHt9KSB7CiAgICAgICAgICBjb25zdCB2ID0gZW50cnkucHJvcHNNZXRhPy5ba10/LmRlZmF1bHQ7CiAgICAgICAgICBpZiAodiAhPT0gdm9pZCAwKSBkW2tdID0gdjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGQ7CiAgICAgIH0sIFtlbnRyeS5wcm9wc01ldGFdKTsKICAgICAgcmV0dXJuIGgoUm9vdCwgeyAuLi5kZWZhdWx0cywgLi4uZW50cnkucHJvcE92ZXJyaWRlcyB8fCB7fSB9KTsKICAgIH0KICAgIGNvbnN0IFJlYWN0RE9NID0gZ2V0UmVhY3RET00oKTsKICAgIGlmIChSZWFjdERPTS5jcmVhdGVSb290KQogICAgICBSZWFjdERPTS5jcmVhdGVSb290KGhvc3RFbCkucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpKTsKICAgIGVsc2UgUmVhY3RET00ucmVuZGVyKGgoU3RhbmRhbG9uZVJvb3QpLCBob3N0RWwpOwogICAgcmV0dXJuIHJvb3ROYW1lOwogIH0KCiAgLy8gc3JjL2V4cHIudHMKICB2YXIgSURFTlRfUkUgPSAvXltBLVphLXpfJF1bQS1aYS16MC05XyRdKi87CiAgdmFyIE5VTUJFUl9SRSA9IC9eLT9cZCsoXC5cZCspPyQvOwogIGZ1bmN0aW9uIHJlc29sdmUodmFscywgc3JjKSB7CiAgICBjb25zdCBleHByID0gU3RyaW5nKHNyYykudHJpbSgpOwogICAgaWYgKCFleHByKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKGV4cHJbMF0gPT09ICIoIiAmJiBleHByW2V4cHIubGVuZ3RoIC0gMV0gPT09ICIpIiAmJiBwYXJlbnNXcmFwV2hvbGUoZXhwcikpIHsKICAgICAgcmV0dXJuIHJlc29sdmUodmFscywgZXhwci5zbGljZSgxLCAtMSkpOwogICAgfQogICAgY29uc3QgZXEgPSBmaW5kVG9wTGV2ZWxFcXVhbGl0eShleHByKTsKICAgIGlmIChlcSkgewogICAgICBjb25zdCBsdiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZSgwLCBlcS5pbmRleCkpOwogICAgICBjb25zdCBydiA9IHJlc29sdmUodmFscywgZXhwci5zbGljZShlcS5pbmRleCArIGVxLm9wLmxlbmd0aCkpOwogICAgICBzd2l0Y2ggKGVxLm9wKSB7CiAgICAgICAgY2FzZSAiPT09IjoKICAgICAgICAgIHJldHVybiBsdiA9PT0gcnY7CiAgICAgICAgY2FzZSAiIT09IjoKICAgICAgICAgIHJldHVybiBsdiAhPT0gcnY7CiAgICAgICAgY2FzZSAiPT0iOgogICAgICAgICAgcmV0dXJuIGx2ID09IHJ2OwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICByZXR1cm4gbHYgIT0gcnY7CiAgICAgIH0KICAgIH0KICAgIGlmIChleHByWzBdID09PSAiISIpIHJldHVybiAhcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKDEpKTsKICAgIGlmIChleHByID09PSAidHJ1ZSIpIHJldHVybiB0cnVlOwogICAgaWYgKGV4cHIgPT09ICJmYWxzZSIpIHJldHVybiBmYWxzZTsKICAgIGlmIChleHByID09PSAibnVsbCIpIHJldHVybiBudWxsOwogICAgaWYgKGV4cHIgPT09ICJ1bmRlZmluZWQiKSByZXR1cm4gdm9pZCAwOwogICAgaWYgKE5VTUJFUl9SRS50ZXN0KGV4cHIpKSByZXR1cm4gTnVtYmVyKGV4cHIpOwogICAgaWYgKGV4cHIubGVuZ3RoID49IDIgJiYgKGV4cHJbMF0gPT09ICciJyB8fCBleHByWzBdID09PSAiJyIpICYmIGV4cHJbZXhwci5sZW5ndGggLSAxXSA9PT0gZXhwclswXSkgewogICAgICByZXR1cm4gZXhwci5zbGljZSgxLCAtMSk7CiAgICB9CiAgICByZXR1cm4gcmVzb2x2ZVBhdGgodmFscywgZXhwcik7CiAgfQogIGZ1bmN0aW9uIHBhcmVuc1dyYXBXaG9sZShleHByKSB7CiAgICBsZXQgZGVwdGggPSAwOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHByLmxlbmd0aCAtIDE7IGkrKykgewogICAgICBpZiAoZXhwcltpXSA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChleHByW2ldID09PSAiKSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PT0gMCkgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gZmluZFRvcExldmVsRXF1YWxpdHkoZXhwcikgewogICAgbGV0IGRlcHRoID0gMDsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwci5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjID0gZXhwcltpXTsKICAgICAgaWYgKGMgPT09ICJbIiB8fCBjID09PSAiKCIpIGRlcHRoKys7CiAgICAgIGVsc2UgaWYgKGMgPT09ICJdIiB8fCBjID09PSAiKSIpIGRlcHRoLS07CiAgICAgIGVsc2UgaWYgKGRlcHRoID09PSAwICYmIChjID09PSAiPSIgfHwgYyA9PT0gIiEiKSAmJiBleHByW2kgKyAxXSA9PT0gIj0iKSB7CiAgICAgICAgaWYgKGkgPiAwICYmIChleHByW2kgLSAxXSA9PT0gIj0iIHx8IGV4cHJbaSAtIDFdID09PSAiISIpKSBjb250aW51ZTsKICAgICAgICBpZiAoIWV4cHIuc2xpY2UoMCwgaSkudHJpbSgpKSBjb250aW51ZTsKICAgICAgICBjb25zdCBvcCA9IGV4cHJbaSArIDJdID09PSAiPSIgPyBjICsgIj09IiA6IGMgKyAiPSI7CiAgICAgICAgcmV0dXJuIHsgaW5kZXg6IGksIG9wIH07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KICBmdW5jdGlvbiByZXNvbHZlUGF0aCh2YWxzLCBleHByKSB7CiAgICBjb25zdCBoZWFkID0gZXhwci5tYXRjaChJREVOVF9SRSk7CiAgICBpZiAoIWhlYWQpIHJldHVybiB2b2lkIDA7CiAgICBsZXQgY3VyID0gdmFscyA9PSBudWxsID8gdm9pZCAwIDogdmFsc1toZWFkWzBdXTsKICAgIGxldCBpID0gaGVhZFswXS5sZW5ndGg7CiAgICB3aGlsZSAoaSA8IGV4cHIubGVuZ3RoKSB7CiAgICAgIGlmIChleHByW2ldID09PSAiLiIpIHsKICAgICAgICBjb25zdCBtID0gZXhwci5zbGljZShpICsgMSkubWF0Y2goSURFTlRfUkUpIHx8IGV4cHIuc2xpY2UoaSArIDEpLm1hdGNoKC9eXGQrLyk7CiAgICAgICAgaWYgKCFtKSByZXR1cm4gdm9pZCAwOwogICAgICAgIGN1ciA9IGN1ciA9PSBudWxsID8gdm9pZCAwIDogY3VyW21bMF1dOwogICAgICAgIGkgKz0gMSArIG1bMF0ubGVuZ3RoOwogICAgICB9IGVsc2UgaWYgKGV4cHJbaV0gPT09ICJbIikgewogICAgICAgIGxldCBkZXB0aCA9IDE7CiAgICAgICAgbGV0IGogPSBpICsgMTsKICAgICAgICB3aGlsZSAoaiA8IGV4cHIubGVuZ3RoICYmIGRlcHRoID4gMCkgewogICAgICAgICAgaWYgKGV4cHJbal0gPT09ICJbIikgZGVwdGgrKzsKICAgICAgICAgIGVsc2UgaWYgKGV4cHJbal0gPT09ICJdIikgewogICAgICAgICAgICBkZXB0aC0tOwogICAgICAgICAgICBpZiAoZGVwdGggPT09IDApIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaisrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVwdGggIT09IDApIHJldHVybiB2b2lkIDA7CiAgICAgICAgY29uc3Qga2V5ID0gcmVzb2x2ZSh2YWxzLCBleHByLnNsaWNlKGkgKyAxLCBqKSk7CiAgICAgICAgY3VyID0gY3VyID09IG51bGwgPyB2b2lkIDAgOiBjdXJba2V5XTsKICAgICAgICBpID0gaiArIDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGN1cjsKICB9CgogIC8vIHNyYy9lbmNvZGUudHMKICB2YXIgQ0FNRUxfQVRUUiA9ICJzYy1jYW1lbC0iOwogIHZhciBJTkxJTkVfVEVYVF9UQUdTID0gbmV3IFNldCgKICAgICJhIGFiYnIgYiBiZGkgYmRvIGJyIGNpdGUgY29kZSBkZWwgZGZuIGVtIGkgaW5zIGtiZCBtYXJrIHEgcyBzYW1wIHNtYWxsIHNwYW4gc3RyaWtlIHN0cm9uZyBzdWIgc3VwIHUgdmFyIHdiciIuc3BsaXQoCiAgICAgICIgIgogICAgKQogICk7CiAgdmFyIFJBV19XUkFQID0gewogICAgc2VsZWN0OiAic2MtcmF3LXNlbGVjdCIsCiAgICB0YWJsZTogInNjLXJhdy10YWJsZSIsCiAgICB0Ym9keTogInNjLXJhdy10Ym9keSIsCiAgICB0aGVhZDogInNjLXJhdy10aGVhZCIsCiAgICB0Zm9vdDogInNjLXJhdy10Zm9vdCIsCiAgICB0cjogInNjLXJhdy10ciIsCiAgICB0ZDogInNjLXJhdy10ZCIsCiAgICB0aDogInNjLXJhdy10aCIsCiAgICBjYXB0aW9uOiAic2MtcmF3LWNhcHRpb24iCiAgfTsKICB2YXIgUkFXX1VOV1JBUCA9IE9iamVjdC5mcm9tRW50cmllcygKICAgIE9iamVjdC5lbnRyaWVzKFJBV19XUkFQKS5tYXAoKFtrLCB2XSkgPT4gW3YsIGtdKQogICk7CiAgdmFyIEVWRU5UX01BUCA9IHsKICAgIG9uY2xpY2s6ICJvbkNsaWNrIiwKICAgIG9uY2hhbmdlOiAib25DaGFuZ2UiLAogICAgb25pbnB1dDogIm9uSW5wdXQiLAogICAgb25zdWJtaXQ6ICJvblN1Ym1pdCIsCiAgICBvbmtleWRvd246ICJvbktleURvd24iLAogICAgb25rZXl1cDogIm9uS2V5VXAiLAogICAgb25rZXlwcmVzczogIm9uS2V5UHJlc3MiLAogICAgb25tb3VzZWRvd246ICJvbk1vdXNlRG93biIsCiAgICBvbm1vdXNldXA6ICJvbk1vdXNlVXAiLAogICAgb25tb3VzZWVudGVyOiAib25Nb3VzZUVudGVyIiwKICAgIG9ubW91c2VsZWF2ZTogIm9uTW91c2VMZWF2ZSIsCiAgICBvbmZvY3VzOiAib25Gb2N1cyIsCiAgICBvbmJsdXI6ICJvbkJsdXIiLAogICAgb25kb3VibGVjbGljazogIm9uRG91YmxlQ2xpY2siLAogICAgb25jb250ZXh0bWVudTogIm9uQ29udGV4dE1lbnUiLAogICAgb25tb3VzZW1vdmU6ICJvbk1vdXNlTW92ZSIsCiAgICBvbm1vdXNlb3ZlcjogIm9uTW91c2VPdmVyIiwKICAgIG9ubW91c2VvdXQ6ICJvbk1vdXNlT3V0IiwKICAgIG9ucG9pbnRlcmRvd246ICJvblBvaW50ZXJEb3duIiwKICAgIG9ucG9pbnRlcnVwOiAib25Qb2ludGVyVXAiLAogICAgb25wb2ludGVybW92ZTogIm9uUG9pbnRlck1vdmUiLAogICAgb25wb2ludGVyZW50ZXI6ICJvblBvaW50ZXJFbnRlciIsCiAgICBvbnBvaW50ZXJsZWF2ZTogIm9uUG9pbnRlckxlYXZlIiwKICAgIG9ucG9pbnRlcmNhbmNlbDogIm9uUG9pbnRlckNhbmNlbCIsCiAgICBvbnBvaW50ZXJvdmVyOiAib25Qb2ludGVyT3ZlciIsCiAgICBvbnBvaW50ZXJvdXQ6ICJvblBvaW50ZXJPdXQiLAogICAgb25nb3Rwb2ludGVyY2FwdHVyZTogIm9uR290UG9pbnRlckNhcHR1cmUiLAogICAgb25sb3N0cG9pbnRlcmNhcHR1cmU6ICJvbkxvc3RQb2ludGVyQ2FwdHVyZSIsCiAgICBvbnRvdWNoc3RhcnQ6ICJvblRvdWNoU3RhcnQiLAogICAgb250b3VjaGVuZDogIm9uVG91Y2hFbmQiLAogICAgb250b3VjaG1vdmU6ICJvblRvdWNoTW92ZSIsCiAgICBvbnRvdWNoY2FuY2VsOiAib25Ub3VjaENhbmNlbCIsCiAgICBvbmRyYWdzdGFydDogIm9uRHJhZ1N0YXJ0IiwKICAgIG9uZHJhZ2VuZDogIm9uRHJhZ0VuZCIsCiAgICBvbmRyYWdlbnRlcjogIm9uRHJhZ0VudGVyIiwKICAgIG9uZHJhZ2xlYXZlOiAib25EcmFnTGVhdmUiLAogICAgb25kcmFnb3ZlcjogIm9uRHJhZ092ZXIiLAogICAgb25hbmltYXRpb25zdGFydDogIm9uQW5pbWF0aW9uU3RhcnQiLAogICAgb25hbmltYXRpb25lbmQ6ICJvbkFuaW1hdGlvbkVuZCIsCiAgICBvbmFuaW1hdGlvbml0ZXJhdGlvbjogIm9uQW5pbWF0aW9uSXRlcmF0aW9uIiwKICAgIG9udHJhbnNpdGlvbmVuZDogIm9uVHJhbnNpdGlvbkVuZCIKICB9OwogIHZhciBBVFRSUyA9IGAoPzpbXj4iJ118IlteIl0qInwnW14nXSonKSpgOwogIHZhciBJTVBPUlRfU0VMRl9DTE9TRV9SRSA9IG5ldyBSZWdFeHAoCiAgICAiPCh4LWltcG9ydHxkYy1pbXBvcnQpKCIgKyBBVFRSUyArICIpLz4iLAogICAgImdpIgogICk7CiAgdmFyIENBTUVMX0FUVFJfUkUgPSAvKFxzKShbYS16XStbQS1aXVtBLVphLXowLTldKikoXHMqPSkvZzsKICBmdW5jdGlvbiBlbmNvZGVDYW1lbEF0dHJzKGh0bWwpIHsKICAgIHJldHVybiBodG1sLnJlcGxhY2UoCiAgICAgIENBTUVMX0FUVFJfUkUsCiAgICAgIChfLCBzcCwgbmFtZSwgZXEpID0+IHNwICsgQ0FNRUxfQVRUUiArIG5hbWUucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSkgKyBlcQogICAgKTsKICB9CiAgZnVuY3Rpb24gZW5jb2RlQ2FzZShodG1sKSB7CiAgICBodG1sID0gaHRtbC5yZXBsYWNlKAogICAgICBJTVBPUlRfU0VMRl9DTE9TRV9SRSwKICAgICAgKF8sIHQsIGEpID0+ICI8IiArIHQgKyBhICsgIj48LyIgKyB0ICsgIj4iCiAgICApOwogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvPGhlbG1ldChcc3w+KS9naSwgIjxzYy1oZWxtZXQkMSIpOwogICAgaHRtbCA9IGh0bWwucmVwbGFjZSgvPFwvaGVsbWV0XHMqPi9naSwgIjwvc2MtaGVsbWV0PiIpOwogICAgaHRtbCA9IGVuY29kZUNhbWVsQXR0cnMoaHRtbCk7CiAgICBmb3IgKGNvbnN0IFtyZWFsLCBhbGlhc10gb2YgT2JqZWN0LmVudHJpZXMoUkFXX1dSQVApKSB7CiAgICAgIGh0bWwgPSBodG1sLnJlcGxhY2UoCiAgICAgICAgbmV3IFJlZ0V4cCgiKDwvPykiICsgcmVhbCArICIoPz1bXFxzPl0pIiwgImdpIiksCiAgICAgICAgIiQxIiArIGFsaWFzCiAgICAgICk7CiAgICB9CiAgICByZXR1cm4gaHRtbDsKICB9CiAgZnVuY3Rpb24ga2ViYWJUb0NhbWVsKHMpIHsKICAgIHJldHVybiBzLnJlcGxhY2UoLy0oW2Etel0pL2csIChfLCBjKSA9PiBjLnRvVXBwZXJDYXNlKCkpOwogIH0KICBmdW5jdGlvbiBjc3NUb09iaihjc3MpIHsKICAgIGNvbnN0IG8gPSB7fTsKICAgIGZvciAoY29uc3QgZGVjbCBvZiBjc3Muc3BsaXQoIjsiKSkgewogICAgICBjb25zdCBpID0gZGVjbC5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpIDwgMCkgY29udGludWU7CiAgICAgIGNvbnN0IHByb3AgPSBkZWNsLnNsaWNlKDAsIGkpLnRyaW0oKTsKICAgICAgb1twcm9wLnN0YXJ0c1dpdGgoIi0tIikgPyBwcm9wIDoga2ViYWJUb0NhbWVsKHByb3ApXSA9IGRlY2wuc2xpY2UoaSArIDEpLnRyaW0oKTsKICAgIH0KICAgIHJldHVybiBvOwogIH0KICBmdW5jdGlvbiBjb21waWxlQXR0cihyYXcpIHsKICAgIGNvbnN0IHdob2xlID0gcmF3Lm1hdGNoKC9eXHMqXHtceyhbXHNcU10rPylcfVx9XHMqJC8pOwogICAgaWYgKHdob2xlKSB7CiAgICAgIGNvbnN0IHBhdGggPSB3aG9sZVsxXTsKICAgICAgcmV0dXJuICh2YWxzKSA9PiByZXNvbHZlKHZhbHMsIHBhdGgpOwogICAgfQogICAgaWYgKHJhdy5pbmNsdWRlcygie3siKSkgewogICAgICBjb25zdCBwYXJ0cyA9IHJhdy5zcGxpdCgvXHtceyhbXHNcU10rPylcfVx9L2cpOwogICAgICByZXR1cm4gKHZhbHMpID0+IHBhcnRzLm1hcCgocywgaSkgPT4gaSAmIDEgPyByZXNvbHZlKHZhbHMsIHMpID8/ICIiIDogcykuam9pbigiIik7CiAgICB9CiAgICByZXR1cm4gKCkgPT4gcmF3OwogIH0KCiAgLy8gc3JjL2NvbXBpbGUudHMKICBmdW5jdGlvbiBjb2xsZWN0UHJvcHMobm9kZSwga2luZCwgaG9zdCkgewogICAgY29uc3QgcHJvcEdldHRlcnMgPSBbXTsKICAgIGNvbnN0IHBzZXVkb0NsYXNzZXMgPSBbXTsKICAgIGxldCBoaW50U2l6ZSA9IG51bGw7CiAgICBmb3IgKGNvbnN0IHsgbmFtZSwgdmFsdWUgfSBvZiBbLi4ubm9kZS5hdHRyaWJ1dGVzXSkgewogICAgICBpZiAobmFtZSA9PT0gInNjLW5hbWUiIHx8IG5hbWUgPT09ICJkYXRhLWRjLXRwbCIpIGNvbnRpbnVlOwogICAgICBsZXQga2V5ID0gbmFtZTsKICAgICAgaWYgKGtleS5zdGFydHNXaXRoKENBTUVMX0FUVFIpKQogICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkuc2xpY2UoQ0FNRUxfQVRUUi5sZW5ndGgpKTsKICAgICAgaWYgKGtleSA9PT0gImhpbnQtc2l6ZSIpIHsKICAgICAgICBoaW50U2l6ZSA9IHZhbHVlOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgic3R5bGUtIikpIHsKICAgICAgICBwc2V1ZG9DbGFzc2VzLnB1c2goaG9zdC5wc2V1ZG9DbGFzcyhrZXkuc2xpY2UoNiksIHZhbHVlKSk7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGtpbmQgIT09ICJkb20iKSB7CiAgICAgICAgaWYgKGtleS5pbmNsdWRlcygiLSIpICYmICEoa2luZCA9PT0gIngtaW1wb3J0IiAmJiAoa2V5LnN0YXJ0c1dpdGgoImFyaWEtIikgfHwga2V5LnN0YXJ0c1dpdGgoImRhdGEtIikpKSkKICAgICAgICAgIGtleSA9IGtlYmFiVG9DYW1lbChrZXkpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChrZXkgPT09ICJjbGFzcyIpIGtleSA9ICJjbGFzc05hbWUiOwogICAgICAgIGVsc2UgaWYgKGtleSA9PT0gImZvciIpIGtleSA9ICJodG1sRm9yIjsKICAgICAgICBlbHNlIGlmIChrZXkuc3RhcnRzV2l0aCgib24iKSkKICAgICAgICAgIGtleSA9IEVWRU5UX01BUFtrZXldIHx8ICJvbiIgKyBrZXlbMl0udG9VcHBlckNhc2UoKSArIGtleS5zbGljZSgzKTsKICAgICAgfQogICAgICBwcm9wR2V0dGVycy5wdXNoKFtrZXksIGNvbXBpbGVBdHRyKHZhbHVlKV0pOwogICAgfQogICAgcmV0dXJuIHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMsIGhpbnRTaXplIH07CiAgfQogIHZhciBIT1NUX1NUWUxFX1BST1BTID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoWwogICAgInBvc2l0aW9uIiwKICAgICJsZWZ0IiwKICAgICJyaWdodCIsCiAgICAidG9wIiwKICAgICJib3R0b20iLAogICAgImluc2V0IiwKICAgICJ3aWR0aCIsCiAgICAiaGVpZ2h0IiwKICAgICJ6LWluZGV4IiwKICAgICJ0cmFuc2Zvcm0iCiAgXSk7CiAgZnVuY3Rpb24gaG9zdFBvc2l0aW9uU3R5bGUoc3R5bGUpIHsKICAgIGNvbnN0IGFsbCA9IHR5cGVvZiBzdHlsZSA9PT0gInN0cmluZyIgPyBjc3NUb09iaihzdHlsZSkgOiBzdHlsZSAhPSBudWxsICYmIHR5cGVvZiBzdHlsZSA9PT0gIm9iamVjdCIgPyBzdHlsZSA6IG51bGw7CiAgICBpZiAoIWFsbCkgcmV0dXJuIHZvaWQgMDsKICAgIGNvbnN0IG91dCA9IHt9OwogICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoYWxsKSkgewogICAgICBjb25zdCBrZWJhYiA9IGsucmVwbGFjZSgvW0EtWl0vZywgKGMpID0+ICItIiArIGMudG9Mb3dlckNhc2UoKSk7CiAgICAgIGlmIChIT1NUX1NUWUxFX1BST1BTLmhhcyhrZWJhYikpIG91dFtrXSA9IHY7CiAgICB9CiAgICByZXR1cm4gT2JqZWN0LmtleXMob3V0KS5sZW5ndGggPyBvdXQgOiB2b2lkIDA7CiAgfQogIGZ1bmN0aW9uIGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KSB7CiAgICBjb25zdCB0cGwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpOwogICAgLy8hIG5vc2VtZ3JlcDogZGlyZWN0LWlubmVyLWh0bWwtYXNzaWdubWVudAogICAgdHBsLmlubmVySFRNTCA9IGVuY29kZUNhc2UoaHRtbCk7CiAgICBsZXQgdHBsTiA9IDA7CiAgICAoZnVuY3Rpb24gc3RhbXAobm9kZSkgewogICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiLCBTdHJpbmcodHBsTisrKSk7CiAgICAgIH0KICAgICAgZm9yIChjb25zdCBjIG9mIG5vZGUuY2hpbGROb2Rlcykgc3RhbXAoYyk7CiAgICB9KSh0cGwuY29udGVudCk7CiAgICBjb25zdCBidWlsZGVycyA9IHdhbGtDaGlsZHJlbih0cGwuY29udGVudCwgaG9zdCk7CiAgICBjb25zdCByZW5kZXIgPSAoKHZhbHMsIGN0eCkgPT4gYnVpbGRlcnMubWFwKChiLCBpKSA9PiBiKHZhbHMgfHwge30sIGN0eCwgaSkpKTsKICAgIHJlbmRlci5fX2Fubm90YXRlZCA9IHRwbC5pbm5lckhUTUw7CiAgICByZXR1cm4gcmVuZGVyOwogIH0KICBmdW5jdGlvbiB3YWxrQ2hpbGRyZW4obm9kZSwgaG9zdCkgewogICAgcmV0dXJuIFsuLi5ub2RlLmNoaWxkTm9kZXNdLm1hcCgoYykgPT4gd2FsayhjLCBob3N0KSkuZmlsdGVyKChiKSA9PiBiICE9IG51bGwpOwogIH0KICB2YXIgU0xJREVfSURfVkFMVUVfUkUgPSAvXlswLTlhLWZdezh9JC87CiAgdmFyIERFQ0tfQ09OVFJPTF9GTE9XX1JFID0gL14oc2MtaWZ8c2MtZm9yfHNjLWVsc2V8ZGMtaW1wb3J0fHgtaW1wb3J0KSQvOwogIHZhciBERUNLX0FVWF9SRSA9IC9eKHRlbXBsYXRlfHNjcmlwdHxzdHlsZXxzYy1oZWxtZXR8aGVsbWV0KSQvOwogIGZ1bmN0aW9uIGlzRGVja01vdW50VGFnKGVsKSB7CiAgICBpZiAoZWwubG9jYWxOYW1lID09PSAiZGVjay1zdGFnZSIpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGVsLmxvY2FsTmFtZSA9PT0gIngtaW1wb3J0IiAmJiAoZWwuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQtZnJvbS1nbG9iYWwtc2NvcGUiKSB8fCAiIikgPT09ICJkZWNrLXN0YWdlIjsKICB9CiAgZnVuY3Rpb24gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgewogICAgY29uc3QgcGFpcnMgPSBbLi4uZWwuY2hpbGROb2Rlc10ubWFwKChjKSA9PiAoeyBjLCBiOiB3YWxrKGMsIGhvc3QpIH0pKS5maWx0ZXIoKHApID0+IHAuYiAhPT0gbnVsbCk7CiAgICBjb25zdCBraWRzID0gcGFpcnMubWFwKChwKSA9PiBwLmIpOwogICAgY29uc3Qgc2VlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBjb25zdCB3c1NlZW4gPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgY29uc3Qga2V5cyA9IFtdOwogICAgY29uc3QgbmV4dFNsaWRlSWQgPSBuZXcgQXJyYXkocGFpcnMubGVuZ3RoKTsKICAgIHsKICAgICAgbGV0IHVwY29taW5nID0gbnVsbDsKICAgICAgZm9yIChsZXQgaiA9IHBhaXJzLmxlbmd0aCAtIDE7IGogPj0gMDsgai0tKSB7CiAgICAgICAgY29uc3QgbiA9IHBhaXJzW2pdLmM7CiAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICBjb25zdCB0ID0gbi5sb2NhbE5hbWU7CiAgICAgICAgICB1cGNvbWluZyA9ICFERUNLX0FVWF9SRS50ZXN0KHQpICYmICFERUNLX0NPTlRST0xfRkxPV19SRS50ZXN0KHQpID8gbi5nZXRBdHRyaWJ1dGUoImRhdGEtb20tc2xpZGUtaWQiKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIG5leHRTbGlkZUlkW2pdID0gdXBjb21pbmc7CiAgICAgIH0KICAgIH0KICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFpcnMubGVuZ3RoOyBqKyspIHsKICAgICAgY29uc3QgeyBjIH0gPSBwYWlyc1tqXTsKICAgICAgaWYgKGMubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgaWYgKChjLm5vZGVWYWx1ZSA/PyAiIikudHJpbSgpID09PSAiIikgewogICAgICAgICAgY29uc3QgYmFzZSA9IG5leHRTbGlkZUlkW2pdID8gIm9taWQtd3M6IiArIG5leHRTbGlkZUlkW2pdIDogIm9taWQtd3M6YXV4IjsKICAgICAgICAgIGNvbnN0IG4gPSB3c1NlZW4uZ2V0KGJhc2UpID8/IDA7CiAgICAgICAgICB3c1NlZW4uc2V0KGJhc2UsIG4gKyAxKTsKICAgICAgICAgIGtleXMucHVzaChuID09PSAwID8gYmFzZSA6IGJhc2UgKyAiOiIgKyBuKTsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBraWRzLCBrZXlzOiBudWxsIH07CiAgICAgIH0KICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAga2V5cy5wdXNoKGopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGNvbnN0IGNoaWxkID0gYzsKICAgICAgY29uc3QgdGFnID0gY2hpbGQubG9jYWxOYW1lOwogICAgICBpZiAoREVDS19BVVhfUkUudGVzdCh0YWcpKSB7CiAgICAgICAga2V5cy5wdXNoKGopOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChERUNLX0NPTlRST0xfRkxPV19SRS50ZXN0KHRhZykpIHJldHVybiB7IGtpZHMsIGtleXM6IG51bGwgfTsKICAgICAgY29uc3QgdiA9IGNoaWxkLmdldEF0dHJpYnV0ZSgiZGF0YS1vbS1zbGlkZS1pZCIpOwogICAgICBpZiAoIXYgfHwgIVNMSURFX0lEX1ZBTFVFX1JFLnRlc3QodikgfHwgc2Vlbi5oYXModikpIHsKICAgICAgICByZXR1cm4geyBraWRzLCBrZXlzOiBudWxsIH07CiAgICAgIH0KICAgICAgc2Vlbi5hZGQodik7CiAgICAgIGtleXMucHVzaCgib21pZDoiICsgdik7CiAgICB9CiAgICByZXR1cm4geyBraWRzLCBrZXlzIH07CiAgfQogIGZ1bmN0aW9uIHJlbmRlckRlY2tLaWRzKGtpZHMsIGtpZEtleXMsIHZhbHMsIGN0eCkgewogICAgcmV0dXJuIGtpZHMubWFwKChiLCBqKSA9PiB7CiAgICAgIGNvbnN0IGsgPSBraWRLZXlzID8ga2lkS2V5c1tqXSA6IGo7CiAgICAgIGNvbnN0IG91dCA9IGIodmFscywgY3R4LCBrKTsKICAgICAgcmV0dXJuIGtpZEtleXMgIT0gbnVsbCAmJiB0eXBlb2Ygb3V0ID09PSAic3RyaW5nIiA/IGgoZ2V0UmVhY3QoKS5GcmFnbWVudCwgeyBrZXk6IGsgfSwgb3V0KSA6IG91dDsKICAgIH0pOwogIH0KICBmdW5jdGlvbiB3YWxrKG5vZGUsIGhvc3QpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgcmV0dXJuIHdhbGtUZXh0KG5vZGUpOwogICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4gbnVsbDsKICAgIGNvbnN0IGVsID0gbm9kZTsKICAgIGNvbnN0IHRhZyA9IGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgIGlmICh0YWcgPT09ICJzYy1mb3IiKSByZXR1cm4gd2Fsa0ZvcihlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaWYiKSByZXR1cm4gd2Fsa0lmKGVsLCBob3N0KTsKICAgIGlmICh0YWcgPT09ICJ4LWltcG9ydCIpIHJldHVybiB3YWxrWEltcG9ydChlbCwgaG9zdCk7CiAgICBpZiAodGFnID09PSAic2MtaGVsbWV0IikgcmV0dXJuIGhvc3QuaGVsbWV0KGVsKTsKICAgIGlmICh0YWcgPT09ICJkYy1pbXBvcnQiKSByZXR1cm4gd2Fsa0NvbXBvbmVudChlbCwgaG9zdCk7CiAgICByZXR1cm4gd2Fsa0VsZW1lbnQoZWwsIGhvc3QpOwogIH0KICB2YXIgd2FybmVkSG9sZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpOwogIGZ1bmN0aW9uIHdhcm5VbnJlc29sdmVkKGN0eCwgd2hhdCkgewogICAgY29uc3Qga2V5ID0gKGN0eD8uX19uYW1lIHx8ICI/IikgKyAiXDAiICsgd2hhdDsKICAgIGlmICh3YXJuZWRIb2xlcy5oYXMoa2V5KSkgcmV0dXJuOwogICAgd2FybmVkSG9sZXMuYWRkKGtleSk7CiAgICBjb25zb2xlLndhcm4oIltkYy1ydW50aW1lXSAiICsgKGN0eD8uX19uYW1lIHx8ICJ0ZW1wbGF0ZSIpICsgIjogIiArIHdoYXQpOwogIH0KICBmdW5jdGlvbiB3YWxrVGV4dChub2RlKSB7CiAgICBjb25zdCB0eHQgPSBub2RlLm5vZGVWYWx1ZSA/PyAiIjsKICAgIGlmICghdHh0LmluY2x1ZGVzKCJ7eyIpKSB7CiAgICAgIGlmICghdHh0LnRyaW0oKSAmJiAhdHh0LmluY2x1ZGVzKCIgIikpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gKCkgPT4gdHh0OwogICAgfQogICAgY29uc3QgcGFydHMgPSB0eHQuc3BsaXQoL1x7XHsoW1xzXFNdKz8pXH1cfS9nKTsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IGgoCiAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgIHsga2V5IH0sCiAgICAgIC4uLnBhcnRzLm1hcCgocCwgaSkgPT4gewogICAgICAgIGlmICghKGkgJiAxKSkgcmV0dXJuIHA7CiAgICAgICAgY29uc3QgdiA9IHJlc29sdmUodmFscywgcCk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgewogICAgICAgICAgaWYgKCFjdHg/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICAgIGlmIChkb2N1bWVudC5ib2R5Py5oYXNBdHRyaWJ1dGUoImRhdGEtZGMtZWRpdG9yLW9uIikpIHsKICAgICAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgICAgICJzcGFuIiwKICAgICAgICAgICAgICAgIHsga2V5OiBpLCBjbGFzc05hbWU6ICJzYy1pbnRlcnAgc2MtdW5yZXNvbHZlZCIgfSwKICAgICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IgogICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICJ7eyAiICsgcC50cmltKCkgKyAiIH19IG5ldmVyIHJlc29sdmVkIFx1MjAxNCByZW5kZXJlZCBhcyBlbXB0eSIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgInNwYW4iLAogICAgICAgICAgICB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIHNjLW1pc3NpbmciIH0sCiAgICAgICAgICAgIHAudHJpbSgpCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoZ2V0UmVhY3QoKS5pc1ZhbGlkRWxlbWVudCh2KSB8fCBBcnJheS5pc0FycmF5KHYpKSB7CiAgICAgICAgICByZXR1cm4gaChnZXRSZWFjdCgpLkZyYWdtZW50LCB7IGtleTogaSB9LCB2KTsKICAgICAgICB9CiAgICAgICAgaWYgKHYgPT09IG51bGwgfHwgdHlwZW9mIHYgPT09ICJib29sZWFuIikgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIGgoInNwYW4iLCB7IGtleTogaSwgY2xhc3NOYW1lOiAic2MtaW50ZXJwIiB9LCBTdHJpbmcodikpOwogICAgICB9KQogICAgKTsKICB9CiAgZnVuY3Rpb24gd2Fsa0ZvcihlbCwgaG9zdCkgewogICAgY29uc3QgbGlzdEdldCA9IGNvbXBpbGVBdHRyKGVsLmdldEF0dHJpYnV0ZSgibGlzdCIpIHx8ICIiKTsKICAgIGNvbnN0IGFzTmFtZSA9IGVsLmdldEF0dHJpYnV0ZSgiYXMiKSB8fCAiaXRlbSI7CiAgICBjb25zdCBoaW50TiA9IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgiaGludC1wbGFjZWhvbGRlci1jb3VudCIpIHx8ICIwIiwgMTApOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICBjb25zdCBsaXN0U3JjID0gZWwuZ2V0QXR0cmlidXRlKCJsaXN0IikgfHwgIiI7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCBsaXN0ID0gbGlzdEdldCh2YWxzKTsKICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpc3QpKSB7CiAgICAgICAgaWYgKCFjdHg/Ll9fc3RyZWFtaW5nTm93KSB7CiAgICAgICAgICBpZiAobGlzdCAhPT0gdm9pZCAwICYmIGxpc3QgIT09IG51bGwpIHsKICAgICAgICAgICAgd2FyblVucmVzb2x2ZWQoCiAgICAgICAgICAgICAgY3R4LAogICAgICAgICAgICAgICdzYy1mb3IgbGlzdD0iJyArIGxpc3RTcmMgKyAnIiBpcyBub3QgYW4gYXJyYXkgKCcgKyB0eXBlb2YgbGlzdCArICIpIgogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgICAgbGlzdCA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsaXN0ID0gaGludE4gPiAwID8gQXJyYXkoaGludE4pLmZpbGwodm9pZCAwKSA6IFtdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAgbGlzdC5tYXAoKGl0ZW0sIGkpID0+IHsKICAgICAgICAgIGNvbnN0IHN1YiA9IHsgLi4udmFscywgW2FzTmFtZV06IGl0ZW0sICRpbmRleDogaSB9OwogICAgICAgICAgcmV0dXJuIGgoCiAgICAgICAgICAgIGdldFJlYWN0KCkuRnJhZ21lbnQsCiAgICAgICAgICAgIHsga2V5OiBpIH0sCiAgICAgICAgICAgIGtpZHMubWFwKChiLCBqKSA9PiBiKHN1YiwgY3R4LCBqKSkKICAgICAgICAgICk7CiAgICAgICAgfSkKICAgICAgKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHdhbGtJZihlbCwgaG9zdCkgewogICAgY29uc3QgdmFsR2V0ID0gY29tcGlsZUF0dHIoZWwuZ2V0QXR0cmlidXRlKCJ2YWx1ZSIpIHx8ICIiKTsKICAgIGNvbnN0IGhpbnRSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoImhpbnQtcGxhY2Vob2xkZXItdmFsIik7CiAgICBjb25zdCBoaW50R2V0ID0gaGludFJhdyAhPSBudWxsID8gY29tcGlsZUF0dHIoaGludFJhdykgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGxldCB2ID0gdmFsR2V0KHZhbHMpOwogICAgICBpZiAodiA9PT0gdm9pZCAwICYmIGhpbnRHZXQgJiYgY3R4Py5fX3N0cmVhbWluZ05vdykgdiA9IGhpbnRHZXQodmFscyk7CiAgICAgIHJldHVybiB2ID8gaCgKICAgICAgICBnZXRSZWFjdCgpLkZyYWdtZW50LAogICAgICAgIHsga2V5IH0sCiAgICAgICAga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSkKICAgICAgKSA6IG51bGw7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrQ29tcG9uZW50KGVsLCBob3N0KSB7CiAgICBjb25zdCBuYW1lID0gZWwuZ2V0QXR0cmlidXRlKCJuYW1lIikgfHwgZWwuZ2V0QXR0cmlidXRlKCJjb21wb25lbnQiKSB8fCAiIjsKICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgibmFtZSIpOwogICAgZWwucmVtb3ZlQXR0cmlidXRlKCJjb21wb25lbnQiKTsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3QgeyBwcm9wR2V0dGVycywgaGludFNpemUgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRjLWltcG9ydCIsIGhvc3QpOwogICAgY29uc3Qga2lkcyA9IHdhbGtDaGlsZHJlbihlbCwgaG9zdCk7CiAgICByZXR1cm4gKHZhbHMsIGN0eCwga2V5KSA9PiB7CiAgICAgIGNvbnN0IHByb3BzID0gewogICAgICAgIGtleSwKICAgICAgICBfX2hpbnRTaXplOiBoaW50U2l6ZSwKICAgICAgICBfX3RwbElkOiB0cGxJZCwKICAgICAgICBfX2hvc3RTdHlsZTogc3R5bGVHZXQgPyBob3N0UG9zaXRpb25TdHlsZShzdHlsZUdldCh2YWxzKSkgOiB2b2lkIDAKICAgICAgfTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBjb25zdCB2ID0gZyh2YWxzKTsKICAgICAgICBpZiAoayA9PT0gImRjUHJvcHMiKSB7CiAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdiA9PT0gIm9iamVjdCIpIE9iamVjdC5hc3NpZ24ocHJvcHMsIHYpOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHByb3BzW2tdID0gdjsKICAgICAgfQogICAgICBpZiAoa2lkcy5sZW5ndGgpIHByb3BzLmNoaWxkcmVuID0ga2lkcy5tYXAoKGIsIGopID0+IGIodmFscywgY3R4LCBqKSk7CiAgICAgIHJldHVybiBoKGhvc3QuY29tcG9uZW50KG5hbWUpLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiB3YWxrWEltcG9ydChlbCwgaG9zdCkgewogICAgY29uc3QgZ2xvYmFsTmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC1mcm9tLWdsb2JhbC1zY29wZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZXhwb3J0TmFtZUdldCA9IGNvbXBpbGVBdHRyKAogICAgICBlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudCIpIHx8IGVsLmdldEF0dHJpYnV0ZSgibmFtZSIpIHx8ICIiCiAgICApOwogICAgY29uc3QgZnJvbVJhdyA9IGVsLmdldEF0dHJpYnV0ZSgiZnJvbSIpIHx8IChlbC5nZXRBdHRyaWJ1dGUoImNvbXBvbmVudC1mcm9tLWdsb2JhbC1zY29wZSIpID8gIiIgOiBlbC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGVsLmdldEF0dHJpYnV0ZSgiaW1wb3J0IikgfHwgIiIpOwogICAgY29uc3QgdXJscyA9IGZyb21SYXcudHJpbSgpID8gZnJvbVJhdy50cmltKCkuc3BsaXQoL1xzKy8pIDogW107CiAgICBjb25zdCB1cmwgPSB1cmxzLmxlbmd0aCA/IHVybHNbdXJscy5sZW5ndGggLSAxXSA6ICIiOwogICAgY29uc3Qga2luZE9mID0gKHUpID0+IC9cLihqc3h8dHN4KShcP3wjfCQpL2kudGVzdCh1KSA/ICJqc3giIDogImpzIjsKICAgIGNvbnN0IHRwbElkID0gZWwuZ2V0QXR0cmlidXRlKCJkYXRhLWRjLXRwbCIpOwogICAgY29uc3Qgc3R5bGVSYXcgPSBlbC5nZXRBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoInN0eWxlIik7CiAgICBjb25zdCBzdHlsZUdldCA9IHN0eWxlUmF3ICE9IG51bGwgPyBjb21waWxlQXR0cihzdHlsZVJhdykgOiBudWxsOwogICAgY29uc3Qgd3JhcCA9IHRwbElkICE9IG51bGwgfHwgc3R5bGVHZXQgIT0gbnVsbDsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIGhpbnRTaXplIH0gPSBjb2xsZWN0UHJvcHMoZWwsICJ4LWltcG9ydCIsIGhvc3QpOwogICAgY29uc3QgaGFzQ29udGVudCA9IGVsLmNoaWxkcmVuLmxlbmd0aCA+IDAgfHwgISEoZWwudGV4dENvbnRlbnQgfHwgIiIpLnRyaW0oKTsKICAgIGNvbnN0IGRlY2tLZXllZCA9IGhhc0NvbnRlbnQgJiYgaXNEZWNrTW91bnRUYWcoZWwpID8gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IGRlY2tLZXllZCA/IGRlY2tLZXllZC5raWRzIDogaGFzQ29udGVudCA/IHdhbGtDaGlsZHJlbihlbCwgaG9zdCkgOiBbXTsKICAgIGNvbnN0IGtpZEtleXMgPSBkZWNrS2V5ZWQ/LmtleXMgPz8gbnVsbDsKICAgIGNvbnN0IHVybEJpbmRhYmxlID0gZnJvbVJhdy5pbmNsdWRlcygie3siKTsKICAgIGlmICh1cmxzLmxlbmd0aCAmJiAhdXJsQmluZGFibGUpIHsKICAgICAgbGV0IHByZXY7CiAgICAgIGZvciAoY29uc3QgdSBvZiB1cmxzKSBwcmV2ID0gaG9zdC5sb2FkRXh0ZXJuYWwoa2luZE9mKHUpLCB1LCBwcmV2KTsKICAgIH0KICAgIGNvbnN0IGV2YWxOYW1lID0gKGcsIHZhbHMpID0+IHsKICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgIGNvbnN0IHMgPSB2ID09IG51bGwgPyAiIiA6IFN0cmluZyh2KTsKICAgICAgcmV0dXJuIHMuaW5jbHVkZXMoInt7IikgPyAiIiA6IHM7CiAgICB9OwogICAgcmV0dXJuICh2YWxzLCBjdHgsIGtleSkgPT4gewogICAgICBjb25zdCBnbG9iYWxOYW1lID0gZXZhbE5hbWUoZ2xvYmFsTmFtZUdldCwgdmFscyk7CiAgICAgIGNvbnN0IG5hbWUgPSBnbG9iYWxOYW1lIHx8IGV2YWxOYW1lKGV4cG9ydE5hbWVHZXQsIHZhbHMpOwogICAgICBjb25zdCBDID0gIW5hbWUgfHwgdXJsQmluZGFibGUgPyBudWxsIDogZ2xvYmFsTmFtZSA/IGhvc3QucmVzb2x2ZUV4dGVybmFsR2xvYmFsKHVybCwgZ2xvYmFsTmFtZSkgOiBob3N0LnJlc29sdmVFeHRlcm5hbCh1cmwsIG5hbWUpOwogICAgICBjb25zdCBob3N0U3R5bGUgPSBzdHlsZUdldCA/IGhvc3RQb3NpdGlvblN0eWxlKHN0eWxlR2V0KHZhbHMpKSA6IHZvaWQgMDsKICAgICAgY29uc3Qgd3JhcHBlciA9IHdyYXAgPyB7CiAgICAgICAga2V5LAogICAgICAgIGNsYXNzTmFtZTogInNjLWhvc3QteCIsCiAgICAgICAgImRhdGEtZGMtdHBsIjogdHBsSWQsCiAgICAgICAgc3R5bGU6IGhvc3RTdHlsZSB8fCB7IGRpc3BsYXk6ICJjb250ZW50cyIgfQogICAgICB9IDogbnVsbDsKICAgICAgaWYgKCFDKSB7CiAgICAgICAgY29uc3QgZXJyb3IgPSB1cmxCaW5kYWJsZSA/ICJ4LWltcG9ydCBgZnJvbWAgY2Fubm90IGNvbnRhaW4ge3sgXHUyMDI2IH19IFx1MjAxNCBtb2R1bGUgVVJMcyBhcmUgcmVzb2x2ZWQgYXQgcGFyc2UgdGltZTsgdXNlIGEgbGl0ZXJhbCBVUkwiIDogaG9zdC5yZXNvbHZlRXh0ZXJuYWxFcnJvcih1cmwsIG5hbWUpOwogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcgogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgY29uc3QgcHJvcHMgPSB3cmFwcGVyID8ge30gOiB7IGtleSB9OwogICAgICBsZXQgdW5yZXNvbHZlZEhvbGUgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBpZiAoayA9PT0gImNvbXBvbmVudCIgfHwgayA9PT0gImNvbXBvbmVudEZyb21HbG9iYWxTY29wZSIgfHwgayA9PT0gImZyb20iKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdiA9IGcodmFscyk7CiAgICAgICAgaWYgKHYgPT09IHZvaWQgMCkgdW5yZXNvbHZlZEhvbGUgPSB0cnVlOwogICAgICAgIGlmIChrID09PSAiZGNQcm9wcyIpIHsKICAgICAgICAgIGlmICh2ICYmIHR5cGVvZiB2ID09PSAib2JqZWN0IikgT2JqZWN0LmFzc2lnbihwcm9wcywgdik7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmICh1bnJlc29sdmVkSG9sZSAmJiBjdHg/Ll9faHRtbFN0cmVhbWluZ05vdykgewogICAgICAgIGNvbnN0IHBoID0gaG9zdC5wbGFjZWhvbGRlcih7CiAgICAgICAgICBrZXk6IHdyYXBwZXIgPyB2b2lkIDAgOiBrZXksCiAgICAgICAgICBuYW1lLAogICAgICAgICAgaGludFNpemUsCiAgICAgICAgICBlcnJvcjogbnVsbAogICAgICAgIH0pOwogICAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgcGgpIDogcGg7CiAgICAgIH0KICAgICAgaWYgKGtpZHMubGVuZ3RoKSB7CiAgICAgICAgcHJvcHMuY2hpbGRyZW4gPSByZW5kZXJEZWNrS2lkcyhraWRzLCBraWRLZXlzLCB2YWxzLCBjdHgpOwogICAgICB9CiAgICAgIHJldHVybiB3cmFwcGVyID8gaCgiZGl2Iiwgd3JhcHBlciwgaChDLCBwcm9wcykpIDogaChDLCBwcm9wcyk7CiAgICB9OwogIH0KICBmdW5jdGlvbiBjb250ZW50S2V5KGVsKSB7CiAgICBjb25zdCBjbG9uZSA9IGVsLmNsb25lTm9kZSh0cnVlKTsKICAgIGZvciAoY29uc3QgZCBvZiBjbG9uZS5xdWVyeVNlbGVjdG9yQWxsKCIqIikpIHsKICAgICAgd2hpbGUgKGQuYXR0cmlidXRlcy5sZW5ndGgpIGQucmVtb3ZlQXR0cmlidXRlKGQuYXR0cmlidXRlc1swXS5uYW1lKTsKICAgIH0KICAgIGNvbnN0IHMgPSBjbG9uZS5pbm5lckhUTUw7CiAgICBsZXQgaDIgPSA1MzgxOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBoMiA9IChoMiA8PCA1KSArIGgyICsgcy5jaGFyQ29kZUF0KGkpIHwgMDsKICAgIHJldHVybiBzLmxlbmd0aCArICIuIiArIChoMiA+Pj4gMCkudG9TdHJpbmcoMzYpOwogIH0KICB2YXIgTkVWRVJfQ09OVEVOVF9LRVlFRCA9IG5ldyBTZXQoCiAgICAic2NyaXB0IHN0eWxlIHRleHRhcmVhIG9wdGlvbiB0aXRsZSBzZWxlY3QgY2FudmFzIGlmcmFtZSB2aWRlbyBhdWRpbyIuc3BsaXQoCiAgICAgICIgIgogICAgKQogICk7CiAgdmFyIE5PVF9JTkxJTkVfU0VMRUNUT1IgPSAiOm5vdCgiICsgWy4uLklOTElORV9URVhUX1RBR1NdLmpvaW4oIiwiKSArICIpIjsKICBmdW5jdGlvbiB3YWxrRWxlbWVudChlbCwgaG9zdCkgewogICAgY29uc3QgcmVhbFRhZyA9IFJBV19VTldSQVBbZWwubG9jYWxOYW1lXSB8fCBlbC5sb2NhbE5hbWU7CiAgICBjb25zdCB0cGxJZCA9IGVsLmdldEF0dHJpYnV0ZSgiZGF0YS1kYy10cGwiKTsKICAgIGNvbnN0IGlubGluZU9ubHkgPSBlbC5jaGlsZE5vZGVzLmxlbmd0aCA+IDAgJiYgIU5FVkVSX0NPTlRFTlRfS0VZRUQuaGFzKHJlYWxUYWcpICYmIGVsLnF1ZXJ5U2VsZWN0b3IoTk9UX0lOTElORV9TRUxFQ1RPUikgPT09IG51bGw7CiAgICBjb25zdCBrZXlTdWZmaXggPSBpbmxpbmVPbmx5ID8gInwiICsgY29udGVudEtleShlbCkgOiAiIjsKICAgIGNvbnN0IHsgcHJvcEdldHRlcnMsIHBzZXVkb0NsYXNzZXMgfSA9IGNvbGxlY3RQcm9wcyhlbCwgImRvbSIsIGhvc3QpOwogICAgY29uc3QgZGVja0tleWVkID0gaXNEZWNrTW91bnRUYWcoZWwpID8gd2Fsa0RlY2tDaGlsZHJlbihlbCwgaG9zdCkgOiBudWxsOwogICAgY29uc3Qga2lkcyA9IGRlY2tLZXllZCA/IGRlY2tLZXllZC5raWRzIDogd2Fsa0NoaWxkcmVuKGVsLCBob3N0KTsKICAgIGNvbnN0IGtpZEtleXMgPSBkZWNrS2V5ZWQ/LmtleXMgPz8gbnVsbDsKICAgIHJldHVybiAodmFscywgY3R4LCBrZXkpID0+IHsKICAgICAgY29uc3QgcHJvcHMgPSB7CiAgICAgICAga2V5OiBrZXkgKyBrZXlTdWZmaXgsCiAgICAgICAgImRhdGEtZGMtdHBsIjogdHBsSWQKICAgICAgfTsKICAgICAgZm9yIChjb25zdCBbaywgZ10gb2YgcHJvcEdldHRlcnMpIHsKICAgICAgICBsZXQgdiA9IGcodmFscyk7CiAgICAgICAgaWYgKGsgPT09ICJzdHlsZSIgJiYgdHlwZW9mIHYgPT09ICJzdHJpbmciKSB2ID0gY3NzVG9PYmoodik7CiAgICAgICAgaWYgKChrID09PSAidmFsdWUiIHx8IGsgPT09ICJjaGVja2VkIikgJiYgdiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB2ID0gayA9PT0gImNoZWNrZWQiID8gZmFsc2UgOiAiIjsKICAgICAgICB9CiAgICAgICAgcHJvcHNba10gPSB2OwogICAgICB9CiAgICAgIGlmIChwc2V1ZG9DbGFzc2VzLmxlbmd0aCkgewogICAgICAgIHByb3BzLmNsYXNzTmFtZSA9IFtwcm9wcy5jbGFzc05hbWUsIC4uLnBzZXVkb0NsYXNzZXNdLmZpbHRlcihCb29sZWFuKS5qb2luKCIgIik7CiAgICAgIH0KICAgICAgcmV0dXJuIGgocmVhbFRhZywgcHJvcHMsIC4uLnJlbmRlckRlY2tLaWRzKGtpZHMsIGtpZEtleXMsIHZhbHMsIGN0eCkpOwogICAgfTsKICB9CgogIC8vIHNyYy9sb2dpYy50cwogIHZhciBTdHJlYW1hYmxlTG9naWMgPSBjbGFzcyB7CiAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJwcm9wcyIpOwogICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJzdGF0ZSIsIHt9KTsKICAgICAgLyoqIEJhY2stcG9pbnRlciB0byB0aGUgd3JhcHBlciBjb21wb25lbnQsIGluc3RhbGxlZCBhZnRlciBjb25zdHJ1Y3Rpb24uICovCiAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9faG9zdCIpOwogICAgICB0aGlzLnByb3BzID0gcHJvcHMgfHwge307CiAgICB9CiAgICBzZXRTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgIHRoaXMuX19ob3N0ICYmIHRoaXMuX19ob3N0Ll9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKTsKICAgIH0KICAgIGZvcmNlVXBkYXRlKCkgewogICAgICB0aGlzLl9faG9zdCAmJiB0aGlzLl9faG9zdC5mb3JjZVVwZGF0ZSgpOwogICAgfQogICAgY29tcG9uZW50RGlkTW91bnQoKSB7CiAgICB9CiAgICBjb21wb25lbnREaWRVcGRhdGUoX3ByZXZQcm9wcykgewogICAgfQogICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICB9CiAgICAvKiogVGhlIGZsYXQgb2JqZWN0IHRoZSB0ZW1wbGF0ZSByZW5kZXJzIGFnYWluc3QgKG1lcmdlZCBvdmVyIHByb3BzKS4gKi8KICAgIHJlbmRlclZhbHMoKSB7CiAgICAgIHJldHVybiB7fTsKICAgIH0KICB9OwogIGZ1bmN0aW9uIGV2YWxEY0xvZ2ljKHNyYykgewogICAgLy8hIG5vc2VtZ3JlcDogZXZhbC1hbmQtZnVuY3Rpb24tY29uc3RydWN0b3IKICAgIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKAogICAgICAiRENMb2dpYyIsCiAgICAgICJTdHJlYW1hYmxlTG9naWMiLAogICAgICAiUmVhY3QiLAogICAgICBzcmMgKyAnXG47cmV0dXJuICh0eXBlb2YgQ29tcG9uZW50IT09InVuZGVmaW5lZCImJkNvbXBvbmVudCl8fHVuZGVmaW5lZDsnCiAgICApOwogICAgcmV0dXJuIGZuKFN0cmVhbWFibGVMb2dpYywgU3RyZWFtYWJsZUxvZ2ljLCBnZXRSZWFjdCgpKTsKICB9CgogIC8vIHNyYy9jb21wb25lbnQudHMKICBmdW5jdGlvbiBzaGFsbG93RXF1YWwoYSwgYikgewogICAgaWYgKCFiKSByZXR1cm4gZmFsc2U7CiAgICBjb25zdCBhayA9IE9iamVjdC5rZXlzKGEpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBjb25zdCBiayA9IE9iamVjdC5rZXlzKGIpLmZpbHRlcigoaykgPT4gayAhPT0gImNoaWxkcmVuIik7CiAgICBpZiAoYWsubGVuZ3RoICE9PSBiay5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAoY29uc3QgayBvZiBhaykgaWYgKGFba10gIT09IGJba10pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KICBmdW5jdGlvbiBQbGFjZWhvbGRlcih7CiAgICBuYW1lLAogICAgaGludFNpemUsCiAgICBzdHJlYW1pbmcsCiAgICBlcnJvcgogIH0pIHsKICAgIGNvbnN0IFt3LCBoZ3RdID0gKGhpbnRTaXplIHx8ICIxMDAlLDYwcHgiKS5zcGxpdCgiLCIpOwogICAgcmV0dXJuIGgoCiAgICAgICJkaXYiLAogICAgICB7CiAgICAgICAgY2xhc3NOYW1lOiAic2MtcGxhY2Vob2xkZXIiICsgKHN0cmVhbWluZyA/ICIgc2Mtc3RyZWFtaW5nIiA6ICIiKSwKICAgICAgICBzdHlsZTogeyB3aWR0aDogdy50cmltKCksIGhlaWdodDogaGd0ICYmIGhndC50cmltKCkgfSwKICAgICAgICB0aXRsZTogbmFtZQogICAgICB9LAogICAgICBlcnJvciA/IGgoCiAgICAgICAgImRpdiIsCiAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1wbGFjZWhvbGRlci1lcnJvciIgfSwKICAgICAgICAobmFtZSA/IG5hbWUgKyAiOiAiIDogIiIpICsgZXJyb3IKICAgICAgKSA6IG51bGwKICAgICk7CiAgfQogIGZ1bmN0aW9uIGhpbnRUb01pbihoaW50KSB7CiAgICBpZiAoIWhpbnQpIHJldHVybiB2b2lkIDA7CiAgICBjb25zdCBbdywgaGd0XSA9IGhpbnQuc3BsaXQoIiwiKTsKICAgIHJldHVybiB7IG1pbldpZHRoOiB3LnRyaW0oKSwgbWluSGVpZ2h0OiBoZ3QgJiYgaGd0LnRyaW0oKSB9OwogIH0KICBmdW5jdGlvbiBjcmVhdGVDb21wb25lbnRGYWN0b3J5KHJlZ2lzdHJ5LCBlbnN1cmVGZXRjaGVkKSB7CiAgICBjb25zdCBSZWFjdCA9IGdldFJlYWN0KCk7CiAgICBjb25zdCBBbmNlc3RvckNvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0KFtdKTsKICAgIGNsYXNzIFN0cmVhbWFibGVDb21wb25lbnQgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQgewogICAgICBjb25zdHJ1Y3Rvcihwcm9wcykgewogICAgICAgIHN1cGVyKHByb3BzKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX25hbWUiKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N1YiIpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fbmVlZHNEaWRNb3VudCIsIGZhbHNlKTsKICAgICAgICAvKiogU25hcHNob3Qgb2YgdGhlIHJlZ2lzdHJ5J3Mgc3RyZWFtaW5nIGZsYWdzIHRha2VuIGF0IHJlbmRlciB0aW1lIOKAlAogICAgICAgICAqICBidWlsZGVycyByZWFkIGl0IG9mZiB0aGUgUmVuZGVyQ3R4ICh0aGlzKSB0byBwaWNrIHBsYWNlaG9sZGVyIHZzCiAgICAgICAgICogIHJlbmRlci1ub3RoaW5nIGZvciB1bnJlc29sdmVkIHZhbHVlcy4gKi8KICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX3N0cmVhbWluZ05vdyIsIGZhbHNlKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJfX2h0bWxTdHJlYW1pbmdOb3ciLCBmYWxzZSk7CiAgICAgICAgLyoqIFdoZW4gYSBjb25zdHJ1Y3QgdGhyb3dzLCByZW1lbWJlciB0aGUgKGNsYXNzLCByZWdpc3RyeS52ZXIsIHByb3BzKQogICAgICAgICAqICB0cmlwbGUgc28gcmVuZGVyLXRpbWUgcmVjb25jaWxlIGRvZXNuJ3QgcmUtYXR0ZW1wdCBpdCBvbiBldmVyeSBwYXJlbnQKICAgICAgICAgKiAgcmUtcmVuZGVyLiBBIHJlZ2lzdHJ5IGJ1bXAgKG5ldyBjbGFzcywgdGVtcGxhdGUsIGV4dGVybmFsIG1vZHVsZQogICAgICAgICAqICByZXNvbHZpbmcgdmlhIGJ1bXBBbGwpIGNoYW5nZXMgYHZlcmAgYW5kIGJyZWFrcyB0aGUgbWVtbyBzbyBhbgogICAgICAgICAqICBlbnYtZGVwZW5kZW50IGNvbnN0cnVjdG9yIGNhbiBzZWxmLWhlYWwuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRMb2dpYyIsIG51bGwpOwogICAgICAgIF9fcHVibGljRmllbGQodGhpcywgIl9fZmFpbGVkVXNlclByb3BzIiwgbnVsbCk7CiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19mYWlsZWRWZXIiLCAtMSk7CiAgICAgICAgLyoqIFBlci1pbnN0YW5jZSBjb25zdHJ1Y3RvciBlcnJvciDigJQga2VwdCBoZXJlIChub3Qgb24gdGhlIHJlZ2lzdHJ5IGVudHJ5KQogICAgICAgICAqICBzbyBvbmUgaW5zdGFuY2UncyBzdWNjZXNzZnVsIGNvbnN0cnVjdCBjYW4ndCBoaWRlIGEgc2libGluZydzIGZhaWx1cmUsCiAgICAgICAgICogIGFuZCBhIGNvbnN0cnVjdCBjYW4gbmV2ZXIgd2lwZSBhbiBldmFsIGVycm9yIGB1cGRhdGVKc2AgcmVjb3JkZWQgb24KICAgICAgICAgKiAgYHIubG9naWNFcnJvcmAuICovCiAgICAgICAgX19wdWJsaWNGaWVsZCh0aGlzLCAiX19jdG9yRXJyb3IiLCBudWxsKTsKICAgICAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsICJsb2dpYyIpOwogICAgICAgIHRoaXMuX19uYW1lID0gcHJvcHMuX19uYW1lOwogICAgICAgIHRoaXMuc3RhdGUgPSB7IF9fdjogMCwgX19lcnI6IG51bGwgfTsKICAgICAgICB0aGlzLl9fc3ViID0gKCkgPT4gewogICAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHRoaXMuc2V0U3RhdGUoeyBfX2VycjogbnVsbCB9KTsKICAgICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIHRoaXMuX19tYWtlTG9naWMocmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5Mb2dpYywgbnVsbCk7CiAgICAgICAgZW5zdXJlRmV0Y2hlZCh0aGlzLl9fbmFtZSk7CiAgICAgIH0KICAgICAgLyoqIEVycm9yLWJvdW5kYXJ5IGhvb2s6IGEgcmVuZGVyIGNyYXNoIGFueXdoZXJlIGluIHRoaXMgREMncyBzdWJ0cmVlCiAgICAgICAqICAoaXRzIG93biB0ZW1wbGF0ZSwgYW4geC1pbXBvcnQnZCBjb21wb25lbnQsIGEgY2hpbGQgREMgd2l0aG91dCBpdHMKICAgICAgICogIG93biBkZWVwZXIgYm91bmRhcnkpIGxhbmRzIGhlcmUgaW5zdGVhZCBvZiB1bm1vdW50aW5nIHRoZSBwYWdlLiAqLwogICAgICBzdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKGUpIHsKICAgICAgICByZXR1cm4geyBfX2VycjogZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSB9OwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZENhdGNoKGUsIGluZm8pIHsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSByZW5kZXIgZXJyb3IgaW4gPCIgKyB0aGlzLl9fbmFtZSArICI+OiIsCiAgICAgICAgICBlLAogICAgICAgICAgaW5mbz8uY29tcG9uZW50U3RhY2sgfHwgIiIKICAgICAgICApOwogICAgICB9CiAgICAgIC8qKiBJbnN0YW50aWF0ZSB0aGUgbG9naWMgY2xhc3MgKG9yIHRoZSBuby1vcCBiYXNlKSBhbmQgYWRvcHQgYHByZXZTdGF0ZWAKICAgICAgICogIG92ZXIgaXRzIGluaXRpYWwgc3RhdGUg4oCUIHVzZWQgYm90aCBhdCBtb3VudCBhbmQgb24gaG90LXN3YXAuICovCiAgICAgIF9fbWFrZUxvZ2ljKExvZ2ljLCBwcmV2U3RhdGUpIHsKICAgICAgICBjb25zdCBMID0gTG9naWMgfHwgU3RyZWFtYWJsZUxvZ2ljOwogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmxvZ2ljID0gbmV3IEwodGhpcy5fX3VzZXJQcm9wcygpKTsKICAgICAgICAgIHRoaXMuX19mYWlsZWRMb2dpYyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVXNlclByb3BzID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19jdG9yRXJyb3IgPSBudWxsOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkTG9naWMgPSBMb2dpYzsKICAgICAgICAgIHRoaXMuX19mYWlsZWRVc2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgICB0aGlzLl9fZmFpbGVkVmVyID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS52ZXI7CiAgICAgICAgICB0aGlzLl9fY3RvckVycm9yID0gdGhpcy5fX25hbWUgKyAiOiAiICsgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSkpOwogICAgICAgICAgdGhpcy5sb2dpYyA9IG5ldyBTdHJlYW1hYmxlTG9naWMoCiAgICAgICAgICAgIHRoaXMuX191c2VyUHJvcHMoKQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5sb2dpYy5fX2hvc3QgPSB0aGlzOwogICAgICAgIGlmIChwcmV2U3RhdGUpCiAgICAgICAgICB0aGlzLmxvZ2ljLnN0YXRlID0geyAuLi50aGlzLmxvZ2ljLnN0YXRlIHx8IHt9LCAuLi5wcmV2U3RhdGUgfTsKICAgICAgfQogICAgICAvKiogVGhlIHByb3BzIHRoZSBhdXRob3IncyBsb2dpYyArIHRlbXBsYXRlIHNlZSDigJQgaW50ZXJuYWwgX18tcHJlZml4ZWQKICAgICAgICogIHdpcmluZyBzdHJpcHBlZC4gKi8KICAgICAgX191c2VyUHJvcHMoKSB7CiAgICAgICAgY29uc3QgeyBfX25hbWUsIF9faGludFNpemUsIF9fdHBsSWQsIF9faG9zdFN0eWxlLCAuLi5yZXN0IH0gPSB0aGlzLnByb3BzOwogICAgICAgIHJldHVybiByZXN0OwogICAgICB9CiAgICAgIF9fc2V0TG9naWNTdGF0ZSh1cGRhdGUsIGNiKSB7CiAgICAgICAgY29uc3QgcHJldiA9IHRoaXMubG9naWMuc3RhdGU7CiAgICAgICAgY29uc3QgcGF0Y2ggPSB0eXBlb2YgdXBkYXRlID09PSAiZnVuY3Rpb24iID8gdXBkYXRlKHByZXYpIDogdXBkYXRlOwogICAgICAgIHRoaXMubG9naWMuc3RhdGUgPSB7IC4uLnByZXYsIC4uLnBhdGNoIH07CiAgICAgICAgdGhpcy5zZXRTdGF0ZSgocykgPT4gKHsgX192OiBzLl9fdiArIDEgfSksIGNiKTsKICAgICAgfQogICAgICAvKiogU3dhcCB0aGUgbG9naWMgaW5zdGFuY2Ugd2hlbiB0aGUgcmVnaXN0cnkncyBMb2dpYyBjbGFzcyBjaGFuZ2VkCiAgICAgICAqICAoc3RyZWFtaW5nIGNvbXBsZXRpb24sIGhvdCByZWxvYWQpLiBTdGF0ZSBjYXJyaWVzIG92ZXI7IGRpZE1vdW50CiAgICAgICAqICByZS1maXJlcyBhZnRlciB0aGUgc3dhcCBjb21taXRzIHNvIHJlZnMgZXhpc3QuICovCiAgICAgIF9fcmVjb25jaWxlTG9naWMoKSB7CiAgICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSk7CiAgICAgICAgY29uc3QgTmV4dCA9IHIuTG9naWM7CiAgICAgICAgY29uc3QgQ3VyID0gdGhpcy5sb2dpYy5jb25zdHJ1Y3RvcjsKICAgICAgICBpZiAoTmV4dCA9PT0gQ3VyIHx8ICFOZXh0ICYmIEN1ciA9PT0gU3RyZWFtYWJsZUxvZ2ljIHx8IE5leHQgPT09IHRoaXMuX19mYWlsZWRMb2dpYyAmJiByLnZlciA9PT0gdGhpcy5fX2ZhaWxlZFZlciAmJiBzaGFsbG93RXF1YWwodGhpcy5fX3VzZXJQcm9wcygpLCB0aGlzLl9fZmFpbGVkVXNlclByb3BzKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19tYWtlTG9naWMoTmV4dCwgdGhpcy5sb2dpYy5zdGF0ZSk7CiAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSB0cnVlOwogICAgICB9CiAgICAgIGNvbXBvbmVudERpZE1vdW50KCkgewogICAgICAgIHJlZ2lzdHJ5LmdldCh0aGlzLl9fbmFtZSkuc3Vicy5hZGQodGhpcy5fX3N1Yik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgIH0KICAgICAgfQogICAgICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKSB7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHRoaXMuX191c2VyUHJvcHMoKTsKICAgICAgICBpZiAodGhpcy5fX25lZWRzRGlkTW91bnQpIHsKICAgICAgICAgIGlmICh0aGlzLnN0YXRlLl9fZXJyIHx8ICFyZWdpc3RyeS5nZXQodGhpcy5fX25hbWUpLnRwbCkgcmV0dXJuOwogICAgICAgICAgdGhpcy5fX25lZWRzRGlkTW91bnQgPSBmYWxzZTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMubG9naWMuY29tcG9uZW50RGlkTW91bnQoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdGhpcy5sb2dpYy5jb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7CiAgICAgICAgcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKS5zdWJzLmRlbGV0ZSh0aGlzLl9fc3ViKTsKICAgICAgICBpZiAoIXRoaXMuX19uZWVkc0RpZE1vdW50KSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB0aGlzLmxvZ2ljLmNvbXBvbmVudFdpbGxVbm1vdW50KCk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJlbmRlcigpIHsKICAgICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KHRoaXMuX19uYW1lKTsKICAgICAgICBjb25zdCBjbHMgPSAic2MtaG9zdCIgKyAoci5odG1sU3RyZWFtaW5nID8gIiBzYy1zdHJlYW1pbmctaHRtbCIgOiAiIikgKyAoci5qc1N0cmVhbWluZyA/ICIgc2Mtc3RyZWFtaW5nLWpzIiA6ICIiKTsKICAgICAgICBjb25zdCBoaW50U3R5bGUgPSByLmh0bWxTdHJlYW1pbmcgPyBoaW50VG9NaW4odGhpcy5wcm9wcy5fX2hpbnRTaXplKSA6IHZvaWQgMDsKICAgICAgICBjb25zdCBob3N0U3R5bGUgPSB0aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IGhpbnRTdHlsZSA/IHsgLi4uaGludFN0eWxlIHx8IHt9LCAuLi50aGlzLnByb3BzLl9faG9zdFN0eWxlIHx8IHt9IH0gOiB2b2lkIDA7CiAgICAgICAgY29uc3QgaG9zdEJhc2UgPSB7CiAgICAgICAgICBjbGFzc05hbWU6IGNscywKICAgICAgICAgIHN0eWxlOiBob3N0U3R5bGUsCiAgICAgICAgICAiZGF0YS1zYy1uYW1lIjogdGhpcy5fX25hbWUsCiAgICAgICAgICAiZGF0YS1kYy10cGwiOiB0aGlzLnByb3BzLl9fdHBsSWQKICAgICAgICB9OwogICAgICAgIGNvbnN0IGNoYWluID0gQXJyYXkuaXNBcnJheSh0aGlzLmNvbnRleHQpID8gdGhpcy5jb250ZXh0IDogW107CiAgICAgICAgaWYgKGNoYWluLmluY2x1ZGVzKHRoaXMuX19uYW1lKSkgewogICAgICAgICAgY29uc3QgY3ljbGUgPSBbCiAgICAgICAgICAgIC4uLmNoYWluLnNsaWNlKGNoYWluLmluZGV4T2YodGhpcy5fX25hbWUpKSwKICAgICAgICAgICAgdGhpcy5fX25hbWUKICAgICAgICAgIF0uam9pbigiIFx1MjE5MiAiKTsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaChQbGFjZWhvbGRlciwgewogICAgICAgICAgICAgIG5hbWU6IHRoaXMuX19uYW1lLAogICAgICAgICAgICAgIGhpbnRTaXplOiB0aGlzLnByb3BzLl9faGludFNpemUsCiAgICAgICAgICAgICAgZXJyb3I6ICJjaXJjdWxhciBpbXBvcnQ6ICIgKyBjeWNsZQogICAgICAgICAgICB9KQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc3RhdGUuX19lcnIpIHsKICAgICAgICAgIHJldHVybiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyAuLi5ob3N0QmFzZSwgY2xhc3NOYW1lOiBjbHMgKyAiIHNjLWhhcy1lcnJvciIgfSwKICAgICAgICAgICAgaCgKICAgICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgICB7IGNsYXNzTmFtZTogInNjLWxvZ2ljLWVycm9yIiwgImRhdGEtb21lbGV0dGUtY2hyb21lIjogIiIgfSwKICAgICAgICAgICAgICB0aGlzLl9fbmFtZSArICI6ICIgKyB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgICksCiAgICAgICAgICAgIGgoUGxhY2Vob2xkZXIsIHsKICAgICAgICAgICAgICBuYW1lOiB0aGlzLl9fbmFtZSwKICAgICAgICAgICAgICBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplLAogICAgICAgICAgICAgIGVycm9yOiB0aGlzLnN0YXRlLl9fZXJyCiAgICAgICAgICAgIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fcmVjb25jaWxlTG9naWMoKTsKICAgICAgICBpZiAoIXIudHBsKSB7CiAgICAgICAgICByZXR1cm4gaCgKICAgICAgICAgICAgImRpdiIsCiAgICAgICAgICAgIGhvc3RCYXNlLAogICAgICAgICAgICBoKFBsYWNlaG9sZGVyLCB7IG5hbWU6IHRoaXMuX19uYW1lLCBoaW50U2l6ZTogdGhpcy5wcm9wcy5fX2hpbnRTaXplIH0pCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBjb25zdCB1c2VyUHJvcHMgPSB0aGlzLl9fdXNlclByb3BzKCk7CiAgICAgICAgdGhpcy5sb2dpYy5wcm9wcyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgdmFscyA9IHVzZXJQcm9wczsKICAgICAgICBsZXQgcmVuZGVyRXJyID0gci5sb2dpY0Vycm9yIHx8IHRoaXMuX19jdG9yRXJyb3I7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhbHMgPSB7IC4uLnVzZXJQcm9wcywgLi4udGhpcy5sb2dpYy5yZW5kZXJWYWxzKCkgfHwge30gfTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpOwogICAgICAgICAgcmVuZGVyRXJyID0gdGhpcy5fX25hbWUgKyAiLnJlbmRlclZhbHMoKTogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fX3N0cmVhbWluZ05vdyA9ICEhKHIuaHRtbFN0cmVhbWluZyB8fCByLmpzU3RyZWFtaW5nKTsKICAgICAgICB0aGlzLl9faHRtbFN0cmVhbWluZ05vdyA9ICEhci5odG1sU3RyZWFtaW5nOwogICAgICAgIHJldHVybiBoKAogICAgICAgICAgImRpdiIsCiAgICAgICAgICB7IC4uLmhvc3RCYXNlLCBjbGFzc05hbWU6IGNscyArIChyZW5kZXJFcnIgPyAiIHNjLWhhcy1lcnJvciIgOiAiIikgfSwKICAgICAgICAgIHJlbmRlckVyciAmJiBoKAogICAgICAgICAgICAiZGl2IiwKICAgICAgICAgICAgeyBjbGFzc05hbWU6ICJzYy1sb2dpYy1lcnJvciIsICJkYXRhLW9tZWxldHRlLWNocm9tZSI6ICIiIH0sCiAgICAgICAgICAgIHJlbmRlckVycgogICAgICAgICAgKSwKICAgICAgICAgIGgoCiAgICAgICAgICAgIEFuY2VzdG9yQ29udGV4dC5Qcm92aWRlciwKICAgICAgICAgICAgeyB2YWx1ZTogWy4uLmNoYWluLCB0aGlzLl9fbmFtZV0gfSwKICAgICAgICAgICAgci50cGwodmFscywgdGhpcykKICAgICAgICAgICkKICAgICAgICApOwogICAgICB9CiAgICB9CiAgICBfX3B1YmxpY0ZpZWxkKFN0cmVhbWFibGVDb21wb25lbnQsICJjb250ZXh0VHlwZSIsIEFuY2VzdG9yQ29udGV4dCk7CiAgICBjb25zdCBuYW1lZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBmdW5jdGlvbiBnZXREQyhuYW1lKSB7CiAgICAgIGNvbnN0IGhpdCA9IG5hbWVkLmdldChuYW1lKTsKICAgICAgaWYgKGhpdCkgcmV0dXJuIGhpdDsKICAgICAgZnVuY3Rpb24gRGlzcGF0Y2hlcihwKSB7CiAgICAgICAgY29uc3QgWywgc2V0VGlja10gPSBSZWFjdC51c2VTdGF0ZSgwKTsKICAgICAgICBSZWFjdC51c2VFZmZlY3QoKCkgPT4gewogICAgICAgICAgY29uc3Qgc3ViID0gKCkgPT4gc2V0VGljaygobikgPT4gbiArIDEpOwogICAgICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnN1YnMuYWRkKHN1Yik7CiAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuc3Vicy5kZWxldGUoc3ViKTsKICAgICAgICAgIH07CiAgICAgICAgfSwgW10pOwogICAgICAgIGVuc3VyZUZldGNoZWQobmFtZSk7CiAgICAgICAgcmV0dXJuIGgoU3RyZWFtYWJsZUNvbXBvbmVudCwgeyAuLi5wLCBfX25hbWU6IG5hbWUgfSk7CiAgICAgIH0KICAgICAgRGlzcGF0Y2hlci5kaXNwbGF5TmFtZSA9IG5hbWU7CiAgICAgIG5hbWVkLnNldChuYW1lLCBEaXNwYXRjaGVyKTsKICAgICAgcmV0dXJuIERpc3BhdGNoZXI7CiAgICB9CiAgICByZXR1cm4gewogICAgICBnZXREQywKICAgICAgU3RyZWFtYWJsZUNvbXBvbmVudAogICAgfTsKICB9CgogIC8vIHNyYy9idW5kbGVkLnRzCiAgZnVuY3Rpb24gYnVuZGxlZEJsb2IodXJsKSB7CiAgICBjb25zdCBibG9icyA9IHdpbmRvdy5fX3Jlc291cmNlQmxvYnM7CiAgICBjb25zdCBiID0gYmxvYnMgPyBibG9ic1t1cmwuc3BsaXQoIiMiKVswXV0gOiB2b2lkIDA7CiAgICByZXR1cm4gYiBpbnN0YW5jZW9mIEJsb2IgPyBiIDogbnVsbDsKICB9CgogIC8vIHNyYy9jZG4udHMKICB2YXIgUkVBQ1RfVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0QDE4LjMuMS91bWQvcmVhY3QucHJvZHVjdGlvbi5taW4uanMiOwogIHZhciBSRUFDVF9TUkkgPSAic2hhMzg0LURHeUx4QXlqcTBmOVNQcFZldkQ2SWd6dENGbG5NRjZvVy9YUUdtZmUrSXNaOFRxRWlEcmNIa01MS0k2ZmlCL1oiOwogIHZhciBSRUFDVF9ET01fVVJMID0gImh0dHBzOi8vdW5wa2cuY29tL3JlYWN0LWRvbUAxOC4zLjEvdW1kL3JlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcyI7CiAgdmFyIFJFQUNUX0RPTV9TUkkgPSAic2hhMzg0LWdUR3hoejIxbFZHWU5NY2RKT3lxMDFFZGcwamhuL2MyMm5zeDBreXFQMFR4YVY1V1Zkc1NIMWZTRFVmNVlKajEiOwogIHZhciBCQUJFTF9VUkwgPSAiaHR0cHM6Ly91bnBrZy5jb20vQGJhYmVsL3N0YW5kYWxvbmVANy4yOS4wL2JhYmVsLm1pbi5qcyI7CiAgdmFyIEJBQkVMX1NSSSA9ICJzaGEzODQtbTA4S2lkaU5xTGRwSnFMcTk1Ry9MRWk4UXZqbC94VVlsbDNRSUx5cE1vUTY1UW9ySjlMdnRwMlJYWUdCRmoxeSI7CiAgZnVuY3Rpb24gY2RuU2NyaXB0Rm9yKHVybCwgc3JpKSB7CiAgICBjb25zdCByZXMgPSB3aW5kb3cuX19yZXNvdXJjZXM7CiAgICBjb25zdCB2ID0gcmVzID8gcmVzW3VybF0gOiB2b2lkIDA7CiAgICByZXR1cm4gdHlwZW9mIHYgPT09ICJzdHJpbmciICYmIHYgPyB7IHNyYzogdiB9IDogeyBzcmM6IHVybCwgaW50ZWdyaXR5OiBzcmkgfTsKICB9CgogIC8vIHNyYy9leHRlcm5hbC50cwogIHZhciBpc0N1c3RvbUVsZW1lbnROYW1lID0gKG4pID0+ICFuLmluY2x1ZGVzKCIuIikgJiYgbi5pbmNsdWRlcygiLSIpOwogIGZ1bmN0aW9uIGlzUmVuZGVyYWJsZVR5cGUoZykgewogICAgaWYgKHR5cGVvZiBnID09PSAiZnVuY3Rpb24iKSByZXR1cm4gIWlzRWxlbWVudENsYXNzKGcpOwogICAgcmV0dXJuIHR5cGVvZiBnID09PSAib2JqZWN0IiAmJiBnICE9PSBudWxsICYmIHR5cGVvZiBnLiQkdHlwZW9mID09PSAic3ltYm9sIjsKICB9CiAgZnVuY3Rpb24gcmVzb2x2ZURvdHRlZFBhdGgocm9vdCwgbmFtZSkgewogICAgbGV0IGN1ciA9IHJvb3Q7CiAgICBmb3IgKGNvbnN0IHNlZyBvZiBuYW1lLnNwbGl0KCIuIikpIHsKICAgICAgaWYgKGN1ciA9PSBudWxsKSByZXR1cm4gdm9pZCAwOwogICAgICBjdXIgPSBjdXJbc2VnXTsKICAgIH0KICAgIHJldHVybiBjdXI7CiAgfQogIHZhciBHTE9CQUxfUE9MTF9JTlRFUlZBTF9NUyA9IDUwOwogIHZhciBHTE9CQUxfUE9MTF9USU1FT1VUX01TID0gM2U0OwogIGZ1bmN0aW9uIGNyZWF0ZUV4dGVybmFsTW9kdWxlcyhvblJlc29sdmVkKSB7CiAgICBjb25zdCBjYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBsZXQgYmFiZWxMb2FkaW5nID0gbnVsbDsKICAgIGNvbnN0IHJlcG9ydGVkTWlzc2luZyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7CiAgICBjb25zdCBwb2xsaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTsKICAgIGZ1bmN0aW9uIGVuc3VyZUJhYmVsKCkgewogICAgICBpZiAod2luZG93LkJhYmVsKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgIGlmIChiYWJlbExvYWRpbmcpIHJldHVybiBiYWJlbExvYWRpbmc7CiAgICAgIGNvbnN0IGJhYmVsID0gY2RuU2NyaXB0Rm9yKEJBQkVMX1VSTCwgQkFCRUxfU1JJKTsKICAgICAgYmFiZWxMb2FkaW5nID0gbmV3IFByb21pc2UoKHJlcywgcmVqKSA9PiB7CiAgICAgICAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgICAgIHMuc3JjID0gYmFiZWwuc3JjOwogICAgICAgIGlmIChiYWJlbC5pbnRlZ3JpdHkpIHsKICAgICAgICAgIHMuaW50ZWdyaXR5ID0gYmFiZWwuaW50ZWdyaXR5OwogICAgICAgICAgcy5jcm9zc09yaWdpbiA9ICJhbm9ueW1vdXMiOwogICAgICAgIH0KICAgICAgICBzLm9ubG9hZCA9ICgpID0+IHJlcygpOwogICAgICAgIHMub25lcnJvciA9IHJlajsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGJhYmVsTG9hZGluZzsKICAgIH0KICAgIGNvbnN0IHBlbmRpbmcgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpOwogICAgZnVuY3Rpb24gbG9hZChraW5kLCB1cmwsIGFmdGVyKSB7CiAgICAgIGNvbnN0IGV4aXN0aW5nID0gcGVuZGluZy5nZXQodXJsKTsKICAgICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7CiAgICAgIGNhY2hlLnNldCh1cmwsIG51bGwpOwogICAgICBjb25zb2xlLmluZm8oIltkYy1ydW50aW1lXSB4LWltcG9ydDogbG9hZGluZyIsIHVybCwgIigiICsga2luZCArICIpIik7CiAgICAgIGNvbnN0IHJlYWR5ID0gUHJvbWlzZS5hbGwoWwogICAgICAgIGtpbmQgPT09ICJqc3giID8gZW5zdXJlQmFiZWwoKSA6IFByb21pc2UucmVzb2x2ZSgpLAogICAgICAgIGFmdGVyID8/IFByb21pc2UucmVzb2x2ZSgpCiAgICAgIF0pOwogICAgICBjb25zdCBwID0gcmVhZHkudGhlbigoKSA9PiB7CiAgICAgICAgY29uc3QgcHJlID0gYnVuZGxlZEJsb2IodXJsKTsKICAgICAgICBpZiAocHJlKSByZXR1cm4gcHJlLnRleHQoKTsKICAgICAgICByZXR1cm4gZmV0Y2godXJsKS50aGVuKChyKSA9PiB7CiAgICAgICAgICBpZiAoIXIub2spIHRocm93IG5ldyBFcnJvcigiSFRUUCAiICsgci5zdGF0dXMpOwogICAgICAgICAgcmV0dXJuIHIudGV4dCgpOwogICAgICAgIH0pOwogICAgICB9KS50aGVuKChzcmMpID0+IHsKICAgICAgICBjb25zdCBjb2RlID0ga2luZCA9PT0gImpzeCIgPyB3aW5kb3cuQmFiZWwudHJhbnNmb3JtKHNyYywgewogICAgICAgICAgZmlsZW5hbWU6IHVybCwKICAgICAgICAgIHByZXNldHM6IFsicmVhY3QiLCAidHlwZXNjcmlwdCJdCiAgICAgICAgfSkuY29kZSA6IHNyYzsKICAgICAgICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IHt9IH07CiAgICAgICAgY29uc3QgYmVmb3JlID0gbmV3IFNldChPYmplY3Qua2V5cyh3aW5kb3cpKTsKICAgICAgICAvLyEgbm9zZW1ncmVwOiBldmFsLWFuZC1mdW5jdGlvbi1jb25zdHJ1Y3RvcgogICAgICAgIG5ldyBGdW5jdGlvbigiUmVhY3QiLCAibW9kdWxlIiwgImV4cG9ydHMiLCAicmVxdWlyZSIsIGNvZGUpKAogICAgICAgICAgZ2V0UmVhY3QoKSwKICAgICAgICAgIG1vZHVsZSwKICAgICAgICAgIG1vZHVsZS5leHBvcnRzLAogICAgICAgICAgKCkgPT4gKHt9KQogICAgICAgICk7CiAgICAgICAgY29uc3QgZ2xvYmFscyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgayBvZiBPYmplY3Qua2V5cyh3aW5kb3cpKSB7CiAgICAgICAgICBpZiAoIWJlZm9yZS5oYXMoaykgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICBnbG9iYWxzW2tdID0gd2luZG93W2tdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjYWNoZS5zZXQodXJsLCB7IG1vZDogbW9kdWxlLmV4cG9ydHMsIGdsb2JhbHMgfSk7CiAgICAgICAgY29uc29sZS5pbmZvKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogbG9hZGVkIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICJcdTIwMTQgZXhwb3J0czoiLAogICAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlLmV4cG9ydHMpLAogICAgICAgICAgIndpbmRvdyBnbG9iYWxzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhnbG9iYWxzKQogICAgICAgICk7CiAgICAgICAgb25SZXNvbHZlZCgpOwogICAgICB9KS5jYXRjaCgoZSkgPT4gewogICAgICAgIGNhY2hlLnNldCh1cmwsIHsKICAgICAgICAgIG1vZDoge30sCiAgICAgICAgICBnbG9iYWxzOiB7fSwKICAgICAgICAgIGVycm9yOiAiZmFpbGVkIHRvIGxvYWQ6ICIgKyAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZSA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSkKICAgICAgICB9KTsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogRkFJTEVEIHRvIGxvYWQiLAogICAgICAgICAgdXJsLAogICAgICAgICAgIigiICsga2luZCArICIpIiwKICAgICAgICAgIGUKICAgICAgICApOwogICAgICAgIG9uUmVzb2x2ZWQoKTsKICAgICAgfSk7CiAgICAgIHBlbmRpbmcuc2V0KHVybCwgcCk7CiAgICAgIHJldHVybiBwOwogICAgfQogICAgZnVuY3Rpb24gcmVzb2x2ZTIodXJsLCBuYW1lKSB7CiAgICAgIGNvbnN0IGVudHJ5ID0gY2FjaGUuZ2V0KHVybCk7CiAgICAgIGlmICghZW50cnkpIHJldHVybiBudWxsOwogICAgICBjb25zdCB7IG1vZCwgZ2xvYmFscyB9ID0gZW50cnk7CiAgICAgIGNvbnN0IEMgPSBtb2QgJiYgbW9kW25hbWVdIHx8IGdsb2JhbHMgJiYgZ2xvYmFsc1tuYW1lXSB8fCB0eXBlb2Ygd2luZG93ICE9PSAidW5kZWZpbmVkIiAmJiB3aW5kb3dbbmFtZV0gfHwgbW9kICYmIG1vZC5kZWZhdWx0OwogICAgICBpZiAodHlwZW9mIEMgPT09ICJmdW5jdGlvbiIpIHJldHVybiBDOwogICAgICBjb25zdCBrZXkgPSB1cmwgKyAiXDAiICsgbmFtZTsKICAgICAgaWYgKCFyZXBvcnRlZE1pc3NpbmcuaGFzKGtleSkpIHsKICAgICAgICByZXBvcnRlZE1pc3Npbmcuc2V0KAogICAgICAgICAga2V5LAogICAgICAgICAgZW50cnkuZXJyb3IgfHwgJ25vIGV4cG9ydCBuYW1lZCAiJyArIG5hbWUgKyAnIiAoaGFzOiAnICsgT2JqZWN0LmtleXMobW9kKS5qb2luKCIsICIpICsgIikiCiAgICAgICAgKTsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSB4LWltcG9ydDogbW9kdWxlIiwKICAgICAgICAgIHVybCwKICAgICAgICAgICJsb2FkZWQgYnV0IGhhcyBubyBjb21wb25lbnQgbmFtZWQiLAogICAgICAgICAgSlNPTi5zdHJpbmdpZnkobmFtZSksCiAgICAgICAgICAiXHUyMDE0IGF2YWlsYWJsZSBleHBvcnRzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhtb2QpLAogICAgICAgICAgIndpbmRvdyBnbG9iYWxzOiIsCiAgICAgICAgICBPYmplY3Qua2V5cyhnbG9iYWxzKSwKICAgICAgICAgICIuIFRoZSBtb2R1bGUgbXVzdCBgbW9kdWxlLmV4cG9ydHMgPSB7IiArIG5hbWUgKyAifWAgb3Igc2V0IGB3aW5kb3cuIiArIG5hbWUgKyAiYC4iCiAgICAgICAgKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHdhaXRGb3JHbG9iYWwobmFtZSkgewogICAgICBpZiAocG9sbGluZy5oYXMobmFtZSkpIHJldHVybjsKICAgICAgcG9sbGluZy5hZGQobmFtZSk7CiAgICAgIGNvbnN0IHN0YXJ0ZWQgPSBEYXRlLm5vdygpOwogICAgICBjb25zdCBpc0NFID0gaXNDdXN0b21FbGVtZW50TmFtZShuYW1lKTsKICAgICAgY29uc3QgdGljayA9ICgpID0+IHsKICAgICAgICBjb25zdCBmb3VuZCA9IGlzQ0UgPyBjdXN0b21FbGVtZW50cy5nZXQobmFtZSkgOiBpc1JlbmRlcmFibGVUeXBlKHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSkpOwogICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgcG9sbGluZy5kZWxldGUobmFtZSk7CiAgICAgICAgICBvblJlc29sdmVkKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChEYXRlLm5vdygpIC0gc3RhcnRlZCA+PSBHTE9CQUxfUE9MTF9USU1FT1VUX01TKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgICAgICJbZGMtcnVudGltZV0geC1pbXBvcnQ6IGdsb2JhbCIsCiAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG5hbWUpLAogICAgICAgICAgICAibmV2ZXIgYXBwZWFyZWQgb24gd2luZG93IGFmdGVyICIgKyBHTE9CQUxfUE9MTF9USU1FT1VUX01TICsgIm1zIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dCh0aWNrLCBHTE9CQUxfUE9MTF9JTlRFUlZBTF9NUyk7CiAgICAgIH07CiAgICAgIHNldFRpbWVvdXQodGljaywgR0xPQkFMX1BPTExfSU5URVJWQUxfTVMpOwogICAgfQogICAgZnVuY3Rpb24gcmVzb2x2ZUdsb2JhbCh1cmwsIG5hbWUpIHsKICAgICAgY29uc3QgaXNDRSA9IGlzQ3VzdG9tRWxlbWVudE5hbWUobmFtZSk7CiAgICAgIGlmICghdXJsKSB7CiAgICAgICAgaWYgKGlzQ0UpIHsKICAgICAgICAgIGlmIChjdXN0b21FbGVtZW50cy5nZXQobmFtZSkpIHJldHVybiBuYW1lOwogICAgICAgICAgd2FpdEZvckdsb2JhbChuYW1lKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBnMiA9IHJlc29sdmVEb3R0ZWRQYXRoKHdpbmRvdywgbmFtZSk7CiAgICAgICAgaWYgKGlzUmVuZGVyYWJsZVR5cGUoZzIpKSByZXR1cm4gZzI7CiAgICAgICAgd2FpdEZvckdsb2JhbChuYW1lKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjb25zdCBlbnRyeSA9IGNhY2hlLmdldCh1cmwpOwogICAgICBpZiAoIWVudHJ5KSByZXR1cm4gbnVsbDsKICAgICAgaWYgKGlzQ0UgJiYgY3VzdG9tRWxlbWVudHMuZ2V0KG5hbWUpKSByZXR1cm4gbmFtZTsKICAgICAgY29uc3QgZyA9IGVudHJ5Lmdsb2JhbHNbbmFtZV0gPz8gcmVzb2x2ZURvdHRlZFBhdGgod2luZG93LCBuYW1lKTsKICAgICAgaWYgKGlzUmVuZGVyYWJsZVR5cGUoZykpIHJldHVybiBnOwogICAgICBpZiAobmFtZS5pbmNsdWRlcygiLiIpKSByZXR1cm4gbnVsbDsKICAgICAgY29uc3Qga2V5ID0gdXJsICsgIlwwZ2xvYmFsXDAiICsgbmFtZTsKICAgICAgaWYgKCFyZXBvcnRlZE1pc3NpbmcuaGFzKGtleSkpIHsKICAgICAgICByZXBvcnRlZE1pc3Npbmcuc2V0KGtleSwgbnVsbCk7CiAgICAgICAgaWYgKGlzQ0UgJiYgIWN1c3RvbUVsZW1lbnRzLmdldChuYW1lKSkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAiW2RjLXJ1bnRpbWVdIHgtaW1wb3J0OiIsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgImxvYWRlZCBidXQgbm8gY3VzdG9tIGVsZW1lbnQiLAogICAgICAgICAgICBKU09OLnN0cmluZ2lmeShuYW1lKSwKICAgICAgICAgICAgImlzIHJlZ2lzdGVyZWQgYW5kIHdpbmRvdy4iICsgbmFtZSArICIgaXMgbm90IGEgZnVuY3Rpb24gXHUyMDE0IHJlbmRlcmluZyA8IiArIG5hbWUgKyAiPiBhcyBhbiB1bmtub3duIGVsZW1lbnQuIgogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRFcnJvcih1cmwsIG5hbWUpIHsKICAgICAgY29uc3QgZW50cnkgPSBjYWNoZS5nZXQodXJsKTsKICAgICAgaWYgKGVudHJ5Py5lcnJvcikgcmV0dXJuIGVudHJ5LmVycm9yOwogICAgICByZXR1cm4gcmVwb3J0ZWRNaXNzaW5nLmdldCh1cmwgKyAiXDAiICsgbmFtZSkgfHwgbnVsbDsKICAgIH0KICAgIHJldHVybiB7IGxvYWQsIHJlc29sdmU6IHJlc29sdmUyLCByZXNvbHZlR2xvYmFsLCBnZXRFcnJvciB9OwogIH0KICBmdW5jdGlvbiBpc0VsZW1lbnRDbGFzcyhnKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gdHlwZW9mIGcgPT09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIEhUTUxFbGVtZW50ICE9PSAidW5kZWZpbmVkIiAmJiBnLnByb3RvdHlwZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OwogICAgfSBjYXRjaCB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIC8vIHNyYy9hdG9taWNzLnRzCiAgdmFyIEFUT01JQ19DU1MgPSAoCiAgICAvLyBsYXlvdXQKICAgICIuZnh7ZGlzcGxheTpmbGV4fS5jb2x7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbn0uZ3JpZHtkaXNwbGF5OmdyaWR9LmFje2FsaWduLWl0ZW1zOmNlbnRlcn0uamN7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uamJ7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmYxe2ZsZXg6MX0ubm9zaHJpbmt7ZmxleC1zaHJpbms6MH0ud3JhcHtmbGV4LXdyYXA6d3JhcH0uZnc1e2ZvbnQtd2VpZ2h0OjUwMH0uZnc2e2ZvbnQtd2VpZ2h0OjYwMH0uZnc3e2ZvbnQtd2VpZ2h0OjcwMH0uZnc4e2ZvbnQtd2VpZ2h0OjgwMH0uZnMxMXtmb250LXNpemU6MTFweH0uZnMxMntmb250LXNpemU6MTJweH0uZnMxM3tmb250LXNpemU6MTNweH0uZnMxNHtmb250LXNpemU6MTRweH0uZnMxNXtmb250LXNpemU6MTVweH0uZnMxNntmb250LXNpemU6MTZweH0uZnMyMHtmb250LXNpemU6MjBweH0uZnMyMntmb250LXNpemU6MjJweH0udXBwZXJ7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfS50Y3t0ZXh0LWFsaWduOmNlbnRlcn0ubm93cmFwe3doaXRlLXNwYWNlOm5vd3JhcH0uZ2FwOHtnYXA6OHB4fS5nYXAxMHtnYXA6MTBweH0uZ2FwMTJ7Z2FwOjEycHh9LmdhcDE2e2dhcDoxNnB4fS5nYXAyNHtnYXA6MjRweH0ubTB7bWFyZ2luOjB9Lm10OHttYXJnaW4tdG9wOjhweH0ubXQxMnttYXJnaW4tdG9wOjEycHh9Lm10MTZ7bWFyZ2luLXRvcDoxNnB4fS5tYjh7bWFyZ2luLWJvdHRvbTo4cHh9Lm1iMTJ7bWFyZ2luLWJvdHRvbToxMnB4fS5tYjE2e21hcmdpbi1ib3R0b206MTZweH0ucG9zcmVse3Bvc2l0aW9uOnJlbGF0aXZlfS5wb3NhYnN7cG9zaXRpb246YWJzb2x1dGV9LnJvdW5ke2JvcmRlci1yYWRpdXM6NTAlfS5vaGlkZXtvdmVyZmxvdzpoaWRkZW59LmJib3h7Ym94LXNpemluZzpib3JkZXItYm94fS5wb2ludGVye2N1cnNvcjpwb2ludGVyfS53MTAwe3dpZHRoOjEwMCV9LmIwe2JvcmRlcjpub25lfSIKICApOwoKICAvLyBzcmMvaGVsbWV0LnRzCiAgdmFyIERFU0lHTl9ET0NfTU9ERV9SRSA9IC88bWV0YVxiW14+XSpcYm5hbWVccyo9XHMqWyInXWRlc2lnbl9kb2NfbW9kZVsiJ11bXj5dKlxiKD86Y29udGVudHx2YWx1ZSlccyo9XHMqWyInXShcdyspWyInXS9pOwogIHZhciBDQU5WQVNfQkdfTElHSFQgPSAiI2YwZWVlNiI7CiAgdmFyIENBTlZBU19CR19EQVJLID0gIiMyZTJjMjYiOwogIGZ1bmN0aW9uIGNyZWF0ZUhlbG1ldE1hbmFnZXIoZG9jLCBpc1N0cmVhbWluZykgewogICAgY29uc3QgbW91bnRlZCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7CiAgICBjb25zdCBsaXZlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBkZXNpZ25Eb2NNb2RlID0gbnVsbDsKICAgIGxldCBjYW52YXNTdHlsZUVsID0gbnVsbDsKICAgIGxldCBhcHBUaGVtZSA9ICJsaWdodCI7CiAgICB0cnkgewogICAgICBjb25zdCBkcyA9IGRvYy5kb2N1bWVudEVsZW1lbnQuZGF0YXNldC50aGVtZTsKICAgICAgYXBwVGhlbWUgPSBkcyA9PT0gImRhcmsiIHx8IGRzID09PSAibGlnaHQiID8gZHMgOiBuZXcgVVJMU2VhcmNoUGFyYW1zKGRvYy5kZWZhdWx0Vmlldz8ubG9jYXRpb24uc2VhcmNoID8/ICIiKS5nZXQoCiAgICAgICAgInRoZW1lIgogICAgICApID09PSAiZGFyayIgPyAiZGFyayIgOiAibGlnaHQiOwogICAgfSBjYXRjaCB7CiAgICB9CiAgICBmdW5jdGlvbiBhcHBseUNhbnZhc0JnKCkgewogICAgICBpZiAoIWNhbnZhc1N0eWxlRWwpIHJldHVybjsKICAgICAgY29uc3QgYmcgPSBhcHBUaGVtZSA9PT0gImRhcmsiID8gQ0FOVkFTX0JHX0RBUksgOiBDQU5WQVNfQkdfTElHSFQ7CiAgICAgIGNhbnZhc1N0eWxlRWwudGV4dENvbnRlbnQgPSBgaHRtbCxib2R5e2JhY2tncm91bmQ6JHtiZ319I2RjLXJvb3Q+LnNjLWhvc3R7cG9zaXRpb246cmVsYXRpdmV9YDsKICAgIH0KICAgIGZ1bmN0aW9uIHBvc3REZXNpZ25Nb2RlKG1vZGUpIHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICB0cnkgewogICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoeyB0eXBlOiAiX19kY19kZXNpZ25fbW9kZSIsIG1vZGUgfSwgIioiKTsKICAgICAgfSBjYXRjaCB7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldERlc2lnbkRvY01vZGUobW9kZSkgewogICAgICBpZiAobW9kZSA9PT0gZGVzaWduRG9jTW9kZSkgcmV0dXJuOwogICAgICBkZXNpZ25Eb2NNb2RlID0gbW9kZTsKICAgICAgcG9zdERlc2lnbk1vZGUobW9kZSk7CiAgICAgIGlmIChtb2RlID09PSAiY2FudmFzIikgewogICAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuc2V0QXR0cmlidXRlKCJkYXRhLWRjLWNhbnZhcyIsICIiKTsKICAgICAgICBjYW52YXNTdHlsZUVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgY2FudmFzU3R5bGVFbC5zZXRBdHRyaWJ1dGUoImRhdGEtZGMtY2FudmFzIiwgIiIpOwogICAgICAgIGFwcGx5Q2FudmFzQmcoKTsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChjYW52YXNTdHlsZUVsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2MuZG9jdW1lbnRFbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgiZGF0YS1kYy1jYW52YXMiKTsKICAgICAgICBjYW52YXNTdHlsZUVsPy5yZW1vdmUoKTsKICAgICAgICBjYW52YXNTdHlsZUVsID0gbnVsbDsKICAgICAgfQogICAgfQogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLCAoZSkgPT4gewogICAgICBjb25zdCB0eXBlID0gZS5kYXRhICYmIGUuZGF0YS50eXBlOwogICAgICBpZiAodHlwZSA9PT0gIl9fZGNfdGhlbWUiKSB7CiAgICAgICAgY29uc3QgdCA9IGUuZGF0YS50aGVtZTsKICAgICAgICBpZiAodCA9PT0gImxpZ2h0IiB8fCB0ID09PSAiZGFyayIpIHsKICAgICAgICAgIGFwcFRoZW1lID0gdDsKICAgICAgICAgIGFwcGx5Q2FudmFzQmcoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghZGVzaWduRG9jTW9kZSB8fCB0eXBlICE9PSAiX19kY19wcm9iZSIpIHJldHVybjsKICAgICAgcG9zdERlc2lnbk1vZGUoZGVzaWduRG9jTW9kZSk7CiAgICB9KTsKICAgIGZ1bmN0aW9uIGNvbXBpbGUobm9kZSkgewogICAgICBjb25zdCByYXcgPSBbLi4ubm9kZS5jaGlsZHJlbl07CiAgICAgIGNvbnN0IGhlbG1ldENsb3NlZCA9IG5vZGUubmV4dFNpYmxpbmcgIT0gbnVsbCB8fCBub2RlLnBhcmVudE5vZGU/Lm5leHRTaWJsaW5nICE9IG51bGw7CiAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZSgiZGF0YS1kYy1hdG9taWNzIikgJiYgIW1vdW50ZWQuaGFzKCJfX2RjLWF0b21pY3MiKSkgewogICAgICAgIG1vdW50ZWQuYWRkKCJfX2RjLWF0b21pY3MiKTsKICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgICAgIGVsLmlkID0gIl9fZGMtYXRvbWljcyI7CiAgICAgICAgZWwudGV4dENvbnRlbnQgPSBBVE9NSUNfQ1NTOwogICAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKGVsKTsKICAgICAgfQogICAgICByZXR1cm4gKF92YWxzLCBjdHgpID0+IHsKICAgICAgICBjb25zdCBuYW1lID0gY3R4ICYmIGN0eC5fX25hbWUgfHwgIiI7CiAgICAgICAgY29uc3Qgc3RyZWFtaW5nID0gISEobmFtZSAmJiBpc1N0cmVhbWluZyhuYW1lKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYXcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGNoaWxkID0gcmF3W2ldOwogICAgICAgICAgY29uc3QgdGFnID0gY2hpbGQudGFnTmFtZTsKICAgICAgICAgIGNvbnN0IG1heUJlUGFydGlhbCA9IHN0cmVhbWluZyAmJiAhaGVsbWV0Q2xvc2VkICYmIGkgPT09IHJhdy5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKHRhZyA9PT0gIlNDUklQVCIpIHsKICAgICAgICAgICAgaWYgKG1heUJlUGFydGlhbCkgY29udGludWU7CiAgICAgICAgICAgIGNvbnN0IGtleSA9ICJTQ1JJUFR8IiArIChjaGlsZC5nZXRBdHRyaWJ1dGUoInNyYyIpIHx8IGNoaWxkLnRleHRDb250ZW50IHx8ICIiKTsKICAgICAgICAgICAgaWYgKG1vdW50ZWQuaGFzKGtleSkpIGNvbnRpbnVlOwogICAgICAgICAgICBtb3VudGVkLmFkZChrZXkpOwogICAgICAgICAgICBjb25zdCBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgICAgICAgZm9yIChjb25zdCB7IG5hbWU6IGFuLCB2YWx1ZSB9IG9mIFsuLi5jaGlsZC5hdHRyaWJ1dGVzXSkKICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoYW4sIHZhbHVlKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnRleHRDb250ZW50KSBlbC50ZXh0Q29udGVudCA9IGNoaWxkLnRleHRDb250ZW50OwogICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PT0gIkxJTksiIHx8IHRhZyA9PT0gIk1FVEEiKSB7CiAgICAgICAgICAgIGlmIChtYXlCZVBhcnRpYWwpIGNvbnRpbnVlOwogICAgICAgICAgICBjb25zdCBrZXkgPSB0YWcgKyAifCIgKyAoY2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIikgfHwgY2hpbGQuZ2V0QXR0cmlidXRlKCJzcmMiKSB8fCBjaGlsZC5vdXRlckhUTUwpOwogICAgICAgICAgICBpZiAobW91bnRlZC5oYXMoa2V5KSkgY29udGludWU7CiAgICAgICAgICAgIG1vdW50ZWQuYWRkKGtleSk7CiAgICAgICAgICAgIGlmICh0YWcgPT09ICJMSU5LIikgewogICAgICAgICAgICAgIGNvbnN0IHJlbCA9IChjaGlsZC5nZXRBdHRyaWJ1dGUoInJlbCIpIHx8ICIiKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9ccysvKTsKICAgICAgICAgICAgICBjb25zdCBocmVmID0gKGNoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpIHx8ICIiKS50cmltKCk7CiAgICAgICAgICAgICAgY29uc3QgcmVzID0gd2luZG93Ll9fcmVzb3VyY2VzOwogICAgICAgICAgICAgIGNvbnN0IHByZSA9IHJlcyAmJiByZWwuaW5jbHVkZXMoInN0eWxlc2hlZXQiKSAmJiAhcmVsLmluY2x1ZGVzKCJhbHRlcm5hdGUiKSA/IHJlc1tocmVmXSA6IHZvaWQgMDsKICAgICAgICAgICAgICBjb25zdCBibG9iID0gdHlwZW9mIHByZSA9PT0gInN0cmluZyIgJiYgcHJlID8gYnVuZGxlZEJsb2IocHJlKSA6IG51bGw7CiAgICAgICAgICAgICAgaWYgKGJsb2IpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZG9jLmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKSB7CiAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgibWVkaWEiLCAibm90IGFsbCIpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5nZXRBdHRyaWJ1dGUoIm1lZGlhIikpIHsKICAgICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJtZWRpYSIsIGNoaWxkLmdldEF0dHJpYnV0ZSgibWVkaWEiKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY2hpbGQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKQogICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgY2hpbGQuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpKTsKICAgICAgICAgICAgICAgIHZvaWQgYmxvYi50ZXh0KCkudGhlbigoY3NzKSA9PiB7CiAgICAgICAgICAgICAgICAgIGVsLnRleHRDb250ZW50ID0gY3NzOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoY2hpbGQuY2xvbmVOb2RlKHRydWUpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUgKyAifCIgKyBpOwogICAgICAgICAgICBsZXQgZWwgPSBsaXZlLmdldChrZXkpOwogICAgICAgICAgICBpZiAoIWVsIHx8IGVsLnRhZ05hbWUgIT09IHRhZykgewogICAgICAgICAgICAgIGlmIChlbCkgZWwucmVtb3ZlKCk7CiAgICAgICAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCh0YWcudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgICAgbGl2ZS5zZXQoa2V5LCBlbCk7CiAgICAgICAgICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lOiBhbiwgdmFsdWUgfSBvZiBbLi4uY2hpbGQuYXR0cmlidXRlc10pIHsKICAgICAgICAgICAgICBpZiAoZWwuZ2V0QXR0cmlidXRlKGFuKSAhPT0gdmFsdWUpIGVsLnNldEF0dHJpYnV0ZShhbiwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbC50ZXh0Q29udGVudCAhPT0gY2hpbGQudGV4dENvbnRlbnQpCiAgICAgICAgICAgICAgZWwudGV4dENvbnRlbnQgPSBjaGlsZC50ZXh0Q29udGVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4geyBjb21waWxlLCBzZXREZXNpZ25Eb2NNb2RlIH07CiAgfQoKICAvLyBzcmMvcHNldWRvLnRzCiAgZnVuY3Rpb24gc2NhblVucXVvdGVkVXJsKGNzcywgaSkgewogICAgaWYgKGNzc1tpXSAhPT0gInUiICYmIGNzc1tpXSAhPT0gIlUiIHx8IGNzcy5zbGljZShpLCBpICsgNCkudG9Mb3dlckNhc2UoKSAhPT0gInVybCgiIHx8IC9bYS16MC05Xy1dL2kudGVzdChjc3NbaSAtIDFdID8/ICIiKSkgewogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBsZXQgaiA9IGkgKyA0OwogICAgd2hpbGUgKGogPCBjc3MubGVuZ3RoICYmIC9ccy8udGVzdChjc3Nbal0pKSBqKys7CiAgICBpZiAoY3NzW2pdID09PSAnIicgfHwgY3NzW2pdID09PSAiJyIpIHJldHVybiAtMTsKICAgIHdoaWxlIChqIDwgY3NzLmxlbmd0aCAmJiBjc3Nbal0gIT09ICIpIikgewogICAgICBpZiAoY3NzW2pdID09PSAiXFwiKSBqKys7CiAgICAgIGorKzsKICAgIH0KICAgIHJldHVybiBqIDwgY3NzLmxlbmd0aCA/IGogKyAxIDogY3NzLmxlbmd0aDsKICB9CiAgZnVuY3Rpb24gc3RyaXBDb21tZW50cyhjc3MpIHsKICAgIGxldCBvdXQgPSAiIjsKICAgIGxldCBxdW90ZSA9ICIiOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjc3MubGVuZ3RoOyBpKyspIHsKICAgICAgY29uc3QgYyA9IGNzc1tpXTsKICAgICAgaWYgKHF1b3RlKSB7CiAgICAgICAgaWYgKGMgPT09ICJcXCIpIHsKICAgICAgICAgIG91dCArPSBjICsgKGNzc1tpICsgMV0gPz8gIiIpOwogICAgICAgICAgaSsrOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChjID09PSBxdW90ZSkgcXVvdGUgPSAiIjsKICAgICAgICBvdXQgKz0gYzsKICAgICAgfSBlbHNlIGlmIChjID09PSAiJyIgfHwgYyA9PT0gJyInKSB7CiAgICAgICAgcXVvdGUgPSBjOwogICAgICAgIG91dCArPSBjOwogICAgICB9IGVsc2UgaWYgKGMgPT09ICIvIiAmJiBjc3NbaSArIDFdID09PSAiKiIpIHsKICAgICAgICBjb25zdCBlbmQgPSBjc3MuaW5kZXhPZigiKi8iLCBpICsgMik7CiAgICAgICAgaSA9IGVuZCA9PT0gLTEgPyBjc3MubGVuZ3RoIDogZW5kICsgMTsKICAgICAgICBvdXQgKz0gIiAiOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuZCA9IHNjYW5VbnF1b3RlZFVybChjc3MsIGkpOwogICAgICAgIGlmIChlbmQgPT09IC0xKSBvdXQgKz0gYzsKICAgICAgICBlbHNlIHsKICAgICAgICAgIG91dCArPSBjc3Muc2xpY2UoaSwgZW5kKTsKICAgICAgICAgIGkgPSBlbmQgLSAxOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIG91dDsKICB9CiAgZnVuY3Rpb24gaW1wb3J0YW50aWZ5KGNzcykgewogICAgY3NzID0gc3RyaXBDb21tZW50cyhjc3MpOwogICAgY29uc3QgZGVjbHMgPSBbXTsKICAgIGxldCBzdGFydCA9IDA7CiAgICBsZXQgZGVwdGggPSAwOwogICAgbGV0IHF1b3RlID0gIiI7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNzcy5sZW5ndGg7IGkrKykgewogICAgICBjb25zdCBjID0gY3NzW2ldOwogICAgICBpZiAocXVvdGUpIHsKICAgICAgICBpZiAoYyA9PT0gIlxcIikgaSsrOwogICAgICAgIGVsc2UgaWYgKGMgPT09IHF1b3RlKSBxdW90ZSA9ICIiOwogICAgICB9IGVsc2UgaWYgKGMgPT09ICInIiB8fCBjID09PSAnIicpIHF1b3RlID0gYzsKICAgICAgZWxzZSBpZiAoYyA9PT0gIigiKSBkZXB0aCsrOwogICAgICBlbHNlIGlmIChjID09PSAiKSIpIGRlcHRoID0gTWF0aC5tYXgoMCwgZGVwdGggLSAxKTsKICAgICAgZWxzZSBpZiAoYyA9PT0gIjsiICYmIGRlcHRoID09PSAwKSB7CiAgICAgICAgZGVjbHMucHVzaChjc3Muc2xpY2Uoc3RhcnQsIGkpKTsKICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnN0IGVuZCA9IHNjYW5VbnF1b3RlZFVybChjc3MsIGkpOwogICAgICAgIGlmIChlbmQgIT09IC0xKSBpID0gZW5kIC0gMTsKICAgICAgfQogICAgfQogICAgZGVjbHMucHVzaChjc3Muc2xpY2Uoc3RhcnQpKTsKICAgIHJldHVybiBkZWNscy5tYXAoKGQpID0+IGQudHJpbSgpKS5maWx0ZXIoQm9vbGVhbikubWFwKChkKSA9PiAvIVxzKmltcG9ydGFudCQvaS50ZXN0KGQpID8gZCA6IGQgKyAiICFpbXBvcnRhbnQiKS5qb2luKCI7Iik7CiAgfQogIGZ1bmN0aW9uIGNyZWF0ZVBzZXVkb1NoZWV0KGRvYykgewogICAgbGV0IGVsID0gbnVsbDsKICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGxldCBuID0gMDsKICAgIHJldHVybiAocHNldWRvLCBjc3MpID0+IHsKICAgICAgY29uc3QgayA9IHBzZXVkbyArICJ8IiArIGNzczsKICAgICAgY29uc3QgaGl0ID0gY2FjaGUuZ2V0KGspOwogICAgICBpZiAoaGl0KSByZXR1cm4gaGl0OwogICAgICBpZiAoIWVsKSB7CiAgICAgICAgZWwgPSBkb2MuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgY29uc3QgY2xzID0gInNjcCIgKyAobisrKS50b1N0cmluZygzNik7CiAgICAgIGNvbnN0IGlzUHNldWRvRWxlbWVudCA9IHBzZXVkbyA9PT0gImJlZm9yZSIgfHwgcHNldWRvID09PSAiYWZ0ZXIiOwogICAgICBjb25zdCBzZWwgPSBpc1BzZXVkb0VsZW1lbnQgPyAiLiIgKyBjbHMgKyAiOjoiICsgcHNldWRvIDogIi4iICsgY2xzICsgIjoiICsgcHNldWRvOwogICAgICBlbC5zaGVldC5pbnNlcnRSdWxlKAogICAgICAgIHNlbCArICJ7IiArIChpc1BzZXVkb0VsZW1lbnQgPyBjc3MgOiBpbXBvcnRhbnRpZnkoY3NzKSkgKyAifSIsCiAgICAgICAgZWwuc2hlZXQuY3NzUnVsZXMubGVuZ3RoCiAgICAgICk7CiAgICAgIGNhY2hlLnNldChrLCBjbHMpOwogICAgICByZXR1cm4gY2xzOwogICAgfTsKICB9CgogIC8vIHNyYy9yZWdpc3RyeS50cwogIGZ1bmN0aW9uIGNyZWF0ZVJlZ2lzdHJ5KCkgewogICAgY29uc3QgZW50cmllcyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZnVuY3Rpb24gZ2V0KG5hbWUpIHsKICAgICAgcmV0dXJuIGVudHJpZXNbbmFtZV0gfHwgKGVudHJpZXNbbmFtZV0gPSB7CiAgICAgICAgaHRtbDogIiIsCiAgICAgICAgdHBsOiBudWxsLAogICAgICAgIExvZ2ljOiBudWxsLAogICAgICAgIGpzU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICBodG1sU3RyZWFtaW5nOiBmYWxzZSwKICAgICAgICB2ZXI6IDAsCiAgICAgICAgc3ViczogLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKSwKICAgICAgICBmZXRjaGVkOiBmYWxzZQogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1bXAobmFtZSkgewogICAgICBjb25zdCByID0gZ2V0KG5hbWUpOwogICAgICByLnZlcisrOwogICAgICBmb3IgKGNvbnN0IGZuIG9mIHIuc3VicykgZm4oKTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIGVudHJpZXMsCiAgICAgIGdldCwKICAgICAgYnVtcCwKICAgICAgYnVtcEFsbCgpIHsKICAgICAgICBmb3IgKGNvbnN0IG4gaW4gZW50cmllcykgYnVtcChuKTsKICAgICAgfQogICAgfTsKICB9CgogIC8vIHNyYy9ydW50aW1lLnRzCiAgdmFyIENPTVBPTkVOVF9ESVIgPSAiLiI7CiAgZnVuY3Rpb24gY3JlYXRlUnVudGltZShkb2MgPSBkb2N1bWVudCkgewogICAgY29uc3QgcmVnaXN0cnkgPSBjcmVhdGVSZWdpc3RyeSgpOwogICAgY29uc3QgcHNldWRvQ2xhc3MgPSBjcmVhdGVQc2V1ZG9TaGVldChkb2MpOwogICAgY29uc3QgaGVsbWV0ID0gY3JlYXRlSGVsbWV0TWFuYWdlcigKICAgICAgZG9jLAogICAgICAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWxTdHJlYW1pbmcKICAgICk7CiAgICBjb25zdCBleHRlcm5hbCA9IGNyZWF0ZUV4dGVybmFsTW9kdWxlcygoKSA9PiByZWdpc3RyeS5idW1wQWxsKCkpOwogICAgY29uc3QgZmFjdG9yeSA9IGNyZWF0ZUNvbXBvbmVudEZhY3RvcnkocmVnaXN0cnksIGVuc3VyZUZldGNoZWQpOwogICAgY29uc3QgaG9zdCA9IHsKICAgICAgY29tcG9uZW50OiAobmFtZSkgPT4gZmFjdG9yeS5nZXREQyhuYW1lKSwKICAgICAgcGxhY2Vob2xkZXI6IChwcm9wcykgPT4gaChQbGFjZWhvbGRlciwgcHJvcHMpLAogICAgICBoZWxtZXQ6IChub2RlKSA9PiBoZWxtZXQuY29tcGlsZShub2RlKSwKICAgICAgbG9hZEV4dGVybmFsOiAoa2luZCwgdXJsLCBhZnRlcikgPT4gZXh0ZXJuYWwubG9hZChraW5kLCB1cmwsIGFmdGVyKSwKICAgICAgcmVzb2x2ZUV4dGVybmFsOiAodXJsLCBuYW1lKSA9PiBleHRlcm5hbC5yZXNvbHZlKHVybCwgbmFtZSksCiAgICAgIHJlc29sdmVFeHRlcm5hbEdsb2JhbDogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwucmVzb2x2ZUdsb2JhbCh1cmwsIG5hbWUpLAogICAgICByZXNvbHZlRXh0ZXJuYWxFcnJvcjogKHVybCwgbmFtZSkgPT4gZXh0ZXJuYWwuZ2V0RXJyb3IodXJsLCBuYW1lKSwKICAgICAgcHNldWRvQ2xhc3MKICAgIH07CiAgICBmdW5jdGlvbiBlbnN1cmVGZXRjaGVkKG5hbWUpIHsKICAgICAgY29uc3QgciA9IHJlZ2lzdHJ5LmdldChuYW1lKTsKICAgICAgaWYgKHIuZmV0Y2hlZCkgcmV0dXJuOwogICAgICByLmZldGNoZWQgPSB0cnVlOwogICAgICBjb25zdCB1cmwgPSBDT01QT05FTlRfRElSICsgIi8iICsgZW5jb2RlVVJJQ29tcG9uZW50KG5hbWUpICsgIi5kYy5odG1sIjsKICAgICAgY29uc3QgcmVzID0gd2luZG93Ll9fcmVzb3VyY2VzOwogICAgICBjb25zdCBwcmUgPSByZXMgPyByZXNbdXJsXSA6IHZvaWQgMDsKICAgICAgY29uc3QgdGFyZ2V0ID0gdHlwZW9mIHByZSA9PT0gInN0cmluZyIgJiYgcHJlID8gcHJlIDogdXJsOwogICAgICBjb25zdCBibG9iID0gYnVuZGxlZEJsb2IodGFyZ2V0KTsKICAgICAgKGJsb2IgPyBibG9iLnRleHQoKSA6IGZldGNoKHRhcmdldCkudGhlbigocmVzMikgPT4gewogICAgICAgIGlmICghcmVzMi5vaykgewogICAgICAgICAgY29uc29sZS5lcnJvcigKICAgICAgICAgICAgJ1tkYy1ydW50aW1lXSBzaWJsaW5nIGZldGNoIGZvciAiJyArIG5hbWUgKyAnIiBmYWlsZWQ6JywKICAgICAgICAgICAgdXJsLAogICAgICAgICAgICAicmV0dXJuZWQiLAogICAgICAgICAgICByZXMyLnN0YXR1cywKICAgICAgICAgICAgIlx1MjAxNCB0aGUgcmVmZXJlbmNlIHJlbmRlcnMgYXMgYW4gZW1wdHkgcGxhY2Vob2xkZXIuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczIudGV4dCgpOwogICAgICB9KSkudGhlbigodCkgPT4gewogICAgICAgIGlmICghdCkgcmV0dXJuOwogICAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRGNUZXh0KHQpOwogICAgICAgIGlmICghcGFyc2VkKSB7CiAgICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgICAnW2RjLXJ1bnRpbWVdIHNpYmxpbmcgZmV0Y2ggZm9yICInICsgbmFtZSArICciOicsCiAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgImhhcyBubyA8eC1kYz4gYmxvY2sgXHUyMDE0IG5vdCBhIERlc2lnbiBDb21wb25lbnQuIgogICAgICAgICAgKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnNlZC5wcm9wcykgci5wcm9wc01ldGEgPSBwYXJzZWQucHJvcHM7CiAgICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgICBpZiAocGFyc2VkLnRlbXBsYXRlICYmICFyLmh0bWwpIHVwZGF0ZUh0bWwobmFtZSwgcGFyc2VkLnRlbXBsYXRlKTsKICAgICAgICBpZiAocGFyc2VkLmpzICYmICFyLkxvZ2ljKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgICB9KS5jYXRjaCgKICAgICAgICAoZSkgPT4gY29uc29sZS5lcnJvcigKICAgICAgICAgICdbZGMtcnVudGltZV0gc2libGluZyBmZXRjaCBmb3IgIicgKyBuYW1lICsgJyIgdGhyZXc6JywKICAgICAgICAgIHVybCwKICAgICAgICAgIGUKICAgICAgICApCiAgICAgICk7CiAgICB9CiAgICBsZXQgcm9vdE5hbWUgPSBudWxsOwogICAgZnVuY3Rpb24gdXBkYXRlSHRtbChuYW1lLCBodG1sKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIHIuaHRtbCA9IGh0bWw7CiAgICAgIGlmIChuYW1lID09PSByb290TmFtZSkgewogICAgICAgIGNvbnN0IG1vZGUgPSBERVNJR05fRE9DX01PREVfUkUuZXhlYyhodG1sKT8uWzFdID8/IG51bGw7CiAgICAgICAgaWYgKG1vZGUgfHwgIXIuaHRtbFN0cmVhbWluZykgaGVsbWV0LnNldERlc2lnbkRvY01vZGUobW9kZSk7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICByLnRwbCA9IGNvbXBpbGVUZW1wbGF0ZShodG1sLCBob3N0KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGNvbnNvbGUuZXJyb3IoIltkYy1ydW50aW1lXSB0ZW1wbGF0ZSBjb21waWxlIEZBSUxFRCBmb3IiLCBuYW1lLCBlKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlSnMobmFtZSwgc3JjKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGNvbnN0IHNlcSA9IHIuanNTZXEgPSAoci5qc1NlcSB8fCAwKSArIDE7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgQ2xzID0gZXZhbERjTG9naWMoc3JjKTsKICAgICAgICBpZiAoci5qc1NlcSAhPT0gc2VxKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBDbHMgIT09ICJmdW5jdGlvbiIpIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG5hbWUgKyAiLmRjLmh0bWw6IDxzY3JpcHQgZGF0YS1kYy1zY3JpcHQ+IG11c3QgZGVmaW5lIGBjbGFzcyBDb21wb25lbnQgZXh0ZW5kcyBEQ0xvZ2ljYCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHIubG9naWNFcnJvciA9IG51bGw7CiAgICAgICAgICByLkxvZ2ljID0gQ2xzOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChyLmpzU2VxICE9PSBzZXEpIHJldHVybjsKICAgICAgICBjb25zb2xlLmVycm9yKAogICAgICAgICAgIltkYy1ydW50aW1lXSBsb2dpYyBjbGFzcyBldmFsIEZBSUxFRCBmb3IiLAogICAgICAgICAgbmFtZSwKICAgICAgICAgICJcdTIwMTQgdGhlIHRlbXBsYXRlIHJlbmRlcnMgd2l0aCBwcm9wcyBvbmx5LiIsCiAgICAgICAgICBlCiAgICAgICAgKTsKICAgICAgICByLmxvZ2ljRXJyb3IgPSBuYW1lICsgIjogIiArIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpKTsKICAgICAgfQogICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgfQogICAgZnVuY3Rpb24gc2V0U3RyZWFtaW5nKG5hbWUsIGtpbmQsIG9uKSB7CiAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHIuaHRtbFN0cmVhbWluZyA9ICEhb247CiAgICAgIGVsc2Ugci5qc1N0cmVhbWluZyA9ICEhb247CiAgICAgIGxldCBhbnkgPSBmYWxzZTsKICAgICAgZm9yIChjb25zdCBuIGluIHJlZ2lzdHJ5LmVudHJpZXMpIHsKICAgICAgICBjb25zdCBlID0gcmVnaXN0cnkuZW50cmllc1tuXTsKICAgICAgICBpZiAoZSAmJiAoZS5odG1sU3RyZWFtaW5nIHx8IGUuanNTdHJlYW1pbmcpKSB7CiAgICAgICAgICBhbnkgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGRvYy5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgic2MtZGMtc3RyZWFtaW5nIiwgYW55KTsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGRjVXBkYXRlKG5hbWUsIGtpbmQsIGNvbnRlbnQsIHN0cmVhbWluZykgewogICAgICBpZiAoc3RyZWFtaW5nKSByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIGlmIChraW5kID09PSAiaHRtbCIpIHsKICAgICAgICBzZXRTdHJlYW1pbmcobmFtZSwgImh0bWwiLCAhIXN0cmVhbWluZyk7CiAgICAgICAgdXBkYXRlSHRtbChuYW1lLCBjb250ZW50KTsKICAgICAgfSBlbHNlIGlmIChraW5kID09PSAianMiKSB7CiAgICAgICAgc2V0U3RyZWFtaW5nKG5hbWUsICJqcyIsICEhc3RyZWFtaW5nKTsKICAgICAgICBpZiAoIXN0cmVhbWluZykgdXBkYXRlSnMobmFtZSwgY29udGVudCk7CiAgICAgIH0gZWxzZSBpZiAoa2luZCA9PT0gInByb3BzIikgewogICAgICAgIGNvbnN0IHsgcHJvcHMsIHByZXZpZXcgfSA9IHBhcnNlRGF0YVByb3BzKGNvbnRlbnQpOwogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgci5wcm9wc01ldGEgPSBwcm9wcyA/PyB2b2lkIDA7CiAgICAgICAgci5wcmV2aWV3ID0gcHJldmlldzsKICAgICAgICByZWdpc3RyeS5idW1wKG5hbWUpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpIHsKICAgICAgcmVnaXN0cnkuZ2V0KG5hbWUpLnByb3BPdmVycmlkZXMgPSBvdmVycmlkZXMgJiYgdHlwZW9mIG92ZXJyaWRlcyA9PT0gIm9iamVjdCIgPyB7IC4uLm92ZXJyaWRlcyB9IDogbnVsbDsKICAgICAgcmVnaXN0cnkuYnVtcChuYW1lKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkb3B0UGFyc2VkKG5hbWUsIHBhcnNlZCkgewogICAgICBpZiAoIXBhcnNlZCkgcmV0dXJuOwogICAgICBjb25zdCByID0gcmVnaXN0cnkuZ2V0KG5hbWUpOwogICAgICBpZiAocGFyc2VkLnByb3BzKSByLnByb3BzTWV0YSA9IHBhcnNlZC5wcm9wczsKICAgICAgaWYgKHBhcnNlZC5wcmV2aWV3KSByLnByZXZpZXcgPSBwYXJzZWQucHJldmlldzsKICAgICAgaWYgKHBhcnNlZC50ZW1wbGF0ZSkgdXBkYXRlSHRtbChuYW1lLCBwYXJzZWQudGVtcGxhdGUpOwogICAgICBpZiAocGFyc2VkLmpzKSB1cGRhdGVKcyhuYW1lLCBwYXJzZWQuanMpOwogICAgfQogICAgcmV0dXJuIHsKICAgICAgcmVnaXN0cnksCiAgICAgIGdldERDOiBmYWN0b3J5LmdldERDLAogICAgICB1cGRhdGVIdG1sLAogICAgICB1cGRhdGVKcywKICAgICAgZGNVcGRhdGUsCiAgICAgIHNldFByb3BzLAogICAgICBhZG9wdFBhcnNlZCwKICAgICAgc2V0Um9vdE5hbWU6IChuYW1lKSA9PiB7CiAgICAgICAgcm9vdE5hbWUgPSBuYW1lOwogICAgICB9LAogICAgICBtYXJrRmV0Y2hlZDogKG5hbWUpID0+IHsKICAgICAgICByZWdpc3RyeS5nZXQobmFtZSkuZmV0Y2hlZCA9IHRydWU7CiAgICAgIH0sCiAgICAgIGFubm90YXRlZFRlbXBsYXRlOiAobmFtZSkgPT4gewogICAgICAgIGNvbnN0IHIgPSByZWdpc3RyeS5nZXQobmFtZSk7CiAgICAgICAgcmV0dXJuIHIudHBsICYmIHIudHBsLl9fYW5ub3RhdGVkIHx8IG51bGw7CiAgICAgIH0sCiAgICAgIHRlbXBsYXRlU291cmNlOiAobmFtZSkgPT4gcmVnaXN0cnkuZ2V0KG5hbWUpLmh0bWwgfHwgbnVsbCwKICAgICAgU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogIH0KCiAgLy8gc3JjL3N0cmVhbS1zdGF0ZS50cwogIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbVRyYWNrZXIoc3RhbGVNcyA9IDZlNCwgbm93ID0gRGF0ZS5ub3cpIHsKICAgIGNvbnN0IHNpbmNlID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTsKICAgIGNvbnN0IGxpdmVPbmUgPSAobikgPT4gewogICAgICBjb25zdCB0ID0gc2luY2UuZ2V0KG4pOwogICAgICBpZiAodCA9PT0gdm9pZCAwKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChub3coKSAtIHQgPiBzdGFsZU1zKSB7CiAgICAgICAgc2luY2UuZGVsZXRlKG4pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CiAgICByZXR1cm4gewogICAgICBwdXNoKG5hbWUsIHN0cmVhbWluZywgdmlld3BvcnRLZXkpIHsKICAgICAgICBpZiAodmlld3BvcnRLZXkgPT09ICJkYy1tb2RlbCIpIHJldHVybjsKICAgICAgICBpZiAoc3RyZWFtaW5nKSBzaW5jZS5zZXQobmFtZSwgbm93KCkpOwogICAgICAgIGVsc2Ugc2luY2UuZGVsZXRlKG5hbWUpOwogICAgICB9LAogICAgICBsaXZlKG5hbWUpIHsKICAgICAgICBpZiAobmFtZSAhPT0gdm9pZCAwKSByZXR1cm4gbGl2ZU9uZShuYW1lKTsKICAgICAgICBmb3IgKGNvbnN0IG4gb2YgWy4uLnNpbmNlLmtleXMoKV0pIGlmIChsaXZlT25lKG4pKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CiAgfQoKICAvLyBzcmMvaW5kZXgudHMKICBmdW5jdGlvbiBoaWRlUmF3VGVtcGxhdGUoKSB7CiAgICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICAgIHMudGV4dENvbnRlbnQgPSAieC1kY3tkaXNwbGF5Om5vbmUhaW1wb3J0YW50fSI7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHMpOwogIH0KICBmdW5jdGlvbiBsb2FkU2NyaXB0KHNyYywgaW50ZWdyaXR5KSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUyLCByZWplY3QpID0+IHsKICAgICAgLy8hIG5vc2VtZ3JlcDogY3JlYXRlLXNjcmlwdC1lbGVtZW50CiAgICAgIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTsKICAgICAgcy5zcmMgPSBzcmM7CiAgICAgIGlmIChpbnRlZ3JpdHkpIHsKICAgICAgICBzLmludGVncml0eSA9IGludGVncml0eTsKICAgICAgICBzLmNyb3NzT3JpZ2luID0gImFub255bW91cyI7CiAgICAgIH0KICAgICAgcy5hc3luYyA9IGZhbHNlOwogICAgICBzLm9ubG9hZCA9ICgpID0+IHJlc29sdmUyKCk7CiAgICAgIHMub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYGZhaWxlZCB0byBsb2FkICR7c3JjfWApKTsKICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBsb2FkUmVhY3RVbWQoKSB7CiAgICBjb25zdCB3ID0gd2luZG93OwogICAgaWYgKHcuUmVhY3QgJiYgdy5SZWFjdERPTSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgY29uc3QgcmVhY3QgPSBjZG5TY3JpcHRGb3IoUkVBQ1RfVVJMLCBSRUFDVF9TUkkpOwogICAgY29uc3QgcmVhY3REb20gPSBjZG5TY3JpcHRGb3IoUkVBQ1RfRE9NX1VSTCwgUkVBQ1RfRE9NX1NSSSk7CiAgICByZXR1cm4gUHJvbWlzZS5hbGwoWwogICAgICBsb2FkU2NyaXB0KHJlYWN0LnNyYywgcmVhY3QuaW50ZWdyaXR5KSwKICAgICAgbG9hZFNjcmlwdChyZWFjdERvbS5zcmMsIHJlYWN0RG9tLmludGVncml0eSkKICAgIF0pLnRoZW4oKCkgPT4gdm9pZCAwKTsKICB9CiAgZnVuY3Rpb24gaW5pdCgpIHsKICAgIGNvbnN0IHJ1bnRpbWUgPSBjcmVhdGVSdW50aW1lKGRvY3VtZW50KTsKICAgIGxldCByb290TmFtZSA9ICJSb290IjsKICAgIGNvbnN0IGJhc2VDc3MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwogICAgYmFzZUNzcy50ZXh0Q29udGVudCA9IEJBU0VfQ1NTOwogICAgZG9jdW1lbnQuaGVhZC5wcmVwZW5kKGJhc2VDc3MpOwogICAgY29uc3Qgbm90aWZ5SG9zdCA9ICgpID0+IHsKICAgICAgaWYgKHdpbmRvdy5wYXJlbnQgPT09IHdpbmRvdykgcmV0dXJuOwogICAgICBjb25zdCByID0gcnVudGltZS5yZWdpc3RyeS5lbnRyaWVzW3Jvb3ROYW1lXTsKICAgICAgdHJ5IHsKICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKAogICAgICAgICAgewogICAgICAgICAgICB0eXBlOiAiX19kY19ib290ZWQiLAogICAgICAgICAgICByb290TmFtZSwKICAgICAgICAgICAgcHJvcHNNZXRhOiByICYmIHIucHJvcHNNZXRhIHx8IG51bGwsCiAgICAgICAgICAgIHByZXZpZXc6IHIgJiYgci5wcmV2aWV3IHx8IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICAiKiIKICAgICAgICApOwogICAgICB9IGNhdGNoIHsKICAgICAgfQogICAgfTsKICAgIGNvbnN0IHN0cmVhbXMgPSBjcmVhdGVTdHJlYW1UcmFja2VyKCk7CiAgICBjb25zdCBhcGkgPSB7CiAgICAgIF9fZGNVcGRhdGU6IChuYW1lLCBraW5kLCBjb250ZW50LCBzdHJlYW1pbmcsIHZpZXdwb3J0S2V5KSA9PiB7CiAgICAgICAgc3RyZWFtcy5wdXNoKG5hbWUsIHN0cmVhbWluZywgdmlld3BvcnRLZXkpOwogICAgICAgIHJ1bnRpbWUuZGNVcGRhdGUobmFtZSwga2luZCwgY29udGVudCwgc3RyZWFtaW5nKTsKICAgICAgICBpZiAobmFtZSA9PT0gcm9vdE5hbWUgJiYgIXN0cmVhbWluZyAmJiBraW5kID09PSAicHJvcHMiKSBub3RpZnlIb3N0KCk7CiAgICAgIH0sCiAgICAgIF9fZGNTdHJlYW1pbmc6IChuYW1lKSA9PiBzdHJlYW1zLmxpdmUobmFtZSksCiAgICAgIF9fZGNTZXRQcm9wczogKG5hbWUsIG92ZXJyaWRlcykgPT4gcnVudGltZS5zZXRQcm9wcyhuYW1lLCBvdmVycmlkZXMpLAogICAgICAvKiogTmFtZSBvZiB0aGUgY29tcG9uZW50IGN1cnJlbnRseSBtb3VudGVkIGFzIHRoZSBwYWdlIHJvb3Qg4oCUIERDIHRvb2xzCiAgICAgICAqICBwdXNoIHRoZWlyIHRlbXBsYXRlLXN0cmVhbSBoZXJlIHdoZW4gdGFyZ2V0aW5nICJ0aGUgb3BlbiBwYWdlIi4gKi8KICAgICAgX19kY1Jvb3ROYW1lOiAoKSA9PiByb290TmFtZSwKICAgICAgLyoqIEVkaXRvciBicmlkZ2Ug4oCUIHRoZSBlbmNvZGVkLCBgZGF0YS1kYy10cGxgLWFubm90YXRlZCB0ZW1wbGF0ZSBzb3VyY2UuCiAgICAgICAqICBUaGUgaG9zdCBlZGl0b3IgcGFyc2VzIHRoaXMgaW50byBpdHMgb3duIHRlbXBsYXRlIERPTSBzbyBpdCBjYW4gbWFwIGEKICAgICAgICogIHJlbmRlcmVkIG5vZGUgKGNhcnJ5aW5nIHRoZSBzYW1lIGBkYXRhLWRjLXRwbGApIGJhY2sgdG8gdGhlIHNvdXJjZQogICAgICAgKiAgbm9kZSB0aGF0IGVtaXR0ZWQgaXQuIFJldHVybnMgdGhlIGVuY29kZWQgZm9ybSAoYHNjLWNhbWVsLSpgIGF0dHJzLAogICAgICAgKiAgYDxzYy1yYXctKj5gL2A8c2MtaGVsbWV0PmAgdGFncyk7IHRoZSBlZGl0b3IgZGVjb2RlcyBvbiBzZXJpYWxpemUuICovCiAgICAgIF9fZGNBbm5vdGF0ZWRUZW1wbGF0ZTogKG5hbWUpID0+IHJ1bnRpbWUuYW5ub3RhdGVkVGVtcGxhdGUobmFtZSksCiAgICAgIC8qKiBFZGl0b3IgYnJpZGdlIOKAlCB0aGUgKm9yaWdpbmFsKiAoZGVjb2RlZCkgdGVtcGxhdGUgc291cmNlLiAqLwogICAgICBfX2RjVGVtcGxhdGVTb3VyY2U6IChuYW1lKSA9PiBydW50aW1lLnRlbXBsYXRlU291cmNlKG5hbWUpLAogICAgICBfX2RjQm9vdDogKCkgPT4gewogICAgICAgIHJvb3ROYW1lID0gYm9vdChydW50aW1lLCBkb2N1bWVudCkgPz8gcm9vdE5hbWU7CiAgICAgICAgbm90aWZ5SG9zdCgpOwogICAgICB9LAogICAgICBfX2RjUmVnaXN0cnk6IHJ1bnRpbWUucmVnaXN0cnkuZW50cmllcywKICAgICAgZ2V0REM6IChuYW1lKSA9PiBydW50aW1lLmdldERDKG5hbWUpLAogICAgICAvLyBgRENMb2dpY2AgaXMgdGhlIGRvY3VtZW50ZWQgYmFzZSBjbGFzcyBuYW1lOyBgU3RyZWFtYWJsZUxvZ2ljYCBpcyB0aGUKICAgICAgLy8gaW1wbGVtZW50YXRpb24gYWxpYXMga2VwdCBmb3IgYW55IHByb2plY3QgdGhhdCBhbHJlYWR5IHJlZmVyZW5jZXMgaXQuCiAgICAgIERDTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljLAogICAgICBTdHJlYW1hYmxlTG9naWM6IHJ1bnRpbWUuU3RyZWFtYWJsZUxvZ2ljCiAgICB9OwogICAgT2JqZWN0LmFzc2lnbih3aW5kb3csIGFwaSk7CiAgICB3aW5kb3cuX19kY0NvbnRlbnRLZXllZCA9IHRydWU7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gImxvYWRpbmciKSBhcGkuX19kY0Jvb3QoKTsKICAgIGVsc2UgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsICgpID0+IGFwaS5fX2RjQm9vdCgpKTsKICB9CiAgaGlkZVJhd1RlbXBsYXRlKCk7CiAgbG9hZFJlYWN0VW1kKCkudGhlbihpbml0KS5jYXRjaCgoZXJyKSA9PiB7CiAgICBjb25zb2xlLmVycm9yKCJbZGNdIGZhaWxlZCB0byBsb2FkIFJlYWN0IG9yIGJvb3Q6IiwgZXJyKTsKICAgIHRocm93IGVycjsKICB9KTsKfSkoKTsKPC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+Cjx4LWRjPgo8aGVsbWV0PgoKPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tIj4KPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbj0iIj4KPHN0eWxlPgogIGJvZHkgeyBtYXJnaW46IDA7IGJhY2tncm91bmQ6ICNGRkZERkI7IH0KICBhIHsgY29sb3I6ICNCNDAwNkE7IH0KICBhOmhvdmVyIHsgY29sb3I6ICMxNDI2MUM7IH0KICAuY2Itb3B0OmZvY3VzLXZpc2libGUsIC5jYi1pbnA6Zm9jdXMtdmlzaWJsZSB7IG91dGxpbmU6IDNweCBzb2xpZCAjMDBBMERDOyBvdXRsaW5lLW9mZnNldDogMnB4OyB9CiAgQG1lZGlhIChtYXgtd2lkdGg6IDkwMHB4KXsKICAgIC5jYi1sYXlvdXR7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1wYW5lbHsgcG9zaXRpb246IHN0YXRpYyAhaW1wb3J0YW50OyB0b3A6IDAgIWltcG9ydGFudDsgei1pbmRleDogNjsgcGFkZGluZzogOHB4ICFpbXBvcnRhbnQ7IGJvcmRlci1yYWRpdXM6IDAgMCAyMHB4IDIwcHggIWltcG9ydGFudDsgYm94LXNoYWRvdzogMCA2cHggMCAjQ0JCM0YwICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1zdmd7IG1heC1oZWlnaHQ6IDMydmg7IH0KICAgIC5jYi1jYXB0aW9ueyBkaXNwbGF5OiBub25lOyB9CiAgfQogIEBtZWRpYSAobWF4LXdpZHRoOiA3MDBweCl7CiAgICBib2R5ID4geC1kYyA+IGRpdiB7IHBhZGRpbmc6IDI0cHggMTJweCA0OHB4ICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1jYXJkcyB7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyICFpbXBvcnRhbnQ7IGdhcDogMTJweCAhaW1wb3J0YW50OyB9CiAgICAuY2ItcGFuZWwgeyBib3JkZXItcmFkaXVzOiAxOHB4ICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1zdmcgeyBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7IHdpZHRoOiAxMDAlICFpbXBvcnRhbnQ7IH0KICAgIC5jYi1vcHQgeyBtaW4td2lkdGg6IDA7IHBhZGRpbmctbGVmdDogMCAhaW1wb3J0YW50OyBwYWRkaW5nLXJpZ2h0OiAwICFpbXBvcnRhbnQ7IH0KICAgIGgxIHsgZm9udC1zaXplOiBjbGFtcCgzMHB4LCAxMHZ3LCA0MnB4KSAhaW1wb3J0YW50OyB9CiAgfQo8L3N0eWxlPgo8L2hlbG1ldD4KPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6IE51bml0bywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOyBjb2xvcjogIzE0MjYxQzsgYmFja2dyb3VuZDogI0ZGRkRGQjsgcGFkZGluZzogNDRweCAyNHB4IDgwcHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7Ij4KICAKPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiAxMDQwcHg7IG1hcmdpbjogMCBhdXRvOyI+CgogICAgPGhlYWRlciBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAyMnB4OyI+CiAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxM3B4OyBsZXR0ZXItc3BhY2luZzogLjE0ZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiAjQjQwMDZBOyBiYWNrZ3JvdW5kOiAjRkNFOUYzOyBib3JkZXItcmFkaXVzOiAzMHB4OyBwYWRkaW5nOiA2cHggMThweDsgbWFyZ2luLWJvdHRvbTogMTRweDsiPkxpZmUgYmFsYW5jZTwvZGl2PgogICAgICA8aDEgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogY2xhbXAoMzRweCwgNXZ3LCA1MnB4KTsgbWFyZ2luOiAwIDAgMTJweDsgbGluZS1oZWlnaHQ6IDEuMDQ7IHRleHQtd3JhcDogYmFsYW5jZTsiPk15IExpZmUgQmFsYW5jZSA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMDBBMERDLCAjREMwMDc4KTsgLXdlYmtpdC1iYWNrZ3JvdW5kLWNsaXA6IHRleHQ7IGJhY2tncm91bmQtY2xpcDogdGV4dDsgY29sb3I6IHRyYW5zcGFyZW50OyI+SG91c2U8L3NwYW4+PC9oMT4KICAgICAgPHAgc3R5bGU9ImNvbG9yOiAjNTk2MTVBOyBmb250LXNpemU6IDE2cHg7IG1heC13aWR0aDogNjQwcHg7IG1hcmdpbjogMCBhdXRvIDE2cHg7IGxpbmUtaGVpZ2h0OiAxLjY7IHRleHQtd3JhcDogcHJldHR5OyI+VGVuIHF1ZXN0aW9ucyBhYm91dCB0ZW4gYXJlYXMgb2YgeW91ciBsaWZlLiBBbnN3ZXIgaG9uZXN0bHkgb24gYSBzY2FsZSBmcm9tIDEgdG8gNS4gPGJyPkVhY2ggcm9vbSBjaGFuZ2VzIGNvbG9yIGJhc2VkIG9uIHlvdXIgcmVzcG9uc2UuIEF0IHRoZSBlbmQsIHlvdeKAmWxsIHJlY2VpdmUgb25lIHByYWN0aWNhbCBzdWdnZXN0aW9uIGZvciBlYWNoIGFyZWEgYW5kIG1ha2UgYSBwZXJzb25hbCBjb21taXRtZW50LjwvcD4KICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IGdhcDogMTBweDsgZmxleC13cmFwOiB3cmFwOyBmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDEzcHg7IGNvbG9yOiAjM0E0NDNFOyI+CiAgICAgICAgPHNwYW4gc3R5bGU9ImJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMnB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDIwcHg7IHBhZGRpbmc6IDVweCAxNHB4OyI+MTAgcXVlc3Rpb25zPC9zcGFuPgogICAgICAgIDxzcGFuIHN0eWxlPSJiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXI6IDJweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAyMHB4OyBwYWRkaW5nOiA1cHggMTRweDsiPjUgbWludXRlczwvc3Bhbj4KICAgICAgICA8c3BhbiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyOiAycHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMjBweDsgcGFkZGluZzogNXB4IDE0cHg7Ij5MZWF2ZSB3aXRoIDEwIHByYWN0aWNhbCBzdWdnZXN0aW9ucyBhbmQgb25lIGNvbW1pdG1lbnQ8L3NwYW4+CiAgICAgIDwvZGl2PgogICAgPC9oZWFkZXI+CgogICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA2MjBweDsgbWFyZ2luOiAwIGF1dG8gMjZweDsiPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBiYXNlbGluZTsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzNBNDQzRTsgbWFyZ2luLWJvdHRvbTogN3B4OyI+CiAgICAgICAgPHNwYW4+e3sgcHJvZ3Jlc3NMYWJlbCB9fTwvc3Bhbj4KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM1OTYxNUE7Ij57eyBwcm9ncmVzc0hpbnQgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJoZWlnaHQ6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDlweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBvdmVyZmxvdzogaGlkZGVuOyI+CiAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiAxMDAlOyB3aWR0aDoge3sgcHJvZ3Jlc3NQY3QgfX07IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg5MGRlZywgIzAwQTBEQywgIzhBNUZBRSwgI0RDMDA3OCk7IHRyYW5zaXRpb246IHdpZHRoIC4zNXMgZWFzZTsiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyOyBnYXA6IDE0cHg7IG1hcmdpbjogMCAwIDI2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7IGZsZXgtd3JhcDogd3JhcDsiPgogICAgICA8c3BhbiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogN3B4OyI+PHNwYW4gc3R5bGU9IndpZHRoOiAxNnB4OyBoZWlnaHQ6IDE2cHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Ij48L3NwYW4+VW5hbnN3ZXJlZDwvc3Bhbj4KICAgICAgPHNwYW4+MSDCtyBDb2xkPC9zcGFuPgogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMTcwcHg7IGhlaWdodDogMTNweDsgYm9yZGVyLXJhZGl1czogOXB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoOTBkZWcsIHJnYmEoMCwxNjAsMjIwLC4zMiksIHJnYmEoMTM4LDk1LDE3NCwuNSksIHJnYmEoMjIwLDAsMTIwLC43MikpOyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7Ij48L2Rpdj4KICAgICAgPHNwYW4+NSDCtyBWZXJ5IHdhcm08L3NwYW4+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJjYi1sYXlvdXQiIHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IG1pbm1heCgwLCAxZnIpOyBnYXA6IDMwcHg7IGFsaWduLWl0ZW1zOiBzdGFydDsiPgoKICAgICAgPGRpdiBjbGFzcz0iY2ItcGFuZWwiIHN0eWxlPSJwb3NpdGlvbjogc3RhdGljOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXItcmFkaXVzOiAyNHB4OyBwYWRkaW5nOiAxNnB4IDE0cHggMTJweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3gtc2hhZG93OiA3cHggN3B4IDAgI0NCQjNGMDsiPgogICAgICAgIDxzdmcgcmVmPSJ7eyBzdmdSZWYgfX0iIGNsYXNzPSJjYi1zdmciIHNjLWNhbWVsLXZpZXctYm94PSIwIDAgMTQwMCA5NTAiIHN0eWxlPSJ3aWR0aDogMTAwJTsgbWF4LXdpZHRoOiA3NjBweDsgbWF4LWhlaWdodDogNTh2aDsgaGVpZ2h0OiBhdXRvOyBkaXNwbGF5OiBibG9jazsgbWFyZ2luOiAwIGF1dG87IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0ie3sgYXJpYUhvdXNlIH19Ij4KICAgICAgICAgIDxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzE0MjYxQyIgc3Ryb2tlLXdpZHRoPSI2IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPgoKICAgICAgICAgICAgPCEtLSA9PT09PSBNSSBFTlRPUk5POiBmcmFuamEgZGUgc3VlbG8gPT09PT0gLS0+CiAgICAgICAgICAgIDxyZWN0IHg9IjQwIiB5PSI4MTgiIHdpZHRoPSIxMzIwIiBoZWlnaHQ9Ijk2IiByeD0iMjYiIGZpbGw9Int7IGMucjQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgeD0iNDAiIHk9IjgxOCIgd2lkdGg9IjEzMjAiIGhlaWdodD0iOTYiIHJ4PSIyNiI+PC9yZWN0PgogICAgICAgICAgICA8dGV4dCB4PSIxMTIiIHk9Ijg3NiIgZm9udC1mYW1pbHk9IidCYWxvbyAyJywgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjcwMCIgZm9udC1zaXplPSIyNCIgZmlsbD0iIzE0MjYxQyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjciIHBhaW50LW9yZGVyPSJzdHJva2UiPk15IGVudmlyb25tZW50PC90ZXh0PgoKICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJ7eyBjLmY0IH19Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNOTAyLDg4MiBDOTAyLDg3MyA5NzIsODczIDk3Miw4ODIgQzk3Miw4OTEgOTAyLDg5MSA5MDIsODgyIFoiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAwMiw4NjQgQzEwMDIsODU2IDEwNjAsODU2IDEwNjAsODY0IEMxMDYwLDg3MiAxMDAyLDg3MiAxMDAyLDg2NCBaIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KCiAgICAgICAgICAgIDwhLS0gw6FyYm9sIC0tPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY0IH19IiBkPSJNOTQsODE4IEM5OCw3NjQgODgsNzI0IDEwMiw2ODIgTDEzNCw2ODIgQzE0Niw3MjggMTMyLDc2OCAxNDAsODE4IFoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNCB9fSIgZD0iTTExOCw0OTAgQzE2MSw0ODUgMTk0LDUwOCAxOTgsNTQzIEMyMzMsNTU3IDIzNSw2MDIgMjA5LDYyMSBDMjExLDY1NCAxODAsNjc3IDE0Nyw2NjggQzEyNiw2OTIgODQsNjg5IDY3LDY2OCBDMzIsNjczIDEwLDY0MCAyNSw2MTAgQzQsNTg0IDE5LDU0MiA1Miw1MzUgQzU3LDUwMiA4OCw0ODMgMTE4LDQ5MCBaIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTExOCw2ODIgQzExNiw2MzIgMTE4LDU4NCAxMjAsNTQ4Ij48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTExOCw2MzQgQzEwMiw2MjAgODYsNjEwIDcwLDYwMiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTksNjA2IEMxMzQsNTkyIDE1MCw1ODIgMTY2LDU3NiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTgsNTcwIEMxMDgsNTYwIDk4LDU1MiA4OCw1NDYiPjwvcGF0aD4KCiAgICAgICAgICAgIDwhLS0gYXJidXN0b3MgeSBmbG9yZXMgLS0+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Int7IGMuZjQgfX0iIGQ9Ik0xMjA1LDgxOCBDMTE3OCw4MTggMTE3MCw3OTAgMTE4OCw3NzYgQzExODgsNzUwIDEyMjQsNzQyIDEyNDAsNzYwIEMxMjY2LDc0OCAxMjkwLDc3MCAxMjgyLDc5MiBDMTI5NCw4MDQgMTI4Niw4MTggMTI2OCw4MTggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY0IH19IiBkPSJNMTI5OCw4MTggQzEyNzgsODE4IDEyNzIsNzk4IDEyODYsNzg4IEMxMjg2LDc2NiAxMzIwLDc2MCAxMzMyLDc3NiBDMTM1NCw3NzIgMTM2OCw3OTQgMTM1NCw4MDggQzEzNTgsODE2IDEzNDgsODE4IDEzMzYsODE4IFoiPjwvcGF0aD4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjI4LDgxOCBDMjMwLDgwNCAyMjQsNzk2IDIyMCw3OTAiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1MCw4MTggQzExNTIsODA0IDExNDYsNzk2IDExNDIsNzkwIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0IiBmaWxsPSJ7eyBjLmY0IH19Ij4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSIyMTgiIGN5PSI3ODQiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjExNDAiIGN5PSI3ODQiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IFZJREEgU09DSUFMOiB0ZXJyYXphID09PT09IC0tPgogICAgICAgICAgICA8cmVjdCB4PSI5NTQiIHk9IjU1NiIgd2lkdGg9IjIxNiIgaGVpZ2h0PSIyNjIiIHJ4PSIxNiIgZmlsbD0ie3sgYy5yMiB9fSIgc3Ryb2tlPSJub25lIj48L3JlY3Q+CiAgICAgICAgICAgIDx0ZXh0IHg9IjEwNjIiIHk9IjU0NCIgdGV4dC1hbmNob3I9Im1pZGRsZSIgZm9udC1mYW1pbHk9IidCYWxvbyAyJywgc2Fucy1zZXJpZiIgZm9udC13ZWlnaHQ9IjcwMCIgZm9udC1zaXplPSIyNCIgZmlsbD0iIzE0MjYxQyIgc3Ryb2tlPSIjRkZGRkZGIiBzdHJva2Utd2lkdGg9IjciIHBhaW50LW9yZGVyPSJzdHJva2UiPlNvY2lhbCBsaWZlPC90ZXh0PgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmYyIH19IiB4PSI5NjIiIHk9Ijc4MCIgd2lkdGg9IjE4IiBoZWlnaHQ9IjM4IiByeD0iMyI+PC9yZWN0PgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmYyIH19IiB4PSIxMTI4IiB5PSI3ODAiIHdpZHRoPSIxOCIgaGVpZ2h0PSIzOCIgcng9IjMiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMiB9fSIgeD0iOTUwIiB5PSI3NTQiIHdpZHRoPSIyMTAiIGhlaWdodD0iMjYiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTk4MCw3NTYgTDk4MCw3NzgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTAxMCw3NTYgTDEwMTAsNzc4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwNDAsNzU2IEwxMDQwLDc3OCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDcwLDc1NiBMMTA3MCw3NzgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEwMCw3NTYgTDExMDAsNzc4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTExMzAsNzU2IEwxMTMwLDc3OCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDU1LDYwNiBMMTA1NSw3NTQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mMiB9fSIgZD0iTTk5Niw2MDggQzEwMDAsNTY4IDExMTAsNTY4IDExMTQsNjA4IEMxMTAwLDU5OCAxMDg0LDYxMiAxMDY5LDYwMiBDMTA1Niw2MTQgMTA0MCw1OTggMTAyNiw2MDggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNOTUwLDY2MCBMMTE2MCw2NjAiPjwvcGF0aD4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNOTU4LDY2MiBMOTU4LDc1MiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05OTgsNjYyIEw5OTgsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwMzgsNjYyIEwxMDM4LDc1MiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDc4LDY2MiBMMTA3OCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMTExOCw2NjIgTDExMTgsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTExNTIsNjYyIEwxMTUyLDc1MiI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjIgfX0iPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NjQsNzA2IEw5NzgsNjUyIEwxMDE0LDY1OSBMMTAwMCw3MDggWiI+PC9wYXRoPgogICAgICAgICAgICAgIDxyZWN0IHg9Ijk2MiIgeT0iNzAwIiB3aWR0aD0iNjYiIGhlaWdodD0iMTgiIHJ4PSI4Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iOTY0IiB5PSI3MjAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMCIgcng9IjUiPjwvcmVjdD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik05NzAsNzMwIEw5NzAsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI1IiBkPSJNMTAyMCw3MzAgTDEwMjAsNzUyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTEwOTQsNjU5IEwxMTMwLDY1MiBMMTE0NCw3MDYgTDExMDgsNzA4IFoiPjwvcGF0aD4KICAgICAgICAgICAgICA8cmVjdCB4PSIxMDgwIiB5PSI3MDAiIHdpZHRoPSI2NiIgaGVpZ2h0PSIxOCIgcng9IjgiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSIxMDgyIiB5PSI3MjAiIHdpZHRoPSI2MiIgaGVpZ2h0PSIxMCIgcng9IjUiPjwvcmVjdD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMDg4LDczMCBMMTA4OCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik0xMTM4LDczMCBMMTEzOCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NzIsNjg0IEwxMDA2LDY5MSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMTAyLDY5MSBMMTEzNiw2ODQiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgoKICAgICAgICAgICAgPCEtLSA9PT09PSBjaGltZW5lYSA9PT09PSAtLT4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iODAyIiB5PSIxMTYiIHdpZHRoPSI2NiIgaGVpZ2h0PSIxMzAiPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iNzkwIiB5PSI5OCIgd2lkdGg9IjkwIiBoZWlnaHQ9IjIwIiByeD0iNCI+PC9yZWN0PgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MDIsMTQwIEw4NjgsMTQwIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgwMiwxNjQgTDg2OCwxNjQiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODA2LDE4OCBMODY4LDE4OCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MzUsMTE4IEw4MzUsMTQwIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgxOCwxNDAgTDgxOCwxNjQiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODUyLDE0MCBMODUyLDE2NCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik04MzUsMTY0IEw4MzUsMTg4Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgxOCwxODggTDgxOCwxOTciPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODUyLDE4OCBMODUyLDIxOCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IENSRUNJTUlFTlRPOiDDoXRpY28gPT09PT0gLS0+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9IiNGRkZGRkYiIGQ9Ik0yMjgsMzAyIEMyMjYsMjk2IDIzMiwyOTAgMjM4LDI4NiBMNTkyLDY0IEM1OTgsNjAgNjA0LDYwIDYxMCw2NCBMOTY0LDI4NiBDOTcwLDI5MCA5NzQsMjk2IDk3MiwzMDIgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLnI2IH19IiBzdHJva2U9Im5vbmUiIGQ9Ik0yMzIsMjk4IEw1OTgsNjggTDk2NiwyOTggWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjI4LDMwMiBDMjI2LDI5NiAyMzIsMjkwIDIzOCwyODYgTDU5Miw2NCBDNTk4LDYwIDYwNCw2MCA2MTAsNjQgTDk2NCwyODYgQzk3MCwyOTAgOTc0LDI5NiA5NzIsMzAyIFoiPjwvcGF0aD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mNiB9fSIgeD0iNDA0IiB5PSIxODIiIHdpZHRoPSI5NiIgaGVpZ2h0PSIxMTIiIHJ4PSI3Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQwNCwyMTAgTDUwMCwyMTAiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNDA0LDIzOCBMNTAwLDIzOCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MDQsMjY2IEw1MDAsMjY2Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0IiBmaWxsPSJ7eyBjLmY2IH19Ij4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjE4OCIgd2lkdGg9IjE1IiBoZWlnaHQ9IjIwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzMSIgeT0iMTg4IiB3aWR0aD0iMTUiIGhlaWdodD0iMjAiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDU0IiB5PSIxOTAiIHdpZHRoPSIxMyIgaGVpZ2h0PSIxOCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjIxNiIgd2lkdGg9IjE1IiBoZWlnaHQ9IjIwIiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzNCIgeT0iMjE4IiB3aWR0aD0iMTMiIGhlaWdodD0iMTgiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDY2IiB5PSIyMTYiIHdpZHRoPSIxNSIgaGVpZ2h0PSIyMCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTIiIHk9IjI0NiIgd2lkdGg9IjE0IiBoZWlnaHQ9IjE4IiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzMCIgeT0iMjQ0IiB3aWR0aD0iMTUiIGhlaWdodD0iMjAiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDUyIiB5PSIyNDYiIHdpZHRoPSIxNCIgaGVpZ2h0PSIxOCIgcng9IjIiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MTgiIHk9IjI3NCIgd2lkdGg9IjE1IiBoZWlnaHQ9IjE2IiByeD0iMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQzOSIgeT0iMjcyIiB3aWR0aD0iMTMiIGhlaWdodD0iMTgiIHJ4PSIyIj48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGNpcmNsZSBjeD0iNjAwIiBjeT0iMTM4IiByPSIzNCIgZmlsbD0ie3sgYy5mNiB9fSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTYwMCwxMDQgTDYwMCwxNzIiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTY2LDEzOCBMNjM0LDEzOCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjYgfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjcwOCIgeT0iMjI4IiB3aWR0aD0iNzIiIGhlaWdodD0iNTIiIHJ4PSIxNCI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjY5MiIgeT0iMjY2IiB3aWR0aD0iMTA0IiBoZWlnaHQ9IjMwIiByeD0iMTEiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI2ODYiIHk9IjI1MCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjQ2IiByeD0iOSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijc4MiIgeT0iMjUwIiB3aWR0aD0iMjAiIGhlaWdodD0iNDYiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI1Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNzAwLDI5NiBMNzAwLDMwMCI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik03ODgsMjk2IEw3ODgsMzAwIj48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHBhdGggZD0iTTgzMiwyOTYgTDgzMiwyNjIiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNiB9fSIgZD0iTTgxNiwyMzggTDg1MCwyMzggTDg2MCwyNjIgTDgwNiwyNjIgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik04MTgsMjk2IEw4NDYsMjk2Ij48L3BhdGg+CiAgICAgICAgICAgIDx0ZXh0IHg9IjYwMCIgeT0iMjE0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UGVyc29uYWwgZ3Jvd3RoPC90ZXh0PgoKICAgICAgICAgICAgPCEtLSA9PT09PSBjdWVycG8gZGUgbGEgY2FzYSA9PT09PSAtLT4KICAgICAgICAgICAgPHJlY3QgZmlsbD0iI0ZGRkZGRiIgeD0iMjUwIiB5PSIzMDAiIHdpZHRoPSI3MDAiIGhlaWdodD0iNTE4IiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8ZyBzdHJva2U9Im5vbmUiPgogICAgICAgICAgICAgIDxyZWN0IHg9IjI1MiIgeT0iMzAyIiB3aWR0aD0iMzQ2IiBoZWlnaHQ9IjIwNiIgZmlsbD0ie3sgYy5yMSB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjYwMiIgeT0iMzAyIiB3aWR0aD0iMzQ2IiBoZWlnaHQ9IjIwNiIgZmlsbD0ie3sgYy5yOCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI1MiIgeT0iNTEyIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjI0MCIgZmlsbD0ie3sgYy5yMCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjQ2MiIgeT0iNTEyIiB3aWR0aD0iMTYyIiBoZWlnaHQ9IjI0MCIgZmlsbD0ie3sgYy5yNSB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjYyOCIgeT0iNTEyIiB3aWR0aD0iMTQ4IiBoZWlnaHQ9IjI0MCIgZmlsbD0ie3sgYy5yOSB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijc4MCIgeT0iNTEyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjI0MCIgZmlsbD0ie3sgYy5yMyB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI1MiIgeT0iNzU2IiB3aWR0aD0iNjk2IiBoZWlnaHQ9IjYwIiBmaWxsPSJ7eyBjLnI3IH19Ij48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHJlY3QgeD0iMjUwIiB5PSIzMDAiIHdpZHRoPSI3MDAiIGhlaWdodD0iNTE4IiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBkPSJNMjUwLDUxMCBMOTUwLDUxMCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNjAwLDMwMiBMNjAwLDUxMCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNMjUwLDc1NCBMOTUwLDc1NCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNDYwLDUxMiBMNDYwLDc1MiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNjI2LDUxMiBMNjI2LDc1MiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBkPSJNNzc4LDUxMiBMNzc4LDc1MiI+PC9wYXRoPgoKICAgICAgICAgICAgPCEtLSBjaW1pZW50b3M6IFBST1DDk1NJVE8gLS0+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iMi41IiBvcGFjaXR5PSIwLjMyIj4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMjUwLDc3NSBMOTUwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yNTAsNzk2IEw5NTAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTMwMCw3NTQgTDMwMCw3NzUiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMzgwLDc1NCBMMzgwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik00NjAsNzU0IEw0NjAsNzc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTU0MCw3NTQgTDU0MCw3NzUiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNjIwLDc1NCBMNjIwLDc3NSI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik03ODAsNzU0IEw3ODAsNzc1Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTg2MCw3NTQgTDg2MCw3NzUiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMzQwLDc3NSBMMzQwLDc5NiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik00MjAsNzc1IEw0MjAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTUwMCw3NzUgTDUwMCw3OTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTgwLDc3NSBMNTgwLDc5NiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik03NDAsNzc1IEw3NDAsNzk2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTgyMCw3NzUgTDgyMCw3OTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNOTAwLDc3NSBMOTAwLDc5NiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zMDAsNzk2IEwzMDAsODE2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTM4MCw3OTYgTDM4MCw4MTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNDYwLDc5NiBMNDYwLDgxNiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik01NDAsNzk2IEw1NDAsODE2Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTc4MCw3OTYgTDc4MCw4MTYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODYwLDc5NiBMODYwLDgxNiI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDx0ZXh0IHg9IjQzMCIgeT0iNzk0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UHVycG9zZTwvdGV4dD4KCiAgICAgICAgICAgIDwhLS0gPT09PT0gRVNQQUNJTyBQRVJTT05BTDogZG9ybWl0b3JpbyA9PT09PSAtLT4KICAgICAgICAgICAgPHRleHQgeD0iNDI1IiB5PSIzNDQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSInQmFsb28gMicsIHNhbnMtc2VyaWYiIGZvbnQtd2VpZ2h0PSI3MDAiIGZvbnQtc2l6ZT0iMjQiIGZpbGw9IiMxNDI2MUMiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSI3IiBwYWludC1vcmRlcj0ic3Ryb2tlIj5QZXJzb25hbCBzcGFjZTwvdGV4dD4KCiAgICAgICAgICAgIDxyZWN0IHg9IjUwNiIgeT0iMzg4IiB3aWR0aD0iNzQiIGhlaWdodD0iNzAiIHJ4PSI1IiBmaWxsPSJ7eyBjLmYxIH19Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTU0MywzODggTDU0Myw0NTgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTA2LDQyMyBMNTgwLDQyMyI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjEgfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjI2NiIgeT0iNDI2IiB3aWR0aD0iMTgiIGhlaWdodD0iNzgiIHJ4PSI4Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iMjg0IiB5PSI0NDAiIHdpZHRoPSIxNTAiIGhlaWdodD0iNjQiIHJ4PSIxMiI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI5NiIgeT0iNDUwIiB3aWR0aD0iNTQiIGhlaWdodD0iMjgiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNDQwIiB5PSI0NDgiIHdpZHRoPSI1NiIgaGVpZ2h0PSI1NiIgcng9IjYiPjwvcmVjdD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0zNjYsNDQyIEwzNjYsNTAyIj48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQ0MCw0NzYgTDQ5Niw0NzYiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgICAgICA8Y2lyY2xlIGZpbGw9Int7IGMuZjEgfX0iIHN0cm9rZS13aWR0aD0iNCIgY3g9IjQ2OCIgY3k9IjQ2NCIgcj0iNSI+PC9jaXJjbGU+CgogICAgICAgICAgICA8IS0tID09PT09IEJJRU5FU1RBUjogYmHDsW8gPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9Ijc3NSIgeT0iMzQ0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+V2VsbGJlaW5nPC90ZXh0PgoKICAgICAgICAgICAgPGNpcmNsZSBjeD0iNzAwIiBjeT0iNDAyIiByPSIzNiIgZmlsbD0ie3sgYy5mOCB9fSI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxjaXJjbGUgc3Ryb2tlLXdpZHRoPSI0IiBjeD0iNzAwIiBjeT0iNDAyIiByPSIyMyI+PC9jaXJjbGU+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjggfX0iIHg9IjgyNiIgeT0iMzgwIiB3aWR0aD0iOTIiIGhlaWdodD0iMTQiIHJ4PSI0Ij48L3JlY3Q+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjggfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjgzNiIgeT0iMzk0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDQiIHJ4PSIxNSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijg3NiIgeT0iMzk0IiB3aWR0aD0iMzIiIGhlaWdodD0iNDQiIHJ4PSIxNSI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTg0Niw0MDggTDg2MCw0MDgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNODg2LDQyMCBMOTAwLDQyMCI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIGZpbGw9Int7IGMuZjggfX0iIGQ9Ik02NjYsNDUwIEw4OTIsNDUwIEM4OTYsNDUwIDg5OCw0NTQgODk2LDQ2NCBMODg4LDQ4NiBDODg0LDQ5NCA4NzYsNDk4IDg2Niw0OTggTDY5Miw0OTggQzY4Miw0OTggNjc0LDQ5NCA2NzAsNDg2IEw2NjIsNDY0IEM2NjAsNDU0IDY2Miw0NTAgNjY2LDQ1MCBaIj48L3BhdGg+CiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjggfX0iIHN0cm9rZS13aWR0aD0iNSI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNzAwIiBjeT0iNTA0IiByPSI2Ij48L2NpcmNsZT4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI4NTgiIGN5PSI1MDQiIHI9IjYiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CgogICAgICAgICAgICA8IS0tID09PT09IFJFTEFDSU9ORVM6IHNhbGEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9IjM1NiIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UmVsYXRpb25zaGlwczwvdGV4dD4KCiAgICAgICAgICAgIDxnIGZpbGw9Int7IGMuZjAgfX0iPgogICAgICAgICAgICAgIDxyZWN0IHg9IjI2OCIgeT0iNjY0IiB3aWR0aD0iMTIwIiBoZWlnaHQ9IjcwIiByeD0iMTQiPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSIyNjIiIHk9IjY0NCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjkwIiByeD0iOSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjM3MCIgeT0iNjQ0IiB3aWR0aD0iMjQiIGhlaWdodD0iOTAiIHJ4PSI5Ij48L3JlY3Q+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPGcgc3Ryb2tlLXdpZHRoPSI0Ij4KICAgICAgICAgICAgICA8cGF0aCBkPSJNMzI4LDY2OCBMMzI4LDczMiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik0yODYsNjY4IEwzNzAsNjY4Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgPHBhdGggZD0iTTQyNiw3NTIgTDQyNiw2MjQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mMCB9fSIgZD0iTTQwNiw1OTYgTDQ0Niw1OTYgTDQ1Miw2MjQgTDQwMCw2MjQgWiI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik00MTIsNzUyIEw0NDAsNzUyIj48L3BhdGg+CgogICAgICAgICAgICA8IS0tID09PT09IEZJTkFOWkFTOiBjb2NpbmEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9IjU0NCIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+RmluYW5jZXM8L3RleHQ+CgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmY1IH19IiB4PSI0NzAiIHk9IjYzNiIgd2lkdGg9IjY4IiBoZWlnaHQ9IjQ4IiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjQiPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik01MDQsNjM2IEw1MDQsNjg0Ij48L3BhdGg+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTQ5Miw2NTQgTDQ5Miw2NjYiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNTE2LDY1NCBMNTE2LDY2NiI+PC9wYXRoPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjUgfX0iIHg9IjQ3NCIgeT0iNjkwIiB3aWR0aD0iMTQwIiBoZWlnaHQ9IjYyIiByeD0iNiI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjQiIGQ9Ik00NzQsNzA4IEw2MTQsNzA4Ij48L3BhdGg+CiAgICAgICAgICAgIDxnIHN0cm9rZS13aWR0aD0iNCIgZmlsbD0ie3sgYy5mNSB9fSI+CiAgICAgICAgICAgICAgPGNpcmNsZSBjeD0iNTAwIiBjeT0iNjk5IiByPSI4Ij48L2NpcmNsZT4KICAgICAgICAgICAgICA8Y2lyY2xlIGN4PSI1MjgiIGN5PSI2OTkiIHI9IjgiPjwvY2lyY2xlPgogICAgICAgICAgICA8L2c+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNCIgZD0iTTU1Niw3MjQgTDU5OCw3MjQiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNSB9fSIgZD0iTTU1NCw2NjAgTDYwNiw2NjAgTDYxMCw2OTAgTDU1MCw2OTAgWiI+PC9wYXRoPgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmY1IH19IiB4PSI1NDgiIHk9IjY0OCIgd2lkdGg9IjY0IiBoZWlnaHQ9IjEyIiByeD0iNSI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmY1IH19IiBkPSJNNTcyLDY0OCBDNTcyLDYzOCA1ODgsNjM4IDU4OCw2NDggWiI+PC9wYXRoPgoKICAgICAgICAgICAgPCEtLSBlc2NhbG9uZXMgZGUgZW50cmFkYSAtLT4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNCB9fSIgZD0iTTU5Niw4NTYgTDgwOCw4NTYgTDgwOCw4ODQgUTgwOCw4OTAgODAyLDg5MCBMNjAyLDg5MCBRNTk2LDg5MCA1OTYsODg0IFoiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggZmlsbD0ie3sgYy5mNyB9fSIgZD0iTTY2OCw3NTQgTDczNiw3NTQgTDczNiw3ODggTDc2MCw3ODggTDc2MCw4MjIgTDc4NCw4MjIgTDc4NCw4NTYgTDYyMCw4NTYgTDYyMCw4MjIgTDY0NCw4MjIgTDY0NCw3ODggTDY2OCw3ODggWiI+PC9wYXRoPgogICAgICAgICAgICA8ZyBzdHJva2Utd2lkdGg9IjMuNSI+CiAgICAgICAgICAgICAgPHBhdGggZD0iTTY2OCw3ODggTDczNiw3ODgiPjwvcGF0aD4KICAgICAgICAgICAgICA8cGF0aCBkPSJNNjQ0LDgyMiBMNzYwLDgyMiI+PC9wYXRoPgogICAgICAgICAgICAgIDxwYXRoIGQ9Ik02MjAsODU2IEw3ODQsODU2Ij48L3BhdGg+CiAgICAgICAgICAgIDwvZz4KCiAgICAgICAgICAgIDwhLS0gPT09PT0gUFJJT1JJREFERVM6IGVudHJhZGEgPT09PT0gLS0+CiAgICAgICAgICAgIDx0ZXh0IHg9IjcwMiIgeT0iNTU0IiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBmb250LWZhbWlseT0iJ0JhbG9vIDInLCBzYW5zLXNlcmlmIiBmb250LXdlaWdodD0iNzAwIiBmb250LXNpemU9IjI0IiBmaWxsPSIjMTQyNjFDIiBzdHJva2U9IiNGRkZGRkYiIHN0cm9rZS13aWR0aD0iNyIgcGFpbnQtb3JkZXI9InN0cm9rZSI+UHJpb3JpdGllczwvdGV4dD4KCiAgICAgICAgICAgIDxyZWN0IGZpbGw9Int7IGMuZjkgfX0iIHg9IjY3NCIgeT0iNjMwIiB3aWR0aD0iNTYiIGhlaWdodD0iMTI0IiByeD0iOCI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjQiIGQ9Ik02ODIsNjUwIEw3MjIsNjUwIj48L3BhdGg+CiAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0ie3sgYy5mOSB9fSIgc3Ryb2tlLXdpZHRoPSI0IiBjeD0iNzE2IiBjeT0iNzAwIiByPSI1Ij48L2NpcmNsZT4KCiAgICAgICAgICAgIDwhLS0gPT09PT0gREVTQVJST0xMTzogb2ZpY2luYSA9PT09PSAtLT4KICAgICAgICAgICAgPHRleHQgeD0iODYwIiB5PSI1NTQiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtZmFtaWx5PSInQmFsb28gMicsIHNhbnMtc2VyaWYiIGZvbnQtd2VpZ2h0PSI3MDAiIGZvbnQtc2l6ZT0iMjQiIGZpbGw9IiMxNDI2MUMiIHN0cm9rZT0iI0ZGRkZGRiIgc3Ryb2tlLXdpZHRoPSI3IiBwYWludC1vcmRlcj0ic3Ryb2tlIj5Qcm9mZXNzaW9uYWwgZ3Jvd3RoPC90ZXh0PgoKICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMyB9fSIgeD0iNzk4IiB5PSI2OTIiIHdpZHRoPSIxMTgiIGhlaWdodD0iMjAiIHJ4PSI2Ij48L3JlY3Q+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNSIgZD0iTTgwOCw3MTIgTDgwOCw3NTIiPjwvcGF0aD4KICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI1IiBkPSJNOTA2LDcxMiBMOTA2LDc1MiI+PC9wYXRoPgogICAgICAgICAgICA8cmVjdCBmaWxsPSJ7eyBjLmYzIH19IiB4PSI4MTgiIHk9IjY4MCIgd2lkdGg9IjcwIiBoZWlnaHQ9IjEyIiByeD0iNSI+PC9yZWN0PgogICAgICAgICAgICA8cGF0aCBmaWxsPSJ7eyBjLmYzIH19IiBkPSJNODI2LDY4MCBMODgyLDY4MCBMODg4LDYzMiBMODMyLDYzMiBaIj48L3BhdGg+CiAgICAgICAgICAgIDxwYXRoIHN0cm9rZS13aWR0aD0iNCIgZD0iTTgzNyw2NzAgTDg3OCw2NzAiPjwvcGF0aD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMyB9fSIgeD0iOTIwIiB5PSI2NTYiIHdpZHRoPSIxNSIgaGVpZ2h0PSI1OCIgcng9IjciPjwvcmVjdD4KICAgICAgICAgICAgPHJlY3QgZmlsbD0ie3sgYy5mMyB9fSIgeD0iOTE0IiB5PSI3MTQiIHdpZHRoPSIzMiIgaGVpZ2h0PSIxNiIgcng9IjciPjwvcmVjdD4KICAgICAgICAgICAgPHBhdGggc3Ryb2tlLXdpZHRoPSI1IiBkPSJNOTMwLDczMCBMOTMwLDc0NCI+PC9wYXRoPgogICAgICAgICAgICA8cGF0aCBzdHJva2Utd2lkdGg9IjUiIGQ9Ik05MTYsNzUyIEw5MzAsNzQ0IEw5NDQsNzUyIj48L3BhdGg+CgogICAgICAgICAgICB7eyBoaWdobGlnaHQgfX0KICAgICAgICAgICAge3sgbWVkYWxzIH19CgogICAgICAgICAgICA8IS0tIHpvbmFzIHNlbnNpYmxlczogY2xpYyBzYWx0YSBhIGxhIHByZWd1bnRhIC0tPgogICAgICAgICAgICA8ZyBmaWxsPSIjRkZGRkZGIiBmaWxsLW9wYWNpdHk9IjAiIHN0cm9rZT0ibm9uZSIgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsiPgogICAgICAgICAgICAgIDxwb2x5Z29uIHBvaW50cz0iMjM4LDI5MiA1OTgsNzQgOTYwLDI5MiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yNiB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjYgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcG9seWdvbj4KICAgICAgICAgICAgICA8cmVjdCB4PSIyNTIiIHk9IjMwMiIgd2lkdGg9IjM0NiIgaGVpZ2h0PSIyMDYiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjEgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnIxIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNjAyIiB5PSIzMDIiIHdpZHRoPSIzNDYiIGhlaWdodD0iMjA2IiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgaGl0LnI4IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgb3Zlci5yOCB9fSIgc2MtY2FtZWwtb24tbW91c2UtbGVhdmU9Int7IG91dCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9IjI1MiIgeT0iNTEyIiB3aWR0aD0iMjA2IiBoZWlnaHQ9IjI0MCIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yMCB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjAgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0NjIiIHk9IjUxMiIgd2lkdGg9IjE2MiIgaGVpZ2h0PSIyNDAiIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBoaXQucjUgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWVudGVyPSJ7eyBvdmVyLnI1IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgb3V0IH19Ij48L3JlY3Q+CiAgICAgICAgICAgICAgPHJlY3QgeD0iNjI4IiB5PSI1MTIiIHdpZHRoPSIxNDgiIGhlaWdodD0iMjQwIiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgaGl0LnI5IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgb3Zlci5yOSB9fSIgc2MtY2FtZWwtb24tbW91c2UtbGVhdmU9Int7IG91dCB9fSI+PC9yZWN0PgogICAgICAgICAgICAgIDxyZWN0IHg9Ijc4MCIgeT0iNTEyIiB3aWR0aD0iMTY4IiBoZWlnaHQ9IjI0MCIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yMyB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjMgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSIyNTIiIHk9Ijc1NiIgd2lkdGg9IjY5NiIgaGVpZ2h0PSI2MCIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yNyB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjcgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI5NTQiIHk9IjU1NiIgd2lkdGg9IjIxNiIgaGVpZ2h0PSIyNjIiIHJ4PSIxNiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IGhpdC5yMiB9fSIgc2MtY2FtZWwtb24tbW91c2UtZW50ZXI9Int7IG92ZXIucjIgfX0iIHNjLWNhbWVsLW9uLW1vdXNlLWxlYXZlPSJ7eyBvdXQgfX0iPjwvcmVjdD4KICAgICAgICAgICAgICA8cmVjdCB4PSI0MCIgeT0iODE4IiB3aWR0aD0iMTMyMCIgaGVpZ2h0PSI5NiIgcng9IjI2IiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgaGl0LnI0IH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgb3Zlci5yNCB9fSIgc2MtY2FtZWwtb24tbW91c2UtbGVhdmU9Int7IG91dCB9fSI+PC9yZWN0PgogICAgICAgICAgICA8L2c+CiAgICAgICAgICA8L2c+CiAgICAgICAgPC9zdmc+CiAgICAgICAgPGRpdiBjbGFzcz0iY2ItY2FwdGlvbiIgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAxNHB4OyBjb2xvcjogIzU5NjE1QTsgbWFyZ2luLXRvcDogMTBweDsiPlRhcCBhIHJvb20gdG8gZ28gdG8gaXRzIHF1ZXN0aW9uPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2ItY2FyZHMiIHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdCgyLCBtaW5tYXgoMCwgMWZyKSk7IGdhcDogMTZweDsgYWxpZ24taXRlbXM6IHN0cmV0Y2g7Ij4KICAgICAgICA8c2MtZm9yIGxpc3Q9Int7IHRpbGVzIH19IiBhcz0idCIgaGludC1wbGFjZWhvbGRlci1jb3VudD0iMTAiPgogICAgICAgICAgPGRpdiByZWY9Int7IHQucmVmIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1lbnRlcj0ie3sgdC5vbkVudGVyIH19IiBzYy1jYW1lbC1vbi1tb3VzZS1sZWF2ZT0ie3sgdC5vbkxlYXZlIH19IiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyLXJhZGl1czogMThweDsgYm9yZGVyOiAyLjVweCBzb2xpZCB7eyB0LmJvcmRlciB9fTsgb3ZlcmZsb3c6IGhpZGRlbjsgYm94LXNoYWRvdzoge3sgdC5zaGFkb3cgfX07IHRyYW5zaXRpb246IGJveC1zaGFkb3cgLjJzIGVhc2U7IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Ij4KICAgICAgICAgICAgPGRpdiBzdHlsZT0iaGVpZ2h0OiA3cHg7IGJhY2tncm91bmQ6IHt7IHQuYWNjZW50IH19OyI+PC9kaXY+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9InBhZGRpbmc6IDE0cHggMThweCAxOHB4OyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBmbGV4OiAxOyI+CiAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7Ij4KICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA3cHg7IGZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMTJweDsgY29sb3I6ICM1NjQwOEM7IGJhY2tncm91bmQ6ICNGNEVFRkI7IGJvcmRlci1yYWRpdXM6IDIwcHg7IHBhZGRpbmc6IDRweCAxM3B4OyI+e3sgdC5yb29tIH19PC9zcGFuPgogICAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogMjBweDsgY29sb3I6IHt7IHQuYWNjZW50IH19OyI+e3sgdC5iYWRnZSB9fTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyBmb250LXNpemU6IDE1cHg7IGxpbmUtaGVpZ2h0OiAxLjQ1OyBtaW4taGVpZ2h0OiA0NHB4OyI+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTdweDsiPnt7IHQubmFtZSB9fTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNTk2MTVBOyBmb250LXdlaWdodDogNjAwOyI+wrcge3sgdC5kZXNjIH19PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbjogMTJweCAwIDZweDsgYmFja2dyb3VuZDogI0ZCRjdGRjsgYm9yZGVyOiAxLjVweCBkYXNoZWQgI0E5OEJENjsgYm9yZGVyLXJhZGl1czogMTNweDsgcGFkZGluZzogMTJweCAxNXB4OyB0ZXh0LXdyYXA6IHByZXR0eTsgZmxleDogMTsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGluZS1oZWlnaHQ6IDEuNDU7IGNvbG9yOiAjMkUyNTQ1OyI+e3sgdC5xdWVzdGlvbiB9fTwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBsaW5lLWhlaWdodDogMS40NTsgY29sb3I6ICM2QjVFOEE7IG1hcmdpbi10b3A6IDZweDsiPnt7IHQuaGludCB9fTwvZGl2PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgcm9sZT0iZ3JvdXAiIGFyaWEtbGFiZWw9Int7IHQubmFtZSB9fSIgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiAxMnB4OyI+CiAgICAgICAgICAgICAgICA8c2MtZm9yIGxpc3Q9Int7IHQub3B0cyB9fSIgYXM9Im8iIGhpbnQtcGxhY2Vob2xkZXItY291bnQ9IjUiPgogICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJjYi1vcHQiIHR5cGU9ImJ1dHRvbiIgc2MtY2FtZWwtb24tY2xpY2s9Int7IG8ub25QaWNrIH19IiBhcmlhLXByZXNzZWQ9Int7IG8uYWN0aXZlIH19IiBhcmlhLWxhYmVsPSJ7eyBvLmFyaWEgfX0iIHN0eWxlPSJmbGV4OiAxOyBtaW4taGVpZ2h0OiA0NnB4OyBib3JkZXItcmFkaXVzOiAxMnB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAxN3B4OyBiYWNrZ3JvdW5kOiB7eyBvLmJnIH19OyBjb2xvcjoge3sgby5mZyB9fTsgdHJhbnNpdGlvbjogdHJhbnNmb3JtIC4xMnMgZWFzZTsiIHN0eWxlLWhvdmVyPSJ0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7Ij57eyBvLm4gfX08L2J1dHRvbj4KICAgICAgICAgICAgICAgIDwvc2MtZm9yPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgbWFyZ2luLXRvcDogOHB4OyBnYXA6IDEwcHg7IGZvbnQtc2l6ZTogMTIuNXB4OyBmb250LXdlaWdodDogNzAwOyBjb2xvcjogIzU5NjE1QTsiPgogICAgICAgICAgICAgICAgPHNwYW4+MSDCtyB7eyB0LmxvdyB9fTwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPjUgwrcge3sgdC5oaWdoIH19PC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxzYy1pZiB2YWx1ZT0ie3sgdC5hbnN3ZXJlZCB9fSIgaGludC1wbGFjZWhvbGRlci12YWw9Int7IGZhbHNlIH19Ij4KICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDE0cHg7IGJvcmRlci10b3A6IDJweCBkYXNoZWQgI0U0RTBEQTsgcGFkZGluZy10b3A6IDEycHg7Ij4KICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA4MDA7IGxldHRlci1zcGFjaW5nOiAuMDhlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6IHt7IHQuYWNjZW50IH19OyI+e3sgdC5zdGF0ZSB9fTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiA3cHg7IGZvbnQtc2l6ZTogMTRweDsgbGluZS1oZWlnaHQ6IDEuNTsgY29sb3I6ICMyQTMzMkM7IHRleHQtd3JhcDogcHJldHR5OyI+e3sgdC50aXAgfX08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvc2MtaWY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9zYy1mb3I+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjLWlmIHZhbHVlPSJ7eyBoYXNTdGF0cyB9fSIgaGludC1wbGFjZWhvbGRlci12YWw9Int7IHRydWUgfX0iPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDIzMHB4LCAxZnIpKTsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiA0NHB4OyI+CiAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDogI0ZGRkZGRjsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3JkZXItcmFkaXVzOiAxOHB4OyBwYWRkaW5nOiAyMHB4IDIycHg7IGJveC1zaGFkb3c6IDZweCA2cHggMCAjQkRFN0Y3OyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEyLjVweDsgZm9udC13ZWlnaHQ6IDcwMDsgbGV0dGVyLXNwYWNpbmc6IC4xZW07IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGNvbG9yOiAjNTk2MTVBOyI+V2FybWVzdCBhcmVhPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi10b3A6IDZweDsgbGluZS1oZWlnaHQ6IDEuMjsiPnt7IGhvdHRlc3QgfX08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiAjRkZGRkZGOyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDE4cHg7IHBhZGRpbmc6IDIwcHggMjJweDsgYm94LXNoYWRvdzogNnB4IDZweCAwICNCREU3Rjc7Ij4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtc2l6ZTogMTIuNXB4OyBmb250LXdlaWdodDogNzAwOyBsZXR0ZXItc3BhY2luZzogLjFlbTsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsgY29sb3I6ICM1OTYxNUE7Ij5Db2xkZXN0IGFyZWE8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA4MDA7IGZvbnQtc2l6ZTogMjRweDsgbWFyZ2luLXRvcDogNnB4OyBsaW5lLWhlaWdodDogMS4yOyI+e3sgY29sZGVzdCB9fTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMThweDsgcGFkZGluZzogMjBweCAyMnB4OyBib3gtc2hhZG93OiA2cHggNnB4IDAgI0Y3RDlFQTsiPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAuMWVtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogIzU5NjE1QTsiPkltYmFsYW5jZTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyNHB4OyBtYXJnaW4tdG9wOiA2cHg7IGxpbmUtaGVpZ2h0OiAxLjI7Ij57eyBnYXBMYWJlbCB9fTwvZGl2PgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzU5NjE1QTsgbWFyZ2luLXRvcDogNHB4OyBsaW5lLWhlaWdodDogMS40OyI+e3sgZ2FwTm90ZSB9fTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc3R5bGU9ImJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMThweDsgcGFkZGluZzogMjBweCAyMnB4OyBib3gtc2hhZG93OiA2cHggNnB4IDAgI0Y3RDlFQTsiPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1zaXplOiAxMi41cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGxldHRlci1zcGFjaW5nOiAuMWVtOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBjb2xvcjogIzU5NjE1QTsiPkFyZWFzIG5lZWRpbmcgYXR0ZW50aW9uPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDI0cHg7IG1hcmdpbi10b3A6IDZweDsgbGluZS1oZWlnaHQ6IDEuMjsiPnt7IGF0dGVudGlvbkxhYmVsIH19PC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjNTk2MTVBOyBtYXJnaW4tdG9wOiA0cHg7IGxpbmUtaGVpZ2h0OiAxLjQ7Ij57eyBhdHRlbnRpb25Ob3RlIH19PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9zYy1pZj4KCiAgICA8c2MtaWYgdmFsdWU9Int7IGFsbEFuc3dlcmVkIH19IiBoaW50LXBsYWNlaG9sZGVyLXZhbD0ie3sgZmFsc2UgfX0iPgogICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAzMHB4OyBiYWNrZ3JvdW5kOiAjRjRFRUZCOyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJvcmRlci1yYWRpdXM6IDI0cHg7IHBhZGRpbmc6IDMwcHggMzBweCAzNHB4OyBjb2xvcjogIzE0MjYxQzsgYm94LXNoYWRvdzogN3B4IDdweCAwICNDQkIzRjA7Ij4KICAgICAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDcyMHB4OyBtYXJnaW46IDAgYXV0bzsiPgogICAgICAgICAgPGRpdiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgZm9udC13ZWlnaHQ6IDgwMDsgZm9udC1zaXplOiAyNHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij5NeSBjb21taXRtZW50IGZvciB0aGlzIHdlZWs8L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNXB4OyBjb2xvcjogIzU2NDA4QzsgbWFyZ2luLXRvcDogOHB4OyBsaW5lLWhlaWdodDogMS41NTsgdGV4dC13cmFwOiBwcmV0dHk7Ij57eyBjb21taXRQcm9tcHQgfX08L2Rpdj4KICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgbWFyZ2luLXRvcDogMjBweDsiPgogICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdhcDogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjM0EyRTUyOyI+QXJlYSBJIHdpbGwgd29yayBvbgogICAgICAgICAgICAgIDxzYy1yYXctc2VsZWN0IGNsYXNzPSJjYi1pbnAiIHZhbHVlPSJ7eyBjb21taXRBcmVhIH19IiBzYy1jYW1lbC1vbi1jaGFuZ2U9Int7IG9uQ29tbWl0QXJlYSB9fSIgc3R5bGU9ImZvbnQtZmFtaWx5OiBOdW5pdG8sIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogMTNweCAxNHB4OyBib3JkZXItcmFkaXVzOiAxM3B4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGNvbG9yOiAjMTQyNjFDOyI+CiAgICAgICAgICAgICAgICA8c2MtZm9yIGxpc3Q9Int7IGFyZWFPcHRpb25zIH19IiBhcz0iYSIgaGludC1wbGFjZWhvbGRlci1jb3VudD0iMTAiPgogICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJ7eyBhLnZhbHVlIH19Ij57eyBhLmxhYmVsIH19PC9vcHRpb24+CiAgICAgICAgICAgICAgICA8L3NjLWZvcj4KICAgICAgICAgICAgICA8L3NjLXJhdy1zZWxlY3Q+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTJFNTI7Ij5NeSBjb25jcmV0ZSBhY3Rpb24KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImNiLWlucCIgdHlwZT0idGV4dCIgdmFsdWU9Int7IGNvbW1pdFRleHQgfX0iIHNjLWNhbWVsLW9uLWNoYW5nZT0ie3sgb25Db21taXRUZXh0IH19IiBwbGFjZWhvbGRlcj0iRS5nLiwgY2FsbCBteSBzaXN0ZXIgb24gVGh1cnNkYXkgZXZlbmluZyIgc3R5bGU9ImZvbnQtZmFtaWx5OiBOdW5pdG8sIHNhbnMtc2VyaWY7IGZvbnQtc2l6ZTogMTVweDsgZm9udC13ZWlnaHQ6IDYwMDsgcGFkZGluZzogMTNweCAxNHB4OyBib3JkZXItcmFkaXVzOiAxM3B4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGNvbG9yOiAjMTQyNjFDOyI+CiAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTJFNTI7Ij5CeQogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY2ItaW5wIiB0eXBlPSJkYXRlIiB2YWx1ZT0ie3sgY29tbWl0RGF0ZSB9fSIgc2MtY2FtZWwtb24tY2hhbmdlPSJ7eyBvbkNvbW1pdERhdGUgfX0iIHN0eWxlPSJmb250LWZhbWlseTogTnVuaXRvLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEzcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTNweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjogIzE0MjYxQzsiPgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAxNHB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiAjNkI1RThBOyB0ZXh0LWFsaWduOiBjZW50ZXI7Ij57eyBjb21taXRTdGF0dXMgfX08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3NjLWlmPgoKICAgIDxzYy1pZiB2YWx1ZT0ie3sgYWxsQW5zd2VyZWQgfX0iIGhpbnQtcGxhY2Vob2xkZXItdmFsPSJ7eyBmYWxzZSB9fSI+CiAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDIycHg7IGJhY2tncm91bmQ6ICNGRkZGRkY7IGJvcmRlcjogMi41cHggc29saWQgIzE0MjYxQzsgYm9yZGVyLXJhZGl1czogMjRweDsgcGFkZGluZzogMjZweCAzMHB4IDMwcHg7IGNvbG9yOiAjMTQyNjFDOyBib3gtc2hhZG93OiA3cHggN3B4IDAgI0JERTdGNzsiPgogICAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNzIwcHg7IG1hcmdpbjogMCBhdXRvOyI+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBmb250LXdlaWdodDogODAwOyBmb250LXNpemU6IDIycHg7IHRleHQtYWxpZ246IGNlbnRlcjsiPk9wdGlvbmFsIGluZm9ybWF0aW9uPC9kaXY+CiAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTRweDsgY29sb3I6ICM1OTYxNUE7IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi10b3A6IDZweDsiPllvdSBtYXkgbGVhdmUgZXZlcnl0aGluZyBibGFuay48L2Rpdj4KCiAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tdG9wOiAyMHB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjM0E0NDNFOyI+QWdlPC9kaXY+CiAgICAgICAgICA8ZGl2IHJvbGU9Imdyb3VwIiBhcmlhLWxhYmVsPSJBZ2UiIHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4OyBtYXJnaW4tdG9wOiA4cHg7Ij4KICAgICAgICAgICAgPHNjLWZvciBsaXN0PSJ7eyBhZ2VPcHRpb25zIH19IiBhcz0iYSIgaGludC1wbGFjZWhvbGRlci1jb3VudD0iNSI+CiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBhLm9uUGljayB9fSIgYXJpYS1wcmVzc2VkPSJ7eyBhLmFjdGl2ZSB9fSIgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGZvbnQtd2VpZ2h0OiA3MDA7IGZvbnQtc2l6ZTogMTRweDsgbWluLWhlaWdodDogNDRweDsgcGFkZGluZzogMTBweCAxOHB4OyBib3JkZXItcmFkaXVzOiA0MHB4OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGN1cnNvcjogcG9pbnRlcjsgYmFja2dyb3VuZDoge3sgYS5iZyB9fTsgY29sb3I6IHt7IGEuZmcgfX07Ij57eyBhLmxhYmVsIH19PC9idXR0b24+CiAgICAgICAgICAgIDwvc2MtZm9yPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBtYXJnaW4tdG9wOiAyMHB4OyI+CiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZGlzcGxheTogZ3JpZDsgZ2FwOiA2cHg7IGZvbnQtc2l6ZTogMTNweDsgZm9udC13ZWlnaHQ6IDcwMDsgY29sb3I6ICMzQTQ0M0U7Ij5DaXR5IGFuZCBjb3VudHJ5CiAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjYi1pbnAiIHR5cGU9InRleHQiIG1heGxlbmd0aD0iODAiIHZhbHVlPSJ7eyBjdHhDaXR5IH19IiBzYy1jYW1lbC1vbi1jaGFuZ2U9Int7IG9uQ3R4Q2l0eSB9fSIgcGxhY2Vob2xkZXI9IkUuZy4sIExvbmRvbiwgVW5pdGVkIEtpbmdkb20iIHN0eWxlPSJmb250LWZhbWlseTogTnVuaXRvLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEzcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTNweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjogIzE0MjYxQzsiPgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImRpc3BsYXk6IGdyaWQ7IGdhcDogNnB4OyBmb250LXNpemU6IDEzcHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGNvbG9yOiAjM0E0NDNFOyI+T2NjdXBhdGlvbgogICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY2ItaW5wIiB0eXBlPSJ0ZXh0IiBtYXhsZW5ndGg9IjgwIiB2YWx1ZT0ie3sgY3R4Sm9iIH19IiBzYy1jYW1lbC1vbi1jaGFuZ2U9Int7IG9uQ3R4Sm9iIH19IiBwbGFjZWhvbGRlcj0iRS5nLiwgZGVzaWduZXIsIHRlYWNoZXIsIHNlbGYtZW1wbG95ZWQiIHN0eWxlPSJmb250LWZhbWlseTogTnVuaXRvLCBzYW5zLXNlcmlmOyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDEzcHggMTRweDsgYm9yZGVyLXJhZGl1czogMTNweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBiYWNrZ3JvdW5kOiAjRkZGRkZGOyBjb2xvcjogIzE0MjYxQzsiPgogICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgPC9kaXY+CgogICAgICAgICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMTZweDsgZm9udC1zaXplOiAxM3B4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogIzU5NjE1QTsgbGluZS1oZWlnaHQ6IDEuNTU7IHRleHQtYWxpZ246IGNlbnRlcjsgdGV4dC13cmFwOiBwcmV0dHk7Ij5XZSBkbyBub3QgYXNrIGZvciB5b3VyIG5hbWUgb3IgZW1haWwuIFRoaXMgaW5mb3JtYXRpb24gaGVscHMgdXMgdW5kZXJzdGFuZCBob3cgZGlmZmVyZW50IHBlb3BsZSBleHBlcmllbmNlIGJhbGFuY2UgaW4gdGhlaXIgbGl2ZXMuPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9zYy1pZj4KCiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsgZ2FwOiAxNnB4OyBtYXJnaW4tdG9wOiA0MnB4OyBmbGV4LXdyYXA6IHdyYXA7Ij4KICAgICAgPGJ1dHRvbiBzYy1jYW1lbC1vbi1jbGljaz0ie3sgb25FeHBvcnQgfX0iIGRpc2FibGVkPSJ7eyBleHBvcnREaXNhYmxlZCB9fSIgc3R5bGU9ImZvbnQtZmFtaWx5OiAnQmFsb28gMicsIHNhbnMtc2VyaWY7IGJhY2tncm91bmQ6IHt7IGV4cG9ydEJnIH19OyBib3JkZXI6IDIuNXB4IHNvbGlkICMxNDI2MUM7IGNvbG9yOiAjZmZmOyBwYWRkaW5nOiAxNHB4IDMwcHg7IGJvcmRlci1yYWRpdXM6IDQwcHg7IGZvbnQtc2l6ZTogMTZweDsgZm9udC13ZWlnaHQ6IDcwMDsgY3Vyc29yOiB7eyBleHBvcnRDdXJzb3IgfX07IGJveC1zaGFkb3c6IDRweCA0cHggMCAjMTQyNjFDOyIgc3R5bGUtaG92ZXI9InRyYW5zZm9ybTogdHJhbnNsYXRlKDJweCwgMnB4KTsgYm94LXNoYWRvdzogMnB4IDJweCAwICMxNDI2MUM7Ij57eyBleHBvcnRMYWJlbCB9fTwvYnV0dG9uPgogICAgICA8YnV0dG9uIHNjLWNhbWVsLW9uLWNsaWNrPSJ7eyBvblJlc2V0IH19IiBzdHlsZT0iZm9udC1mYW1pbHk6ICdCYWxvbyAyJywgc2Fucy1zZXJpZjsgYmFja2dyb3VuZDoge3sgcmVzZXRCZyB9fTsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBjb2xvcjogIzE0MjYxQzsgcGFkZGluZzogMTNweCAyNnB4OyBib3JkZXItcmFkaXVzOiA0MHB4OyBmb250LXNpemU6IDE1cHg7IGZvbnQtd2VpZ2h0OiA3MDA7IGN1cnNvcjogcG9pbnRlcjsgYm94LXNoYWRvdzogNHB4IDRweCAwICNFOUU0REQ7IiBzdHlsZS1ob3Zlcj0idHJhbnNmb3JtOiB0cmFuc2xhdGUoMnB4LCAycHgpOyBib3gtc2hhZG93OiAycHggMnB4IDAgI0U5RTRERDsiPnt7IHJlc2V0TGFiZWwgfX08L2J1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxwIHN0eWxlPSJtYXgtd2lkdGg6IDc2MHB4OyBtYXJnaW46IDE4cHggYXV0byAwOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHRleHQtd3JhcDogYmFsYW5jZTsgZm9udC1zaXplOiAxNHB4OyBsaW5lLWhlaWdodDogMS42OyBjb2xvcjogIzU5NjE1QTsgZm9udC13ZWlnaHQ6IDYwMDsiPllvdXIgcmVzcG9uc2VzIGFyZSBzdG9yZWQgYW5vbnltb3VzbHkuIFRoZSBpbWFnZSB5b3UgZG93bmxvYWQgaXMgeW91ciBwZXJzb25hbCByZWNvcmQuIDxicj5TYXZlIGl0IGFuZCByZXR1cm4gdG8gdGhlIGV4ZXJjaXNlIGxhdGVyIHRvIGNvbXBhcmUgeW91ciByZXN1bHRzIGFuZCBub3RpY2Ugd2hhdCBoYXMgY2hhbmdlZC48L3A+CgogICAgPGRpdiBzdHlsZT0ibWFyZ2luLXRvcDogMzZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBkaXNwbGF5OiB7eyBwcmV2aWV3RGlzcGxheSB9fTsiPgogICAgICA8Y2FudmFzIHJlZj0ie3sgY2FudmFzUmVmIH19IiB3aWR0aD0iODIwIiBoZWlnaHQ9IjE2MDAiIHN0eWxlPSJtYXgtd2lkdGg6IDEwMCU7IGhlaWdodDogYXV0bzsgYm9yZGVyLXJhZGl1czogMTZweDsgYm9yZGVyOiAyLjVweCBzb2xpZCAjMTQyNjFDOyBib3gtc2hhZG93OiA4cHggOHB4IDAgI0NCQjNGMDsiPjwvY2FudmFzPgogICAgICA8ZGl2PgogICAgICAgIDxhIHJlZj0ie3sgbGlua1JlZiB9fSIgZG93bmxvYWQ9Im15LWxpZmUtYmFsYW5jZS1ob3VzZS5wbmciIHN0eWxlPSJmb250LWZhbWlseTogJ0JhbG9vIDInLCBzYW5zLXNlcmlmOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IG1hcmdpbi10b3A6IDIwcHg7IGJhY2tncm91bmQ6ICMxNDI2MUM7IGNvbG9yOiAjZmZmOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHBhZGRpbmc6IDEzcHggMzBweDsgYm9yZGVyLXJhZGl1czogNDBweDsgZm9udC1zaXplOiAxNXB4OyBmb250LXdlaWdodDogNzAwOyI+RG93bmxvYWQgaW1hZ2U8L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogIDwvZGl2PjwvZGl2Pgo8L3gtZGM+CjxzY3JpcHQgdHlwZT0idGV4dC94LWRjIiBkYXRhLWRjLXNjcmlwdD0iIiBkYXRhLXByb3BzPSJ7JnF1b3Q7c2hvd1JlZmxlY3Rpb24mcXVvdDs6eyZxdW90O2VkaXRvciZxdW90OzomcXVvdDtib29sZWFuJnF1b3Q7LCZxdW90O2RlZmF1bHQmcXVvdDs6dHJ1ZSwmcXVvdDt0c1R5cGUmcXVvdDs6JnF1b3Q7Ym9vbGVhbiZxdW90OywmcXVvdDtzZWN0aW9uJnF1b3Q7OiZxdW90O0NvbnRlbmlkbyZxdW90O319Ij4KY29uc3QgRE9NQUlOUyA9IFsKICB7aWQ6MCxrZXk6InI3IixuYW1lOiJQdXJwb3NlIixkZXNjOiJXaGF0IGdpdmVzIG15IGxpZmUgYSBkZWVwZXIgc2Vuc2Ugb2YgbWVhbmluZyIscm9vbToiRm91bmRhdGlvbiIsCiAgIHF1ZXN0aW9uOiJJcyB3aGF0IEkgZG8gY29ubmVjdGVkIHRvIHNvbWV0aGluZyB0aGF0IGdpdmVzIG15IGxpZmUgbWVhbmluZz8iLAogICBoaW50OiJCZXlvbmQgc2ltcGx5IGdldHRpbmcgdGhyb3VnaCBlYWNoIGRheS4iLGxvdzoiSGFyZGx5IGF0IGFsbCIsaGlnaDoiVmVyeSBtdWNoIiwKICAgdGlwczp7YmFqbzoiUmVjb2duaXplLiBMaXN0IHRocmVlIHRoaW5ncyB5b3Ugd291bGQgbGlrZSB0byBzcGVuZCBtb3JlIHRpbWUgb24gYmVjYXVzZSB0aGV5IG1hdHRlciB0byB5b3UuIiwKICAgICAgICAgbWVkaW86IkNob29zZS4gSWRlbnRpZnkgYW4gYWN0aXZpdHkgdGhhdCBmZWVscyBtZWFuaW5nZnVsIHRvIHlvdSBhbmQgZGVjaWRlIHdoYXQgeW91IGNhbiBkbyB0byBtYWtlIG1vcmUgcm9vbSBmb3IgaXQuIiwKICAgICAgICAgYWx0bzoiUHJvdGVjdC4gSWRlbnRpZnkgYW4gYWN0aXZpdHkgdGhhdCBjb25uZWN0cyB5b3Ugd2l0aCB3aGF0IG1hdHRlcnMgYW5kIHByZXZlbnQgb3RoZXIgZGVtYW5kcyBmcm9tIHRha2luZyBpdHMgcGxhY2UuIn19LAogIHtpZDoxLGtleToicjkiLG5hbWU6IlByaW9yaXRpZXMiLGRlc2M6IkxpdmluZyBhY2NvcmRpbmcgdG8gd2hhdCBtYXR0ZXJzIG1vc3QgdG8gbWUiLHJvb206IkVudHJ5d2F5IiwKICAgcXVlc3Rpb246IkFtIEkgbGl2aW5nIHRvZGF5IGFjY29yZGluZyB0byB3aGF0IG1hdHRlcnMgbW9zdCB0byBtZT8iLAogICBoaW50OiJGb2N1cyBvbiB3aGF0IGlzIGltcG9ydGFudCwgbm90IGp1c3Qgd2hhdCBpcyB1cmdlbnQuIixsb3c6IkkgZHJpZnQgdGhyb3VnaCB0aGUgZGF5IixoaWdoOiJXaXRoIGludGVudGlvbiIsCiAgIHRpcHM6e2Jham86IkNvbXBhcmUuIFdyaXRlIGRvd24geW91ciB0aHJlZSBjdXJyZW50IHByaW9yaXRpZXMgYW5kIGNvbXBhcmUgdGhlbSB3aXRoIGhvdyB5b3UgYXJlIHVzaW5nIHlvdXIgdGltZS4iLAogICAgICAgICBtZWRpbzoiQWRqdXN0LiBDaG9vc2Ugb25lIHByaW9yaXR5IGFuZCBjaGFuZ2Ugb25lIHNwZWNpZmljIGJlaGF2aW9yIHRvIGdpdmUgaXQgdGhlIHNwYWNlIGl0IGRlc2VydmVzLiIsCiAgICAgICAgIGFsdG86IlJldmlldy4gTG9vayBhdCB5b3VyIHByaW9yaXRpZXMgYW5kIGRlY2lkZSB3aGljaCBvbmVzIHlvdSB3YW50IHRvIGtlZXAsIGNoYW5nZSwgb3Igc3RvcCBwcmlvcml0aXppbmcuIn19LAogIHtpZDoyLGtleToicjgiLG5hbWU6IldlbGxiZWluZyIsZGVzYzoiSG93IEkgYmFsYW5jZSBteSBwaHlzaWNhbCwgbWVudGFsLCBhbmQgZW1vdGlvbmFsIHdlbGxiZWluZyIscm9vbToiQmF0aHJvb20iLAogICBxdWVzdGlvbjoiQW0gSSBpbnRlbnRpb25hbGx5IGNhcmluZyBmb3IgbXkgYm9keSwgbWluZCwgYW5kIGVtb3Rpb25zPyIsCiAgIGhpbnQ6IkJlZm9yZSBJIHJlYWNoIG15IGxpbWl0LCBub3QgYWZ0ZXJ3YXJkLiIsbG93OiJJIG9ubHkgcmVhY3QiLGhpZ2g6IkkgY2FyZSBmb3IgdGhlbSBkYWlseSIsCiAgIHRpcHM6e2Jham86IlNjaGVkdWxlLiBTZXQgYXNpZGUgdGltZSB0byByZXN0LCBtb3ZlIHlvdXIgYm9keSwgb3IgYXR0ZW5kIHRvIGEgaGVhbHRoIG5lZWQuIiwKICAgICAgICAgbWVkaW86IlJlc3BvbmQuIE5vdGljZSBhIHNpZ24gb2YgdGlyZWRuZXNzLCB0ZW5zaW9uLCBvciBvdmVybG9hZCBhbmQgY2hvb3NlIG9uZSBjb25jcmV0ZSBhY3Rpb24gdG8gYWRkcmVzcyBpdC4iLAogICAgICAgICBhbHRvOiJTaW1wbGlmeS4gQ2hvb3NlIG9uZSBzZWxmLWNhcmUgcHJhY3RpY2UgeW91IGNhbiBtYWludGFpbiBldmVuIHdoZW4geW91ciByZXNwb25zaWJpbGl0aWVzIGluY3JlYXNlLiJ9fSwKICB7aWQ6MyxrZXk6InIxIixuYW1lOiJQZXJzb25hbCBzcGFjZSIsZGVzYzoiVGltZSBhbmQgc3BhY2UgSSByZXNlcnZlIGp1c3QgZm9yIG15c2VsZiIscm9vbToiQmVkcm9vbSIsCiAgIHF1ZXN0aW9uOiJEbyBJIGdpdmUgbXlzZWxmIHRpbWUgYW5kIHNwYWNlIHRoYXQgYXJlIG1pbmUgYWxvbmUsIHdpdGhvdXQgZ3VpbHQ/IiwKICAgaGludDoiQ29uc2lkZXIgdGhlIHRpbWUgeW91IGludGVudGlvbmFsbHkgc2V0IGFzaWRlLCBub3QganVzdCB0aGUgdGltZSBsZWZ0IG92ZXIuIixsb3c6IkFsbW9zdCBuZXZlciIsaGlnaDoiQWxtb3N0IGFsd2F5cyIsCiAgIHRpcHM6e2Jham86IlJlc2VydmUuIEJsb2NrIDIwIG1pbnV0ZXMganVzdCBmb3IgeW91cnNlbGYgYW5kIG1hcmsgdGhhdCB0aW1lIGFzIGJ1c3kgaW4geW91ciBjYWxlbmRhci4iLAogICAgICAgICBtZWRpbzoiUmV0dXJuLiBDaG9vc2UgYW4gYWN0aXZpdHkgeW91IHVzZWQgdG8gZW5qb3kgYnV0IHN0b3BwZWQgZG9pbmcuIFNldCBhc2lkZSB0aW1lIHRvIGJlZ2luIGFnYWluLiIsCiAgICAgICAgIGFsdG86IlByb3RlY3QuIElkZW50aWZ5IHdoYXQgaGVscHMgeW91IG1ha2UgdGltZSBmb3IgeW91cnNlbGYgYW5kIHByZXNlcnZlIHRob3NlIGNvbmRpdGlvbnMuIn19LAogIHtpZDo0LGtleToicjYiLG5hbWU6IlBlcnNvbmFsIGdyb3d0aCIsZGVzYzoiSG93IEkgaW52ZXN0IGluIG15c2VsZiBiZXlvbmQgbXkgcHJvZmVzc2lvbmFsIGxpZmUiLHJvb206IkF0dGljIiwKICAgcXVlc3Rpb246IkFtIEkgaW52ZXN0aW5nIGluIHNvbWV0aGluZyB0aGF0IGVucmljaGVzIG1lIGFzIGEgcGVyc29uPyIsCiAgIGhpbnQ6IkJleW9uZCBteSBwcm9mZXNzaW9uYWwgbGlmZS4iLGxvdzoiT24gaG9sZCIsaGlnaDoiVmVyeSBhY3RpdmUiLAogICB0aXBzOntiYWpvOiJCZWdpbi4gVGFrZSB0aGUgZmlyc3Qgc3RlcCB3aXRoIHRoZSBib29rLCBjb3Vyc2UsIG9yIGxlYXJuaW5nIGV4cGVyaWVuY2UgeW91IGhhdmUgYmVlbiBwb3N0cG9uaW5nLiIsCiAgICAgICAgIG1lZGlvOiJSZXR1cm4uIENob29zZSBzb21ldGhpbmcgeW91IHN0b3BwZWQgbGVhcm5pbmcgYW5kIGRlZmluZSBvbmUgY29uY3JldGUgYWN0aW9uIHRvIGNvbnRpbnVlLiIsCiAgICAgICAgIGFsdG86IkNvbnNvbGlkYXRlLiBDaG9vc2Ugc29tZXRoaW5nIHlvdSBhcmUgbGVhcm5pbmcgYW5kIGZpbmQgYSBjb25jcmV0ZSB3YXkgdG8gcHV0IGl0IGludG8gcHJhY3RpY2UuIn19LAogIHtpZDo1LGtleToicjMiLG5hbWU6IlByb2Zlc3Npb25hbCBncm93dGgiLGRlc2M6IkxlYXJuaW5nIGFuZCBwcm9ncmVzcyBpbiBteSBjdXJyZW50IHJvbGUiLHJvb206Ik9mZmljZSIsCiAgIHF1ZXN0aW9uOiJEbyBJIGZlZWwgdGhhdCBJIGFtIGxlYXJuaW5nIGFuZCBncm93aW5nIGluIG15IHdvcms/IiwKICAgaGludDoiVHJ1bHkgbGVhcm5pbmcsIG5vdCBzaW1wbHkgYWNjdW11bGF0aW5nIHRhc2tzLiIsbG93OiJBdXRvcGlsb3QiLGhpZ2g6IkkgZ3JvdyBlYWNoIHdlZWsiLAogICB0aXBzOntiYWpvOiJTdGFydC4gQ2hvb3NlIGEgc2tpbGwgeW91IHdhbnQgdG8gc3RyZW5ndGhlbiBhbmQgdGFrZSBvbmUgY29uY3JldGUgZmlyc3Qgc3RlcCB0byBkZXZlbG9wIGl0LiIsCiAgICAgICAgIG1lZGlvOiJSZXR1cm4uIENob29zZSBhIHByb2Zlc3Npb25hbCBnb2FsIHlvdSBwYXVzZWQgYW5kIGRlZmluZSBvbmUgY29uY3JldGUgYWN0aW9uIHRvIHJlc3VtZSBpdC4iLAogICAgICAgICBhbHRvOiJTdXN0YWluLiBJZGVudGlmeSBhbiBhY3Rpdml0eSB0aGF0IHN1cHBvcnRzIHlvdXIgcHJvZmVzc2lvbmFsIGdyb3d0aCBhbmQgc2V0IGFzaWRlIHRpbWUgdG8gY29udGludWUgaXQuIn19LAogIHtpZDo2LGtleToicjUiLG5hbWU6IkZpbmFuY2VzIixkZXNjOiJIb3cgaW50ZW50aW9uYWxseSBJIG1hbmFnZSBteSBmaW5hbmNlcyIscm9vbToiS2l0Y2hlbiIsCiAgIHF1ZXN0aW9uOiJEbyBJIG1hbmFnZSBteSBmaW5hbmNlcyB3aXRoIGNsYXJpdHkgYW5kIGludGVudGlvbj8iLAogICBoaW50OiJUaHJvdWdoIGludGVudGlvbmFsIGNob2ljZXMsIG5vdCBhdXRvbWF0aWMgaGFiaXRzLiIsbG93OiJPbiBhdXRvcGlsb3QiLGhpZ2g6IldpdGggY2xhcml0eSIsCiAgIHRpcHM6e2Jham86IlJldmlldy4gTG9vayBhdCB5b3VyIHJlY2VudCBleHBlbnNlcyBhbmQgaWRlbnRpZnkgb25lIHlvdSBjb3VsZCByZWR1Y2UsIGVsaW1pbmF0ZSwgb3IgcGxhbiBtb3JlIGNhcmVmdWxseS4iLAogICAgICAgICBtZWRpbzoiUHJpb3JpdGl6ZS4gQ2hvb3NlIG9uZSBpbXBvcnRhbnQgcHJpb3JpdHkgYW5kIGNvbnNpZGVyIHdoZXRoZXIgeW91ciBzcGVuZGluZyBkZWNpc2lvbnMgYWxpZ24gd2l0aCBpdC4iLAogICAgICAgICBhbHRvOiJBbnRpY2lwYXRlLiBDb25zaWRlciBob3cgbXVjaCByb29tIHlvdSBoYXZlIGZvciBhbiB1bmV4cGVjdGVkIGV4cGVuc2UgYW5kIGRlY2lkZSB3aGF0IHlvdSBjb3VsZCBhZGp1c3QgaWYgbmVjZXNzYXJ5LiJ9fSwKICB7aWQ6NyxrZXk6InIwIixuYW1lOiJSZWxhdGlvbnNoaXBzIixkZXNjOiJIb3cgSSBudXJ0dXJlIG15IGNsb3NlIHJlbGF0aW9uc2hpcHMiLHJvb206IkxpdmluZyByb29tIiwKICAgcXVlc3Rpb246IkFtIEkgcHJlc2VudCBhbmQgY29ubmVjdGVkIHdpdGggdGhlIGltcG9ydGFudCBwZW9wbGUgaW4gbXkgbGlmZT8iLAogICBoaW50OiJUcnVseSBwcmVzZW50LCBub3QganVzdCBwaHlzaWNhbGx5IHRoZXJlLiIsbG93OiJBbG1vc3QgbmV2ZXIiLGhpZ2g6IkFsbW9zdCBhbHdheXMiLAogICB0aXBzOntiYWpvOiJSZWNvbm5lY3QuIFdyaXRlIHRvIHNvbWVvbmUgeW91IGhhdmUgbG9zdCB0b3VjaCB3aXRoIGFuZCBzdWdnZXN0IGEgdGltZSB0byB0YWxrLiIsCiAgICAgICAgIG1lZGlvOiJEaXNjb25uZWN0IHRvIGNvbm5lY3QuIER1cmluZyBvbmUgY29udmVyc2F0aW9uLCBwdXQgeW91ciBwaG9uZSBhd2F5IHVudGlsIGl0IGVuZHMuIiwKICAgICAgICAgYWx0bzoiUHJvdGVjdC4gSWRlbnRpZnkgYSBoYWJpdCB0aGF0IGhlbHBzIHlvdSBjYXJlIGZvciB5b3VyIHJlbGF0aW9uc2hpcHMgYW5kIG1ha2UgdGltZSB0byBtYWludGFpbiBpdC4ifX0sCiAge2lkOjgsa2V5OiJyMiIsbmFtZToiU29jaWFsIGxpZmUiLGRlc2M6IkVuam95bWVudCBhbmQgY29ubmVjdGlvbiB3aXRoIG90aGVycyBvdXRzaWRlIHdvcmsiLHJvb206IlRlcnJhY2UiLAogICBxdWVzdGlvbjoiRG8gSSBtYWtlIHRpbWUgZm9yIGVuam95bWVudCBhbmQgY29ubmVjdGlvbiB3aXRoIG90aGVycz8iLAogICBoaW50OiJPdXRzaWRlIHdvcmsgYW5kIG90aGVyIG9ibGlnYXRpb25zLiIsbG93OiJBbG1vc3QgbmV2ZXIiLGhpZ2g6IkFsbW9zdCBhbHdheXMiLAogICB0aXBzOntiYWpvOiJSZWFjaCBvdXQuIENob29zZSBzb21lb25lIHdob3NlIGNvbXBhbnkgeW91IGVuam95IGFuZCBzdWdnZXN0IGEgc2ltcGxlIHBsYW4uIiwKICAgICAgICAgbWVkaW86IlByaW9yaXRpemUuIElkZW50aWZ5IHRoZSBzb2NpYWwgYWN0aXZpdGllcyB5b3UgZ2VudWluZWx5IGVuam95IGFuZCBwcmlvcml0aXplIHRoZW0gb3ZlciB0aG9zZSB5b3UgYXR0ZW5kIG9ubHkgb3V0IG9mIG9ibGlnYXRpb24uIiwKICAgICAgICAgYWx0bzoiQmFsYW5jZS4gTWFpbnRhaW4gdGhlIHNvY2lhbCB0aW1lIHlvdSBlbmpveSB3aXRob3V0IHNhY3JpZmljaW5nIHJlc3Qgb3IgcGVyc29uYWwgdGltZS4ifX0sCiAge2lkOjksa2V5OiJyNCIsbmFtZToiTXkgZW52aXJvbm1lbnQiLGRlc2M6IlRoZSBzcGFjZXMgd2hlcmUgSSBsaXZlIGFuZCB3b3JrIixyb29tOiJHYXJkZW4iLAogICBxdWVzdGlvbjoiRG8gdGhlIHNwYWNlcyB3aGVyZSBJIGxpdmUgYW5kIHdvcmsgc3VwcG9ydCBteSB3ZWxsYmVpbmc/IiwKICAgaGludDoiTXkgaG9tZSBhbmQgd29ya3BsYWNlLiIsbG93OiJUaGV5IGRyYWluIG1lIixoaWdoOiJUaGV5IHN1cHBvcnQgbWUiLAogICB0aXBzOntiYWpvOiJPcmdhbml6ZS4gQ2hvb3NlIG9uZSBzcGFjZSBhdCBob21lIG9yIHdvcmsgYW5kIHNwZW5kIGEgZmV3IG1pbnV0ZXMgdGlkeWluZyBpdC4iLAogICAgICAgICBtZWRpbzoiQ2hhbmdlLiBJZGVudGlmeSBzb21ldGhpbmcgaW4geW91ciBlbnZpcm9ubWVudCB0aGF0IGNhdXNlcyBkaXNjb21mb3J0IG9yIGRpc3RyYWN0aW9uIGFuZCBtb2RpZnkgaXQuIiwKICAgICAgICAgYWx0bzoiQWRqdXN0LiBSZXZpZXcgeW91ciBzcGFjZSBhbmQgY2hhbmdlIG9uZSBkZXRhaWwgdGhhdCBjb3VsZCBtYWtlIGl0IG1vcmUgY29tZm9ydGFibGUgb3IgZnVuY3Rpb25hbC4ifX0KXTsKCmNvbnN0IFNUQVRFUyA9IFsiIiwiQ29sZCDCtyB2ZXJ5IGxpdHRsZSBhdHRlbnRpb24iLCJDb29sIMK3IG9jY2FzaW9uYWwgYXR0ZW50aW9uIiwiTW9kZXJhdGUgwrcgc29tZSBhdHRlbnRpb24iLCJXYXJtIMK3IHJlZ3VsYXIgYXR0ZW50aW9uIiwiVmVyeSB3YXJtIMK3IGNvbnNpc3RlbnQgYXR0ZW50aW9uIl07CmNvbnN0IEdFT00gPSB7CiAgcjY6e3R5cGU6InBvbHkiLHBvaW50czoiMjQ2LDI5MCA1OTgsODAgOTUyLDI5MCJ9LAogIHIxOnt4OjI1OCx5OjMwOCx3OjMzNCxoOjE5NH0sIHI4Ont4OjYwOCx5OjMwOCx3OjMzNCxoOjE5NH0sCiAgcjA6e3g6MjU4LHk6NTE4LHc6MTk0LGg6MjI4fSwgcjU6e3g6NDY4LHk6NTE4LHc6MTUwLGg6MjI4fSwKICByOTp7eDo2MzQseTo1MTgsdzoxMzYsaDoyMjh9LCByMzp7eDo3ODYseTo1MTgsdzoxNTYsaDoyMjh9LAogIHI3Ont4OjI1OCx5Ojc2MSx3OjY4NCxoOjUwLHI6NH0sIHIyOnt4Ojk2MCx5OjU2Mix3OjIwNCxoOjI1MCxyOjEyfSwKICByNDp7eDo0Nyx5OjgyNSx3OjEzMDYsaDo4MixyOjIyfQp9OwoKZnVuY3Rpb24gaGVhdFJHQih2KXsKICBjb25zdCB0NSA9ICh2IC0gMSkgLyA0LCBjeWFuID0gWzAsMTYwLDIyMF0sIG1pZCA9IFsxMzgsOTUsMTc0XSwgbWFnID0gWzIyMCwwLDEyMF07CiAgbGV0IGMxLCBjMiwgdDsKICBpZiAodDUgPD0gLjUpIHsgYzEgPSBjeWFuOyBjMiA9IG1pZDsgdCA9IHQ1ICogMjsgfSBlbHNlIHsgYzEgPSBtaWQ7IGMyID0gbWFnOyB0ID0gKHQ1IC0gLjUpICogMjsgfQogIHJldHVybiBbMCwxLDJdLm1hcChpID0+IE1hdGgucm91bmQoYzFbaV0gKyAoYzJbaV0gLSBjMVtpXSkgKiB0KSk7Cn0KZnVuY3Rpb24gcmdiYSh2LCBhKXsgY29uc3QgYyA9IGhlYXRSR0Iodik7IHJldHVybiAicmdiYSgiICsgY1swXSArICIsIiArIGNbMV0gKyAiLCIgKyBjWzJdICsgIiwiICsgYSArICIpIjsgfQpmdW5jdGlvbiBzb2xpZCh2KXsgcmV0dXJuIHJnYmEodiwgMSk7IH0KLy8gYWxwaGEgY2xpbWJzIHdpdGggdGhlIHNjb3JlIHNvIDMgYW5kIDQgYXJlIGFjdHVhbGx5IGRpc3Rpbmd1aXNoYWJsZQpmdW5jdGlvbiB3YXNoKHYpeyByZXR1cm4gcmdiYSh2LCAwLjE2ICsgKCh2IC0gMSkgLyA0KSAqIDAuMzYpOyB9Ci8vIG11ZWJsZXMgb3BhY29zOiBzaSBmdWVyYW4gdHJhbnNsw7pjaWRvcywgbGFzIGJhcmFuZGFzIHkgbMOtbmVhcyBkZWwgZm9uZG8gc2UgdmVuIGEgdHJhdsOpcwpmdW5jdGlvbiBmdXJuKHYpewogIGNvbnN0IGF3ID0gMC4xNiArICgodiAtIDEpIC8gNCkgKiAwLjM2LCBhZiA9IDAuNDAgKyAoKHYgLSAxKSAvIDQpICogMC4zODsKICBjb25zdCBhID0gYXcgKyBhZiAtIGF3ICogYWYsIGMgPSBoZWF0UkdCKHYpOwogIGNvbnN0IG1peCA9IGkgPT4gTWF0aC5yb3VuZCgyNTUgKyAoY1tpXSAtIDI1NSkgKiBhKTsKICByZXR1cm4gInJnYigiICsgbWl4KDApICsgIiwiICsgbWl4KDEpICsgIiwiICsgbWl4KDIpICsgIikiOwp9CmZ1bmN0aW9uIHRpcEZvcihkLCB2KXsgcmV0dXJuIHYgPD0gMiA/IGQudGlwcy5iYWpvIDogKHYgPT09IDMgPyBkLnRpcHMubWVkaW8gOiBkLnRpcHMuYWx0byk7IH0KY29uc3QgRU1QVFlfV0FTSCA9ICIjRkZGRkZGIiwgRU1QVFlfRlVSTiA9ICIjRkZGRkZGIjsKCi8qIFBlZ2EgYXF1w60gbGEgVVJMIC9leGVjIGRlIHR1IEdvb2dsZSBBcHBzIFNjcmlwdCAoSW1wbGVtZW50YXIgPiBOdWV2YSBpbXBsZW1lbnRhY2nDs24gPiBBcHAgd2ViLAogICBlamVjdXRhciBjb21vIHTDuiwgY29uIGFjY2VzbyAiQ3VhbHF1aWVyIHBlcnNvbmEiKS4gU2kgcXVlZGEgdmFjw61hLCBubyBzZSBlbnbDrWEgbmFkYS4gKi8KY29uc3QgU0hFRVRfRU5EUE9JTlQgPSAiIjsKCmNvbnN0IFJFRkxFQ1RJT05TID0gWwogICJJcyB0aGUgY29sZGVzdCBhcmVhIG9mIG15IGhvdXNlIGNvbGQgYnkgY2hvaWNlIG9yIGJ5IGhhYml0PyIsCiAgIklmIEkgcmFpc2VkIHRoZSBjb2xkZXN0IGFyZWEgYnkgb25lIHBvaW50IHRoaXMgd2Vlaywgd2hhdCBzcGVjaWZpYyBhY3Rpb24gd291bGQgbWFrZSB0aGF0IHBvc3NpYmxlPyIKXTsKCmNvbnN0IEFHRV9PUFRTID0gWyJVbmRlciAyNSIsICIyNeKAkzM0IiwgIjM14oCTNDQiLCAiNDXigJM1NCIsICI1NSBvciBvbGRlciJdOwoKCmZ1bmN0aW9uIHBvc3RUb1NoZWV0KHBheWxvYWQsIGtlZXBhbGl2ZSl7dHJ5e3dpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe3R5cGU6ImNhc2EtYmFsYW5jZS1zaGVldCIscGF5bG9hZDpwYXlsb2FkLGtlZXBhbGl2ZTohIWtlZXBhbGl2ZX0sIioiKTt9Y2F0Y2goZSl7fX0KCmNsYXNzIENvbXBvbmVudCBleHRlbmRzIERDTG9naWMgewogIGNvbnN0cnVjdG9yKHByb3BzKXsKICAgIHN1cGVyKHByb3BzKTsKICAgIHRoaXMuc3RhdGUgPSB7CiAgICAgIHZhbHVlczogRE9NQUlOUy5tYXAoKCkgPT4gbnVsbCksCiAgICAgIGhvdmVyOiBudWxsLCBzaG93UHJldmlldzogZmFsc2UsIHNob3dUaXBzOiBmYWxzZSwgY29uZmlybVJlc2V0OiBmYWxzZSwgYnVzeTogZmFsc2UsCiAgICAgIGNvbW1pdDogeyBhcmVhOiBudWxsLCB0ZXh0OiAiIiwgZGF0ZTogIiIgfSwKICAgICAgY3R4OiB7IGFnZTogbnVsbCwgY2l0eTogIiIsIGpvYjogIiIgfQogICAgfTsKICAgIHRoaXMuY2FudmFzUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7CiAgICB0aGlzLmxpbmtSZWYgPSBSZWFjdC5jcmVhdGVSZWYoKTsKICAgIHRoaXMuc3ZnUmVmID0gUmVhY3QuY3JlYXRlUmVmKCk7CiAgICB0aGlzLmNhcmRSZWZzID0gRE9NQUlOUy5tYXAoKCkgPT4gUmVhY3QuY3JlYXRlUmVmKCkpOwogICAgdGhpcy5zaWQgPSBEYXRlLm5vdygpLnRvU3RyaW5nKDM2KSArICItIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDkpOwogICAgdGhpcy5jb3JlU2VudCA9IGZhbHNlOwogICAgdGhpcy5zYXZlVGltZXIgPSBudWxsOwogICAgdGhpcy5yZXZpc2lvbiA9IDA7CiAgfQogIHNlbmRTbmFwc2hvdChrZWVwYWxpdmUsZG93bmxvYWRlZCl7Y29uc3QgdnM9dGhpcy5zdGF0ZS52YWx1ZXMsYW5zd2VyZWQ9dnMuZmlsdGVyKHY9PnYhPW51bGwpO2NvbnN0IHA9e3NpZDp0aGlzLnNpZCxyZXZpc2lvbjorK3RoaXMucmV2aXNpb24sdGltZXN0YW1wOm5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxwcm9tZWRpbzphbnN3ZXJlZC5sZW5ndGg/KGFuc3dlcmVkLnJlZHVjZSgoYSxiKT0+YStiLDApL2Fuc3dlcmVkLmxlbmd0aCkudG9GaXhlZCgyKToiIixhcmVhX2NvbXByb21pc286dGhpcy5zdGF0ZS5jb21taXQuYXJlYSE9bnVsbD9ET01BSU5TW3RoaXMuc3RhdGUuY29tbWl0LmFyZWFdLm5hbWU6IiIsY29tcHJvbWlzbzp0aGlzLnN0YXRlLmNvbW1pdC50ZXh0fHwiIixmZWNoYV9jb21wcm9taXNvOnRoaXMuc3RhdGUuY29tbWl0LmRhdGV8fCIiLGRlc2NhcmdvX2ltYWdlbjpkb3dubG9hZGVkPyJ5ZXMiOiIiLGVkYWQ6dGhpcy5zdGF0ZS5jdHguYWdlfHwiIixjaXVkYWQ6dGhpcy5zdGF0ZS5jdHguY2l0eXx8IiIsb2N1cGFjaW9uOnRoaXMuc3RhdGUuY3R4LmpvYnx8IiIsaWRpb21hOiJlbiJ9O0RPTUFJTlMuZm9yRWFjaCgoZCxpKT0+e3BbInMiKyhpKzEpXT12c1tkLmlkXT09bnVsbD8iIjp2c1tkLmlkXTtwWyJuIisoaSsxKV09ZC5uYW1lO30pO3Bvc3RUb1NoZWV0KHAsISFrZWVwYWxpdmUpO30KICBxdWV1ZVNuYXBzaG90KCl7Y2xlYXJUaW1lb3V0KHRoaXMuc2F2ZVRpbWVyKTt0aGlzLnNhdmVUaW1lcj1zZXRUaW1lb3V0KCgpPT50aGlzLnNlbmRTbmFwc2hvdChmYWxzZSxmYWxzZSksNDUwKTt9CgogIHNldFZhbHVlKGksIHYpewogICAgY29uc3QgdmFsdWVzID0gdGhpcy5zdGF0ZS52YWx1ZXMuc2xpY2UoKTsKICAgIHZhbHVlc1tpXSA9IHZhbHVlc1tpXSA9PT0gdiA/IG51bGwgOiB2OwogICAgdGhpcy5zZXRTdGF0ZSh7IHZhbHVlcywgY29uZmlybVJlc2V0OiBmYWxzZSwgc2hvd1RpcHM6IGZhbHNlIH0sICgpID0+IHRoaXMuc2VuZFNuYXBzaG90KGZhbHNlLGZhbHNlKSk7CiAgfQoKICBtYXliZVNlbmRDb3JlKCl7CiAgICBpZiAodGhpcy5jb3JlU2VudCkgcmV0dXJuOwogICAgY29uc3QgdnMgPSB0aGlzLnN0YXRlLnZhbHVlczsKICAgIGlmICh2cy5zb21lKHYgPT4gdiA9PSBudWxsKSkgcmV0dXJuOwogICAgdGhpcy5jb3JlU2VudCA9IHRydWU7CiAgICBjb25zdCBwID0geyBzaWQ6IHRoaXMuc2lkLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgcHJvbWVkaW86ICh2cy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHZzLmxlbmd0aCkudG9GaXhlZCgyKSB9OwogICAgRE9NQUlOUy5mb3JFYWNoKChkLCBpKSA9PiB7IHBbInMiICsgKGkgKyAxKV0gPSB2c1tkLmlkXTsgcFsibiIgKyAoaSArIDEpXSA9IGQubmFtZTsgfSk7CiAgICBwb3N0VG9TaGVldChwLCBmYWxzZSk7CiAgfQoKICByZXNldCgpewogICAgaWYgKCF0aGlzLnN0YXRlLmNvbmZpcm1SZXNldCkgeyB0aGlzLnNldFN0YXRlKHsgY29uZmlybVJlc2V0OiB0cnVlIH0pOyByZXR1cm47IH0KICAgIHRoaXMuY29yZVNlbnQgPSBmYWxzZTsKICAgIHRoaXMuc2lkID0gRGF0ZS5ub3coKS50b1N0cmluZygzNikgKyAiLSIgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCA5KTsKICAgIHRoaXMuc2V0U3RhdGUoeyB2YWx1ZXM6IERPTUFJTlMubWFwKCgpID0+IG51bGwpLCBzaG93UHJldmlldzogZmFsc2UsIHNob3dUaXBzOiBmYWxzZSwgY29uZmlybVJlc2V0OiBmYWxzZSB9KTsKICB9CgogIHNhdmVDdHgocGF0Y2gpe3RoaXMuc2V0U3RhdGUoe2N0eDpPYmplY3QuYXNzaWduKHt9LHRoaXMuc3RhdGUuY3R4LHBhdGNoKX0sKCk9PnRoaXMucXVldWVTbmFwc2hvdCgpKTt9CiAgc2F2ZUNvbW1pdChwYXRjaCl7dGhpcy5zZXRTdGF0ZSh7Y29tbWl0Ok9iamVjdC5hc3NpZ24oe30sdGhpcy5zdGF0ZS5jb21taXQscGF0Y2gpfSwoKT0+dGhpcy5xdWV1ZVNuYXBzaG90KCkpO30KCiAganVtcFRvKGkpewogICAgY29uc3QgZWwgPSB0aGlzLmNhcmRSZWZzW2ldLmN1cnJlbnQ7CiAgICB0aGlzLnNldFN0YXRlKHsgaG92ZXI6IERPTUFJTlNbaV0ua2V5IH0pOwogICAgaWYgKCFlbCkgcmV0dXJuOwogICAgY29uc3QgdG9wID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAyMDsKICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogdG9wLCBiZWhhdmlvcjogInNtb290aCIgfSk7CiAgfQoKICBhbnN3ZXJlZElkeCgpeyByZXR1cm4gRE9NQUlOUy5tYXAoZCA9PiBkLmlkKS5maWx0ZXIoaSA9PiB0aGlzLnN0YXRlLnZhbHVlc1tpXSAhPSBudWxsKTsgfQoKICBzdGF0cygpewogICAgY29uc3QgdnMgPSB0aGlzLnN0YXRlLnZhbHVlcywgaWR4ID0gdGhpcy5hbnN3ZXJlZElkeCgpOwogICAgaWYgKCFpZHgubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIGxldCBoaSA9IGlkeFswXSwgbG8gPSBpZHhbMF0sIHN1bSA9IDA7CiAgICBpZHguZm9yRWFjaChpID0+IHsgc3VtICs9IHZzW2ldOyBpZiAodnNbaV0gPiB2c1toaV0pIGhpID0gaTsgaWYgKHZzW2ldIDwgdnNbbG9dKSBsbyA9IGk7IH0pOwogICAgcmV0dXJuIHsgaGk6IGhpLCBsbzogbG8sIGF2ZzogKHN1bSAvIGlkeC5sZW5ndGgpLnRvRml4ZWQoMSksIGdhcDogdnNbaGldIC0gdnNbbG9dLCBsb3c6IGlkeC5maWx0ZXIoaSA9PiB2c1tpXSA8PSAyKSB9OwogIH0KCiAgYXN5bmMgbG9hZEZvbnRDU1MoKXsKICAgIGlmICh0aGlzLl9mb250Q1NTICE9PSB1bmRlZmluZWQpIHJldHVybiB0aGlzLl9mb250Q1NTOwogICAgdGhpcy5fZm9udENTUyA9ICIiOwogICAgdHJ5IHsKICAgICAgY29uc3QgdXJsID0gImh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9QmFsb28rMjp3Z2h0QDcwMDs4MDAmZmFtaWx5PU51bml0bzp3Z2h0QDQwMDs2MDA7NzAwJmRpc3BsYXk9c3dhcCI7CiAgICAgIGxldCBjc3MgPSBhd2FpdCAoYXdhaXQgZmV0Y2godXJsKSkudGV4dCgpOwogICAgICBjb25zdCB1cmxzID0gQXJyYXkuZnJvbShuZXcgU2V0KChjc3MubWF0Y2goL2h0dHBzOlwvXC9mb250c1wuZ3N0YXRpY1wuY29tW14pXSsvZykgfHwgW10pKSk7CiAgICAgIGZvciAoY29uc3QgdSBvZiB1cmxzKSB7CiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IChhd2FpdCBmZXRjaCh1KSkuYmxvYigpOwogICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBuZXcgUHJvbWlzZShyZXMgPT4geyBjb25zdCBmciA9IG5ldyBGaWxlUmVhZGVyKCk7IGZyLm9ubG9hZCA9ICgpID0+IHJlcyhmci5yZXN1bHQpOyBmci5yZWFkQXNEYXRhVVJMKGJsb2IpOyB9KTsKICAgICAgICBjc3MgPSBjc3Muc3BsaXQodSkuam9pbihkYXRhKTsKICAgICAgfQogICAgICB0aGlzLl9mb250Q1NTID0gY3NzOwogICAgfSBjYXRjaCAoZSkgeyB0aGlzLl9mb250Q1NTID0gIiI7IH0KICAgIHJldHVybiB0aGlzLl9mb250Q1NTOwogIH0KCiAgYXN5bmMgZXhwb3J0SW1hZ2UoKXsKICAgIGNvbnN0IHN0ID0gdGhpcy5zdGF0cygpOwogICAgaWYgKCFzdCB8fCB0aGlzLmFuc3dlcmVkSWR4KCkubGVuZ3RoIDwgRE9NQUlOUy5sZW5ndGggfHwgdGhpcy5zdGF0ZS5idXN5KSByZXR1cm47CiAgICB0aGlzLnNldFN0YXRlKHsgYnVzeTogdHJ1ZSB9KTsKICAgIGNvbnN0IHN2ZyA9IHRoaXMuc3ZnUmVmLmN1cnJlbnQ7CiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhc1JlZi5jdXJyZW50OwogICAgaWYgKCFjYW52YXMgfHwgIXN2ZykgeyB0aGlzLnNldFN0YXRlKHsgYnVzeTogZmFsc2UgfSk7IHJldHVybjsgfQogICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICBjb25zdCBXID0gY2FudmFzLndpZHRoOwogICAgY29uc3QgRElTUExBWSA9ICInQmFsb28gMicsIHNhbnMtc2VyaWYiLCBCT0RZID0gIk51bml0bywgc2Fucy1zZXJpZiI7CiAgICBjb25zdCB2cyA9IHRoaXMuc3RhdGUudmFsdWVzLCBjbSA9IHRoaXMuc3RhdGUuY29tbWl0OwogICAgY29uc3QgY29tbWl0QXJlYSA9IGNtLmFyZWEgIT0gbnVsbCA/IERPTUFJTlNbY20uYXJlYV0gOiBET01BSU5TW3N0LmxvXTsKICAgIGNvbnN0IGhhc0NvbW1pdCA9ICEhKGNtLnRleHQgJiYgY20udGV4dC50cmltKCkpOwoKICAgIGN0eC5mb250ID0gIjQwMCAxM3B4ICIgKyBCT0RZOwogICAgY29uc3QgYmxvY2tzID0gRE9NQUlOUy5tYXAoZCA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy53cmFwKGN0eCwgdGlwRm9yKGQsIHZzW2QuaWRdKSwgVyAtIDE0Nik7CiAgICAgIHJldHVybiB7IGQ6IGQsIGxpbmVzOiBsaW5lcywgaDogNDQgKyBsaW5lcy5sZW5ndGggKiAxOSB9OwogICAgfSk7CiAgICBjdHguZm9udCA9ICI3MDAgMTVweCAiICsgQk9EWTsKICAgIGNvbnN0IGNvbW1pdExpbmVzID0gaGFzQ29tbWl0ID8gdGhpcy53cmFwKGN0eCwgY20udGV4dC50cmltKCksIFcgLSAxNTApIDogW107CiAgICBjb25zdCBjb21taXRIID0gaGFzQ29tbWl0ID8gNzQgKyBjb21taXRMaW5lcy5sZW5ndGggKiAyMSA6IDA7CiAgICBjb25zdCB3YW50UmVmbCA9IHRoaXMucHJvcHMuc2hvd1JlZmxlY3Rpb24gIT09IGZhbHNlOwogICAgY3R4LmZvbnQgPSAiNDAwIDEzcHggIiArIEJPRFk7CiAgICBjb25zdCByZWZsQmxvY2tzID0gd2FudFJlZmwgPyBSRUZMRUNUSU9OUy5tYXAocSA9PiB7CiAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy53cmFwKGN0eCwgcSwgVyAtIDE1MCk7CiAgICAgIHJldHVybiB7IGxpbmVzOiBsaW5lcywgaDogMjAgKyBsaW5lcy5sZW5ndGggKiAxOSB9OwogICAgfSkgOiBbXTsKICAgIGNvbnN0IHJlZmxIID0gd2FudFJlZmwgPyA0NCArIHJlZmxCbG9ja3MucmVkdWNlKChhLCBiKSA9PiBhICsgYi5oICsgOSwgMCkgOiAwOwogICAgY29uc3QgZHJhd1cgPSA3MjAsIGRyYXdIID0gZHJhd1cgKiAoOTUwIC8gMTQwMCk7CiAgICBjb25zdCB0aXBzVG9wID0gMTE4ICsgZHJhd0ggKyAyNiArIDYyICsgMzQ7CiAgICBjYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aXBzVG9wICsgYmxvY2tzLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuaCArIDExLCAwKSArIGNvbW1pdEggKyByZWZsSCArIDU0KTsKICAgIGNvbnN0IEggPSBjYW52YXMuaGVpZ2h0OwoKICAgIGN0eC5maWxsU3R5bGUgPSAiI0ZGRkRGQiI7IGN0eC5maWxsUmVjdCgwLCAwLCBXLCBIKTsKICAgIGNvbnN0IGcgPSBjdHguY3JlYXRlTGluZWFyR3JhZGllbnQoMCwgMCwgVywgMCk7CiAgICBnLmFkZENvbG9yU3RvcCgwLCAiIzAwQTBEQyIpOyBnLmFkZENvbG9yU3RvcCgxLCAiI0RDMDA3OCIpOwogICAgY3R4LmZpbGxTdHlsZSA9IGc7IGN0eC5maWxsUmVjdCgwLCAwLCBXLCAxMik7CgogICAgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgY3R4LmZpbGxTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmZvbnQgPSAiODAwIDQwcHggIiArIERJU1BMQVk7CiAgICBjdHguZmlsbFRleHQoIk15IExpZmUgQmFsYW5jZSBIb3VzZSIsIFcgLyAyLCA3Mik7CiAgICBjdHguZm9udCA9ICI2MDAgMTRweCAiICsgQk9EWTsgY3R4LmZpbGxTdHlsZSA9ICIjNTk2MTVBIjsKICAgIGN0eC5maWxsVGV4dChuZXcgRGF0ZSgpLnRvTG9jYWxlRGF0ZVN0cmluZygiZW4tVVMiLCB7IHllYXI6ICJudW1lcmljIiwgbW9udGg6ICJsb25nIiwgZGF5OiAibnVtZXJpYyIgfSksIFcgLyAyLCA5OCk7CgogICAgY29uc3QgZmluaXNoID0gKCkgPT4gewogICAgICBsZXQgeSA9IDExOCArIGRyYXdIICsgMjY7CiAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNTUsIHksIFcgLSAxMTAsIDU2LCAxNCk7CiAgICAgIGN0eC5maWxsU3R5bGUgPSAiI0Y0RUVGQiI7IGN0eC5maWxsKCk7CiAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmxpbmVXaWR0aCA9IDIuNTsgY3R4LnN0cm9rZSgpOwogICAgICBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOyBjdHguZm9udCA9ICI3MDAgMTNweCAiICsgQk9EWTsgY3R4LnRleHRBbGlnbiA9ICJjZW50ZXIiOwogICAgICBjdHguZmlsbFRleHQoIldhcm1lc3Q6ICIgKyBET01BSU5TW3N0LmhpXS5uYW1lICsgIiAoIiArIHZzW3N0LmhpXSArICIpICAgwrcgICBDb2xkZXN0OiAiICsgRE9NQUlOU1tzdC5sb10ubmFtZSArICIgKCIgKyB2c1tzdC5sb10gKyAiKSAgIMK3ICAgR2FwOiAiICsgc3QuZ2FwICsgIiBwb2ludHMiLCBXIC8gMiwgeSArIDM0KTsKCiAgICAgIHkgKz0gOTA7CiAgICAgIGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7IGN0eC5mb250ID0gIjgwMCAyNHB4ICIgKyBESVNQTEFZOyBjdHguZmlsbFN0eWxlID0gIiMxNDI2MUMiOwogICAgICBjdHguZmlsbFRleHQoIlN1Z2dlc3Rpb25zIGZvciBjYXJpbmcgZm9yIG15IGJhbGFuY2UiLCA1NSwgeSk7CiAgICAgIHkgKz0gMjQ7CgogICAgICBibG9ja3MuZm9yRWFjaChiID0+IHsKICAgICAgICBjb25zdCB2ID0gdnNbYi5kLmlkXSwgY29sb3IgPSBzb2xpZCh2KTsKICAgICAgICB0aGlzLnJvdW5kUmVjdChjdHgsIDU1LCB5LCBXIC0gMTEwLCBiLmgsIDEzKTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNGRkZGRkYiOyBjdHguZmlsbCgpOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmxpbmVXaWR0aCA9IDI7IGN0eC5zdHJva2UoKTsKICAgICAgICB0aGlzLnJvdW5kUmVjdChjdHgsIDU1LCB5LCA5LCBiLmgsIDQpOyBjdHguZmlsbFN0eWxlID0gY29sb3I7IGN0eC5maWxsKCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmZvbnQgPSAiNzAwIDE1cHggIiArIERJU1BMQVk7IGN0eC50ZXh0QWxpZ24gPSAibGVmdCI7CiAgICAgICAgY3R4LmZpbGxUZXh0KGIuZC5uYW1lLCA4MCwgeSArIDI0KTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3I7IGN0eC5mb250ID0gIjgwMCAxNXB4ICIgKyBESVNQTEFZOyBjdHgudGV4dEFsaWduID0gInJpZ2h0IjsKICAgICAgICBjdHguZmlsbFRleHQodiArICIvNSIsIFcgLSA3NiwgeSArIDI0KTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiMyQTMzMkMiOyBjdHguZm9udCA9ICI0MDAgMTNweCAiICsgQk9EWTsgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsKICAgICAgICBiLmxpbmVzLmZvckVhY2goKGwsIGkpID0+IGN0eC5maWxsVGV4dChsLCA4MCwgeSArIDQ0ICsgaSAqIDE5KSk7CiAgICAgICAgeSArPSBiLmggKyAxMTsKICAgICAgfSk7CgogICAgICBpZiAoaGFzQ29tbWl0KSB7CiAgICAgICAgeSArPSA4OwogICAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNjEsIHkgKyA2LCBXIC0gMTEwLCBjb21taXRIIC0gOCwgMTQpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiI0NCQjNGMCI7IGN0eC5maWxsKCk7CiAgICAgICAgdGhpcy5yb3VuZFJlY3QoY3R4LCA1NSwgeSwgVyAtIDExMCwgY29tbWl0SCAtIDgsIDE0KTsKICAgICAgICBjdHguZmlsbFN0eWxlID0gIiNGNEVFRkIiOyBjdHguZmlsbCgpOwogICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmxpbmVXaWR0aCA9IDIuNTsgY3R4LnN0cm9rZSgpOwogICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzU2NDA4QyI7IGN0eC5mb250ID0gIjcwMCAxMnB4ICIgKyBCT0RZOyBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgICAgIGN0eC5maWxsVGV4dCgiTVkgQ09NTUlUTUVOVCDCtyAiICsgY29tbWl0QXJlYS5uYW1lLnRvVXBwZXJDYXNlKCkgKyAoY20uZGF0ZSA/ICIgIMK3ICBCWSAiICsgY20uZGF0ZSA6ICIiKSwgODAsIHkgKyAyOCk7CiAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmZvbnQgPSAiNzAwIDE1cHggIiArIEJPRFk7CiAgICAgICAgY29tbWl0TGluZXMuZm9yRWFjaCgobCwgaSkgPT4gY3R4LmZpbGxUZXh0KGwsIDgwLCB5ICsgNTQgKyBpICogMjEpKTsKICAgICAgICB5ICs9IGNvbW1pdEg7CiAgICAgIH0KCiAgICAgIGlmICh3YW50UmVmbCkgewogICAgICAgIHkgKz0gMjA7CiAgICAgICAgY3R4LnRleHRBbGlnbiA9ICJsZWZ0IjsgY3R4LmZvbnQgPSAiODAwIDIwcHggIiArIERJU1BMQVk7IGN0eC5maWxsU3R5bGUgPSAiIzE0MjYxQyI7CiAgICAgICAgY3R4LmZpbGxUZXh0KCJGb3IgcmVmbGVjdGlvbiIsIDU1LCB5KTsKICAgICAgICB5ICs9IDIwOwogICAgICAgIHJlZmxCbG9ja3MuZm9yRWFjaChiID0+IHsKICAgICAgICAgIHRoaXMucm91bmRSZWN0KGN0eCwgNTUsIHksIFcgLSAxMTAsIGIuaCwgMTIpOwogICAgICAgICAgY3R4LmZpbGxTdHlsZSA9ICIjRkZGRkZGIjsgY3R4LmZpbGwoKTsKICAgICAgICAgIGN0eC5zdHJva2VTdHlsZSA9ICIjMTQyNjFDIjsgY3R4LmxpbmVXaWR0aCA9IDI7IGN0eC5zdHJva2UoKTsKICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSAiIzJBMzMyQyI7IGN0eC5mb250ID0gIjQwMCAxM3B4ICIgKyBCT0RZOyBjdHgudGV4dEFsaWduID0gImxlZnQiOwogICAgICAgICAgYi5saW5lcy5mb3JFYWNoKChsLCBpKSA9PiBjdHguZmlsbFRleHQobCwgNzYsIHkgKyAyNCArIGkgKiAxOSkpOwogICAgICAgICAgeSArPSBiLmggKyA5OwogICAgICAgIH0pOwogICAgICB9CgogICAgICBjdHgudGV4dEFsaWduID0gImNlbnRlciI7IGN0eC5mb250ID0gIjYwMCAxM3B4ICIgKyBCT0RZOyBjdHguZmlsbFN0eWxlID0gIiM1OTYxNUEiOwogICAgICBjdHguZmlsbFRleHQoIm1hcnRoYXJhbWlyZXouY29tLmNvIiwgVyAvIDIsIEggLSAyMik7CgogICAgICB0aGlzLnNlbmRTbmFwc2hvdCh0cnVlLHRydWUpOwoKICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNob3dQcmV2aWV3OiB0cnVlLCBzaG93VGlwczogdHJ1ZSwgYnVzeTogZmFsc2UgfSwgKCkgPT4gewogICAgICAgIGlmICh0aGlzLmxpbmtSZWYuY3VycmVudCkgdGhpcy5saW5rUmVmLmN1cnJlbnQuaHJlZiA9IGNhbnZhcy50b0RhdGFVUkwoImltYWdlL3BuZyIpOwogICAgICAgIGNvbnN0IGVsID0gdGhpcy5jYW52YXNSZWYuY3VycmVudDsKICAgICAgICBpZiAoZWwpIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAzMCwgYmVoYXZpb3I6ICJzbW9vdGgiIH0pOwogICAgICB9KTsKICAgIH07CgogICAgY29uc3QgY2xvbmUgPSBzdmcuY2xvbmVOb2RlKHRydWUpOwogICAgY2xvbmUuc2V0QXR0cmlidXRlKCJ4bWxucyIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpOwogICAgY29uc3QgZm9udENTUyA9IGF3YWl0IHRoaXMubG9hZEZvbnRDU1MoKTsKICAgIGlmIChmb250Q1NTKSB7CiAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJzdHlsZSIpOwogICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGZvbnRDU1M7CiAgICAgIGNsb25lLmluc2VydEJlZm9yZShzdHlsZSwgY2xvbmUuZmlyc3RDaGlsZCk7CiAgICB9CiAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTsKICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7IGN0eC5kcmF3SW1hZ2UoaW1nLCAoVyAtIGRyYXdXKSAvIDIsIDExOCwgZHJhd1csIGRyYXdIKTsgZmluaXNoKCk7IH07CiAgICBpbWcub25lcnJvciA9IGZpbmlzaDsKICAgIGltZy5zcmMgPSAiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKGNsb25lKSk7CiAgfQoKICByb3VuZFJlY3QoY3R4LCB4LCB5LCB3LCBoLCByKXsKICAgIGN0eC5iZWdpblBhdGgoKTsgY3R4Lm1vdmVUbyh4ICsgciwgeSk7CiAgICBjdHguYXJjVG8oeCArIHcsIHksIHggKyB3LCB5ICsgaCwgcik7IGN0eC5hcmNUbyh4ICsgdywgeSArIGgsIHgsIHkgKyBoLCByKTsKICAgIGN0eC5hcmNUbyh4LCB5ICsgaCwgeCwgeSwgcik7IGN0eC5hcmNUbyh4LCB5LCB4ICsgdywgeSwgcik7IGN0eC5jbG9zZVBhdGgoKTsKICB9CgogIHdyYXAoY3R4LCB0ZXh0LCBtYXhXaWR0aCl7CiAgICBjb25zdCB3b3JkcyA9IHRleHQuc3BsaXQoIiAiKSwgbGluZXMgPSBbXTsgbGV0IGxpbmUgPSAiIjsKICAgIHdvcmRzLmZvckVhY2godyA9PiB7CiAgICAgIGNvbnN0IHQgPSBsaW5lID8gbGluZSArICIgIiArIHcgOiB3OwogICAgICBpZiAoY3R4Lm1lYXN1cmVUZXh0KHQpLndpZHRoID4gbWF4V2lkdGggJiYgbGluZSkgeyBsaW5lcy5wdXNoKGxpbmUpOyBsaW5lID0gdzsgfSBlbHNlIGxpbmUgPSB0OwogICAgfSk7CiAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTsKICAgIHJldHVybiBsaW5lczsKICB9CgogIHJlbmRlclZhbHMoKXsKICAgIGNvbnN0IHZzID0gdGhpcy5zdGF0ZS52YWx1ZXMsIHN0ID0gdGhpcy5zdGF0cygpLCBob3ZlciA9IHRoaXMuc3RhdGUuaG92ZXI7CiAgICBjb25zdCBhbnN3ZXJlZCA9IHRoaXMuYW5zd2VyZWRJZHgoKSwgbiA9IGFuc3dlcmVkLmxlbmd0aCwgYWxsID0gbiA9PT0gRE9NQUlOUy5sZW5ndGg7CiAgICBjb25zdCBjID0ge30sIGhpdCA9IHt9LCBvdmVyID0ge307CgogICAgRE9NQUlOUy5mb3JFYWNoKGQgPT4gewogICAgICBjb25zdCB2ID0gdnNbZC5pZF0sIGZrID0gImYiICsgZC5rZXkuc2xpY2UoMSk7CiAgICAgIGNbZC5rZXldID0gdiA9PSBudWxsID8gRU1QVFlfV0FTSCA6IHdhc2godik7CiAgICAgIGNbZmtdID0gdiA9PSBudWxsID8gRU1QVFlfRlVSTiA6IGZ1cm4odik7CiAgICAgIGhpdFtkLmtleV0gPSAoKSA9PiB0aGlzLmp1bXBUbyhkLmlkKTsKICAgICAgb3ZlcltkLmtleV0gPSAoKSA9PiB0aGlzLnNldFN0YXRlKHsgaG92ZXI6IGQua2V5IH0pOwogICAgfSk7CgogICAgY29uc3QgaGcgPSBob3ZlciA/IEdFT01baG92ZXJdIDogbnVsbDsKICAgIGNvbnN0IGhpZ2hsaWdodCA9IGhnID8gUmVhY3QuY3JlYXRlRWxlbWVudCgiZyIsIHsga2V5OiAiaGwiLCBmaWxsOiAibm9uZSIsIHN0cm9rZTogIiMxNDI2MUMiLCBzdHJva2VXaWR0aDogNywgc3Ryb2tlRGFzaGFycmF5OiAiMTYgMTEiLCBvcGFjaXR5OiAwLjg1LCBzdHlsZTogeyBwb2ludGVyRXZlbnRzOiAibm9uZSIgfSB9LAogICAgICBoZy50eXBlID09PSAicG9seSIKICAgICAgICA/IFJlYWN0LmNyZWF0ZUVsZW1lbnQoInBvbHlnb24iLCB7IHBvaW50czogaGcucG9pbnRzIH0pCiAgICAgICAgOiBSZWFjdC5jcmVhdGVFbGVtZW50KCJyZWN0IiwgeyB4OiBoZy54LCB5OiBoZy55LCB3aWR0aDogaGcudywgaGVpZ2h0OiBoZy5oLCByeDogaGcuciB8fCA4IH0pCiAgICApIDogbnVsbDsKCiAgICBjb25zdCBNRURBTFMgPSBbCiAgICAgIHsgazogInI0IiwgeDogMjg0LCB5OiA4NjcgfSwgeyBrOiAicjIiLCB4OiAxMTUwLCB5OiA1MzYgfSwKICAgICAgeyBrOiAicjYiLCB4OiA2MDAsIHk6IDI1OCB9LCB7IGs6ICJyNyIsIHg6IDUzNiwgeTogNzg2IH0sCiAgICAgIHsgazogInIxIiwgeDogNDI1LCB5OiAzODggfSwgeyBrOiAicjgiLCB4OiA3NzUsIHk6IDM4OCB9LAogICAgICB7IGs6ICJyMCIsIHg6IDM1NiwgeTogNTk4IH0sIHsgazogInI1IiwgeDogNTQ0LCB5OiA1OTggfSwKICAgICAgeyBrOiAicjkiLCB4OiA3MDIsIHk6IDU5OCB9LCB7IGs6ICJyMyIsIHg6IDg2NCwgeTogNTk4IH0KICAgIF07CiAgICBjb25zdCBieUtleSA9IHt9OwogICAgRE9NQUlOUy5mb3JFYWNoKGQgPT4geyBieUtleVtkLmtleV0gPSB2c1tkLmlkXTsgfSk7CiAgICBjb25zdCBtZWRhbHMgPSBSZWFjdC5jcmVhdGVFbGVtZW50KCJnIiwgeyBrZXk6ICJtZWRhbHMiLCBzdHlsZTogeyBwb2ludGVyRXZlbnRzOiAibm9uZSIgfSB9LCBNRURBTFMuZmlsdGVyKG0gPT4gYnlLZXlbbS5rXSAhPSBudWxsKS5tYXAobSA9PiB7CiAgICAgIGNvbnN0IHZhbCA9IGJ5S2V5W20ua107CiAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KCJnIiwgeyBrZXk6IG0uayB9LAogICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoImNpcmNsZSIsIHsgY3g6IG0ueCwgY3k6IG0ueSwgcjogMjQsIGZpbGw6ICIjRkZGRkZGIiwgc3Ryb2tlOiAiIzE0MjYxQyIsIHN0cm9rZVdpZHRoOiA2IH0pLAogICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoInRleHQiLCB7CiAgICAgICAgICB4OiBtLngsIHk6IG0ueSArIDI4ICogMC4zNSwgdGV4dEFuY2hvcjogIm1pZGRsZSIsIGZvbnRGYW1pbHk6ICInQmFsb28gMicsIHNhbnMtc2VyaWYiLAogICAgICAgICAgZm9udFdlaWdodDogODAwLCBmb250U2l6ZTogMjgsIGZpbGw6ICIjMTQyNjFDIiwgc3Ryb2tlOiAibm9uZSIKICAgICAgICB9LCBTdHJpbmcodmFsKSkKICAgICAgKTsKICAgIH0pKTsKCiAgICBjb25zdCBhcmlhSG91c2UgPSAiTGlmZSBiYWxhbmNlIGhvdXNlLiAiICsgRE9NQUlOUy5tYXAoZCA9PiBkLm5hbWUgKyAiOiAiICsgKHZzW2QuaWRdID09IG51bGwgPyAidW5hbnN3ZXJlZCIgOiB2c1tkLmlkXSArICIgb3V0IG9mIDUiKSkuam9pbigiLiAiKSArICIuIjsKCiAgICByZXR1cm4gewogICAgICBjOiBjLCBoaXQ6IGhpdCwgb3Zlcjogb3Zlciwgb3V0OiAoKSA9PiB0aGlzLnNldFN0YXRlKHsgaG92ZXI6IG51bGwgfSksCiAgICAgIGhpZ2hsaWdodDogaGlnaGxpZ2h0LCBtZWRhbHM6IG1lZGFscywgYXJpYUhvdXNlOiBhcmlhSG91c2UsCgogICAgICBwcm9ncmVzc0xhYmVsOiBuID09PSAwID8gIllvdSBoYXZlbuKAmXQgYW5zd2VyZWQgYW55IHF1ZXN0aW9ucyB5ZXQiIDogbiArICIgb2YgMTAgYW5zd2VyZWQiLAogICAgICBwcm9ncmVzc0hpbnQ6IGFsbCA/ICJDb21wbGV0ZSDCtyB5b3VyIHN1Z2dlc3Rpb25zIGFyZSBiZWxvdyIgOiAoMTAgLSBuKSArICIgcmVtYWluaW5nIiwKICAgICAgcHJvZ3Jlc3NQY3Q6IChuIC8gRE9NQUlOUy5sZW5ndGggKiAxMDApICsgIiUiLAoKICAgICAgdGlsZXM6IERPTUFJTlMubWFwKGQgPT4gewogICAgICAgIGNvbnN0IHYgPSB2c1tkLmlkXSwgaXNIb3ZlciA9IGhvdmVyID09PSBkLmtleTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcm9vbTogZC5yb29tLCBuYW1lOiBkLm5hbWUsIGRlc2M6IGQuZGVzYywgcXVlc3Rpb246IGQucXVlc3Rpb24sIGhpbnQ6IGQuaGludCwKICAgICAgICAgIGxvdzogZC5sb3csIGhpZ2g6IGQuaGlnaCwgcmVmOiB0aGlzLmNhcmRSZWZzW2QuaWRdLAogICAgICAgICAgYW5zd2VyZWQ6IHYgIT0gbnVsbCAmJiAoYWxsIHx8IHRoaXMuc3RhdGUuc2hvd1RpcHMpLCBiYWRnZTogdiA9PSBudWxsID8gIuKAlCIgOiB2ICsgIi81IiwKICAgICAgICAgIGFjY2VudDogdiA9PSBudWxsID8gIiM5QUEyOUEiIDogc29saWQodiksCiAgICAgICAgICBzdGF0ZTogdiA9PSBudWxsID8gIiIgOiBTVEFURVNbdl0sIHRpcDogdiA9PSBudWxsID8gIiIgOiB0aXBGb3IoZCwgdiksCiAgICAgICAgICBib3JkZXI6IGlzSG92ZXIgPyAiI0I0MDA2QSIgOiAiIzE0MjYxQyIsCiAgICAgICAgICBzaGFkb3c6IGlzSG92ZXIgPyAiMCAwIDAgNHB4IHJnYmEoMTgwLDAsMTA2LC4xNikiIDogIm5vbmUiLAogICAgICAgICAgb25FbnRlcjogKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGhvdmVyOiBkLmtleSB9KSwKICAgICAgICAgIG9uTGVhdmU6ICgpID0+IHRoaXMuc2V0U3RhdGUoeyBob3ZlcjogbnVsbCB9KSwKICAgICAgICAgIG9wdHM6IFsxLDIsMyw0LDVdLm1hcChubiA9PiAoewogICAgICAgICAgICBuOiBubiwgYWN0aXZlOiB2ID09PSBubiwgYXJpYTogZC5uYW1lICsgIjogIiArIG5uICsgIiBvdXQgb2YgNSIsCiAgICAgICAgICAgIGJnOiB2ID09PSBubiA/IHNvbGlkKG5uKSA6ICIjRkZGRkZGIiwgZmc6IHYgPT09IG5uID8gIiNGRkZGRkYiIDogIiMxNDI2MUMiLAogICAgICAgICAgICBvblBpY2s6ICgpID0+IHRoaXMuc2V0VmFsdWUoZC5pZCwgbm4pCiAgICAgICAgICB9KSkKICAgICAgICB9OwogICAgICB9KSwKCiAgICAgIGhhc1N0YXRzOiBuID49IDIsCiAgICAgIGhvdHRlc3Q6IHN0ID8gRE9NQUlOU1tzdC5oaV0ubmFtZSArICIgKCIgKyB2c1tzdC5oaV0gKyAiKSIgOiAi4oCUIiwKICAgICAgY29sZGVzdDogc3QgPyBET01BSU5TW3N0LmxvXS5uYW1lICsgIiAoIiArIHZzW3N0LmxvXSArICIpIiA6ICLigJQiLAogICAgICBnYXBMYWJlbDogc3QgPyBzdC5nYXAgKyAoc3QuZ2FwID09PSAxID8gIiBwb2ludCIgOiAiIHBvaW50cyIpIDogIuKAlCIsCiAgICAgIGdhcE5vdGU6IHN0ID8gKHN0LmdhcCA+PSAzID8gIllvdXIgaG91c2UgaXMgb3V0IG9mIGJhbGFuY2U6IHNvbWUgYXJlYXMgYXJlIHZlcnkgd2FybSB3aGlsZSBvdGhlcnMgYXJlIHZlcnkgY29sZC4iIDogIllvdXIgaG91c2UgaXMgZmFpcmx5IGJhbGFuY2VkIGFjcm9zcyBpdHMgZGlmZmVyZW50IGFyZWFzLiIpIDogIiIsCiAgICAgIGF0dGVudGlvbkxhYmVsOiBzdCA/IHN0Lmxvdy5sZW5ndGggKyAoc3QubG93Lmxlbmd0aCA9PT0gMSA/ICIgYXJlYSIgOiAiIGFyZWFzIikgOiAi4oCUIiwKICAgICAgYXR0ZW50aW9uTm90ZTogc3QgPyAoc3QubG93Lmxlbmd0aCA/IHN0Lmxvdy5tYXAoaSA9PiBET01BSU5TW2ldLm5hbWUpLmpvaW4oIiwgIikgOiAiTm8gYXJlYSByZWNlaXZlZCBhIDEgb3IgMi4iKSA6ICIiLAoKICAgICAgYWxsQW5zd2VyZWQ6IGFsbCwKICAgICAgY29tbWl0UHJvbXB0OiBzdCA/ICJPbmUgYWN0aW9uIGluIG9uZSBhcmVhLiBTdWdnZXN0ZWQgZm9jdXM6ICIgKyBET01BSU5TW3N0LmxvXS5uYW1lICsgIiwgeW91ciBsb3dlc3Qtc2NvcmluZyBhcmVhLiIgOiAiIiwKICAgICAgY29tbWl0QXJlYTogdGhpcy5zdGF0ZS5jb21taXQuYXJlYSA9PSBudWxsID8gKHN0ID8gU3RyaW5nKHN0LmxvKSA6ICIwIikgOiBTdHJpbmcodGhpcy5zdGF0ZS5jb21taXQuYXJlYSksCiAgICAgIGNvbW1pdFRleHQ6IHRoaXMuc3RhdGUuY29tbWl0LnRleHQgfHwgIiIsCiAgICAgIGNvbW1pdERhdGU6IHRoaXMuc3RhdGUuY29tbWl0LmRhdGUgfHwgIiIsCiAgICAgIGFyZWFPcHRpb25zOiBET01BSU5TLm1hcChkID0+ICh7IHZhbHVlOiBTdHJpbmcoZC5pZCksIGxhYmVsOiBkLm5hbWUgfSkpLAogICAgICBjdHhDaXR5OiB0aGlzLnN0YXRlLmN0eC5jaXR5LCBjdHhKb2I6IHRoaXMuc3RhdGUuY3R4LmpvYiwKICAgICAgb25DdHhDaXR5OiBlID0+IHRoaXMuc2F2ZUN0eCh7IGNpdHk6IGUudGFyZ2V0LnZhbHVlIH0pLAogICAgICBvbkN0eEpvYjogZSA9PiB0aGlzLnNhdmVDdHgoeyBqb2I6IGUudGFyZ2V0LnZhbHVlIH0pLAogICAgICBhZ2VPcHRpb25zOiBBR0VfT1BUUy5tYXAobGFiZWwgPT4gKHsKICAgICAgICBsYWJlbDogbGFiZWwsIGFjdGl2ZTogdGhpcy5zdGF0ZS5jdHguYWdlID09PSBsYWJlbCwKICAgICAgICBiZzogdGhpcy5zdGF0ZS5jdHguYWdlID09PSBsYWJlbCA/ICIjQjQwMDZBIiA6ICIjRkZGRkZGIiwKICAgICAgICBmZzogdGhpcy5zdGF0ZS5jdHguYWdlID09PSBsYWJlbCA/ICIjRkZGRkZGIiA6ICIjMTQyNjFDIiwKICAgICAgICBvblBpY2s6ICgpID0+IHRoaXMuc2F2ZUN0eCh7IGFnZTogdGhpcy5zdGF0ZS5jdHguYWdlID09PSBsYWJlbCA/IG51bGwgOiBsYWJlbCB9KQogICAgICB9KSksCiAgICAgIG9uQ29tbWl0QXJlYTogZSA9PiB0aGlzLnNhdmVDb21taXQoeyBhcmVhOiBwYXJzZUludChlLnRhcmdldC52YWx1ZSwgMTApIH0pLAogICAgICBvbkNvbW1pdFRleHQ6IGUgPT4gdGhpcy5zYXZlQ29tbWl0KHsgdGV4dDogZS50YXJnZXQudmFsdWUgfSksCiAgICAgIG9uQ29tbWl0RGF0ZTogZSA9PiB0aGlzLnNhdmVDb21taXQoeyBkYXRlOiBlLnRhcmdldC52YWx1ZSB9KSwKICAgICAgY29tbWl0U3RhdHVzOiAodGhpcy5zdGF0ZS5jb21taXQudGV4dCB8fCAiIikudHJpbSgpID8gIlJlYWR5LiBZb3VyIGNvbW1pdG1lbnQgd2lsbCBhcHBlYXIgaW4gdGhlIGltYWdlIHlvdSBkb3dubG9hZC4iIDogIldoYXQgeW91IHdyaXRlIGhlcmUgd2lsbCBhcHBlYXIgaW4geW91ciBkb3dubG9hZGFibGUgaW1hZ2UuIiwKCiAgICAgIHNob3dSZWZsZWN0aW9uOiB0aGlzLnByb3BzLnNob3dSZWZsZWN0aW9uICE9PSBmYWxzZSwKCiAgICAgIGV4cG9ydERpc2FibGVkOiAhYWxsIHx8IHRoaXMuc3RhdGUuYnVzeSwKICAgICAgZXhwb3J0TGFiZWw6IHRoaXMuc3RhdGUuYnVzeSA/ICJHZW5lcmF0aW5n4oCmIiA6IChhbGwgPyAiRG93bmxvYWQgbXkgaW1hZ2UgYW5kIHN1Z2dlc3Rpb25zIiA6ICJBbnN3ZXIgYWxsIDEwIHF1ZXN0aW9ucyB0byBkb3dubG9hZCIpLAogICAgICBleHBvcnRCZzogYWxsICYmICF0aGlzLnN0YXRlLmJ1c3kgPyAibGluZWFyLWdyYWRpZW50KDkwZGVnLCAjMDBBMERDLCAjREMwMDc4KSIgOiAiI0I5QkVCOCIsCiAgICAgIGV4cG9ydEN1cnNvcjogYWxsICYmICF0aGlzLnN0YXRlLmJ1c3kgPyAicG9pbnRlciIgOiAibm90LWFsbG93ZWQiLAogICAgICByZXNldExhYmVsOiB0aGlzLnN0YXRlLmNvbmZpcm1SZXNldCA/ICJBcmUgeW91IHN1cmU/IFllcywgY2xlYXIgZXZlcnl0aGluZyIgOiAiU3RhcnQgb3ZlciIsCiAgICAgIHJlc2V0Qmc6IHRoaXMuc3RhdGUuY29uZmlybVJlc2V0ID8gIiNGQ0U5RjMiIDogIiNGRkZGRkYiLAoKICAgICAgcHJldmlld0Rpc3BsYXk6IHRoaXMuc3RhdGUuc2hvd1ByZXZpZXcgPyAiYmxvY2siIDogIm5vbmUiLAogICAgICBjYW52YXNSZWY6IHRoaXMuY2FudmFzUmVmLCBsaW5rUmVmOiB0aGlzLmxpbmtSZWYsIHN2Z1JlZjogdGhpcy5zdmdSZWYsCiAgICAgIG9uRXhwb3J0OiAoKSA9PiB0aGlzLmV4cG9ydEltYWdlKCksIG9uUmVzZXQ6ICgpID0+IHRoaXMucmVzZXQoKQogICAgfTsKICB9Cn0KPC9zY3JpcHQ+CgoKPHNjcmlwdD4KKGZ1bmN0aW9uKCl7CiAgdmFyIGxhc3RIZWlnaHQ9MDsKICB2YXIgc2NoZWR1bGVkPWZhbHNlOwogIGZ1bmN0aW9uIG1lYXN1cmUoKXsKICAgIHNjaGVkdWxlZD1mYWxzZTsKICAgIHZhciBhcHA9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keSA+IHgtZGMgPiBkaXYnKXx8ZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keSA+IHgtZGMnKXx8ZG9jdW1lbnQuYm9keTsKICAgIGlmKCFhcHApcmV0dXJuOwogICAgdmFyIGhlaWdodD1NYXRoLmNlaWwoTWF0aC5tYXgoYXBwLnNjcm9sbEhlaWdodHx8MCxhcHAub2Zmc2V0SGVpZ2h0fHwwKSk7CiAgICBpZihoZWlnaHQ+MzAwJiZNYXRoLmFicyhoZWlnaHQtbGFzdEhlaWdodCk+Mil7CiAgICAgIGxhc3RIZWlnaHQ9aGVpZ2h0OwogICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKHt0eXBlOidjYXNhLWJhbGFuY2UtaGVpZ2h0JyxoZWlnaHQ6aGVpZ2h0fSwnKicpOwogICAgfQogIH0KICBmdW5jdGlvbiBzY2hlZHVsZSgpewogICAgaWYoc2NoZWR1bGVkKXJldHVybjsKICAgIHNjaGVkdWxlZD10cnVlOwogICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG1lYXN1cmUpOwogIH0KICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsc2NoZWR1bGUpOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLHNjaGVkdWxlKTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KHNjaGVkdWxlLDApO3NldFRpbWVvdXQoc2NoZWR1bGUsMzUwKTt9KTsKICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsc2NoZWR1bGUpOwogIGlmKGRvY3VtZW50LmZvbnRzJiZkb2N1bWVudC5mb250cy5yZWFkeSlkb2N1bWVudC5mb250cy5yZWFkeS50aGVuKHNjaGVkdWxlKTsKICBpZih3aW5kb3cuUmVzaXplT2JzZXJ2ZXIpewogICAgdmFyIHJvPW5ldyBSZXNpemVPYnNlcnZlcihzY2hlZHVsZSk7CiAgICB2YXIgdGFyZ2V0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHkgPiB4LWRjJyl8fGRvY3VtZW50LmJvZHk7CiAgICBpZih0YXJnZXQpcm8ub2JzZXJ2ZSh0YXJnZXQpOwogIH0KICBpZih3aW5kb3cuTXV0YXRpb25PYnNlcnZlcil7CiAgICB2YXIgbW89bmV3IE11dGF0aW9uT2JzZXJ2ZXIoc2NoZWR1bGUpOwogICAgbW8ub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHtzdWJ0cmVlOnRydWUsY2hpbGRMaXN0OnRydWUsYXR0cmlidXRlczp0cnVlLGF0dHJpYnV0ZUZpbHRlcjpbJ3N0eWxlJywnY2xhc3MnLCdoaWRkZW4nXX0pOwogIH0KICBzY2hlZHVsZSgpOwogIHNldFRpbWVvdXQoc2NoZWR1bGUsMjUwKTsKICBzZXRUaW1lb3V0KHNjaGVkdWxlLDEyMDApOwp9KSgpOwo8L3NjcmlwdD4KPC9ib2R5PjwvaHRtbD4K LinkedIn Twitter/X Facebook WhatsApp Reddit Email