#publishevent
just publish json events with one click
this tool handles signing for you
data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sPgo8aGVhZD4KICAgIDx0aXRsZT5maWxlcHVibGlzaDwvdGl0bGU+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCIvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgdXNlci1zY2FsYWJsZT1ubyIvPgogICAgPHN0eWxlPgogICAgICBmb3JtIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxZW07CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDFlbSk7CiAgICAgICAgbWF4LXdpZHRoOiAzMGVtOwogICAgICB9CiAgICAgIAogICAgICBmb3JtID4gKiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAuNWVtIDA7CiAgICAgIH0KICAgICAgCiAgICAgIC5yaWdodCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIAogICAgICB0ZXh0YXJlYSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHN0cm9uZz5ub3N0ciBmaWxlIHVwbG9hZGVyPC9zdHJvbmc+CgogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBpZD0ibm90ZS1mb3JtIiBhY3Rpb249IiMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idGFncyIgcGxhY2Vob2xkZXI9Imxpc3Qgb2YgdGFncyIvPgogICAgICAgIDx0ZXh0YXJlYSBpZD0iY29tbWVudCIgcGxhY2Vob2xkZXI9ImNvbW1lbnQiPjwvdGV4dGFyZWE+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBjbGFzcz0iZmlsZSIgbmFtZT0iZmlsZSIgbXVsdGlwbGU9IiIvPgogICAgICAgICAgPGRpdiBjbGFzcz0icmlnaHQiPgogICAgICAgICAgICB0eXBlIAogICAgICAgICAgICA8c2VsZWN0IGlkPSJ0eXBlIj4KICAgICAgICAgICAgICA8b3B0aW9uPmZpbGUgdXBsb2FkPC9vcHRpb24+CiAgICAgICAgICAgICAgPG9wdGlvbj50ZXh0PC9vcHRpb24+CiAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIvPgogICAgPC9mb3JtPgoKICAgIDxkaXY+aW5pdGlhbGl6aW5nPC9kaXY+CiAgICA8ZGl2PnNjcm9sbCA8YSBkYXRhLWFjdGlvbj0ibWFudXNjcm9sbCIgaHJlZj0iIyI+bWFudWFsPC9hPiwgPGEgZGF0YS1hY3Rpb249ImF1dG9zY3JvbGwiIGhyZWY9IiMiPmF1dG88L2E+PC9kaXY+CgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL25vc3RyLXRvb2xzL2xpYi9ub3N0ci5idW5kbGUuanMiIGNyb3Nzb3JpZ2luPSJhbm9ueW1vdXMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL2NyeXB0by1qc0A0LjEuMS9jcnlwdG8tanMuanMiIGludGVncml0eT0ic2hhMjU2LThMM3lYOXFQbXZXU0RJSUhCM1dHVEg0Ulp1c3hWQTBERG11QW80TGpuT0U9IiBjcm9zc29yaWdpbj0iYW5vbnltb3VzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQ+IAogICAgICB3aW5kb3cubG9hZGVkID0gdHJ1ZQogICAgICBsZXQgZmlsZXMgPSBbXQogICAgICBsZXQgc29ja2V0ID0gbnVsbAogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBjb25zdCBzcGxpdHBhcnRzaXplID0gMjAwCiAgICAgIGxldCBxID0gbG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSkudHJpbSgpCiAgICAgIGxldCBvcHRpb25zID0gcS5tYXRjaCgvXC9bXlwvXSsvZykgfHwgW10KICAgICAgY29uc3QgcHJpdmsgPSBOb3N0clRvb2xzLmdlbmVyYXRlU2VjcmV0S2V5KCkKICAgICAgY29uc3QgcXN0ciA9IGxvY2F0aW9uLnNlYXJjaC5tYXRjaCgvZmlsZWxvYWRlcj0oW2EtejAtOV0rKS9pKQogICAgICAKICAgICAgY29uc3QgZmlsZWxvYWRlcnVybCA9IHFzdHIgJiYgcXN0clsxXSArICI/ZmlsZXB1Ymxpc2g9IiArIGxvY2F0aW9uLnBhdGhuYW1lLm1hdGNoKC9bYS16MC05XSskL2kpIHx8ICJmaWxlbG9hZGVyLmh0bWwiCiAgICAgIGNvbnN0IGFsbHJlbGF5cyA9IFsKICAgICAgCS8vIndzczovL24ueG1yLnNlIiwKICAgICAgICAid3NzOi8vbm9zLmxvbCIsIAogICAgICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKICAgICAgICAid3NzOi8vZWRlbi5ub3N0ci5sYW5kLyIsCgkJICAgICJ3c3M6Ly9yZWxheWFibGUub3JnIiwKCSAgICAgICJ3c3M6Ly9ub3N0ci5tb20iLAoJCSAgICAid3NzOi8vcmVsYXkubm9zdHIuYmFuZCIsCgkgICAgICAid3NzOi8vbm9zdHIuc2VsZi1kZXRlcm1pbmVkLmRlIiwKCQkgICAgIndzczovL3B1cmF2aWRhLm5vc3RyLmxhbmQiCiAgICAgIF0KICAgICAgCiAgICAgIGluZm8oJ2Jyb3dzZSBmaWxlcyB3aXRoIDxhIGhyZWY9IicgKyBmaWxlbG9hZGVydXJsICsgJyI+ZmlsZWxvYWRlci5odG1sPC9hPicsIHRydWUpCgogICAgICBmb3IobGV0IHJlbGF5IG9mIGFsbHJlbGF5cyl7CiAgICAgICAgaW5mbygnY2xpY2sgdG8gY29ubmVjdCB0byA8YSBkYXRhLWFjdGlvbj0icmVsYXkiIGRhdGEtdmFsdWU9IicgKyByZWxheSArICciIGhyZWY9IiMiPicgKyByZWxheSArICc8L2E+JywgdHJ1ZSkKICAgICAgfQoKICAgICAgbGV0IHJlbGF5ID0gZ2V0b3B0aW9uKCJyZWxheSIpWzFdICYmIGRlY29kZVVSSUNvbXBvbmVudChnZXRvcHRpb24oInJlbGF5IilbMV0pIHx8IGFsbHJlbGF5c1swXQoKICAgICAgZnVuY3Rpb24gZGVsZXRlX2VtcHR5KGFycil7CiAgICAgICAgZm9yKGxldCBrZXkgaW4gYXJyKXsKICAgICAgICAgIGlmKGFycltrZXldID09IG51bGwgfHwgYXJyW2tleV0ubGVuZ3RoID09IDApewogICAgICAgICAgICBkZWxldGUgYXJyW2tleV0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2hmaWxlKGZpbGVuYW1lLCBjb21tZW50LCBmaWxlaWRzLCBwYXJ0aW5kZXgsIHBhcnRjb3VudCl7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgcHVibGlzaGV2ZW50cygzMzUsIFtKU09OLnN0cmluZ2lmeSh7CiAgICAgICAgICBuYW1lOiBmaWxlbmFtZSwgCiAgICAgICAgICBjb21tZW50OiBjb21tZW50LCAKICAgICAgICAgIGZpbGVpZHM6IGZpbGVpZHMsIAogICAgICAgICAgcGFydDogcGFydGluZGV4LAogICAgICAgICAgcGFydGNvdW50OiBwYXJ0Y291bnQKICAgICAgICB9KV0sICgpID0+IHt9KQogICAgICAgIAogICAgICAgIHJldHVybiByZXNbMF0uaWQKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVhZGZpbGUoZmlsZSl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpCiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKQogICAgICAgICAgCiAgICAgICAgICByZWFkZXIub25sb2FkID0gYXN5bmMgZnVuY3Rpb24ocmVhZGVyRXZlbnQpewogICAgICAgICAgICByZXNvbHZlKHJlYWRlckV2ZW50LnRhcmdldC5yZXN1bHQpCiAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYmFzZTY0ZW5jb2RlKGNvbnRlbnQpewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHsKICAgICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKGNvbnRlbnQpCiAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2J5dGVzXSwgeyB0eXBlOiBmaWxlc1swXS50eXBlIH0pCiAgICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpCgogICAgICAgICAgcmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUocmVhZGVyLnJlc3VsdCkKCiAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKQogICAgICAgIH0pCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwbG9hZGZpbGUoZGF0YSwgZmlsZW5hbWUsIGZpbGV0eXBlLCBjb21tZW50LCBwcm9ncmVzc2NiKXsKICAgICAgICBsZXQgY29udGVudCA9IGRhdGEubWF0Y2goL2RhdGE6W2EtejAtOV17MSwyMH1cL1thLXowLTlcLVwuXXsxLDIwfTtiYXNlNjQsKFxTKykvKVsxXQogICAgICAgIAogICAgICAgIGlmKGZpbGV0eXBlID09ICJ2aWRlby93ZWJtIiAmJiAhY29uZmlybSgiaXMgdGhpcyBhIHZpZGVvIGZpbGU/IikpewogICAgICAgICAgZmlsZXR5cGUgPSAiYXVkaW8vd2VibSIKICAgICAgICAgIGluZm8oImNvbnRlbnQgdHlwZSBzZXQgdG8gIiArIGZpbGV0eXBlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgY29udGVudHJlcyA9IHByZXBhcmVmaWxlKGNvbnRlbnQsIGZpbGV0eXBlKQoKICAgICAgICB0cnl7CiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgcHVibGlzaGV2ZW50cyhjb250ZW50cmVzLmtpbmQsIGNvbnRlbnRyZXMuY29udGVudHMsIHByb2dyZXNzY2IpCgogICAgICAgICAgaWYocmVzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CgogICAgICAgICAgbGV0IGZpbGVpZHMgPSBBcnJheS5mcm9tKG5ldyBTZXQocmVzLm1hcChlID0+IGUuaWQpKSkKICAgICAgICAgIGxldCBmaWxlX2V2ZW50X2lkcyA9IFtdCiAgICAgICAgICBsZXQgaSA9IDAKICAgICAgICAgIGNvbnN0IHBhcnRjb3VudCA9IE1hdGguY2VpbChmaWxlaWRzLmxlbmd0aCAvIHNwbGl0cGFydHNpemUpCgogICAgICAgICAgZm9yKDsgaSA8IHBhcnRjb3VudDsgaSsrKXsKICAgICAgICAgICAgc3RhcnQgPSBpICogc3BsaXRwYXJ0c2l6ZQogICAgICAgICAgICBmaWxlX2V2ZW50X2lkcy5wdXNoKGF3YWl0IHB1Ymxpc2hmaWxlKGZpbGVuYW1lLCBjb21tZW50LCBmaWxlaWRzLnNsaWNlKHN0YXJ0LCBzdGFydCtzcGxpdHBhcnRzaXplKSwgaSwgcGFydGNvdW50KSkgICAgIAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBsZXQgZmlsZXJlcyA9IGF3YWl0IHB1Ymxpc2hldmVudHMoMzM2LCBbSlNPTi5zdHJpbmdpZnkoewogICAgICAgICAgICBuYW1lOiBmaWxlbmFtZSwgCiAgICAgICAgICAgIGNvbW1lbnQ6IGNvbW1lbnQsIAogICAgICAgICAgICBpZHM6IGZpbGVfZXZlbnRfaWRzCiAgICAgICAgICB9KV0sIHByb2dyZXNzY2IpCiAgICAgICAgICAKICAgICAgICAgIHJldHVybiBmaWxlcmVzWzBdLmlkCiAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgaW5mbyhlKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVia2V5KCl7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3N0ciAmJiBhd2FpdCB3aW5kb3cubm9zdHIuZ2V0UHVibGljS2V5KCkgfHwgTm9zdHJUb29scy5nZXRQdWJsaWNLZXkocHJpdmspCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHNpZ24oZXZlbnQpewogICAgICAgIGlmKHdpbmRvdy5ub3N0cil7CiAgICAgICAgICByZXR1cm4gYXdhaXQgbm9zdHIuc2lnbkV2ZW50KGV2ZW50KQogICAgICAgIH0KCiAgICAgICAgZXZlbnQgPSBOb3N0clRvb2xzLmZpbmFsaXplRXZlbnQoZXZlbnQsIHByaXZrKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CgogICAgICBhc3luYyBmdW5jdGlvbiBwcmVwYXJlX2V2ZW50KGV2ZW50KXsKICAgICAgICBldmVudC5wdWJrZXkgPSBhd2FpdCBwdWJrZXkoKQogICAgICAgIGV2ZW50LmNyZWF0ZWRfYXQgPSBwYXJzZUludChEYXRlLm5vdygpIC8gMTAwMCwgMTApCiAgICAgICAgZXZlbnQuaWQgPSBOb3N0clRvb2xzLmdldEV2ZW50SGFzaChldmVudCkKICAgICAgICByZXR1cm4gZXZlbnQKICAgICAgfQogICAgICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHB1Ymxpc2goZXZlbnQpewogICAgICAgIGV2ZW50ID0gYXdhaXQgcHJlcGFyZV9ldmVudChldmVudCkKICAgICAgICBsZXQgc2lnbmVkZXZlbnQgPSBhd2FpdCBzaWduKGV2ZW50KQogICAgICAgIGxldCBqc29uID0gSlNPTi5zdHJpbmdpZnkoWyJFVkVOVCIsIHNpZ25lZGV2ZW50XSkKICAgICAgICBzb2NrZXQuc2VuZChqc29uKQogICAgICAgIAogICAgICAgIHJldHVybiBldmVudAogICAgICB9CgogICAgICBmdW5jdGlvbiB0YWdzKCl7CiAgICAgICAgbGV0IHRhZ3Nfc3RyID0gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiN0YWdzIikudmFsdWUucmVwbGFjZUFsbCgiIyIsICIiKS5yZXBsYWNlKC8gKy9nLCAiICIpKQogICAgICAgIHJldHVybiB0YWdzX3N0ci5sZW5ndGggPT0gMCAmJiBbXSB8fCB0YWdzX3N0ci5zcGxpdCgiICIpLm1hcCh0YWcgPT4gWyJ0IiwgdGFnXSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gcHVibGlzaGV2ZW50cyhraW5kLCBjb250ZW50cywgcHJvZ3Jlc3NjYil7CiAgICAgICAgY29uc3QgZXZlbnRzID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgY29udGVudHMubGVuZ3RoOyBpKyspewogICAgICAgICAgbGV0IGNvbnRlbnQgPSBjb250ZW50c1tpXQogICAgICAgICAgbGV0IHJlbGF5cmVzID0gbnVsbAogICAgICAgICAgbGV0IHJlcyA9IG51bGwKICAgICAgICAgIGxldCBlcnJvciA9IG51bGwKICAgICAgICAgIAogICAgICAgICAgdHJ5ewogICAgICAgICAgICByZXMgPSBhd2FpdCBwdWJsaXNoKHsKICAgICAgICAgICAgICAia2luZCI6IGtpbmQsCiAgICAgICAgICAgICAgImNvbnRlbnQiOiBjb250ZW50LAogICAgICAgICAgICAgICJ0YWdzIjogdGFncygpCiAgICAgICAgICAgIH0pCiAgICAgICAgICAKICAgICAgICAgICAgcmVsYXlyZXMgPSBhd2FpdCB3YWl0cmVzKG51bGwsICJPSyIpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihyZWxheXJlc1sxXVsyXSA9PSBmYWxzZSl7CiAgICAgICAgICAgICAgZXJyb3IgPSAiZXJyb3IgIiArIHJlbGF5cmVzWzFdWzNdCiAgICAgICAgICAgIH0KICAgICAgICAgIH1jYXRjaChlKXsKICAgICAgICAgICAgZXJyb3IgPSAiZXJyb3IgIiArIGUKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaWYoZXJyb3IpewogICAgICAgICAgICBpbmZvKGVycm9yKQogICAgICAgICAgICBjb25zdCBuZXh0cmVsYXkgPSBhbGxyZWxheXMuZmluZChyID0+IHIgIT0gcmVsYXkpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihjb25maXJtKGVycm9yICsgIi4gcmVzdW1lIHdpdGggIiArIG5leHRyZWxheSArICAiPyIpKXsKICAgICAgICAgICAgICBpLS0KICAgICAgICAgICAgICByZWxheSA9IG5leHRyZWxheQogICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RyZWxheXMoKQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb250aW51ZSB1cGxvYWQiKQogICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHJldHVybiBldmVudHMKICAgICAgICAgIH0KCiAgICAgICAgICBwcm9ncmVzc2NiKHBhcnNlSW50KGkgLyBjb250ZW50cy5sZW5ndGggKiAxMDAsIDEwKSkKICAgICAgICAgIGV2ZW50cy5wdXNoKHJlcykKICAgICAgICB9CiAKICAgICAgICByZXR1cm4gZXZlbnRzCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZXZhbHVlb3B0aW9uKGtleSwgdmFsdWUpewogICAgICAgIGZpbHRlcnN0ciA9IHZhbHVlIHx8IHByb21wdChrZXksIGdldG9wdGlvbihrZXkpWzFdIHx8ICIiKSB8fCAiIgogICAgICAgIHVwZGF0ZWhhc2goZmlsdGVyc3RyLmxlbmd0aCA+IDAgJiYgIi8iICsga2V5ICsgIjoiICsgZmlsdGVyc3RyIHx8IG51bGwsIFsiLyIgKyBrZXkgKyAiOiIgKyAoZ2V0b3B0aW9uKGtleSlbMV0gfHwgIiIpXSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZ2V0b3B0aW9uKGtleSl7CiAgICAgICAgbGV0IGZpbHRlcm9wdCA9IG9wdGlvbnMuZmluZChvID0+IG8uaW5kZXhPZigiLyIgKyBrZXkgKyAiOiIpID09IDApCiAgICAgICAgbGV0IG1hdGNoZXIgPSBuZXcgUmVnRXhwKCdeXC8nICsga2V5ICsgJ1xcOihcXFMrKSQnKQogICAgICAgIGxldCBtYXRjaCA9IGZpbHRlcm9wdCAmJiBmaWx0ZXJvcHQubWF0Y2gobWF0Y2hlcikgfHwgbnVsbAogICAgICAgIHJldHVybiBtYXRjaCB8fCBbXQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBwcmVwYXJlZmlsZShjb250ZW50LCBmaWxldHlwZSl7CiAgICAgICAgY29uc3QgdXBsb2FkcGFydHNpemUgPSA1NTAwMAogCiAgICAgICAgbGV0IGNvbnRlbnRzID0gW10KICAgICAgICBsZXQgcGFydGNvdW50ID0gTWF0aC5jZWlsKGNvbnRlbnQubGVuZ3RoIC8gdXBsb2FkcGFydHNpemUpCiAgICAgICAgY29uc3QgaGFzaCA9IENyeXB0b0pTLlNIQTEoY29udGVudCkudG9TdHJpbmcoKQogICAgICAgIAogICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCBwYXJ0Y291bnQ7IGkrKyl7CiAgICAgICAgICBsZXQgcGFydCA9IGNvbnRlbnQuc3Vic3RyKGkgKiB1cGxvYWRwYXJ0c2l6ZSwgdXBsb2FkcGFydHNpemUpCiAgICAgICAgICAKICAgICAgICAgIGlmKHBhcnQubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGNvbnRlbnRzLnB1c2goKHBhcnRjb3VudCA+IDEgJiYgInBhcnQiICsgKGkgKyAxKSArICI7IiArIHBhcnRjb3VudCArICI7IiArIGhhc2ggKyAiOyIgfHwgIiIpICsgKGkgPT0gMCAmJiBmaWxldHlwZSArICI7YmFzZTY0LCIgfHwgIiIpICsgcGFydCkKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICBraW5kOiAzMzQsIAogICAgICAgICAgY29udGVudHM6IGNvbnRlbnRzCiAgICAgICAgfQogICAgICB9CgogICAgICBpbmZvKCJyZWFkeSIpCgogICAgICBhZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCBhc3luYyAoZSkgPT4gewogICAgICAgIGlmKGUudGFyZ2V0LnR5cGUgPT0gImZpbGUiKXsKICAgICAgICAgIGZpbGVzID0gZS50YXJnZXQuZmlsZXMKICAgICAgICB9CiAgICAgIH0pCgogICAgICBhZGRFdmVudExpc3RlbmVyKCJzdWJtaXQiLCBhc3luYyBlID0+IHsKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICBsZXQgZGF0YSA9IG51bGwKICAgICAgICBsZXQgY29tbWVudCA9ICIiCiAgICAgICAgCiAgICAgICAgaWYoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3R5cGUiKS52YWx1ZSA9PSAidGV4dCIpewogICAgICAgICAgbGV0IGNvbnRlbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjY29tbWVudCIpLnZhbHVlCiAgICAgICAgICAKICAgICAgICAgIGZpbGVzID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgbmFtZTogInRleHQudHh0IiwgCiAgICAgICAgICAgICAgdHlwZTogInRleHQvcGxhaW4iLCAKICAgICAgICAgICAgICBzaXplOiBjb250ZW50Lmxlbmd0aAogICAgICAgICAgICB9CiAgICAgICAgICBdCiAgICAgICAgICAKICAgICAgICAgIGRhdGEgPSBhd2FpdCBiYXNlNjRlbmNvZGUoY29udGVudCwgZmlsZXNbMF0udHlwZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoZmlsZXMubGVuZ3RoID09IDApewogICAgICAgICAgaW5mbygibm8gZmlsZSBzZWxlY3RlZCIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CgogICAgICAgIGxldCB0b3RhbHNpemUgPSAwCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBmaWxlIG9mIGZpbGVzKXsKICAgICAgICAgIHRvdGFsc2l6ZSArPSBmaWxlLnNpemUKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaW5mbygidXBsb2FkaW5nIiwgZmlsZXMubGVuZ3RoKQoKICAgICAgICBsZXQgZmlsZWlkcyA9IFtdCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKXsKICAgICAgICAgIGxldCBmaWxlID0gZmlsZXNbaV0KICAgICAgICAgIAogICAgICAgICAgaWYoIWRhdGEpewogICAgICAgICAgICBkYXRhID0gYXdhaXQgcmVhZGZpbGUoZmlsZSkKICAgICAgICAgICAgY29tbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIiNjb21tZW50IikudmFsdWUudHJpbSgpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIGNvbnN0IGZpbGVpZCA9IGF3YWl0IHVwbG9hZGZpbGUoZGF0YSwgZmlsZS5uYW1lLCBmaWxlLnR5cGUgfHwgInRleHQvcGxhaW4iLCBjb21tZW50LCAocHJvZ3Jlc3MpID0+IHsKICAgICAgICAgICAgaW5mbygidXBsb2FkaW5nICIgKyBmaWxlcy5sZW5ndGggKyAKICAgICAgICAgICAgICAiIGZpbGVzICgiICsgKGkgKyAxKSArICIgLyAiICsgZmlsZXMubGVuZ3RoICsgIiB8ICIgKyBwcm9ncmVzcyArICIgJSkiKQogICAgICAgICAgfSkKCiAgICAgICAgICBpZihmaWxlaWQgPT0gbnVsbCl7CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICB9CgogICAgICAgICAgZmlsZWlkcy5wdXNoKGZpbGVpZCkKICAgICAgICB9CgogICAgICAgIGluZm8oJ0ZpbGUocykgdXBsb2FkZWQ6ICcgKyBmaWxlaWRzLmxlbmd0aCkKCiAgICAgICAgZm9yKGxldCBmaWxlaWQgb2YgZmlsZWlkcyl7CiAgICAgICAgICBjb25zdCB1cmwgPSBmaWxlbG9hZGVydXJsICsgIiMiICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVpZCkgKyAiL2lubGluZS9xdWlldCIKICAgICAgICAgIGluZm8oJ2ZpbGV1cmw6IDxhIGhyZWY9IicgKyB1cmwgKyAnIj4nICsgdXJsICsgJzwvYT4nLCB0cnVlKQoKICAgICAgICAgIGlmKG9wdGlvbnMuaW5jbHVkZXMoIi9yZXBseSIpKXsKICAgICAgICAgICAgY29uc3QgdGFndXJsID0gZmlsZWxvYWRlcnVybCArICIjL2lubGluZWFsbC9xdWlldC90YWc6IiArIHRhZ3MoKVswXVsxXQogICAgICAgICAgICBpbmZvKCd0YWd1cmw6IDxhIGhyZWY9IicgKyB0YWd1cmwgKyAnIj4nICsgdGFndXJsICsgJzwvYT4nLCB0cnVlKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihmaWxlaWRzLmxlbmd0aCA+IDApewogICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiZm9ybSIpLnJlc2V0KCkKICAgICAgICB9CiAgICAgIH0pCgogICAgICBmdW5jdGlvbiBpbmZvKHRleHQsIGh0bWwsIGltcG9ydGFudCwgY2xhc3NOYW1lLCBmaWxlLCBmaWxlaWQpewogICAgICAgIGxldCBzY3JvbGxtYXggPSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9PSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcE1heAogICAgICAgIGxldCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkKICAgICAgICBkaXZbaHRtbCAmJiAiaW5uZXJIVE1MIiB8fCAiaW5uZXJUZXh0Il0gPSB0ZXh0CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZGl2KQogICAgICAgIGRpdi5kYXRhc2V0LmZpbGVpZCA9IGZpbGVpZAogICAgICAgIAogICAgICAgIGlmKGZpbGUpewogICAgICAgICAgZGl2LmRhdGFzZXQuZmlsZW5hbWUgPSBmaWxlLm5hbWUKICAgICAgICAgIGRpdi5kYXRhc2V0LmZpbGVvYmogPSBKU09OLnN0cmluZ2lmeShmaWxlKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihzb2NrZXQpewogICAgICAgICAgZGl2LmRhdGFzZXQuc29ja2V0dXJsID0gc29ja2V0LnVybAogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihvcHRpb25zLmluY2x1ZGVzKCIvYXV0b3Njcm9sbCIpICYmIHNjcm9sbG1heCl7CiAgICAgICAgICBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wTWF4CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiB3YWl0cmVzKGtleSwgdHlwZSl7CiAgICAgICAgbGV0IHJlc2hhbmRsZXIgPSBmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpewogICAgICAgICAgdGhpcy50eXBlID0gdHlwZSB8fCAiRU9TRSIKICAgICAgICAgIHRoaXMuZXZlbnRzID0gW10KICAgICAgICAgIHRoaXMuaGFuZGxlID0gZnVuY3Rpb24ocmVzKXsKICAgICAgICAgICAgbGV0IG8gPSBKU09OLnBhcnNlKHJlcy5kYXRhKQogICAgICAgICAgICBpZihrZXkgPT0gbnVsbCB8fCBvWzFdID09IGtleSl7CiAgICAgICAgICAgICAgaWYob1swXSA9PSB0aGlzLnR5cGUpewogICAgICAgICAgICAgICAgcmVzb2x2ZShbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYob1swXSA9PSAiTk9USUNFIil7CiAgICAgICAgICAgICAgICByZWplY3Qob1sxXSkKICAgICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKG9bMl0pCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGxldCBoYW5kbGVyID0gbmV3IHJlc2hhbmRsZXIocmVzb2x2ZSwgcmVqZWN0KQogICAgICAgICAgcmVzaGFuZGxlcnMucHVzaChoYW5kbGVyKQogICAgICAgIH0pCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGNvbm5lY3QodXJsKXsKICAgICAgICBsZXQgc29ja2V0ID0gbmV3IFdlYlNvY2tldCh1cmwpCiAgICAgICAgc29ja2V0Lm9ubWVzc2FnZSA9IG1lc3NhZ2UgPT4gcmVzaGFuZGxlcnMuZm9yRWFjaChyaCA9PiByaC5oYW5kbGUobWVzc2FnZSkpCiAgICAgICAgcmV0dXJuIHNvY2tldAogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0cmVsYXlzKCl7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgIGlmKHNvY2tldCl7CiAgICAgICAgICAgIHNvY2tldC5jbG9zZSgpCiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHNvY2tldCA9IGNvbm5lY3QocmVsYXkpCiAgICAgICAgICAKICAgICAgICAgIHNvY2tldC5hZGRFdmVudExpc3RlbmVyKCJvcGVuIiwgZnVuY3Rpb24oKXsKICAgICAgICAgICAgaW5mbygiY29ubmVjdGVkIHRvICIgKyBzb2NrZXQudXJsKQogICAgICAgICAgICByZXNvbHZlKCkKICAgICAgICAgIH0pCiAgICAgICAgfSkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlaGFzaChhZGQsIHJlbW92ZSl7CiAgICAgICAgaWYocmVtb3ZlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocmVtb3ZlKSl7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVwZGF0ZWhhc2gsIHJlbW92ZSBzaG91bGQgYmUgYXJyYXkiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IobGV0IHIgb2YgKHJlbW92ZSB8fCBbXSkuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggPCBiLmxlbmd0aCkpewogICAgICAgICAgbG9jYXRpb24uaGFzaCA9IGxvY2F0aW9uLmhhc2gucmVwbGFjZShyLCAiIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYXRpb24uaGFzaCArPSBsb2NhdGlvbi5oYXNoLmluZGV4T2YoYWRkKSA9PSAtMSAmJiBhZGQgfHwgIiIKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2V0cmVsYXkocmVsYXkpewogICAgICAgIHVwZGF0ZWhhc2goIi9yZWxheToiICsgZW5jb2RlVVJJQ29tcG9uZW50KHJlbGF5KSwgW2dldG9wdGlvbigicmVsYXkiKVswXV0pCiAgICAgIH0KCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24oZSl7CiAgICAgICAgaWYoZS50YXJnZXQuZGF0YXNldC5hY3Rpb24pewogICAgICAgICAgY29uc3QgYyA9IHsKICAgICAgICAgICAgcmVsYXk6ICgpID0+IHNldHJlbGF5KGUudGFyZ2V0LmRhdGFzZXQudmFsdWUpLAogICAgICAgICAgICBtYW51c2Nyb2xsOiAoKSA9PiB1cGRhdGVoYXNoKG51bGwsIFsiL2F1dG9zY3JvbGwiXSksCiAgICAgICAgICAgIGF1dG9zY3JvbGw6ICgpID0+IHVwZGF0ZWhhc2goIi9hdXRvc2Nyb2xsIiwgbnVsbCksIAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAgIGNbZS50YXJnZXQuZGF0YXNldC5hY3Rpb25dKCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwgZnVuY3Rpb24oZSl7CiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCkKICAgICAgfSkKCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBhc3luYyAoKSA9PiB7CiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmZpbGUiKS52YWx1ZSA9IG51bGwKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdHlwZSIpLnZhbHVlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiI3R5cGUgb3B0aW9uIikudmFsdWUKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIjdGFncyIpLnZhbHVlID0gZ2V0b3B0aW9uKCJ0YWdzIilbMV0gfHwgIiIKICAgICAgICBjb25uZWN0cmVsYXlzKCkKICAgICAgfSkKICAgIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K