{"data":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgPG1ldGEgY2hhcnNldD0iVVRGLTgiIC8+CiAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAsIHVzZXItc2NhbGFibGU9bm8iIC8+CiAgPHRpdGxlPkFsYnJpZ2h0Rm9yZ2Ug4oCUIFNvZnR3YXJlICYgVmVudHVyZSBEZXZlbG9wbWVudDwvdGl0bGU+CiAgPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFsYnJpZ2h0Rm9yZ2Ug4oCUIFNvZnR3YXJlICYgVmVudHVyZSBEZXZlbG9wbWVudC4gV2UgYnVpbGQsIGxhdW5jaCwgYW5kIHNjYWxlIHNvZnR3YXJlIHZlbnR1cmVzLiIgLz4KICA8bGluayByZWw9InByZWNvbm5lY3QiIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20iIC8+CiAgPGxpbmsgcmVsPSJwcmVjb25uZWN0IiBocmVmPSJodHRwczovL2ZvbnRzLmdzdGF0aWMuY29tIiBjcm9zc29yaWdpbiAvPgogIDxsaW5rIGhyZWY9Imh0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzMj9mYW1pbHk9T3V0Zml0OndnaHRAMzAwOzQwMDs1MDA7NjAwOzcwMCZkaXNwbGF5PXN3YXAiIHJlbD0ic3R5bGVzaGVldCIgLz4KICA8c3R5bGU+CiAgICAqLCAqOjpiZWZvcmUsICo6OmFmdGVyIHsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyBib3gtc2l6aW5nOiBib3JkZXItYm94OyB9CgogICAgaHRtbCB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBzY3JvbGwtYmVoYXZpb3I6IHNtb290aDsKICAgIH0KCiAgICBib2R5IHsKICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgY29sb3I6ICNmZmY7CiAgICAgIGZvbnQtZmFtaWx5OiAnT3V0Zml0Jywgc3lzdGVtLXVpLCBzYW5zLXNlcmlmOwogICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICB9CgogICAgY2FudmFzI2ZsdWlkIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB0b3A6IDA7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIHotaW5kZXg6IDA7CiAgICAgIHRvdWNoLWFjdGlvbjogbm9uZTsKICAgIH0KCiAgICAucGFnZS13cmFwIHsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB6LWluZGV4OiAxOwogICAgfQoKICAgIC5jb250ZW50IHsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIHBhZGRpbmc6IDJyZW07CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIC5sb2dvLWNvbnRhaW5lciB7CiAgICAgIHdpZHRoOiBtaW4oNDAwcHgsIDc1dncpOwogICAgICBtYXJnaW4tYm90dG9tOiAxcmVtOwogICAgICBhbmltYXRpb246IGZhZGVVcCAxLjRzIGN1YmljLWJlemllcigwLjIyLCAxLCAwLjM2LCAxKTsKICAgIH0KCiAgICAubG9nby1jb250YWluZXIgaW1nIHsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogYXV0bzsKICAgICAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgNjBweCByZ2JhKDE4MCwgMTQwLCA0MCwgMC4yKSkKICAgICAgICAgICAgICBkcm9wLXNoYWRvdygwIDAgMTIwcHggcmdiYSgxMDAsIDE2MCwgMTcwLCAwLjEpKTsKICAgIH0KCiAgICAudGFnbGluZSB7CiAgICAgIGZvbnQtc2l6ZTogY2xhbXAoMC44cmVtLCAydncsIDEuMDVyZW0pOwogICAgICBmb250LXdlaWdodDogMzAwOwogICAgICBsZXR0ZXItc3BhY2luZzogMC40ZW07CiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIGNvbG9yOiByZ2JhKDE2MCwgMTg1LCAxOTUsIDAuNTUpOwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGFuaW1hdGlvbjogZmFkZVVwIDEuNHMgY3ViaWMtYmV6aWVyKDAuMjIsIDEsIDAuMzYsIDEpIDAuMnMgYm90aDsKICAgIH0KCiAgICAuY3RhLXNlY3Rpb24gewogICAgICBtYXJnaW4tdG9wOiAyLjVyZW07CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGdhcDogMS4yNXJlbTsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgYW5pbWF0aW9uOiBmYWRlVXAgMS40cyBjdWJpYy1iZXppZXIoMC4yMiwgMSwgMC4zNiwgMSkgMC41cyBib3RoOwogICAgICBwb2ludGVyLWV2ZW50czogYWxsOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHotaW5kZXg6IDEwOwogICAgfQoKICAgIC5jdGEtYnRuIHsKICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGdhcDogMC41cmVtOwogICAgICBwYWRkaW5nOiAwLjc1cmVtIDEuNzVyZW07CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMTYwLCAxNDAsIDgwLCAwLjMpOwogICAgICBib3JkZXItcmFkaXVzOiA5OTlweDsKICAgICAgYmFja2dyb3VuZDogcmdiYSgxMCwgMTAsIDEwLCAwLjUpOwogICAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoMTZweCk7CiAgICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKDE2cHgpOwogICAgICBjb2xvcjogcmdiYSgyMDAsIDE5MCwgMTYwLCAwLjgpOwogICAgICBmb250LWZhbWlseTogJ091dGZpdCcsIHNhbnMtc2VyaWY7CiAgICAgIGZvbnQtc2l6ZTogMC44NXJlbTsKICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMTVlbTsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2U7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgei1pbmRleDogMTA7CiAgICAgIHRvdWNoLWFjdGlvbjogYXV0bzsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgIH0KCiAgICAuY3RhLWJ0bjpob3ZlciB7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMTYwLCAxNDAsIDgwLCAwLjEpOwogICAgICBib3JkZXItY29sb3I6IHJnYmEoMjAwLCAxNzAsIDgwLCAwLjYpOwogICAgICBjb2xvcjogcmdiYSgyNTUsIDI0NSwgMjIwLCAwLjk1KTsKICAgICAgYm94LXNoYWRvdzogMCAwIDQwcHggcmdiYSgxODAsIDE1MCwgNjAsIDAuMSk7CiAgICB9CgogICAgLmhpbnQgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMS41cmVtOwogICAgICBsZWZ0OiA1MCU7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgICAgZm9udC1zaXplOiAwLjdyZW07CiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjI1ZW07CiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIGNvbG9yOiByZ2JhKDE0MCwgMTYwLCAxNzAsIDAuMyk7CiAgICAgIHotaW5kZXg6IDI7CiAgICAgIGFuaW1hdGlvbjogZmFkZUluIDJzIGVhc2Utb3V0IDJzIGJvdGg7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIC8qIOKUgOKUgCBWZW50dXJlcyBTZWN0aW9uIOKUgOKUgCAqLwogICAgLnZlbnR1cmVzIHsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBtaW4taGVpZ2h0OiAxMDB2aDsKICAgICAgcGFkZGluZzogNnJlbSAycmVtOwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgfQoKICAgIC52ZW50dXJlcy1oZWFkZXIgewogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIG1hcmdpbi1ib3R0b206IDRyZW07CiAgICB9CgogICAgLnZlbnR1cmVzLWhlYWRlciBoMiB7CiAgICAgIGZvbnQtc2l6ZTogY2xhbXAoMS41cmVtLCA0dncsIDIuMnJlbSk7CiAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgIGxldHRlci1zcGFjaW5nOiAwLjE1ZW07CiAgICAgIGNvbG9yOiByZ2JhKDIyMCwgMjAwLCAxNjAsIDAuODUpOwogICAgICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtOwogICAgfQoKICAgIC52ZW50dXJlcy1oZWFkZXIgcCB7CiAgICAgIGZvbnQtc2l6ZTogY2xhbXAoMC44cmVtLCAxLjV2dywgMC45NXJlbSk7CiAgICAgIGNvbG9yOiByZ2JhKDE2MCwgMTcwLCAxODAsIDAuNDUpOwogICAgICBsZXR0ZXItc3BhY2luZzogMC4xZW07CiAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICB9CgogICAgLnZlbnR1cmVzLWdyaWQgewogICAgICBkaXNwbGF5OiBncmlkOwogICAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDI4MHB4LCAxZnIpKTsKICAgICAgZ2FwOiAxLjI1cmVtOwogICAgICBtYXgtd2lkdGg6IDkwMHB4OwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAudmVudHVyZS1jYXJkIHsKICAgICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgxNjAsIDE0MCwgODAsIDAuMTUpOwogICAgICBib3JkZXItcmFkaXVzOiAxNnB4OwogICAgICBwYWRkaW5nOiAxLjc1cmVtOwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDgsIDgsIDgsIDAuNik7CiAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigyMHB4KTsKICAgICAgLXdlYmtpdC1iYWNrZHJvcC1maWx0ZXI6IGJsdXIoMjBweCk7CiAgICAgIHRyYW5zaXRpb246IGFsbCAwLjRzIGVhc2U7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIH0KCiAgICAudmVudHVyZS1jYXJkOmhvdmVyIHsKICAgICAgYm9yZGVyLWNvbG9yOiByZ2JhKDIwMCwgMTcwLCA4MCwgMC4zNSk7CiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjAsIDE4LCAxMCwgMC43KTsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpOwogICAgICBib3gtc2hhZG93OiAwIDhweCA0MHB4IHJnYmEoMTgwLCAxNTAsIDYwLCAwLjA2KTsKICAgIH0KCiAgICAudmVudHVyZS1pY29uIHsKICAgICAgd2lkdGg6IDM2cHg7CiAgICAgIGhlaWdodDogMzZweDsKICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICAgICAgY29sb3I6IHJnYmEoMjAwLCAxNzAsIDgwLCAwLjYpOwogICAgfQoKICAgIC52ZW50dXJlLWNhcmQgaDMgewogICAgICBmb250LXNpemU6IDEuMDVyZW07CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIGNvbG9yOiByZ2JhKDIzMCwgMjIwLCAxOTAsIDAuOSk7CiAgICAgIG1hcmdpbi1ib3R0b206IDAuNHJlbTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDJlbTsKICAgIH0KCiAgICAudmVudHVyZS1jYXJkIC5wYXJlbnQtY28gewogICAgICBmb250LXNpemU6IDAuN3JlbTsKICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMTVlbTsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgY29sb3I6IHJnYmEoMjAwLCAxNzAsIDgwLCAwLjQpOwogICAgICBtYXJnaW4tYm90dG9tOiAwLjZyZW07CiAgICB9CgogICAgLnZlbnR1cmUtY2FyZCBwIHsKICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICBsaW5lLWhlaWdodDogMS41OwogICAgICBjb2xvcjogcmdiYSgxNjAsIDE3MCwgMTgwLCAwLjUpOwogICAgICBmb250LXdlaWdodDogMzAwOwogICAgfQoKICAgIC52ZW50dXJlcy1mb290ZXIgewogICAgICBtYXJnaW4tdG9wOiA0cmVtOwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICB9CgogICAgLnZlbnR1cmVzLWZvb3RlciBwIHsKICAgICAgZm9udC1zaXplOiAwLjc1cmVtOwogICAgICBjb2xvcjogcmdiYSgxNDAsIDE1MCwgMTYwLCAwLjMpOwogICAgICBsZXR0ZXItc3BhY2luZzogMC4xNWVtOwogICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgfQoKICAgIC8qIOKUgOKUgCBTY3JvbGwgcmV2ZWFsIOKUgOKUgCAqLwogICAgLnJldmVhbCB7CiAgICAgIG9wYWNpdHk6IDA7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgzMHB4KTsKICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjhzIGVhc2UsIHRyYW5zZm9ybSAwLjhzIGVhc2U7CiAgICB9CiAgICAucmV2ZWFsLnZpc2libGUgewogICAgICBvcGFjaXR5OiAxOwogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICB9CgogICAgQGtleWZyYW1lcyBmYWRlVXAgewogICAgICBmcm9tIHsgb3BhY2l0eTogMDsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDI0cHgpOyB9CiAgICAgIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9CiAgICB9CgogICAgQGtleWZyYW1lcyBmYWRlSW4gewogICAgICBmcm9tIHsgb3BhY2l0eTogMDsgfQogICAgICB0byB7IG9wYWNpdHk6IDAuMzsgfQogICAgfQogIDwvc3R5bGU+CjwvaGVhZD4KPGJvZHk+CiAgPGNhbnZhcyBpZD0iZmx1aWQiPjwvY2FudmFzPgoKICA8ZGl2IGNsYXNzPSJwYWdlLXdyYXAiPgogICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgIDxkaXYgY2xhc3M9ImxvZ28tY29udGFpbmVyIj4KICAgICAgICA8aW1nIHNyYz0iYXNzZXRzL2xvZ28ucG5nIiBhbHQ9IkFsYnJpZ2h0Rm9yZ2Ug4oCUIFNvZnR3YXJlICYgVmVudHVyZSBEZXZlbG9wbWVudCIgLz4KICAgICAgPC9kaXY+CiAgICAgIDxwIGNsYXNzPSJ0YWdsaW5lIj5XZSBidWlsZCB3aGF0J3MgbmV4dDwvcD4KICAgICAgPGRpdiBjbGFzcz0iY3RhLXNlY3Rpb24iPgogICAgICAgIDxhIGhyZWY9Im1haWx0bzpBbGJyaWdodGFzc2lzdGFudEBnbWFpbC5jb20iIGNsYXNzPSJjdGEtYnRuIj4KICAgICAgICAgIDxzdmcgd2lkdGg9IjE2IiBoZWlnaHQ9IjE2IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSI+PHJlY3QgeD0iMiIgeT0iNCIgd2lkdGg9IjIwIiBoZWlnaHQ9IjE2IiByeD0iMiIvPjxwYXRoIGQ9Ik0yMiA0TDEyIDEzIDIgNCIvPjwvc3ZnPgogICAgICAgICAgR2V0IGluIFRvdWNoCiAgICAgICAgPC9hPgogICAgICAgIDxhIGhyZWY9IiN2ZW50dXJlcyIgY2xhc3M9ImN0YS1idG4iPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNMTIgMkwyIDdsMTAgNSAxMC01LTEwLTV6Ii8+PHBhdGggZD0iTTIgMTdsMTAgNSAxMC01Ii8+PHBhdGggZD0iTTIgMTJsMTAgNSAxMC01Ii8+PC9zdmc+CiAgICAgICAgICBPdXIgVmVudHVyZXMKICAgICAgICA8L2E+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaGludCI+VG91Y2ggdGhlIHN1cmZhY2U8L2Rpdj4KCiAgICA8c2VjdGlvbiBpZD0idmVudHVyZXMiIGNsYXNzPSJ2ZW50dXJlcyI+CiAgICAgIDxkaXYgY2xhc3M9InZlbnR1cmVzLWhlYWRlciByZXZlYWwiPgogICAgICAgIDxoMj5PdXIgVmVudHVyZXM8L2gyPgogICAgICAgIDxwPlNvZnR3YXJlIHByb2R1Y3RzICYgc2VydmljZXMgYnVpbHQgYnkgQWxicmlnaHRGb3JnZTwvcD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJ2ZW50dXJlcy1ncmlkIj4KCiAgICAgICAgPGRpdiBjbGFzcz0idmVudHVyZS1jYXJkIHJldmVhbCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ2ZW50dXJlLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNMyA5bDktNyA5IDd2MTFhMiAyIDAgMDEtMiAySDVhMiAyIDAgMDEtMi0yVjl6Ii8+PHBvbHlsaW5lIHBvaW50cz0iOSAyMiA5IDEyIDE1IDEyIDE1IDIyIi8+PC9zdmc+CiAgICAgICAgICA8aDM+RVJQIFNvZnR3YXJlPC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhcmVudC1jbyI+QWxicmlnaHRGb3JnZTwvZGl2PgogICAgICAgICAgPHA+RW50ZXJwcmlzZSByZXNvdXJjZSBwbGFubmluZyBidWlsdCBmb3IgZ3Jvd2luZyBidXNpbmVzc2VzLiBTdHJlYW1saW5lIG9wZXJhdGlvbnMgZnJvbSBpbnZlbnRvcnkgdG8gaW52b2ljaW5nLjwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idmVudHVyZS1jYXJkIHJldmVhbCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ2ZW50dXJlLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNMTcgMjF2LTJhNCA0IDAgMDAtNC00SDVhNCA0IDAgMDAtNC00djIiLz48Y2lyY2xlIGN4PSI5IiBjeT0iNyIgcj0iNCIvPjxwYXRoIGQ9Ik0yMyAyMXYtMmE0IDQgMCAwMC0zLTMuODciLz48cGF0aCBkPSJNMTYgMy4xM2E0IDQgMCAwMTAgNy43NSIvPjwvc3ZnPgogICAgICAgICAgPGgzPkNSTSBTb2Z0d2FyZTwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJlbnQtY28iPkFsYnJpZ2h0Rm9yZ2U8L2Rpdj4KICAgICAgICAgIDxwPkN1c3RvbWVyIHJlbGF0aW9uc2hpcCBtYW5hZ2VtZW50IHRoYXQga2VlcHMgeW91ciBwaXBlbGluZSBtb3ZpbmcuIFRyYWNrIGxlYWRzLCBjbG9zZSBkZWFscywgZ3JvdyByZXZlbnVlLjwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idmVudHVyZS1jYXJkIHJldmVhbCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ2ZW50dXJlLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48Y2lyY2xlIGN4PSIxMiIgY3k9IjEyIiByPSIxMCIvPjxwYXRoIGQ9Ik0xMiA2djZsNCAyIi8+PC9zdmc+CiAgICAgICAgICA8aDM+U3BvcnRzIFRyYWluaW5nIEFwcDwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJlbnQtY28iPkFsYnJpZ2h0Rm9yZ2U8L2Rpdj4KICAgICAgICAgIDxwPlBlcmZvcm1hbmNlIHRyYWNraW5nIGFuZCB0cmFpbmluZyBtYW5hZ2VtZW50IGZvciBhdGhsZXRlcyBhbmQgY29hY2hlcy4gTG9nIHdvcmtvdXRzLCB0cmFjayBwcm9ncmVzcywgY29tcGV0ZS48L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InZlbnR1cmUtY2FyZCByZXZlYWwiPgogICAgICAgICAgPHN2ZyBjbGFzcz0idmVudHVyZS1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSI+PHJlY3QgeD0iMiIgeT0iMyIgd2lkdGg9IjIwIiBoZWlnaHQ9IjE0IiByeD0iMiIvPjxwYXRoIGQ9Ik04IDIxaDgiLz48cGF0aCBkPSJNMTIgMTd2NCIvPjxwYXRoIGQ9Ik03IDhoNCIvPjxwYXRoIGQ9Ik03IDExaDIiLz48L3N2Zz4KICAgICAgICAgIDxoMz5CdWlsZCBGb3JnZTwvaDM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJwYXJlbnQtY28iPkFsYnJpZ2h0Rm9yZ2U8L2Rpdj4KICAgICAgICAgIDxwPlByb2plY3QgbWFuYWdlbWVudCBwdXJwb3NlLWJ1aWx0IGZvciBkZXYgdGVhbXMuIFBsYW4gc3ByaW50cywgdHJhY2sgdGFza3MsIHNoaXAgZmFzdGVyLjwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idmVudHVyZS1jYXJkIHJldmVhbCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ2ZW50dXJlLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48cmVjdCB4PSIyIiB5PSIyIiB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHJ4PSI1Ii8+PHBhdGggZD0iTTE2IDExLjM3QTQgNCAwIDExMTIuNjMgOCA0IDQgMCAwMTE2IDExLjM3eiIvPjxsaW5lIHgxPSIxNy41IiB5MT0iNi41IiB4Mj0iMTcuNTEiIHkyPSI2LjUiLz48L3N2Zz4KICAgICAgICAgIDxoMz5Tb2NpYWwgTWVkaWEgUG9zdCBDcmVhdG9yPC9oMz4KICAgICAgICAgIDxkaXYgY2xhc3M9InBhcmVudC1jbyI+QWxicmlnaHRGb3JnZTwvZGl2PgogICAgICAgICAgPHA+RHJhZywgZHJvcCwgYW5kIHB1Ymxpc2guIEFJLXBvd2VyZWQgY29udGVudCBjcmVhdGlvbiBmb3IgYnJhbmRzIHRoYXQgbW92ZSBmYXN0LjwvcD4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0idmVudHVyZS1jYXJkIHJldmVhbCI+CiAgICAgICAgICA8c3ZnIGNsYXNzPSJ2ZW50dXJlLWljb24iIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS41Ij48cGF0aCBkPSJNMTIgMTlsNy03IDMgMy03IDctMy0zeiIvPjxwYXRoIGQ9Ik0xOCAxM2wtMS41LTcuNUwyIDJsMy41IDE0LjVMMTMgMThsNS01eiIvPjxwYXRoIGQ9Ik0yIDJsNy41ODYgNy41ODYiLz48Y2lyY2xlIGN4PSIxMSIgY3k9IjExIiByPSIyIi8+PC9zdmc+CiAgICAgICAgICA8aDM+V2Vic2l0ZSBEZXNpZ248L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icGFyZW50LWNvIj5BbGJyaWdodENvIExMQzwvZGl2PgogICAgICAgICAgPHA+Q3VzdG9tIHdlYnNpdGVzIHRoYXQgY29udmVydC4gRnJvbSBsYW5kaW5nIHBhZ2VzIHRvIGZ1bGwtc3RhY2sgYXBwbGljYXRpb25zLCBkZXNpZ25lZCBhbmQgYnVpbHQgdG8gcGVyZm9ybS48L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InZlbnR1cmUtY2FyZCByZXZlYWwiPgogICAgICAgICAgPHN2ZyBjbGFzcz0idmVudHVyZS1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSI+PHBvbHlnb24gcG9pbnRzPSIxMiAyIDE1LjA5IDguMjYgMjIgOS4yNyAxNyAxNC4xNCAxOC4xOCAyMS4wMiAxMiAxNy43NyA1LjgyIDIxLjAyIDcgMTQuMTQgMiA5LjI3IDguOTEgOC4yNiAxMiAyIi8+PC9zdmc+CiAgICAgICAgICA8aDM+TG9nbyBEZXNpZ248L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icGFyZW50LWNvIj5BbGJyaWdodENvIExMQzwvZGl2PgogICAgICAgICAgPHA+QnJhbmQgaWRlbnRpdHkgdGhhdCBzdGlja3MuIExvZ29zLCBtYXJrcywgYW5kIHZpc3VhbCBzeXN0ZW1zIGNyYWZ0ZWQgZm9yIHZlbnR1cmVzIHJlYWR5IHRvIHN0YW5kIG91dC48L3A+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDxkaXYgY2xhc3M9InZlbnR1cmUtY2FyZCByZXZlYWwiPgogICAgICAgICAgPHN2ZyBjbGFzcz0idmVudHVyZS1pY29uIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuNSI+PHBhdGggZD0iTTQgMTVzMS0xIDQtMSA1IDIgOCAyIDQtMSA0LTFWM3MtMSAxLTQgMS01LTItOC0yLTQgMS00IDF6Ii8+PGxpbmUgeDE9IjQiIHkxPSIyMiIgeDI9IjQiIHkyPSIxNSIvPjwvc3ZnPgogICAgICAgICAgPGgzPkFsYnJpZ2h0IE1lZGlhQ3JhZnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icGFyZW50LWNvIj5BbGJyaWdodEZvcmdlPC9kaXY+CiAgICAgICAgICA8cD5BIG5ldyBraW5kIG9mIFBSLiBTdHJhdGVnaWMgbWVkaWEgYW5kIGNvbW11bmljYXRpb25zIGZvciB2ZW50dXJlcyB0aGF0IHdhbnQgdG8gYmUgaGVhcmQsIG5vdCBqdXN0IHNlZW4uPC9wPgogICAgICAgIDwvZGl2PgoKICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJ2ZW50dXJlcy1mb290ZXIgcmV2ZWFsIj4KICAgICAgICA8cD4mY29weTsgMjAyNiBBbGJyaWdodEZvcmdlLiBBbGwgcmlnaHRzIHJlc2VydmVkLjwvcD4KICAgICAgPC9kaXY+CiAgICA8L3NlY3Rpb24+CiAgPC9kaXY+CgogIDxzY3JpcHQ+CiAgICAvLyDilIDilIAgV2ViR0wgSXJpZGVzY2VudCBPaWwtU2xpY2sgb24gRGFyayBXYXRlciDilIDilIAKICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmbHVpZCcpOwogICAgY29uc3QgZ2wgPSBjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCB7IGFscGhhOiBmYWxzZSwgYW50aWFsaWFzOiBmYWxzZSB9KTsKCiAgICBpZiAoIWdsKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuYmFja2dyb3VuZCA9ICcjMDUwNTA4JzsKICAgIH0KCiAgICAvLyDilIDilIAgUG9pbnRlciB0cmFja2luZyDilIDilIAKICAgIGNvbnN0IHBvaW50ZXIgPSB7IHg6IDAuNSwgeTogMC41LCBkeDogMCwgZHk6IDAsIG1vdmVkOiBmYWxzZSB9OwogICAgY29uc3QgcmlwcGxlcyA9IFtdOwoKICAgIGZ1bmN0aW9uIGhhbmRsZU1vdmUoY3gsIGN5KSB7CiAgICAgIGNvbnN0IG54ID0gY3ggLyB3aW5kb3cuaW5uZXJXaWR0aDsKICAgICAgY29uc3QgbnkgPSBjeSAvIHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgcG9pbnRlci5keCA9IG54IC0gcG9pbnRlci54OwogICAgICBwb2ludGVyLmR5ID0gbnkgLSBwb2ludGVyLnk7CiAgICAgIHBvaW50ZXIueCA9IG54OwogICAgICBwb2ludGVyLnkgPSBueTsKICAgICAgcG9pbnRlci5tb3ZlZCA9IHRydWU7CgogICAgICBjb25zdCBzcGVlZCA9IE1hdGguc3FydChwb2ludGVyLmR4ICoqIDIgKyBwb2ludGVyLmR5ICoqIDIpOwogICAgICBpZiAoc3BlZWQgPiAwLjAwMikgewogICAgICAgIHJpcHBsZXMucHVzaCh7IHg6IG54LCB5OiBueSwgc3RyZW5ndGg6IE1hdGgubWluKHNwZWVkICogMTAsIDEuMCksIGxpZmU6IDEuMCB9KTsKICAgICAgICBpZiAocmlwcGxlcy5sZW5ndGggPiAxMikgcmlwcGxlcy5zaGlmdCgpOwogICAgICB9CiAgICB9CgogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIGUgPT4gaGFuZGxlTW92ZShlLmNsaWVudFgsIGUuY2xpZW50WSkpOwoKICAgIGZ1bmN0aW9uIHNob3VsZEJsb2NrKGUpIHsKICAgICAgLy8gRG9uJ3QgYmxvY2sgdG91Y2hlcyBvbiBidXR0b25zLCBsaW5rcywgb3IgdGhlIHZlbnR1cmVzIHNlY3Rpb24KICAgICAgY29uc3QgZWwgPSBlLnRhcmdldDsKICAgICAgaWYgKGVsLmNsb3Nlc3QoJ2EsIGJ1dHRvbiwgLmN0YS1idG4sIC5jdGEtc2VjdGlvbicpKSByZXR1cm4gZmFsc2U7CiAgICAgIGlmIChlbC5jbG9zZXN0KCcjdmVudHVyZXMnKSkgcmV0dXJuIGZhbHNlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGUgPT4gewogICAgICBpZiAoc2hvdWxkQmxvY2soZSkpIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgZm9yIChjb25zdCB0IG9mIGUudG91Y2hlcykgaGFuZGxlTW92ZSh0LmNsaWVudFgsIHQuY2xpZW50WSk7CiAgICB9LCB7IHBhc3NpdmU6IGZhbHNlIH0pOwoKICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBlID0+IHsKICAgICAgaWYgKHNob3VsZEJsb2NrKGUpKSBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGZvciAoY29uc3QgdCBvZiBlLnRvdWNoZXMpIGhhbmRsZU1vdmUodC5jbGllbnRYLCB0LmNsaWVudFkpOwogICAgfSwgeyBwYXNzaXZlOiBmYWxzZSB9KTsKCiAgICAvLyDilIDilIAgU2hhZGVycyDilIDilIAKICAgIGNvbnN0IHZlcnQgPSBgYXR0cmlidXRlIHZlYzIgYV9wb3M7IHZvaWQgbWFpbigpe2dsX1Bvc2l0aW9uPXZlYzQoYV9wb3MsMCwxKTt9YDsKCiAgICBjb25zdCBmcmFnID0gYApwcmVjaXNpb24gaGlnaHAgZmxvYXQ7CnVuaWZvcm0gdmVjMiB1X3JlczsKdW5pZm9ybSBmbG9hdCB1X3RpbWU7CnVuaWZvcm0gdmVjMiB1X3B0cjsKdW5pZm9ybSB2ZWMyIHVfdmVsOwp1bmlmb3JtIGZsb2F0IHVfYWN0aXZlOwp1bmlmb3JtIHZlYzIgdV9yUG9zWzEyXTsKdW5pZm9ybSBmbG9hdCB1X3JMaWZlWzEyXTsKdW5pZm9ybSBmbG9hdCB1X3JTdHJbMTJdOwp1bmlmb3JtIGludCB1X3JDb3VudDsKCi8vIOKUgOKUgCBOb2lzZSDilIDilIAKdmVjMyBtb2QyODkodmVjMyB4KXtyZXR1cm4geC1mbG9vcih4LzI4OS4pKjI4OS47fQp2ZWMyIG1vZDI4OSh2ZWMyIHgpe3JldHVybiB4LWZsb29yKHgvMjg5LikqMjg5Ljt9CnZlYzMgcGVybXV0ZSh2ZWMzIHgpe3JldHVybiBtb2QyODkoKHgqMzQuKzEuKSp4KTt9CgpmbG9hdCBzbm9pc2UodmVjMiB2KXsKICBjb25zdCB2ZWM0IEM9dmVjNCguMjExMzI0ODY1NDA1MTg3LC4zNjYwMjU0MDM3ODQ0MzksLS41NzczNTAyNjkxODk2MjYsLjAyNDM5MDI0MzkwMjQzOSk7CiAgdmVjMiBpPWZsb29yKHYrZG90KHYsQy55eSkpOwogIHZlYzIgeDA9di1pK2RvdChpLEMueHgpOwogIHZlYzIgaTE9KHgwLng+eDAueSk/dmVjMigxLDApOnZlYzIoMCwxKTsKICB2ZWM0IHgxMj14MC54eXh5K0MueHh6ejsgeDEyLnh5LT1pMTsKICBpPW1vZDI4OShpKTsKICB2ZWMzIHA9cGVybXV0ZShwZXJtdXRlKGkueSt2ZWMzKDAsaTEueSwxKSkraS54K3ZlYzMoMCxpMS54LDEpKTsKICB2ZWMzIG09bWF4KC41LXZlYzMoZG90KHgwLHgwKSxkb3QoeDEyLnh5LHgxMi54eSksZG90KHgxMi56dyx4MTIuencpKSwwLik7CiAgbT1tKm07IG09bSptOwogIHZlYzMgeD0yLipmcmFjdChwKkMud3d3KS0xLjsKICB2ZWMzIGg9YWJzKHgpLS41OwogIHZlYzMgb3g9Zmxvb3IoeCsuNSk7CiAgdmVjMyBhMD14LW94OwogIG0qPTEuNzkyODQyOTE0MDAxNTktLjg1MzczNDcyMDk1MzE0KihhMCphMCtoKmgpOwogIHZlYzMgZzsKICBnLng9YTAueCp4MC54K2gueCp4MC55OwogIGcueXo9YTAueXoqeDEyLnh6K2gueXoqeDEyLnl3OwogIHJldHVybiAxMzAuKmRvdChtLGcpOwp9CgpmbG9hdCBmYm0odmVjMiBwKXsKICBmbG9hdCBmPTAuOwogIGYrPS41KnNub2lzZShwKTsgcCo9Mi4wMTsKICBmKz0uMjUqc25vaXNlKHApOyBwKj0yLjAyOwogIGYrPS4xMjUqc25vaXNlKHApOyBwKj0yLjAzOwogIGYrPS4wNjI1KnNub2lzZShwKTsKICByZXR1cm4gZjsKfQoKLy8g4pSA4pSAIFRoaW4tZmlsbSBpbnRlcmZlcmVuY2UgKHdhcm0tc2hpZnRlZCkg4pSA4pSACi8vIFR1bmVkIHRvIGZhdm9yIG9yYW5nZS9hbWJlci9nb2xkIHRvbmVzIG1hdGNoaW5nIHRoZSBBbGJyaWdodEZvcmdlIGJyYW5kCnZlYzMgdGhpbkZpbG0oZmxvYXQgdGhpY2tuZXNzLCBmbG9hdCBjb3NBbmdsZSl7CiAgZmxvYXQgcGhhc2UgPSA0LjAgKiAzLjE0MTU5ICogdGhpY2tuZXNzICogY29zQW5nbGU7CgogIC8vIFR3by10b25lIHBhbGV0dGU6IHRydWUgb3JhbmdlL2FtYmVyICsgZGFyayB0ZWFsIChBbGJyaWdodEZvcmdlIGxvZ28pCgogIC8vIE9yYW5nZS9hbWJlciDigJQgcmdiKDIwMCwgMTMwLCAyMCkgc3R5bGUsIG5vdCByZWQKICBmbG9hdCBvcl8gPSBwb3coc2luKHBoYXNlIC8gMS4yNSArIDAuMCksIDIuMCkgKiAwLjc7CiAgZmxvYXQgb2cgPSBwb3coc2luKHBoYXNlIC8gMS4wNSArIDEuMCksIDIuMCkgKiAwLjQ1OwogIGZsb2F0IG9iID0gcG93KHNpbihwaGFzZSAvIDAuOSArIDIuNiksIDIuMCkgKiAwLjAyOwoKICB2ZWMzIHdhcm0gPSB2ZWMzKG9yXywgb2csIG9iKTsKCiAgLy8gVGVhbCDigJQgZ3JlZW4tZG9taW5hbnQgd2l0aCBtb2RlcmF0ZSBibHVlLCBsaWtlIHJnYig0MCwgMTMwLCAxMjApCiAgZmxvYXQgdHIgPSBwb3coc2luKHBoYXNlIC8gMS42ICsgMS44KSwgMi4wKSAqIDAuMDU7CiAgZmxvYXQgdGcgPSBwb3coc2luKHBoYXNlIC8gMS4zICsgMC42KSwgMi4wKSAqIDAuNTU7CiAgZmxvYXQgdGIgPSBwb3coc2luKHBoYXNlIC8gMS4xICsgMC4zKSwgMi4wKSAqIDAuMzg7CgogIHZlYzMgY29vbCA9IHZlYzModHIsIHRnLCB0Yik7CgogIC8vIEJsZW5kIOKAlCBnb29kIG1peCBvZiBib3RoCiAgZmxvYXQgYmxlbmQgPSBwb3coc2luKHBoYXNlICogMC4zNSArIDEuNSksIDIuMCk7CiAgdmVjMyBjb2wgPSBtaXgod2FybSwgY29vbCwgYmxlbmQgKiAwLjU1ICsgMC4yKTsKCiAgLy8gQ2xhbXAgcmVkIHNvIGl0IG5ldmVyIGxvb2tzICJyZWQiIOKAlCBmb3JjZSBvcmFuZ2UgcmF0aW8KICBjb2wuciA9IG1pbihjb2wuciwgY29sLmcgKiAxLjYgKyAwLjA4KTsKCiAgcmV0dXJuIGNvbDsKfQoKdm9pZCBtYWluKCl7CiAgdmVjMiB1diA9IGdsX0ZyYWdDb29yZC54eSAvIHVfcmVzOwogIGZsb2F0IGFzcCA9IHVfcmVzLnggLyB1X3Jlcy55OwogIHZlYzIgcCA9IHZlYzIodXYueCAqIGFzcCwgdXYueSk7CiAgZmxvYXQgdCA9IHVfdGltZTsKCiAgLy8g4pSA4pSAIExheWVyZWQgd2F0ZXIgY3VycmVudCBtb3Rpb24g4pSA4pSACiAgLy8gTXVsdGlwbGUgZmxvdyBsYXllcnMgYXQgZGlmZmVyZW50IHNwZWVkcyBmb3IgZGVwdGgKICBmbG9hdCBmbG93MSA9IGZibShwICogMS41ICsgdmVjMih0ICogMC4wMzUsIHQgKiAwLjAyNSkpOwogIGZsb2F0IGZsb3cyID0gZmJtKHAgKiAyLjIgLSB2ZWMyKHQgKiAwLjAyOCwgLXQgKiAwLjAyKSk7CiAgZmxvYXQgZmxvdzMgPSBzbm9pc2UocCAqIDAuNiArIHZlYzIodCAqIDAuMDE1LCB0ICogMC4wMTIpKTsKICBmbG9hdCBmbG93RGVlcCA9IGZibShwICogMC44ICsgdmVjMih0ICogMC4wMDgsIHQgKiAwLjAwNikpOyAvLyBkZWVwIHNsb3cgY3VycmVudAoKICAvLyBXYXRlciBzdXJmYWNlIHdhdmVzIOKAlCBzaW5lLWJhc2VkIHVuZHVsYXRpb24KICBmbG9hdCB3YXZlMSA9IHNpbihwLnggKiAzLjAgKyBwLnkgKiAxLjUgKyB0ICogMC44KSAqIDAuMDI7CiAgZmxvYXQgd2F2ZTIgPSBzaW4ocC54ICogNS4wIC0gcC55ICogMi4wICsgdCAqIDEuMikgKiAwLjAxMjsKICBmbG9hdCB3YXZlMyA9IHNpbihwLnggKiAxLjIgKyBwLnkgKiA0LjAgKyB0ICogMC41KSAqIDAuMDE1OwogIGZsb2F0IHdhdmVzID0gd2F2ZTEgKyB3YXZlMiArIHdhdmUzOwoKICAvLyBEaXN0b3J0IFVWIGZvciBvcmdhbmljIGZsb3cgKyB3YXZlIGRpc3BsYWNlbWVudAogIHZlYzIgZGlzdG9ydGVkID0gcCArIHZlYzIoZmxvdzEgKyB3YXZlcywgZmxvdzIgKyB3YXZlcyAqIDAuNykgKiAwLjA4OwoKICAvLyDilIDilIAgT2lsIGZpbG0gdGhpY2tuZXNzIG1hcCDilIDilIAKICBmbG9hdCB0aGlja25lc3MgPSAwLjA7CiAgdGhpY2tuZXNzICs9IGZibShkaXN0b3J0ZWQgKiAzLjAgKyB0ICogMC4wNCkgKiAwLjU7CiAgdGhpY2tuZXNzICs9IHNub2lzZShkaXN0b3J0ZWQgKiA1LjAgLSB0ICogMC4wMykgKiAwLjI1OwogIHRoaWNrbmVzcyArPSBzbm9pc2UoZGlzdG9ydGVkICogMS4yICsgdCAqIDAuMDE1KSAqIDAuMzU7CiAgLy8gV2F2ZSBwZWFrcyB0aGluIHRoZSBvaWwsIHRyb3VnaHMgdGhpY2tlbiBpdAogIHRoaWNrbmVzcyArPSB3YXZlcyAqIDMuMDsKICB0aGlja25lc3MgPSB0aGlja25lc3MgKiAwLjUgKyAwLjU7CiAgdGhpY2tuZXNzID0gdGhpY2tuZXNzICogMC40ICsgMC4xNTsKCiAgLy8g4pSA4pSAIFBvaW50ZXIgJiByaXBwbGUgZGlzdHVyYmFuY2Ug4pSA4pSACiAgZmxvYXQgZGlzdHVyYmFuY2UgPSAwLjA7CiAgdmVjMiBwdHJBc3AgPSB2ZWMyKHVfcHRyLnggKiBhc3AsIHVfcHRyLnkpOwoKICAvLyBSaXBwbGUgdHJhaWwg4oCUIHJlYWxpc3RpYyB3YXRlciByaXBwbGVzIHdpdGggbXVsdGlwbGUgY29uY2VudHJpYyByaW5ncwogIGZvcihpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKXsKICAgIGlmKGkgPj0gdV9yQ291bnQpIGJyZWFrOwogICAgdmVjMiBycCA9IHZlYzIodV9yUG9zW2ldLnggKiBhc3AsIHVfclBvc1tpXS55KTsKICAgIGZsb2F0IGQgPSBkaXN0YW5jZShwLCBycCk7CiAgICBmbG9hdCBsaWZlID0gdV9yTGlmZVtpXTsKICAgIGZsb2F0IHN0ciA9IHVfclN0cltpXTsKCiAgICAvLyBFeHBhbmRpbmcgY29uY2VudHJpYyByaW5ncyDigJQgbXVsdGlwbGUgd2F2ZXMgbGlrZSByZWFsIHdhdGVyCiAgICBmbG9hdCByaXBSYWQgPSAoMS4wIC0gbGlmZSkgKiAwLjg7CiAgICBmbG9hdCByaW5nV2lkdGggPSAyNS4wIC0gKDEuMCAtIGxpZmUpICogOC4wOyAvLyByaW5ncyBzcHJlYWQgYW5kIHNvZnRlbgogICAgZmxvYXQgcmluZzEgPSBleHAoLXBvdygoZCAtIHJpcFJhZCkgKiByaW5nV2lkdGgsIDIuMCkpICogMC42OwogICAgZmxvYXQgcmluZzIgPSBleHAoLXBvdygoZCAtIHJpcFJhZCAqIDAuNykgKiByaW5nV2lkdGggKiAxLjIsIDIuMCkpICogMC4zNTsKICAgIGZsb2F0IHJpbmczID0gZXhwKC1wb3coKGQgLSByaXBSYWQgKiAwLjQ1KSAqIHJpbmdXaWR0aCAqIDEuNSwgMi4wKSkgKiAwLjI7CiAgICBmbG9hdCByaW5ncyA9IHJpbmcxICsgcmluZzIgKyByaW5nMzsKCiAgICAvLyBTb2Z0ZXIgY2VudHJhbCBkaXNwbGFjZW1lbnQg4oCUIHdhdGVyIHB1c2hlcyBvdXR3YXJkCiAgICBmbG9hdCBzcGxhc2ggPSBleHAoLWQgKiA1LjApICogbGlmZSAqIGxpZmUgKiAwLjc7CgogICAgLy8gU3VyZmFjZSB0ZW5zaW9uIOKAlCB3YXRlciBwdWxscyBiYWNrIHRvd2FyZCBjZW50ZXIgYXMgcmlwcGxlIGZhZGVzCiAgICBmbG9hdCB0ZW5zaW9uID0gZXhwKC1kICogOC4wKSAqICgxLjAgLSBsaWZlKSAqIDAuMzsKCiAgICAvLyBPaWwgcGFydGluZyB3aXRoIHNtb290aCBmYWxsb2ZmCiAgICBmbG9hdCBwYXJ0ID0gZXhwKC1kICogMy4wKSAqIGxpZmU7CgogICAgZGlzdHVyYmFuY2UgKz0gKHJpbmdzICsgc3BsYXNoIC0gdGVuc2lvbikgKiBzdHIgKiBsaWZlOwoKICAgIC8vIE9pbCBmaWxtIGRpc3BsYWNlbWVudAogICAgdGhpY2tuZXNzICs9IHBhcnQgKiBzdHIgKiAwLjM1OwogICAgLy8gU3dpcmxpbmcgdm9ydGV4IG5lYXIgaW1wYWN0CiAgICBmbG9hdCBhbmdsZSA9IGF0YW4ocC55IC0gcnAueSwgcC54IC0gcnAueCk7CiAgICBmbG9hdCBzd2lybCA9IHNpbihhbmdsZSAqIDMuMCArIGQgKiAxNS4wIC0gdCAqIDIuMCkgKiBleHAoLWQgKiA0LjApOwogICAgdGhpY2tuZXNzICs9IHN3aXJsICogcGFydCAqIHN0ciAqIDAuMTI7CiAgfQoKICAvLyBEaXJlY3QgcG9pbnRlciBpbmZsdWVuY2Ug4oCUIHNtb290aCBhbmQgZmx1aWQKICBmbG9hdCBwRGlzdCA9IGRpc3RhbmNlKHAsIHB0ckFzcCk7CiAgZmxvYXQgcEluZiA9IGV4cCgtcERpc3QgKiAzLjUpICogdV9hY3RpdmU7CiAgZmxvYXQgc3BkID0gbGVuZ3RoKHVfdmVsKSAqIDIwLjA7CiAgcEluZiAqPSBtaW4oc3BkICsgMC4yLCAxLjApOwogIGRpc3R1cmJhbmNlICs9IHBJbmY7CiAgdGhpY2tuZXNzICs9IHBJbmYgKiAwLjM7CgogIC8vIFdha2UgdHJhaWwgYmVoaW5kIHBvaW50ZXIg4oCUIGxpa2UgYSBmaW5nZXIgZHJhZ2dlZCB0aHJvdWdoIHdhdGVyCiAgdmVjMiB2ZWxEaXIgPSBub3JtYWxpemUodV92ZWwgKyB2ZWMyKDAuMDAxKSk7CiAgZmxvYXQgd2FrZSA9IHNub2lzZShwICogNS4wICsgdmVsRGlyICogc3BkICogMi41ICsgdCAqIDAuNCk7CiAgZmxvYXQgd2FrZVNoYXBlID0gZXhwKC1wRGlzdCAqIDIuNSkgKiB1X2FjdGl2ZSAqIG1pbihzcGQgKiAwLjUsIDEuMCk7CiAgdGhpY2tuZXNzICs9IHdha2UgKiB3YWtlU2hhcGUgKiAwLjI1OwogIC8vIFNlY29uZGFyeSB3YWtlIHJpcHBsZXMKICBmbG9hdCB3YWtlMiA9IHNpbihkb3QocCAtIHB0ckFzcCwgdmVsRGlyKSAqIDMwLjAgKyB0ICogMy4wKSAqIGV4cCgtcERpc3QgKiAzLjApOwogIGRpc3R1cmJhbmNlICs9IHdha2UyICogdV9hY3RpdmUgKiAwLjE1ICogbWluKHNwZCwgMC41KTsKCiAgLy8g4pSA4pSAIFZpZXdpbmcgYW5nbGUgKHNpbXVsYXRlZCkg4pSA4pSACiAgLy8gVmFyaWVzIGFjcm9zcyBzY3JlZW4gKyBkaXN0dXJiYW5jZSBzaGlmdHMgaXQKICBmbG9hdCBjb3NBbmdsZSA9IDAuODUgKyBmbG93MyAqIDAuMSAtIGRpc3R1cmJhbmNlICogMC4yOwogIGNvc0FuZ2xlID0gY2xhbXAoY29zQW5nbGUsIDAuMywgMS4wKTsKCiAgLy8g4pSA4pSAIENvbXB1dGUgaXJpZGVzY2VudCBjb2xvciDilIDilIAKICB2ZWMzIGZpbG1Db2xvciA9IHRoaW5GaWxtKHRoaWNrbmVzcywgY29zQW5nbGUpOwoKICAvLyBUaGUgb2lsIGZpbG0gc2VsZWN0aXZlbHkgcmVmbGVjdHMgLSByZXN0IGdvZXMgdG8gZGFyayB3YXRlciBiZWxvdwogIC8vIEZyZXNuZWwtbGlrZSBpbnRlbnNpdHk6IG1vcmUgcmVmbGVjdGlvbiBhdCBnbGFuY2luZyBhbmdsZXMKICBmbG9hdCByZWZsZWN0aXZpdHkgPSAwLjA4ICsgMC4xMiAqIHBvdygxLjAgLSBjb3NBbmdsZSwgMi4wKTsKICByZWZsZWN0aXZpdHkgKz0gZGlzdHVyYmFuY2UgKiAwLjI1OyAvLyBkaXN0dXJiYW5jZSByZXZlYWxzIG1vcmUgY29sb3IKCiAgLy8gU2NhbGUgZmlsbSBjb2xvciBieSByZWZsZWN0aXZpdHkKICB2ZWMzIG9pbENvbG9yID0gZmlsbUNvbG9yICogcmVmbGVjdGl2aXR5OwoKICAvLyDilIDilIAgRGVlcCB3YXRlciBiYXNlIHdpdGggZGVwdGggbGF5ZXJzIOKUgOKUgAogIHZlYzMgd2F0ZXJEZWVwID0gdmVjMygwLjAwNCwgMC4wMTQsIDAuMDEyKTsKICB2ZWMzIHdhdGVyTWlkID0gdmVjMygwLjAwOCwgMC4wMjQsIDAuMDE5KTsKICB2ZWMzIHdhdGVyU3VyZmFjZSA9IHZlYzMoMC4wMTIsIDAuMDMyLCAwLjAyNik7CiAgLy8gVGhyZWUtbGF5ZXIgZGVwdGggYmxlbmRpbmcKICBmbG9hdCBkZXB0aCA9IGZsb3dEZWVwICogMC41ICsgMC41OwogIHZlYzMgd2F0ZXIgPSBtaXgod2F0ZXJEZWVwLCBtaXgod2F0ZXJNaWQsIHdhdGVyU3VyZmFjZSwgZGVwdGgpLCBmbG93MyAqIDAuNSArIDAuNSk7CgogIC8vIFVuZGVyd2F0ZXIgY2F1c3RpY3Mg4oCUIGxpZ2h0IGRhbmNpbmcgdGhyb3VnaCB3YXRlcgogIGZsb2F0IGNhdXN0aWMgPSBzbm9pc2UoZGlzdG9ydGVkICogMTIuMCArIHQgKiAwLjE1KTsKICBjYXVzdGljID0gcG93KG1heChjYXVzdGljLCAwLjApLCAzLjApICogMC4wMTU7CiAgZmxvYXQgY2F1c3RpYzIgPSBzbm9pc2UoZGlzdG9ydGVkICogOC4wIC0gdCAqIDAuMSk7CiAgY2F1c3RpYzIgPSBwb3cobWF4KGNhdXN0aWMyLCAwLjApLCAzLjApICogMC4wMTU7CiAgLy8gQW5pbWF0ZWQgY2F1c3RpYyB3ZWIgcGF0dGVybgogIGZsb2F0IGNhdXN0aWNXZWIgPSBzbm9pc2UoZGlzdG9ydGVkICogMTUuMCArIHZlYzIoc2luKHQgKiAwLjIpLCBjb3ModCAqIDAuMTUpKSAqIDAuNSk7CiAgY2F1c3RpY1dlYiA9IHBvdyhtYXgoY2F1c3RpY1dlYiwgMC4wKSwgNS4wKSAqIDAuMDA4OwogIHdhdGVyICs9IGNhdXN0aWMgKiB2ZWMzKDAuNzUsIDAuNDUsIDAuMDUpOwogIHdhdGVyICs9IGNhdXN0aWMyICogdmVjMygwLjA0LCAwLjM4LCAwLjI4KTsKICB3YXRlciArPSBjYXVzdGljV2ViICogdmVjMygwLjMsIDAuNSwgMC40NSk7IC8vIHN1YnRsZSB0ZWFsIHdlYgoKICAvLyDilIDilIAgQ29tcG9zZSDilIDilIAKICB2ZWMzIGNvbG9yID0gd2F0ZXIgKyBvaWxDb2xvcjsKCiAgLy8gU3VyZmFjZSBsaWdodCDigJQgY2F0Y2hlcyB3YXZlIHBlYWtzCiAgZmxvYXQgc3VyZmFjZUxpZ2h0ID0gbWF4KHdhdmVzICogMTIuMCwgMC4wKTsKICBzdXJmYWNlTGlnaHQgPSBwb3coc3VyZmFjZUxpZ2h0LCAyLjApICogMC4wODsKICBjb2xvciArPSBzdXJmYWNlTGlnaHQgKiB2ZWMzKDAuNiwgMC40NSwgMC4xNSk7IC8vIG9yYW5nZSBoaWdobGlnaHRzIG9uIHdhdmUgY3Jlc3RzCgogIC8vIFNwZWN1bGFyIGhpZ2hsaWdodHMgb24gcmlwcGxlcyDigJQgc2hhcnBlciwgbW9yZSBkZWZpbmVkCiAgZmxvYXQgc3BlYyA9IHNub2lzZShwICogMTguMCArIHQgKiAwLjM1KTsKICBzcGVjID0gcG93KG1heChzcGVjLCAwLjApLCAxMC4wKTsKICBmbG9hdCBzcGVjMiA9IHNub2lzZShwICogMzAuMCAtIHQgKiAwLjIpOwogIHNwZWMyID0gcG93KG1heChzcGVjMiwgMC4wKSwgMTQuMCk7CiAgY29sb3IgKz0gc3BlYyAqIGRpc3R1cmJhbmNlICogdmVjMygwLjE1LCAwLjEwLCAwLjAzKTsKICBjb2xvciArPSBzcGVjMiAqIGRpc3R1cmJhbmNlICogdmVjMygwLjAzLCAwLjA4LCAwLjA3KTsgLy8gdGVhbCBtaWNyby1zcGVjdWxhcgoKICAvLyBPaWwgY292ZXJhZ2Ug4oCUIG9yZ2FuaWMgcGF0Y2hlcwogIGZsb2F0IG9pbENvdmVyYWdlID0gc21vb3Roc3RlcCgtMC4zLCAwLjQsIGZibShwICogMS4wICsgdCAqIDAuMDA4KSk7CiAgY29sb3IgPSBtaXgod2F0ZXIsIGNvbG9yLCBvaWxDb3ZlcmFnZSk7CgogIC8vIFNvZnQgYmxvb20vZ2xvdyBhcm91bmQgYnJpZ2h0IGFyZWFzCiAgZmxvYXQgYnJpZ2h0bmVzcyA9IGRvdChjb2xvciwgdmVjMygwLjI5OSwgMC41ODcsIDAuMTE0KSk7CiAgZmxvYXQgYmxvb20gPSBzbW9vdGhzdGVwKDAuMDQsIDAuMTIsIGJyaWdodG5lc3MpICogMC4xNTsKICBjb2xvciArPSBjb2xvciAqIGJsb29tOwoKICAvLyBWaWduZXR0ZSDigJQgc29mdGVyLCBtb3JlIGNpbmVtYXRpYwogIGZsb2F0IHZpZyA9IDEuMCAtIGxlbmd0aCh1diAtIDAuNSkgKiAwLjY1OwogIHZpZyA9IHNtb290aHN0ZXAoMC4wLCAxLjAsIHZpZyk7CiAgdmlnID0gMC4xNSArIHZpZyAqIDAuODU7IC8vIGRvbid0IGdvIGZ1bGx5IGJsYWNrIGF0IGVkZ2VzCiAgY29sb3IgKj0gdmlnOwoKICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCAxLjApOwp9CmA7CgogICAgLy8g4pSA4pSAIEdMIHNldHVwIOKUgOKUgAogICAgZnVuY3Rpb24gbWFrZVNoYWRlcih0eXBlLCBzcmMpIHsKICAgICAgY29uc3QgcyA9IGdsLmNyZWF0ZVNoYWRlcih0eXBlKTsKICAgICAgZ2wuc2hhZGVyU291cmNlKHMsIHNyYyk7CiAgICAgIGdsLmNvbXBpbGVTaGFkZXIocyk7CiAgICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHMsIGdsLkNPTVBJTEVfU1RBVFVTKSkKICAgICAgICBjb25zb2xlLmVycm9yKGdsLmdldFNoYWRlckluZm9Mb2cocykpOwogICAgICByZXR1cm4gczsKICAgIH0KCiAgICBjb25zdCBwcm9nID0gZ2wuY3JlYXRlUHJvZ3JhbSgpOwogICAgZ2wuYXR0YWNoU2hhZGVyKHByb2csIG1ha2VTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUiwgdmVydCkpOwogICAgZ2wuYXR0YWNoU2hhZGVyKHByb2csIG1ha2VTaGFkZXIoZ2wuRlJBR01FTlRfU0hBREVSLCBmcmFnKSk7CiAgICBnbC5saW5rUHJvZ3JhbShwcm9nKTsKICAgIGdsLnVzZVByb2dyYW0ocHJvZyk7CgogICAgY29uc3QgYnVmID0gZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgYnVmKTsKICAgIGdsLmJ1ZmZlckRhdGEoZ2wuQVJSQVlfQlVGRkVSLCBuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwxLC0xLC0xLDEsMSwxXSksIGdsLlNUQVRJQ19EUkFXKTsKICAgIGNvbnN0IGFQID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZywgJ2FfcG9zJyk7CiAgICBnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheShhUCk7CiAgICBnbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFQLCAyLCBnbC5GTE9BVCwgZmFsc2UsIDAsIDApOwoKICAgIGNvbnN0IGxvYyA9IG5hbWUgPT4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2csIG5hbWUpOwogICAgY29uc3QgdVJlcyA9IGxvYygndV9yZXMnKSwgdVRpbWUgPSBsb2MoJ3VfdGltZScpLCB1UHRyID0gbG9jKCd1X3B0cicpOwogICAgY29uc3QgdVZlbCA9IGxvYygndV92ZWwnKSwgdUFjdGl2ZSA9IGxvYygndV9hY3RpdmUnKTsKICAgIGNvbnN0IHVSUG9zID0gbG9jKCd1X3JQb3MnKSwgdVJMaWZlID0gbG9jKCd1X3JMaWZlJyk7CiAgICBjb25zdCB1UlN0ciA9IGxvYygndV9yU3RyJyksIHVSQ291bnQgPSBsb2MoJ3VfckNvdW50Jyk7CgogICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICBjb25zdCBkcHIgPSBNYXRoLm1pbihkZXZpY2VQaXhlbFJhdGlvIHx8IDEsIDEuNSk7CiAgICAgIGNhbnZhcy53aWR0aCA9IGlubmVyV2lkdGggKiBkcHI7CiAgICAgIGNhbnZhcy5oZWlnaHQgPSBpbm5lckhlaWdodCAqIGRwcjsKICAgICAgZ2wudmlld3BvcnQoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTsKICAgIH0KICAgIGFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZSk7CiAgICByZXNpemUoKTsKCiAgICAvLyDilIDilIAgUmVuZGVyIGxvb3Ag4pSA4pSACiAgICBsZXQgZmFkZSA9IDA7CiAgICBjb25zdCB0MCA9IHBlcmZvcm1hbmNlLm5vdygpOwoKICAgIChmdW5jdGlvbiBsb29wKCkgewogICAgICBjb25zdCB0ID0gKHBlcmZvcm1hbmNlLm5vdygpIC0gdDApIC8gMTAwMDsKCiAgICAgIC8vIERlY2F5IHJpcHBsZXMKICAgICAgZm9yIChsZXQgaSA9IHJpcHBsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICByaXBwbGVzW2ldLmxpZmUgLT0gMC4wMDQ7IC8vIHNsb3dlciBkZWNheSBmb3IgbG9uZ2VyLWxhc3RpbmcgcmlwcGxlcwogICAgICAgIGlmIChyaXBwbGVzW2ldLmxpZmUgPD0gMCkgcmlwcGxlcy5zcGxpY2UoaSwgMSk7CiAgICAgIH0KCiAgICAgIGZhZGUgPSBwb2ludGVyLm1vdmVkID8gTWF0aC5taW4oZmFkZSArIDAuMSwgMSkgOiBmYWRlICogMC45NzsKICAgICAgcG9pbnRlci5tb3ZlZCA9IGZhbHNlOwoKICAgICAgZ2wudW5pZm9ybTJmKHVSZXMsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CiAgICAgIGdsLnVuaWZvcm0xZih1VGltZSwgdCk7CiAgICAgIGdsLnVuaWZvcm0yZih1UHRyLCBwb2ludGVyLngsIDEgLSBwb2ludGVyLnkpOwogICAgICBnbC51bmlmb3JtMmYodVZlbCwgcG9pbnRlci5keCwgLXBvaW50ZXIuZHkpOwogICAgICBnbC51bmlmb3JtMWYodUFjdGl2ZSwgZmFkZSk7CgogICAgICBjb25zdCBuID0gTWF0aC5taW4ocmlwcGxlcy5sZW5ndGgsIDEyKTsKICAgICAgY29uc3QgcnAgPSBuZXcgRmxvYXQzMkFycmF5KDI0KSwgcmwgPSBuZXcgRmxvYXQzMkFycmF5KDEyKSwgcnMgPSBuZXcgRmxvYXQzMkFycmF5KDEyKTsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBycFtpKjJdID0gcmlwcGxlc1tpXS54OwogICAgICAgIHJwW2kqMisxXSA9IDEgLSByaXBwbGVzW2ldLnk7CiAgICAgICAgcmxbaV0gPSByaXBwbGVzW2ldLmxpZmU7CiAgICAgICAgcnNbaV0gPSByaXBwbGVzW2ldLnN0cmVuZ3RoOwogICAgICB9CiAgICAgIGdsLnVuaWZvcm0yZnYodVJQb3MsIHJwKTsKICAgICAgZ2wudW5pZm9ybTFmdih1UkxpZmUsIHJsKTsKICAgICAgZ2wudW5pZm9ybTFmdih1UlN0ciwgcnMpOwogICAgICBnbC51bmlmb3JtMWkodVJDb3VudCwgbik7CgogICAgICBwb2ludGVyLmR4ICo9IDAuOTQ7IC8vIHNtb290aGVyIHZlbG9jaXR5IGRlY2F5CiAgICAgIHBvaW50ZXIuZHkgKj0gMC45NDsKCiAgICAgIGdsLmRyYXdBcnJheXMoZ2wuVFJJQU5HTEVfU1RSSVAsIDAsIDQpOwogICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUobG9vcCk7CiAgICB9KSgpOwoKICAgIC8vIEhpZGUgaGludCBvbiBmaXJzdCBpbnRlcmFjdGlvbgogICAgY29uc3QgaGludCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oaW50Jyk7CiAgICBsZXQgaGludGVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiBoaWRlSGludCgpIHsKICAgICAgaWYgKGhpbnRlZCkgcmV0dXJuOwogICAgICBoaW50ZWQgPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaGludC5zdHlsZS50cmFuc2l0aW9uID0gJ29wYWNpdHkgMS41cyc7IGhpbnQuc3R5bGUub3BhY2l0eSA9ICcwJzsgfSwgMTUwMCk7CiAgICB9CiAgICBhZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBoaWRlSGludCwgeyBvbmNlOiB0cnVlIH0pOwogICAgYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIGhpZGVIaW50LCB7IG9uY2U6IHRydWUgfSk7CgogICAgLy8g4pSA4pSAIFNjcm9sbCByZXZlYWwgZm9yIHZlbnR1cmUgY2FyZHMg4pSA4pSACiAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcigoZW50cmllcykgPT4gewogICAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5LCBpKSA9PiB7CiAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAvLyBTdGFnZ2VyIHRoZSByZXZlYWwKICAgICAgICAgIGNvbnN0IGRlbGF5ID0gZW50cnkudGFyZ2V0LmRhdGFzZXQuZGVsYXkgfHwgMDsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gZW50cnkudGFyZ2V0LmNsYXNzTGlzdC5hZGQoJ3Zpc2libGUnKSwgZGVsYXkpOwogICAgICAgICAgb2JzZXJ2ZXIudW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sIHsgdGhyZXNob2xkOiAwLjE1IH0pOwoKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXZlYWwnKS5mb3JFYWNoKChlbCwgaSkgPT4gewogICAgICBlbC5kYXRhc2V0LmRlbGF5ID0gaSAqIDgwOwogICAgICBvYnNlcnZlci5vYnNlcnZlKGVsKTsKICAgIH0pOwogIDwvc2NyaXB0Pgo8L2JvZHk+CjwvaHRtbD4K"}