eval(atob("CgpsZXQgaGlzdG9yeUlkID0gJyc7Cgpjb25zdCBjaGF0Ym94SFRNTGdUQ2I3WWtiU2ggPSBgCiAgPGRpdiBjbGFzcz0iY2hhdGJveGdUQ2I3WWtiU2giIGlkPSJjaGF0Ym94Z1RDYjdZa2JTaCI+CiAgICA8ZGl2IGNsYXNzPSJjaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2ggY2hhdGJveC1sZWF2ZWdUQ2I3WWtiU2ggaGlkZGVuIiBpZD0iY2hhdGJveC1jb250YWluZXJnVENiN1lrYlNoIj4KICAgICAgPGRpdiBjbGFzcz0iaGVhZGVyZ1RDYjdZa2JTaCI+CiAgICAgICAgPGRpdiBjbGFzcz0iYXZhdGFyZ1RDYjdZa2JTaCI+CiAgICAgICAgICA8aW1nIHNyYz0naHR0cHM6Ly93d3cuanVkby1qdWppdHN1LWVjcXVldmlsbHkuZnIvYXNzZXRzL0p1ZG8tMmVkZTJkNTUuaWNvJyBhbHQ9IiIgLz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZWdUQ2I3WWtiU2giPgogICAgICAgICAgPGgzIHN0eWxlPSdjb2xvcjogIzNiOGJmNic+RUpKPC9oMz4KICAgICAgICAgIDxzcGFuPkFJIEFzc2lzdGFudDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2VzZ1RDYjdZa2JTaCIgaWQ9Im1lc3NhZ2VzZ1RDYjdZa2JTaCI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvb3RlcmdUQ2I3WWtiU2giPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0idXNlcklucHV0Z1RDYjdZa2JTaCIgcGxhY2Vob2xkZXI9IlR5cGUgeW91ciBtZXNzYWdlLi4uIiAvPgogICAgICAgIDxidXR0b24gaWQ9InNlbmRCdXR0b25nVENiN1lrYlNoIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE1cHgiIGhlaWdodD0iMTVweCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICAgICAgICAgICAgPHBhdGggZmlsbD0nIzNiOGJmNicgZD0iTTIuMzQ1IDIuMjQ1YTEgMSAwIDAgMSAxLjEwMi0uMTRsMTggOWExIDEgMCAwIDEgMCAxLjc5bC0xOCA5YTEgMSAwIDAgMS0xLjM5Ni0xLjIxMUw0LjYxMyAxM0gxMGExIDEgMCAxIDAgMC0ySDQuNjEzTDIuMDUgMy4zMTZhMSAxIDAgMCAxIC4yOTQtMS4wNzF6IiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgPC9idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJjaGF0LWJ1dHRvbmdUQ2I3WWtiU2giIGlkPSJjaGF0VG9nZ2xlQnV0dG9uZ1RDYjdZa2JTaCI+CiAgICAgIDxpbWcgc3JjPSdodHRwczovL3d3dy5qdWRvLWp1aml0c3UtZWNxdWV2aWxseS5mci9hc3NldHMvSnVkby0yZWRlMmQ1NS5pY28nIC8+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKCi8vIENyZWF0ZSBjaGF0Ym90IGNvbnRhaW5lciB3aXRoIGJldHRlciBpc29sYXRpb24KY29uc3QgY2hhdGJveEVsZW1lbnRnVENiN1lrYlNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CmNoYXRib3hFbGVtZW50Z1RDYjdZa2JTaC5pbm5lckhUTUwgPSBjaGF0Ym94SFRNTGdUQ2I3WWtiU2g7CmNoYXRib3hFbGVtZW50Z1RDYjdZa2JTaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhdGJvdC13aWRnZXQnLCAndHJ1ZScpOwpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoYXRib3hFbGVtZW50Z1RDYjdZa2JTaCk7Cgpjb25zdCBzdHlsZUVsZW1lbnRnVENiN1lrYlNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKY29uc3QgY3NzQ29kZWdUQ2I3WWtiU2ggPSBgCiAgLyogQ2hhdGJvdC1zcGVjaWZpYyBDU1Mgd2l0aCBiZXR0ZXIgaXNvbGF0aW9uICovCiAgW2RhdGEtY2hhdGJvdC13aWRnZXRdIC5oaWRkZW4geyAKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgCiAgfQogIAogIC8qIFNjb3BlIGFsbCBjaGF0Ym90IHN0eWxlcyB0byBwcmV2ZW50IGNvbmZsaWN0cyAqLwogIC5jaGF0Ym94Z1RDYjdZa2JTaCB7IAogICAgei1pbmRleDogOTk5OTk5OTsgCiAgICBwb3NpdGlvbjogZml4ZWQ7IAogICAgYm90dG9tOiA4MHB4OyAKICAgIHJpZ2h0OiAyMHB4OyAKICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlNlZ29lIFVJIiwgUm9ib3RvLCBPeHlnZW4sIFVidW50dSwgQ2FudGFyZWxsLCAiT3BlbiBTYW5zIiwgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICAgIC8qIEVuc3VyZSBpdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHBhZ2UgbGF5b3V0ICovCiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICB9CiAgCiAgLmNoYXRib3hnVENiN1lrYlNoICogewogICAgLyogUmUtZW5hYmxlIHBvaW50ZXIgZXZlbnRzIGZvciBjaGF0Ym90IGVsZW1lbnRzICovCiAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgIC8qIFJlc2V0IGFueSBpbmhlcml0ZWQgc3R5bGVzIHRoYXQgbWlnaHQgY29uZmxpY3QgKi8KICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgfQogIAogIC5jaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2ggeyAKICAgIGJveC1zaGFkb3c6IDFweCAxcHggMTAwcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4yMik7IAogICAgYm9yZGVyLXJhZGl1czogMTBweDsgCiAgICB3aWR0aDogMzUwcHg7IAogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgCiAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlLWluLW91dDsgCiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGhlaWdodDogNTAwcHg7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICBtYXgtaGVpZ2h0OiA4MHZoOwogICAgLyogUHJldmVudCBsYXlvdXQgaW50ZXJmZXJlbmNlICovCiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgfQogIAogIC5oZWFkZXJnVENiN1lrYlNoIHsgCiAgICBjb2xvcjogIzMzMzsgCiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7IAogICAgYm9yZGVyLXJhZGl1czogMTBweCAxMHB4IDBweCAwcHg7IAogICAgZGlzcGxheTogZmxleDsgCiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAKICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7IAogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNjY2NjY2M1NDsgCiAgICBmbGV4LXNocmluazogMDsKICB9CgogIC5oZWFkZXJnVENiN1lrYlNoIGgzIHsgCiAgICBtYXJnaW46IDA7IAogICAgZm9udC1zaXplOiAyMHB4OyAKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogIH0KICAKICAuaGVhZGVyZ1RDYjdZa2JTaCBzcGFuIHsgCiAgICBmb250LXNpemU6IDEycHg7IAogIH0KICAKICAuaGVhZGVyZ1RDYjdZa2JTaCAuYXZhdGFyZ1RDYjdZa2JTaCBpbWcgeyAKICAgIHdpZHRoOiA3MHB4OyAKICAgIGhlaWdodDogYXV0bzsKICB9CiAgCiAgLmhlYWRlcmdUQ2I3WWtiU2ggLnRpdGxlZ1RDYjdZa2JTaCB7IAogICAgbWFyZ2luLWxlZnQ6IDEwcHg7IAogIH0KICAKICAubWVzc2FnZXNnVENiN1lrYlNoIHsgCiAgICBmbGV4LWdyb3c6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMTBweDsgCiAgICBzY3JvbGxiYXItd2lkdGg6IG5vbmU7IC8qIEZpcmVmb3ggKi8KICAgIC1tcy1vdmVyZmxvdy1zdHlsZTogbm9uZTsgLyogSUUvRWRnZSAqLwogIH0KCiAgLm1lc3NhZ2VzZ1RDYjdZa2JTaDo6LXdlYmtpdC1zY3JvbGxiYXIgeyAKICAgIGRpc3BsYXk6IG5vbmU7IC8qIENocm9tZS9TYWZhcmkgKi8KICB9CiAgCiAgLmZvb3RlcmdUQ2I3WWtiU2ggeyAKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjY2NjNTQ7IAogICAgZGlzcGxheTogZmxleDsgCiAgICBmbGV4LWRpcmVjdGlvbjogcm93OyAKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IAogICAgZmxleC1zaHJpbms6IDA7CiAgICBwYWRkaW5nOiA1cHg7CiAgfQoKICAjdXNlcklucHV0Z1RDYjdZa2JTaCB7IAogICAgZm9udC1zaXplOiAxNnB4OyAKICAgIHBhZGRpbmc6IDEwcHg7IAogICAgbWFyZ2luOiA1cHg7IAogICAgYm9yZGVyOiAwOyAKICAgIGNvbG9yOiBibGFjazsKICAgIHdpZHRoOiBjYWxjKDEwMCUgLSA2MHB4KTsKICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgb3V0bGluZTogbm9uZTsKICB9CiAgCiAgI3VzZXJJbnB1dGdUQ2I3WWtiU2g6Zm9jdXMgeyAKICAgIG91dGxpbmU6IG5vbmU7IAogICAgYm9yZGVyOiAxcHggc29saWQgIzNiOGJmNjsKICB9CiAgCiAgI3NlbmRCdXR0b25nVENiN1lrYlNoIHsgCiAgICBwYWRkaW5nOiAxNXB4OyAKICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OyAKICAgIGJvcmRlcjogbm9uZTsgCiAgICBjdXJzb3I6IHBvaW50ZXI7IAogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjNzLCBjdXJzb3IgMC4zczsgCiAgfQoKICAjc2VuZEJ1dHRvbmdUQ2I3WWtiU2g6ZGlzYWJsZWQgeyAKICAgIG9wYWNpdHk6IDAuNTsKICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7CiAgfQogIAogIC5tc2dnVENiN1lrYlNoIHsgCiAgICB3aWR0aDogOTAlOyAKICAgIG1hcmdpbjogNXB4IDA7IAogICAgY2xlYXI6IGJvdGg7CiAgfQogIAogIC5tc2dnVENiN1lrYlNoLnVzZXItbXNnZ1RDYjdZa2JTaCB7IAogICAgZmxvYXQ6IHJpZ2h0OyAKICAgIHRleHQtYWxpZ246IHJpZ2h0OyAKICB9CiAgCiAgLm1zZ2dUQ2I3WWtiU2gudXNlci1tc2dnVENiN1lrYlNoIHNwYW4geyAKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsgCiAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOyAKICAgIGJhY2tncm91bmQtY29sb3I6ICMzYjhiZjY7IAogICAgY29sb3I6IHdoaXRlOyAKICAgIHBhZGRpbmc6IDEwcHg7IAogICAgYm9yZGVyLXJhZGl1czogMTBweDsgCiAgICBtYXgtd2lkdGg6IDgwJTsgCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IAogIH0KICAKICAubXNnZ1RDYjdZa2JTaC5ib3QtbXNnZ1RDYjdZa2JTaCB7IAogICAgZmxvYXQ6IGxlZnQ7IAogIH0KICAKICAubXNnZ1RDYjdZa2JTaC5ib3QtbXNnZ1RDYjdZa2JTaCBzcGFuIHsgCiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IAogICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsgCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTBlMGUwOyAKICAgIGNvbG9yOiBibGFjazsgCiAgICBwYWRkaW5nOiAxMHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7IAogICAgbWF4LXdpZHRoOiA4MCU7IAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAKICB9CgogIC5jaGF0LWJ1dHRvbmdUQ2I3WWtiU2ggeyAKICAgIGJvcmRlcjogbm9uZTsgCiAgICBib3JkZXItcmFkaXVzOiA1JTsgCiAgICB3aWR0aDogNTBweDsgCiAgICBoZWlnaHQ6IDUwcHg7IAogICAgY3Vyc29yOiBwb2ludGVyOyAKICAgIGRpc3BsYXk6IGZsZXg7IAogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IAogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgCiAgICBwb3NpdGlvbjogZml4ZWQ7IAogICAgYm90dG9tOiAyMHB4OyAKICAgIHJpZ2h0OiAyMHB4OyAKICAgIHotaW5kZXg6IDEwMDAwMDAwOyAKICB9CgogIC5jaGF0LWJ1dHRvbmdUQ2I3WWtiU2ggaW1nIHsgCiAgICB3aWR0aDogMTAwJTsgCiAgICBoZWlnaHQ6IDEwMCU7IAogICAgYm9yZGVyLXJhZGl1czogNSU7IAogIH0KCiAgLyogTG9hZGluZyBkb3RzIGFuaW1hdGlvbiAqLwogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIHsgCiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IAogICAgcG9zaXRpb246IHJlbGF0aXZlOyAKICAgIHdpZHRoOiA3NHB4OyAKICAgIGhlaWdodDogMThweDsgCiAgfQogIAogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIGRpdiB7IAogICAgcG9zaXRpb246IGFic29sdXRlOyAKICAgIHRvcDogOHB4OyAKICAgIHdpZHRoOiA4cHg7IAogICAgaGVpZ2h0OiA4cHg7IAogICAgYm9yZGVyLXJhZGl1czogNTAlOyAKICAgIGJhY2tncm91bmQ6ICMzMzM7IAogICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAsIDEsIDEsIDApOyAKICB9CiAgCiAgLmxkcy1lbGxpcHNpc2dUQ2I3WWtiU2ggZGl2Om50aC1jaGlsZCgxKSB7IAogICAgbGVmdDogOHB4OyAKICAgIGFuaW1hdGlvbjogbGRzLWVsbGlwc2lzMWdUQ2I3WWtiU2ggMC42cyBpbmZpbml0ZTsgCiAgfQogIAogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIGRpdjpudGgtY2hpbGQoMikgeyAKICAgIGxlZnQ6IDhweDsgCiAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczJnVENiN1lrYlNoIDAuNnMgaW5maW5pdGU7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXY6bnRoLWNoaWxkKDMpIHsgCiAgICBsZWZ0OiAzMnB4OyAKICAgIGFuaW1hdGlvbjogbGRzLWVsbGlwc2lzMmdUQ2I3WWtiU2ggMC42cyBpbmZpbml0ZTsgCiAgfQogIAogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIGRpdjpudGgtY2hpbGQoNCkgeyAKICAgIGxlZnQ6IDU2cHg7IAogICAgYW5pbWF0aW9uOiBsZHMtZWxsaXBzaXMzZ1RDYjdZa2JTaCAwLjZzIGluZmluaXRlOyAKICB9CiAgCiAgQGtleWZyYW1lcyBsZHMtZWxsaXBzaXMxZ1RDYjdZa2JTaCB7IAogICAgMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDApOyB9IAogICAgMTAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gCiAgfQogIAogIEBrZXlmcmFtZXMgbGRzLWVsbGlwc2lzM2dUQ2I3WWtiU2ggeyAKICAgIDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgxKTsgfSAKICAgIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDApOyB9IAogIH0KICAKICBAa2V5ZnJhbWVzIGxkcy1lbGxpcHNpczJnVENiN1lrYlNoIHsgCiAgICAwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOyB9IAogICAgMTAwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlKDI0cHgsIDApOyB9IAogIH0KCiAgLyogRW50ZXIgYW5kIExlYXZlIGFuaW1hdGlvbnMgd2l0aCB1bmlxdWUgbmFtZXMgKi8KICAuY2hhdGJveC1lbnRlcmdUQ2I3WWtiU2ggeyAKICAgIGFuaW1hdGlvbjogc2xpZGVJblJpZ2h0Q2hhdGJveGdUQ2I3WWtiU2ggMXMgZm9yd2FyZHM7IAogIH0KICAKICAuY2hhdGJveC1sZWF2ZWdUQ2I3WWtiU2ggeyAKICAgIGFuaW1hdGlvbjogc2xpZGVPdXRSaWdodENoYXRib3hnVENiN1lrYlNoIDFzIGZvcndhcmRzOyAKICB9CiAgCiAgQGtleWZyYW1lcyBzbGlkZUluUmlnaHRDaGF0Ym94Z1RDYjdZa2JTaCB7IAogICAgMCUgeyAKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpOyAKICAgICAgb3BhY2l0eTogMDsgCiAgICB9IAogICAgMTAwJSB7IAogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IAogICAgICBvcGFjaXR5OiAxOyAKICAgIH0gCiAgfQogIAogIEBrZXlmcmFtZXMgc2xpZGVPdXRSaWdodENoYXRib3hnVENiN1lrYlNoIHsgCiAgICAwJSB7IAogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7IAogICAgICBvcGFjaXR5OiAxOyAKICAgIH0gCiAgICAxMDAlIHsgCiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsgCiAgICAgIG9wYWNpdHk6IDA7IAogICAgfSAKICB9CgogIC8qIFJlc3BvbnNpdmUgc3R5bGluZyB3aXRoIGJldHRlciBzcGVjaWZpY2l0eSAqLwogIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKG1heC13aWR0aDogNzY4cHgpIHsKICAgIC5jaGF0Ym94Z1RDYjdZa2JTaCAuY2hhdGJveC1jb250YWluZXJnVENiN1lrYlNoIHsKICAgICAgd2lkdGg6IDkwdnc7CiAgICAgIGhlaWdodDogODB2aDsKICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgYm90dG9tOiAwOwogICAgICByaWdodDogMDsKICAgICAgbGVmdDogNXZ3OwogICAgfQogICAgCiAgICAuY2hhdGJveGdUQ2I3WWtiU2ggLm1lc3NhZ2VzZ1RDYjdZa2JTaCB7CiAgICAgIGhlaWdodDogY2FsYyg4MHZoIC0gMTUwcHgpOwogICAgfQogIH0KCiAgLyogUmVzb3VyY2UtcmVsYXRlZCBzdHlsZXMgd2l0aCBwcm9wZXIgc2NvcGluZyAqLwogIC5jaGF0Ym94Z1RDYjdZa2JTaCAuaGVscGZ1bC1saW5rcy1idXR0b24gewogICAgYmFja2dyb3VuZC1jb2xvcjogIzNiOGJmNjsKICAgIGNvbG9yOiB3aGl0ZTsKICAgIGJvcmRlcjogbm9uZTsKICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIG1hcmdpbi10b3A6IDEwcHg7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3M7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWJveCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjBmMGYwOwogICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICAgIHBhZGRpbmc6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGZsZXg6IDEgMSBjYWxjKDI1JSAtIDIwcHgpOwogICAgbWF4LXdpZHRoOiBjYWxjKDI1JSAtIDIwcHgpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHRyYW5zaXRpb246IGJveC1zaGFkb3cgMC4zczsKICB9CgogIC5jaGF0Ym94Z1RDYjdZa2JTaCAucmVzb3VyY2UtYm94OmhvdmVyIHsKICAgIGJveC1zaGFkb3c6IDAgMCAxMHB4IHJnYmEoMCwgMTIzLCAyNTUsIDAuNSk7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWJveCBhIHsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGNvbG9yOiAjM2I4YmY2OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICB9CgogIC5jaGF0Ym94Z1RDYjdZa2JTaCAuaGVscGZ1bC1saW5rcy1idXR0b246aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzNiOGJmNjsKICB9CgogIC5jaGF0Ym94Z1RDYjdZa2JTaCAuYXJyb3ctaWNvbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICB9CgogIC5jaGF0Ym94Z1RDYjdZa2JTaCAucmVzb3VyY2VzLWNvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBmbGV4OyAgICAgICAgICAgCiAgICBmbGV4LXdyYXA6IHdyYXA7ICAgICAgICAgCiAgICBnYXA6IDEwcHg7ICAgICAgICAgCiAgICBtYXJnaW4tdG9wOiAxMHB4OyAgICAgICAgCiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlcy1oZWFkZXIgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlcy1saXN0IHsKICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgIHBhZGRpbmctbGVmdDogMDsKICAgIG1hcmdpbjogMDsKICB9CgogIC5jaGF0Ym94Z1RDYjdZa2JTaCAucmVzb3VyY2UtaXRlbSB7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBmb250LXNpemU6IDE0cHg7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWl0ZW0gYSB7CiAgICBjb2xvcjogIzNiOGJmNjsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA1cHg7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWl0ZW0gYTpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB9CgogIC8qIFRvb2x0aXAgc3R5bGVzIHdpdGggcHJvcGVyIHNjb3BpbmcgKi8KICAuY2hhdGJveGdUQ2I3WWtiU2ggLnRvb2x0aXAgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYmFja2dyb3VuZC1jb2xvcjogIzMzMzsKICAgIGNvbG9yOiAjZmZmOwogICAgcGFkZGluZzogNXB4OwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgZm9udC1zaXplOiAxMnB4OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIHotaW5kZXg6IDEwMDA7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnRvb2x0aXAtdmlzaWJsZSB7CiAgICBvcGFjaXR5OiAxOwogIH0KYDsKCi8vIEFkZCBGb250IEF3ZXNvbWUgd2l0aCBlcnJvciBoYW5kbGluZwpmdW5jdGlvbiBhZGRGb250QXdlc29tZSgpIHsKICBpZiAoIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZio9ImZvbnQtYXdlc29tZSJdJykpIHsKICAgIGNvbnN0IGZvbnRBd2Vzb21lTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKTsKICAgIGZvbnRBd2Vzb21lTGluay5yZWwgPSAic3R5bGVzaGVldCI7CiAgICBmb250QXdlc29tZUxpbmsuaHJlZiA9ICJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9mb250LWF3ZXNvbWUvNi4wLjAtYmV0YTMvY3NzL2FsbC5taW4uY3NzIjsKICAgIGZvbnRBd2Vzb21lTGluay5vbmVycm9yID0gZnVuY3Rpb24oKSB7CiAgICAgIGNvbnNvbGUud2FybignRm9udCBBd2Vzb21lIGZhaWxlZCB0byBsb2FkLCB1c2luZyBmYWxsYmFjayBpY29ucycpOwogICAgfTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZm9udEF3ZXNvbWVMaW5rKTsKICB9Cn0KCi8vIEFkZCBzdHlsZXMgd2l0aCBiZXR0ZXIgZXJyb3IgaGFuZGxpbmcKc3R5bGVFbGVtZW50Z1RDYjdZa2JTaC50ZXh0Q29udGVudCA9IGNzc0NvZGVnVENiN1lrYlNoOwpzdHlsZUVsZW1lbnRnVENiN1lrYlNoLnNldEF0dHJpYnV0ZSgnZGF0YS1jaGF0Ym90LXN0eWxlcycsICd0cnVlJyk7CmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50Z1RDYjdZa2JTaCk7CmFkZEZvbnRBd2Vzb21lKCk7CgovLyBFbmhhbmNlZCBlbGVtZW50IHdhaXRpbmcgZnVuY3Rpb24KZnVuY3Rpb24gd2FpdEZvckVsZW1lbnQoaWQsIGNhbGxiYWNrLCBtYXhBdHRlbXB0cyA9IDUwKSB7CiAgbGV0IGF0dGVtcHRzID0gMDsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogIGlmIChlbGVtZW50KSB7CiAgICBjYWxsYmFjayhlbGVtZW50KTsKICB9IGVsc2UgewogICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7CiAgICAgIGF0dGVtcHRzKys7CiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwogICAgICBpZiAoZWwpIHsKICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTsKICAgICAgICBjYWxsYmFjayhlbCk7CiAgICAgIH0gZWxzZSBpZiAoYXR0ZW1wdHMgPj0gbWF4QXR0ZW1wdHMpIHsKICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTsKICAgICAgICBjb25zb2xlLmVycm9yKGBFbGVtZW50IHdpdGggaWQgIiR7aWR9IiBub3QgZm91bmQgYWZ0ZXIgJHttYXhBdHRlbXB0c30gYXR0ZW1wdHNgKTsKICAgICAgfQogICAgfSwgMTAwKTsKICB9Cn0KCi8vIFdyYXAgaW5pdGlhbGl6YXRpb24gaW4gSUlGRSB3aXRoIGVycm9yIGhhbmRsaW5nCihmdW5jdGlvbiBpbml0aWFsaXplQ2hhdGJvdCgpIHsKICB0cnkgewogICAgd2FpdEZvckVsZW1lbnQoImNoYXRUb2dnbGVCdXR0b25nVENiN1lrYlNoIiwgKGNoYXRUb2dnbGVCdXR0b24pID0+IHsKICAgICAgd2FpdEZvckVsZW1lbnQoImNoYXRib3gtY29udGFpbmVyZ1RDYjdZa2JTaCIsIChjaGF0Ym94Q29udGFpbmVyKSA9PiB7CiAgICAgICAgd2FpdEZvckVsZW1lbnQoIm1lc3NhZ2VzZ1RDYjdZa2JTaCIsIChtZXNzYWdlc0RpdikgPT4gewogICAgICAgICAgd2FpdEZvckVsZW1lbnQoInVzZXJJbnB1dGdUQ2I3WWtiU2giLCAodXNlcklucHV0KSA9PiB7CiAgICAgICAgICAgIHdhaXRGb3JFbGVtZW50KCJzZW5kQnV0dG9uZ1RDYjdZa2JTaCIsIChzZW5kQnV0dG9uKSA9PiB7CiAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBjaGF0Ym90IGZ1bmN0aW9uYWxpdHkKICAgICAgICAgICAgICBpbml0aWFsaXplQ2hhdGJvdEZlYXR1cmVzKGNoYXRUb2dnbGVCdXR0b24sIGNoYXRib3hDb250YWluZXIsIG1lc3NhZ2VzRGl2LCB1c2VySW5wdXQsIHNlbmRCdXR0b24pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0pOwogIH0gY2F0Y2ggKGVycm9yKSB7CiAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbml0aWFsaXppbmcgY2hhdGJvdDonLCBlcnJvcik7CiAgfQp9KSgpOwoKZnVuY3Rpb24gaW5pdGlhbGl6ZUNoYXRib3RGZWF0dXJlcyhjaGF0VG9nZ2xlQnV0dG9uLCBjaGF0Ym94Q29udGFpbmVyLCBtZXNzYWdlc0RpdiwgdXNlcklucHV0LCBzZW5kQnV0dG9uKSB7CiAgLy8gRW5zdXJlIGNoYXRib3ggaXMgaW5pdGlhbGx5IGhpZGRlbgogIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CgogIC8vIFRvZ2dsZSBjaGF0Ym94IHZpc2liaWxpdHkKICBjaGF0VG9nZ2xlQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAKICAgIGlmIChjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5jb250YWlucygiaGlkZGVuIikpIHsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJjaGF0Ym94LWxlYXZlZ1RDYjdZa2JTaCIpOwogICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImNoYXRib3gtZW50ZXJnVENiN1lrYlNoIik7CiAgICB9IGVsc2UgewogICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoImNoYXRib3gtZW50ZXJnVENiN1lrYlNoIik7CiAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LmFkZCgiY2hhdGJveC1sZWF2ZWdUQ2I3WWtiU2giKTsKICAgICAgCiAgICAgIGNvbnN0IGhhbmRsZUFuaW1hdGlvbkVuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIik7CiAgICAgICAgY2hhdGJveENvbnRhaW5lci5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLCBoYW5kbGVBbmltYXRpb25FbmQpOwogICAgICB9OwogICAgICAKICAgICAgY2hhdGJveENvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLCBoYW5kbGVBbmltYXRpb25FbmQpOwogICAgfQogIH0pOwoKICAvLyBTZW5kIG1lc3NhZ2UgZnVuY3Rpb25hbGl0eQogIGZ1bmN0aW9uIHNlbmRNZXNzYWdlKCkgewogICAgY29uc3QgdXNlck1lc3NhZ2UgPSB1c2VySW5wdXQudmFsdWUudHJpbSgpOwogICAgaWYgKHVzZXJNZXNzYWdlICE9PSAiIikgewogICAgICBhZGRNZXNzYWdlKCJ1c2VyIiwgdXNlck1lc3NhZ2UsIFtdKTsKICAgICAgYXNrQ2hhdGJvdCh1c2VyTWVzc2FnZSk7CiAgICAgIHVzZXJJbnB1dC52YWx1ZSA9ICIiOwogICAgfQogIH0KCiAgc2VuZEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgc2VuZE1lc3NhZ2UoKTsKICB9KTsKCiAgdXNlcklucHV0LmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgIGlmIChldmVudC5rZXkgPT09ICJFbnRlciIpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgc2VuZE1lc3NhZ2UoKTsKICAgIH0KICB9KTsKCiAgLy8gVG9vbHRpcCBmdW5jdGlvbnMKICBmdW5jdGlvbiBzaG93VG9vbHRpcChldmVudCwgdGV4dCkgewogICAgY29uc3QgY2hhdGJveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtZXNzYWdlc2dUQ2I3WWtiU2giKTsKICAgIGxldCB0b29sdGlwID0gY2hhdGJveC5xdWVyeVNlbGVjdG9yKCIudG9vbHRpcCIpOwoKICAgIGlmICghdG9vbHRpcCkgewogICAgICB0b29sdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIHRvb2x0aXAuY2xhc3NOYW1lID0gInRvb2x0aXAiOwogICAgICBjaGF0Ym94LmFwcGVuZENoaWxkKHRvb2x0aXApOwogICAgfQoKICAgIHRvb2x0aXAudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgdG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJ0b29sdGlwLXZpc2libGUiKTsKCiAgICBjb25zdCBjaGF0Ym94UmVjdCA9IGNoYXRib3guZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgogICAgbGV0IGxlZnQgPSBldmVudC5jbGllbnRYIC0gY2hhdGJveFJlY3QubGVmdCArIDEwOwogICAgbGV0IHRvcCA9IGV2ZW50LmNsaWVudFkgLSBjaGF0Ym94UmVjdC50b3AgKyAxMDsKCiAgICBpZiAobGVmdCArIHRvb2x0aXBSZWN0LndpZHRoID4gY2hhdGJveFJlY3Qud2lkdGgpIHsKICAgICAgbGVmdCA9IGNoYXRib3hSZWN0LndpZHRoIC0gdG9vbHRpcFJlY3Qud2lkdGggLSAxMDsKICAgIH0KCiAgICBpZiAodG9wICsgdG9vbHRpcFJlY3QuaGVpZ2h0ID4gY2hhdGJveFJlY3QuaGVpZ2h0KSB7CiAgICAgIHRvcCA9IGNoYXRib3hSZWN0LmhlaWdodCAtIHRvb2x0aXBSZWN0LmhlaWdodCAtIDEwOwogICAgfQoKICAgIHRvb2x0aXAuc3R5bGUubGVmdCA9IGAke2xlZnR9cHhgOwogICAgdG9vbHRpcC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgOwogIH0KCiAgZnVuY3Rpb24gaGlkZVRvb2x0aXAoKSB7CiAgICBjb25zdCB0b29sdGlwID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLmNoYXRib3hnVENiN1lrYlNoIC50b29sdGlwIik7CiAgICBpZiAodG9vbHRpcCkgewogICAgICB0b29sdGlwLnJlbW92ZSgpOwogICAgfQogIH0KCiAgLy8gQWRkIGluaXRpYWwgd2VsY29tZSBtZXNzYWdlCiAgYWRkTWVzc2FnZSgiYm90IiwgJ0JpZW52ZW51ICEgSmUgc3VpcyB0b24gYXNzaXN0YW50IHZpcnR1ZWwsIHBhc3Npb25uZSBwYXIgbGUganVkbywgdG91am91cnMgY29ubmVjdGUgYSBsIGFjdHVhbGl0ZSBldCBhdXggZXZlbmVtZW50cyBlbiBGcmFuY2UuJywgW10pOwoKICAvLyBGZXRjaCB1c2VyIGxvY2F0aW9uIGRhdGEKICBhc3luYyBmdW5jdGlvbiBmZXRjaEV4dHJhRGF0YSgpIHsKICAgIHRyeSB7CiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vaXB3aG8uaXMvJyk7CiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgX2V4dHJhX2lkOiBkYXRhLmlwLAogICAgICAgIF9leHRyYV9jaTogZGF0YS5jaXR5LAogICAgICAgIF9leHRyYV9yZzogZGF0YS5yZWdpb24sCiAgICAgICAgX2V4dHJhX2NvOiBkYXRhLmNvdW50cnksCiAgICAgIH07CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGZldGNoIGxvY2F0aW9uIGRhdGE6JywgZXJyKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvLyBBZGQgbWVzc2FnZSB0byBjaGF0CiAgZnVuY3Rpb24gYWRkTWVzc2FnZShzZW5kZXIsIG1lc3NhZ2UsIHNvdXJjZXMgPSBbXSkgewogICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgdHJ5IHsKICAgICAgICBjb25zdCBtZXNzYWdlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgCiAgICAgICAgaWYgKHNlbmRlciA9PT0gImJvdCIpIHsKICAgICAgICAgIG1lc3NhZ2VEaXYuY2xhc3NOYW1lID0gIm1zZ2dUQ2I3WWtiU2ggYm90LW1zZ2dUQ2I3WWtiU2giOwogICAgICAgICAgbWVzc2FnZURpdi5pbm5lckhUTUwgPSAiPHNwYW4+PC9zcGFuPiI7CiAgICAgICAgICBtZXNzYWdlc0Rpdi5hcHBlbmRDaGlsZChtZXNzYWdlRGl2KTsKICAgICAgICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKCiAgICAgICAgICAvLyBBZGQgaGVscGZ1bCBsaW5rcyBpZiBzb3VyY2VzIGV4aXN0CiAgICAgICAgICBpZiAoc291cmNlcy5sZW5ndGggIT09IDApIHsgICAKICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYnV0dG9uIik7CiAgICAgICAgICAgIGJ1dHRvbi5jbGFzc05hbWUgPSAiaGVscGZ1bC1saW5rcy1idXR0b24iOwogICAgICAgICAgICBidXR0b24uaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgIDxpIGNsYXNzPSJmYXMgZmEtbGluayI+PC9pPiBIZWxwZnVsIExpbmtzIAogICAgICAgICAgICAgIDxpIGNsYXNzPSJmYXMgZmEtY2hldnJvbi1kb3duIGFycm93LWljb24iPjwvaT4KICAgICAgICAgICAgYDsKICAgICAgICAgICAgbWVzc2FnZURpdi5hcHBlbmRDaGlsZChidXR0b24pOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VzQ29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5jbGFzc05hbWUgPSAicmVzb3VyY2VzLWNvbnRhaW5lciI7CiAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOwoKICAgICAgICAgICAgc291cmNlcy5mb3JFYWNoKChzb3VyY2UsIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgY29uc3QgcmVzb3VyY2VCb3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAgICAgICByZXNvdXJjZUJveC5jbGFzc05hbWUgPSAicmVzb3VyY2UtYm94IjsKICAgICAgICAgICAgICByZXNvdXJjZUJveC5pbm5lckhUTUwgPSBgCiAgICAgICAgICAgICAgICA8YSBocmVmPSIke3NvdXJjZX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmFzIGZhLWV4dGVybmFsLWxpbmstYWx0Ij48L2k+IGxpbmske2luZGV4KzF9CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgYDsKICAgICAgICAgICAgICAKICAgICAgICAgICAgICByZXNvdXJjZUJveC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIiwgKGV2ZW50KSA9PiBzaG93VG9vbHRpcChldmVudCwgc291cmNlKSk7CiAgICAgICAgICAgICAgcmVzb3VyY2VCb3guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsIGhpZGVUb29sdGlwKTsKICAgICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuYXBwZW5kQ2hpbGQocmVzb3VyY2VCb3gpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgCiAgICAgICAgICAgIG1lc3NhZ2VEaXYuYXBwZW5kQ2hpbGQocmVzb3VyY2VzQ29udGFpbmVyKTsKCiAgICAgICAgICAgIGJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgY29uc3QgYXJyb3dJY29uID0gYnV0dG9uLnF1ZXJ5U2VsZWN0b3IoJy5hcnJvdy1pY29uJyk7CiAgICAgICAgICAgICAgaWYgKHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScgfHwgcmVzb3VyY2VzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdmbGV4JzsKICAgICAgICAgICAgICAgIGFycm93SWNvbi5jbGFzc05hbWUgPSAnZmFzIGZhLWNoZXZyb24tdXAgYXJyb3ctaWNvbic7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYXJyb3dJY29uLmNsYXNzTmFtZSA9ICdmYXMgZmEtY2hldnJvbi1kb3duIGFycm93LWljb24nOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVHlwaW5nIGFuaW1hdGlvbgogICAgICAgICAgY29uc3Qgc3BhbiA9IG1lc3NhZ2VEaXYucXVlcnlTZWxlY3Rvcigic3BhbiIpOwogICAgICAgICAgY29uc3QgbGV0dGVycyA9IG1lc3NhZ2Uuc3BsaXQoIiIpOwogICAgICAgICAgbGV0dGVycy5mb3JFYWNoKChsZXR0ZXIsIGkpID0+IHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgc3Bhbi5pbm5lckhUTUwgKz0gbGV0dGVyOwogICAgICAgICAgICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKICAgICAgICAgICAgICBpZiAoaSA9PT0gbGV0dGVycy5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICByZXNvbHZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCA1MCAqIGkpOwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1lc3NhZ2VEaXYuY2xhc3NOYW1lID0gIm1zZ2dUQ2I3WWtiU2ggdXNlci1tc2dnVENiN1lrYlNoIjsKICAgICAgICAgIG1lc3NhZ2VEaXYuaW5uZXJIVE1MID0gYDxzcGFuPiR7bWVzc2FnZX08L3NwYW4+YDsKICAgICAgICAgIG1lc3NhZ2VzRGl2LmFwcGVuZENoaWxkKG1lc3NhZ2VEaXYpOwogICAgICAgICAgbWVzc2FnZXNEaXYuc2Nyb2xsVG9wID0gbWVzc2FnZXNEaXYuc2Nyb2xsSGVpZ2h0OwogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZWplY3QoZXJyb3IpOwogICAgICB9CiAgICB9KTsKICB9CgogIC8vIExvYWRpbmcgbWVzc2FnZSBmdW5jdGlvbnMKICBmdW5jdGlvbiBhZGRMb2FkaW5nTXNnKCkgewogICAgY29uc3QgbWVzc2FnZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgbWVzc2FnZURpdi5jbGFzc05hbWUgPSAibXNnZ1RDYjdZa2JTaCBib3QtbXNnZ1RDYjdZa2JTaCI7CiAgICBtZXNzYWdlRGl2LmlkID0gImxvYWRpbmdNc2dnVENiN1lrYlNoIjsKICAgIG1lc3NhZ2VEaXYuaW5uZXJIVE1MID0gJzxzcGFuPjxkaXYgY2xhc3M9Imxkcy1lbGxpcHNpc2dUQ2I3WWtiU2giPjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PC9kaXY+PC9zcGFuPic7CiAgICBtZXNzYWdlc0Rpdi5hcHBlbmRDaGlsZChtZXNzYWdlRGl2KTsKICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZUxvYWRpbmdNc2coKSB7CiAgICBjb25zdCBsb2FkaW5nTXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImxvYWRpbmdNc2dnVENiN1lrYlNoIik7CiAgICBpZiAobG9hZGluZ01zZykgewogICAgICBsb2FkaW5nTXNnLnJlbW92ZSgpOwogICAgfQogIH0KCiAgLy8gQ29va2llIGhlbHBlcgogIGZ1bmN0aW9uIGdldENvb2tpZShuYW1lKSB7CiAgICBjb25zdCBjb29raWVzID0gZG9jdW1lbnQuY29va2llLnNwbGl0KCI7ICIpOwogICAgZm9yIChsZXQgY29va2llIG9mIGNvb2tpZXMpIHsKICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gY29va2llLnNwbGl0KCI9Iik7CiAgICAgIGlmIChrZXkgPT09IG5hbWUpIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgLy8gTWFpbiBjaGF0Ym90IEFQSSBjYWxsCiAgYXN5bmMgZnVuY3Rpb24gYXNrQ2hhdGJvdChtZXNzYWdlKSB7CiAgICB0cnkgewogICAgICBoaXN0b3J5SWQgPSBnZXRDb29raWUoImhpc3RvcnlJZCIpOwogICAgICBjb25zdCBfZXh0cmEgPSBhd2FpdCBmZXRjaEV4dHJhRGF0YSgpOwogICAgICAKICAgICAgY29uc3QgZGF0YSA9IHsKICAgICAgICBjaGF0Ym90X25hbWU6ICdFSkonLAogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgb3BlbnNlYXJjaF9hbGlhczogJzc1YWI2MWJhLWU0ZDUtNDIyNi05MjY1LWU1M2NmYzcwYTU3NycsCiAgICAgICAgdXNlcl9sb2NhdGlvbjogX2V4dHJhLAogICAgICAgIGhpc3RvcnlJZDogaGlzdG9yeUlkLAogICAgICB9OwoKICAgICAgYWRkTG9hZGluZ01zZygpOwogICAgICB1c2VySW5wdXQuZGlzYWJsZWQgPSB0cnVlOwogICAgICBzZW5kQnV0dG9uLmRpc2FibGVkID0gdHJ1ZTsKCiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LnBhc3Npc3RvLmNvbS9jaGF0Ym90JywgewogICAgICAgIG1ldGhvZDogIlBPU1QiLAogICAgICAgIGhlYWRlcnM6IHsgIkNvbnRlbnQtVHlwZSI6ICJhcHBsaWNhdGlvbi9qc29uIiB9LAogICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLAogICAgICB9KTsKCiAgICAgIGlmICghcmVzcG9uc2Uub2spIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YCk7CiAgICAgIH0KCiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTsKICAgICAgaGlzdG9yeUlkID0gcmVzcG9uc2VEYXRhLmhpc3RvcnlJZDsKCiAgICAgIGlmIChyZXNwb25zZURhdGEuaGlzdG9yeUlkKSB7CiAgICAgICAgZG9jdW1lbnQuY29va2llID0gYGhpc3RvcnlJZD0ke3Jlc3BvbnNlRGF0YS5oaXN0b3J5SWR9OyBwYXRoPS87IG1heC1hZ2U9MzYwMDsgU2FtZVNpdGU9U3RyaWN0YDsKICAgICAgfQoKICAgICAgcmVtb3ZlTG9hZGluZ01zZygpOwogICAgICBhd2FpdCBhZGRNZXNzYWdlKCJib3QiLCByZXNwb25zZURhdGEuYW5zd2VyLCByZXNwb25zZURhdGEuc291cmNlRG9jdW1lbnRzKTsKICAgICAgCiAgICB9IGNhdGNoIChlcnJvcikgewogICAgICBjb25zb2xlLmVycm9yKCJDaGF0Ym90IGVycm9yOiIsIGVycm9yKTsKICAgICAgcmVtb3ZlTG9hZGluZ01zZygpOwogICAgICBhd2FpdCBhZGRNZXNzYWdlKCJib3QiLCAiU29ycnksIEknbSBoYXZpbmcgdHJvdWJsZSBjb25uZWN0aW5nIHJpZ2h0IG5vdy4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4iLCBbXSk7CiAgICB9IGZpbmFsbHkgewogICAgICB1c2VySW5wdXQuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgc2VuZEJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlOwogICAgfQogIH0KfQo="));