You want to buy Menzerna polishes or accessories? Our range caters to professionals with the highest standards
and is available from selected partners around the globe. Our international network of qualified dealers offers
fast and competent service worldwide.
Whether auto detail shop or car detailing supplies stores: Find the right stockist among numerous polishing and
car care shops with our Menzerna dealer and onlineshop search. For car polishes, boat polishes and solid compounds.
CiAgICAgICAgICAgICAgICAgICAgICAKICAgIDxkaXYgaWQ9Im1vYmlsZS1jaGVjayI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJtb2JpbGUtcmVzZXQtc2VhcmNoIj4KICAgICAgICA8YnV0dG9uIGlkPSJyZXNldC1zZWFyY2giIGNsYXNzPSJidG4iPlVzZSBEZWFsZXItc2VhcmNoIGFnYWluPC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImZpbHRlcmZvcm0tY29udGFpbmVyIGRlYWxlci1zZWFyY2gtZm9ybS13cmFwIj4KICAgICAgICA8Zm9ybSBkYXRhLWFqYXh1cmw9Ii9zZXJ2aWNlL2RlYWxlci1zZWFyY2g/bm9fY2FjaGU9MSZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmFjdGlvbiU1RD1hamF4Q2FsbCZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmNvbnRyb2xsZXIlNUQ9RGVhbGVyJmFtcDt0eXBlPTExMjImYW1wO2NIYXNoPWIxMDY4Y2RlMDI3MTA0OTU4ZGMzZDIyMWNmY2Y3ZDRkIiBtZXRob2Q9InBvc3QiIGNsYXNzPSJkZWFsZXItc2VhcmNoLWZvcm0iIGlkPSJzZWxlY3RGb3JtIiBhY3Rpb249Ii9zZXJ2aWNlL2RlYWxlci1zZWFyY2g/dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmFjdGlvbiU1RD1hamF4Q2FsbCZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmNvbnRyb2xsZXIlNUQ9RGVhbGVyJmFtcDt0eXBlPTExMjImYW1wO2NIYXNoPWIxMDY4Y2RlMDI3MTA0OTU4ZGMzZDIyMWNmY2Y3ZDRkIj4KPGRpdj4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtfX3JlZmVycmVyXVtAZXh0ZW5zaW9uXSIgdmFsdWU9IlB4cGRlYWxlcnMiIC8+CjxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbX19yZWZlcnJlcl1bQGNvbnRyb2xsZXJdIiB2YWx1ZT0iRGVhbGVyIiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fcmVmZXJyZXJdW0BhY3Rpb25dIiB2YWx1ZT0ibGlzdCIgLz4KPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtfX3JlZmVycmVyXVthcmd1bWVudHNdIiB2YWx1ZT0iWVRvd09udDljMzJhZmQwODliYmI3MWEwMjBhZDI2Y2U2ZjU1MGNmMDYwYzQ5ZTM1IiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fcmVmZXJyZXJdW0ByZXF1ZXN0XSIgdmFsdWU9InsmcXVvdDtAZXh0ZW5zaW9uJnF1b3Q7OiZxdW90O1B4cGRlYWxlcnMmcXVvdDssJnF1b3Q7QGNvbnRyb2xsZXImcXVvdDs6JnF1b3Q7RGVhbGVyJnF1b3Q7LCZxdW90O0BhY3Rpb24mcXVvdDs6JnF1b3Q7bGlzdCZxdW90O30yZTQwOTI2ZjE1MTA1ODc1ODZjNmRjMGNiYzc5NWMxM2M0NzdjNGE5IiAvPgo8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW19fdHJ1c3RlZFByb3BlcnRpZXNdIiB2YWx1ZT0ieyZxdW90O2NhdGVnb3JpZXMmcXVvdDs6WzEsMSwxXX01ZTg4YmNmNWQwNjQ2YTE1YWMwYzQ5NGE2YTZiNGI3OWIwNmY2NTRiIiAvPgo8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvY2F0aW9uLXNlYXJjaC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjb3VudHJ5LXNlbGVjdCIgY2xhc3M9InNlbGVjdC1sYWJlbCBmb3JtLWJpZy1sYWJlbCI+U2VhcmNoIGZvciBsb2NhdGlvbjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyBsb2NhdGlvbi1zZWFyY2gtcm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlbGVjdC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjb3VudHJ5XSIgaWQ9ImNvdW50cnktc2VsZWN0IiBjbGFzcz0iZm9ybS1jb250cm9sIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIiPlNlbGVjdCBjb3VudHJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYiIGRhdGEtbmFtZT0iQWxiYW5pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkFMIj5BbGJhbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExIiBkYXRhLW5hbWU9IkFyZ2VudGluYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iQVIiPkFyZ2VudGluYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNCIgZGF0YS1uYW1lPSJBdXN0cmFsaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJBVSI+QXVzdHJhbGlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzIiBkYXRhLW5hbWU9IkF1c3RyaWEiIGRhdGEtY2F0ZWdvcmllcz0iMyIgZGF0YS1pc28yPSJBVCI+QXVzdHJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIzNCIgZGF0YS1uYW1lPSJCZWxhcnVzIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQlkiPkJlbGFydXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjAiIGRhdGEtbmFtZT0iQmVsZ2l1bSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJCRSI+QmVsZ2l1bTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyOSIgZGF0YS1uYW1lPSJCcmF6aWwiIGRhdGEtY2F0ZWdvcmllcz0iMSwzIiBkYXRhLWlzbzI9IkJSIj5CcmF6aWw8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjIiIGRhdGEtbmFtZT0iQnVsZ2FyaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iQkciPkJ1bGdhcmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM2IiBkYXRhLW5hbWU9IkNhbmFkYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJDQSI+Q2FuYWRhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ0IiBkYXRhLW5hbWU9IkNoaWxlIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ0wiPkNoaWxlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjQ3IiBkYXRhLW5hbWU9IkNvbG9tYmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ08iPkNvbG9tYmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjkzIiBkYXRhLW5hbWU9IkNyb2F0aWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iSFIiPkNyb2F0aWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNTYiIGRhdGEtbmFtZT0iRGVubWFyayIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkRLIj5EZW5tYXJrPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYyIiBkYXRhLW5hbWU9IkVneXB0IiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iRUciPkVneXB0PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjYxIiBkYXRhLW5hbWU9IkVzdG9uaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJFRSI+RXN0b25pYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2NyIgZGF0YS1uYW1lPSJGaW5sYW5kIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJGSSI+RmlubGFuZDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI3MiIgZGF0YS1uYW1lPSJGcmFuY2UiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iRlIiPkZyYW5jZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1NCIgZGF0YS1uYW1lPSJHZXJtYW55IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkRFIj5HZXJtYW55PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijg1IiBkYXRhLW5hbWU9IkdyZWVjZSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iR1IiPkdyZWVjZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5NSIgZGF0YS1uYW1lPSJIdW5nYXJ5IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJIVSI+SHVuZ2FyeTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI5NiIgZGF0YS1uYW1lPSJJbmRvbmVzaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IklEIj5JbmRvbmVzaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTA0IiBkYXRhLW5hbWU9Ikl0YWx5IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IklUIj5JdGFseTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDciIGRhdGEtbmFtZT0iSmFwYW4iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iSlAiPkphcGFuPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExOCIgZGF0YS1uYW1lPSJLYXpha2hzdGFuIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iS1oiPkthemFraHN0YW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE2IiBkYXRhLW5hbWU9Ikt1d2FpdCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IktXIj5LdXdhaXQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI4IiBkYXRhLW5hbWU9IkxhdHZpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkxWIj5MYXR2aWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTIwIiBkYXRhLW5hbWU9IkxlYmFub24iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iTEIiPkxlYmFub248L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTI2IiBkYXRhLW5hbWU9IkxpdGh1YW5pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkxUIj5MaXRodWFuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ4IiBkYXRhLW5hbWU9Ik1leGljbyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iTVgiPk1leGljbzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMzAiIGRhdGEtbmFtZT0iTW9yb2NjbyIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9Ik1BIj5Nb3JvY2NvPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1NyIgZGF0YS1uYW1lPSJOZXRoZXJsYW5kcyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJOTCI+TmV0aGVybGFuZHM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTM1IiBkYXRhLW5hbWU9Ik5vcnRoIE1hY2Vkb25pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9Ik1LIj5Ob3J0aCBNYWNlZG9uaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTU4IiBkYXRhLW5hbWU9Ik5vcndheSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9Ik5PIj5Ob3J3YXk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTY0IiBkYXRhLW5hbWU9IlBhbmFtYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlBBIj5QYW5hbWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTcwIiBkYXRhLW5hbWU9IlBvbGFuZCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlBMIj5Qb2xhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTc0IiBkYXRhLW5hbWU9IlBvcnR1Z2FsIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUFQiPlBvcnR1Z2FsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3MyIgZGF0YS1uYW1lPSJQdWVydG8gUmljbyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iUFIiPlB1ZXJ0byBSaWNvPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3OSIgZGF0YS1uYW1lPSJSb21hbmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUk8iPlJvbWFuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgwIiBkYXRhLW5hbWU9IlJ1c3NpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlJVIj5SdXNzaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgyIiBkYXRhLW5hbWU9IlNhdWRpIEFyYWJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iU0EiPlNhdWRpIEFyYWJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNDMiIGRhdGEtbmFtZT0iU2VyYmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUlMiPlNlcmJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxODkiIGRhdGEtbmFtZT0iU2xvdmVuaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJTSSI+U2xvdmVuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjM1IiBkYXRhLW5hbWU9IlNvdXRoIEFmcmljYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iWkEiPlNvdXRoIEFmcmljYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTUiIGRhdGEtbmFtZT0iU291dGggS29yZWEiIGRhdGEtY2F0ZWdvcmllcz0iMyIgZGF0YS1pc28yPSJLUiI+U291dGggS29yZWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNjUiIGRhdGEtbmFtZT0iU3BhaW4iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iRVMiPlNwYWluPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4NiIgZGF0YS1uYW1lPSJTd2VkZW4iIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IlNFIj5Td2VkZW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDEiIGRhdGEtbmFtZT0iU3dpdHplcmxhbmQiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJDSCI+U3dpdHplcmxhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTk5IiBkYXRhLW5hbWU9IlN5cmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iU1kiPlN5cmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIwNSIgZGF0YS1uYW1lPSJUaGFpbGFuZCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlRIIj5UaGFpbGFuZDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMTIiIGRhdGEtbmFtZT0iVHVya2V5IiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJUUiI+VHVya2V5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIxNyIgZGF0YS1uYW1lPSJVa3JhaW5lIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJVQSI+VWtyYWluZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyIiBkYXRhLW5hbWU9IlVuaXRlZCBBcmFiIEVtaXJhdGVzIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJBRSI+VW5pdGVkIEFyYWIgRW1pcmF0ZXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNzQiIGRhdGEtbmFtZT0iVW5pdGVkIEtpbmdkb20iIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iR0IiPlVuaXRlZCBLaW5nZG9tPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIyMCIgZGF0YS1uYW1lPSJVbml0ZWQgU3RhdGVzIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IlVTIj5Vbml0ZWQgU3RhdGVzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIyMSIgZGF0YS1uYW1lPSJVcnVndWF5IiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iVVkiPlVydWd1YXk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtNiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxvY2F0aW9uLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2hlY2tib3gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2ItbG9jYXRpb24iIGNsYXNzPSJjYi1sYWJlbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgY3VycmVudCBsb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSIiIHZhbHVlPSIiIC8+PGlucHV0IGRhdGEtYWpheHVybD0iL3NlcnZpY2UvZGVhbGVyLXNlYXJjaD9ub19jYWNoZT0xJmFtcDt0eF9weHBkZWFsZXJzX2FqYXhjYWxsJTVCYWN0aW9uJTVEPWdldENvdW50cnlDb2RlQWpheCZhbXA7dHhfcHhwZGVhbGVyc19hamF4Y2FsbCU1QmNvbnRyb2xsZXIlNUQ9RGVhbGVyJmFtcDt0eXBlPTExMjImYW1wO2NIYXNoPTBiNmJkOGZmZGJjNGE2YjU0NDgyOGIzMmNkZTQ1Njk4IiBpZD0iY2ItbG9jYXRpb24iIHR5cGU9ImNoZWNrYm94IiBuYW1lPSIiIHZhbHVlPSIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJnZW9sb2NhdGlvbi1sb2FkIiBzdHlsZT0iZGlzcGxheTpub25lOyI+TG9jYXRpb24gaXMgZGV0ZXJtaW5lZCAuLi48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imdlb2xvY2F0aW9uLWVycm9yIiBzdHlsZT0iZGlzcGxheTpub25lOyI+UGxlYXNlIGFsbG93IGFjY2VzcyB0byB5b3VyIGxvY2F0aW9uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yeS1zZWFyY2gtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJmb3JtLWJpZy1sYWJlbCI+SSYjMDM5O20gbG9va2luZyBmb3IgLi4uPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0ZWdvcmllcy1jYi1jb250YWluZXIiIGRhdGEtYWxsLWNhdGVnb3J5LXVpZHM9IjEsMiwzIj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0LWNiIGNoZWNrYm94LXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjYi1DYXIgcG9saXNoZXMiIGNsYXNzPSJjYi1sYWJlbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyIHBvbGlzaGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2NhdGVnb3JpZXNdIiB2YWx1ZT0iIiAvPjxpbnB1dCBjbGFzcz0iY2F0ZWdvcnktY2IgZW5hYmxlZCIgaWQ9ImNiLUNhciBwb2xpc2hlcyIgdHlwZT0iY2hlY2tib3giIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbY2F0ZWdvcmllc11bXSIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0LWNiIGNoZWNrYm94LXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjYi1Cb2F0IHBvbGlzaGVzIiBjbGFzcz0iY2ItbGFiZWwgY3VzdG9tLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvYXQgcG9saXNoZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY2F0ZWdvcnktY2IgZW5hYmxlZCIgaWQ9ImNiLUJvYXQgcG9saXNoZXMiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2NhdGVnb3JpZXNdW10iIHZhbHVlPSIyIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrbWFyayI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdC1jYiBjaGVja2JveC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY2ItU29saWQgQ29tcG91bmQiIGNsYXNzPSJjYi1sYWJlbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29saWQgQ29tcG91bmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iY2F0ZWdvcnktY2IgZW5hYmxlZCIgaWQ9ImNiLVNvbGlkIENvbXBvdW5kIiB0eXBlPSJjaGVja2JveCIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjYXRlZ29yaWVzXVtdIiB2YWx1ZT0iMyIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWZpZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibm90aWZpZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4mIzQyTm90ZTogTWVuemVybmEgcG9saXNoZXMgYXJlIG1hZGUgZm9yIHByb2Zlc3Npb25hbCB1c2Vycy48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+QnkgY2xpY2tpbmcgb24gJnF1b3Q7RmluZCBkZWFsZXJzIG5vdyZxdW90OyBJIGNvbmZpcm0gdGhhdCBJIGJlbG9uZyB0byB0aGlzIGN1c3RvbWVyIGdyb3VwLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VibWl0LWJ1dHRvbi1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJzdWJtaXQtYnRuIGJ0biIgdHlwZT0ic3VibWl0IiBuYW1lPSIiIHZhbHVlPSIiPkZpbmQgZGVhbGVyczwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZm9ybT4KICAgICAgICAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRlYWxlci1zZWFyY2gtbWFwLXdyYXAiIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVhbGVyLXNlYXJjaC1tYXAiIGlkPSJnbWFwIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAKCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9InJlc3VsdC1jb250YWluZXIgZGVhbGVyLXNlYXJjaC1yZXN1bHQiPgogICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXAtaGVhZGxpbmUiICBzdHlsZT0iZGlzcGxheTogbm9uZTsiPlF1YWxpZmllZCBkZWFsZXJzIGFuZCBhdXRob3JpemVkIG9ubGluZSBzaG9wcyBpbiZuYnNwOzxzcGFuIGlkPSJtYXAtaGVhZGxpbmUtY291bnRyeSI+PC9zcGFuPjwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWNjb3JkaW9uLXdyYXAgZGVhbGVyLXNlYXJjaC1hY2NvcmRpb25zIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJwYW5lbC1ncm91cCIgaWQ9ImFjY29yZGlvbiIgcm9sZT0idGFibGlzdCIgYXJpYS1tdWx0aXNlbGVjdGFibGU9InRydWUiPgoKICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNvbnRhY3QtaGVhZGxpbmUiIGRhdGEtc3RyaW5nPSJDb250YWN0Ij48L2Rpdj4KICAgIDxkaXYgaWQ9ImNhdGVnb3JpZXMtaGVhZGxpbmUiIGRhdGEtc3RyaW5nPSJUaGUgZGVhbGVyIHJhbmdlIGluY2x1ZGVzIHRoZSBmb2xsb3dpbmcgcHJvZHVjdCBjYXRlZ29yaWVzOiI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ0ZXh0LWxpbmstb25saW5lc2hvcCIgZGF0YS1zdHJpbmc9IlRvIHRoZSBPbmxpbmVzaG9wIj48L2Rpdj4KICAgIDxkaXYgaWQ9InRleHQtbGluay13ZWJzaXRlIiBkYXRhLXN0cmluZz0iVG8gdGhlIFdlYnNpdGUiPjwvZGl2PgogICAgPGRpdiBpZD0idGV4dC1jbG9zZS1hY2NvcmRpb24iIGRhdGEtc3RyaW5nPSJDbG9zZSBEZWFsZXItSW5mb3JtYXRpb24iPjwvZGl2PgogICAgPGRpdiBpZD0iZGVlcGxpbmsiIGRhdGEtc3RyaW5nPSIiPjwvZGl2PgogICAgCgogICAgCiAgICAgICAgICAgIDxzY3JpcHQgYXN5bmMgZGVmZXIgc3JjPSJodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PUFJemFTeUNJa2pvUW5BbkRseW0wSDd1RXFRcEF5YzBCMGc1N0dRZyZsaWJyYXJpZXM9cGxhY2VzJmNhbGxiYWNrPWluaXRNYXAiPjwvc2NyaXB0PgogICAgICAgICAgICA8c2NyaXB0PgogICAgICAgICAgICAgICAgdmFyIG1hcDsKICAgICAgICAgICAgICAgIHZhciBnZW9jb2RlcjsKICAgICAgICAgICAgICAgIHZhciBtYXJrZXJzID0gW107CiAgICAgICAgICAgICAgICB2YXIgbWFwU3R5bGUgPSAgWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImdlb21ldHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiNmNWY1ZjUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy5pY29uIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpc2liaWxpdHkiOiAib2ZmIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM2MTYxNjEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LnN0cm9rZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZjVmNWY1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJhZG1pbmlzdHJhdGl2ZS5sYW5kX3BhcmNlbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiNiZGJkYmQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInBvaSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZWVlZWVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJwb2kiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNzU3NTc1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJwb2kucGFyayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZTVlNWU1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJwb2kucGFyayIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM5ZTllOWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInJvYWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2ZmZmZmZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicm9hZC5hcnRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM3NTc1NzUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInJvYWQuaGlnaHdheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZGFkYWRhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkLmhpZ2h3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNjE2MTYxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkLmxvY2FsIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LmZpbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiIzllOWU5ZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAidHJhbnNpdC5saW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImdlb21ldHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiNlNWU1ZTUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInRyYW5zaXQuc3RhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZWVlZWVlIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJ3YXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjYzljOWM5IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJ3YXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM5ZTllOWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdOwoKICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IFtdOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGluaXRNYXAoKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ21hcCcpLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcjoge2xhdDogNDguNzc5NTk0MiwgbG5nOiA4LjIwNTg2NzR9LAogICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA2LAogICAgICAgICAgICAgICAgICAgICAgICBtYXhab29tOiAxOCwKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBtYXBTdHlsZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV1TWVtYmVycyA9IFsxMywyMCwyMiw1Miw1Myw1NCw1Niw2MSw2NSw2Nyw3Miw4NSw5Myw5NSw5NywxMDQsMTI2LDEyNywxMjgsMTQ0LDE1NywxNzAsMTc0LDE3OSwxODYsMTg5LDE5MV07CiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbENhdGVnb3J5VWlkcyA9ICQoJy5jYXRlZ29yaWVzLWNiLWNvbnRhaW5lcicpLmRhdGEoJ2FsbC1jYXRlZ29yeS11aWRzJykuc3BsaXQoJywnKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpbHRlcmZvcm0gPSAkKCcjc2VsZWN0Rm9ybScpOwogICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHJ5U2VsZWN0ID0gJCgnI2NvdW50cnktc2VsZWN0Jyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uQ2hlY2tib3ggPSAkKCcjY2ItbG9jYXRpb24nKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uU2VhcmNoQ29udGFpbmVyID0gJCgnLmxvY2F0aW9uLXNlYXJjaC1jb250YWluZXInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIgPSAkKCcuY2F0ZWdvcnktc2VhcmNoLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgIHZhciBub3RpZmllckNvbnRhaW5lciA9ICQoJy5ub3RpZmllci1jb250YWluZXInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3VibWl0QnV0dG9uQ29udGFpbmVyID0gJCgnLnN1Ym1pdC1idXR0b24tY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdENvbnRhaW5lciA9ICQoJy5yZXN1bHQtY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hcENvbnRhaW5lciA9ICQoJy5kZWFsZXItc2VhcmNoLW1hcC13cmFwJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHJ5Q2F0ZWdvcmllcyA9ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHJ5TmFtZSA9ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciBkaXNhYmxlZENhdGVnb3JpZXMgPSAnJzsKCiAgICAgICAgICAgICAgICAgICAgdmFyIG1vYmlsZUNoZWNrID0gJCgnI21vYmlsZS1jaGVjaycpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgYWpheFVybCA9IGZpbHRlcmZvcm0uZGF0YSgnYWpheHVybCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBnZXRDb3VudHJ5Q29kZUFqYXhVcmwgPSBsb2NhdGlvbkNoZWNrYm94LmRhdGEoJ2FqYXh1cmwnKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZXBsaW5rID0gJCgnI2RlZXBsaW5rJykuZGF0YSgnc3RyaW5nJykgPT0gMTsKCiAgICAgICAgICAgICAgICAgICAgaWYoZGVlcGxpbmspewogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q2F0ZWdvcmllcyA9IGNvdW50cnlTZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGF0YSgnY2F0ZWdvcmllcycpICsgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lID0gY291bnRyeVNlbGVjdC5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kYXRhKCduYW1lJykgKyAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5pY2h0IGltIExhbmQgdm9yaGFuZGVuZSBDYXRlZ29yaWVzIGRpc2FibGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkQ2F0ZWdvcmllcyA9IGFycl9kaWZmIChhbGxDYXRlZ29yeVVpZHMsIGNvdW50cnlDYXRlZ29yaWVzLnNwbGl0KCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc2FibGVkQ2F0ZWdvcmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhdGVnb3J5LWNiW3ZhbHVlPSInICsgZGlzYWJsZWRDYXRlZ29yaWVzW2ldICsgJyJdJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY2F0ZWdvcnktY2JbdmFsdWU9IicgKyBkaXNhYmxlZENhdGVnb3JpZXNbaV0gKyAnIl0nKS5jbG9zZXN0KCcuY2hlY2tib3gtd3JhcHBlcicpLmFkZENsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVNlYXJjaENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uQ29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheUNvbnRhaW5zKHBhcnNlSW50KGNvdW50cnlTZWxlY3QudmFsKCkpLGV1TWVtYmVycykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWpheENhbGwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3b3JrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtb2JpbGVDaGVjay5pcygnOnZpc2libGUnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1vYmlsZS1yZXNldC1zZWFyY2gnKS5mYWRlSW4oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuZGVhbGVyLXNlYXJjaC1mb3JtJykuZmFkZU91dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5tYXAtaGVhZGxpbmUnKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNtYXAtaGVhZGxpbmUtY291bnRyeScpLnRleHQoY291bnRyeU5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICAgICAgICAgIGNvdW50cnlTZWxlY3Qub24oJ2NoYW5nZScsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlDYXRlZ29yaWVzID0gJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kYXRhKCdjYXRlZ29yaWVzJykgKyAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeU5hbWUgPSAkKHRoaXMpLmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRhdGEoJ25hbWUnKSArICcnOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCh0aGlzKS52YWwoKSA9PT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0QnV0dG9uQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUub3JpZ2luYWxFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlbm4gVXNlciBTZWxlY3QtVmFsdWUgw6RuZGVydCwgU3RhbmRvcnQtQ2hlY2tib3ggcmVzZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkNoZWNrYm94LnZhbCgnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uQ2hlY2tib3gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1lcnJvcicpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuaGlkZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbGUgQ2F0ZWdvcmllcyB3aWVkZXIgZW5hYmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhdGVnb3J5LWNiJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuY2hlY2tib3gtd3JhcHBlcicpLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuaWNodCBpbSBMYW5kIHZvcmhhbmRlbmUgQ2F0ZWdvcmllcyBkaXNhYmxlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRDYXRlZ29yaWVzID0gYXJyX2RpZmYgKGFsbENhdGVnb3J5VWlkcywgY291bnRyeUNhdGVnb3JpZXMuc3BsaXQoJywnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc2FibGVkQ2F0ZWdvcmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhdGVnb3J5LWNiW3ZhbHVlPSInICsgZGlzYWJsZWRDYXRlZ29yaWVzW2ldICsgJyJdJykuY2xvc2VzdCgnLmNoZWNrYm94LXdyYXBwZXInKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVNlYXJjaENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFycmF5Q29udGFpbnMocGFyc2VJbnQoJCh0aGlzKS52YWwoKSksZXVNZW1iZXJzKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllckNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcubWFwLWhlYWRsaW5lJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI21hcC1oZWFkbGluZS1jb3VudHJ5JykudGV4dChjb3VudHJ5TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkNoZWNrYm94Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuY2hlY2tlZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbCgnMScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKGZ1bmN0aW9uKHBvc2l0aW9uKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbiBlcm1pdHRlbHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlICE9PSB1bmRlZmluZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9jYXRpb25Db3VudHJ5Q29kZShnZXRDb3VudHJ5Q29kZUFqYXhVcmwsIHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSwgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZlaGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1lcnJvcicpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnJykuY2hhbmdlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGZpbHRlcmZvcm0uc3VibWl0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgIGFqYXhDYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Q29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICBpZihtb2JpbGVDaGVjay5pcygnOnZpc2libGUnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdib2R5LGh0bWwnKS5hbmltYXRlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6ICQoJy5kZWFsZXItc2VhcmNoLW1hcC13cmFwJykub2Zmc2V0KCkudG9wIC0gJCgnLnBhZ2UtaGVhZGVyJykub3V0ZXJIZWlnaHQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgODAwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcubW9iaWxlLXJlc2V0LXNlYXJjaCcpLmZhZGVJbignc2xvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmRlYWxlci1zZWFyY2gtZm9ybScpLmZhZGVPdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGd0bUV2ZW50TGFiZWwgPSAkKCcjY291bnRyeS1zZWxlY3Qgb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpICsgJyAtJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNjYi1BdXRvcG9saXR1cmVuJykuaXMoIjpjaGVja2VkIikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RtRXZlbnRMYWJlbCA9IGd0bUV2ZW50TGFiZWwgKyAnIEF1dG9wb2xpdHVyZW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNjYi1Cb290c3BvbGl0dXJlbicpLmlzKCI6Y2hlY2tlZCIpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0bUV2ZW50TGFiZWwgPSBndG1FdmVudExhYmVsICsgJyBCb290c3BvbGl0dXJlbic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoJCgnI2NiLUZlc3RwYXN0ZW4nKS5pcygiOmNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndG1FdmVudExhYmVsID0gZ3RtRXZlbnRMYWJlbCArICcgRmVzdHBhc3Rlbic7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ0hhZW5kbGVyc3VjaGUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICdzdWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjbGljaycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZ3RtRXZlbnRMYWJlbAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gZ2V0TG9jYXRpb25Db3VudHJ5Q29kZShhamF4VXJsLCBsYXQsIGxvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkLnBvc3QoYWpheFVybCwgeyAndHhfcHhwZGVhbGVyc19hamF4Y2FsbFtsYXRdJzogbGF0LCAndHhfcHhwZGVhbGVyc19hamF4Y2FsbFtsb25dJzogbG9uIH0sIGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25WYWx1ZSA9ICQoJyNjb3VudHJ5LXNlbGVjdCBvcHRpb25bZGF0YS1pc28yPScrcmVzcG9uc2UrJ10nKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlTZWxlY3QudmFsKG9wdGlvblZhbHVlKS5jaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhamF4Q2FsbCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJNYXJrZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhY2NvcmRpb24nKS5odG1sKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5wb3N0KGFqYXhVcmwsIGZpbHRlcmZvcm0uc2VyaWFsaXplKCksIGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXBCb3VuZHMgPSBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT0gbnVsbCAmJiByZXNwb25zZS5sZW5ndGggIT0gMCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gocmVzcG9uc2UsIGZ1bmN0aW9uKGksIGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5sYXQgIT09ICcnICYmIGl0ZW0ubG9uICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWFya2VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5sYXQsIGl0ZW0ubG9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmFkZGl0aW9uYWxMYXRPbmUgIT09ICcnICYmIGl0ZW0uYWRkaXRpb25hbExvbk9uZSAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsTWFya2VyT25lID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0uYWRkaXRpb25hbExhdE9uZSwgaXRlbS5hZGRpdGlvbmFsTG9uT25lKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goYWRkaXRpb25hbE1hcmtlck9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChhZGRpdGlvbmFsTWFya2VyT25lLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uYWRkaXRpb25hbExhdFR3byAhPT0gJycgJiYgaXRlbS5hZGRpdGlvbmFsTG9uVHdvICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxNYXJrZXJUd28gPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5hZGRpdGlvbmFsTGF0VHdvLCBpdGVtLmFkZGl0aW9uYWxMb25Ud28pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChhZGRpdGlvbmFsTWFya2VyVHdvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKGFkZGl0aW9uYWxNYXJrZXJUd28ucG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5hZGRpdGlvbmFsTGF0VGhyZWUgIT09ICcnICYmIGl0ZW0uYWRkaXRpb25hbExvblRocmVlICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxNYXJrZXJUaHJlZSA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmFkZGl0aW9uYWxMYXRUaHJlZSwgaXRlbS5hZGRpdGlvbmFsTG9uVGhyZWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChhZGRpdGlvbmFsTWFya2VyVGhyZWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQoYWRkaXRpb25hbE1hcmtlclRocmVlLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uYWRkaXRpb25hbExhdEZvdXIgIT09ICcnICYmIGl0ZW0uYWRkaXRpb25hbExvbkZvdXIgIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbE1hcmtlckZvdXIgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5hZGRpdGlvbmFsTGF0Rm91ciwgaXRlbS5hZGRpdGlvbmFsTG9uRm91ciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKGFkZGl0aW9uYWxNYXJrZXJGb3VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKGFkZGl0aW9uYWxNYXJrZXJGb3VyLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uYWRkaXRpb25hbExhdEZpdmUgIT09ICcnICYmIGl0ZW0uYWRkaXRpb25hbExvbkZpdmUgIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbE1hcmtlckZpdmUgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5hZGRpdGlvbmFsTGF0Rml2ZSwgaXRlbS5hZGRpdGlvbmFsTG9uRml2ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKGFkZGl0aW9uYWxNYXJrZXJGaXZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKGFkZGl0aW9uYWxNYXJrZXJGaXZlLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2gobWFya2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQobWFya2VyLnBvc2l0aW9uKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWNjb3JkaW9uJykuYXBwZW5kKGdldEh0bWxUZW1wbGF0ZShpdGVtLGkpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9jYXRpb25MaXN0RW50cnkgPSAkKCcjbG9jYXRpb24nICsgaXRlbS5sb2NhdGlvbmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uTGlzdEVudHJ5LmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFya2VycywgZnVuY3Rpb24oaSxtYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbigtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY29sbGFwc2UnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnc2hvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKCcuY29sbGFwc2UtbGluaycpLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5maW5kKCcuY29sbGFwc2UnKS5pcygnOnZpc2libGUnKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuc2libGluZ3MoJy5wYW5lbCcpLmZpbmQoJy5jb2xsYXBzZS1saW5rJykuYWRkQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLnNpYmxpbmdzKCcucGFuZWwnKS5maW5kKCcuYWNjb3JkaW9uLWNvbGxhcHNlJykucmVtb3ZlQ2xhc3MoJ3Nob3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLmZpbmQoJy5hY2NvcmRpb24tY29sbGFwc2UnKS5oYXNDbGFzcygnc2hvdycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuZmluZCgnLmFjY29yZGlvbi1jb2xsYXBzZScpLmhhc0NsYXNzKCdjb2xsYXBzaW5nJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLmZpbmQoJy5hY2NvcmRpb24tY29sbGFwc2UnKS5hZGRDbGFzcygnc2hvdycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlck9uZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyT25lLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlck9uZS5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlclR3byAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyVHdvLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlclR3by5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlclRocmVlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJUaHJlZS5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJUaHJlZS5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlckZvdXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlckZvdXIuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyRm91ci5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlckZpdmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlckZpdmUuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyRml2ZS5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIgKG1hcmtlciwgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyT25lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyKGFkZGl0aW9uYWxNYXJrZXJPbmUsIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlclR3byAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lcihhZGRpdGlvbmFsTWFya2VyVHdvLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJUaHJlZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lcihhZGRpdGlvbmFsTWFya2VyVGhyZWUsIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlckZvdXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIoYWRkaXRpb25hbE1hcmtlckZvdXIsIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlckZpdmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIoYWRkaXRpb25hbE1hcmtlckZpdmUsIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNPbmx5T25saW5lc2hvcCA9PT0gdHJ1ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihtYXJrZXJzW2ldICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzW2ldLnNldE1hcChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5maXRCb3VuZHMobWFwQm91bmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyTWFya2VycygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFya2Vyc1tpXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnNbaV0uc2V0TWFwKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hcmtlckNsaWNrTGlzdGVuZXIobWFya2VyVGVtcCwgbWFya2VyQXJyYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIobWFya2VyVGVtcCwgJ2NsaWNrJywgKGZ1bmN0aW9uKG1hcmtlciwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChtYXJrZXJBcnJheSwgZnVuY3Rpb24oaSxtYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbigtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRPcHRpb25zKHtpY29uOiAidHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZyJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0T3B0aW9ucyh7aWNvbjogInR5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nIn0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJy5jb2xsYXBzZS1saW5rJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJyNsb2NhdGlvbicrbWFya2VyLmxvY2F0aW9uX2lkKS5hZGRDbGFzcygnYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJCgnLmNvbGxhcHNlLWxpbmsnKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgZmFsc2UpLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKCcjbG9jYXRpb24nK21hcmtlci5sb2NhdGlvbl9pZCkuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKS5yZW1vdmVDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvY2F0aW9uJyttYXJrZXIubG9jYXRpb25faWQpLmNsaWNrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCdodG1sLCBib2R5JykuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRvcDogJCgnI2xvY2F0aW9uJyttYXJrZXIubG9jYXRpb25faWQpLm9mZnNldCgpLnRvcCAtICgkKCcucGFnZS1oZWFkZXInKS5vdXRlckhlaWdodCgpICsgMzUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKG1hcmtlclRlbXAsIGkpKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMobmVlZGxlLCBhcnJoYXlzdGFjaykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFycmhheXN0YWNrLmluZGV4T2YobmVlZGxlKSA+IC0xKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gYXJyX2RpZmYgKGExLCBhMikgewoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBbXSwgZGlmZiA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYVthMVtpXV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYVthMltpXV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYVthMltpXV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYTJbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLnB1c2goayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgCiAgICA8c2NyaXB0PgogICAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywnLm1vYmlsZS1jbG9zZS1hY2NvcmRpb24tdHJpZ2dlcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyAkKHRoaXMpLmNsb3Nlc3QoJy5jb2xsYXBzZScpLnNsaWRlVXAoKTsKICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYWNjb3JkaW9uLWl0ZW0nKS5maW5kKCcuYWNjb3JkaW9uLWNvbGxhcHNlJykucmVtb3ZlQ2xhc3MoJ3Nob3cnKTsKICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcuYWNjb3JkaW9uLWl0ZW0nKS5maW5kKCcuY29sbGFwc2UtbGluaycpLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICB9KTsKCiAgICAgICAgJChkb2N1bWVudC5ib2R5KS5vbignY2xpY2snLCcjcmVzZXQtc2VhcmNoJywgZnVuY3Rpb24oKSB7CgogICAgICAgICAgICBjb3VudHJ5U2VsZWN0LnZhbCgnJykuY2hhbmdlKCk7CiAgICAgICAgICAgIGNhdGVnb3J5U2VhcmNoQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgc3VibWl0QnV0dG9uQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAkKCcuZGVhbGVyLXNlYXJjaC1mb3JtJykuZmFkZUluKCk7CiAgICAgICAgICAgICQodGhpcykucGFyZW50KCkuZmFkZU91dCgpOwogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCdjbGljaycsJy5pdGVtLWxpbmsnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYoJCh0aGlzKS5kYXRhKCdhbmFseXRpY3NldmVudCcpICE9PSAnJyl7CiAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goewogICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnSGFlbmRsZXJzdWNoZScsCiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd3ZWl0ZXJsZWl0dW5nJywKICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjbGljaycsCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICQodGhpcykuZGF0YSgnYW5hbHl0aWNzZXZlbnQnKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0SHRtbFRlbXBsYXRlKGl0ZW0saSl7CiAgICAgICAgICAgIHZhciBjb250YWN0SGVhZGxpbmUgPSAkKCcjY29udGFjdC1oZWFkbGluZScpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0hlYWRsaW5lID0gJCgnI2NhdGVnb3JpZXMtaGVhZGxpbmUnKS5kYXRhKCdzdHJpbmcnKTsKICAgICAgICAgICAgdmFyIHRleHRMaW5rT25saW5lc2hvcCA9ICQoJyN0ZXh0LWxpbmstb25saW5lc2hvcCcpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgdGV4dExpbmtXZWJzaXRlID0gJCgnI3RleHQtbGluay13ZWJzaXRlJykuZGF0YSgnc3RyaW5nJyk7CiAgICAgICAgICAgIHZhciBjbG9zZUFjY29yZGlvblRyaWdnZXJUZXh0ID0gJCgnI3RleHQtY2xvc2UtYWNjb3JkaW9uJykuZGF0YSgnc3RyaW5nJyk7CiAgICAgICAgICAgIHZhciBpdGVyYXRvckNsYXNzID0gJyc7CiAgICAgICAgICAgIGlmIChpID09ICcwJykgewogICAgICAgICAgICAgICAgaXRlcmF0b3JDbGFzcyA9ICcgZmlyc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYW5hbHl0aWNzRXZlbnQgPSAnJzsKICAgICAgICAgICAgaWYoaXRlbS5hbmFseXRpY3NFdmVudCAhPSAnJyl7CiAgICAgICAgICAgICAgICBhbmFseXRpY3NFdmVudCA9IGl0ZW0uYW5hbHl0aWNzRXZlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9ImFjY29yZGlvbi1pdGVtIHBhbmVsIj4nOwoKICAgICAgICAgICAgaHRtbCAgICs9ICcgPGEgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0iYWNjb3JkaW9uLXRpdGxlIGNvbGxhcHNlLWxpbmsgY29sbGFwc2VkIiBkYXRhLWJzLXRvZ2dsZT0iY29sbGFwc2UiIGlkPSJsb2NhdGlvbicgKyBpdGVtLmxvY2F0aW9uaWQgKyciIGRhdGEtYnMtdGFyZ2V0PSIjY29sbGFwc2UnICsgaXRlbS5sb2NhdGlvbmlkICsnIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSIgYXJpYS1jb250cm9scz0ibG9jYXRpb24nICsgaXRlbS5sb2NhdGlvbmlkICsnIj4nOwogICAgICAgICAgICBodG1sICAgKz0gJzxkaXYgY2xhc3M9ImFjYy10aXRsZSI+JyArIGl0ZW0udGl0bGUgKyc8L2Rpdj4nOwoKICAgICAgICAgICAgaHRtbCAgICs9ICc8ZGl2IGNsYXNzPSJhY2Mtc3VidGl0bGUiPicgKyBpdGVtLnN1YnRpdGxlICsnPC9kaXY+PC9hPic7CgogICAgICAgICAgICBodG1sICAgKz0nPGRpdiBkYXRhLWJzLXBhcmVudD0iI2FjY29yZGlvbiIgaWQ9ImNvbGxhcHNlJyArIGl0ZW0ubG9jYXRpb25pZCArJyIgY2xhc3M9ImFjY29yZGlvbi1jb2xsYXBzZSBjb2xsYXBzZSIgc3R5bGU9IiI+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgY2xhc3M9ImFjY29yZGlvbi1ib2R5Ij4nOwoKCiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJyb3cgZGVzY3JpcHRpb24tcm93Ij4nOwogICAgICAgICAgICBodG1sICAgKz0nPGRpdiBjbGFzcz0iY29sLW1kLTYgY29sLWxnLTgiPic7CiAgICAgICAgICAgIGh0bWwgICArPScgPGRpdiBjbGFzcz0iZGVhbGVyLWRlc2NyaXB0aW9uIj4nICsgaXRlbS5kZXNjcmlwdGlvbiArICc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICAgKz0nPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgY2xhc3M9ImNvbC1tZC02IGNvbC1sZy00Ij4nOwoKICAgICAgICAgICAgaWYoaXRlbS5pbWFnZVVybCAhPT0gJycpewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGltZyBzcmM9IicgKyBpdGVtLmltYWdlVXJsICsgJyIgY2xhc3M9ImltZy1yZXNwb25zaXZlIiB3aWR0aD0iMjUwIiAvPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGh0bWwgICArPSc8L2Rpdj48L2Rpdj4nOwoKICAgICAgICAgICAgaHRtbCAgICs9JyA8ZGl2IGNsYXNzPSJyb3cgY29udGFjdC1yb3ciPic7CiAgICAgICAgICAgIGh0bWwgICArPSc8ZGl2IGNsYXNzPSJjb2wtbWQtNiBjb2wtbGctOCI+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgY2xhc3M9ImNhdGVnb3JpZXMtaGVhZGxpbmUiPicgKyBjYXRlZ29yaWVzSGVhZGxpbmUgKyAnPC9kaXY+JzsKICAgICAgICAgICAgaHRtbCAgICs9JzxkaXYgY2xhc3M9Iml0ZW0tY2F0ZWdvcmllcyI+JzsKCiAgICAgICAgICAgIGlmKGl0ZW0uY2F0ZWdvcmllcyAhPT0gJycpewogICAgICAgICAgICAgICAgdmFyIGNhdGVnb3JpZXNBcnJheSA9IGl0ZW0uY2F0ZWdvcmllczsKCiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjYXRlZ29yaWVzQXJyYXkpKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0iaXRlbS1jYXQgJyArIGtleSAgKyAnIj4nICsgdmFsdWUgICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CgogICAgICAgICAgICBodG1sICArPSc8L2Rpdj4nOwogICAgICAgICAgICBodG1sICArPSc8L2Rpdj4nOwoKICAgICAgICAgICAgaHRtbCAgKz0nPGRpdiBjbGFzcz0iY29sLW1kLTYgY29sLWxnLTQiPic7CgogICAgICAgICAgICBodG1sICArPSc8ZGl2IGNsYXNzPSJjb250YWN0LWhlYWRsaW5lIj4nICsgY29udGFjdEhlYWRsaW5lICsgJzwvZGl2Pic7CgogICAgICAgICAgICBpZiAoaXRlbS5hZGRyZXNzKSB7CiAgICAgICAgICAgICAgICBodG1sICArPScgPGRpdj48ZGl2IGNsYXNzPSJpdGVtLWFkZHJlc3MiPicgKyBpdGVtLmFkZHJlc3MgKyAnPC9kaXY+PC9kaXY+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGl0ZW0ucGhvbmUpIHsKICAgICAgICAgICAgICAgIGh0bWwgICs9JzxkaXY+PGRpdiBjbGFzcz0iaXRlbS1waG9uZSI+PGEgaHJlZj0idGVsOicrIGl0ZW0ucGhvbmUgKyciPicgKyBpdGVtLnBob25lICsgJzwvYT48L2Rpdj48L2Rpdj4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoaXRlbS5lbWFpbCkgewogICAgICAgICAgICAgICAgaHRtbCAgKz0nPGRpdj48ZGl2IGNsYXNzPSJpdGVtLWVtYWlsIj48YSBocmVmPSJtYWlsdG86JysgaXRlbS5lbWFpbCArJyI+JyArIGl0ZW0uZW1haWwgKyAnPC9hPjwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGh0bWwgICs9JyAgPGRpdiBjbGFzcz0idmlzaXQtc3RvcmUtbGlua3MiPic7CgogICAgICAgICAgICBpZihpdGVtLmxpbmtXZWJzaXRlICE9PSAnJyl7CiAgICAgICAgICAgICAgICBodG1sICs9ICc8YSBocmVmPSInICsgaXRlbS5saW5rV2Vic2l0ZSArICciIGNsYXNzPSJpdGVtLWxpbmsgYnRuIiB0YXJnZXQ9Il9ibGFuayIgZGF0YS1hbmFseXRpY3NldmVudD0iJyArIGFuYWx5dGljc0V2ZW50ICsgJyI+JyArIHRleHRMaW5rV2Vic2l0ZSArICc8L2E+JzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoaXRlbS5saW5rT25saW5lU2hvcCAhPT0gJycpewogICAgICAgICAgICAgICAgaHRtbCArPSAnPGEgaHJlZj0iJyArIGl0ZW0ubGlua09ubGluZVNob3AgKyAnIiBjbGFzcz0iaXRlbS1saW5rIGJ0biIgdGFyZ2V0PSJfYmxhbmsiIGRhdGEtYW5hbHl0aWNzZXZlbnQ9IicgKyBhbmFseXRpY3NFdmVudCArICciPicgKyB0ZXh0TGlua09ubGluZXNob3AgKyAnPC9hPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nPC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nPGRpdiBjbGFzcz0icm93Ij4nOwoKICAgICAgICAgICAgaHRtbCArPScgPGRpdiBjbGFzcz0iY29sLXNtLTEyIj4nOwoKICAgICAgICAgICAgaHRtbCArPScgIDxkaXYgY2xhc3M9Im1vYmlsZS1jbG9zZS1hY2NvcmRpb24iPjxzcGFuIGNsYXNzPSJtb2JpbGUtY2xvc2UtYWNjb3JkaW9uLXRyaWdnZXIiPicrIGNsb3NlQWNjb3JkaW9uVHJpZ2dlclRleHQgKyc8L3NwYW4+PC9kaXY+JzsKCiAgICAgICAgICAgIGh0bWwgKz0nPC9kaXY+PC9kaXY+IDwvZGl2PjwvZGl2PjwvZGl2Pic7CgoKICAgICAgICAgICAgcmV0dXJuIGh0bWw7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMobmVlZGxlLCBhcnJoYXlzdGFjaykgewogICAgICAgICAgICByZXR1cm4gKGFycmhheXN0YWNrLmluZGV4T2YobmVlZGxlKSA+IC0xKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYXJyX2RpZmYgKGExLCBhMikgewoKICAgICAgICAgICAgdmFyIGEgPSBbXSwgZGlmZiA9IFtdOwoKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgYVthMVtpXV0gPSB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoYVthMltpXV0pIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgYVthMltpXV07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGFbYTJbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yICh2YXIgayBpbiBhKSB7CiAgICAgICAgICAgICAgICBkaWZmLnB1c2goayk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBkaWZmOwogICAgICAgIH0KICAgIDwvc2NyaXB0PgoKICAgICAgICAgICAgICAgICAg
By clicking on "Load Google Maps" I consent to the processing of my data by Google. This consent can be revoked at any time with effect for the future. Further information can be found in our privacy policy.