Fractal is a project made to bypass tab limits on chromebooks.
As many tabs as you want, all on one, with style.
To launch Fractal directly from its base64-encoded HTML, run the following in your url bar:
data:text/html;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PSJVVEYtOCI+CiAgICA8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEuMCI+CiAgICA8dGl0bGU+RnJhY3RhbCBEZXNrdG9wPC90aXRsZT4KICAgIDxzdHlsZT4KICAgICAgICBAZm9udC1mYWNlIHsKICAgICAgICAgICAgZm9udC1mYW1pbHk6ICdGcmFjdGFsJzsKICAgICAgICAgICAgc3JjOiB1cmwoJ2h0dHBzOi8vY2dhbXouc2l0ZS9vdGhlci1hc3NldHMvZnJhY3RhbC5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJyk7CiAgICAgICAgfQoKICAgICAgICAqIHsKICAgICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIH0KCiAgICAgICAgYm9keSB7CiAgICAgICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCg0NWRlZywgIzBmMGYyMywgIzFhMWEzZSwgIzJkMmQ1Zik7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICdTZWdvZSBVSScsIFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH0KCiAgICAgICAgLmZyYWN0YWwtdGV4dCB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDEycHg7CiAgICAgICAgICAgIGJvdHRvbTogNzB2aDsKICAgICAgICAgICAgbGVmdDogNTAlOwogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiAnRnJhY3RhbCcsIHNlcmlmOwogICAgICAgICAgICBmb250LXNpemU6IDEyMHB4OwogICAgICAgICAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgICAgIHRleHQtc2hhZG93OiAwIDAgNTBweCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgICAgIHotaW5kZXg6IDU7CiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB9CgogICAgICAgIC5mcmFjdGFsLWJnIHsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IAogICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCAyMCUgNTAlLCByZ2JhKDI1NSwgMCwgMTUwLCAwLjEpIDAlLCB0cmFuc3BhcmVudCA1MCUpLAogICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA4MCUgMjAlLCByZ2JhKDAsIDI1NSwgMjU1LCAwLjEpIDAlLCB0cmFuc3BhcmVudCA1MCUpLAogICAgICAgICAgICAgICAgcmFkaWFsLWdyYWRpZW50KGNpcmNsZSBhdCA0MCUgODAlLCByZ2JhKDI1NSwgMjU1LCAwLCAwLjEpIDAlLCB0cmFuc3BhcmVudCA1MCUpOwogICAgICAgICAgICBhbmltYXRpb246IGZyYWN0YWxTaGlmdCAyMHMgZWFzZS1pbi1vdXQgaW5maW5pdGU7CiAgICAgICAgICAgIHotaW5kZXg6IC0xOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBmcmFjdGFsU2hpZnQgewogICAgICAgICAgICAwJSwgMTAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpIHNjYWxlKDEpOyB9CiAgICAgICAgICAgIDMzJSB7IHRyYW5zZm9ybTogcm90YXRlKDEyMGRlZykgc2NhbGUoMS4xKTsgfQogICAgICAgICAgICA2NiUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgyNDBkZWcpIHNjYWxlKDAuOSk7IH0KICAgICAgICB9CgogICAgICAgIC5zaGFwZSB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTBweCk7CiAgICAgICAgICAgIGFuaW1hdGlvbjogZmxvYXQgMTVzIGVhc2UtaW4tb3V0IGluZmluaXRlOwogICAgICAgIH0KCiAgICAgICAgLnNoYXBlOm50aC1jaGlsZCgxKSB7CiAgICAgICAgICAgIHdpZHRoOiA4MHB4OwogICAgICAgICAgICBoZWlnaHQ6IDgwcHg7CiAgICAgICAgICAgIHRvcDogMjAlOwogICAgICAgICAgICBsZWZ0OiAxMCU7CiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheTogMHM7CiAgICAgICAgfQoKICAgICAgICAuc2hhcGU6bnRoLWNoaWxkKDIpIHsKICAgICAgICAgICAgd2lkdGg6IDEyMHB4OwogICAgICAgICAgICBoZWlnaHQ6IDEyMHB4OwogICAgICAgICAgICB0b3A6IDYwJTsKICAgICAgICAgICAgcmlnaHQ6IDE1JTsKICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtNXM7CiAgICAgICAgfQoKICAgICAgICAuc2hhcGU6bnRoLWNoaWxkKDMpIHsKICAgICAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgICAgIGhlaWdodDogNjBweDsKICAgICAgICAgICAgdG9wOiA0MCU7CiAgICAgICAgICAgIGxlZnQ6IDcwJTsKICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMTBzOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBmbG9hdCB7CiAgICAgICAgICAgIDAlLCAxMDAlIHsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCkgcm90YXRlKDBkZWcpOyB9CiAgICAgICAgICAgIDUwJSB7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjBweCkgcm90YXRlKDE4MGRlZyk7IH0KICAgICAgICB9CgogICAgICAgIC5kZXNrdG9wIHsKICAgICAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZoIC0gODBweCk7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC53aW5kb3cgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigzMHB4KTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMjBweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAyMHB4IDQwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgICAgIG1pbi13aWR0aDogNDAwcHg7CiAgICAgICAgICAgIG1pbi1oZWlnaHQ6IDMwMHB4OwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgICAgICB6LWluZGV4OiAxMDsKICAgICAgICB9CgogICAgICAgIC53aW5kb3cubWF4aW1pemVkIHsKICAgICAgICAgICAgdG9wOiAyMHB4ICFpbXBvcnRhbnQ7CiAgICAgICAgICAgIGxlZnQ6IDIwcHggIWltcG9ydGFudDsKICAgICAgICAgICAgd2lkdGg6IGNhbGMoMTAwdncgLSA0MHB4KSAhaW1wb3J0YW50OwogICAgICAgICAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSAxMjBweCkgIWltcG9ydGFudDsKICAgICAgICB9CgogICAgICAgIC53aW5kb3ctaGVhZGVyIHsKICAgICAgICAgICAgaGVpZ2h0OiA1MHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDIwcHggMjBweCAwIDA7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIHBhZGRpbmc6IDAgMjBweDsKICAgICAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTVweCk7CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9CgogICAgICAgIC53aW5kb3ctY29udHJvbHMgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgbGVmdDogMjBweDsKICAgICAgICB9CgogICAgICAgIC53aW5kb3ctY29udHJvbCB7CiAgICAgICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgfQoKICAgICAgICAuY2xvc2UgeyAKICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2QzZDNkMywgIzMzMzMzMyk7CiAgICAgICAgfQogICAgICAgIC5jbG9zZTo6YWZ0ZXIgeyBjb250ZW50OiAiw5ciOyB9CgogICAgICAgIC5taW5pbWl6ZSB7IAogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZDNkM2QzLCAjMzMzMzMzKTsKICAgICAgICB9CiAgICAgICAgLm1pbmltaXplOjphZnRlciB7IGNvbnRlbnQ6ICLiiJIiOyB9CgogICAgICAgIC5tYXhpbWl6ZSB7IAogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZDNkM2QzLCAjMzMzMzMzKTsKICAgICAgICB9CiAgICAgICAgLm1heGltaXplOjphZnRlciB7IGNvbnRlbnQ6ICLilqEiOyB9CgogICAgICAgIC5sYXlvdXQgeyAKICAgICAgICAgICAgYmFja2dyb3VuZDogIzMzMzMzM2NjOwogICAgICAgIH0KICAgICAgICAubGF5b3V0OjphZnRlciB7IGNvbnRlbnQ6ICLiip4iOyB9CgogICAgICAgIC53aW5kb3ctY29udHJvbDpob3ZlciB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICB9CgogICAgICAgIC5jbG9zZTpob3ZlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNkM2QzZDMsICMzMzMzMzMpOwogICAgICAgIH0KCiAgICAgICAgLm1pbmltaXplOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2QzZDNkMywgIzMzMzMzMyk7CiAgICAgICAgfQoKICAgICAgICAubWF4aW1pemU6aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZDNkM2QzLCAjMzMzMzMzKTsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQ6aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZDNkM2QzLCAjMzMzMzMzKTsKICAgICAgICB9CgogICAgICAgIC53aW5kb3ctdGl0bGUgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgdGV4dC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIH0KCiAgICAgICAgLndpbmRvdy1jb250ZW50IHsKICAgICAgICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1MHB4KTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDIwcHggMjBweDsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA1KTsKICAgICAgICB9CgogICAgICAgIC53aW5kb3ctY29udGVudCBpZnJhbWUgewogICAgICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAyMHB4IDIwcHg7CiAgICAgICAgfQoKICAgICAgICAubGF5b3V0LW1lbnUgewogICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgIHRvcDogNTBweDsKICAgICAgICAgICAgbGVmdDogMjBweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDMwcHgpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDE1cHggMzVweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgICAgICAgcGFkZGluZzogMTJweDsKICAgICAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICAgICAgei1pbmRleDogMTAwMTsKICAgICAgICAgICAgbWluLXdpZHRoOiAyMDBweDsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtbWVudS5zaG93IHsKICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICAgIGFuaW1hdGlvbjogbWVudVNsaWRlSW4gMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBtZW51U2xpZGVJbiB7CiAgICAgICAgICAgIGZyb20geyAKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7IAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0xMHB4KSBzY2FsZSgwLjk1KTsgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG8geyAKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7IAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApIHNjYWxlKDEpOyAKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1vcHRpb24gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBnYXA6IDEycHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1vcHRpb246aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCg0cHgpOwogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1vdmVybGF5IHsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC43KTsKICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE1cHgpOwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgei1pbmRleDogMjAwMDsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtb3ZlcmxheS5zaG93IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYW5pbWF0aW9uOiBmYWRlSW4gMC4zcyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1ncmlkIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1yb3dzOiByZXBlYXQoMywgMWZyKTsKICAgICAgICAgICAgZ2FwOiAyMHB4OwogICAgICAgICAgICBwYWRkaW5nOiA0MHB4OwogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMzBweCk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgICAgICB3aWR0aDogNjAwcHg7CiAgICAgICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtZ3JpZC10aXRsZSB7CiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICAgICAgdG9wOiAtNTBweDsKICAgICAgICAgICAgbGVmdDogNTAlOwogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgICAgICB0ZXh0LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtb3B0aW9uIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEpOwogICAgICAgICAgICBib3JkZXI6IDJweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDE2cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgICAgICB0ZXh0LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1vcHRpb246aG92ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDEwOSwgMTEwLCAxMTAsIDAuMyk7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogcmdiYSgxMzMsIDEzNSwgMTM4LCAwLjYpOwogICAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMDUpOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDhweCAyMHB4IHJnYmEoMjAzLCAyMDMsIDIwNCwgMC4zKTsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtb3B0aW9uOjpiZWZvcmUgewogICAgICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICB0b3A6IDUwJTsKICAgICAgICAgICAgbGVmdDogNTAlOwogICAgICAgICAgICB3aWR0aDogNjAlOwogICAgICAgICAgICBoZWlnaHQ6IDYwJTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4ycyBlYXNlOwogICAgICAgIH0KCiAgICAgICAgLmxheW91dC1vcHRpb246aG92ZXI6OmJlZm9yZSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC41KTsKICAgICAgICB9CgogICAgICAgIC5sYXlvdXQtb3B0aW9uW2RhdGEtbGF5b3V0PSJ0b3AtbGVmdCJdIHsgZ3JpZC1hcmVhOiAxIC8gMSAvIDIgLyAyOyB9CiAgICAgICAgLmxheW91dC1vcHRpb25bZGF0YS1sYXlvdXQ9InRvcC1jZW50ZXIiXSB7IGdyaWQtYXJlYTogMSAvIDIgLyAyIC8gMzsgfQogICAgICAgIC5sYXlvdXQtb3B0aW9uW2RhdGEtbGF5b3V0PSJ0b3AtcmlnaHQiXSB7IGdyaWQtYXJlYTogMSAvIDMgLyAyIC8gNDsgfQogICAgICAgIAogICAgICAgIC5sYXlvdXQtb3B0aW9uW2RhdGEtbGF5b3V0PSJsZWZ0Il0geyAKICAgICAgICAgICAgZ3JpZC1hcmVhOiAyIC8gMSAvIDMgLyAyOyAKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSg5NiwgOTYsIDk3LCAwLjIpOwogICAgICAgIH0KICAgICAgICAubGF5b3V0LW9wdGlvbltkYXRhLWxheW91dD0ibWF4aW1pemUiXSB7IAogICAgICAgICAgICBncmlkLWFyZWE6IDIgLyAyIC8gMyAvIDM7IAogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDQxLCA0NCwgNDEsIDAuMik7CiAgICAgICAgfQogICAgICAgIC5sYXlvdXQtb3B0aW9uW2RhdGEtbGF5b3V0PSJyaWdodCJdIHsgCiAgICAgICAgICAgIGdyaWQtYXJlYTogMiAvIDMgLyAzIC8gNDsgCiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoOTYsIDk2LCA5NywgMC4yKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLmxheW91dC1vcHRpb25bZGF0YS1sYXlvdXQ9ImJvdHRvbS1sZWZ0Il0geyBncmlkLWFyZWE6IDMgLyAxIC8gNCAvIDI7IH0KICAgICAgICAubGF5b3V0LW9wdGlvbltkYXRhLWxheW91dD0iYm90dG9tLWNlbnRlciJdIHsgZ3JpZC1hcmVhOiAzIC8gMiAvIDQgLyAzOyB9CiAgICAgICAgLmxheW91dC1vcHRpb25bZGF0YS1sYXlvdXQ9ImJvdHRvbS1yaWdodCJdIHsgZ3JpZC1hcmVhOiAzIC8gMyAvIDQgLyA0OyB9CgogICAgICAgIC5sYXlvdXQtb3B0aW9uW2RhdGEtbGF5b3V0PSJ0aGlyZC1sZWZ0Il0gewogICAgICAgICAgICBncmlkLWFyZWE6IDEgLyAxIC8gNCAvIDI7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTc1LCA4MiwgMjIyLCAwLjIpOwogICAgICAgIH0KICAgICAgICAubGF5b3V0LW9wdGlvbltkYXRhLWxheW91dD0idGhpcmQtY2VudGVyIl0gewogICAgICAgICAgICBncmlkLWFyZWE6IDEgLyAyIC8gNCAvIDM7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTc1LCA4MiwgMjIyLCAwLjIpOwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgIH0KICAgICAgICAubGF5b3V0LW9wdGlvbltkYXRhLWxheW91dD0idGhpcmQtcmlnaHQiXSB7CiAgICAgICAgICAgIGdyaWQtYXJlYTogMSAvIDMgLyA0IC8gNDsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgxNzUsIDgyLCAyMjIsIDAuMik7CiAgICAgICAgfQoKICAgICAgICAubGF5b3V0LWNsb3NlIHsKICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgICB0b3A6IDE1cHg7CiAgICAgICAgICAgIHJpZ2h0OiAxNXB4OwogICAgICAgICAgICB3aWR0aDogMzBweDsKICAgICAgICAgICAgaGVpZ2h0OiAzMHB4OwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCA5NSwgODcsIDAuOCk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBmb250LXNpemU6IDE4cHg7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAubGF5b3V0LWNsb3NlOmhvdmVyIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDk1LCA4NywgMSk7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTsKICAgICAgICB9CgogICAgICAgIC5kb2NrIHsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICBib3R0b206IDIwcHg7CiAgICAgICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwogICAgICAgICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMzBweCk7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDIwcHg7CiAgICAgICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZ2FwOiA4cHg7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDMwcHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgICAgfQoKICAgICAgICAuZG9jay1pdGVtIHsKICAgICAgICAgICAgd2lkdGg6IDUwcHg7CiAgICAgICAgICAgIGhlaWdodDogNTBweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB9CgogICAgICAgIC5kb2NrLWl0ZW06aG92ZXIgewogICAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLThweCkgc2NhbGUoMS4xKTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjMpOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDEwcHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgfQoKICAgICAgICAuZG9jay1pdGVtIGltZyB7CiAgICAgICAgICAgIHdpZHRoOiAzMHB4OwogICAgICAgICAgICBoZWlnaHQ6IDMwcHg7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgICAgICB9CgogICAgICAgIC5hZGQtYnRuIHsKICAgICAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICAgICAgdGV4dC1zaGFkb3c6IDAgMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAgICAgfQoKICAgICAgICAudXJsLW1vZGFsIHsKICAgICAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDIwcHgpOwogICAgICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICB9CgogICAgICAgIC51cmwtbW9kYWwuc2hvdyB7CiAgICAgICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgICAgIGFuaW1hdGlvbjogZmFkZUluIDAuNHMgZWFzZTsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgZmFkZUluIHsKICAgICAgICAgICAgZnJvbSB7IG9wYWNpdHk6IDA7IH0KICAgICAgICAgICAgdG8geyBvcGFjaXR5OiAxOyB9CiAgICAgICAgfQoKICAgICAgICAudXJsLWlucHV0LWNvbnRhaW5lciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xNSk7CiAgICAgICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigzMHB4KTsKICAgICAgICAgICAgcGFkZGluZzogNDBweDsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMjRweDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAyNXB4IDUwcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7CiAgICAgICAgICAgIG1pbi13aWR0aDogNDUwcHg7CiAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KSB0cmFuc2xhdGVZKDIwcHgpOwogICAgICAgICAgICBhbmltYXRpb246IG1vZGFsU2NhbGUgMC40cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpIGZvcndhcmRzOwogICAgICAgIH0KCiAgICAgICAgQGtleWZyYW1lcyBtb2RhbFNjYWxlIHsKICAgICAgICAgICAgdG8geyB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZVkoMCk7IH0KICAgICAgICB9CgogICAgICAgIC51cmwtaW5wdXQtY29udGFpbmVyIGgzIHsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICB0ZXh0LXNoYWRvdzogMCAycHggOHB4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgICAgICAgZm9udC1zaXplOiAxOHB4OwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgfQoKICAgICAgICAudXJsLWlucHV0IHsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIHBhZGRpbmc6IDE4cHggMjBweDsKICAgICAgICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKICAgICAgICAgICAgYmFja2Ryb3AtZmlsdGVyOiBibHVyKDEwcHgpOwogICAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgICAgICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQoKICAgICAgICAudXJsLWlucHV0OjpwbGFjZWhvbGRlciB7CiAgICAgICAgICAgIGNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNik7CiAgICAgICAgfQoKICAgICAgICAudXJsLWlucHV0OmZvY3VzIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIyNywgMjMwLCAyMzUsIDAuOCk7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMCAyNXB4IHJnYmEoMjEwLCAyMTEsIDIxMiwgMC4zKTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKICAgICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogICAgICAgIH0KCiAgICAgICAgLm1vZGFsLWJ1dHRvbnMgewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBnYXA6IDE1cHg7CiAgICAgICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgfQoKICAgICAgICAubW9kYWwtYnRuIHsKICAgICAgICAgICAgcGFkZGluZzogMTRweCAyOHB4OwogICAgICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTsKICAgICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KCiAgICAgICAgLm1vZGFsLWJ0bi5wcmltYXJ5IHsKICAgICAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgwLCAxMjIsIDI1NSwgMC45KSwgcmdiYSgwLCAxMjIsIDI1NSwgMC43KSk7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA0cHggMTVweCByZ2JhKDAsIDEyMiwgMjU1LCAwLjMpOwogICAgICAgIH0KCiAgICAgICAgLm1vZGFsLWJ0bi5zZWNvbmRhcnkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpOwogICAgICAgIH0KCiAgICAgICAgLm1vZGFsLWJ0bjpob3ZlciB7CiAgICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtM3B4KTsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMjBweCByZ2JhKDAsIDAsIDAsIDAuMyk7CiAgICAgICAgfQogICAgPC9zdHlsZT4KPC9oZWFkPgo8Ym9keT4KICAgIDxkaXYgY2xhc3M9ImZyYWN0YWwtYmciPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iZnJhY3RhbC10ZXh0Ij5GUkFDVEFMLjwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJzaGFwZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzaGFwZSI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJzaGFwZSI+PC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9ImRlc2t0b3AiIGlkPSJkZXNrdG9wIj4KICAgIDwvZGl2PgogICAgCiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtb3ZlcmxheSIgaWQ9ImxheW91dE92ZXJsYXkiPgogICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1ncmlkIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LWdyaWQtdGl0bGUiPkNob29zZSBXaW5kb3cgTGF5b3V0PC9kaXY+CiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImxheW91dC1jbG9zZSIgb25jbGljaz0iaGlkZUxheW91dE92ZXJsYXkoKSI+w5c8L2J1dHRvbj4KICAgICAgICAgICAgCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1vcHRpb24iIGRhdGEtbGF5b3V0PSJ0b3AtbGVmdCI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Ub3AgTGVmdDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxheW91dC1vcHRpb24iIGRhdGEtbGF5b3V0PSJ0b3AtY2VudGVyIj4KICAgICAgICAgICAgICAgIDxzcGFuPlRvcCBIYWxmPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9InRvcC1yaWdodCI+CiAgICAgICAgICAgICAgICA8c3Bhbj5Ub3AgUmlnaHQ8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9ImxlZnQiPgogICAgICAgICAgICAgICAgPHNwYW4+TGVmdCBIYWxmPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9Im1heGltaXplIj4KICAgICAgICAgICAgICAgIDxzcGFuPk1heGltaXplPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9InJpZ2h0Ij4KICAgICAgICAgICAgICAgIDxzcGFuPlJpZ2h0IEhhbGY8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAKICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9ImJvdHRvbS1sZWZ0Ij4KICAgICAgICAgICAgICAgIDxzcGFuPkJvdHRvbSBMZWZ0PC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0LW9wdGlvbiIgZGF0YS1sYXlvdXQ9ImJvdHRvbS1jZW50ZXIiPgogICAgICAgICAgICAgICAgPHNwYW4+Qm90dG9tIEhhbGY8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsYXlvdXQtb3B0aW9uIiBkYXRhLWxheW91dD0iYm90dG9tLXJpZ2h0Ij4KICAgICAgICAgICAgICAgIDxzcGFuPkJvdHRvbSBSaWdodDwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIAogICAgPGRpdiBjbGFzcz0iZG9jayIgaWQ9ImRvY2siPgogICAgICAgIDxidXR0b24gY2xhc3M9ImRvY2staXRlbSIgaWQ9ImFkZEJ0biI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJhZGQtYnRuIj4rPC9zcGFuPgogICAgICAgIDwvYnV0dG9uPgogICAgPC9kaXY+CiAgICAKICAgIDxkaXYgY2xhc3M9InVybC1tb2RhbCIgaWQ9InVybE1vZGFsIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ1cmwtaW5wdXQtY29udGFpbmVyIj4KICAgICAgICAgICAgPGgzPkVudGVyIFdlYnNpdGUgVVJMPC9oMz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJ1cmwtaW5wdXQiIGlkPSJ1cmxJbnB1dCIgcGxhY2Vob2xkZXI9Imh0dHBzOi8vZXhhbXBsZS5jb20iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1idXR0b25zIj4KICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im1vZGFsLWJ0biBzZWNvbmRhcnkiIGlkPSJjYW5jZWxCdG4iPkNhbmNlbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ibW9kYWwtYnRuIHByaW1hcnkiIGlkPSJvcGVuQnRuIj5PcGVuPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgICBsZXQgd2luZG93Q291bnQgPSAwOwogICAgICAgIGxldCB6SW5kZXhDb3VudGVyID0gMTA7CiAgICAgICAgbGV0IGN1cnJlbnRMYXlvdXRXaW5kb3cgPSBudWxsOwoKICAgICAgICBjb25zdCBkZXNrdG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rlc2t0b3AnKTsKICAgICAgICBjb25zdCBkb2NrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2snKTsKICAgICAgICBjb25zdCBhZGRCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYWRkQnRuJyk7CiAgICAgICAgY29uc3QgdXJsTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXJsTW9kYWwnKTsKICAgICAgICBjb25zdCB1cmxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cmxJbnB1dCcpOwogICAgICAgIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3BlbkJ0bicpOwogICAgICAgIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5jZWxCdG4nKTsKICAgICAgICBjb25zdCBsYXlvdXRPdmVybGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xheW91dE92ZXJsYXknKTsKCiAgICAgICAgYWRkQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICB1cmxNb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgICAgICAgICAgIHVybElucHV0LmZvY3VzKCk7CiAgICAgICAgfSk7CgogICAgICAgIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpOwogICAgICAgIG9wZW5CdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvcGVuV2Vic2l0ZSk7CgogICAgICAgIHVybElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXByZXNzJywgKGUpID0+IHsKICAgICAgICAgICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBvcGVuV2Vic2l0ZSgpOwogICAgICAgIH0pOwoKICAgICAgICB1cmxNb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7CiAgICAgICAgICAgIGlmIChlLnRhcmdldCA9PT0gdXJsTW9kYWwpIGNsb3NlTW9kYWwoKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHsKICAgICAgICAgICAgdXJsTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpOwogICAgICAgICAgICB1cmxJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb3BlbldlYnNpdGUoKSB7CiAgICAgICAgICAgIGxldCB1cmwgPSB1cmxJbnB1dC52YWx1ZS50cmltKCk7CiAgICAgICAgICAgIGlmICghdXJsKSByZXR1cm47CgogICAgICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdodHRwczovLycpKSB7CiAgICAgICAgICAgICAgICB1cmwgPSAnaHR0cHM6Ly8nICsgdXJsOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjcmVhdGVXaW5kb3codXJsKTsKICAgICAgICAgICAgY2xvc2VNb2RhbCgpOwogICAgICAgIH0KCiAgICAgICAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV2luZG93KHVybCkgewogICAgICAgICAgICBjb25zdCB3aW5kb3dJZCA9IGB3aW5kb3ctJHsrK3dpbmRvd0NvdW50fWA7CiAgICAgICAgICAgIGNvbnN0IHdpbmRvd0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHdpbmRvd0VsLmNsYXNzTmFtZSA9ICd3aW5kb3cnOwogICAgICAgICAgICB3aW5kb3dFbC5pZCA9IHdpbmRvd0lkOwogICAgICAgICAgICAKICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gYCR7NTAgKyAod2luZG93Q291bnQgKiAzMCl9cHhgOwogICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5sZWZ0ID0gYCR7NTAgKyAod2luZG93Q291bnQgKiAzMCl9cHhgOwogICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS53aWR0aCA9ICc4MDBweCc7CiAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmhlaWdodCA9ICc2MDBweCc7CiAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnpJbmRleCA9ICsrekluZGV4Q291bnRlcjsKCiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IG5ldyBVUkwodXJsKS5ob3N0bmFtZTsKICAgICAgICAgICAgbGV0IHBhZ2VUaXRsZSA9IGRvbWFpbjsKCiAgICAgICAgICAgIHdpbmRvd0VsLmlubmVySFRNTCA9IGAKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpbmRvdy1oZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpbmRvdy1jb250cm9scyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IndpbmRvdy1jb250cm9sIGNsb3NlIiBvbmNsaWNrPSJjbG9zZVdpbmRvdygnJHt3aW5kb3dJZH0nKSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IndpbmRvdy1jb250cm9sIG1pbmltaXplIiBvbmNsaWNrPSJtaW5pbWl6ZVdpbmRvdygnJHt3aW5kb3dJZH0nKSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IndpbmRvdy1jb250cm9sIG1heGltaXplIiBvbmNsaWNrPSJ0b2dnbGVNYXhpbWl6ZSgnJHt3aW5kb3dJZH0nKSI+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IndpbmRvdy1jb250cm9sIGxheW91dCIgb25jbGljaz0ic2hvd0xheW91dE92ZXJsYXkoJyR7d2luZG93SWR9JykiPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IndpbmRvdy10aXRsZSIgaWQ9InRpdGxlLSR7d2luZG93SWR9Ij4ke3BhZ2VUaXRsZX08L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0id2luZG93LWNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgc3JjPSIke3VybH0iIGlkPSJpZnJhbWUtJHt3aW5kb3dJZH0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIGA7CgogICAgICAgICAgICBkZXNrdG9wLmFwcGVuZENoaWxkKHdpbmRvd0VsKTsKICAgICAgICAgICAgbWFrZURyYWdnYWJsZSh3aW5kb3dFbCk7CgogICAgICAgICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgaWZyYW1lLSR7d2luZG93SWR9YCk7CiAgICAgICAgICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgdGl0bGUtJHt3aW5kb3dJZH1gKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmcmFtZS5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlmcmFtZURvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcmFtZURvYyAmJiBpZnJhbWVEb2MudGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBpZnJhbWVEb2MudGl0bGUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGUgPSB0aXRsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdyAmJiBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQudGl0bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRpdGxlLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlID0gdGl0bGUudHJpbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFuRG9tYWluID0gZG9tYWluLnJlcGxhY2UoJ3d3dy4nLCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gY2xlYW5Eb21haW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBjbGVhbkRvbWFpbi5zbGljZSgxKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgY29uc3QgZG9ja0l0ZW0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTsKICAgICAgICAgICAgZG9ja0l0ZW0uY2xhc3NOYW1lID0gJ2RvY2staXRlbSc7CiAgICAgICAgICAgIGRvY2tJdGVtLmlkID0gYGRvY2stJHt3aW5kb3dJZH1gOwogICAgICAgICAgICBkb2NrSXRlbS5vbmNsaWNrID0gKCkgPT4gZm9jdXNXaW5kb3cod2luZG93SWQpOwogICAgICAgICAgICAKICAgICAgICAgICAgY29uc3QgaW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgIGltZy5zcmMgPSBgaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9zMi9mYXZpY29ucz9kb21haW49JHtkb21haW59JnN6PTMyYDsKICAgICAgICAgICAgaW1nLmFsdCA9IGRvbWFpbjsKICAgICAgICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBkb2NrSXRlbS5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9ImNvbG9yOiB3aGl0ZTsgZm9udC1zaXplOiAxOHB4OyBmb250LXdlaWdodDogNjAwOyI+JHtkb21haW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9PC9zcGFuPmA7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRvY2tJdGVtLmFwcGVuZENoaWxkKGltZyk7CgogICAgICAgICAgICBkb2NrLmluc2VydEJlZm9yZShkb2NrSXRlbSwgYWRkQnRuKTsKCiAgICAgICAgICAgIHdpbmRvd0VsLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsICgpID0+IHsKICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnpJbmRleCA9ICsrekluZGV4Q291bnRlcjsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjbG9zZVdpbmRvdyh3aW5kb3dJZCkgewogICAgICAgICAgICBjb25zdCB3aW5kb3dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvd0lkKTsKICAgICAgICAgICAgY29uc3QgZG9ja0l0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgZG9jay0ke3dpbmRvd0lkfWApOwogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKHdpbmRvd0VsKSB7CiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGUoMC44KSc7CiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB3aW5kb3dFbC5yZW1vdmUoKSwgMzAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgaWYgKGRvY2tJdGVtKSB7CiAgICAgICAgICAgICAgICBkb2NrSXRlbS5zdHlsZS50cmFuc2Zvcm0gPSAnc2NhbGUoMCknOwogICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBkb2NrSXRlbS5yZW1vdmUoKSwgMzAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbWluaW1pemVXaW5kb3cod2luZG93SWQpIHsKICAgICAgICAgICAgY29uc3Qgd2luZG93RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3dJZCk7CiAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgwLjEpJzsKICAgICAgICAgICAgd2luZG93RWwuc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9LCAzMDApOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gdG9nZ2xlTWF4aW1pemUod2luZG93SWQpIHsKICAgICAgICAgICAgY29uc3Qgd2luZG93RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh3aW5kb3dJZCk7CiAgICAgICAgICAgIAogICAgICAgICAgICBpZiAod2luZG93RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXhpbWl6ZWQnKSkgewogICAgICAgICAgICAgICAgd2luZG93RWwuY2xhc3NMaXN0LnJlbW92ZSgnbWF4aW1pemVkJyk7CiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50b3AgPSAnNTBweCc7CiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5sZWZ0ID0gJzUwcHgnOwogICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUud2lkdGggPSAnODAwcHgnOwogICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUuaGVpZ2h0ID0gJzYwMHB4JzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdpbmRvd0VsLmNsYXNzTGlzdC5hZGQoJ21heGltaXplZCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBmb2N1c1dpbmRvdyh3aW5kb3dJZCkgewogICAgICAgICAgICBjb25zdCB3aW5kb3dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvd0lkKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICh3aW5kb3dFbC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpIHsKICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snOwogICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudHJhbnNmb3JtID0gJ3NjYWxlKDEpJzsKICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLm9wYWNpdHkgPSAnMSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2luZG93RWwuc3R5bGUuekluZGV4ID0gKyt6SW5kZXhDb3VudGVyOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbWFrZURyYWdnYWJsZSh3aW5kb3dFbCkgewogICAgICAgICAgICBjb25zdCBoZWFkZXIgPSB3aW5kb3dFbC5xdWVyeVNlbGVjdG9yKCcud2luZG93LWhlYWRlcicpOwogICAgICAgICAgICBsZXQgZHJhZ0RhdGEgPSBudWxsOwoKICAgICAgICAgICAgaGVhZGVyLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCd3aW5kb3ctY29udHJvbCcpKSByZXR1cm47CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGNvbnN0IHJlY3QgPSB3aW5kb3dFbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZHJhZ0RhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRYOiBlLmNsaWVudFgsCiAgICAgICAgICAgICAgICAgICAgc3RhcnRZOiBlLmNsaWVudFksCiAgICAgICAgICAgICAgICAgICAgc3RhcnRMZWZ0OiByZWN0LmxlZnQsCiAgICAgICAgICAgICAgICAgICAgc3RhcnRUb3A6IHJlY3QudG9wLAogICAgICAgICAgICAgICAgICAgIGlzRHJhZ2dpbmc6IHRydWUKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnpJbmRleCA9ICsrekluZGV4Q291bnRlcjsKICAgICAgICAgICAgICAgIHdpbmRvd0VsLmNsYXNzTGlzdC5yZW1vdmUoJ21heGltaXplZCcpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ0RhdGEgfHwgIWRyYWdEYXRhLmlzRHJhZ2dpbmcpIHJldHVybjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY29uc3QgZGVsdGFYID0gZS5jbGllbnRYIC0gZHJhZ0RhdGEuc3RhcnRYOwogICAgICAgICAgICAgICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gZHJhZ0RhdGEuc3RhcnRZOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBsZXQgbmV3TGVmdCA9IGRyYWdEYXRhLnN0YXJ0TGVmdCArIGRlbHRhWDsKICAgICAgICAgICAgICAgIGxldCBuZXdUb3AgPSBkcmFnRGF0YS5zdGFydFRvcCArIGRlbHRhWTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgY29uc3QgbWF4TGVmdCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gMjAwOwogICAgICAgICAgICAgICAgY29uc3QgbWF4VG9wID0gd2luZG93LmlubmVySGVpZ2h0IC0gMTUwOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBuZXdMZWZ0ID0gTWF0aC5tYXgoLTE1MCwgTWF0aC5taW4obmV3TGVmdCwgbWF4TGVmdCkpOwogICAgICAgICAgICAgICAgbmV3VG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obmV3VG9wLCBtYXhUb3ApKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUubGVmdCA9IG5ld0xlZnQgKyAncHgnOwogICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gbmV3VG9wICsgJ3B4JzsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgKGUpID0+IHsKICAgICAgICAgICAgICAgIGlmICghZHJhZ0RhdGEgfHwgIWRyYWdEYXRhLmlzRHJhZ2dpbmcpIHJldHVybjsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgZHJhZ0RhdGEgPSBudWxsOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS51c2VyU2VsZWN0ID0gJyc7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmN1cnNvciA9ICcnOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50cmFuc2l0aW9uID0gJ2FsbCAwLjNzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSknOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHNob3dMYXlvdXRPdmVybGF5KHdpbmRvd0lkKSB7CiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXRXaW5kb3cgPSB3aW5kb3dJZDsKICAgICAgICAgICAgbGF5b3V0T3ZlcmxheS5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7CiAgICAgICAgICAgIAogICAgICAgICAgICBjb25zdCBsYXlvdXRPcHRpb25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxheW91dC1vcHRpb24nKTsKICAgICAgICAgICAgbGF5b3V0T3B0aW9ucy5mb3JFYWNoKG9wdGlvbiA9PiB7CiAgICAgICAgICAgICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXlvdXRUeXBlID0gb3B0aW9uLmRhdGFzZXQubGF5b3V0OwogICAgICAgICAgICAgICAgICAgIGFwcGx5V2luZG93TGF5b3V0KGN1cnJlbnRMYXlvdXRXaW5kb3csIGxheW91dFR5cGUpOwogICAgICAgICAgICAgICAgICAgIGhpZGVMYXlvdXRPdmVybGF5KCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhpZGVMYXlvdXRPdmVybGF5KCkgewogICAgICAgICAgICBsYXlvdXRPdmVybGF5LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTsKICAgICAgICAgICAgY3VycmVudExheW91dFdpbmRvdyA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhcHBseVdpbmRvd0xheW91dCh3aW5kb3dJZCwgbGF5b3V0VHlwZSkgewogICAgICAgICAgICBjb25zdCB3aW5kb3dFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHdpbmRvd0lkKTsKICAgICAgICAgICAgaWYgKCF3aW5kb3dFbCkgcmV0dXJuOwogICAgICAgICAgICAKICAgICAgICAgICAgd2luZG93RWwuY2xhc3NOYW1lID0gJ3dpbmRvdyc7CiAgICAgICAgICAgIAogICAgICAgICAgICBzd2l0Y2gobGF5b3V0VHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAnbWF4aW1pemUnOgogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLmNsYXNzTGlzdC5hZGQoJ21heGltaXplZCcpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnbGVmdCc6CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gJzIwcHgnOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmxlZnQgPSAnMjBweCc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUud2lkdGggPSAnY2FsYyg1MHZ3IC0gMzBweCknOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gMTIwcHgpJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3JpZ2h0JzoKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50b3AgPSAnMjBweCc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUubGVmdCA9ICdjYWxjKDUwdncgKyAxMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUud2lkdGggPSAnY2FsYyg1MHZ3IC0gMzBweCknOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmhlaWdodCA9ICdjYWxjKDEwMHZoIC0gMTIwcHgpJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RvcC1sZWZ0JzoKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS50b3AgPSAnMjBweCc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUubGVmdCA9ICcyMHB4JzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS53aWR0aCA9ICdjYWxjKDUwdncgLSAzMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoNTB2aCAtIDYwcHgpJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ3RvcC1yaWdodCc6CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gJzIwcHgnOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmxlZnQgPSAnY2FsYyg1MHZ3ICsgMTBweCknOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLndpZHRoID0gJ2NhbGMoNTB2dyAtIDMwcHgpJzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5oZWlnaHQgPSAnY2FsYyg1MHZoIC0gNjBweCknOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAndG9wLWNlbnRlcic6CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gJzIwcHgnOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmxlZnQgPSAnMjBweCc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUud2lkdGggPSAnY2FsYygxMDB2dyAtIDQwcHgpJzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5oZWlnaHQgPSAnY2FsYyg1MHZoIC0gNjBweCknOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnYm90dG9tLWxlZnQnOgogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnRvcCA9ICdjYWxjKDUwdmggKyAxMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUubGVmdCA9ICcyMHB4JzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS53aWR0aCA9ICdjYWxjKDUwdncgLSAzMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoNTB2aCAtIDYwcHgpJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbS1yaWdodCc6CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUudG9wID0gJ2NhbGMoNTB2aCArIDEwcHgpJzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS5sZWZ0ID0gJ2NhbGMoNTB2dyArIDEwcHgpJzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS53aWR0aCA9ICdjYWxjKDUwdncgLSAzMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUuaGVpZ2h0ID0gJ2NhbGMoNTB2aCAtIDYwcHgpJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2JvdHRvbS1jZW50ZXInOgogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLnRvcCA9ICdjYWxjKDUwdmggKyAxMHB4KSc7CiAgICAgICAgICAgICAgICAgICAgd2luZG93RWwuc3R5bGUubGVmdCA9ICcyMHB4JzsKICAgICAgICAgICAgICAgICAgICB3aW5kb3dFbC5zdHlsZS53aWR0aCA9ICdjYWxjKDEwMHZ3IC0gNDBweCknOwogICAgICAgICAgICAgICAgICAgIHdpbmRvd0VsLnN0eWxlLmhlaWdodCA9ICdjYWxjKDUwdmggLSA2MHB4KSc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGxheW91dE92ZXJsYXkuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICBpZiAoZS50YXJnZXQgPT09IGxheW91dE92ZXJsYXkpIHsKICAgICAgICAgICAgICAgIGhpZGVMYXlvdXRPdmVybGF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K