Votre forum de construction : conseils de construction de WeberHaus
Vous cherchez un terrain ou vous souhaitez en faire évaluer un ? Vous avez besoin d’aide pour mettre en œuvre vos idées architecturales ? Peut-être avez-vous tout simplement des questions sur les concepts d’énergie et les options de financement ? Dans tous les cas, votre conseiller construction personnel se tient à votre disposition pour un entretien à l’agence conseil WeberHaus près de chez vous. N’hésitez pas à prendre rendez-vous par téléphone !
CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3aC1iYXVmb3J1bS1nb29nbGUtbWFwcy1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Imhlcm8taW1hZ2UtY29udGFpbmVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2gtYmF1Zm9ydW0tZmlsdGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSBuYW1lPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGlkPSJiYXVmb3J1bVNlYXJjaEZvcm0iIGFjdGlvbj0iL2FqYXgvP3NlYXJjaC1iYXVmb3J1bT0xIiBtZXRob2Q9IlBPU1QiIGRhdGEtcGFyc2xleS12YWxpZGF0ZT0iIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0icmVxdWVzdC1kYXRhIiBjbGFzcz0iZC1ub25lIiBkYXRhLXppcD0iIiBkYXRhLWNvdW50cnk9IkNIIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImZpbHRlci1pdGVtcy13cmFwcGVyIGhpZGUtcmFkaXVzLXNlYXJjaCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9ImFkZHJlc3NTZWFyY2giIGNsYXNzPSJmb3JtLWxhYmVsIj5BZHJlc3NlPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYWRkcmVzcy1zZWFyY2gtcGFyc2xleS13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJ0eF93aGJhdWZvcnVtX21hcHNfYWRkcmVzcyIgaWQ9ImFkZHJlc3NTZWFyY2giIHBsYWNlaG9sZGVyPSJDb2RlIHBvc3RhbCAuLi4iIGNsYXNzPSJmb3JtLWNvbnRyb2wiIGRhdGEtcGFyc2xleS1lcnJvcnMtY29udGFpbmVyPSIjYWRkcmVzcy1zZWFyY2gtZXJyb3ItY29udGFpbmVyIiBkYXRhLXBhcnNsZXktY3VzdG9tMTAzPSIxIiBkYXRhLXBhcnNsZXktZXJyb3ItbWVzc2FnZT0iVmV1aWxsZXogZW50cmVyIHVuIGNvZGUgcG9zdGFsIHZhbGlkZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJhZGRyZXNzLXNlYXJjaC1lcnJvci1jb250YWluZXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb3VudHJ5LXNlYXJjaC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iY291bnRyeVNlYXJjaCIgY2xhc3M9ImZvcm0tbGFiZWwiPlBheXM8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGlkPSJjb3VudHJ5U2VhcmNoIiBjbGFzcz0iZm9ybS1zZWxlY3QiIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19jb3VudHJ5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9IkQiPkFsbGVtYWduZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iTCI+THV4ZW1ib3VyZzwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iQ0giPmxhIFN1aXNzZTwvb3B0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJnZW9sb2NhdGlvbi1zZWFyY2gtd3JhcHBlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iZm9ybS1jaGVjay1sYWJlbCIgZm9yPSJnZW9sb2NhdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGlzZXogdm90cmUgcHJvcHJlIGVtcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iZ2VvbG9jYXRpb24iIG5hbWU9Imdlb2xvY2F0aW9uIiB2YWx1ZT0iMSIgY2xhc3M9ImZvcm0tY2hlY2staW5wdXQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjaGVja21hcmsiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idHhfd2hiYXVmb3J1bV9tYXBzX2xhdCIgaWQ9ImxhdCIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19sb24iIGlkPSJsb24iIHZhbHVlPSIwIiAvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iZ2VvbG9jYXRpb24tbG9hZCIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPkxlIGxpZXUgZXN0IGVuIGNvdXJzIGRlIGTDqXRlcm1pbmF0aW9uLi4uPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Imdlb2xvY2F0aW9uLWVycm9yIiByb2xlPSJzdGF0dXMiIGRhdGEtZGVuaWVkPSJWZXVpbGxleiBhdXRvcmlzZXIgbCdhY2PDqHMgw6Agdm90cmUgZW1wbGFjZW1lbnQgb3Ugc2Fpc2lyIHZvdHJlIGNvZGUgcG9zdGFsLiIgZGF0YS11bmF2YWlsYWJsZT0iVm90cmUgZW1wbGFjZW1lbnQgbidhIHBhcyBwdSDDqnRyZSBkw6l0ZXJtaW7DqS4gVmV1aWxsZXogc2Fpc2lyIHZvdHJlIGNvZGUgcG9zdGFsLiIgZGF0YS10aW1lb3V0PSJMYSBkw6l0ZXJtaW5hdGlvbiBkZSB2b3RyZSBlbXBsYWNlbWVudCBwcmVuZCB0cm9wIGRlIHRlbXBzLiBWZXVpbGxleiBzYWlzaXIgdm90cmUgY29kZSBwb3N0YWwuIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InR4X3doYmF1Zm9ydW1fbWFwc19yYWRpdXMiIGlkPSJyYWRpdXMiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJtaXQtYnV0dG9uLXdyYXBwZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdGl0bGU9IkNoZXJjaGVyIHVuZSBhZ2VuY2UgY29uc2VpbCIgYXJpYS1sYWJlbD0iQ2hlcmNoZXIgdW5lIGFnZW5jZSBjb25zZWlsIiBjbGFzcz0iYnRuLXByaW1hcnkiIGlkPSJzZWFyY2hMb2NhdGlvbiI+Q2hlcmNoZXIgdW5lIGFnZW5jZSBjb25zZWlsPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJtYXAtYW5jaG9yIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2gtY29udGVudC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJnb29nbGUtbWFwcy1ncmlkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hcC1jb250YWluZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im1hcCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJhdWZvcmVuLWFqYXgtbGlzdC13cmFwcGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJiYXVmb3JlbkFqYXhMaXN0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VhcmNoLWluaXQtaW5mbyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbml0LWluZm8taWNvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9IiNBMDAwMDAiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cGF0aCBkPSJNMjEgMTBjMCA3LTkgMTMtOSAxM3MtOS02LTktMTNhOSA5IDAgMCAxIDE4IDB6IiAvPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTAiIHI9IjMiIC8+PC9zdmc+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImluaXQtaW5mby10ZXh0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXVpbGxleiBzYWlzaXIgdm90cmUgQ1AgPHN0cm9uZz5ldCBsZSByYXlvbiBzb3VoYWl0w6k8L3N0cm9uZz4gcG91ciBvYnRlbmlyIHVuZSBsaXN0ZSA8c3Ryb25nPmRlcyBhZ2VuY2VzIGNvbnNlaWw8L3N0cm9uZz4gcHLDqHMgZGUgY2hleiB2b3VzLi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJuby1yZXN1bHRzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVjdW4gcsOpc3VsdGF0IHRyb3V2w6kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLWFuaW1hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9ImxvYWRpbmctYW5pbWF0aW9uIiBhbHQ9IldlYmVySGF1cyBMb2dvIExhZGUtQW5pbWF0aW9uIiB0aXRsZT0iV2ViZXJIYXVzIExvZ28gTGFkZS1BbmltYXRpb24iIHNyYz0iL19hc3NldHMvYTA2ZGE4ZDkzZTNiYzgzNzIyYTcyODJkZmU2ODQ0NzcvSW1hZ2VzL2dpZl9XZWJlckhhdXMtaWNvbi1sb2FkaW5nLmdpZiIgd2lkdGg9IjgwIiBoZWlnaHQ9IjgwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQgYXN5bmMgc3JjPSJodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PUFJemFTeUFMUGNlMUNZUXZOUjRXTHRYb2Q1RlYxUUNCWjY5eTJMUSZsb2FkaW5nPWFzeW5jJmNhbGxiYWNrPWluaXRNYXAmbGFuZ3VhZ2U9ZnIiPjwvc2NyaXB0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXJrZXJzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudGVkIG9uIGV2ZXJ5IGNoZWNrYm94IGNoYW5nZSwgc28gYSBsYXRlIGdlb2xvY2F0aW9uIG9yIGdlb2NvZGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuc3dlciBmcm9tIGFuIGVhcmxpZXIgYXR0ZW1wdCBpcyBpZ25vcmVkLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2VvbG9jYXRpb25SZXF1ZXN0SWQgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vUmVzdWx0c1N0cmluZyA9ICQoJyNuby1yZXN1bHRzJykuaHRtbCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR29vZ2xlIGNhbGxzIHRoaXMgZ2xvYmFsIHdoZW4gdGhlIEFQSSBrZXkgaXMgaW52YWxpZCBvciB0aGUgSFRUUCByZWZlcnJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgYWxsb3dlZCAoUmVmZXJlck5vdEFsbG93ZWRNYXBFcnJvcikuIEluIHRoYXQgY2FzZSBnb29nbGUubWFwcyBzdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2Fkcywgc28gd2UgZmxhZyB0aGUgZmFpbHVyZSBleHBsaWNpdGx5IGFuZCBkZWdyYWRlIHRvIGEgbGlzdC1vbmx5IHNlYXJjaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmdtX2F1dGhGYWlsdXJlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX193aE1hcHNBdXRoRmFpbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJHb29nbGUgTWFwcyBhdXRoIGZhaWxlZCAoaW52YWxpZCBrZXkgb3IgcmVmZXJyZXIpLiBGYWxsaW5nIGJhY2sgdG8gbGlzdC1vbmx5IHNlYXJjaC4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdpdGggbG9hZGluZz1hc3luYyB0aGUgY2FsbGJhY2sgb25seSBzaWduYWxzIHRoYXQgdGhlIGxvYWRlciBpcyByZWFkeTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGxpYnJhcmllcyB3ZSB1c2UgKE1hcCwgR2VvY29kZXIsIE1hcmtlcikgYXJlIGltcG9ydGVkIGV4cGxpY2l0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jIGZ1bmN0aW9uIGluaXRNYXAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlLm1hcHMuaW1wb3J0TGlicmFyeSgnbWFwcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUubWFwcy5pbXBvcnRMaWJyYXJ5KCdnZW9jb2RpbmcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlLm1hcHMuaW1wb3J0TGlicmFyeSgnbWFya2VyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkdvb2dsZSBNYXBzIGxpYnJhcmllcyBjb3VsZCBub3QgYmUgbG9hZGVkLiBGYWxsaW5nIGJhY2sgdG8gbGlzdC1vbmx5IHNlYXJjaC4iLCBlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbmV3IGdvb2dsZS5tYXBzLk1hcChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFwJyksIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXI6IHtsYXQ6IDQ4LjYxODY4NTQsIGxuZzogNy44OTA4MDY2fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b29tOiA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuX193aE1hcHNSZWFkeSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1hcHNBdmFpbGFibGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93Ll9fd2hNYXBzUmVhZHkgPT09IHRydWUgJiYgIXdpbmRvdy5fX3doTWFwc0F1dGhGYWlsZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyTWFya2VycygpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXJrZXJzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnNbaV0uc2V0TWFwKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRIdG1sVGVtcGxhdGUoaXRlbSwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdMYWJlbHMgPSAkKCcjbGFuZy1sYWJlbHMnKS5kYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUxID0gaXRlbS50ZWFtTmFtZTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUyID0gaXRlbS50ZWFtTmFtZTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUzID0gaXRlbS50ZWFtTmFtZTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbUNpdHkgPSBpdGVtLnRlYW1DaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1QaG9uZTEgPSBpdGVtLnRlYW1QaG9uZTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVBob25lSHJlZiA9IGl0ZW0udGVhbVBob25lMS5yZXBsYWNlKC9ccy9nLCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtWmlwQ29kZSA9IGl0ZW0udGVhbVppcENvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVN0cmVldCA9IGl0ZW0udGVhbVN0cmVldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3J1bVVpZCA9IGl0ZW0uZm9ydW1VaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ydW1VcmwgPSBpdGVtLmZvcnVtUGFnZVVyaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpY29uID0gJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjQTAwMDAwIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTIxIDEwYzAgNy05IDEzLTkgMTNzLTktNi05LTEzYTkgOSAwIDAgMSAxOCAweiIgLz48Y2lyY2xlIGN4PSIxMiIgY3k9IjEwIiByPSIzIiAvPjwvc3ZnPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2UgPSBpdGVtLmRpc3RhbmNlICsgJyBrbSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzdGFuY2VWaXNpYmlsaXR5Q2xhc3MgPSAnZC1ibG9jayc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihpdGVtLmRpc3RhbmNlID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VWaXNpYmlsaXR5Q2xhc3MgPSAnZC1ub25lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sc3RyaW5nID0gJyc7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHRtbHN0cmluZyArPSAnJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdtLWJhdWZvcnVtLWl0ZW0iPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnbS1iYXVmb3J1bS1pdGVtLWNvbnRlbnQiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLW5hbWUtMSI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcnVtVXJsICE9PSAiIiA/ICc8YSBocmVmPSInICsgZm9ydW1VcmwgKyAnIiBjbGFzcz0iZ20tYmF1Zm9ydW0tbGluayIgdGl0bGU9IicgKyB0ZWFtTmFtZTEgKyAnIj4nICsgdGVhbU5hbWUxICsgJzwvYT4nIDogJycgKyB0ZWFtTmFtZTEgKyAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idGVhbS1uYW1lLTIiPicgKyB0ZWFtTmFtZTIgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tbmFtZS0zIj4nICsgdGVhbU5hbWUzICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0ZWFtLXN0cmVldCI+JyArIHRlYW1TdHJlZXQgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tYWRkcmVzcyI+JyArIHRlYW1aaXBDb2RlICsgJyAnICsgdGVhbUNpdHkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InRlYW0tcGhvbmUtY29udGFpbmVyIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icGhvbmUtbGFiZWwiPlRlbDo8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0icGhvbmUtbnVtYmVycyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxhIGhyZWY9InRlbDonICsgdGVhbVBob25lSHJlZiArICciIGNsYXNzPSJnbS1iYXVmb3J1bS1saW5rIiB0aXRsZT0iJyArIHRlYW1QaG9uZTEgKyAnIj4nICsgdGVhbVBob25lMSArICc8L2E+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9ImdtLWJhdWZvcnVtLWl0ZW0tZGlzdGFuY2UiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkaXN0YW5jZS1sYWJlbCAnICsgZGlzdGFuY2VWaXNpYmlsaXR5Q2xhc3MgKyAnIj4nK2xhbmdMYWJlbHNbImRpc3RhbmNlIl0rJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJkaXN0YW5jZS12YWx1ZSAnICsgZGlzdGFuY2VWaXNpYmlsaXR5Q2xhc3MgKyAnIj4nICsgZGlzdGFuY2UucmVwbGFjZSgiLiIsICIsIikgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJnbS1iYXVmb3J1bS1pdGVtLWljb24iIGlkPSJiYXVmb3J1bS1pdGVtLScgKyBmb3J1bVVpZCArICciPicgKyBpY29uICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBodG1sc3RyaW5nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiBnZXRJbmZvV2luZG93SHRtbChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUxID0gaXRlbS50ZWFtTmFtZTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUyID0gaXRlbS50ZWFtTmFtZTI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbU5hbWUzID0gaXRlbS50ZWFtTmFtZTM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbUNpdHkgPSBpdGVtLnRlYW1DaXR5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlYW1QaG9uZTEgPSBpdGVtLnRlYW1QaG9uZTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVBob25lSHJlZiA9IGl0ZW0udGVhbVBob25lMS5yZXBsYWNlKC9ccy9nLCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZWFtWmlwQ29kZSA9IGl0ZW0udGVhbVppcENvZGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGVhbVN0cmVldCA9IGl0ZW0udGVhbVN0cmVldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3J1bVVybCA9IGl0ZW0uZm9ydW1QYWdlVXJpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvV2luZG93SHRtbCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8td2luZG93LXdyYXBwZXIiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLW5hbWUtMSI+JyArIChmb3J1bVVybCAhPT0gIiIgPyAnPGEgaHJlZj0iJyArIGZvcnVtVXJsICsgJyIgY2xhc3M9ImdtLWJhdWZvcnVtLWxpbmsiIHRpdGxlPSInICsgdGVhbU5hbWUxICsgJyI+JyArIHRlYW1OYW1lMSArICc8L2E+JyA6ICcnICsgdGVhbU5hbWUxICsgJycpICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby10ZWFtLW5hbWUtMiI+JyArIHRlYW1OYW1lMiArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1uYW1lLTMiPicgKyB0ZWFtTmFtZTMgKyAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8ZGl2IGNsYXNzPSJpbmZvLXRlYW0tc3RyZWV0Ij4nICsgdGVhbVN0cmVldCArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1hZGRyZXNzIj4nICsgdGVhbVppcENvZGUgKyAnICcgKyB0ZWFtQ2l0eSArICc8L2Rpdj4nOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb1dpbmRvd0h0bWwgKz0gJzxkaXYgY2xhc3M9ImluZm8tdGVhbS1waG9uZS1jb250YWluZXIiPic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby1waG9uZS1sYWJlbCI+VGVsOjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPGRpdiBjbGFzcz0iaW5mby1waG9uZS1udW1iZXJzIj48YSBocmVmPSJ0ZWw6JyArIHRlYW1QaG9uZUhyZWYgKyAnIiBjbGFzcz0iZ20tYmF1Zm9ydW0tbGluayIgdGl0bGU9IicgKyB0ZWFtUGhvbmUxICsgJyI+JyArIHRlYW1QaG9uZTEgKyAnPC9hPjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvV2luZG93SHRtbCArPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9XaW5kb3dIdG1sICs9ICc8L2Rpdj4nOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvV2luZG93SHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gc3RhcnRTZWFyY2goKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm9ybSA9ICQoJyNiYXVmb3J1bVNlYXJjaEZvcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYXVmb3JlbkFqYXhMaXN0ID0gJCgnI2JhdWZvcmVuQWpheExpc3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBub1Jlc3VsdHNDb250YWluZXIgPSAkKCcjbm8tcmVzdWx0cycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdWZvcmVuQWpheExpc3QuaHRtbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZy1hbmltYXRpb24nKS5zaG93KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdvb2dsZSBNYXBzIG1heSBiZSB1bmF2YWlsYWJsZSAoZS5nLiB0aGUgQVBJIGtleSBpcyBub3QgdmFsaWQgZm9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudCBkb21haW4pLiBUaGUgZm9ydW0gc2VhcmNoIGl0c2VsZiBpcyBzZXJ2ZXItc2lkZSBhbmQgZG9lcyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgTWFwcywgc28gd2UgZGVncmFkZSBncmFjZWZ1bGx5OiByZW5kZXIgdGhlIHJlc3VsdCBsaXN0IHdpdGhvdXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXAsIG1hcmtlcnMgYW5kIGRpc3RhbmNlIHNvcnRpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXNlTWFwcyA9IG1hcHNBdmFpbGFibGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmZvd2luZG93ID0gdXNlTWFwcyA/IG5ldyBnb29nbGUubWFwcy5JbmZvV2luZG93KHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbE9mZnNldDogbmV3IGdvb2dsZS5tYXBzLlNpemUoLTUsIC0yMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTWFya2VycygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5wb3N0KGZvcm0uYXR0cignYWN0aW9uJyksIGZvcm0uc2VyaWFsaXplKCksIGZ1bmN0aW9uKHJlc3BvbnNlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXNwb25zZVsnZW1wdHknXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9hZGluZy1hbmltYXRpb24nKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9SZXN1bHRzQ29udGFpbmVyLmNzcygnZGlzcGxheScsJ2ZsZXgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXVmb3JlbkFqYXhMaXN0LmFwcGVuZChub1Jlc3VsdHNDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXVmb3JlbkFqYXhMaXN0Lmh0bWwoJzxkaXYgY2xhc3M9Im5vLXJlc3VsdHMiPicgKyBub1Jlc3VsdHNTdHJpbmcgKyAnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcEJvdW5kcyA9IHVzZU1hcHMgPyBuZXcgZ29vZ2xlLm1hcHMuTGF0TG5nQm91bmRzKCkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgIT09IG51bGwgJiYgT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCAhPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub1Jlc3VsdHNDb250YWluZXIuY3NzKCdkaXNwbGF5Jywnbm9uZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKHJlc3BvbnNlLCBmdW5jdGlvbihpLCBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvYWRpbmctYW5pbWF0aW9uJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhdWZvcmVuQWpheExpc3QuYXBwZW5kKGdldEh0bWxUZW1wbGF0ZShpdGVtLCBpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF1c2VNYXBzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIG1hcDogbGlzdCBlbnRyeSBpcyBlbm91Z2guCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlciA9IG5ldyBnb29nbGUubWFwcy5NYXJrZXIoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogbmV3IGdvb2dsZS5tYXBzLkxhdExuZyhpdGVtLmxhdCwgaXRlbS5sb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA6IG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJy9fYXNzZXRzL2EwNmRhOGQ5M2UzYmM4MzcyMmE3MjgyZGZlNjg0NDc3L0ltYWdlcy9pY29uX21hcC1waW4tc29saWQucG5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25faWQ6IGl0ZW0uZm9ydW1VaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJzLnB1c2gobWFya2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBCb3VuZHMuZXh0ZW5kKG1hcmtlci5wb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZm9XaW5kb3dDb250ZW50ID0gZ2V0SW5mb1dpbmRvd0h0bWwoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJhdUZvcnVtSXRlbSA9ICQoJyNiYXVmb3J1bS1pdGVtLScgKyBpdGVtLmZvcnVtVWlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXVGb3J1bUl0ZW0uYmluZCgnY2xpY2snLCBtYXJrZXIsIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChtYXJrZXJzLCBmdW5jdGlvbihpLCBtYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlci5zZXRBbmltYXRpb24obnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VyLnNldEFuaW1hdGlvbihnb29nbGUubWFwcy5BbmltYXRpb24uQk9VTkNFKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3dpbmRvdy5zZXRDb250ZW50KGluZm9XaW5kb3dDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3dpbmRvdy5vcGVuKG1hcCwgbWFya2VyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcEVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFwLWFuY2hvciIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBFbGVtZW50LnNjcm9sbEludG9WaWV3KHtiZWhhdmlvcjogInNtb290aCIsIGJsb2NrOiAic3RhcnQifSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIobWFya2VyLCAnY2xpY2snLCAoZnVuY3Rpb24obWFya2VyLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChtYXJrZXJzLCBmdW5jdGlvbihpLCBtYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXIuc2V0QW5pbWF0aW9uKGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5CT1VOQ0UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3dpbmRvdy5zZXRDb250ZW50KGluZm9XaW5kb3dDb250ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm93aW5kb3cub3BlbihtYXAsIG1hcmtlcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KShtYXJrZXIsIGkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU1hcHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuZml0Qm91bmRzKG1hcEJvdW5kcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoT2JqZWN0LmtleXMocmVzcG9uc2UpLmxlbmd0aCA9PT0gMSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRPcHRpb25zKHsgem9vbTogMTYgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoRm9ybSA9ICQoJyNiYXVmb3J1bVNlYXJjaEZvcm0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXF1ZXN0RGF0YSA9ICQoJyNyZXF1ZXN0LWRhdGEnKS5kYXRhKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgemlwQ29kZSA9IHJlcXVlc3REYXRhWyd6aXAnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb3VudHJ5U2hvcnRDb2RlID0gcmVxdWVzdERhdGFbJ2NvdW50cnknXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNvdW50cnlTaG9ydENvZGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NvdW50cnlTZWFyY2gnKS52YWwoY291bnRyeVNob3J0Q29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih6aXBDb2RlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhZGRyZXNzU2VhcmNoJykudmFsKHppcENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAzMDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hJbmZvSHRtbCA9ICQoJyNiYXVmb3JlbkFqYXhMaXN0JykuaHRtbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub24oJ3N1Ym1pdCcsIHNlYXJjaEZvcm0sZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHppcENvZGVTdHJpbmcgPSAkKCcjYWRkcmVzc1NlYXJjaCcpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB6aXBjb2RlUmVnZXggPSBuZXcgUmVnRXhwKCJeKFswLTldezQsNX0pJCIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGVjayA9IHppcGNvZGVSZWdleC50ZXN0KHppcENvZGVTdHJpbmcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoemlwQ29kZVN0cmluZy5sZW5ndGggPiAwICYmIGNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBzQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZHJlc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWRkcmVzc1NlYXJjaCIpLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvY29kZXIuZ2VvY29kZSggeyAnYWRkcmVzcyc6IGFkZHJlc3N9LCBmdW5jdGlvbihyZXN1bHRzLCBzdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBnb29nbGUubWFwcy5HZW9jb2RlclN0YXR1cy5PSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbGF0JykudmFsKHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24ubGF0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9uJykudmFsKHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24ubG5nKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlYXJjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coIkdlb2NvZGUgd2FzIG5vdCBzdWNjZXNzZnVsIGZvciB0aGUgZm9sbG93aW5nIHJlYXNvbjogIiArIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcHMgdW5hdmFpbGFibGU6IHNlYXJjaCBieSB6aXAgY29kZSBvbmx5IChubyBkaXN0YW5jZSBzb3J0aW5nKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsYXQnKS52YWwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjbG9uJykudmFsKDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWFyY2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsYXQnKS52YWwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNsb24nKS52YWwoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VhcmNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVhdmVzIHRoZSBnZW9sb2NhdGlvbiBtb2RlIHNvIHRoZSB1c2VyIGNhbiB0eXBlIGEgemlwIGNvZGUgcmlnaHQgYXdheS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdlb2xvY2F0aW9uRmFpbGVkKG1lc3NhZ2VLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyb3JDb250YWluZXIgPSAkKCcjZ2VvbG9jYXRpb24tZXJyb3InKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhZGRyZXNzU2VhcmNoJykuYXR0cigicmVhZG9ubHkiLCBmYWxzZSkudHJpZ2dlcignZm9jdXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvbnRhaW5lci50ZXh0KGVycm9yQ29udGFpbmVyLmRhdGEobWVzc2FnZUtleSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRBZGRyZXNzQ29tcG9uZW50KHJlc3VsdCwgdHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuYWRkcmVzc19jb21wb25lbnRzLmZpbmQoZnVuY3Rpb24gKGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnR5cGVzLmluZGV4T2YodHlwZSkgIT09IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCdjaGFuZ2UnLCAnI2dlb2xvY2F0aW9uJyxmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcXVlc3RJZCA9ICsrZ2VvbG9jYXRpb25SZXF1ZXN0SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlzQ3VycmVudFJlcXVlc3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0SWQgPT09IGdlb2xvY2F0aW9uUmVxdWVzdElkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWVycm9yJykudGV4dCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykuaXMoJzpjaGVja2VkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS5hdHRyKCJyZWFkb25seSIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjZ2VvbG9jYXRpb24tbG9hZCcpLmNzcygnZGlzcGxheScsJ2ZsZXgnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCdnZW9sb2NhdGlvbicgaW4gbmF2aWdhdG9yKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ3VuYXZhaWxhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oZnVuY3Rpb24ocG9zaXRpb24pewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0N1cnJlbnRSZXF1ZXN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcHNBdmFpbGFibGUoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgZ2VvY29kaW5nIChjb29yZHMgLT4gemlwKSBuZWVkcyBNYXBzOyBjYW5ub3QgY29udGludWUgd2l0aG91dCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiTWFwcyB1bmF2YWlsYWJsZTogZ2VvbG9jYXRpb24gc2VhcmNoIG5lZWRzIHRoZSBNYXBzIEFQSS4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndW5hdmFpbGFibGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2VvY29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IG5ldyBnb29nbGUubWFwcy5MYXRMbmcocG9zaXRpb24uY29vcmRzLmxhdGl0dWRlLCBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9jb2Rlci5nZW9jb2RlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnbG9jYXRpb24nOiBwb2ludH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKHJlc3VsdHMsIHN0YXR1cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFJlcXVlc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCByZXN1bHQgaXMgbm90IGFsd2F5cyB0aGUgb25lIGNhcnJ5aW5nIHRoZSB6aXAgY29kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IChzdGF0dXMgPT09IGdvb2dsZS5tYXBzLkdlb2NvZGVyU3RhdHVzLk9LICYmIHJlc3VsdHMpID8gcmVzdWx0cy5maW5kKGZ1bmN0aW9uIChjYW5kaWRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWZpbmRBZGRyZXNzQ29tcG9uZW50KGNhbmRpZGF0ZSwgJ3Bvc3RhbF9jb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zdGFsQ29kZSA9IGZpbmRBZGRyZXNzQ29tcG9uZW50KHJlc3VsdCwgJ3Bvc3RhbF9jb2RlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRyeUNvZGUgPSBmaW5kQWRkcmVzc0NvbXBvbmVudChyZXN1bHQsICdjb3VudHJ5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRyeVNlbGVjdCA9ICQoJyNjb3VudHJ5U2VhcmNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goY291bnRyeUNvZGUgPyBjb3VudHJ5Q29kZS5zaG9ydF9uYW1lIDogJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdERSc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cnlTZWxlY3QudmFsKCdEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NIJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJ0NIJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0xVJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJ0wnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeVNlbGVjdC52YWwoJ0QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIiNhZGRyZXNzU2VhcmNoIikudmFsKHBvc3RhbENvZGUubG9uZ19uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNnZW9sb2NhdGlvbi1sb2FkJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xhdCcpLnZhbChwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2xvbicpLnZhbChwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlYXJjaCgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJSZXZlcnNlIGdlb2NvZGluZyBmb3VuZCBubyB6aXAgY29kZS4gU3RhdHVzOiAiICsgc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCd1bmF2YWlsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3VycmVudFJlcXVlc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3IuY29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgZXJyb3IuUEVSTUlTU0lPTl9ERU5JRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlb2xvY2F0aW9uRmFpbGVkKCdkZW5pZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBlcnJvci5USU1FT1VUOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9sb2NhdGlvbkZhaWxlZCgndGltZW91dCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQT1NJVElPTl9VTkFWQUlMQUJMRSwgZS5nLiBDb3JlTG9jYXRpb24ga0NMRXJyb3JMb2NhdGlvblVua25vd24gb24gbWFjT1MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbG9jYXRpb25GYWlsZWQoJ3VuYXZhaWxhYmxlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgemlwIGNvZGUgaXMgYWxsIHdlIG5lZWQsIHNvIGEgY29hcnNlIG9yIGNhY2hlZCBwb3NpdGlvbiBpcyBmaW5lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlSGlnaEFjY3VyYWN5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4aW11bUFnZTogMzAwMDAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2FkZHJlc3NTZWFyY2gnKS5hdHRyKCJyZWFkb25seSIsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2dlb2xvY2F0aW9uLWxvYWQnKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5tZW51QmF1Zm9ydW1TZWFyY2gnKS5vbignc3VibWl0JyxmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjYWRkcmVzc1NlYXJjaCcpLnZhbCgkKHRoaXMpLmZpbmQoJy56aXAtc2VhcmNoLWlucHV0JykudmFsKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5uYXYtb3ZlcmxheScpLnJlbW92ZUNsYXNzKCdvcGVuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLnJlbW92ZUNsYXNzKCdub3Njcm9sbCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzY3JvbGxUbyA9ICQoJyN6aXAtYW5jaG9yJykub2Zmc2V0KCkudG9wIC0gJCgnLmhlYWRlci13cmFwcGVyJykub3V0ZXJIZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe3RvcDogc2Nyb2xsVG8sIGJlaGF2aW9yOiAnc21vb3RoJ30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRSYW5nZVNsaWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyYWRpdXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhbmdlVmFsdWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmFuZ2VWYWx1ZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5pdFZhbFBlcmNlbnQgPSAoaW5wdXRSYW5nZVNsaWRlci52YWx1ZUFzTnVtYmVyICAtIHBhcnNlSW50KGlucHV0UmFuZ2VTbGlkZXIubWluKSkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcnNlSW50KGlucHV0UmFuZ2VTbGlkZXIubWF4KSAtIHBhcnNlSW50KGlucHV0UmFuZ2VTbGlkZXIubWluKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFuZ2VTbGlkZXIuc3R5bGUgPSAnYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAlIDAlLCAxMDAlIDAlLCBjb2xvci1zdG9wKCcgKyBpbml0VmFsUGVyY2VudCArICcsICNBMDAwMDApLCBjb2xvci1zdG9wKCcgKyBpbml0VmFsUGVyY2VudCArICcsICNlNWU1ZTMpKTsnOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VWYWx1ZS5pbm5lckhUTUwgPSBpbnB1dFJhbmdlU2xpZGVyLnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFJhbmdlU2xpZGVyLmlubmVySFRNTCA9IGlucHV0UmFuZ2VTbGlkZXIudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFuZ2VTbGlkZXIub25pbnB1dCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VWYWx1ZS5pbm5lckhUTUwgPSB0aGlzLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWxQZXJjZW50ID0gKGlucHV0UmFuZ2VTbGlkZXIudmFsdWVBc051bWJlciAgLSBwYXJzZUludChpbnB1dFJhbmdlU2xpZGVyLm1pbikpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5tYXgpIC0gcGFyc2VJbnQoaW5wdXRSYW5nZVNsaWRlci5taW4pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmFuZ2VTbGlkZXIuc3R5bGUgPSAnYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDAlIDAlLCAxMDAlIDAlLCBjb2xvci1zdG9wKCcgKyB2YWxQZXJjZW50ICsgJywgI0EwMDAwMCksIGNvbG9yLXN0b3AoJyArIHZhbFBlcmNlbnQgKyAnLCAjZTVlNWUzKSk7JzsKCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICA=
Mit Klick auf Google Maps willige ich in die Verarbeitung meiner Daten durch Google ein. Diese Einwilligung kann jederzeit mit Wirkung für die Zukunft widerrufen werden. Weitere Informationen können unserer Datenschutzerklärung entnommen werden.
Aperçu de toutes les agences conseil
Montreux
Agence Suisse Romande
Avenue des Alpes 80 B
1820 Montreux
Tèl:
079 9372180
Vers l’agence conseil
Thun
Zelglistrasse 6
3608 Thun
Tèl:
078 8809001
Vers l’agence conseil
Zofingen
Brühlstrasse 5
4800 Zofingen
Tèl:
079 502 77 19
Vers l’agence conseil
Kreuzlingen
Müligässli 1
8598 Bottighofen
Tèl:
044 945 27 27
Vers l’agence conseil
