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+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjExIiBkYXRhLW5hbWU9IkFyZ2VudGluYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iQVIiPkFyZ2VudGluYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNCIgZGF0YS1uYW1lPSJBdXN0cmFsaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSwzIiBkYXRhLWlzbzI9IkFVIj5BdXN0cmFsaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMiIGRhdGEtbmFtZT0iQXVzdHJpYSIgZGF0YS1jYXRlZ29yaWVzPSIzIiBkYXRhLWlzbzI9IkFUIj5BdXN0cmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM0IiBkYXRhLW5hbWU9IkJlbGFydXMiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJCWSI+QmVsYXJ1czwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMCIgZGF0YS1uYW1lPSJCZWxnaXVtIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkJFIj5CZWxnaXVtPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI5IiBkYXRhLW5hbWU9IkJyYXppbCIgZGF0YS1jYXRlZ29yaWVzPSIxLDMiIGRhdGEtaXNvMj0iQlIiPkJyYXppbDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMiIgZGF0YS1uYW1lPSJCdWxnYXJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJCRyI+QnVsZ2FyaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzYiIGRhdGEtbmFtZT0iQ2FuYWRhIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiwzIiBkYXRhLWlzbzI9IkNBIj5DYW5hZGE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDQiIGRhdGEtbmFtZT0iQ2hpbGUiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJDTCI+Q2hpbGU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNDYiIGRhdGEtbmFtZT0iQ2hpbmEiIGRhdGEtY2F0ZWdvcmllcz0iMSwzIiBkYXRhLWlzbzI9IkNOIj5DaGluYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0NyIgZGF0YS1uYW1lPSJDb2xvbWJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkNPIj5Db2xvbWJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0OCIgZGF0YS1uYW1lPSJDb3N0YSBSaWNhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iQ1IiPkNvc3RhIFJpY2E8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iOTMiIGRhdGEtbmFtZT0iQ3JvYXRpYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJIUiI+Q3JvYXRpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI1NiIgZGF0YS1uYW1lPSJEZW5tYXJrIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iREsiPkRlbm1hcms8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNjIiIGRhdGEtbmFtZT0iRWd5cHQiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJFRyI+RWd5cHQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iNjEiIGRhdGEtbmFtZT0iRXN0b25pYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IkVFIj5Fc3RvbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjY3IiBkYXRhLW5hbWU9IkZpbmxhbmQiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IkZJIj5GaW5sYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjcyIiBkYXRhLW5hbWU9IkZyYW5jZSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJGUiI+RnJhbmNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjU0IiBkYXRhLW5hbWU9Ikdlcm1hbnkiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iREUiPkdlcm1hbnk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iODUiIGRhdGEtbmFtZT0iR3JlZWNlIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJHUiI+R3JlZWNlPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijk1IiBkYXRhLW5hbWU9Ikh1bmdhcnkiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9IkhVIj5IdW5nYXJ5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijk2IiBkYXRhLW5hbWU9IkluZG9uZXNpYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iSUQiPkluZG9uZXNpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMDQiIGRhdGEtbmFtZT0iSXRhbHkiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iSVQiPkl0YWx5PC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEwNyIgZGF0YS1uYW1lPSJKYXBhbiIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJKUCI+SmFwYW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTE4IiBkYXRhLW5hbWU9IkthemFraHN0YW4iIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJLWiI+S2F6YWtoc3Rhbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMTYiIGRhdGEtbmFtZT0iS3V3YWl0IiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iS1ciPkt1d2FpdDwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjgiIGRhdGEtbmFtZT0iTGF0dmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iTFYiPkxhdHZpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjAiIGRhdGEtbmFtZT0iTGViYW5vbiIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJMQiI+TGViYW5vbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxMjYiIGRhdGEtbmFtZT0iTGl0aHVhbmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iTFQiPkxpdGh1YW5pYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNDkiIGRhdGEtbmFtZT0iTWFsYXlzaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJNWSI+TWFsYXlzaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTQ0IiBkYXRhLW5hbWU9Ik1hbHRhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iTVQiPk1hbHRhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0OCIgZGF0YS1uYW1lPSJNZXhpY28iIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9Ik1YIj5NZXhpY288L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTMwIiBkYXRhLW5hbWU9Ik1vcm9jY28iIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJNQSI+TW9yb2Njbzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNTciIGRhdGEtbmFtZT0iTmV0aGVybGFuZHMiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iTkwiPk5ldGhlcmxhbmRzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzNSIgZGF0YS1uYW1lPSJOb3J0aCBNYWNlZG9uaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJNSyI+Tm9ydGggTWFjZWRvbmlhPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE1OCIgZGF0YS1uYW1lPSJOb3J3YXkiIGRhdGEtY2F0ZWdvcmllcz0iMSwyIiBkYXRhLWlzbzI9Ik5PIj5Ob3J3YXk8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTY0IiBkYXRhLW5hbWU9IlBhbmFtYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlBBIj5QYW5hbWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTcwIiBkYXRhLW5hbWU9IlBvbGFuZCIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlBMIj5Qb2xhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTc0IiBkYXRhLW5hbWU9IlBvcnR1Z2FsIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUFQiPlBvcnR1Z2FsPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3MyIgZGF0YS1uYW1lPSJQdWVydG8gUmljbyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iUFIiPlB1ZXJ0byBSaWNvPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE3OSIgZGF0YS1uYW1lPSJSb21hbmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUk8iPlJvbWFuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgwIiBkYXRhLW5hbWU9IlJ1c3NpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlJVIj5SdXNzaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTgyIiBkYXRhLW5hbWU9IlNhdWRpIEFyYWJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iU0EiPlNhdWRpIEFyYWJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyNDMiIGRhdGEtbmFtZT0iU2VyYmlhIiBkYXRhLWNhdGVnb3JpZXM9IjEiIGRhdGEtaXNvMj0iUlMiPlNlcmJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxODkiIGRhdGEtbmFtZT0iU2xvdmVuaWEiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJTSSI+U2xvdmVuaWE8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjM1IiBkYXRhLW5hbWU9IlNvdXRoIEFmcmljYSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iWkEiPlNvdXRoIEFmcmljYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI2NSIgZGF0YS1uYW1lPSJTcGFpbiIgZGF0YS1jYXRlZ29yaWVzPSIxLDIsMyIgZGF0YS1pc28yPSJFUyI+U3BhaW48L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMTg2IiBkYXRhLW5hbWU9IlN3ZWRlbiIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iU0UiPlN3ZWRlbjwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSI0MSIgZGF0YS1uYW1lPSJTd2l0emVybGFuZCIgZGF0YS1jYXRlZ29yaWVzPSIxLDMiIGRhdGEtaXNvMj0iQ0giPlN3aXR6ZXJsYW5kPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE5OSIgZGF0YS1uYW1lPSJTeXJpYSIgZGF0YS1jYXRlZ29yaWVzPSIxIiBkYXRhLWlzbzI9IlNZIj5TeXJpYTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMDUiIGRhdGEtbmFtZT0iVGhhaWxhbmQiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJUSCI+VGhhaWxhbmQ8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjEyIiBkYXRhLW5hbWU9IlR1cmtleSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iVFIiPlR1cmtleTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMTciIGRhdGEtbmFtZT0iVWtyYWluZSIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iVUEiPlVrcmFpbmU8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMiIgZGF0YS1uYW1lPSJVbml0ZWQgQXJhYiBFbWlyYXRlcyIgZGF0YS1jYXRlZ29yaWVzPSIxLDIiIGRhdGEtaXNvMj0iQUUiPlVuaXRlZCBBcmFiIEVtaXJhdGVzPC9vcHRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ijc0IiBkYXRhLW5hbWU9IlVuaXRlZCBLaW5nZG9tIiBkYXRhLWNhdGVnb3JpZXM9IjEsMiIgZGF0YS1pc28yPSJHQiI+VW5pdGVkIEtpbmdkb208L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjIwIiBkYXRhLW5hbWU9IlVuaXRlZCBTdGF0ZXMiIGRhdGEtY2F0ZWdvcmllcz0iMSwyLDMiIGRhdGEtaXNvMj0iVVMiPlVuaXRlZCBTdGF0ZXM8L29wdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjIxIiBkYXRhLW5hbWU9IlVydWd1YXkiIGRhdGEtY2F0ZWdvcmllcz0iMSIgZGF0YS1pc28yPSJVWSI+VXJ1Z3VheTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC02Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibG9jYXRpb24td3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjaGVja2JveC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjYi1sb2NhdGlvbiIgY2xhc3M9ImNiLWxhYmVsIGN1c3RvbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSBjdXJyZW50IGxvY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IiIgdmFsdWU9IiIgLz48aW5wdXQgZGF0YS1hamF4dXJsPSIvc2VydmljZS9kZWFsZXItc2VhcmNoP25vX2NhY2hlPTEmYW1wO3R4X3B4cGRlYWxlcnNfYWpheGNhbGwlNUJhY3Rpb24lNUQ9Z2V0Q291bnRyeUNvZGVBamF4JmFtcDt0eF9weHBkZWFsZXJzX2FqYXhjYWxsJTVCY29udHJvbGxlciU1RD1EZWFsZXImYW1wO3R5cGU9MTEyMiZhbXA7Y0hhc2g9MGI2YmQ4ZmZkYmM0YTZiNTQ0ODI4YjMyY2RlNDU2OTgiIGlkPSJjYi1sb2NhdGlvbiIgdHlwZT0iY2hlY2tib3giIG5hbWU9IiIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrbWFyayI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imdlb2xvY2F0aW9uLWxvYWQiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5Mb2NhdGlvbiBpcyBkZXRlcm1pbmVkIC4uLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZ2VvbG9jYXRpb24tZXJyb3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij5QbGVhc2UgYWxsb3cgYWNjZXNzIHRvIHlvdXIgbG9jYXRpb248L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNhdGVnb3J5LXNlYXJjaC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9ImZvcm0tYmlnLWxhYmVsIj5JJiMwMzk7bSBsb29raW5nIGZvciAuLi48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXRlZ29yaWVzLWNiLWNvbnRhaW5lciIgZGF0YS1hbGwtY2F0ZWdvcnktdWlkcz0iMSwyLDMiPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXQtY2IgY2hlY2tib3gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNiLUNhciBwb2xpc2hlcyIgY2xhc3M9ImNiLWxhYmVsIGN1c3RvbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXIgcG9saXNoZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbY2F0ZWdvcmllc10iIHZhbHVlPSIiIC8+PGlucHV0IGNsYXNzPSJjYXRlZ29yeS1jYiBlbmFibGVkIiBpZD0iY2ItQ2FyIHBvbGlzaGVzIiB0eXBlPSJjaGVja2JveCIgbmFtZT0idHhfcHhwZGVhbGVyc19hamF4Y2FsbFtjYXRlZ29yaWVzXVtdIiB2YWx1ZT0iMSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjYXQtY2IgY2hlY2tib3gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImNiLUJvYXQgcG9saXNoZXMiIGNsYXNzPSJjYi1sYWJlbCBjdXN0b20tY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9hdCBwb2xpc2hlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjYXRlZ29yeS1jYiBlbmFibGVkIiBpZD0iY2ItQm9hdCBwb2xpc2hlcyIgdHlwZT0iY2hlY2tib3giIG5hbWU9InR4X3B4cGRlYWxlcnNfYWpheGNhbGxbY2F0ZWdvcmllc11bXSIgdmFsdWU9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY2hlY2ttYXJrIj48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY2F0LWNiIGNoZWNrYm94LXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJjYi1Tb2xpZCBDb21wb3VuZCIgY2xhc3M9ImNiLWxhYmVsIGN1c3RvbS1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xpZCBDb21wb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJjYXRlZ29yeS1jYiBlbmFibGVkIiBpZD0iY2ItU29saWQgQ29tcG91bmQiIHR5cGU9ImNoZWNrYm94IiBuYW1lPSJ0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2NhdGVnb3JpZXNdW10iIHZhbHVlPSIzIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNoZWNrbWFyayI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpZmllci1jb250YWluZXIiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpZmllciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PiYjNDJOb3RlOiBNZW56ZXJuYSBwb2xpc2hlcyBhcmUgbWFkZSBmb3IgcHJvZmVzc2lvbmFsIHVzZXJzLjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5CeSBjbGlja2luZyBvbiAmcXVvdDtGaW5kIGRlYWxlcnMgbm93JnF1b3Q7IEkgY29uZmlybSB0aGF0IEkgYmVsb25nIHRvIHRoaXMgY3VzdG9tZXIgZ3JvdXAuPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJtaXQtYnV0dG9uLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9InN1Ym1pdC1idG4gYnRuIiB0eXBlPSJzdWJtaXQiIG5hbWU9IiIgdmFsdWU9IiI+RmluZCBkZWFsZXJzPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9mb3JtPgogICAgICAgIAogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZGVhbGVyLXNlYXJjaC1tYXAtd3JhcCIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZWFsZXItc2VhcmNoLW1hcCIgaWQ9ImdtYXAiPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIAoKICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0icmVzdWx0LWNvbnRhaW5lciBkZWFsZXItc2VhcmNoLXJlc3VsdCI+CiAgICAgICAgPGRpdiBjbGFzcz0icm93Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcC1oZWFkbGluZSIgIHN0eWxlPSJkaXNwbGF5OiBub25lOyI+UXVhbGlmaWVkIGRlYWxlcnMgYW5kIGF1dGhvcml6ZWQgb25saW5lIHNob3BzIGluJm5ic3A7PHNwYW4gaWQ9Im1hcC1oZWFkbGluZS1jb3VudHJ5Ij48L3NwYW4+PC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhY2NvcmRpb24td3JhcCBkZWFsZXItc2VhcmNoLWFjY29yZGlvbnMiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InBhbmVsLWdyb3VwIiBpZD0iYWNjb3JkaW9uIiByb2xlPSJ0YWJsaXN0IiBhcmlhLW11bHRpc2VsZWN0YWJsZT0idHJ1ZSI+CgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY29udGFjdC1oZWFkbGluZSIgZGF0YS1zdHJpbmc9IkNvbnRhY3QiPjwvZGl2PgogICAgPGRpdiBpZD0iY2F0ZWdvcmllcy1oZWFkbGluZSIgZGF0YS1zdHJpbmc9IlRoZSBkZWFsZXIgcmFuZ2UgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBwcm9kdWN0IGNhdGVnb3JpZXM6Ij48L2Rpdj4KICAgIDxkaXYgaWQ9InRleHQtbGluay1vbmxpbmVzaG9wIiBkYXRhLXN0cmluZz0iVG8gdGhlIE9ubGluZXNob3AiPjwvZGl2PgogICAgPGRpdiBpZD0idGV4dC1saW5rLXdlYnNpdGUiIGRhdGEtc3RyaW5nPSJUbyB0aGUgV2Vic2l0ZSI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ0ZXh0LWNsb3NlLWFjY29yZGlvbiIgZGF0YS1zdHJpbmc9IkNsb3NlIERlYWxlci1JbmZvcm1hdGlvbiI+PC9kaXY+CiAgICA8ZGl2IGlkPSJkZWVwbGluayIgZGF0YS1zdHJpbmc9IiI+PC9kaXY+CiAgICAKICAgIAogICAgICAgICAgICA8c2NyaXB0IGFzeW5jIGRlZmVyIHNyYz0iaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT1BSXphU3lDdTloWk9oUG1ieE1RSFp5M3ZwNmhCWjZLR3hXRWt3UTQmbGlicmFyaWVzPXBsYWNlcyZjYWxsYmFjaz1pbml0TWFwIj48L3NjcmlwdD4KICAgICAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgICAgIHZhciBtYXA7CiAgICAgICAgICAgICAgICB2YXIgZ2VvY29kZXI7CiAgICAgICAgICAgICAgICB2YXIgbWFya2VycyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIG1hcFN0eWxlID0gIFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZjVmNWY1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMuaWNvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmlsaXR5IjogIm9mZiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNjE2MTYxIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5zdHJva2UiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2Y1ZjVmNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAiYWRtaW5pc3RyYXRpdmUubGFuZF9wYXJjZWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjYmRiZGJkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJwb2kiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2VlZWVlZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LmZpbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiIzc1NzU3NSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pLnBhcmsiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2U1ZTVlNSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicG9pLnBhcmsiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjOWU5ZTllIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImdlb21ldHJ5IiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiNmZmZmZmYiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInJvYWQuYXJ0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjNzU3NTc1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJyb2FkLmhpZ2h3YXkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2RhZGFkYSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicm9hZC5oaWdod2F5IiwKICAgICAgICAgICAgICAgICAgICAgICAgImVsZW1lbnRUeXBlIjogImxhYmVscy50ZXh0LmZpbGwiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiIzYxNjE2MSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAicm9hZC5sb2NhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJsYWJlbHMudGV4dC5maWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0eWxlcnMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbG9yIjogIiM5ZTllOWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgImZlYXR1cmVUeXBlIjogInRyYW5zaXQubGluZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50VHlwZSI6ICJnZW9tZXRyeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjZTVlNWU1IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICJmZWF0dXJlVHlwZSI6ICJ0cmFuc2l0LnN0YXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2VlZWVlZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAid2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAiZ2VvbWV0cnkiLAogICAgICAgICAgICAgICAgICAgICAgICAic3R5bGVycyI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sb3IiOiAiI2M5YzljOSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAiZmVhdHVyZVR5cGUiOiAid2F0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudFR5cGUiOiAibGFiZWxzLnRleHQuZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzdHlsZXJzIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xvciI6ICIjOWU5ZTllIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXTsKCiAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBpbml0TWFwKCkgewogICAgICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBnb29nbGUubWFwcy5NYXAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dtYXAnKSwgewogICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IHtsYXQ6IDQ4Ljc3OTU5NDIsIGxuZzogOC4yMDU4Njc0fSwKICAgICAgICAgICAgICAgICAgICAgICAgem9vbTogNiwKICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogMTgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlczogbWFwU3R5bGUKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgIHZhciBldU1lbWJlcnMgPSBbMTMsMjAsMjIsNTIsNTMsNTQsNTYsNjEsNjUsNjcsNzIsODUsOTMsOTUsOTcsMTA0LDEyNiwxMjcsMTI4LDE0NCwxNTcsMTcwLDE3NCwxNzksMTg2LDE4OSwxOTFdOwogICAgICAgICAgICAgICAgICAgIHZhciBhbGxDYXRlZ29yeVVpZHMgPSAkKCcuY2F0ZWdvcmllcy1jYi1jb250YWluZXInKS5kYXRhKCdhbGwtY2F0ZWdvcnktdWlkcycpLnNwbGl0KCcsJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJmb3JtID0gJCgnI3NlbGVjdEZvcm0nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeVNlbGVjdCA9ICQoJyNjb3VudHJ5LXNlbGVjdCcpOwogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbkNoZWNrYm94ID0gJCgnI2NiLWxvY2F0aW9uJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvblNlYXJjaENvbnRhaW5lciA9ICQoJy5sb2NhdGlvbi1zZWFyY2gtY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhdGVnb3J5U2VhcmNoQ29udGFpbmVyID0gJCgnLmNhdGVnb3J5LXNlYXJjaC1jb250YWluZXInKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbm90aWZpZXJDb250YWluZXIgPSAkKCcubm90aWZpZXItY29udGFpbmVyJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lciA9ICQoJy5zdWJtaXQtYnV0dG9uLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRDb250YWluZXIgPSAkKCcucmVzdWx0LWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXBDb250YWluZXIgPSAkKCcuZGVhbGVyLXNlYXJjaC1tYXAtd3JhcCcpOwoKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeUNhdGVnb3JpZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgY291bnRyeU5hbWUgPSAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgZGlzYWJsZWRDYXRlZ29yaWVzID0gJyc7CgogICAgICAgICAgICAgICAgICAgIHZhciBtb2JpbGVDaGVjayA9ICQoJyNtb2JpbGUtY2hlY2snKTsKCiAgICAgICAgICAgICAgICAgICAgdmFyIGFqYXhVcmwgPSBmaWx0ZXJmb3JtLmRhdGEoJ2FqYXh1cmwnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgZ2V0Q291bnRyeUNvZGVBamF4VXJsID0gbG9jYXRpb25DaGVja2JveC5kYXRhKCdhamF4dXJsJyk7CgogICAgICAgICAgICAgICAgICAgIHZhciBkZWVwbGluayA9ICQoJyNkZWVwbGluaycpLmRhdGEoJ3N0cmluZycpID09IDE7CgogICAgICAgICAgICAgICAgICAgIGlmKGRlZXBsaW5rKXsKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeUNhdGVnb3JpZXMgPSBjb3VudHJ5U2VsZWN0LmZpbmQoJ29wdGlvbjpzZWxlY3RlZCcpLmRhdGEoJ2NhdGVnb3JpZXMnKSArICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5TmFtZSA9IGNvdW50cnlTZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGF0YSgnbmFtZScpICsgJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBuaWNodCBpbSBMYW5kIHZvcmhhbmRlbmUgQ2F0ZWdvcmllcyBkaXNhYmxlbgogICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZENhdGVnb3JpZXMgPSBhcnJfZGlmZiAoYWxsQ2F0ZWdvcnlVaWRzLCBjb3VudHJ5Q2F0ZWdvcmllcy5zcGxpdCgnLCcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNhYmxlZENhdGVnb3JpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY2F0ZWdvcnktY2JbdmFsdWU9IicgKyBkaXNhYmxlZENhdGVnb3JpZXNbaV0gKyAnIl0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhdGVnb3J5LWNiW3ZhbHVlPSInICsgZGlzYWJsZWRDYXRlZ29yaWVzW2ldICsgJyJdJykuY2xvc2VzdCgnLmNoZWNrYm94LXdyYXBwZXInKS5hZGRDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYXJyYXlDb250YWlucyhwYXJzZUludChjb3VudHJ5U2VsZWN0LnZhbCgpKSxldU1lbWJlcnMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFqYXhDYWxsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd29yaycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobW9iaWxlQ2hlY2suaXMoJzp2aXNpYmxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5tb2JpbGUtcmVzZXQtc2VhcmNoJykuZmFkZUluKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmRlYWxlci1zZWFyY2gtZm9ybScpLmZhZGVPdXQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkKCcubWFwLWhlYWRsaW5lJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjbWFwLWhlYWRsaW5lLWNvdW50cnknKS50ZXh0KGNvdW50cnlOYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgICAgICAgICBjb3VudHJ5U2VsZWN0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHJ5Q2F0ZWdvcmllcyA9ICQodGhpcykuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykuZGF0YSgnY2F0ZWdvcmllcycpICsgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlOYW1lID0gJCh0aGlzKS5maW5kKCdvcHRpb246c2VsZWN0ZWQnKS5kYXRhKCduYW1lJykgKyAnJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQodGhpcykudmFsKCkgPT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VhcmNoQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllckNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZW5uIFVzZXIgU2VsZWN0LVZhbHVlIMOkbmRlcnQsIFN0YW5kb3J0LUNoZWNrYm94IHJlc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25DaGVja2JveC52YWwoJzAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkNoZWNrYm94LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxlIENhdGVnb3JpZXMgd2llZGVyIGVuYWJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYicpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLmNoZWNrYm94LXdyYXBwZXInKS5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmljaHQgaW0gTGFuZCB2b3JoYW5kZW5lIENhdGVnb3JpZXMgZGlzYWJsZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkQ2F0ZWdvcmllcyA9IGFycl9kaWZmIChhbGxDYXRlZ29yeVVpZHMsIGNvdW50cnlDYXRlZ29yaWVzLnNwbGl0KCcsJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNhYmxlZENhdGVnb3JpZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuY2F0ZWdvcnktY2JbdmFsdWU9IicgKyBkaXNhYmxlZENhdGVnb3JpZXNbaV0gKyAnIl0nKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5jYXRlZ29yeS1jYlt2YWx1ZT0iJyArIGRpc2FibGVkQ2F0ZWdvcmllc1tpXSArICciXScpLmNsb3Nlc3QoJy5jaGVja2JveC13cmFwcGVyJykuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlTZWFyY2hDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRCdXR0b25Db250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhcnJheUNvbnRhaW5zKHBhcnNlSW50KCQodGhpcykudmFsKCkpLGV1TWVtYmVycykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlRG93bigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXJDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1hcC1oZWFkbGluZScpLnNob3coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNtYXAtaGVhZGxpbmUtY291bnRyeScpLnRleHQoY291bnRyeU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25DaGVja2JveC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDb250YWluZXIuc2xpZGVVcCgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmNoZWNrZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoJzEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlTZWxlY3QudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuc2hvdygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLmdlb2xvY2F0aW9uLmdldEN1cnJlbnRQb3NpdGlvbihmdW5jdGlvbihwb3NpdGlvbil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gZXJtaXR0ZWx0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocG9zaXRpb24uY29vcmRzLmxhdGl0dWRlICE9PSB1bmRlZmluZWQgJiYgcG9zaXRpb24uY29vcmRzLmxvbmdpdHVkZSAhPT0gdW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0aW9uQ291bnRyeUNvZGUoZ2V0Q291bnRyeUNvZGVBamF4VXJsLCBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUsIHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmZWhsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJycpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWVycm9yJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJmb3JtLnN1Ym1pdChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICBhamF4Q2FsbCgpOwogICAgICAgICAgICAgICAgICAgICAgICBtYXBDb250YWluZXIuc2xpZGVEb3duKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENvbnRhaW5lci5zbGlkZURvd24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobW9iaWxlQ2hlY2suaXMoJzp2aXNpYmxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keSxodG1sJykuYW5pbWF0ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiAkKCcuZGVhbGVyLXNlYXJjaC1tYXAtd3JhcCcpLm9mZnNldCgpLnRvcCAtICQoJy5wYWdlLWhlYWRlcicpLm91dGVySGVpZ2h0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDgwMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLm1vYmlsZS1yZXNldC1zZWFyY2gnKS5mYWRlSW4oJ3Nsb3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5kZWFsZXItc2VhcmNoLWZvcm0nKS5mYWRlT3V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBndG1FdmVudExhYmVsID0gJCgnI2NvdW50cnktc2VsZWN0IG9wdGlvbjpzZWxlY3RlZCcpLnRleHQoKSArICcgLSc7CgogICAgICAgICAgICAgICAgICAgICAgICBpZigkKCcjY2ItQXV0b3BvbGl0dXJlbicpLmlzKCI6Y2hlY2tlZCIpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0bUV2ZW50TGFiZWwgPSBndG1FdmVudExhYmVsICsgJyBBdXRvcG9saXR1cmVuJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZigkKCcjY2ItQm9vdHNwb2xpdHVyZW4nKS5pcygiOmNoZWNrZWQiKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBndG1FdmVudExhYmVsID0gZ3RtRXZlbnRMYWJlbCArICcgQm9vdHNwb2xpdHVyZW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCQoJyNjYi1GZXN0cGFzdGVuJykuaXMoIjpjaGVja2VkIikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RtRXZlbnRMYWJlbCA9IGd0bUV2ZW50TGFiZWwgKyAnIEZlc3RwYXN0ZW4nOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnSGFlbmRsZXJzdWNoZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ3N1Y2hlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NsaWNrJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBndG1FdmVudExhYmVsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRMb2NhdGlvbkNvdW50cnlDb2RlKGFqYXhVcmwsIGxhdCwgbG9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQucG9zdChhamF4VXJsLCB7ICd0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2xhdF0nOiBsYXQsICd0eF9weHBkZWFsZXJzX2FqYXhjYWxsW2xvbl0nOiBsb24gfSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvblZhbHVlID0gJCgnI2NvdW50cnktc2VsZWN0IG9wdGlvbltkYXRhLWlzbzI9JytyZXNwb25zZSsnXScpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwob3B0aW9uVmFsdWUpLmNoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFqYXhDYWxsKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjbGVhck1hcmtlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FjY29yZGlvbicpLmh0bWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkLnBvc3QoYWpheFVybCwgZmlsdGVyZm9ybS5zZXJpYWxpemUoKSwgZnVuY3Rpb24ocmVzcG9uc2UpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcEJvdW5kcyA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmdCb3VuZHMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAhPSBudWxsICYmIHJlc3BvbnNlLmxlbmd0aCAhPSAwKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNwb25zZSA9IEpTT04ucGFyc2UocmVzcG9uc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJlc3BvbnNlLCBmdW5jdGlvbihpLCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0ubGF0ICE9PSAnJyAmJiBpdGVtLmxvbiAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0ubGF0LCBpdGVtLmxvbiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoaXRlbS5hZGRpdGlvbmFsTGF0T25lICE9PSAnJyAmJiBpdGVtLmFkZGl0aW9uYWxMb25PbmUgIT09ICcnKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWRkaXRpb25hbE1hcmtlck9uZSA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmFkZGl0aW9uYWxMYXRPbmUsIGl0ZW0uYWRkaXRpb25hbExvbk9uZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAnL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbl9pZDogaXRlbS5sb2NhdGlvbmlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKGFkZGl0aW9uYWxNYXJrZXJPbmUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcEJvdW5kcy5leHRlbmQoYWRkaXRpb25hbE1hcmtlck9uZS5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmFkZGl0aW9uYWxMYXRUd28gIT09ICcnICYmIGl0ZW0uYWRkaXRpb25hbExvblR3byAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsTWFya2VyVHdvID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0uYWRkaXRpb25hbExhdFR3bywgaXRlbS5hZGRpdGlvbmFsTG9uVHdvKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goYWRkaXRpb25hbE1hcmtlclR3byk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChhZGRpdGlvbmFsTWFya2VyVHdvLnBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uYWRkaXRpb25hbExhdFRocmVlICE9PSAnJyAmJiBpdGVtLmFkZGl0aW9uYWxMb25UaHJlZSAhPT0gJycpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhZGRpdGlvbmFsTWFya2VyVGhyZWUgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246IG5ldyBnb29nbGUubWFwcy5MYXRMbmcoaXRlbS5hZGRpdGlvbmFsTGF0VGhyZWUsIGl0ZW0uYWRkaXRpb25hbExvblRocmVlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwOiBtYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItcmVkLnBuZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkRST1AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2lkOiBpdGVtLmxvY2F0aW9uaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2goYWRkaXRpb25hbE1hcmtlclRocmVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKGFkZGl0aW9uYWxNYXJrZXJUaHJlZS5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmFkZGl0aW9uYWxMYXRGb3VyICE9PSAnJyAmJiBpdGVtLmFkZGl0aW9uYWxMb25Gb3VyICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxNYXJrZXJGb3VyID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0uYWRkaXRpb25hbExhdEZvdXIsIGl0ZW0uYWRkaXRpb25hbExvbkZvdXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChhZGRpdGlvbmFsTWFya2VyRm91cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChhZGRpdGlvbmFsTWFya2VyRm91ci5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmFkZGl0aW9uYWxMYXRGaXZlICE9PSAnJyAmJiBpdGVtLmFkZGl0aW9uYWxMb25GaXZlICE9PSAnJyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZGl0aW9uYWxNYXJrZXJGaXZlID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nKGl0ZW0uYWRkaXRpb25hbExhdEZpdmUsIGl0ZW0uYWRkaXRpb25hbExvbkZpdmUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1yZWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0ubG9jYXRpb25pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMucHVzaChhZGRpdGlvbmFsTWFya2VyRml2ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwQm91bmRzLmV4dGVuZChhZGRpdGlvbmFsTWFya2VyRml2ZS5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vycy5wdXNoKG1hcmtlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKG1hcmtlci5wb3NpdGlvbik7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FjY29yZGlvbicpLmFwcGVuZChnZXRIdG1sVGVtcGxhdGUoaXRlbSxpKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uTGlzdEVudHJ5ID0gJCgnI2xvY2F0aW9uJyArIGl0ZW0ubG9jYXRpb25pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbkxpc3RFbnRyeS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKG1hcmtlcnMsIGZ1bmN0aW9uKGksbWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNvbGxhcHNlJykuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3Nob3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJCgnLmNvbGxhcHNlLWxpbmsnKS5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoISQodGhpcykuY2xvc2VzdCgnLnBhbmVsJykuZmluZCgnLmNvbGxhcHNlJykuaXMoJzp2aXNpYmxlJykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLnNpYmxpbmdzKCcucGFuZWwnKS5maW5kKCcuY29sbGFwc2UtbGluaycpLmFkZENsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5zaWJsaW5ncygnLnBhbmVsJykuZmluZCgnLmFjY29yZGlvbi1jb2xsYXBzZScpLnJlbW92ZUNsYXNzKCdzaG93Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5maW5kKCcuYWNjb3JkaW9uLWNvbGxhcHNlJykuaGFzQ2xhc3MoJ3Nob3cnKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkKHRoaXMpLmNsb3Nlc3QoJy5wYW5lbCcpLmZpbmQoJy5hY2NvcmRpb24tY29sbGFwc2UnKS5oYXNDbGFzcygnY29sbGFwc2luZycpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcucGFuZWwnKS5maW5kKCcuYWNjb3JkaW9uLWNvbGxhcHNlJykuYWRkQ2xhc3MoJ3Nob3cnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCdjb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJPbmUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlck9uZS5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJPbmUuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJUd28gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlclR3by5zZXRJY29uKCcvdHlwbzNjb25mL2V4dC9weHBkZWFsZXJzL1Jlc291cmNlcy9QdWJsaWMvSW1hZ2VzL21hcC1tYXJrZXItZ3JleS5wbmcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJUd28uc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJUaHJlZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyVGhyZWUuc2V0SWNvbignL3R5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLWdyZXkucG5nJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsTWFya2VyVGhyZWUuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJGb3VyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJGb3VyLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlckZvdXIuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJGaXZlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxNYXJrZXJGaXZlLnNldEljb24oJy90eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbE1hcmtlckZpdmUuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyIChtYXJrZXIsIG1hcmtlcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWRkaXRpb25hbE1hcmtlck9uZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyQ2xpY2tMaXN0ZW5lcihhZGRpdGlvbmFsTWFya2VyT25lLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJUd28gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIoYWRkaXRpb25hbE1hcmtlclR3bywgbWFya2Vycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihhZGRpdGlvbmFsTWFya2VyVGhyZWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckNsaWNrTGlzdGVuZXIoYWRkaXRpb25hbE1hcmtlclRocmVlLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJGb3VyICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyKGFkZGl0aW9uYWxNYXJrZXJGb3VyLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGFkZGl0aW9uYWxNYXJrZXJGaXZlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJDbGlja0xpc3RlbmVyKGFkZGl0aW9uYWxNYXJrZXJGaXZlLCBtYXJrZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmlzT25seU9ubGluZXNob3AgPT09IHRydWUpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobWFya2Vyc1tpXSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2Vyc1tpXS5zZXRNYXAobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuZml0Qm91bmRzKG1hcEJvdW5kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBjbGVhck1hcmtlcnMoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtlcnNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzW2ldLnNldE1hcChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzID0gW107CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBtYXJrZXJDbGlja0xpc3RlbmVyKG1hcmtlclRlbXAsIG1hcmtlckFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKG1hcmtlclRlbXAsICdjbGljaycsIChmdW5jdGlvbihtYXJrZXIsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2gobWFya2VyQXJyYXksIGZ1bmN0aW9uKGksbWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0T3B0aW9ucyh7aWNvbjogInR5cG8zY29uZi9leHQvcHhwZGVhbGVycy9SZXNvdXJjZXMvUHVibGljL0ltYWdlcy9tYXAtbWFya2VyLXJlZC5wbmcifSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldE9wdGlvbnMoe2ljb246ICJ0eXBvM2NvbmYvZXh0L3B4cGRlYWxlcnMvUmVzb3VyY2VzL1B1YmxpYy9JbWFnZXMvbWFwLW1hcmtlci1ncmV5LnBuZyJ9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKCcuY29sbGFwc2UtbGluaycpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAkKCcjbG9jYXRpb24nK21hcmtlci5sb2NhdGlvbl9pZCkuYWRkQ2xhc3MoJ2FjdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICQoJy5jb2xsYXBzZS1saW5rJykuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKS5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJCgnI2xvY2F0aW9uJyttYXJrZXIubG9jYXRpb25faWQpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSkucmVtb3ZlQ2xhc3MoJ2NvbGxhcHNlZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb2NhdGlvbicrbWFya2VyLmxvY2F0aW9uX2lkKS5jbGljaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24oZ29vZ2xlLm1hcHMuQW5pbWF0aW9uLkJPVU5DRSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6ICQoJyNsb2NhdGlvbicrbWFya2VyLmxvY2F0aW9uX2lkKS5vZmZzZXQoKS50b3AgLSAoJCgnLnBhZ2UtaGVhZGVyJykub3V0ZXJIZWlnaHQoKSArIDM1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KShtYXJrZXJUZW1wLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcnJheUNvbnRhaW5zKG5lZWRsZSwgYXJyaGF5c3RhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChhcnJoYXlzdGFjay5pbmRleE9mKG5lZWRsZSkgPiAtMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGFycl9kaWZmIChhMSwgYTIpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhID0gW10sIGRpZmYgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYTEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYTFbaV1dID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhMi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFbYTJbaV1dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGFbYTJbaV1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2EyW2ldXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGsgaW4gYSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZi5wdXNoKGspOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIDwvc2NyaXB0PgogICAgICAgIAogICAgPHNjcmlwdD4KICAgICAgICAkKGRvY3VtZW50LmJvZHkpLm9uKCdjbGljaycsJy5tb2JpbGUtY2xvc2UtYWNjb3JkaW9uLXRyaWdnZXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gJCh0aGlzKS5jbG9zZXN0KCcuY29sbGFwc2UnKS5zbGlkZVVwKCk7CiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLmFjY29yZGlvbi1pdGVtJykuZmluZCgnLmFjY29yZGlvbi1jb2xsYXBzZScpLnJlbW92ZUNsYXNzKCdzaG93Jyk7CiAgICAgICAgICAgICQodGhpcykucGFyZW50cygnLmFjY29yZGlvbi1pdGVtJykuZmluZCgnLmNvbGxhcHNlLWxpbmsnKS5hZGRDbGFzcygnY29sbGFwc2VkJyk7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQuYm9keSkub24oJ2NsaWNrJywnI3Jlc2V0LXNlYXJjaCcsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJycpLmNoYW5nZSgpOwogICAgICAgICAgICBjYXRlZ29yeVNlYXJjaENvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgIHN1Ym1pdEJ1dHRvbkNvbnRhaW5lci5zbGlkZVVwKCk7CiAgICAgICAgICAgIG5vdGlmaWVyQ29udGFpbmVyLnNsaWRlVXAoKTsKICAgICAgICAgICAgJCgnLmRlYWxlci1zZWFyY2gtZm9ybScpLmZhZGVJbigpOwogICAgICAgICAgICAkKHRoaXMpLnBhcmVudCgpLmZhZGVPdXQoKTsKICAgICAgICB9KTsKCiAgICAgICAgJChkb2N1bWVudC5ib2R5KS5vbignY2xpY2snLCcuaXRlbS1saW5rJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKCQodGhpcykuZGF0YSgnYW5hbHl0aWNzZXZlbnQnKSAhPT0gJycpewogICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107CiAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goewogICAgICAgICAgICAgICAgICAgIGV2ZW50OiAnSGFlbmRsZXJzdWNoZScsCiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd3ZWl0ZXJsZWl0dW5nJywKICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdjbGljaycsCiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICQodGhpcykuZGF0YSgnYW5hbHl0aWNzZXZlbnQnKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gZ2V0SHRtbFRlbXBsYXRlKGl0ZW0saSl7CiAgICAgICAgICAgIHZhciBjb250YWN0SGVhZGxpbmUgPSAkKCcjY29udGFjdC1oZWFkbGluZScpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0hlYWRsaW5lID0gJCgnI2NhdGVnb3JpZXMtaGVhZGxpbmUnKS5kYXRhKCdzdHJpbmcnKTsKICAgICAgICAgICAgdmFyIHRleHRMaW5rT25saW5lc2hvcCA9ICQoJyN0ZXh0LWxpbmstb25saW5lc2hvcCcpLmRhdGEoJ3N0cmluZycpOwogICAgICAgICAgICB2YXIgdGV4dExpbmtXZWJzaXRlID0gJCgnI3RleHQtbGluay13ZWJzaXRlJykuZGF0YSgnc3RyaW5nJyk7CiAgICAgICAgICAgIHZhciBjbG9zZUFjY29yZGlvblRyaWdnZXJUZXh0ID0gJCgnI3RleHQtY2xvc2UtYWNjb3JkaW9uJykuZGF0YSgnc3RyaW5nJyk7CiAgICAgICAgICAgIHZhciBpdGVyYXRvckNsYXNzID0gJyc7CiAgICAgICAgICAgIGlmIChpID09ICcwJykgewogICAgICAgICAgICAgICAgaXRlcmF0b3JDbGFzcyA9ICcgZmlyc3QnOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgYW5hbHl0aWNzRXZlbnQgPSAnJzsKICAgICAgICAgICAgaWYoaXRlbS5hbmFseXRpY3NFdmVudCAhPSAnJyl7CiAgICAgICAgICAgICAgICBhbmFseXRpY3NFdmVudCA9IGl0ZW0uYW5hbHl0aWNzRXZlbnQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9ImFjY29yZGlvbi1pdGVtIHBhbmVsIj4nOwoKICAgICAgICAgICAgaHRtbCAgICs9ICcgPGEgaHJlZj0iamF2YXNjcmlwdDo7IiBjbGFzcz0iYWNjb3JkaW9uLXRpdGxlIGNvbGxhcHNlLWxpbmsgY29sbGFwc2VkIiBkYXRhLWJzLXRvZ2dsZT0iY29sbGFwc2UiIGlkPSJsb2NhdGlvbicgKyBpdGVtLmxvY2F0aW9uaWQgKyciIGRhdGEtYnMtdGFyZ2V0PSIjY29sbGFwc2UnICsgaXRlbS5sb2NhdGlvbmlkICsnIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSIgYXJpYS1jb250cm9scz0ibG9jYXRpb24nICsgaXRlbS5sb2NhdGlvbmlkICsnIj4nOwogICAgICAgICAgICBodG1sICAgKz0gJzxkaXYgY2xhc3M9ImFjYy10aXRsZSI+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.