echo "PCFET0NUWVBFIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiLz4KICAgIDxtZXRhIG5hbWU9InZpZXdwb3J0IiBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsIHVzZXItc2NhbGFibGU9bm8iLz4KICAgIDxzdHlsZT4KICAgICAgYm9keSB7CiAgICAgICAgbWFyZ2luOiAxZW07CiAgICAgIH0KICAgICAgCiAgICAgIGEgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAxZW0gMDsKICAgICAgfQogICAgICAKICAgICAgLnJvdyBpbWcgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1hcmdpbjogMCAxZW0gMWVtIDA7ICAgICAgCiAgICAgIH0KCiAgICAgIC5lbGVtZW50IHsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgfQoKICAgICAgLmlubGluZS10ZXh0IHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjIwLDIzNSwyNTUpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IC41ZW07CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nOiAuNWVtOwogICAgICAgIGZvbnQtZmFtaWx5OiAiTGliZXJhdGlvbiBNb25vIiwgbW9ub3NwYWNlOwogICAgICB9CgogICAgICAuaW5saW5lYWxsIC5lbGVtZW50LmZpbGV0eXBlLWpwZywgCiAgICAgIC5pbmxpbmVhbGwgLmVsZW1lbnQuZmlsZXR5cGUtcG5nLCAKICAgICAgLmlubGluZWFsbCAuZWxlbWVudC5maWxldHlwZS1tcDQsIAogICAgICAuaW5saW5lYWxsIC5lbGVtZW50LndlYm0sIAogICAgICAuZ2FsbGVyeSAuZWxlbWVudC5maWxldHlwZS1qcGcsIAogICAgICAuZ2FsbGVyeSAuZWxlbWVudC5maWxldHlwZS1wbmcsIAogICAgICAuZ2FsbGVyeSAuZWxlbWVudC5maWxldHlwZS1tcDQsIAogICAgICAuZ2FsbGVyeSAuZWxlbWVudC53ZWJtIHsKICAgICAgICBtaW4taGVpZ2h0OiA0MHZoOwogICAgICB9CiAgICAgIAogICAgICAuZ2FsbGVyeSB0ZXh0YXJlYS5pdGVtIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICBpbWcsIAogICAgICB2aWRlbyB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwdmggLSAyZW0pOwogICAgICB9CiAgICAgIAogICAgICAuaW5saW5lYWxsIGltZzpub3QoLmFjdGl2ZSksIAogICAgICAuaW5saW5lYWxsIHZpZGVvOm5vdCguYWN0aXZlKSB7CiAgICAgICAgbWluLWhlaWdodDogNDB2aDsKICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDQwdmggLSAyZW0pOwogICAgICB9CgogICAgICB2aWRlbywKICAgICAgdGV4dGFyZWEgewogICAgICAgIG1pbi1oZWlnaHQ6IGNhbGMoNTB2aCAtIDJlbSk7CiAgICAgIH0KICAgICAgICAgICAgCiAgICAgIHRleHRhcmVhIHsKICAgICAgICB3aWR0aDogY2FsYyg5MCUgLSAxZW0pOwogICAgICAgIG1heC13aWR0aDogY2FsYyg5MCUgLSAxZW0pOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxwPgogICAgICA8c3Ryb25nPm5vc3RyIGZpbGUgdmlld2VyPC9zdHJvbmc+LiBhcnJvd3MgdG8gbmF2aWdhdGUgKGdhbGxlcnkgbW9kZSkuIDxhIGRhdGEtYWN0aW9uPSJnbG9iYWwiIGhyZWY9IiMiPmdsb2JhbCBmZWVkPC9hPiwgCiAgICAgIGZpbHRlciBieSA8YSBkYXRhLWFjdGlvbj0iZmlsdGVyIiBocmVmPSIjIj50ZXh0PC9hPiwgIAogICAgICA8YSBkYXRhLWFjdGlvbj0iZGF0ZSIgaHJlZj0iIyI+ZGF0ZTwvYT4uIGRpc3BsYXkgc3R5bGUgCiAgICAgIDxhIGRhdGEtYWN0aW9uPSJsaW5rcyIgaHJlZj0iIyI+bGlua3Mgb25seTwvYT4sIDxhIGRhdGEtYWN0aW9uPSJpbmxpbmUiIGhyZWY9IiMiPmlubGluZTwvYT4sIDxhIGRhdGEtYWN0aW9uPSJpbmxpbmVhbGwiIGhyZWY9IiMiPmJiczwvYT4sIAogICAgICA8YSBkYXRhLWFjdGlvbj0iZ2FsbGVyeSIgaHJlZj0iIyI+Z2FsbGVyeTwvYT4uIHN5c3RlbSBtZXNzYWdlcyAKICAgICAgPGEgZGF0YS1hY3Rpb249InF1aWV0IiBocmVmPSIjIj5xdWlldDwvYT4sIDxhIGRhdGEtYWN0aW9uPSJ2ZXJib3NlIiBocmVmPSIjIj52ZXJib3NlPC9hPi4gc29ydCBieSAKICAgICAgPGEgZGF0YS1hY3Rpb249InNvcnRkYXRlIiBocmVmPSIjIj5kYXRlPC9hPiwgPGEgZGF0YS1hY3Rpb249InNvcnRuYW1lIiBocmVmPSIjIj5uYW1lPC9hPi4gCiAgICAgIGlubGluZSBzaXplIGxpbWl0IDxhIGRhdGEtYWN0aW9uPSJpbmxpbmVsaW1pdCIgaHJlZj0iIyI+b248L2E+LCAKICAgICAgPGEgZGF0YS1hY3Rpb249Im5vaW5saW5lbGltaXQiIGhyZWY9IiMiPm9mZjwvYT4uIAogICAgICBzeW5jaHJvbm91cyBjb25uZWN0aW9uIDxhIGRhdGEtYWN0aW9uPSJzeW5jIiBocmVmPSIjIj5vbjwvYT4uIAogICAgICA8YSBkYXRhLWFjdGlvbj0ibm9zeW5jIiBocmVmPSIjIj5vZmY8L2E+LiAKICAgICAgZmluZCA8YSBkYXRhLWFjdGlvbj0icmF3IiBocmVmPSIjIj5yYXcgcGFydHMgYnkgcHVia2V5PC9hPiAoPGEgZGF0YS1hY3Rpb249Im5vcmF3IiBocmVmPSIjIj5yZXNldDwvYT4pCiAgICAgIDwhLS1zY3JvbGwgPGEgZGF0YS1hY3Rpb249Im1hbnVzY3JvbGwiIGhyZWY9IiMiPm1hbnVhbDwvYT4sIDxhIGRhdGEtYWN0aW9uPSJhdXRvc2Nyb2xsIiBocmVmPSIjIj5hdXRvPC9hPi4gLS0+CgogICAgICB1cGxvYWQgZmlsZSB3aXRoICAgCiAgICA8c2NyaXB0PiAKICAgICAgbGV0IHNvY2tldHMgPSBbXQogICAgICBsZXQgcmVzaGFuZGxlcnMgPSBbXQogICAgICBsZXQgZmlsZXMgPSB7fQogICAgICBsZXQgYmFzZTY0ZmlsZXMgPSB7fQogICAgICBsZXQgaWRjb3VudGVyID0gMAogICAgICBsZXQgZmlsZV9ldmVudGlkc3F1ZXVlID0ge30KICAgICAgbGV0IGxvYWRlZGV2ZW50aWRzID0gW10KICAgICAgbGV0IGJhc2U2NHVybG1hdGNoZXIgPSAvXigoW2EtejAtOV17MSwyMH1cL1thLXowLTlcLVwuXXsxLDIwfSk7YmFzZTY0LCkoXFMrKS9pCiAgICAgIGxldCBiYXNlNjRwYXJ0bWF0Y2hlciA9IC9ecGFydChcZHsxLDV9KTsoXGR7MSw1fSk7KFthLXowLTldezQwfSk7KChbYS16MC05XXsxLDIwfVwvW2EtejAtOVwtXC5dezEsMjB9O2Jhc2U2NCx8KShcU3szLDU1MDAwfSkpL2kKICAgICAgbGV0IHEgPSBsb2NhdGlvbi5oYXNoLnN1YnN0cmluZygxKS50cmltKCkKICAgICAgbGV0IGZpbGVpZCA9IHEuc3BsaXQoIi8iKVswXQogICAgICBsZXQgb3B0aW9ucyA9IHEubWF0Y2goL1wvW15cL10rL2cpIHx8IFtdCiAgICAgIGxldCBzY2FuID0gcS5tYXRjaCgvc2Nhbi8pCiAgICAgIGxldCBsb2FkZWRmaWxlaWRzID0gW10KICAgICAgbGV0IGxvYWRlZG1ldGFpZHMgPSBbXQogICAgICBsZXQgcGVuZGluZ3JlcXVlc3RzID0gMAogICAgICBsZXQgc2NhbnBhcmFtcyA9IHt9CiAgICAgIGNvbnN0IHFzdHIgPSBsb2NhdGlvbi5zZWFyY2gubWF0Y2goL2ZpbGVwdWJsaXNoPShbYS16MC05XSspL2kpCiAgICAgIGNvbnN0IHVwbG9hZGVydXJsID0gcXN0ciAmJiBxc3RyWzFdICsgIj9maWxlbG9hZGVyPSIgKyBsb2NhdGlvbi5wYXRobmFtZS5tYXRjaCgvW2EtejAtOV0rJC9pKSB8fCAiZmlsZXB1Ymxpc2guaHRtbCMvYXV0b3Njcm9sbCIKICAgICAgY29uc3QgdXBsb2FkZXJoYXNoID0gIiNlOTg4ODk0NDI2YzVjZDgyMzg4NjVmMzljNjc4MGQ2MDg0ZWM2YzJlMTE5YmNjZjg2OWU3NDU4MGU0NmU4MGRlIgogICAgICBjb25zdCByZWxheXMgPSBbCiAgICAgIAkid3NzOi8vbi54bXIuc2UiLAogICAgICAgICJ3c3M6Ly9ub3MubG9sIiwgCiAgICAgICAgIndzczovL3JlbGF5Lm5vc3RyLmJhbmQiLAogICAgICAgICJ3c3M6Ly9lZGVuLm5vc3RyLmxhbmQvIiwKCQkgICAgIndzczovL3JlbGF5YWJsZS5vcmciLAoJICAgICAgIndzczovL25vc3RyLm1vbSIsCgkJICAgICJ3c3M6Ly9yZWxheS5ub3N0ci5iYW5kIiwKCSAgICAgICJ3c3M6Ly9ub3N0ci5zZWxmLWRldGVybWluZWQuZGUiLAoJCSAgICAid3NzOi8vcHVyYXZpZGEubm9zdHIubGFuZCIKICAgICAgXQoKICAgICAgZG9jdW1lbnQud3JpdGUoJzxhIGhyZWY9IicgKyB1cGxvYWRlcnVybCArICciPmZpbGVwdWJsaXNoLmh0bWw8L2E+JykKCiAgICAgIGlmKGdldG9wdGlvbigidGFnIilbMV0pewogICAgICAgIGRvY3VtZW50LndyaXRlKCc8cD48YSBocmVmPSInICsgdXBsb2FkZXJ1cmwgKyAnIy90YWdzOicgKyBlc2NhcGVIdG1sKGdldG9wdGlvbigidGFnIilbMV0pICsgJy9yZXBseSI+cmVwbHk8L2E+IHRvIHRhZyAjJyArIGVzY2FwZUh0bWwoZ2V0b3B0aW9uKCJ0YWciKVsxXSkgKyAnPC9wPicpCiAgICAgIH0KCiAgICAgIGlmKHNjYW4pewogICAgICAgIHNjYW5wYXJhbXMuc3RhcnQgPSBwYXJzZUludChwcm9tcHQoInN0YXJ0IiksIDEwKQogICAgICAgIHNjYW5wYXJhbXMuc3ByZWFkID0gcGFyc2VJbnQocHJvbXB0KCJzcHJlYWQiKSwgMTApCiAgICAgICAgc2NhbnBhcmFtcy5tYXggPSBwYXJzZUludChwcm9tcHQoIm1heCIpLCAxMCkKICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlaGFzaChhZGQsIHJlbW92ZSl7CiAgICAgICAgaWYocmVtb3ZlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocmVtb3ZlKSl7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVwZGF0ZWhhc2gsIHJlbW92ZSBzaG91bGQgYmUgYXJyYXkiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IobGV0IHIgb2YgKHJlbW92ZSB8fCBbXSkuc29ydCgoYSwgYikgPT4gYS5sZW5ndGggPCBiLmxlbmd0aCkpewogICAgICAgICAgbG9jYXRpb24uaGFzaCA9IGxvY2F0aW9uLmhhc2gucmVwbGFjZShyLCAiIikKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgbG9jYXRpb24uaGFzaCArPSBsb2NhdGlvbi5oYXNoLmluZGV4T2YoYWRkKSA9PSAtMSAmJiBhZGQgfHwgIiIKICAgICAgfQogICAKICAgICAgZnVuY3Rpb24gdXBkYXRldmFsdWVvcHRpb24oa2V5LCB2YWx1ZSwgdmFsaWRhdG9yKXsKICAgICAgICBmaWx0ZXJzdHIgPSB2YWx1ZSB8fCBwcm9tcHQoa2V5LCBnZXRvcHRpb24oa2V5KVsxXSB8fCAiIikgfHwgIiIKICAgICAgICBpZihmaWx0ZXJzdHIgJiYgdHlwZW9mIHZhbGlkYXRvciA9PSAiZnVuY3Rpb24iICYmICF2YWxpZGF0b3IoZmlsdGVyc3RyKSl7CiAgICAgICAgICBhbGVydCgiaW52YWxpZCB2YWx1ZSIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgdXBkYXRlaGFzaChmaWx0ZXJzdHIubGVuZ3RoID4gMCAmJiAiLyIgKyBrZXkgKyAiOiIgKyBmaWx0ZXJzdHIgfHwgbnVsbCwgW2ZpbGVpZCwgIi8iICsga2V5ICsgIjoiICsgKGdldG9wdGlvbihrZXkpWzFdIHx8ICIiKV0pCiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGdldG9wdGlvbihrZXkpewogICAgICAgIGxldCBmaWx0ZXJvcHQgPSBvcHRpb25zLmZpbmQobyA9PiBvLmluZGV4T2YoIi8iICsga2V5ICsgIjoiKSA9PSAwKQogICAgICAgIGxldCBtYXRjaGVyID0gbmV3IFJlZ0V4cCgnXlwvJyArIGtleSArICdcXDooXFxTKykkJykKICAgICAgICBsZXQgbWF0Y2ggPSBmaWx0ZXJvcHQgJiYgZmlsdGVyb3B0Lm1hdGNoKG1hdGNoZXIpIHx8IG51bGwKICAgICAgICByZXR1cm4gbWF0Y2ggfHwgW10KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gcHVia2V5aGFzaChrZXkpewogICAgICAgIGxvY2FsU3RvcmFnZS5wdWJrZXkgPSBwcm9tcHQoInB1YmtleSIsIGxvY2FsU3RvcmFnZS5wdWJrZXkgfHwgIiIpIHx8ICIiCgogICAgICAgIGlmKGxvY2FsU3RvcmFnZS5wdWJrZXkubGVuZ3RoID4gMCl7CiAgICAgICAgICBsb2NhdGlvbi5ocmVmID0gIiMiICsga2V5ICsgIjoiICsgbG9jYWxTdG9yYWdlLnB1YmtleQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gbG9hZHZpc2libGUoKXsKICAgICAgICBpZihvcHRpb25zLmluY2x1ZGVzKCIvaW5saW5lYWxsIikgfHwgb3B0aW9ucy5pbmNsdWRlcygiL2dhbGxlcnkiKSl7CiAgICAgICAgICBmb3IobGV0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmVsZW1lbnQiKSl7CiAgICAgICAgICAgIGlmKGVsZW1lbnQuZGF0YXNldC5maWxlb2JqICYmIHNjcm9sbHZpc2libGUoZWxlbWVudCwgdmlzdWFsVmlld3BvcnQuaGVpZ2h0IC8gMikpewogICAgICAgICAgICAgIGNvbnN0IHNvY2tldCA9IHNvY2tldHMuZmluZChzID0+IHMudXJsID09IGVsZW1lbnQuZGF0YXNldC5zb2NrZXR1cmwpCiAgICAgIAogICAgICAgICAgICAgIGlmKHNvY2tldCl7CiAgICAgICAgICAgICAgICBsZXQgZmlsZW9iaiA9IEpTT04ucGFyc2UoZWxlbWVudC5kYXRhc2V0LmZpbGVvYmopCiAgICAgICAgICAgICAgICBpZihvcHRpb25zLmluY2x1ZGVzKCIvbm9pbmxpbmVsaW1pdCIpIHx8IChmaWxlb2JqLmZpbGVpZHMgfHwgW10pLmxlbmd0aCA8PSAxMCl7CiAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRmaWxlKGVsZW1lbnQuZGF0YXNldC5maWxlaWQsIGZpbGVvYmosIGVsZW1lbnQsIHNvY2tldCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIGFzeW5jICgpID0+IGF3YWl0IGxvYWR2aXNpYmxlKCkpCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpewogICAgICAgIGlmKGUudGFyZ2V0LnRhZ05hbWUgPT0gIklNRyIpewogICAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LnRvZ2dsZSgiYWN0aXZlIikKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgaWYoZS50YXJnZXQuZGF0YXNldC5hY3Rpb24pewogICAgICAgICAgY29uc3QgYyA9IHsKICAgICAgICAgICAgZ2xvYmFsOiAoKSA9PiB1cGRhdGVoYXNoKG51bGwsIFtmaWxlaWQsIGdldG9wdGlvbigidGFnIilbMF0sIGdldG9wdGlvbigiZmlsdGVyIilbMF0sIGdldG9wdGlvbigiZGF0ZSIpWzBdLCBnZXRvcHRpb24oImsiKVswXSwgZ2V0b3B0aW9uKCJmb2wiKVswXV0pLAogICAgICAgICAgICB0YWc6ICgpID0+IHVwZGF0ZXZhbHVlb3B0aW9uKCJ0YWciLCBlLnRhcmdldC5kYXRhc2V0LnZhbHVlKSwKICAgICAgICAgICAgZmlsdGVyOiAoKSA9PiB1cGRhdGV2YWx1ZW9wdGlvbigiZmlsdGVyIiksCiAgICAgICAgICAgIGRhdGU6ICgpID0+IHVwZGF0ZXZhbHVlb3B0aW9uKCJkYXRlIiwgbnVsbCwgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm1hdGNoKC9eXGQrXC1cZCskLykKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIHByb2ZpbGU6ICgpID0+IHB1YmtleWhhc2goImsiKSwKICAgICAgICAgICAgZm9sOiAoKSA9PiBwdWJrZXloYXNoKCJmb2wiKSwKICAgICAgICAgICAgbGlua3M6ICgpID0+IHVwZGF0ZWhhc2gobnVsbCwgWyIvaW5saW5lIiwgIi9pbmxpbmVhbGwiXSksCiAgICAgICAgICAgIGlubGluZTogKCkgPT4gdXBkYXRlaGFzaCgiL2lubGluZSIsIFsiL2lubGluZWFsbCIsICIvZ2FsbGVyeSJdKSwKICAgICAgICAgICAgaW5saW5lYWxsOiAoKSA9PiB1cGRhdGVoYXNoKCIvaW5saW5lYWxsIiwgWyIvaW5saW5lIiwgIi9nYWxsZXJ5Il0pLAogICAgICAgICAgICBnYWxsZXJ5OiAoKSA9PiB7CiAgICAgICAgICAgICAgdXBkYXRlaGFzaCgiL2dhbGxlcnkiLCBbIi9pbmxpbmUiLCAiL2lubGluZWFsbCJdKQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0W29wdGlvbnMuaW5jbHVkZXMoIi9nYWxsZXJ5IikgJiYgImFkZCIgfHwgInJlbW92ZSJdKCJnYWxsZXJ5IikKICAgICAgICAgICAgfSwKICAgICAgICAgICAgcXVpZXQ6ICgpID0+IHVwZGF0ZWhhc2goIi9xdWlldCIsIG51bGwpLAogICAgICAgICAgICB2ZXJib3NlOiAoKSA9PiB1cGRhdGVoYXNoKG51bGwsIFsiL3F1aWV0Il0pLAogICAgICAgICAgICBtYW51c2Nyb2xsOiAoKSA9PiB1cGRhdGVoYXNoKG51bGwsIFsiL2F1dG9zY3JvbGwiXSksCiAgICAgICAgICAgIGF1dG9zY3JvbGw6ICgpID0+IHVwZGF0ZWhhc2goIi9hdXRvc2Nyb2xsIiwgbnVsbCksIAogICAgICAgICAgICBzb3J0bmFtZTogKCkgPT4gdXBkYXRlaGFzaCgiL3NvcnRuYW1lIiwgbnVsbCksIAogICAgICAgICAgICBzb3J0ZGF0ZTogKCkgPT4gdXBkYXRlaGFzaChudWxsLCBbIi9zb3J0bmFtZSJdKSwKICAgICAgICAgICAgaW5saW5lbGltaXQ6ICgpID0+IHVwZGF0ZWhhc2gobnVsbCwgWyIvbm9pbmxpbmVsaW1pdCJdKSwgCiAgICAgICAgICAgIG5vaW5saW5lbGltaXQ6ICgpID0+IHVwZGF0ZWhhc2goIi9ub2lubGluZWxpbWl0IiwgbnVsbCksIAogICAgICAgICAgICByYXc6ICgpID0+IHVwZGF0ZXZhbHVlb3B0aW9uKCJyYXciLCBudWxsLCAodmFsdWUpID0+IHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUubWF0Y2goL15cU3s2NH0kLykKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIG5vcmF3OiAoKSA9PiB1cGRhdGVoYXNoKG51bGwsIFsiL3JhdyJdKSwgCiAgICAgICAgICAgIHN5bmM6ICgpID0+IHVwZGF0ZWhhc2goIi9zeW5jIiwgbnVsbCksIAogICAgICAgICAgICBub3N5bmM6ICgpID0+IHVwZGF0ZWhhc2gobnVsbCwgWyIvc3luYyJdKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAgIGNbZS50YXJnZXQuZGF0YXNldC5hY3Rpb25dKCkKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBhZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwgZnVuY3Rpb24oZSl7CiAgICAgICAgbG9jYXRpb24ucmVsb2FkKCkKICAgICAgfSkKICAgICAgCiAgICAgIGFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbihlKXsKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dVcCIpewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgICAKICAgICAgICAgIGlmKCFwcmV2ZWxlbWVudCgpICYmIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wID09IDApewogICAgICAgICAgICBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wTWF4CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3AgPSBwcmV2ZWxlbWVudCgpICYmIHByZXZlbGVtZW50KCkucXVlcnlTZWxlY3RvcigiYSIpLm9mZnNldFRvcCArIAogICAgICAgICAgICBwcmV2ZWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoImEiKS5vZmZzZXRIZWlnaHQgfHwgMAogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlLmtleSA9PSAiQXJyb3dEb3duIil7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wID0gbmV4dGVsZW1lbnQoKSAmJiBuZXh0ZWxlbWVudCgpLnF1ZXJ5U2VsZWN0b3IoImEiKS5vZmZzZXRUb3AgKyAKICAgICAgICAgICAgbmV4dGVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKCJhIikub2Zmc2V0SGVpZ2h0IHx8IDAKICAgICAgICB9CiAgICAgIH0pCiAgICAgIAogICAgICBmdW5jdGlvbiBiNjR0b0Jsb2IoYjY0RGF0YSwgY29udGVudFR5cGU9JycsIHNsaWNlU2l6ZT01MTIpewogICAgICAgIGNvbnN0IGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTsKICAgICAgICBjb25zdCBieXRlQXJyYXlzID0gW107CgogICAgICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkgewogICAgICAgICAgY29uc3Qgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7CgogICAgICAgICAgY29uc3QgYnl0ZU51bWJlcnMgPSBuZXcgQXJyYXkoc2xpY2UubGVuZ3RoKTsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgYnl0ZU51bWJlcnNbaV0gPSBzbGljZS5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgfQoKICAgICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IG5ldyBVaW50OEFycmF5KGJ5dGVOdW1iZXJzKTsKICAgICAgICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIG5ldyBCbG9iKGJ5dGVBcnJheXMsIHt0eXBlOiBjb250ZW50VHlwZX0pOwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBpbmZvKHRleHQsIGh0bWwsIGltcG9ydGFudCwgY2xhc3NOYW1lcywgZmlsZSwgZmlsZWlkLCBzb2NrZXQpewogICAgICAgIGxldCBzY3JvbGxtYXggPSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCA9PSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcE1heAogICAgICAgIAogICAgICAgIGlmKChvcHRpb25zLmluY2x1ZGVzKCIvZ2FsbGVyeSIpICYmICFmaWxlaWQpIHx8IChpbXBvcnRhbnQgPT0gZmFsc2UgJiYgb3B0aW9ucy5pbmNsdWRlcygiL3F1aWV0IikpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KCiAgICAgICAgbGV0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgZGl2LmNsYXNzTGlzdC5hZGQoLi4uKEFycmF5LmlzQXJyYXkoY2xhc3NOYW1lcykgJiYgY2xhc3NOYW1lcyB8fCBbY2xhc3NOYW1lc10pKQogICAgICAgIGRpdltodG1sICYmICJpbm5lckhUTUwiIHx8ICJpbm5lclRleHQiXSA9IHRleHQKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChkaXYpCiAgICAgICAgZGl2LmRhdGFzZXQuZmlsZWlkID0gZmlsZWlkCiAgICAgICAgCiAgICAgICAgaWYoZmlsZSl7CiAgICAgICAgICBkaXYuZGF0YXNldC5maWxlbmFtZSA9IGZpbGUubmFtZQogICAgICAgICAgZGl2LmRhdGFzZXQuZmlsZW9iaiA9IEpTT04uc3RyaW5naWZ5KGZpbGUpCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKHNvY2tldCl7CiAgICAgICAgICBkaXYuZGF0YXNldC5zb2NrZXR1cmwgPSBzb2NrZXQudXJsCiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmKG9wdGlvbnMuaW5jbHVkZXMoIi9hdXRvc2Nyb2xsIikgJiYgc2Nyb2xsbWF4KXsKICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3BNYXgKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIG5leHRlbGVtZW50KCl7CiAgICAgICAgcmV0dXJuIFsuLi5kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuZWxlbWVudCIpXS5maW5kKGVsID0+IGVsLm9mZnNldEhlaWdodCA+IDAgJiYgCiAgICAgICAgICBlbC5xdWVyeVNlbGVjdG9yKCJhIikub2Zmc2V0VG9wICsgZWwucXVlcnlTZWxlY3RvcigiYSIpLm9mZnNldEhlaWdodCA+IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wKQogICAgICB9CgogICAgICBmdW5jdGlvbiBwcmV2ZWxlbWVudCgpewogICAgICAgIHJldHVybiBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmVsZW1lbnQiKV0ucmV2ZXJzZSgpLmZpbmQoZWwgPT4gZWwub2Zmc2V0SGVpZ2h0ID4gMCAmJiAKICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoImEiKS5vZmZzZXRUb3AgKyBlbC5xdWVyeVNlbGVjdG9yKCJhIikub2Zmc2V0SGVpZ2h0IDwgZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3ApCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRmaWxlKGZpbGVpZCwgZmlsZW9iaiwgY29udGFpbmVyLCBzb2NrZXQpewogICAgICAgIGNvbnN0IGlkcyA9IGZpbGVvYmouaWRzCiAgICAgICAgCiAgICAgICAgaWYoaWRzKXsKICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSAoYXdhaXQgY29sbGVjdGZpbGUoc29ja2V0LCBpZHMpKS5jb250ZW50CiAgICAgICAgICBmaWxlb2JqID0gSlNPTi5wYXJzZShjb250ZW50KQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighbG9hZGVkZmlsZWlkcy5pbmNsdWRlcyhmaWxlaWQpKXsKICAgICAgICAgIGxvYWRlZGZpbGVpZHMucHVzaChmaWxlaWQpCiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzM0XSwgZmlsZW9iai5maWxlaWRzKQogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIHJlcywgY29udGFpbmVyLCBmaWxlb2JqKQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gc2Nyb2xsdmlzaWJsZShuLCBvZmZzZXQpewogICAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwCiAgICAgICAgcmV0dXJuIChuLm9mZnNldFRvcCArIG4ub2Zmc2V0SGVpZ2h0KSA+PSAoc2Nyb2xsWSAtIG9mZnNldCkKICAgICAgICAgICYmIG4ub2Zmc2V0VG9wIDw9IChzY3JvbGxZICsgdmlzdWFsVmlld3BvcnQuaGVpZ2h0ICsgb2Zmc2V0KQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBleHRlbnNpb24obmFtZSl7CiAgICAgICAgcmV0dXJuIChuYW1lICYmIG5hbWUubWF0Y2goL1wuKFxTezIsNH0pJC8pIHx8IFtdKVsxXQogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBjb2xsZWN0ZmlsZShzb2NrZXQsIHJvb3RmaWxlaWRzKXsKICAgICAgICBsZXQgcm9vdGZpbGVzcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzM1XSwgcm9vdGZpbGVpZHMsIG51bGwpCiAgICAgICAgZmlsZWlkc2NvbWJpbmVkID0gW10KICAgICAgICAKICAgICAgICBmb3IobGV0IGZpbGVpZCBvZiByb290ZmlsZWlkcyl7CiAgICAgICAgICBjb25zdCBmaWxlcmVzID0gcm9vdGZpbGVzcmVzLmZpbmQoZiA9PiBmLmlkID09IGZpbGVpZCkKICAgICAgICAgIGxldCBzaW5nbGVmaWxlaWRzID0gSlNPTi5wYXJzZShmaWxlcmVzLmNvbnRlbnQpLmZpbGVpZHMKICAgICAgICAgIGZpbGVpZHNjb21iaW5lZC5wdXNoKC4uLnNpbmdsZWZpbGVpZHMpCiAgICAgICAgfQoKICAgICAgICBsb2FkZWRmaWxlaWRzLnB1c2goLi4uZmlsZWlkKQogICAgICAgIGNvbnN0IG5hbWUgPSBKU09OLnBhcnNlKHJvb3RmaWxlc3Jlc1swXS5jb250ZW50KS5uYW1lCiAgICAgICAgY29uc3QgZmlsZWNvbnRlbnQgPSBKU09OLnBhcnNlKHJvb3RmaWxlc3Jlc1swXS5jb250ZW50KQogICAgICAgIGZpbGVjb250ZW50LmZpbGVpZHMgPSBmaWxlaWRzY29tYmluZWQuc2xpY2UoMCwgMikKICAgICAgICBmaWxlY29udGVudC5zdHJlYW1pbmdmaWxlaWRzID0gW10KCiAgICAgICAgaWYoWyJ3ZWJtIl0uaW5jbHVkZXMoZXh0ZW5zaW9uKG5hbWUpKSl7CiAgICAgICAgICBmaWxlY29udGVudC5zdHJlYW1pbmdmaWxlaWRzID0gZmlsZWlkc2NvbWJpbmVkLnNsaWNlKDIpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBmaWxlY29udGVudC5maWxlaWRzLnB1c2goLi4uZmlsZWlkc2NvbWJpbmVkLnNsaWNlKDIpKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBmaWxlY29udGVudC5jYW5zdGFydGNvdW50ID0gZmlsZWNvbnRlbnQuZmlsZWlkcy5sZW5ndGgKICAgICAgICBkZWxldGUgZmlsZWNvbnRlbnQucGFydAogICAgICAgIGRlbGV0ZSBmaWxlY29udGVudC5wYXJ0Y291bnQKICAgICAgICAKICAgICAgICByb290ZmlsZXNyZXNbMF0uY29udGVudCA9IEpTT04uc3RyaW5naWZ5KGZpbGVjb250ZW50KQoKICAgICAgICByZXR1cm4gcm9vdGZpbGVzcmVzWzBdCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHJlbGF5bWFpbihzb2NrZXQsIHNpbmNlLCB1bnRpbCl7CiAgICAgICAgbGV0IHB1YmtleW1hdGNoID0gcS5tYXRjaCgvazooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHJhdyA9IHEubWF0Y2goL3JhdzooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IHB1YmtleXMgPSBwdWJrZXltYXRjaCAmJiBbcHVia2V5bWF0Y2hbMV1dCiAgICAgICAgbGV0IGZvbGxvd2luZyA9IHEubWF0Y2goL2ZvbDooW2EtejAtOV0rKS8pCiAgICAgICAgbGV0IGZpbGVzcmVzID0gW10KCiAgICAgICAgaW5mbygicXVlcnkgIiArIHNvY2tldC51cmwsIGZhbHNlLCBmYWxzZSkKICAgICAgICAKICAgICAgICBpZihzY2FuKXsKICAgICAgICAgIGZvcihsZXQga2luZCA9IHNjYW5wYXJhbXMuc3RhcnQ7IGtpbmQgPCBzY2FucGFyYW1zLm1heDsga2luZCArPSBzY2FucGFyYW1zLnNwcmVhZCl7CiAgICAgICAgICAgIGxldCBraW5kcyA9IEFycmF5KHNjYW5wYXJhbXMuc3ByZWFkKS5maWxsKCkubWFwKChlLCBpKSA9PiBpICsga2luZCkKICAgICAgICAgICAgbGV0IHJlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgW2tpbmRdLCBudWxsLCBudWxsKQogICAgICAgICAgICBpbmZvKFsiZm91bmQgPj0iLCByZXMubGVuZ3RoLCAia2luZCIsICJbICIra2luZHNbMF0gKyAiIC0gIiArIChraW5kc1traW5kcy5sZW5ndGgtMV0pICsgIiBdIiwgImV2ZW50cyJdLmpvaW4oIiAiKSkKICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZihyYXcpewogICAgICAgICAgYXdhaXQgc2F2ZShzb2NrZXQsIGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzNF0sIG51bGwsIFtyYXdbMV1dLCBudWxsLCBzaW5jZSwgdW50aWwpKQoKICAgICAgICAgIGZvcihsZXQgaGFzaCBpbiBiYXNlNjRmaWxlcyl7CiAgICAgICAgICAgIGlmKGJhc2U2NGZpbGVzW2hhc2hdLmxlbmd0aCA8IGJhc2U2NGZpbGVzW2hhc2hdWzBdLnBhcnRjb3VudCl7CiAgICAgICAgICAgICAgY29uc3QgbGFzdHBhcnRkYXRlID0gYmFzZTY0ZmlsZXNbaGFzaF1bYmFzZTY0ZmlsZXNbaGFzaF0ubGVuZ3RoLTFdLmNyZWF0ZWRfYXQKICAgICAgICAgICAgICBjb25zb2xlLmxvZygibWlzc2luZyBwYXJ0cyIsIGJhc2U2NGZpbGVzW2hhc2hdLmxlbmd0aCwgYmFzZTY0ZmlsZXNbaGFzaF1bMF0ucGFydGNvdW50LCAKICAgICAgICAgICAgICAgIGJhc2U2NGZpbGVzW2hhc2hdW2Jhc2U2NGZpbGVzW2hhc2hdLmxlbmd0aC0xXS5jcmVhdGVkX2F0KQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgdXBkYXRlX2VsZW1lbnRzKCkKICAgICAgICAgIGxvYWR2aXNpYmxlKCkKICAgICAgICAgIHJldHVybgogICAgICAgIH1lbHNlIGlmKGZpbGVpZC5sZW5ndGggPT0gMCl7CiAgICAgICAgICBjb25zdCB0YWdzID0gZ2V0b3B0aW9uKCJ0YWciKVsxXSAmJiBbZ2V0b3B0aW9uKCJ0YWciKVsxXV0gfHwgbnVsbAogICAgICAgICAgZmlsZXNyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzZdLCBudWxsLCBudWxsLCB0YWdzKSAKICAgICAgICAgIGZpbGVzcmVzLnB1c2goLi4uYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzM1XSwgbnVsbCwgbnVsbCwgdGFncykpCiAgICAgICAgfWVsc2UgaWYocHVia2V5bWF0Y2gpewogICAgICAgICAgZmlsZXNyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzVdLCBudWxsLCBbcHVia2V5bWF0Y2hbMV1dKQogICAgICAgIH1lbHNlIGlmKGZvbGxvd2luZyl7CiAgICAgICAgICBmb2xyZXMgPSBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszXSwgbnVsbCwgW2ZvbGxvd2luZ1sxXV0pCiAgICAgICAgICBwdWJrZXlzID0gZm9scmVzWzBdLnRhZ3MuZmlsdGVyKHQgPT4gdFswXSA9PSAicCIpLm1hcCh0ID0+IHRbMV0pCiAgICAgICAgICBmaWxlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzNV0sIG51bGwsIHB1YmtleXMpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBmaWxlc3JlcyA9IGF3YWl0IHF1ZXJ5ZXZlbnRzKHNvY2tldCwgWzMzNV0sIFtmaWxlaWRdKQoKICAgICAgICAgIGlmKGZpbGVzcmVzLmxlbmd0aCA9PSAwKXsKICAgICAgICAgICAgZmlsZV9jb250YWluZXJfcmVzID0gYXdhaXQgcXVlcnlldmVudHMoc29ja2V0LCBbMzM2XSwgW2ZpbGVpZF0pCiAgICAgICAgICAgIAogICAgICAgICAgICBpZihmaWxlX2NvbnRhaW5lcl9yZXMubGVuZ3RoID4gMCl7CiAgICAgICAgICAgICAgZmlsZXNyZXMgPSBbCiAgICAgICAgICAgICAgICBhd2FpdCBjb2xsZWN0ZmlsZShzb2NrZXQsIEpTT04ucGFyc2UoZmlsZV9jb250YWluZXJfcmVzWzBdLmNvbnRlbnQpLmlkcykKICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBmaWxlc3Jlcyl7CiAgICAgICAgICBmaWxlc1tldmVudC5pZF0gPSBldmVudAogICAgICAgIH0KICAgICAgICAKICAgICAgICBsZXQgZmlsZWlkcyA9IE9iamVjdC5rZXlzKGZpbGVzKS5maWx0ZXIoZXZlbnRpZCA9PiAhbG9hZGVkZmlsZWlkcy5pbmNsdWRlcyhldmVudGlkKSAmJiAhbG9hZGVkbWV0YWlkcy5pbmNsdWRlcyhldmVudGlkKSkKCiAgICAgICAgZmlsZWlkcyA9IGZpbGVpZHMuZmlsdGVyKGV2ZW50aWQgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZmlsZXNbZXZlbnRpZF0uY29udGVudCkucGFydCA9PT0gdW5kZWZpbmVkCiAgICAgICAgICB9Y2F0Y2goZSl7fQogICAgICAgICAgcmV0dXJuIHRydWUKICAgICAgICB9KQogICAgICAgIAogICAgICAgIGluZm8oWyJmb3VuZCIsIGZpbGVpZHMubGVuZ3RoLCAiZmlsZShzKSIsICJAIiwgc29ja2V0LnVybF0uam9pbigiICIpLCBmYWxzZSwgZmFsc2UpCiAgICAgICAgCiAgICAgICAgaWYoZmlsZWlkcy5sZW5ndGggPT0gMSl7CiAgICAgICAgICBmb3IobGV0IGV2ZW50aWQgb2YgZmlsZWlkcyl7CiAgICAgICAgICAgIGxvYWRlZGZpbGVpZHMucHVzaChldmVudGlkKQogICAgICAgICAgICBwZW5kaW5ncmVxdWVzdHMrKwoKICAgICAgICAgICAgbGV0IGZpbGUgPSBKU09OLnBhcnNlKGZpbGVzW2V2ZW50aWRdLmNvbnRlbnQpCiAgICAgICAgICAgIAogICAgICAgICAgICBpZighYXBwbHlmaWx0ZXJzKGZpbGVzW2V2ZW50aWRdLCBmaWxlKSl7CiAgICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGZpbGUuZmlsZWlkcy5sZW5ndGg7IGkgKz0gNTAwKXsKICAgICAgICAgICAgICAgIGF3YWl0IHNhdmUoc29ja2V0LCBhd2FpdCBxdWVyeWV2ZW50cyhzb2NrZXQsIFszMzRdLCBmaWxlLmZpbGVpZHMuc2xpY2UoaSwgaSArIDUwMCkpLCBudWxsLCBmaWxlKQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcGVuZGluZ3JlcXVlc3RzLS0KICAgICAgICAgIH0KICAgICAgICB9ZWxzZSBpZihmaWxlaWRzLmxlbmd0aCA+IDEpewogICAgICAgICAgZm9yKGxldCBldmVudGlkIG9mIGZpbGVpZHMpewogICAgICAgICAgICBsZXQgZmlsZSA9IG51bGwKCiAgICAgICAgICAgIHRyeXsKICAgICAgICAgICAgICBmaWxlID0gSlNPTi5wYXJzZShmaWxlc1tldmVudGlkXS5jb250ZW50KQogICAgICAgICAgICB9Y2F0Y2goZSl7CiAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoIWFwcGx5ZmlsdGVycyhmaWxlc1tldmVudGlkXSwgZmlsZSkpewogICAgICAgICAgICAgIGxvYWRlZG1ldGFpZHMucHVzaChldmVudGlkKQoKICAgICAgICAgICAgICB1cGRhdGVjb250ZW50KG51bGwsIHsKICAgICAgICAgICAgICAgIHNvY2tldDogc29ja2V0LCAKICAgICAgICAgICAgICAgIGZldmVudDogZmlsZXNbZXZlbnRpZF0sCiAgICAgICAgICAgICAgICBmaWxlOiBmaWxlCiAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH1lbHNlewogICAgICAgICAgaW5mbygiNDA0IEAgIiArIHNvY2tldC51cmwsIGZhbHNlLCAhb3B0aW9ucy5pbmNsdWRlcygiL2lubGluZWFsbCIpKQogICAgICAgIH0KCiAgICAgICAgdXBkYXRlX2VsZW1lbnRzKCkKICAgICAgICBsb2FkdmlzaWJsZSgpCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFwcGx5ZmlsdGVycyhmaWxlX3Jvb3QsIGZpbGVfb2JqKXsKICAgICAgICBsZXQgc2tpcCA9IGZhbHNlCgogICAgICAgIGlmKGdldG9wdGlvbigiZGF0ZSIpWzFdKXsKICAgICAgICAgIGNvbnN0IGRhdGVwYXJ0cyA9IGdldG9wdGlvbigiZGF0ZSIpWzFdLnNwbGl0KCItIikKICAgICAgICAgIHNraXAgPSBmaWxlX3Jvb3QuY3JlYXRlZF9hdCA8IHBhcnNlSW50KGRhdGVwYXJ0c1swXSwgMTApIHx8IGZpbGVfcm9vdC5jcmVhdGVkX2F0ID4gcGFyc2VJbnQoZGF0ZXBhcnRzWzFdLCAxMCkKICAgICAgICB9CgogICAgICAgIGlmKGdldG9wdGlvbigiZmlsdGVyIilbMV0gJiYgKGZpbGVfb2JqLm5hbWUgfHwgIiIpLmluZGV4T2YoZ2V0b3B0aW9uKCJmaWx0ZXIiKVsxXSkgPT0gLTEpewogICAgICAgICAgc2tpcCA9IHRydWUKICAgICAgICB9CgogICAgICAgIHJldHVybiBza2lwCiAgICAgIH0KCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHF1ZXJ5ZXZlbnRzKHNvY2tldCwga2luZHMsIGV2ZW50aWRzLCBhdXRob3JzLCB0YWdzLCBzaW5jZSwgdW50aWwpewogICAgICAgIGNvbnN0IHF1ZXJ5aWQgPSAiZXZlbnRzXyIgKyAoKytpZGNvdW50ZXIpCiAgICAgICAgCiAgICAgICAgaWYoZ2V0b3B0aW9uKCJkYXRlIilbMV0pewogICAgICAgICAgY29uc3QgZGF0ZXBhcnRzID0gZ2V0b3B0aW9uKCJkYXRlIilbMV0uc3BsaXQoIi0iKQogICAgICAgICAgc2luY2UgPSBwYXJzZUludChkYXRlcGFydHNbMF0sIDEwKQogICAgICAgICAgdW50aWwgPSBwYXJzZUludChkYXRlcGFydHNbMV0sIDEwKQogICAgICAgIH0KCiAgICAgICAgc29ja2V0LnNlbmQoSlNPTi5zdHJpbmdpZnkoWwogICAgICAgICAgIlJFUSIsIAogICAgICAgICAgcXVlcnlpZCwgCiAgICAgICAgICB7CiAgICAgICAgICAgICJraW5kcyI6IGtpbmRzIHx8IHVuZGVmaW5lZCwgCiAgICAgICAgICAgICJpZHMiOiBldmVudGlkcyB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgICJhdXRob3JzIjogYXV0aG9ycyB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgICIjdCI6IHRhZ3MgfHwgdW5kZWZpbmVkLCAKICAgICAgICAgICAgInNpbmNlIjogc2luY2UgfHwgdW5kZWZpbmVkLAogICAgICAgICAgICAidW50aWwiOiB1bnRpbCB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgICJsaW1pdCI6IDMwMDAKICAgICAgICAgIH0KICAgICAgICBdKSkKCiAgICAgICAgcmV0dXJuIChhd2FpdCB3YWl0cmVzKHNvY2tldCwgcXVlcnlpZCkpWzBdIHx8IFtdCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnRtYXRjaChzb2NrZXQsIGV2ZW50LCBjb250YWluZXIsIGZpbGUsIHJlcXBhcnRjb3VudCwgcmVkb3dubG9hZCl7CiAgICAgICAgY29uc3QgcGFydG1hdGNoID0gZXZlbnQuY29udGVudC5tYXRjaChiYXNlNjRwYXJ0bWF0Y2hlcikKICAgICAgICAgIAogICAgICAgIGlmKHBhcnRtYXRjaCl7CiAgICAgICAgICBsZXQgaGFzaCA9IHBhcnRtYXRjaFszXQogICAgICAgICAgbGV0IHBhcnRjb3VudCA9IHBhcnNlSW50KHBhcnRtYXRjaFsyXSwgMTApCiAgICAgICAgICBsZXQgaW5kZXggPSBwYXJzZUludChwYXJ0bWF0Y2hbMV0sIDEwKQogICAgICAgICAgbGV0IGNvbnRlbnQgPSBwYXJ0bWF0Y2hbNF0KICAgICAgICAgIAogICAgICAgICAgaWYocmVkb3dubG9hZCl7CiAgICAgICAgICAgIGJhc2U2NGZpbGVzW2hhc2hdLmRvd25sb2FkZWQgPSBmYWxzZQogICAgICAgICAgfQoKICAgICAgICAgIGlmKGJhc2U2NGZpbGVzW2hhc2hdICYmIGJhc2U2NGZpbGVzW2hhc2hdLmRvd25sb2FkZWQpewogICAgICAgICAgICBjb25zb2xlLmxvZygic2tpcCAoZmlsZSBhbHJlYWR5IGRvd25sb2FkZWQpIikKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICB9CgogICAgICAgICAgaWYoIWJhc2U2NGZpbGVzW2hhc2hdKXsKICAgICAgICAgICAgaW5mbyhbImZvdW5kIGZpbGUiLCAifiIsIHBhcnNlSW50KGNvbnRlbnQubGVuZ3RoICogcGFydGNvdW50IC8gMWU2ICogMTAwLCAxMCkgLyAxMDAsICJNQiJdLmpvaW4oIiAiKSwgZmFsc2UsIGZhbHNlKQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBpZighYmFzZTY0ZmlsZXNbaGFzaF0gfHwgIWJhc2U2NGZpbGVzW2hhc2hdLmZpbmQoaSA9PiBpLmluZGV4ID09IGluZGV4KSl7CiAgICAgICAgICAgIGJhc2U2NGZpbGVzW2hhc2hdID0gYmFzZTY0ZmlsZXNbaGFzaF0gfHwgW10KCiAgICAgICAgICAgIGJhc2U2NGZpbGVzW2hhc2hdLnB1c2goewogICAgICAgICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICAgICAgICBwYXJ0Y291bnQ6IHBhcnRjb3VudCwgCiAgICAgICAgICAgICAgY3JlYXRlZF9hdDogZXZlbnQuY3JlYXRlZF9hdCwgCiAgICAgICAgICAgICAgY29udGVudDogY29udGVudCwKICAgICAgICAgICAgICBmaWxlOiBmaWxlCiAgICAgICAgICAgIH0pCgogICAgICAgICAgICBsb2FkZWRldmVudGlkcy5wdXNoKGV2ZW50LmlkKQogICAgICAgICAgICBpbmZvKFsiZG93bmxvYWRlZCBmaWxlIHBhcnQiLCBiYXNlNjRmaWxlc1toYXNoXS5sZW5ndGggKyAiIChpZDogIiArIGluZGV4ICsgIikiLCBwYXJ0Y291bnQsIHBhcnNlSW50KGV2ZW50LmNyZWF0ZWRfYXQsIDEwKV0uam9pbigiICIpLCBmYWxzZSwgZmFsc2UpCiAgICAgICAgICB9CgogICAgICAgICAgaWYoIWJhc2U2NGZpbGVzW2hhc2hdLmRvd25sb2FkZWQgJiYgYmFzZTY0ZmlsZXNbaGFzaF0ubGVuZ3RoID09IChyZXFwYXJ0Y291bnQgfHwgcGFydGNvdW50KSl7CiAgICAgICAgICAgIGNvbnN0IGJhc2U2NGZpbGUgPSBiYXNlNjRmaWxlc1toYXNoXS5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGEuaW5kZXggPiBiLmluZGV4ID8gMSA6IC0xCiAgICAgICAgICAgIH0pLm1hcChpID0+IGkuY29udGVudCkuam9pbigiIikKCiAgICAgICAgICAgIGJhc2U2NGZpbGVzW2hhc2hdLmRvd25sb2FkZWQgPSB0cnVlCgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHVybDogYmFzZTY0ZmlsZSwKICAgICAgICAgICAgICBldmVudDogZXZlbnQsCiAgICAgICAgICAgICAgZmlsZTogZmlsZSwgCiAgICAgICAgICAgICAgY29udGFpbmVyOiBjb250YWluZXIsCiAgICAgICAgICAgICAgc29ja2V0OiBzb2NrZXQKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc2F2ZShzb2NrZXQsIGV2ZW50cywgY29udGFpbmVyLCBmaWxlKXsKICAgICAgICBsZXQgbWF0Y2hlcyA9IGZhbHNlCiAgICAgICAgCiAgICAgICAgZm9yKGxldCBldmVudCBvZiBldmVudHMpewogICAgICAgICAgbGV0IGZpbGVtYXRjaCA9IGV2ZW50LmNvbnRlbnQubWF0Y2goYmFzZTY0dXJsbWF0Y2hlcikKICAgICAgICAgIGlmKGZpbGVtYXRjaCl7CiAgICAgICAgICAgIHVwZGF0ZWNvbnRlbnQoewogICAgICAgICAgICAgIHVybDogZmlsZW1hdGNoWzBdLAogICAgICAgICAgICAgIGV2ZW50OiBldmVudCwKICAgICAgICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcgogICAgICAgICAgICB9KQoKICAgICAgICAgICAgbWF0Y2hlcyA9IHRydWUKICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIH0KCiAgICAgICAgICBsZXQgcGFydG1hdGNocmVzID0gcGFydG1hdGNoKHNvY2tldCwgZXZlbnQsIGNvbnRhaW5lciwgZmlsZSwgZmlsZT8uY2Fuc3RhcnRjb3VudCkKICAgICAgICAgIAogICAgICAgICAgaWYocGFydG1hdGNocmVzKXsKICAgICAgICAgICAgdXBkYXRlY29udGVudChwYXJ0bWF0Y2hyZXMpCiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbWF0Y2hlcwogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBmaWxlX2V2ZW50KGV2ZW50aWQpewogICAgICAgIGZvcihmaWxlX2V2ZW50aWQgaW4gZmlsZXMpewogICAgICAgICAgdHJ5ewogICAgICAgICAgICBpZihKU09OLnBhcnNlKGZpbGVzW2ZpbGVfZXZlbnRpZF0uY29udGVudCkuZmlsZWlkcy5maW5kKGlkID0+IGlkID09IGV2ZW50aWQpKXsKICAgICAgICAgICAgICByZXR1cm4gZmlsZXNbZmlsZV9ldmVudGlkXQogICAgICAgICAgICB9CiAgICAgICAgICB9Y2F0Y2goZSl7fQogICAgICAgIH0KICAgICAgfQogICAgICAKICAgICAgZnVuY3Rpb24gZmlsZW5hbWUoZmlsZV9ldmVudCl7CiAgICAgICAgcmV0dXJuIGZpbGVfZXZlbnQgJiYgSlNPTi5wYXJzZShmaWxlX2V2ZW50LmNvbnRlbnQpLm5hbWUgfHwgbnVsbAogICAgICB9CiAgICAgIAogICAgICBhc3luYyBmdW5jdGlvbiBzb3VyY2Vfb3BlbigpIHsKICAgICAgICBpbmZvKCJzdHJlYW1pbmcgZmlsZSIpCiAgICAgICAgc291cmNlX2xvYWQodGhpcykKICAgICAgfQogICAgICAKICAgICAgYXN5bmMgZnVuY3Rpb24gc291cmNlX2xvYWQobWVkaWFfc291cmNlLCBidWZmZXJfbG9hZF9wYXJ0cykgewogICAgICAgIGxldCBpdGVtID0gbWVkaWFfc291cmNlLml0ZW0KICAgICAgICBidWZmZXJfbG9hZF9wYXJ0cyA9IGJ1ZmZlcl9sb2FkX3BhcnRzIHx8IDIwCiAgICAgICAgCiAgICAgICAgaWYoIWl0ZW0pewogICAgICAgICAgY29uc29sZS5sb2coIml0ZW0gbm90IHNldCIpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgY29uc3QgdmlkZW8gPSBtZWRpYV9zb3VyY2UudmlkZW8KICAgICAgICBjb25zdCBidWZmZXJlZCA9IHZpZGVvLmJ1ZmZlcmVkLmxlbmd0aCA+IDAgJiYgdmlkZW8uYnVmZmVyZWQuZW5kKDApIHx8IDAKICAgICAgICAKICAgICAgICBpZihidWZmZXJlZCAtIHZpZGVvLmN1cnJlbnRUaW1lIDw9IDIpewogICAgICAgICAgY29uc3QgY29udGVudF90eXBlID0gbWVkaWFfc291cmNlLnR5cGUKICAgICAgICAgIGl0ZW0uZmlsZS5sb2FkZWRmaWxlaWRzID0gaXRlbS5maWxlLmxvYWRlZGZpbGVpZHMgfHwgW10KICAgICAgICAgIGxldCBmaWxlaWRzID0gWy4uLml0ZW0uZmlsZS5maWxlaWRzLCAuLi5pdGVtLmZpbGUuc3RyZWFtaW5nZmlsZWlkc10KICAgICAgICAgIAogICAgICAgICAgaWYoZmlsZWlkcy5sZW5ndGggPT0gaXRlbS5maWxlLmxvYWRlZGZpbGVpZHMubGVuZ3RoKXsKICAgICAgICAgICAgaWYoaXRlbS5maWxlLmJ5dGVfYXJyYXlzKXsKICAgICAgICAgICAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoaXRlbS5maWxlLmJ5dGVfYXJyYXlzLCB7dHlwZTogY29udGVudF90eXBlfSkKICAgICAgICAgICAgICB2aWRlby5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpCiAgICAgICAgICAgICAgY29uc29sZS5sb2coImJsb2J1cmwiLCB2aWRlby5zcmMpCiAgICAgICAgICAgICAgZGVsZXRlIGl0ZW0uZmlsZS5ieXRlX2FycmF5cwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBjb25zdCBsYXN0X3JlcV9wYXJ0X2luZGV4ID0gaXRlbS5maWxlLmxvYWRlZGZpbGVpZHMubGVuZ3RoICsgYnVmZmVyX2xvYWRfcGFydHMKICAgICAgICAgIGZpbGVpZHMgPSBmaWxlaWRzLnNsaWNlKDAsIGxhc3RfcmVxX3BhcnRfaW5kZXgpLmZpbHRlcih4ID0+ICFpdGVtLmZpbGUubG9hZGVkZmlsZWlkcy5pbmNsdWRlcyh4KSkKCiAgICAgICAgICBsZXQgcmVzID0gYXdhaXQgcXVlcnlldmVudHMoaXRlbS5zb2NrZXQsIFszMzRdLCBmaWxlaWRzKQogICAgICAgICAgaXRlbS5maWxlLmxvYWRlZGZpbGVpZHMucHVzaCguLi5yZXMubWFwKGUgPT4gZS5pZCkpCiAgICAgICAgICAKICAgICAgICAgIGlmKCFpdGVtLmZpbGUuc291cmNlX2J1ZmZlcil7CiAgICAgICAgICAgIGl0ZW0uZmlsZS5zb3VyY2VfYnVmZmVyID0gbWVkaWFfc291cmNlLmFkZFNvdXJjZUJ1ZmZlcihjb250ZW50X3R5cGUpOwogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBmb3IobGV0IGV2ZW50IG9mIHJlcyl7CiAgICAgICAgICAgIGxldCBwYXJ0bWF0Y2hyZXMgPSBwYXJ0bWF0Y2goaXRlbS5zb2NrZXQsIGV2ZW50LCBudWxsLCBpdGVtLmZpbGUsIGl0ZW0uZmlsZS5sb2FkZWRmaWxlaWRzLmxlbmd0aCwgdHJ1ZSkKCiAgICAgICAgICAgIGlmKHBhcnRtYXRjaHJlcyl7CiAgICAgICAgICAgICAgbGV0IGJhc2U2NG1hdGNoID0gcGFydG1hdGNocmVzLnVybC5tYXRjaChiYXNlNjR1cmxtYXRjaGVyKQogICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwYXJ0bWF0Y2hyZXMudXJsLnN1YnN0cihiYXNlNjRtYXRjaFsxXS5sZW5ndGgsIHBhcnRtYXRjaHJlcy51cmwubGVuZ3RoKQogICAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBiNjR0b0Jsb2IoY29udGVudCwgY29udGVudF90eXBlKQogICAgICAgICAgICAgIGNvbnN0IGJ5dGVBcnJheSA9IGF3YWl0IGJsb2IuYXJyYXlCdWZmZXIoKTsKCiAgICAgICAgICAgICAgdHJ5ewogICAgICAgICAgICAgICAgaXRlbS5maWxlLnNvdXJjZV9idWZmZXIuYXBwZW5kQnVmZmVyKGJ5dGVBcnJheSkKICAgICAgICAgICAgICB9Y2F0Y2goZSl7CiAgICAgICAgICAgICAgICBidWZmZXJfbG9hZF9wYXJ0cyA9IDUwMAogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBpdGVtLmZpbGUuYnl0ZV9hcnJheXMgPSBpdGVtLmZpbGUuYnl0ZV9hcnJheXMgfHwgW10KICAgICAgICAgICAgICBpdGVtLmZpbGUuYnl0ZV9hcnJheXMucHVzaChieXRlQXJyYXkpCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICBpZih2aWRlby5kdXJhdGlvbiAtIHZpZGVvLmN1cnJlbnRUaW1lIDwgMC41KXsKICAgICAgICAgICAgbWVkaWFfc291cmNlLmVuZE9mU3RyZWFtKCkKICAgICAgICAgICAgY29uc29sZS5sb2coInZpZGVvIGZ1bGx5IGxvYWRlZCIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICBzb3VyY2VfbG9hZChtZWRpYV9zb3VyY2UsIGJ1ZmZlcl9sb2FkX3BhcnRzKQogICAgICAgIH0sIDEwMDApCiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFwcGVuZGl0ZW0oZXh0LCBocmVmLCBjb250ZW50LCBmaWxlbmFtZSwgY29udGFpbmVyLCBpdGVtLCBtaW1ldHlwZSl7CiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHkKICAgICAgICBsZXQgZWwgPSBudWxsCiAgICAgICAgY29uc29sZS5sb2coIm1pbWV0eXBlIiwgbWltZXR5cGUpCiAgICAgICAgaWYoWyJqcGciLCAianBlZyIsICJwbmciLCAid2VicCIsICJtcDQiLCAid2VibSIsICJtcDMiLCAiYWFjIiwgIndhdiIsICJvZ2ciXS5pbmNsdWRlcyhleHQpKXsKICAgICAgICAgIGlmKG1pbWV0eXBlLm1hdGNoKC92aWRlb1wvLykpewogICAgICAgICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZpZGVvIikKICAgICAgICAgIH1lbHNlIGlmKG1pbWV0eXBlLm1hdGNoKC9hdWRpb1wvLykpewogICAgICAgICAgICBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImF1ZGlvIikKICAgICAgICAgICAgZWwuY29udHJvbHMgPSAxCiAgICAgICAgICAgIHNvdXJjZV9lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNvdXJjZSIpCiAgICAgICAgICAgIHNvdXJjZV9lbC5zcmMgPSBocmVmCiAgICAgICAgICAgIHNvdXJjZV9lbC50eXBlID0gbWltZXR5cGUKICAgICAgICAgICAgZWwuYXBwZW5kKHNvdXJjZV9lbCkKICAgICAgICAgICAgCiAgICAgICAgICAgIGVsLm9uZW5kZWQgPSBmdW5jdGlvbigpewogICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2VsZW1lbnRzID0gWy4uLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoImF1ZGlvIildCiAgICAgICAgICAgICAgY29uc3QgZW5kZWRfaW5kZXggPSBhdWRpb19lbGVtZW50cy5pbmRleE9mKHRoaXMpCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgaWYoZW5kZWRfaW5kZXggPCBhdWRpb19lbGVtZW50cy5sZW5ndGgtMil7CiAgICAgICAgICAgICAgICBhdWRpb19lbGVtZW50c1tlbmRlZF9pbmRleCsxXS5wbGF5KCkKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH1lbHNlIHsKICAgICAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKQogICAgICAgICAgfQoKICAgICAgICAgIGVsLnNyYyA9IGhyZWYKICAgICAgICAgIAogICAgICAgICAgaWYoTWVkaWFTb3VyY2UuaXNUeXBlU3VwcG9ydGVkKG1pbWV0eXBlKSl7CiAgICAgICAgICAgIGxldCBtZWRpYV9zb3VyY2UgPSBuZXcgTWVkaWFTb3VyY2UKICAgICAgICAgICAgbWVkaWFfc291cmNlLml0ZW0gPSBpdGVtCiAgICAgICAgICAgIG1lZGlhX3NvdXJjZS52aWRlbyA9IGVsCiAgICAgICAgICAgIG1lZGlhX3NvdXJjZS5leHQgPSBleHQKICAgICAgICAgICAgbWVkaWFfc291cmNlLnR5cGUgPSBtaW1ldHlwZQogICAgICAgICAgICBtZWRpYV9zb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcigic291cmNlb3BlbiIsIHNvdXJjZV9vcGVuKQogICAgICAgICAgICBlbC5jb250cm9scyA9IDEKICAgICAgICAgICAgZWwucHJlbG9hZCA9ICJhdXRvIgogICAgICAgICAgICBlbC5zcmMgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKG1lZGlhX3NvdXJjZSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZigidHh0IiA9PSBleHQpewogICAgICAgICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQogICAgICAgICAgZWwuaW5uZXJUZXh0ID0gYXRvYihjb250ZW50KQogICAgICAgICAgZWwuY2xhc3NMaXN0LmFkZCgiaW5saW5lLXRleHQiKQogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZihlbCl7CiAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKCJpdGVtIikKICAgICAgICAgIGVsLmRhdGFzZXQuZmlsZW5hbWUgPSBmaWxlbmFtZQogICAgICAgICAgY29udGFpbmVyLmFwcGVuZChlbCkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWwodW5zYWZlKXsKICAgICAgICByZXR1cm4gdW5zYWZlLnJlcGxhY2VBbGwoJyYnLCAnJmFtcDsnKS5yZXBsYWNlQWxsKCc8JywgJyZsdDsnKS5yZXBsYWNlQWxsKCc+JywgJyZndDsnKQogICAgICAgICAgLnJlcGxhY2VBbGwoJyInLCAnJnF1b3Q7JykucmVwbGFjZUFsbCgiJyIsICcmIzAzOTsnKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVfZWxlbWVudHMoKXsKICAgICAgICBsZXQgbGlzdCA9IGRvY3VtZW50LmJvZHkKICAgICAgICBsZXQgZWxlbWVudHMgPSBBcnJheS5mcm9tKGxpc3QucXVlcnlTZWxlY3RvckFsbCgiLmVsZW1lbnQiKSkKICAgICAgICAKICAgICAgICBpZihvcHRpb25zLmluY2x1ZGVzKCIvc29ydG5hbWUiKSl7CiAgICAgICAgICBlbGVtZW50cy5zb3J0KChhLGIpID0+IGEuZGF0YXNldC5maWxlbmFtZSA+IGIuZGF0YXNldC5maWxlbmFtZSA/IDEgOiAtMSkKICAgICAgICAgICAgLmZvckVhY2gobm9kZT0+bGlzdC5hcHBlbmRDaGlsZChub2RlKSkKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGZ1bmN0aW9uIHRhZ3NodG1sKHRhZ3MpewogICAgICAgIHJldHVybiB0YWdzLnNsaWNlKDAsIDEwKS5tYXAodCA9PiB7CiAgICAgICAgICBsZXQgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgICAgYS5ocmVmID0gIiMiCiAgICAgICAgICBhLmRhdGFzZXQuYWN0aW9uID0gInRhZyIKICAgICAgICAgIGEuZGF0YXNldC52YWx1ZSA9IHRbMV0KICAgICAgICAgIGEuaW5uZXJUZXh0ID0gIiMiICsgdFsxXQogICAgICAgICAgcmV0dXJuIGEub3V0ZXJIVE1MCiAgICAgICAgfSkuam9pbigiICIpCiAgICAgIH0KICAgICAgCiAgICAgIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZWNvbnRlbnQoaXRlbSwgZmV2ZW50LCBmbmFtZSwgaW5saW5lKXsKICAgICAgICBsZXQgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKQogICAgICAgIGxldCBmaWxlID0gbnVsbAogICAgICAgIAogICAgICAgIGlmKCFpdGVtKXsKICAgICAgICAgIHRyeXsKICAgICAgICAgICAgZmlsZSA9IEpTT04ucGFyc2UoZmV2ZW50LmZldmVudC5jb250ZW50KQogICAgICAgICAgfWNhdGNoKGUpewogICAgICAgICAgICByZXR1cm4KICAgICAgICAgIH0KCiAgICAgICAgICBhLmhyZWYgPSAiIyIgKyBmZXZlbnQuZmV2ZW50LmlkICsgb3B0aW9ucy5qb2luKCIiKQogICAgICAgICAgYS5pbm5lclRleHQgPSBmaWxlLm5hbWUgfHwgImZpbGUiCgogICAgICAgICAgbGV0IG1zZyA9IFsiZm91bmQgZmlsZSIsIGEub3V0ZXJIVE1MLCAuLi5bZmV2ZW50LmZldmVudC50YWdzLmxlbmd0aCA+IDAgJiYgInwgIiArIHRhZ3NodG1sKGZldmVudC5mZXZlbnQudGFncykgfHwgIiJdLCAifCIsIHBhcnNlSW50KGZldmVudC5mZXZlbnQuY3JlYXRlZF9hdCwgMTApXQogICAgICAgICAgCiAgICAgICAgICBpZihmaWxlLmNvbW1lbnQpewogICAgICAgICAgICBtc2cucHVzaCgifCIsIGVzY2FwZUh0bWwoZmlsZS5jb21tZW50KSkKICAgICAgICAgIH0KICAgICAgICAgIAogICAgICAgICAgaW5mbygnPGRpdiBjbGFzcz0icGxhY2Vob2xkZXIiPicgKyBtc2cuam9pbigiICIpICsgJzwvZGl2PicsIHRydWUsIHRydWUsIFsiZWxlbWVudCIsICJmaWxldHlwZS0iICsgZXh0ZW5zaW9uKGZpbGUubmFtZSldLCBmaWxlLCBmZXZlbnQuZmV2ZW50LmlkLCBmZXZlbnQuc29ja2V0KQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQoKICAgICAgICBmaWxlID0gZmlsZSB8fCBpdGVtLmV2ZW50ICYmIGZpbGVfZXZlbnQoaXRlbS5ldmVudC5pZCkgfHwgbnVsbAogICAgICAgIGxldCBuYW1lID0gZmlsZSAmJiBmaWxlbmFtZShmaWxlKSB8fCBmbmFtZSB8fCAiZmlsZSIKICAgICAgICBsZXQgYmFzZTY0bWF0Y2ggPSBpdGVtLnVybC5zdWJzdHIoMCwgMTAwMCkubWF0Y2goYmFzZTY0dXJsbWF0Y2hlcikKICAgICAgICBsZXQgbWltZXR5cGUgPSBiYXNlNjRtYXRjaCAmJiBiYXNlNjRtYXRjaFsyXQogICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbihuYW1lKSB8fCBtaW1ldHlwZS5zcGxpdCgiLyIpWzFdCiAgICAgICAgbGV0IGZpbGVvYmogPSBmaWxlICYmIEpTT04ucGFyc2UoZmlsZS5jb250ZW50KSB8fCBudWxsCiAgICAgICAgbGV0IGNvbnRlbnQgPSBudWxsCiAgICAgICAgCiAgICAgICAgaWYoYmFzZTY0bWF0Y2gpewogICAgICAgICAgY29udGVudCA9IGl0ZW0udXJsLnN1YnN0cihiYXNlNjRtYXRjaFsxXS5sZW5ndGgsIGl0ZW0udXJsLmxlbmd0aCkKICAgICAgICAgIGEuaHJlZiA9IGF3YWl0IGJsb2J1cmwoY29udGVudCwgbWltZXR5cGUpCiAgICAgICAgfWVsc2V7CiAgICAgICAgICBhLmhyZWYgPSBpdGVtLnVybAogICAgICAgIH0KICAgICAgICAKICAgICAgICBhLmlubmVyVGV4dCA9IG5hbWUKICAgICAgICAKICAgICAgICBpZighWyJqcGciLCAianBlZyIsICJwbmciLCAid2VicCIsICJtcDQiXS5pbmNsdWRlcyhleHQpKXsKICAgICAgICAgIGEuZG93bmxvYWQgPSBuYW1lCiAgICAgICAgfQoKICAgICAgICBpbmZvKFsiZG93bmxvYWRlZCIsIGl0ZW0uZXZlbnQuaWQuc3Vic3RyKC0xMCksIGEub3V0ZXJIVE1MXS5qb2luKCIgIiksIHRydWUsIHRydWUsICJlbGVtZW50IiwgZmlsZSkKICAgICAgICAKICAgICAgICBpZighb3B0aW9ucy5pbmNsdWRlcygiL2lubGluZWFsbCIpICYmIGZpbGVvYmogJiYgZmlsZW9iai5jb21tZW50KXsKICAgICAgICAgIGluZm8oWyJjb21tZW50OiIsIGVzY2FwZUh0bWwoZmlsZW9iai5jb21tZW50KV0uam9pbigiICIpLCB0cnVlLCB0cnVlLCAiZWxlbWVudCIsIGZpbGUpCiAgICAgICAgfQoKICAgICAgICBpZighb3B0aW9ucy5pbmNsdWRlcygiL2lubGluZWFsbCIpICYmIGZpbGUgJiYgZmlsZS50YWdzLmxlbmd0aCA+IDApewogICAgICAgICAgaW5mbyhbImZpbGUgdGFnczoiLCB0YWdzaHRtbChmaWxlLnRhZ3MpXS5qb2luKCIgIiksIHRydWUsIHRydWUsICJlbGVtZW50IiwgZmlsZSkKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaWYoaW5saW5lID09IGZhbHNlIHx8ICghb3B0aW9ucy5pbmNsdWRlcygiL2lubGluZSIpICYmICFvcHRpb25zLmluY2x1ZGVzKCIvaW5saW5lYWxsIikgJiYgIW9wdGlvbnMuaW5jbHVkZXMoIi9nYWxsZXJ5IikpKXsKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgICAKICAgICAgICBpZighYS5kb3dubG9hZCAmJiBvcHRpb25zLmluY2x1ZGVzKCIvaW5saW5lYWxsIikpewogICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpCiAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZCgicm93IikKICAgICAgICAgIGFwcGVuZGl0ZW0oZXh0LCBhLmhyZWYsIGNvbnRlbnQsIGZpbGVvYmoubmFtZSwgY29udGFpbmVyLCBpdGVtLCBtaW1ldHlwZSkKICAgICAgICAgIGxldCBjb21tZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicCIpCgogICAgICAgICAgaWYoZmlsZW9iai5uYW1lKXsKICAgICAgICAgICAgY29tbWVudC5pbm5lckhUTUwgKz0gIjxwPiIgKyBlc2NhcGVIdG1sKGZpbGVvYmoubmFtZSkgKyAiPC9wPiIKICAgICAgICAgIH0KCiAgICAgICAgICBpZihmaWxlb2JqLmNvbW1lbnQpewogICAgICAgICAgICBjb21tZW50LmlubmVySFRNTCArPSBlc2NhcGVIdG1sKGZpbGVvYmouY29tbWVudCkgfHwgIiIKICAgICAgICAgIH0KCiAgICAgICAgICBpZihmaWxlLnRhZ3MubGVuZ3RoID4gMCl7CiAgICAgICAgICAgIGNvbW1lbnQuaW5uZXJIVE1MICs9ICI8cD50YWdzOiAiICsgdGFnc2h0bWwoZmlsZS50YWdzKSArICI8L3A+IgogICAgICAgICAgfQoKICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmQoY29tbWVudCkKICAgICAgICAgIGl0ZW0uY29udGFpbmVyLmFwcGVuZChjb250YWluZXIpCiAgICAgICAgICBpdGVtLmNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCIucGxhY2Vob2xkZXIiKS5yZW1vdmUoKQogICAgICAgIH1lbHNlewogICAgICAgICAgaWYoY29udGVudCl7CiAgICAgICAgICAgIGFwcGVuZGl0ZW0oZXh0LCBhLmhyZWYsIGNvbnRlbnQsIGZpbGVvYmogJiYgZmlsZW9iai5uYW1lIHx8ICJmaWxlLiIgKyBleHQsIGl0ZW0uY29udGFpbmVyIHx8IGRvY3VtZW50LmJvZHksIGl0ZW0sIG1pbWV0eXBlKQogICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCJjb250ZW50IG1pc3NpbmcuIHBhcnRzIGxvYWRlZCBpbiB3cm9uZyBvcmRlcj8iKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgY2xhc3MgUmVzSGFuZGxlciB7CiAgICAgICAgY29uc3RydWN0b3Ioc29ja2V0LCBrZXksIHR5cGUsIGVycnR5cGUsIHJlc29sdmUsIHJlamVjdCl7CiAgICAgICAgICB0aGlzLl9zb2NrZXQgPSBzb2NrZXQKICAgICAgICAgIHRoaXMua2V5ID0ga2V5CiAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICJFT1NFIgogICAgICAgICAgdGhpcy5lcnJ0eXBlID0gZXJydHlwZSB8fCAiTk9USUNFIgogICAgICAgICAgdGhpcy5ldmVudHMgPSBbXQogICAgICAgICAgdGhpcy5yZXNvbHZlID0gcmVzb2x2ZQogICAgICAgICAgdGhpcy5yZWplY3QgPSByZWplY3QKICAgICAgICB9CgogICAgICAgIGdldCBzb2NrZXQoKXsKICAgICAgICAgIHJldHVybiB0aGlzLl9zb2NrZXQKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgaGFuZGxlKHJlcyl7CiAgICAgICAgICBsZXQgbyA9IEpTT04ucGFyc2UocmVzLmRhdGEpCiAgICAgICAgICBpZih0aGlzLmtleSA9PSBudWxsIHx8IG9bMV0gPT0gdGhpcy5rZXkpewogICAgICAgICAgICBpZihvWzBdID09IHRoaXMudHlwZSl7CiAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKFt0aGlzLmV2ZW50cywgb10pCiAgICAgICAgICAgICAgcmVzaGFuZGxlcnMuc3BsaWNlKHJlc2hhbmRsZXJzLmluZGV4T2YodGhpcyksIDEpCiAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIH1lbHNlIGlmKG9bMF0gPT0gdGhpcy5lcnJ0eXBlKXsKICAgICAgICAgICAgICB0aGlzLnJlamVjdChbdGhpcy5ldmVudHMsIG9dKQogICAgICAgICAgICAgIHJlc2hhbmRsZXJzLnNwbGljZShyZXNoYW5kbGVycy5pbmRleE9mKHRoaXMpLCAxKQogICAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnB1c2gob1syXSkKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHdhaXRyZXMoc29ja2V0LCBrZXksIHR5cGUsIGVycnR5cGUpewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICBsZXQgaGFuZGxlciA9IG5ldyBSZXNIYW5kbGVyKHNvY2tldCwga2V5LCB0eXBlLCBlcnJ0eXBlLCByZXNvbHZlLCByZWplY3QpCiAgICAgICAgICByZXNoYW5kbGVycy5wdXNoKGhhbmRsZXIpCiAgICAgICAgfSkKICAgICAgfQoKICAgICAgYXN5bmMgZnVuY3Rpb24gYmxvYnVybChjb250ZW50LCBtaW1ldHlwZSl7CiAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IGI2NHRvQmxvYihjb250ZW50LCBtaW1ldHlwZSkKICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKQogICAgICB9CiAgICAgIAogICAgICBmdW5jdGlvbiBjb25uZWN0KHVybCl7CiAgICAgICAgbGV0IHNvY2tldCA9IG5ldyBXZWJTb2NrZXQodXJsKQogICAgICAgIHNvY2tldC5vbm1lc3NhZ2UgPSBtZXNzYWdlID0+IHJlc2hhbmRsZXJzLmZvckVhY2gocmggPT4gcmguaGFuZGxlKG1lc3NhZ2UpKQogICAgICAgIHJldHVybiBzb2NrZXQKICAgICAgfQoKICAgICAgYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGFzeW5jICgpID0+IHsKICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdFtvcHRpb25zLmluY2x1ZGVzKCIvZ2FsbGVyeSIpICYmICJhZGQiIHx8ICJyZW1vdmUiXSgiZ2FsbGVyeSIpCiAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3Rbb3B0aW9ucy5pbmNsdWRlcygiL2lubGluZWFsbCIpICYmICJhZGQiIHx8ICJyZW1vdmUiXSgiaW5saW5lYWxsIikKCiAgICAgICAgZm9yKGxldCB1cmwgb2YgcmVsYXlzKXsKICAgICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3QodXJsKQogICAgICAgICAgc29ja2V0cy5wdXNoKHNvY2tldCkKICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICBzb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsIGFzeW5jIGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgYXdhaXQgcmVsYXltYWluKHRoaXMpCiAgICAgICAgICAgICAgcmVzb2x2ZSgpCiAgICAgICAgICAgIH0pCiAgICAgICAgICB9KQogICAgICAgICAgCiAgICAgICAgICBpZihvcHRpb25zLmluY2x1ZGVzKCIvc3luYyIpKXsKICAgICAgICAgICAgYXdhaXQgcHJvbWlzZQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSkKICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPgo=" | base64 --decode > ~/fileloader.html && firefox fileloader.html

Reply to this note

Please Login to reply.

Discussion

No replies yet.