eval(atob("CmxldCBoaXN0b3J5SWQgPSAnJzsKCmNvbnN0IGNoYXRib3hIVE1MZ1RDYjdZa2JTaCA9IGAKICA8ZGl2IGNsYXNzPSJjaGF0Ym94Z1RDYjdZa2JTaCIgaWQ9ImNoYXRib3hnVENiN1lrYlNoIj4KICAgIDxkaXYgY2xhc3M9ImNoYXRib3gtY29udGFpbmVyZ1RDYjdZa2JTaCBjaGF0Ym94LWxlYXZlZ1RDYjdZa2JTaCBoaWRkZW4iIGlkPSJjaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2giPgogICAgICA8ZGl2IGNsYXNzPSJoZWFkZXJnVENiN1lrYlNoIj4KICAgICAgICA8ZGl2IGNsYXNzPSJhdmF0YXJnVENiN1lrYlNoIj4KICAgICAgICAgIDxpbWcgc3JjPSdodHRwczovL3NlZmZhbmUuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE1LzA1L0xvZ28tbm9ybWFsLnBuZycgYWx0PSIiIC8+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGVnVENiN1lrYlNoIj4KICAgICAgICAgIDxoMyBzdHlsZT0nY29sb3I6ICNjZTFiMjgnPnNlZmZhbmU8L2gzPgogICAgICAgICAgPHNwYW4+QUkgQXNzaXN0YW50PC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0ibWVzc2FnZXNnVENiN1lrYlNoIiBpZD0ibWVzc2FnZXNnVENiN1lrYlNoIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9vdGVyZ1RDYjdZa2JTaCI+CiAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJ1c2VySW5wdXRnVENiN1lrYlNoIiBwbGFjZWhvbGRlcj0iVHlwZSB5b3VyIG1lc3NhZ2UuLi4iIC8+CiAgICAgICAgPGJ1dHRvbiBpZD0ic2VuZEJ1dHRvbmdUQ2I3WWtiU2giPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTVweCIgaGVpZ2h0PSIxNXB4IiB2aWV3Qm94PSIwIDAgMjQgMjQiPgogICAgICAgICAgICA8cGF0aCBmaWxsPScjY2UxYjI4JyBkPSJNMi4zNDUgMi4yNDVhMSAxIDAgMCAxIDEuMTAyLS4xNGwxOCA5YTEgMSAwIDAgMSAwIDEuNzlsLTE4IDlhMSAxIDAgMCAxLTEuMzk2LTEuMjExTDQuNjEzIDEzSDEwYTEgMSAwIDEgMCAwLTJINC42MTNMMi4wNSAzLjMxNmExIDEgMCAwIDEgLjI5NC0xLjA3MXoiIC8+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICA8L2J1dHRvbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImNoYXQtYnV0dG9uZ1RDYjdZa2JTaCIgaWQ9ImNoYXRUb2dnbGVCdXR0b25nVENiN1lrYlNoIj4KICAgICAgPGltZyBzcmM9J2h0dHBzOi8vc2VmZmFuZS5jb20vd3AtY29udGVudC91cGxvYWRzLzIwMTUvMDUvTG9nby1ub3JtYWwucG5nJyAvPgogICAgPC9kaXY+CiAgPC9kaXY+CmA7CgovLyBDcmVhdGUgY2hhdGJvdCBjb250YWluZXIgd2l0aCBiZXR0ZXIgaXNvbGF0aW9uCmNvbnN0IGNoYXRib3hFbGVtZW50Z1RDYjdZa2JTaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2guaW5uZXJIVE1MID0gY2hhdGJveEhUTUxnVENiN1lrYlNoOwpjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2guc2V0QXR0cmlidXRlKCdkYXRhLWNoYXRib3Qtd2lkZ2V0JywgJ3RydWUnKTsKZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjaGF0Ym94RWxlbWVudGdUQ2I3WWtiU2gpOwoKY29uc3Qgc3R5bGVFbGVtZW50Z1RDYjdZa2JTaCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7CmNvbnN0IGNzc0NvZGVnVENiN1lrYlNoID0gYAogIC8qIENoYXRib3Qtc3BlY2lmaWMgQ1NTIHdpdGggYmV0dGVyIGlzb2xhdGlvbiAqLwogIFtkYXRhLWNoYXRib3Qtd2lkZ2V0XSAuaGlkZGVuIHsgCiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IAogIH0KICAKICAvKiBTY29wZSBhbGwgY2hhdGJvdCBzdHlsZXMgdG8gcHJldmVudCBjb25mbGljdHMgKi8KICAuY2hhdGJveGdUQ2I3WWtiU2ggeyAKICAgIHotaW5kZXg6IDk5OTk5OTk7IAogICAgcG9zaXRpb246IGZpeGVkOyAKICAgIGJvdHRvbTogODBweDsgCiAgICByaWdodDogMjBweDsgCiAgICBmb250LWZhbWlseTogc3lzdGVtLXVpLCAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIFJvYm90bywgT3h5Z2VuLCBVYnVudHUsIENhbnRhcmVsbCwgIk9wZW4gU2FucyIsICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgICAvKiBFbnN1cmUgaXQgZG9lc24ndCBpbnRlcmZlcmUgd2l0aCBwYWdlIGxheW91dCAqLwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgfQogIAogIC5jaGF0Ym94Z1RDYjdZa2JTaCAqIHsKICAgIC8qIFJlLWVuYWJsZSBwb2ludGVyIGV2ZW50cyBmb3IgY2hhdGJvdCBlbGVtZW50cyAqLwogICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAvKiBSZXNldCBhbnkgaW5oZXJpdGVkIHN0eWxlcyB0aGF0IG1pZ2h0IGNvbmZsaWN0ICovCiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIH0KICAKICAuY2hhdGJveC1jb250YWluZXJnVENiN1lrYlNoIHsgCiAgICBib3gtc2hhZG93OiAxcHggMXB4IDEwMHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMjIpOyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7IAogICAgd2lkdGg6IDM1MHB4OyAKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7IAogICAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZS1pbi1vdXQ7IAogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBoZWlnaHQ6IDUwMHB4OwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgbWF4LWhlaWdodDogODB2aDsKICAgIC8qIFByZXZlbnQgbGF5b3V0IGludGVyZmVyZW5jZSAqLwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogIH0KICAKICAuaGVhZGVyZ1RDYjdZa2JTaCB7IAogICAgY29sb3I6ICMzMzM7IAogICAgcGFkZGluZzogMTBweCAyMHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHggMTBweCAwcHggMHB4OyAKICAgIGRpc3BsYXk6IGZsZXg7IAogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsgCiAgICBmbGV4LWRpcmVjdGlvbjogcm93OyAKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjY2NjNTQ7IAogICAgZmxleC1zaHJpbms6IDA7CiAgfQoKICAuaGVhZGVyZ1RDYjdZa2JTaCBoMyB7IAogICAgbWFyZ2luOiAwOyAKICAgIGZvbnQtc2l6ZTogMjBweDsgCiAgICBmb250LXdlaWdodDogYm9sZDsKICB9CiAgCiAgLmhlYWRlcmdUQ2I3WWtiU2ggc3BhbiB7IAogICAgZm9udC1zaXplOiAxMnB4OyAKICB9CiAgCiAgLmhlYWRlcmdUQ2I3WWtiU2ggLmF2YXRhcmdUQ2I3WWtiU2ggaW1nIHsgCiAgICB3aWR0aDogNzBweDsgCiAgICBoZWlnaHQ6IGF1dG87CiAgfQogIAogIC5oZWFkZXJnVENiN1lrYlNoIC50aXRsZWdUQ2I3WWtiU2ggeyAKICAgIG1hcmdpbi1sZWZ0OiAxMHB4OyAKICB9CiAgCiAgLm1lc3NhZ2VzZ1RDYjdZa2JTaCB7IAogICAgZmxleC1ncm93OiAxOwogICAgb3ZlcmZsb3cteTogYXV0bzsKICAgIHBhZGRpbmc6IDEwcHg7IAogICAgc2Nyb2xsYmFyLXdpZHRoOiBub25lOyAvKiBGaXJlZm94ICovCiAgICAtbXMtb3ZlcmZsb3ctc3R5bGU6IG5vbmU7IC8qIElFL0VkZ2UgKi8KICB9CgogIC5tZXNzYWdlc2dUQ2I3WWtiU2g6Oi13ZWJraXQtc2Nyb2xsYmFyIHsgCiAgICBkaXNwbGF5OiBub25lOyAvKiBDaHJvbWUvU2FmYXJpICovCiAgfQogIAogIC5mb290ZXJnVENiN1lrYlNoIHsgCiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjY2NjYzU0OyAKICAgIGRpc3BsYXk6IGZsZXg7IAogICAgZmxleC1kaXJlY3Rpb246IHJvdzsgCiAgICBhbGlnbi1pdGVtczogY2VudGVyOyAKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgcGFkZGluZzogNXB4OwogIH0KCiAgI3VzZXJJbnB1dGdUQ2I3WWtiU2ggeyAKICAgIGZvbnQtc2l6ZTogMTZweDsgCiAgICBwYWRkaW5nOiAxMHB4OyAKICAgIG1hcmdpbjogNXB4OyAKICAgIGJvcmRlcjogMDsgCiAgICBjb2xvcjogYmxhY2s7CiAgICB3aWR0aDogY2FsYygxMDAlIC0gNjBweCk7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQogIAogICN1c2VySW5wdXRnVENiN1lrYlNoOmZvY3VzIHsgCiAgICBvdXRsaW5lOiBub25lOyAKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZTFiMjg7CiAgfQogIAogICNzZW5kQnV0dG9uZ1RDYjdZa2JTaCB7IAogICAgcGFkZGluZzogMTVweDsgCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgCiAgICBib3JkZXI6IG5vbmU7IAogICAgY3Vyc29yOiBwb2ludGVyOyAKICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4zcywgY3Vyc29yIDAuM3M7IAogIH0KCiAgI3NlbmRCdXR0b25nVENiN1lrYlNoOmRpc2FibGVkIHsgCiAgICBvcGFjaXR5OiAwLjU7CiAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogIH0KICAKICAubXNnZ1RDYjdZa2JTaCB7IAogICAgd2lkdGg6IDkwJTsgCiAgICBtYXJnaW46IDVweCAwOyAKICAgIGNsZWFyOiBib3RoOwogIH0KICAKICAubXNnZ1RDYjdZa2JTaC51c2VyLW1zZ2dUQ2I3WWtiU2ggeyAKICAgIGZsb2F0OiByaWdodDsgCiAgICB0ZXh0LWFsaWduOiByaWdodDsgCiAgfQogIAogIC5tc2dnVENiN1lrYlNoLnVzZXItbXNnZ1RDYjdZa2JTaCBzcGFuIHsgCiAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7IAogICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsgCiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjY2UxYjI4OyAKICAgIGNvbG9yOiB3aGl0ZTsgCiAgICBwYWRkaW5nOiAxMHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7IAogICAgbWF4LXdpZHRoOiA4MCU7IAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAKICB9CiAgCiAgLm1zZ2dUQ2I3WWtiU2guYm90LW1zZ2dUQ2I3WWtiU2ggeyAKICAgIGZsb2F0OiBsZWZ0OyAKICB9CiAgCiAgLm1zZ2dUQ2I3WWtiU2guYm90LW1zZ2dUQ2I3WWtiU2ggc3BhbiB7IAogICAgd29yZC13cmFwOiBicmVhay13b3JkOyAKICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7IAogICAgYmFja2dyb3VuZC1jb2xvcjogI2UwZTBlMDsgCiAgICBjb2xvcjogYmxhY2s7IAogICAgcGFkZGluZzogMTBweDsgCiAgICBib3JkZXItcmFkaXVzOiAxMHB4OyAKICAgIG1heC13aWR0aDogODAlOyAKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsgCiAgfQoKICAuY2hhdC1idXR0b25nVENiN1lrYlNoIHsgCiAgICBib3JkZXI6IG5vbmU7IAogICAgYm9yZGVyLXJhZGl1czogNSU7IAogICAgd2lkdGg6IDUwcHg7IAogICAgaGVpZ2h0OiA1MHB4OyAKICAgIGN1cnNvcjogcG9pbnRlcjsgCiAgICBkaXNwbGF5OiBmbGV4OyAKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOyAKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7IAogICAgcG9zaXRpb246IGZpeGVkOyAKICAgIGJvdHRvbTogMjBweDsgCiAgICByaWdodDogMjBweDsgCiAgICB6LWluZGV4OiAxMDAwMDAwMDsgCiAgfQoKICAuY2hhdC1idXR0b25nVENiN1lrYlNoIGltZyB7IAogICAgd2lkdGg6IDEwMCU7IAogICAgaGVpZ2h0OiAxMDAlOyAKICAgIGJvcmRlci1yYWRpdXM6IDUlOyAKICB9CgogIC8qIExvYWRpbmcgZG90cyBhbmltYXRpb24gKi8KICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCB7IAogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOyAKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgCiAgICB3aWR0aDogNzRweDsgCiAgICBoZWlnaHQ6IDE4cHg7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXYgeyAKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsgCiAgICB0b3A6IDhweDsgCiAgICB3aWR0aDogOHB4OyAKICAgIGhlaWdodDogOHB4OyAKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsgCiAgICBiYWNrZ3JvdW5kOiAjMzMzOyAKICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLCAxLCAxLCAwKTsgCiAgfQogIAogIC5sZHMtZWxsaXBzaXNnVENiN1lrYlNoIGRpdjpudGgtY2hpbGQoMSkgeyAKICAgIGxlZnQ6IDhweDsgCiAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczFnVENiN1lrYlNoIDAuNnMgaW5maW5pdGU7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXY6bnRoLWNoaWxkKDIpIHsgCiAgICBsZWZ0OiA4cHg7IAogICAgYW5pbWF0aW9uOiBsZHMtZWxsaXBzaXMyZ1RDYjdZa2JTaCAwLjZzIGluZmluaXRlOyAKICB9CiAgCiAgLmxkcy1lbGxpcHNpc2dUQ2I3WWtiU2ggZGl2Om50aC1jaGlsZCgzKSB7IAogICAgbGVmdDogMzJweDsgCiAgICBhbmltYXRpb246IGxkcy1lbGxpcHNpczJnVENiN1lrYlNoIDAuNnMgaW5maW5pdGU7IAogIH0KICAKICAubGRzLWVsbGlwc2lzZ1RDYjdZa2JTaCBkaXY6bnRoLWNoaWxkKDQpIHsgCiAgICBsZWZ0OiA1NnB4OyAKICAgIGFuaW1hdGlvbjogbGRzLWVsbGlwc2lzM2dUQ2I3WWtiU2ggMC42cyBpbmZpbml0ZTsgCiAgfQogIAogIEBrZXlmcmFtZXMgbGRzLWVsbGlwc2lzMWdUQ2I3WWtiU2ggeyAKICAgIDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfSAKICAgIDEwMCUgeyB0cmFuc2Zvcm06IHNjYWxlKDEpOyB9IAogIH0KICAKICBAa2V5ZnJhbWVzIGxkcy1lbGxpcHNpczNnVENiN1lrYlNoIHsgCiAgICAwJSB7IHRyYW5zZm9ybTogc2NhbGUoMSk7IH0gCiAgICAxMDAlIHsgdHJhbnNmb3JtOiBzY2FsZSgwKTsgfSAKICB9CiAgCiAgQGtleWZyYW1lcyBsZHMtZWxsaXBzaXMyZ1RDYjdZa2JTaCB7IAogICAgMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsgfSAKICAgIDEwMCUgeyB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgyNHB4LCAwKTsgfSAKICB9CgogIC8qIEVudGVyIGFuZCBMZWF2ZSBhbmltYXRpb25zIHdpdGggdW5pcXVlIG5hbWVzICovCiAgLmNoYXRib3gtZW50ZXJnVENiN1lrYlNoIHsgCiAgICBhbmltYXRpb246IHNsaWRlSW5SaWdodENoYXRib3hnVENiN1lrYlNoIDFzIGZvcndhcmRzOyAKICB9CiAgCiAgLmNoYXRib3gtbGVhdmVnVENiN1lrYlNoIHsgCiAgICBhbmltYXRpb246IHNsaWRlT3V0UmlnaHRDaGF0Ym94Z1RDYjdZa2JTaCAxcyBmb3J3YXJkczsgCiAgfQogIAogIEBrZXlmcmFtZXMgc2xpZGVJblJpZ2h0Q2hhdGJveGdUQ2I3WWtiU2ggeyAKICAgIDAlIHsgCiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKTsgCiAgICAgIG9wYWNpdHk6IDA7IAogICAgfSAKICAgIDEwMCUgeyAKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyAKICAgICAgb3BhY2l0eTogMTsgCiAgICB9IAogIH0KICAKICBAa2V5ZnJhbWVzIHNsaWRlT3V0UmlnaHRDaGF0Ym94Z1RDYjdZa2JTaCB7IAogICAgMCUgeyAKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApOyAKICAgICAgb3BhY2l0eTogMTsgCiAgICB9IAogICAgMTAwJSB7IAogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSk7IAogICAgICBvcGFjaXR5OiAwOyAKICAgIH0gCiAgfQoKICAvKiBSZXNwb25zaXZlIHN0eWxpbmcgd2l0aCBiZXR0ZXIgc3BlY2lmaWNpdHkgKi8KICBAbWVkaWEgb25seSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDc2OHB4KSB7CiAgICAuY2hhdGJveGdUQ2I3WWtiU2ggLmNoYXRib3gtY29udGFpbmVyZ1RDYjdZa2JTaCB7CiAgICAgIHdpZHRoOiA5MHZ3OwogICAgICBoZWlnaHQ6IDgwdmg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGxlZnQ6IDV2dzsKICAgIH0KICAgIAogICAgLmNoYXRib3hnVENiN1lrYlNoIC5tZXNzYWdlc2dUQ2I3WWtiU2ggewogICAgICBoZWlnaHQ6IGNhbGMoODB2aCAtIDE1MHB4KTsKICAgIH0KICB9CgogIC8qIFJlc291cmNlLXJlbGF0ZWQgc3R5bGVzIHdpdGggcHJvcGVyIHNjb3BpbmcgKi8KICAuY2hhdGJveGdUQ2I3WWtiU2ggLmhlbHBmdWwtbGlua3MtYnV0dG9uIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjZTFiMjg7CiAgICBjb2xvcjogd2hpdGU7CiAgICBib3JkZXI6IG5vbmU7CiAgICBwYWRkaW5nOiA4cHggMTZweDsKICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAwLjNzOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1ib3ggewogICAgYmFja2dyb3VuZC1jb2xvcjogI2YwZjBmMDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICBwYWRkaW5nOiA1cHg7CiAgICBib3JkZXItcmFkaXVzOiA1cHg7CiAgICBmbGV4OiAxIDEgY2FsYygyNSUgLSAyMHB4KTsKICAgIG1heC13aWR0aDogY2FsYygyNSUgLSAyMHB4KTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuM3M7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWJveDpob3ZlciB7CiAgICBib3gtc2hhZG93OiAwIDAgMTBweCByZ2JhKDAsIDEyMywgMjU1LCAwLjUpOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1ib3ggYSB7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBjb2xvcjogI2NlMWIyODsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDVweDsKICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLmhlbHBmdWwtbGlua3MtYnV0dG9uOmhvdmVyIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNjZTFiMjg7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLmFycm93LWljb24gewogICAgbWFyZ2luLWxlZnQ6IGF1dG87CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlcy1jb250YWluZXIgewogICAgZGlzcGxheTogZmxleDsgICAgICAgICAgIAogICAgZmxleC13cmFwOiB3cmFwOyAgICAgICAgIAogICAgZ2FwOiAxMHB4OyAgICAgICAgIAogICAgbWFyZ2luLXRvcDogMTBweDsgICAgICAgIAogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZXMtaGVhZGVyIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbWFyZ2luLWJvdHRvbTogNXB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZXMtbGlzdCB7CiAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICBtYXJnaW46IDA7CiAgfQoKICAuY2hhdGJveGdUQ2I3WWtiU2ggLnJlc291cmNlLWl0ZW0gewogICAgbWFyZ2luLWJvdHRvbTogOHB4OwogICAgZm9udC1zaXplOiAxNHB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1pdGVtIGEgewogICAgY29sb3I6ICNjZTFiMjg7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC5yZXNvdXJjZS1pdGVtIGE6aG92ZXIgewogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgfQoKICAvKiBUb29sdGlwIHN0eWxlcyB3aXRoIHByb3BlciBzY29waW5nICovCiAgLmNoYXRib3hnVENiN1lrYlNoIC50b29sdGlwIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJhY2tncm91bmQtY29sb3I6ICMzMzM7CiAgICBjb2xvcjogI2ZmZjsKICAgIHBhZGRpbmc6IDVweDsKICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICB6LWluZGV4OiAxMDAwOwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICBvcGFjaXR5OiAwOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogIH0KCiAgLmNoYXRib3hnVENiN1lrYlNoIC50b29sdGlwLXZpc2libGUgewogICAgb3BhY2l0eTogMTsKICB9CmA7CgovLyBBZGQgRm9udCBBd2Vzb21lIHdpdGggZXJyb3IgaGFuZGxpbmcKZnVuY3Rpb24gYWRkRm9udEF3ZXNvbWUoKSB7CiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW2hyZWYqPSJmb250LWF3ZXNvbWUiXScpKSB7CiAgICBjb25zdCBmb250QXdlc29tZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7CiAgICBmb250QXdlc29tZUxpbmsucmVsID0gInN0eWxlc2hlZXQiOwogICAgZm9udEF3ZXNvbWVMaW5rLmhyZWYgPSAiaHR0cHM6Ly9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZm9udC1hd2Vzb21lLzYuMC4wLWJldGEzL2Nzcy9hbGwubWluLmNzcyI7CiAgICBmb250QXdlc29tZUxpbmsub25lcnJvciA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zb2xlLndhcm4oJ0ZvbnQgQXdlc29tZSBmYWlsZWQgdG8gbG9hZCwgdXNpbmcgZmFsbGJhY2sgaWNvbnMnKTsKICAgIH07CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZvbnRBd2Vzb21lTGluayk7CiAgfQp9CgovLyBBZGQgc3R5bGVzIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nCnN0eWxlRWxlbWVudGdUQ2I3WWtiU2gudGV4dENvbnRlbnQgPSBjc3NDb2RlZ1RDYjdZa2JTaDsKc3R5bGVFbGVtZW50Z1RDYjdZa2JTaC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2hhdGJvdC1zdHlsZXMnLCAndHJ1ZScpOwpkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlRWxlbWVudGdUQ2I3WWtiU2gpOwphZGRGb250QXdlc29tZSgpOwoKLy8gRW5oYW5jZWQgZWxlbWVudCB3YWl0aW5nIGZ1bmN0aW9uCmZ1bmN0aW9uIHdhaXRGb3JFbGVtZW50KGlkLCBjYWxsYmFjaywgbWF4QXR0ZW1wdHMgPSA1MCkgewogIGxldCBhdHRlbXB0cyA9IDA7CiAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICBpZiAoZWxlbWVudCkgewogICAgY2FsbGJhY2soZWxlbWVudCk7CiAgfSBlbHNlIHsKICAgIGNvbnN0IGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICBhdHRlbXB0cysrOwogICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsKICAgICAgaWYgKGVsKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgICAgICAgY2FsbGJhY2soZWwpOwogICAgICB9IGVsc2UgaWYgKGF0dGVtcHRzID49IG1heEF0dGVtcHRzKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7CiAgICAgICAgY29uc29sZS5lcnJvcihgRWxlbWVudCB3aXRoIGlkICIke2lkfSIgbm90IGZvdW5kIGFmdGVyICR7bWF4QXR0ZW1wdHN9IGF0dGVtcHRzYCk7CiAgICAgIH0KICAgIH0sIDEwMCk7CiAgfQp9CgovLyBXcmFwIGluaXRpYWxpemF0aW9uIGluIElJRkUgd2l0aCBlcnJvciBoYW5kbGluZwooZnVuY3Rpb24gaW5pdGlhbGl6ZUNoYXRib3QoKSB7CiAgdHJ5IHsKICAgIHdhaXRGb3JFbGVtZW50KCJjaGF0VG9nZ2xlQnV0dG9uZ1RDYjdZa2JTaCIsIChjaGF0VG9nZ2xlQnV0dG9uKSA9PiB7CiAgICAgIHdhaXRGb3JFbGVtZW50KCJjaGF0Ym94LWNvbnRhaW5lcmdUQ2I3WWtiU2giLCAoY2hhdGJveENvbnRhaW5lcikgPT4gewogICAgICAgIHdhaXRGb3JFbGVtZW50KCJtZXNzYWdlc2dUQ2I3WWtiU2giLCAobWVzc2FnZXNEaXYpID0+IHsKICAgICAgICAgIHdhaXRGb3JFbGVtZW50KCJ1c2VySW5wdXRnVENiN1lrYlNoIiwgKHVzZXJJbnB1dCkgPT4gewogICAgICAgICAgICB3YWl0Rm9yRWxlbWVudCgic2VuZEJ1dHRvbmdUQ2I3WWtiU2giLCAoc2VuZEJ1dHRvbikgPT4gewogICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY2hhdGJvdCBmdW5jdGlvbmFsaXR5CiAgICAgICAgICAgICAgaW5pdGlhbGl6ZUNoYXRib3RGZWF0dXJlcyhjaGF0VG9nZ2xlQnV0dG9uLCBjaGF0Ym94Q29udGFpbmVyLCBtZXNzYWdlc0RpdiwgdXNlcklucHV0LCBzZW5kQnV0dG9uKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9KTsKICB9IGNhdGNoIChlcnJvcikgewogICAgY29uc29sZS5lcnJvcignRXJyb3IgaW5pdGlhbGl6aW5nIGNoYXRib3Q6JywgZXJyb3IpOwogIH0KfSkoKTsKCmZ1bmN0aW9uIGluaXRpYWxpemVDaGF0Ym90RmVhdHVyZXMoY2hhdFRvZ2dsZUJ1dHRvbiwgY2hhdGJveENvbnRhaW5lciwgbWVzc2FnZXNEaXYsIHVzZXJJbnB1dCwgc2VuZEJ1dHRvbikgewogIC8vIEVuc3VyZSBjaGF0Ym94IGlzIGluaXRpYWxseSBoaWRkZW4KICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwoKICAvLyBUb2dnbGUgY2hhdGJveCB2aXNpYmlsaXR5CiAgY2hhdFRvZ2dsZUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIChlKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgCiAgICBpZiAoY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QuY29udGFpbnMoImhpZGRlbiIpKSB7CiAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7CiAgICAgIGNoYXRib3hDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZSgiY2hhdGJveC1sZWF2ZWdUQ2I3WWtiU2giKTsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCJjaGF0Ym94LWVudGVyZ1RDYjdZa2JTaCIpOwogICAgfSBlbHNlIHsKICAgICAgY2hhdGJveENvbnRhaW5lci5jbGFzc0xpc3QucmVtb3ZlKCJjaGF0Ym94LWVudGVyZ1RDYjdZa2JTaCIpOwogICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImNoYXRib3gtbGVhdmVnVENiN1lrYlNoIik7CiAgICAgIAogICAgICBjb25zdCBoYW5kbGVBbmltYXRpb25FbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICBjaGF0Ym94Q29udGFpbmVyLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpOwogICAgICAgIGNoYXRib3hDb250YWluZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTsKICAgICAgfTsKICAgICAgCiAgICAgIGNoYXRib3hDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIiwgaGFuZGxlQW5pbWF0aW9uRW5kKTsKICAgIH0KICB9KTsKCiAgLy8gU2VuZCBtZXNzYWdlIGZ1bmN0aW9uYWxpdHkKICBmdW5jdGlvbiBzZW5kTWVzc2FnZSgpIHsKICAgIGNvbnN0IHVzZXJNZXNzYWdlID0gdXNlcklucHV0LnZhbHVlLnRyaW0oKTsKICAgIGlmICh1c2VyTWVzc2FnZSAhPT0gIiIpIHsKICAgICAgYWRkTWVzc2FnZSgidXNlciIsIHVzZXJNZXNzYWdlLCBbXSk7CiAgICAgIGFza0NoYXRib3QodXNlck1lc3NhZ2UpOwogICAgICB1c2VySW5wdXQudmFsdWUgPSAiIjsKICAgIH0KICB9CgogIHNlbmRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiAoZSkgewogICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgIHNlbmRNZXNzYWdlKCk7CiAgfSk7CgogIHVzZXJJbnB1dC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gKGV2ZW50KSB7CiAgICBpZiAoZXZlbnQua2V5ID09PSAiRW50ZXIiKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIHNlbmRNZXNzYWdlKCk7CiAgICB9CiAgfSk7CgogIC8vIFRvb2x0aXAgZnVuY3Rpb25zCiAgZnVuY3Rpb24gc2hvd1Rvb2x0aXAoZXZlbnQsIHRleHQpIHsKICAgIGNvbnN0IGNoYXRib3ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWVzc2FnZXNnVENiN1lrYlNoIik7CiAgICBsZXQgdG9vbHRpcCA9IGNoYXRib3gucXVlcnlTZWxlY3RvcigiLnRvb2x0aXAiKTsKCiAgICBpZiAoIXRvb2x0aXApIHsKICAgICAgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB0b29sdGlwLmNsYXNzTmFtZSA9ICJ0b29sdGlwIjsKICAgICAgY2hhdGJveC5hcHBlbmRDaGlsZCh0b29sdGlwKTsKICAgIH0KCiAgICB0b29sdGlwLnRleHRDb250ZW50ID0gdGV4dDsKICAgIHRvb2x0aXAuY2xhc3NMaXN0LmFkZCgidG9vbHRpcC12aXNpYmxlIik7CgogICAgY29uc3QgY2hhdGJveFJlY3QgPSBjaGF0Ym94LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgY29uc3QgdG9vbHRpcFJlY3QgPSB0b29sdGlwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKICAgIGxldCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIGNoYXRib3hSZWN0LmxlZnQgKyAxMDsKICAgIGxldCB0b3AgPSBldmVudC5jbGllbnRZIC0gY2hhdGJveFJlY3QudG9wICsgMTA7CgogICAgaWYgKGxlZnQgKyB0b29sdGlwUmVjdC53aWR0aCA+IGNoYXRib3hSZWN0LndpZHRoKSB7CiAgICAgIGxlZnQgPSBjaGF0Ym94UmVjdC53aWR0aCAtIHRvb2x0aXBSZWN0LndpZHRoIC0gMTA7CiAgICB9CgogICAgaWYgKHRvcCArIHRvb2x0aXBSZWN0LmhlaWdodCA+IGNoYXRib3hSZWN0LmhlaWdodCkgewogICAgICB0b3AgPSBjaGF0Ym94UmVjdC5oZWlnaHQgLSB0b29sdGlwUmVjdC5oZWlnaHQgLSAxMDsKICAgIH0KCiAgICB0b29sdGlwLnN0eWxlLmxlZnQgPSBgJHtsZWZ0fXB4YDsKICAgIHRvb2x0aXAuc3R5bGUudG9wID0gYCR7dG9wfXB4YDsKICB9CgogIGZ1bmN0aW9uIGhpZGVUb29sdGlwKCkgewogICAgY29uc3QgdG9vbHRpcCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIi5jaGF0Ym94Z1RDYjdZa2JTaCAudG9vbHRpcCIpOwogICAgaWYgKHRvb2x0aXApIHsKICAgICAgdG9vbHRpcC5yZW1vdmUoKTsKICAgIH0KICB9CgogIC8vIEFkZCBpbml0aWFsIHdlbGNvbWUgbWVzc2FnZQogIGFkZE1lc3NhZ2UoImJvdCIsICdIZWxsbywgaG93IGNhbiBJIGhlbHAgeW91IHRvZGF5PycsIFtdKTsKCiAgLy8gRmV0Y2ggdXNlciBsb2NhdGlvbiBkYXRhCiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hFeHRyYURhdGEoKSB7CiAgICB0cnkgewogICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCdodHRwczovL2lwd2hvLmlzLycpOwogICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICByZXR1cm4gewogICAgICAgIF9leHRyYV9pZDogZGF0YS5pcCwKICAgICAgICBfZXh0cmFfY2k6IGRhdGEuY2l0eSwKICAgICAgICBfZXh0cmFfcmc6IGRhdGEucmVnaW9uLAogICAgICAgIF9leHRyYV9jbzogZGF0YS5jb3VudHJ5LAogICAgICB9OwogICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBmZXRjaCBsb2NhdGlvbiBkYXRhOicsIGVycik7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8gQWRkIG1lc3NhZ2UgdG8gY2hhdAogIGZ1bmN0aW9uIGFkZE1lc3NhZ2Uoc2VuZGVyLCBtZXNzYWdlLCBzb3VyY2VzID0gW10pIHsKICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgIHRyeSB7CiAgICAgICAgY29uc3QgbWVzc2FnZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgIAogICAgICAgIGlmIChzZW5kZXIgPT09ICJib3QiKSB7CiAgICAgICAgICBtZXNzYWdlRGl2LmNsYXNzTmFtZSA9ICJtc2dnVENiN1lrYlNoIGJvdC1tc2dnVENiN1lrYlNoIjsKICAgICAgICAgIG1lc3NhZ2VEaXYuaW5uZXJIVE1MID0gIjxzcGFuPjwvc3Bhbj4iOwogICAgICAgICAgbWVzc2FnZXNEaXYuYXBwZW5kQ2hpbGQobWVzc2FnZURpdik7CiAgICAgICAgICBtZXNzYWdlc0Rpdi5zY3JvbGxUb3AgPSBtZXNzYWdlc0Rpdi5zY3JvbGxIZWlnaHQ7CgogICAgICAgICAgLy8gQWRkIGhlbHBmdWwgbGlua3MgaWYgc291cmNlcyBleGlzdAogICAgICAgICAgaWYgKHNvdXJjZXMubGVuZ3RoICE9PSAwKSB7ICAgCiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJ1dHRvbiIpOwogICAgICAgICAgICBidXR0b24uY2xhc3NOYW1lID0gImhlbHBmdWwtbGlua3MtYnV0dG9uIjsKICAgICAgICAgICAgYnV0dG9uLmlubmVySFRNTCA9IGAKICAgICAgICAgICAgICA8aSBjbGFzcz0iZmFzIGZhLWxpbmsiPjwvaT4gSGVscGZ1bCBMaW5rcyAKICAgICAgICAgICAgICA8aSBjbGFzcz0iZmFzIGZhLWNoZXZyb24tZG93biBhcnJvdy1pY29uIj48L2k+CiAgICAgICAgICAgIGA7CiAgICAgICAgICAgIG1lc3NhZ2VEaXYuYXBwZW5kQ2hpbGQoYnV0dG9uKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlc0NvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuY2xhc3NOYW1lID0gInJlc291cmNlcy1jb250YWluZXIiOwogICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKCiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaCgoc291cmNlLCBpbmRleCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlQm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICAgICAgcmVzb3VyY2VCb3guY2xhc3NOYW1lID0gInJlc291cmNlLWJveCI7CiAgICAgICAgICAgICAgcmVzb3VyY2VCb3guaW5uZXJIVE1MID0gYAogICAgICAgICAgICAgICAgPGEgaHJlZj0iJHtzb3VyY2V9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIj4KICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhcyBmYS1leHRlcm5hbC1saW5rLWFsdCI+PC9pPiBsaW5rJHtpbmRleCsxfQogICAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICAgIGA7CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgcmVzb3VyY2VCb3guYWRkRXZlbnRMaXN0ZW5lcigibW91c2VlbnRlciIsIChldmVudCkgPT4gc2hvd1Rvb2x0aXAoZXZlbnQsIHNvdXJjZSkpOwogICAgICAgICAgICAgIHJlc291cmNlQm94LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCBoaWRlVG9vbHRpcCk7CiAgICAgICAgICAgICAgcmVzb3VyY2VzQ29udGFpbmVyLmFwcGVuZENoaWxkKHJlc291cmNlQm94KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBtZXNzYWdlRGl2LmFwcGVuZENoaWxkKHJlc291cmNlc0NvbnRhaW5lcik7CgogICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4gewogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgIAogICAgICAgICAgICAgIGNvbnN0IGFycm93SWNvbiA9IGJ1dHRvbi5xdWVyeVNlbGVjdG9yKCcuYXJyb3ctaWNvbicpOwogICAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnIHx8IHJlc291cmNlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID09PSAnJykgewogICAgICAgICAgICAgICAgcmVzb3VyY2VzQ29udGFpbmVyLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7CiAgICAgICAgICAgICAgICBhcnJvd0ljb24uY2xhc3NOYW1lID0gJ2ZhcyBmYS1jaGV2cm9uLXVwIGFycm93LWljb24nOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXNvdXJjZXNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICAgIGFycm93SWNvbi5jbGFzc05hbWUgPSAnZmFzIGZhLWNoZXZyb24tZG93biBhcnJvdy1pY29uJzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFR5cGluZyBhbmltYXRpb24KICAgICAgICAgIGNvbnN0IHNwYW4gPSBtZXNzYWdlRGl2LnF1ZXJ5U2VsZWN0b3IoInNwYW4iKTsKICAgICAgICAgIGNvbnN0IGxldHRlcnMgPSBtZXNzYWdlLnNwbGl0KCIiKTsKICAgICAgICAgIGxldHRlcnMuZm9yRWFjaCgobGV0dGVyLCBpKSA9PiB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgIHNwYW4uaW5uZXJIVE1MICs9IGxldHRlcjsKICAgICAgICAgICAgICBtZXNzYWdlc0Rpdi5zY3JvbGxUb3AgPSBtZXNzYWdlc0Rpdi5zY3JvbGxIZWlnaHQ7CiAgICAgICAgICAgICAgaWYgKGkgPT09IGxldHRlcnMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgNTAgKiBpKTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBtZXNzYWdlRGl2LmNsYXNzTmFtZSA9ICJtc2dnVENiN1lrYlNoIHVzZXItbXNnZ1RDYjdZa2JTaCI7CiAgICAgICAgICBtZXNzYWdlRGl2LmlubmVySFRNTCA9IGA8c3Bhbj4ke21lc3NhZ2V9PC9zcGFuPmA7CiAgICAgICAgICBtZXNzYWdlc0Rpdi5hcHBlbmRDaGlsZChtZXNzYWdlRGl2KTsKICAgICAgICAgIG1lc3NhZ2VzRGl2LnNjcm9sbFRvcCA9IG1lc3NhZ2VzRGl2LnNjcm9sbEhlaWdodDsKICAgICAgICAgIHJlc29sdmUoKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgcmVqZWN0KGVycm9yKTsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLyBMb2FkaW5nIG1lc3NhZ2UgZnVuY3Rpb25zCiAgZnVuY3Rpb24gYWRkTG9hZGluZ01zZygpIHsKICAgIGNvbnN0IG1lc3NhZ2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIG1lc3NhZ2VEaXYuY2xhc3NOYW1lID0gIm1zZ2dUQ2I3WWtiU2ggYm90LW1zZ2dUQ2I3WWtiU2giOwogICAgbWVzc2FnZURpdi5pZCA9ICJsb2FkaW5nTXNnZ1RDYjdZa2JTaCI7CiAgICBtZXNzYWdlRGl2LmlubmVySFRNTCA9ICc8c3Bhbj48ZGl2IGNsYXNzPSJsZHMtZWxsaXBzaXNnVENiN1lrYlNoIj48ZGl2PjwvZGl2PjxkaXY+PC9kaXY+PGRpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2Pjwvc3Bhbj4nOwogICAgbWVzc2FnZXNEaXYuYXBwZW5kQ2hpbGQobWVzc2FnZURpdik7CiAgICBtZXNzYWdlc0Rpdi5zY3JvbGxUb3AgPSBtZXNzYWdlc0Rpdi5zY3JvbGxIZWlnaHQ7CiAgfQoKICBmdW5jdGlvbiByZW1vdmVMb2FkaW5nTXNnKCkgewogICAgY29uc3QgbG9hZGluZ01zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJsb2FkaW5nTXNnZ1RDYjdZa2JTaCIpOwogICAgaWYgKGxvYWRpbmdNc2cpIHsKICAgICAgbG9hZGluZ01zZy5yZW1vdmUoKTsKICAgIH0KICB9CgogIC8vIENvb2tpZSBoZWxwZXIKICBmdW5jdGlvbiBnZXRDb29raWUobmFtZSkgewogICAgY29uc3QgY29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgiOyAiKTsKICAgIGZvciAobGV0IGNvb2tpZSBvZiBjb29raWVzKSB7CiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IGNvb2tpZS5zcGxpdCgiPSIpOwogICAgICBpZiAoa2V5ID09PSBuYW1lKSByZXR1cm4gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8vIE1haW4gY2hhdGJvdCBBUEkgY2FsbAogIGFzeW5jIGZ1bmN0aW9uIGFza0NoYXRib3QobWVzc2FnZSkgewogICAgdHJ5IHsKICAgICAgaGlzdG9yeUlkID0gZ2V0Q29va2llKCJoaXN0b3J5SWQiKTsKICAgICAgY29uc3QgX2V4dHJhID0gYXdhaXQgZmV0Y2hFeHRyYURhdGEoKTsKICAgICAgCiAgICAgIGNvbnN0IGRhdGEgPSB7CiAgICAgICAgY2hhdGJvdF9uYW1lOiAnc2VmZmFuZScsCiAgICAgICAgbWVzc2FnZTogbWVzc2FnZSwKICAgICAgICBvcGVuc2VhcmNoX2FsaWFzOiAnZjQwMzllODYtZjBlNy00OTQzLThlYzctZGYzYTMwNWJjZmQzJywKICAgICAgICB1c2VyX2xvY2F0aW9uOiBfZXh0cmEsCiAgICAgICAgaGlzdG9yeUlkOiBoaXN0b3J5SWQsCiAgICAgIH07CgogICAgICBhZGRMb2FkaW5nTXNnKCk7CiAgICAgIHVzZXJJbnB1dC5kaXNhYmxlZCA9IHRydWU7CiAgICAgIHNlbmRCdXR0b24uZGlzYWJsZWQgPSB0cnVlOwoKICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnaHR0cHM6Ly93d3cucGFzc2lzdG8uY29tL2NoYXRib3QnLCB7CiAgICAgICAgbWV0aG9kOiAiUE9TVCIsCiAgICAgICAgaGVhZGVyczogeyAiQ29udGVudC1UeXBlIjogImFwcGxpY2F0aW9uL2pzb24iIH0sCiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZGF0YSksCiAgICAgIH0pOwoKICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgSFRUUCBlcnJvciEgc3RhdHVzOiAke3Jlc3BvbnNlLnN0YXR1c31gKTsKICAgICAgfQoKICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpOwogICAgICBoaXN0b3J5SWQgPSByZXNwb25zZURhdGEuaGlzdG9yeUlkOwoKICAgICAgaWYgKHJlc3BvbnNlRGF0YS5oaXN0b3J5SWQpIHsKICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgaGlzdG9yeUlkPSR7cmVzcG9uc2VEYXRhLmhpc3RvcnlJZH07IHBhdGg9LzsgbWF4LWFnZT0zNjAwOyBTYW1lU2l0ZT1TdHJpY3RgOwogICAgICB9CgogICAgICByZW1vdmVMb2FkaW5nTXNnKCk7CiAgICAgIGF3YWl0IGFkZE1lc3NhZ2UoImJvdCIsIHJlc3BvbnNlRGF0YS5hbnN3ZXIsIHJlc3BvbnNlRGF0YS5zb3VyY2VEb2N1bWVudHMpOwogICAgICAKICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IoIkNoYXRib3QgZXJyb3I6IiwgZXJyb3IpOwogICAgICByZW1vdmVMb2FkaW5nTXNnKCk7CiAgICAgIGF3YWl0IGFkZE1lc3NhZ2UoImJvdCIsICJTb3JyeSwgSSdtIGhhdmluZyB0cm91YmxlIGNvbm5lY3RpbmcgcmlnaHQgbm93LiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLiIsIFtdKTsKICAgIH0gZmluYWxseSB7CiAgICAgIHVzZXJJbnB1dC5kaXNhYmxlZCA9IGZhbHNlOwogICAgICBzZW5kQnV0dG9uLmRpc2FibGVkID0gZmFsc2U7CiAgICB9CiAgfQp9Cg=="));