{"id":29550,"date":"2026-04-23T13:00:12","date_gmt":"2026-04-23T11:00:12","guid":{"rendered":"https:\/\/www.amcon-eu.com\/herramienta-de-calibracion-de-sensores-oae-scout\/"},"modified":"2026-05-20T17:42:03","modified_gmt":"2026-05-20T15:42:03","slug":"herramienta-de-calibracion-de-sensores-oae-scout","status":"publish","type":"page","link":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/","title":{"rendered":"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT"},"content":{"rendered":"<section class=\"wpb-content-wrapper\"><p>[vc_section el_class=\u00bbborder-bottom\u00bb][vc_row el_class=\u00bbuk-container uk-padding-top\u00bb][vc_column][vc_custom_heading text=\u00bbHerramienta de calibraci\u00f3n de sensores OAE-SCOUT\u00bb font_container=\u00bbtag:h1|text_align:left\u00bb use_theme_fonts=\u00bbyes\u00bb el_class=\u00bbttl-h1&#8243;][vc_column_text el_class=\u00bbborder-bottom uk-padding-bottom uk-margin-medium-bottom\u00bb]<\/p>\n<p class=\"\">Esta herramienta requiere Google Chrome o Microsoft Edge y un sensor OAE-SCOUT conectado mediante USB.<\/p>\n<p>[\/vc_column_text][vc_column_text el_class=\u00bbborder-bottom uk-padding-bottom uk-margin-medium-bottom\u00bb]<\/p>\n<p style=\"text-align: center;\"><a class=\"uk-button uk-button-large uk-button-primary\" href=\"https:\/\/www.amcon-eu.com\/our-services\/warranty-and-after-sales-services\/\">  Descargar el Manual del Usuario de OAE-SCOUT  <i class=\"fa-solid fa-download\"><\/i><\/a><\/p>\n<p>[\/vc_column_text][vc_raw_html]PHN0eWxlPgoKICAgICAgICAvKiBGb290ZXIgcmVzZXQgKi8KICAgICAgICAuYW1jb24tdG9vbCBmb290ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgIH0KCi5hbWNvbi10b29sIHsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmOwogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBjb2xvcjogIzA4M2I0MTsKICAgICAgICB9CgogICAgICAgIC8qIEhlYWRlciAqLwogICAgICAgIC5hbWNvbi10b29sIGhlYWRlciB7CiAgICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMS41cmVtOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYzhmMGVlOyAvKiBBTUNPTiBhcXVhICovCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYTZkYmQ4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAuYW1jb24tbG9nbyB7CiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDUwcHg7IC8qIFByZXZlbnRzIHRoZSBoZWFkZXIgZnJvbSBnZXR0aW5nIGh1Z2UgKi8KICAgICAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgfQouYW1jb24tdG9vbCBoZWFkZXIgaDEgewogICAgICAgICAgICBmb250LXNpemU6IDEuNHJlbTsKICAgICAgICAgICAgY29sb3I6ICMwMDZjNjc7CiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLyogTWFpbiBsYXlvdXQgKi8KICAgICAgICAuYW1jb24tdG9vbCBtYWluIHsKICAgICAgICAgICAgbWF4LXdpZHRoOiAxMTYwcHg7CiAgICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICBwYWRkaW5nOiAxLjVyZW07CiAgICAgICAgfQoKICAgICAgICAvKiBTZWN0aW9ucyAqLwogICAgICAgIC5hbWNvbi10b29sIHNlY3Rpb24gewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbSAxLjI1cmVtOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTFlZmVmOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgICAgICB9Ci5hbWNvbi10b29sIHNlY3Rpb24gaDIgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgICAgICBmb250LXNpemU6IDEuMTVyZW07CiAgICAgICAgICAgIGNvbG9yOiAjMDA2YzY3OwogICAgICAgIH0KCiAgICAgICAgLyogU2Vuc29yIGNhcmRzICovCiAgICAgICAgLnNlbnNvci1ncmlkIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICAgICAgICAgIGdhcDogMXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zZW5zb3ItY2FyZCB7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZWFlYTsKICAgICAgICAgICAgcGFkZGluZzogMC43NXJlbTsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDAuNXJlbTsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBib3gtc2hhZG93IDAuMTVzOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnNlbnNvci1jYXJkLnNlbGVjdGVkIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjMDBhN2EwOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjFmZmZlOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggIzAwYTdhMCBpbnNldDsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zZW5zb3ItY2FyZDpob3ZlciB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzAwYTdhMDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICAgICAgfQoKICAgICAgICAvKiBTVEFUVVMgQkFSICovCiAgICAgICAgI3N0YXR1cy1iYXIgewogICAgICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDFyZW07CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsgLyogRW5zdXJlIGl0J3MgdmlzaWJsZSAqLwogICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnN0YXR1cy1pZGxlIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZTdlYjsKICAgICAgICAgICAgY29sb3I6ICMxZjI5Mzc7CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjOWNhM2FmOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnN0YXR1cy1jb25uZWN0aW5nIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiODJmNjsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXItYm90dG9tOiA0cHggc29saWQgIzFkNGVkODsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zdGF0dXMtc3VjY2VzcyB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMmM1NWU7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkICMxNTgwM2Q7CiAgICAgICAgfQouYW1jb24tdG9vbCAuc3RhdHVzLWVycm9yIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VmNDQ0NDsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXItYm90dG9tOiA0cHggc29saWQgI2I5MWMxYzsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zdGF0dXMtd2FybmluZyB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZWI7CiAgICAgICAgICAgIGNvbG9yOiAjOTI0MDBlOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmNkMzRkOwogICAgICAgIH0KCiAgICAgICAgLyogRmllbGRzZXRzICovCiAgICAgICAgZmllbGRzZXQgewogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjRyZW07CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmU4ZTc7CiAgICAgICAgICAgIHBhZGRpbmc6IDAuNzVyZW07CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmY2ZmZmY7CiAgICAgICAgfQouYW1jb24tdG9vbCBmaWVsZHNldCBsZWdlbmQgewogICAgICAgICAgICBwYWRkaW5nOiAwIDAuNHJlbTsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIGNvbG9yOiAjMDA2YzY3OwogICAgICAgIH0KCiAgICAgICAgLyogTGF5b3V0IGhlbHBlcnMgKi8KICAgICAgICAucm93IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAuY29sIHsKICAgICAgICAgICAgZmxleDogMSAxIDA7CiAgICAgICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgICAgfQouYW1jb24tdG9vbCAubXQtMDUgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAwLjVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubXQtMSB7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubWItMDUgewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAudGV4dC1zbSB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgICAgICBjb2xvcjogIzRiNmI2YTsKICAgICAgICB9Ci5hbWNvbi10b29sIC5mbGV4LWJldHdlZW4gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogMC43NXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIGlucHV0W3R5cGU9InRleHQiXSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBwYWRkaW5nOiAwLjM1cmVtIDAuNXJlbTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zNXJlbTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JjZGVkYzsKICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgICAgIGNvbG9yOiAjMDA0ZTRhOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIGlucHV0W3JlYWRvbmx5XSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmNGZhZmE7CiAgICAgICAgICAgIGNvbG9yOiAjN2FhOWE2OwogICAgICAgIH0KLmFtY29uLXRvb2wgbGFiZWwgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjRyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCBsYWJlbCBpbnB1dCB7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDAuMnJlbTsKICAgICAgICB9CgogICAgICAgIC8qIEJ1dHRvbnMgKi8KICAgICAgICBidXR0b24gewogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjM1cmVtOwogICAgICAgICAgICBwYWRkaW5nOiAwLjRyZW0gMC43cmVtOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMDBhN2EwOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDkyOGI7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQouYW1jb24tdG9vbCBidXR0b246aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMDA4ZTg4OwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uLnNlY29uZGFyeSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBjb2xvcjogIzAwNmM2NzsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwYTdhMDsKICAgICAgICB9Ci5hbWNvbi10b29sIGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTZmZWZjOwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uLmRhbmdlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNkOTQyNDI7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2IzMzAzMDsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIH0KCiAgICAgICAgLyogVGFibGUgKi8KICAgICAgICB0YWJsZSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIHRoLCAuYW1jb24tdG9vbCB0ZCB7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMmU5ZTk7CiAgICAgICAgICAgIHBhZGRpbmc6IDAuMzVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCB0aCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlZWZhZmE7CiAgICAgICAgICAgIGNvbG9yOiAjMDA1ZTU4OwogICAgICAgIH0KLmFtY29uLXRvb2wgLnZhbC1nb29kIHsKICAgICAgICAgICAgY29sb3I6ICMxNmEzNGE7IC8qIEdyZWVuICovCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgfQouYW1jb24tdG9vbCAudmFsLWJhZCB7CiAgICAgICAgICAgIGNvbG9yOiAjZGMyNjI2OyAvKiBSZWQgKi8KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICB9Ci5hbWNvbi10b29sIC52YWwtb2sgewogICAgICAgICAgICBjb2xvcjogI2Q5NzcwNjsgLyogT3JhbmdlIC0gZm9yICJva2F5IiBidXQgbm90IHBlcmZlY3QgKi8KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICB9CgogICAgICAgIC8qIEZhY3RvcnkgUmVzZXQgYnV0dG9uICovCiAgICAgICAgYnV0dG9uLnNlY29uZGFyeS5kYW5nZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgICAgICBjb2xvcjogI2RjMjYyNjsgLyogUmVkIFRleHQgKi8KICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RjMjYyNjsKICAgICAgICB9Ci5hbWNvbi10b29sIGJ1dHRvbi5zZWNvbmRhcnkuZGFuZ2VyOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2RjMjYyNjsgLyogU29saWQgUmVkIG9uIEhvdmVyICovCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgLyogV2hpdGUgVGV4dCBvbiBIb3ZlciAqLwogICAgICAgICAgICBib3JkZXItY29sb3I6ICNiOTFjMWM7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgyMjAsIDM4LCAzOCwgMC4zKTsgLyogUmVkZGlzaCBzaGFkb3cgKi8KICAgICAgICB9CgogICAgICAgIC8qIC0tLSBNT0RBTCBTVFlMRVMgKE5ldykgLS0tICovCiAgICAgICAgLm1vZGFsLW92ZXJsYXkgewogICAgICAgICAgICBkaXNwbGF5OiBub25lOyAvKiBIaWRkZW4gYnkgZGVmYXVsdCAqLwogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjc1KTsgLyogRGFyayBiYWNrZ3JvdW5kIHRvIGJsb2NrIHZpZXcgKi8KICAgICAgICAgICAgei1pbmRleDogOTk5OTsgLyogT24gdG9wIG9mIGV2ZXJ5dGhpbmcgKi8KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOyAvKiBCbHVyIHRoZSBiYWNrZ3JvdW5kIGZvciBmb2N1cyAqLwogICAgICAgIH0KLmFtY29uLXRvb2wgLm1vZGFsLWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBwYWRkaW5nOiAycmVtOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtOwogICAgICAgICAgICB3aWR0aDogOTAlOwogICAgICAgICAgICBtYXgtd2lkdGg6IDQ1MHB4OwogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMjBweCAyNXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgICBhbmltYXRpb246IHBvcEluIDAuM3MgZWFzZS1vdXQ7CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtaWNvbiB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogNHJlbTsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtYm94IGgyIHsKICAgICAgICAgICAgY29sb3I6ICMwNjVmNDY7IC8qIFN1Y2Nlc3MgR3JlZW4gKi8KICAgICAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjhyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtaW5zdHJ1Y3Rpb24gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmViOyAvKiBXYXJuaW5nIFllbGxvdyBiYWNrZ3JvdW5kICovCiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNmNTllMGI7IC8qIFdhcm5pbmcgT3JhbmdlIGJvcmRlciAqLwogICAgICAgICAgICBjb2xvcjogIzkyNDAwZTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMC41cmVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIH0KLmFtY29uLXRvb2wgI2J0bi1tb2RhbC1jbG9zZSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBmb250LXNpemU6IDEuMnJlbTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbTsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwYTdhMDsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgcG9wSW4gewogICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG8gewogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKPC9zdHlsZT4KCjxkaXYgY2xhc3M9ImFtY29uLXRvb2wiPgo8bWFpbj4KICAgIDxkaXYgaWQ9InN0YXR1cy1iYXIiIGNsYXNzPSJzdGF0dXMtYmFyIHN0YXR1cy1pZGxlIj5BIGxhIGVzcGVyYSBkZSBsYSBzZWxlY2Npw7NuIGRlbCBzZW5zb3IuLi48L2Rpdj4KICAgIDwhLS0gU0VDVElPTjogU2Vuc29yIHNlbGVjdGlvbiAtLT4KICAgIDxzZWN0aW9uIGlkPSJzZW5zb3Itc2VsZWN0LXNlY3Rpb24iPgogICAgICAgIDxoMj4xLiBFbGlnZSBlbCB0aXBvIGRlIHNlbnNvcjwvaDI+CiAgICAgICAgPHAgY2xhc3M9InRleHQtc20gbWItMDUiPgogIFNlbGVjY2lvbmEgdHUgdGlwbyBkZSBzZW5zb3IuIChJbmRpY2FkbyBlbiBsYSBwbGFjYSBkZSBpZGVudGlmaWNhY2nDs24gZGVsIHNlbnNvcik8YnIvPiBDb25lY3RhIGVsIHNlbnNvciBhIHR1IGRpc3Bvc2l0aXZvIGVuY2h1ZmFuZG8gZWwgY2FibGUgY29udmVyc29yIE1vZGJ1cy1VU0IgYSBsYSBzYWxpZGEKIGRlIGxhIGNhamEgZGUgY29udHJvbCBkZWwgc2Vuc29yLiAKICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0ic2Vuc29yLWdyaWQiIGlkPSJzZW5zb3ItZ3JpZCI+CiAgICAgICAgICAgIDwhLS0gU2Vuc29yIGNhcmRzIHJlbmRlcmVkIGJ5IEpTIC0tPgogICAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDwhLS0gU0VDVElPTjogQ29ubmVjdGlvbiAtLT4KICAgIDxzZWN0aW9uIGlkPSJjb25uZWN0aW9uLXNlY3Rpb24iPgogICAgICAgIDxoMj4yLiBDb25lY3RhciBhbCBzZW5zb3I8L2gyPgogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD5BanVzdGVzIGRlIHNlcmllPC9sZWdlbmQ+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5WZWxvY2lkYWQgZW4gYmF1ZGlvcyAocG9yIGRlZmVjdG86IDk2MDApCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJiYXVkLXJhdGUiIHZhbHVlPSI5NjAwIj4KICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EaXJlY2Npw7NuIGRlbCBlc2NsYXZvIChwb3IgZGVmZWN0bzogNzMpCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJzbGF2ZS1hZGRyZXNzIiB2YWx1ZT0iNzMiPgogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTA1Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1jb25uZWN0Ij5Db25lY3RhciB2w61hIFdlYlNlcmlhbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWRpc2Nvbm5lY3QiIGNsYXNzPSJzZWNvbmRhcnkiIGRpc2FibGVkPSJkaXNhYmxlZCI+RGVzY29uZWN0YXI8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgPGRpdiBjbGFzcz0icm93IG10LTEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+SW5mb3JtYWNpw7NuIGRlbCBzZW5zb3I8L2xlZ2VuZD4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TsO6bWVybyBkZSBzZXJpZQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImluZm8tc2VyaWFsIiByZWFkb25seT0icmVhZG9ubHkiLz4KIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkZpcm13YXJlCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1maXJtd2FyZSIgcmVhZG9ubHk9InJlYWRvbmx5Ii8+CiA8L2xhYmVsPiAKICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+Q2FsaWJyYWNpw7NuIGFjdHVhbDwvbGVnZW5kPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5GYWN0b3IgZGUgZXNjYWxhCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1zY2FsaW5nIiByZWFkb25seT0icmVhZG9ubHkiLz4KIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRlc3BsYXphbWllbnRvCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1vZmZzZXQiIHJlYWRvbmx5PSJyZWFkb25seSIvPgogPC9sYWJlbD4gCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvc2VjdGlvbj4KCiAgICA8IS0tIFNFQ1RJT046IENhbGlicmF0aW9uIC0tPgogICAgPHNlY3Rpb24gaWQ9ImNhbGlicmF0aW9uLXNlY3Rpb24iPgogICAgICAgIDxoMj4zLiBDYWxpYnJhY2nDs248L2gyPgogICAgICAgIDxwIGNsYXNzPSJ0ZXh0LXNtIj4KICBBw7FhZGUgcHVudG9zIGRlIGRhdG9zIGVuIGxvcyBxdWUgYXNpZ25lcyBsYSBzYWxpZGEgYnJ1dGEgeSBubyBjYWxpYnJhZGEgZGVsIHNlbnNvciBhIHVuIHZhbG9yIGRlIHJlZmVyZW5jaWEgY29ub2NpZG8uCiAgKE3DrW5pbW8gMyBwdW50b3MgZGUgZGF0b3MsIHJlY29tZW5kYWRvIDUtNTAuKQogICAgICAgIDwvcD4KCiAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1iZXR3ZWVuIG1iLTA1Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPlB1bnRvcyBkZSBkYXRvczwvc3Bhbj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1hZGQtcm93IiBjbGFzcz0ic2Vjb25kYXJ5Ij4rIEHDsWFkaXIgcHVudG8gZGUgZGF0b3M8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1jbGVhci1yb3dzIiBjbGFzcz0ic2Vjb25kYXJ5Ij5Cb3JyYXIgdG9kbzwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRhYmxlIGlkPSJjYWxpYi10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPiM8L3RoPgogICAgICAgICAgICAgICAgPHRoPlNhbGlkYSBkZWwgc2Vuc29yIHNpbiBjYWxpYnJhcjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+VmFsb3IgZGUgcmVmZXJlbmNpYSBjb25vY2lkbzwvdGg+CiAgICAgICAgICAgICAgICA8dGg+PC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5IGlkPSJjYWxpYi10Ym9keSI+CiAgICAgICAgICAgIDwhLS0gcm93cyBhZGRlZCBieSBKUyAtLT4KICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICA8L3RhYmxlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWJldHdlZW4gbXQtMSI+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMC43NXJlbTsgbWluLXdpZHRoOiAyODBweDsiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWNhbGMiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPlBhc28gMTogQ2FsY3VsYXIgbGEgQ2FsaWJyYWNpw7NuPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tYXBwbHkiIGNsYXNzPSJzZWNvbmRhcnkiIGRpc2FibGVkPSJkaXNhYmxlZCIgc3R5bGU9IndpZHRoOiAxMDAlOyI+UGFzbyAyOiBFc2NyaWJpciBsYSBudWV2YSBjYWxpYnJhY2nDs24KIDwvYnV0dG9uPiAKCiAgICAgICAgICAgICAgICA8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBib3JkZXI6IDA7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZDJlOWU5OyBtYXJnaW46IDAuMjVyZW0gMDsiPgoKICAgICAgICAgICAgICAgIDxkZXRhaWxzIHN0eWxlPSJ3aWR0aDogMTAwJTsgYmFja2dyb3VuZDogI2ZjZmZmZjsgYm9yZGVyOiAxcHggc29saWQgI2NmZThlNzsgYm9yZGVyLXJhZGl1czogMC4zNXJlbTsgcGFkZGluZzogMC41cmVtOyI+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnkgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICMwMDZjNjc7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogIEFqdXN0ZXMgYXZhbnphZG9zCiAgICAgICAgICAgICAgICAgICAgPC9zdW1tYXJ5PgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDAuNzVyZW07IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMC41cmVtOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1yZXNldCIgY2xhc3M9InNlY29uZGFyeSBkYW5nZXIiIHN0eWxlPSJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyI+CiAgUmVhanVzdGUgZGUgZXNjYWxhIHkgZGVzcGxhemFtaWVudG8gKEVzY2FsYSAxLDAgLyBEZXNwbGF6YW1pZW50byAwLDApCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kZXRhaWxzPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iY2FsYy1yZXN1bHRzIiBzdHlsZT0ibWFyZ2luLXRvcDogMXJlbTsgcGFkZGluZzogMXJlbTsgYmFja2dyb3VuZDogI2Y5ZmFmYjsgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjsgYm9yZGVyLXJhZGl1czogMC41cmVtOyI+CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczpjZW50ZXI7IG1hcmdpbi1ib3R0b206IDAuNXJlbTsiPgogICAgICAgICAgICAgICAgICAgIDxoMyBzdHlsZT0ibWFyZ2luOjA7IGZvbnQtc2l6ZTogMXJlbTsgY29sb3I6IzExMTgyNzsiPlZpc3RhIHByZXZpYSBkZSBsYSBjYWxpYnJhY2nDs248L2gzPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1lbmFibGUtZWRpdCIgY2xhc3M9InNlY29uZGFyeSIgc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggOHB4OyI+CiAgRWRpY2nDs24gbWFudWFsCiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyOyBnYXA6IDE1cHg7IG1hcmdpbi1ib3R0b206IDFyZW07Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW46IDAgMCA1cHggMDsgY29sb3I6ICM0YjU1NjM7IGZvbnQtc2l6ZTogMC45cmVtOyI+Q2FsaWJyYWNpw7NuIGFjdHVhbDwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDhweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICM2YjcyODA7IG1hcmdpbi1ib3R0b206IDJweDsiPkVzY2FsYTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iY2FsaWItY3VycmVudC1zY2FsZSIgc3RlcD0iYW55IiBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsiIHBsYWNlaG9sZGVyPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogIzZiNzI4MDsgbWFyZ2luLWJvdHRvbTogMnB4OyI+RGVzcGxhemFtaWVudG88L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImNhbGliLWN1cnJlbnQtb2Zmc2V0IiBzdGVwPSJhbnkiIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyIgcGxhY2Vob2xkZXI9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItbGVmdDogMnB4IGRhc2hlZCAjY2JkNWUxOyBib3JkZXItcmlnaHQ6IDJweCBkYXNoZWQgI2NiZDVlMTsgcGFkZGluZzogMCAxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAwIDAgNXB4IDA7IGNvbG9yOiAjMWI2OGE3OyBmb250LXNpemU6IDAuOXJlbTsiPkRlbHRhIGNhbGN1bGFkbzwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDhweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICM2YjcyODA7IG1hcmdpbi1ib3R0b206IDJweDsiPkVzY2FsYSBEZWx0YTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNhbGMtZGVsdGEtc2NhbGUiIHJlYWRvbmx5IGRpc2FibGVkIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kOiAjZTJlOGYwOyIgdmFsdWU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5EZXNwbGF6YW1pZW50byBEZWx0YTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNhbGMtZGVsdGEtb2Zmc2V0IiByZWFkb25seSBkaXNhYmxlZCBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZDogI2UyZThmMDsiIHZhbHVlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMCAwIDVweCAwOyBjb2xvcjogIzA1OTY2OTsgZm9udC1zaXplOiAwLjlyZW07Ij5OdWV2YSBjYWxpYnJhY2nDs248L2g0PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiA4cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5OdWV2YSBlc2NhbGE8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImNhbGMtc2NhbGluZyIgc3RlcD0iYW55IiBkaXNhYmxlZCBwbGFjZWhvbGRlcj0iLSIgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzA1OTY2OTsgYmFja2dyb3VuZC1jb2xvcjogI2YzZjRmNjsiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5OdWV2byBkZXNwbGF6YW1pZW50bzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iY2FsYy1vZmZzZXQiIHN0ZXA9ImFueSIgZGlzYWJsZWQgcGxhY2Vob2xkZXI9Ii0iIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwNTk2Njk7IGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDAuOXJlbTsgY29sb3I6ICM2YjcyODA7Ij4KICBSZWdyZXNpw7NuIFLCsjogPHNwYW4gaWQ9ImNhbGMtcjIiIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyBjb2xvcjogIzM3NDE1MTsiPi0tPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDwhLS0gU0VDVElPTjogRXhwb3J0IC8gSW1wb3J0IC0tPgogICAgPHNlY3Rpb24gaWQ9ImV4cG9ydC1pbXBvcnQtc2VjdGlvbiI+CiAgICAgICAgPGgyPjQuIEV4cG9ydGFyIC8gSW1wb3J0YXIgY2FsaWJyYWNpw7NuPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LXNtIj4KICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuNXJlbTsiPgogIEd1YXJkYXIgbyBjYXJnYXIgcGVyZmlsZXMgZGUgY2FsaWJyYWNpw7NuIGNvbW8gSlNPTi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cCBzdHlsZT0iY29sb3I6ICM2NjY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbWFyZ2luLWJvdHRvbTogMXJlbTsiPgogIE5vdGE6IExvcyBhcmNoaXZvcyBzZSBub21icmFuIGF1dG9tw6F0aWNhbWVudGUgPHN0cm9uZz5BRV9wZXJmaWwgZGUgY2FsaWJyYWNpw7NuX1tTZXJpZV1fW0ZlY2hhXV9bSG9yYV0uanNvbjwvc3Ryb25nPgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibXQtMDUiPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0IiBjbGFzcz0ic2Vjb25kYXJ5Ij5FeHBvcnRhciBjYWxpYnJhY2nDs24gSlNPTjwvYnV0dG9uPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUtaW1wb3J0IiBhY2NlcHQ9Ii5qc29uIiBzdHlsZT0iZGlzcGxheTpub25lIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1pbXBvcnQiIGNsYXNzPSJzZWNvbmRhcnkiPkltcG9ydGFyIGNhbGlicmFjacOzbiBKU09OPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L3NlY3Rpb24+CiAgICA8ZGl2IGlkPSJtb2RhbC1vdmVybGF5IiBjbGFzcz0ibW9kYWwtb3ZlcmxheSI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm94Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaWNvbiI+4pyFPC9kaXY+CiAgICAgICAgICAgIDxoMj7CoUVzY3JpYmUgY29uIMOpeGl0byE8L2gyPgoKICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMS4xcmVtOyBjb2xvcjogIzM3NDE1MTsgbWFyZ2luLWJvdHRvbTogMS41cmVtOyI+CiAgTG9zIG51ZXZvcyB2YWxvcmVzIGRlIGNhbGlicmFjacOzbiBzZSBoYW4gZ3VhcmRhZG8gZW4gZWwgc2Vuc29yLgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1pbnN0cnVjdGlvbiI+CiAgICAgICAgICAgICAgICA8c3Ryb25nPkFDQ0nDk04gUkVRVUVSSURBPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDowLjVyZW07IG1hcmdpbi1ib3R0b206IDA7Ij4KICBEZWJlcyBwdWxzYXIgZWwgYm90w7NuIDx1PkRFU0NPTkVDVEFSPC91PiBlbiBsYSBhcHAgeS9vIDx1PlJFRlJFU0NBUjwvdT4gbGEgcMOhZ2luYSBwYXJhIHZlcmlmaWNhciBsb3MgbnVldm9zIGFqdXN0ZXMgZGUKLgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1tb2RhbC1jbG9zZSI+VmFsZSwgbG8gZW50aWVuZG88L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L21haW4+CjxzY3JpcHQ+CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDAuIEJhc2ljIHN0YXRlICYgaGVscGVycwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBidG5FbmFibGVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1lbmFibGUtZWRpdCIpOwogICAgY29uc3Qgc3RhdHVzQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1cy1iYXIiKTsKICAgIGNvbnN0IG1vZGFsT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb2RhbC1vdmVybGF5Iik7CiAgICBjb25zdCBidG5Nb2RhbENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1tb2RhbC1jbG9zZSIpOwogICAgYnRuTW9kYWxDbG9zZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICBtb2RhbE92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyhtZXNzYWdlLCBzdGF0ZSA9ICJpZGxlIikgewogICAgICAgIHN0YXR1c0Jhci5jbGFzc05hbWUgPSAic3RhdHVzLWJhciI7CiAgICAgICAgc3RhdHVzQmFyLmNsYXNzTGlzdC5hZGQoYHN0YXR1cy0ke3N0YXRlfWApOwogICAgICAgIHN0YXR1c0Jhci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykgewogICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTsKICAgICAgICB1cGRhdGVTdGF0dXMobXNnLCAiZXJyb3IiKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDEuIFNlbnNvciByZWdpc3RyeQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBTRU5TT1JfUkVHSVNUUlkgPSBbCiAgICAgICAgewogICAgICAgICAgICBpZDogImFtY29uLTEiLAogICAgICAgICAgICBuYW1lOiAiT0FFLVNDT1VUIENha2UgRHJ5bmVzcyBTZW5zb3IiLAogICAgICAgICAgICBkZXNjcmlwdGlvbjogIlNpbmdsZS1jaGFubmVsIEFNQ09OIE9FTSBzZW5zb3IgZm9yIENha2UgRHJ5bmVzcyBtZWFzdXJlbWVudCIsCiAgICAgICAgICAgIGltZ1NyYzogIiIsCiAgICAgICAgICAgIHJlZ2lzdGVyczogewogICAgICAgICAgICAgICAgLy8gRGVmaW5lcyB3aGVyZSB0byBzdGFydCByZWFkaW5nIGFuZCBob3cgbWFueSB0byByZWFkCiAgICAgICAgICAgICAgICBpbnB1dFN0YXJ0OiAwLAogICAgICAgICAgICAgICAgaW5wdXRDb3VudDogNSwgICAvLyBXYXMgaGFyZGNvZGVkIGFzIDUKCiAgICAgICAgICAgICAgICBob2xkaW5nU3RhcnQ6IDAsCiAgICAgICAgICAgICAgICBob2xkaW5nQ291bnQ6IDgsIC8vIFdhcyBoYXJkY29kZWQgYXMgOAoKICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljIGxvY2F0aW9ucyBvZiBkYXRhIHdpdGhpbiB0aG9zZSBibG9ja3MKICAgICAgICAgICAgICAgIC8vIEZvciBBbWNvbi0xLCB0aGVzZSBhcmUgYWJzb2x1dGUgYWRkcmVzc2VzLgogICAgICAgICAgICAgICAgc25JbmRleDogMywgICAgICAvLyBTZXJpYWwgTnVtYmVyIGlzIGF0IElucHV0IFJlZyAzCiAgICAgICAgICAgICAgICBmd0luZGV4OiA0LCAgICAgIC8vIEZpcm13YXJlIGlzIGF0IElucHV0IFJlZyA0CgogICAgICAgICAgICAgICAgY2FsaWJyYXRpb25TY2FsaW5nOiAwLCAvLyBTdGFydCBhZGRyZXNzIGZvciBzY2FsaW5nIHJlZ2lzdGVycwogICAgICAgICAgICAgICAgY2FsaWJyYXRpb25PZmZzZXQ6IDEgICAvLyBTdGFydCBhZGRyZXNzIGZvciBvZmZzZXQgcmVnaXN0ZXJzIChOb3QgdXNlZCBpbiBjdXJyZW50IGxvZ2ljLCBidXQgZ29vZCBmb3IgdGhlIGFkZCBuZXcgc2Vuc29yIGRvY3VtZW50KQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgXTsKICAgIGxldCBzZWxlY3RlZFNlbnNvciA9IG51bGw7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyAyLiBSZW5kZXIgc2Vuc29yIGNhcmRzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGNvbnN0IHNlbnNvckdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2Vuc29yLWdyaWQiKTsKICAgIGZ1bmN0aW9uIHJlbmRlclNlbnNvckNhcmRzKCkgewogICAgICAgIHNlbnNvckdyaWQuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgU0VOU09SX1JFR0lTVFJZLmZvckVhY2goc2Vuc29yID0+IHsKICAgICAgICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICBjYXJkLmNsYXNzTmFtZSA9ICJzZW5zb3ItY2FyZCI7CiAgICAgICAgICAgIGNhcmQuZGF0YXNldC5zZW5zb3JJZCA9IHNlbnNvci5pZDsKICAgICAgICAgICAgY2FyZC5pbm5lckhUTUwgPSBgCiAgICAgICAgPGgzPiR7c2Vuc29yLm5hbWV9PC9oMz4KICAgICAgICA8cD4ke3NlbnNvci5kZXNjcmlwdGlvbn08L3A+CiAgICAgIGA7CiAgICAgICAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc2Vuc29yLWNhcmQiKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpKTsKICAgICAgICAgICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICAgIHNlbGVjdGVkU2Vuc29yID0gc2Vuc29yOwogICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGBTZWxlY3RlZCBzZW5zb3I6ICR7c2Vuc29yLm5hbWV9YCwgImlkbGUiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNlbnNvckdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7CiAgICAgICAgfSk7CiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IHNlbnNvciBieSBkZWZhdWx0CiAgICAgICAgY29uc3QgZmlyc3RDYXJkID0gc2Vuc29yR3JpZC5xdWVyeVNlbGVjdG9yKCIuc2Vuc29yLWNhcmQiKTsKICAgICAgICBpZiAoZmlyc3RDYXJkKSBmaXJzdENhcmQuY2xpY2soKTsKICAgIH0KICAgIHJlbmRlclNlbnNvckNhcmRzKCk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyAzLiBNb2RidXMgLyBXZWJTZXJpYWwgaW50ZWdyYXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgY29uc3QgT0xQQVNfRklMVEVSID0gWwogICAgICAgIHt1c2JWZW5kb3JJZDogMTAyNywgdXNiUHJvZHVjdElkOiAyNDU3N30sICAvLyBGVERJIGNhYmxlIHByb2R1Y3QgSURzCiAgICAgICAge3VzYlZlbmRvcklkOiAxMDI3LCB1c2JQcm9kdWN0SWQ6IDI0NTk3fQogICAgXTsKCiAgICBjbGFzcyBNb2RidXMgewogICAgICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuZnJvbUVudHJpZXMoc2V0dGluZ3MpOwogICAgICAgICAgICAvLyBFeHRyYWN0IHNsYXZlIGFkZHJlc3MgKGFjY2VwdCAic2xhdmVfYWRkcmVzcyIgb3IgInNsYXZlQWRkcmVzcyIpCiAgICAgICAgICAgIHRoaXMuc2xhdmUgPSB0aGlzLnNldHRpbmdzLnNsYXZlX2FkZHJlc3MgfHwgdGhpcy5zZXR0aW5ncy5zbGF2ZUFkZHJlc3MgfHwgMTsKICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCA9IDEwMDA7CiAgICAgICAgICAgIHRoaXMucG9ydCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucmVhZGVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyOiBzcGxpdCAxNi1iaXQgdmFsdWUgaW50byBNU0IgYW5kIExTQgogICAgICAgICNtc2JBbmRMc2IodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIFsodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyOiBDUkMtMTYgKE1vZGJ1cykgY2FsY3VsYXRpb24KICAgICAgICAjY3JjMTYoYnl0ZXMpIHsKICAgICAgICAgICAgbGV0IGNyYyA9IDB4RkZGRjsKICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBieXRlcykgewogICAgICAgICAgICAgICAgY3JjIF49IGI7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ODsgaSsrKSB7IGNvbnN0IG9kZCA9IGNyYyAmIDB4MDE7IGNyYz4+PSAxOwogICAgICAgICAgICAgICAgICAgIGlmIChvZGQpIGNyYyBePSAweEEwMDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtjcmMgJiAweEZGLCAoY3JjID4+IDgpICYgMHhGRl07ICAvLyBbbG93LCBoaWdoXQogICAgICAgIH0KCiAgICAgICAgLy8gQnVpbGQgTW9kYnVzIGZyYW1lIGZvciBnaXZlbiBmdW5jdGlvbiBjb2RlLCBzdGFydCwgcXVhbnRpdHksIGFuZCBwYXlsb2FkIChmb3Igd3JpdGVzKQogICAgICAgICNmcmFtZShmYywgc3RhcnQsIHF0eSwgcGF5bG9hZCA9IFtdKSB7CiAgICAgICAgICAgIGxldCBmcmFtZSA9IFt0aGlzLnNsYXZlLCBmY107CiAgICAgICAgICAgIGNvbnN0IFttc2IxLCBsc2IxXSA9IHRoaXMuI21zYkFuZExzYihzdGFydCk7CiAgICAgICAgICAgIGNvbnN0IFttc2IyLCBsc2IyXSA9IHRoaXMuI21zYkFuZExzYihxdHkpOwogICAgICAgICAgICBmcmFtZS5wdXNoKG1zYjEsIGxzYjEsIG1zYjIsIGxzYjIpOwogICAgICAgICAgICBpZiAoZmMgPT09IDE2KSB7ICAvLyBXcml0ZSBtdWx0aXBsZSByZWdpc3RlcnMKICAgICAgICAgICAgICAgIGZyYW1lLnB1c2gocGF5bG9hZC5sZW5ndGggKiAyKTsKICAgICAgICAgICAgICAgIHBheWxvYWQuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IHRoaXMuI21zYkFuZExzYih2YWwpOwogICAgICAgICAgICAgICAgICAgIGZyYW1lLnB1c2goYSwgYik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBbY3JjTCwgY3JjSF0gPSB0aGlzLiNjcmMxNihmcmFtZSk7CiAgICAgICAgICAgIGZyYW1lLnB1c2goY3JjTCwgY3JjSCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShmcmFtZSk7CiAgICAgICAgfQoKICAgICAgICBhc3luYyBjb25uZWN0KHBvcnQpIHsKICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBwb3J0LndyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICAgICAgICB0aGlzLnJlYWRlciA9IHBvcnQucmVhZGFibGUuZ2V0UmVhZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gTG93LWxldmVsIGZyYW1lIHdyaXRlICsgcmVhZCAocmV0dXJucyBmdWxsIHJlc3BvbnNlIGJ5dGVzIG9yIG51bGwpCiAgICAgICAgYXN5bmMgd3JpdGVGcmFtZShmcmFtZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygiJWNXUklURSBGUkFNRSDihpIiLCAiY29sb3I6IzM4YmRmOCIsIGZyYW1lKTsKCiAgICAgICAgICAgIGlmICghdGhpcy53cml0ZXIgfHwgIXRoaXMucmVhZGVyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIk1vZGJ1cyB3cml0ZXIvcmVhZGVyIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDEpIFNlbmQgdGhlIHJlcXVlc3QKICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZXIud3JpdGUoZnJhbWUpOwoKICAgICAgICAgICAgLy8gMikgV2FpdCBhIGJpdCBzbyB0aGUgc2Vuc29yIGNhbiByZXNwb25kIGZ1bGx5CiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxNTAwKSk7CgogICAgICAgICAgICAvLyAzKSBTaW5nbGUgcmVhZCB3aXRoIHRpbWVvdXQKICAgICAgICAgICAgY29uc3QgcmVhZFByb21pc2UgPSB0aGlzLnJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcigiUmVhZGVyIHRpbWVvdXQiKSksIDYwMDAwKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHt2YWx1ZSwgZG9uZX0gPSBhd2FpdCBQcm9taXNlLnJhY2UoW3JlYWRQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pOwoKICAgICAgICAgICAgICAgIGlmIChkb25lIHx8ICF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiTm8gZGF0YSByZWNlaXZlZCBmcm9tIHNlbnNvciIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIlY1JFQUQgRlJBTUUg4oaQIiwgImNvbG9yOiM0YWRlODAiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7IC8vIFVpbnQ4QXJyYXkKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUmVhZCBlcnJvcjoiLCBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhc3luYyByZWFkSW5wdXRSZWdpc3RlcnMoc3RhcnQsIHF0eSkgewogICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lKDQsIHN0YXJ0LCBxdHkpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud3JpdGVGcmFtZShmcmFtZSk7CiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiBudWxsOwoKICAgICAgICAgICAgLy8gRXhwZWN0ZWQ6IGFkZHIoMSkgKyBmYygxKSArIGJ5dGVDb3VudCgxKSArIGRhdGEoMipxdHkpICsgQ1JDKDIpID0gMyArIDIqcXR5ICsgMgogICAgICAgICAgICBjb25zdCBleHBlY3RlZE1pbiA9IDMgKyBxdHkgKiAyOwogICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoIDxleHBlY3RlZE1pbikgeyBjb25zb2xlLndhcm4oIlNob3J0IEZDNCByZXNwb25zZToiLCByZXNwb25zZS5sZW5ndGgsICJieXRlcywgZXhwZWN0ZWQg4omlIiwgZXhwZWN0ZWRNaW4pOyByZXR1cm4gbnVsbDsgfSBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhyZXNwb25zZS5idWZmZXIpOyBsZXQgcmVzdWx0ID0ge307IGxldCBvZmZzZXQgPSAzOyAvLyBmaXJzdCBkYXRhIGJ5dGUgYWZ0ZXIgW2FkZHIsIGZjLCBieXRlQ291bnRdIGZvciAobGV0IGkgPSAwOyBpIDxxdHk7IGkrKykgeyByZXN1bHRbYHJlZ18ke3N0YXJ0ICsgaX1gXSA9IGR2LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTsgb2Zmc2V0ICs9IDI7IH0gcmV0dXJuIHJlc3VsdDsgfSBhc3luYyByZWFkUmVnaXN0ZXJzKHN0YXJ0LCBxdHkpIHsgY29uc3QgZnJhbWUgPSB0aGlzLiNmcmFtZSgzLCBzdGFydCwgcXR5KTsgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndyaXRlRnJhbWUoZnJhbWUpOyBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDsgY29uc3QgZXhwZWN0ZWRNaW4gPSAzICsgcXR5ICogMjsgaWYgKHJlc3BvbnNlLmxlbmd0aCA8ZXhwZWN0ZWRNaW4pIHsgY29uc29sZS53YXJuKCJTaG9ydCBGQzMgcmVzcG9uc2U6IiwgcmVzcG9uc2UubGVuZ3RoLCAiYnl0ZXMsIGV4cGVjdGVkIOKJpSIsIGV4cGVjdGVkTWluKTsgcmV0dXJuIG51bGw7IH0gY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcocmVzcG9uc2UuYnVmZmVyKTsgbGV0IHJlc3VsdCA9IHt9OyBsZXQgb2Zmc2V0ID0gMzsgZm9yIChsZXQgaSA9IDA7IGkgPHF0eTsgaSsrKSB7IHJlc3VsdFtgcmVnXyR7c3RhcnQgKyBpfWBdID0gZHYuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpOyBvZmZzZXQgKz0gMjsgfSByZXR1cm4gcmVzdWx0OyB9IGFzeW5jIHdyaXRlQ2FsaWJyYXRpb24oc3RhcnRSZWcsIHNjYWxpbmcsIG9mZnNldCkgeyBjb25zb2xlLmxvZygiV3JpdGluZyBDYWxpYnJhdGlvbi4uLiIpOyAvLyBVUEdSQURFRCBIZWxwZXIgZnVuY3Rpb246IEhhbmRsZXMgYm90aCBEZWNpbWFscyBBTkQgTWFzc2l2ZSBJbnRlZ2VycyBjb25zdCBlbmNvZGVNb2RidXNGbG9hdCA9ICh2YWwpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IDAgfHwgaXNOYU4odmFsKSkgcmV0dXJuIHttYWc6IDAsIHNpZ246IDAsIHBvc0V4cDogMCwgbmVnRXhwOiAwfTsKICAgICAgICAgICAgICAgIGNvbnN0IHNpZ24gPSB2YWwgPDAgPyAxIDogMDsgY29uc3QgYWJzVmFsID0gTWF0aC5hYnModmFsKTsgLy8gMS4gVHJ5IE5lZ2F0aXZlIEV4cG9uZW50IChEZWNpbWFscykgZm9yIChsZXQgZSA9IDY7IGU+PSAwOyBlLS0pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gTWF0aC5yb3VuZChhYnNWYWwgKiBNYXRoLnBvdygxMCwgZSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChtID4gMCAmJiBtIDw9IDY1NTM1KSByZXR1cm4ge21hZzogbSwgc2lnbjogc2lnbiwgcG9zRXhwOiAwLCBuZWdFeHA6IGV9OyB9IC8vIDIuIFRyeSBQb3NpdGl2ZSBFeHBvbmVudCAoTWFzc2l2ZSBOdW1iZXJzPiA2NTUzNSkKICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAxOyBwIDw9IDEwOyBwKyspIHsgY29uc3QgbSA9IE1hdGgucm91bmQoYWJzVmFsIC8gTWF0aC5wb3coMTAsIHApKTsgaWYgKG0+IDAgJiYgbSA8PSA2NTUzNSkgcmV0dXJuIHttYWc6IG0sIHNpZ246IHNpZ24sIHBvc0V4cDogcCwgbmVnRXhwOiAwfTsgfSAvLyBGYWxsYmFjayBzYWZldHkgaWYgKGFic1ZhbD4gNjU1MzUpIHJldHVybiB7bWFnOiA2NTUzNSwgc2lnbjogc2lnbiwgcG9zRXhwOiAwLCBuZWdFeHA6IDB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHttYWc6IDAsIHNpZ246IHNpZ24sIHBvc0V4cDogMCwgbmVnRXhwOiAwfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIDEgJiAyLiBEeW5hbWljYWxseSBlbmNvZGUgYm90aCB2YXJpYWJsZXMgc2FmZWx5IQogICAgICAgICAgICBjb25zdCBvID0gZW5jb2RlTW9kYnVzRmxvYXQob2Zmc2V0KTsKICAgICAgICAgICAgY29uc3QgcyA9IGVuY29kZU1vZGJ1c0Zsb2F0KHNjYWxpbmcpOwoKICAgICAgICAgICAgLy8gMy4gQ09OU1RSVUNUIFBBWUxPQUQKICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IFsKICAgICAgICAgICAgICAgIG8ubWFnLCBvLnNpZ24sIG8ucG9zRXhwLCBvLm5lZ0V4cCwgLy8gUmVncyAwLTM6IE9mZnNldAogICAgICAgICAgICAgICAgcy5tYWcsIHMuc2lnbiwgcy5wb3NFeHAsIHMubmVnRXhwICAvLyBSZWdzIDQtNzogU2NhbGluZwogICAgICAgICAgICBdOwoKICAgICAgICAgICAgLy8gNC4gQnVpbGQgRnJhbWUKICAgICAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLiNmcmFtZSgxNiwgc3RhcnRSZWcsIHBheWxvYWQubGVuZ3RoLCBwYXlsb2FkKTsKCiAgICAgICAgICAgIC8vIDUuIFNFTkQgQU5EIENPTlNVTUUgRUNITwogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud3JpdGVGcmFtZShmcmFtZSk7CgogICAgICAgICAgICByZXR1cm4gKHJlc3BvbnNlICE9PSBudWxsKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gR2xvYmFsIGhhbmRsZXMgZm9yIGN1cnJlbnQgTW9kYnVzIGNvbm5lY3Rpb24KICAgIGxldCBtb2RidXMgPSBudWxsOwogICAgbGV0IHBvcnQgPSBudWxsOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gMy5hIENvbm5lY3QgLyBEaXNjb25uZWN0CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb1NlbnNvcigpIHsKICAgICAgICBpZiAoIXNlbGVjdGVkU2Vuc29yKSB7CiAgICAgICAgICAgIHNob3dFcnJvcigiU2VsZWN0IGEgc2Vuc29yIGZpcnN0LiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVN0YXR1cygiUmVxdWVzdGluZyBzZXJpYWwgcG9ydOKApiIsICJjb25uZWN0aW5nIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcG9ydCA9IGF3YWl0IG5hdmlnYXRvci5zZXJpYWwucmVxdWVzdFBvcnQoe2ZpbHRlcnM6IE9MUEFTX0ZJTFRFUn0pOwogICAgICAgICAgICBjb25zdCBiYXVkID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhdWQtcmF0ZSIpLnZhbHVlKSB8fCA5NjAwOwogICAgICAgICAgICBjb25zdCBzbGF2ZUFkZHIgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2xhdmUtYWRkcmVzcyIpLnZhbHVlKSB8fCAxOwogICAgICAgICAgICBhd2FpdCBwb3J0Lm9wZW4oewogICAgICAgICAgICAgICAgYmF1ZFJhdGU6IGJhdWQsCiAgICAgICAgICAgICAgICBkYXRhQml0czogOCwKICAgICAgICAgICAgICAgIHN0b3BCaXRzOiAxLAogICAgICAgICAgICAgICAgcGFyaXR5OiAibm9uZSIsCiAgICAgICAgICAgICAgICBidWZmZXJTaXplOiAyNTUsCiAgICAgICAgICAgICAgICBmbG93Q29udHJvbDogIm5vbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtb2RidXMgPSBuZXcgTW9kYnVzKFtbInNsYXZlX2FkZHJlc3MiLCBzbGF2ZUFkZHJdXSk7CiAgICAgICAgICAgIGF3YWl0IG1vZGJ1cy5jb25uZWN0KHBvcnQpOwogICAgICAgICAgICAvLyBFbmFibGUvZGlzYWJsZSBVSSBidXR0b25zCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY29ubmVjdCIpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1kaXNjb25uZWN0IikuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUmVhZCBzZW5zb3IgaW5mb3JtYXRpb24gYW5kIGN1cnJlbnQgY2FsaWJyYXRpb24gYWZ0ZXIgY29ubmVjdGluZwogICAgICAgICAgICBhd2FpdCByZWFkU2Vuc29ySW5mb0FuZENhbGlicmF0aW9uKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzaG93RXJyb3IoIkNvbm5lY3Rpb24gZmFpbGVkOiAiICsgZS5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZGlzY29ubmVjdFNlbnNvcigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAobW9kYnVzPy5yZWFkZXIpIGF3YWl0IG1vZGJ1cy5yZWFkZXIucmVsZWFzZUxvY2soKTsKICAgICAgICAgICAgaWYgKG1vZGJ1cz8ud3JpdGVyKSBhd2FpdCBtb2RidXMud3JpdGVyLnJlbGVhc2VMb2NrKCk7CiAgICAgICAgICAgIGlmIChwb3J0KSBhd2FpdCBwb3J0LmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIkRpc2Nvbm5lY3QgZXJyb3I6IiwgZSk7CiAgICAgICAgfQogICAgICAgIHBvcnQgPSBudWxsOwogICAgICAgIG1vZGJ1cyA9IG51bGw7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1jb25uZWN0IikuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWRpc2Nvbm5lY3QiKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgdXBkYXRlU3RhdHVzKCJEaXNjb25uZWN0ZWQiLCAiaWRsZSIpOwogICAgfQoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY29ubmVjdCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY29ubmVjdFRvU2Vuc29yKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tZGlzY29ubmVjdCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZGlzY29ubmVjdFNlbnNvcik7CgogICAgLy8gTGlzdGVuIGZvciBoYXJkd2FyZSBkaXNjb25uZWN0IChlLmcuLCBVU0IgY2FibGUgdW5wbHVnZ2VkKQogICAgbmF2aWdhdG9yLnNlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJkaXNjb25uZWN0IiwgYXN5bmMgKCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGRpc2Nvbm5lY3RTZW5zb3IoKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBzaG93RXJyb3IoIlNlbnNvciBkaXNjb25uZWN0ZWQiKTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDMuYiBEZWJ1ZyBoZWxwZXJzIChhY2Nlc3NpYmxlIGZyb20gY29uc29sZSBmb3IgdGVzdGluZykKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgd2luZG93LmRlYnVnUGluZyA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiPT09IGRlYnVnUGluZzogRkM0IElOUFVUIFJFR0lTVEVSUyAw4oCTNSA9PT0iKTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtb2RidXMucmVhZElucHV0UmVnaXN0ZXJzKDAsIDUpOwogICAgICAgIGNvbnNvbGUubG9nKCJGQzQgcmVzdWx0OiIsIHJlcyk7CiAgICB9OwogICAgd2luZG93LmRlYnVnSW5wdXQgPSBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb2RidXMpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJNb2RidXMgbm90IGluaXRpYWxpemVkLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUubG9nKCI9PT0gZGVidWdJbnB1dDogcmVhZCBJTlBVVCBSRUdJU1RFUlMgKEZDNCkgMOKAkzUgPT09Iik7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbW9kYnVzLnJlYWRJbnB1dFJlZ2lzdGVycygwLCA1KTsKICAgICAgICBjb25zb2xlLmxvZygiRkM0IHJlc3VsdDoiLCByZXMpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDMuYyBSZWFkIHNlbnNvciBpbmZvIGFuZCBjYWxpYnJhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBhc3luYyBmdW5jdGlvbiByZWFkU2Vuc29ySW5mb0FuZENhbGlicmF0aW9uKCkgewogICAgICAgIGlmICghbW9kYnVzIHx8ICFzZWxlY3RlZFNlbnNvcikgcmV0dXJuOwoKICAgICAgICAvLyBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgcmVnaXN0cnkKICAgICAgICBjb25zdCByZWdDb25maWcgPSBzZWxlY3RlZFNlbnNvci5yZWdpc3RlcnM7CgogICAgICAgIC8vIC0tLSAxKSBSRUFEIElOUFVUIFJFR0lTVEVSUyAtLS0KICAgICAgICAvLyBVc2UgdGhlIGR5bmFtaWMgc3RhcnQgYW5kIGNvdW50IGZyb20gdGhlIHJlZ2lzdHJ5CiAgICAgICAgY29uc29sZS5sb2coYFJlYWRpbmcgJHtyZWdDb25maWcuaW5wdXRDb3VudH0gSW5wdXQgUmVnaXN0ZXJzIHN0YXJ0aW5nIGF0ICR7cmVnQ29uZmlnLmlucHV0U3RhcnR9Li4uYCk7CiAgICAgICAgY29uc3QgaW5wdXRzID0gYXdhaXQgbW9kYnVzLnJlYWRJbnB1dFJlZ2lzdGVycyhyZWdDb25maWcuaW5wdXRTdGFydCwgcmVnQ29uZmlnLmlucHV0Q291bnQpOwoKICAgICAgICBpZiAoIWlucHV0cykgewogICAgICAgICAgICBzaG93RXJyb3IoIkZhaWxlZCB0byByZWFkIGlucHV0IHJlZ2lzdGVycyAoU04vRlcpLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zb2xlLmxvZygiSU5QVVQgUkVHSVNURVJTOiIsIGlucHV0cyk7CgogICAgICAgIC8vIE1hcCB0aGUgcmVzdWx0IGtleXMgKGUuZy4sICJyZWdfMyIpIGJhc2VkIG9uIHRoZSByZWdpc3RyeSBkZWZpbml0aW9uCiAgICAgICAgY29uc3Qgc24gPSBpbnB1dHNbYHJlZ18ke3JlZ0NvbmZpZy5zbkluZGV4fWBdOwogICAgICAgIGNvbnN0IGZ3ID0gaW5wdXRzW2ByZWdfJHtyZWdDb25maWcuZndJbmRleH1gXTsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tc2VyaWFsIikudmFsdWUgPSBzbiA\/PyAiIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5mby1maXJtd2FyZSIpLnZhbHVlID0gZncgPz8gIiI7CgogICAgICAgIC8vIC0tLSAyKSBSRUFEIEhPTERJTkcgUkVHSVNURVJTIChDYWxpYnJhdGlvbikgLS0tCiAgICAgICAgLy8gVXNlIHRoZSBkeW5hbWljIHN0YXJ0IGFuZCBjb3VudCBmcm9tIHRoZSByZWdpc3RyeQogICAgICAgIGNvbnNvbGUubG9nKGBSZWFkaW5nICR7cmVnQ29uZmlnLmhvbGRpbmdDb3VudH0gSG9sZGluZyBSZWdpc3RlcnMgc3RhcnRpbmcgYXQgJHtyZWdDb25maWcuaG9sZGluZ1N0YXJ0fS4uLmApOwogICAgICAgIGNvbnN0IGNhbGliID0gYXdhaXQgbW9kYnVzLnJlYWRSZWdpc3RlcnMocmVnQ29uZmlnLmhvbGRpbmdTdGFydCwgcmVnQ29uZmlnLmhvbGRpbmdDb3VudCk7CgogICAgICAgIGlmICghY2FsaWIpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJGYWlsZWQgdG8gcmVhZCBjYWxpYnJhdGlvbiByZWdpc3RlcnMuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnNvbGUubG9nKCJIT0xESU5HIFJFR0lTVEVSUzoiLCBjYWxpYik7CgogICAgICAgIC8vIERldGVybWluZSByZWdpc3RlciBrZXlzIGJhc2VkIG9uIHN0YXJ0IGFkZHJlc3MKICAgICAgICAvLyBUaGUgcmVnaXN0ZXJzIGZvciBjYWxpYnJhdGlvbiBhcmUgc2VxdWVudGlhbDogTywgT1MsIE9QLCBPTiwgUywgU1MsIFNQLCBTTgogICAgICAgIGNvbnN0IHN0YXJ0ID0gcmVnQ29uZmlnLmhvbGRpbmdTdGFydDsKCiAgICAgICAgY29uc3QgTyA9IGNhbGliW2ByZWdfJHtzdGFydCArIDB9YF0gPz8gMDsgLy8gb2Zmc2V0IG1hZ25pdHVkZQogICAgICAgIGNvbnN0IE9TID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgMX1gXSA\/PyAwOyAvLyBvZmZzZXQgc2lnbgogICAgICAgIGNvbnN0IE9QID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgMn1gXSA\/PyAwOyAvLyBvZmZzZXQgcG9zIGV4cAogICAgICAgIGNvbnN0IE9OID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgM31gXSA\/PyAwOyAvLyBvZmZzZXQgbmVnIGV4cAoKICAgICAgICBjb25zdCBTID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgNH1gXSA\/PyAwOyAvLyBzY2FsaW5nIG1hZ25pdHVkZQogICAgICAgIGNvbnN0IFNTID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgNX1gXSA\/PyAwOyAvLyBzY2FsaW5nIHNpZ24KICAgICAgICBjb25zdCBTUCA9IGNhbGliW2ByZWdfJHtzdGFydCArIDZ9YF0gPz8gMDsgLy8gc2NhbGluZyBwb3MgZXhwCiAgICAgICAgY29uc3QgU04gPSBjYWxpYltgcmVnXyR7c3RhcnQgKyA3fWBdID8\/IDA7IC8vIHNjYWxpbmcgbmVnIGV4cAoKICAgICAgICAvLyBEZWNvZGUgU2NpZW50aWZpYyBOb3RhdGlvbiAoU2FtZSBsb2dpYykKICAgICAgICBjb25zdCBvZmZzZXRBYnMgPSBPICogTWF0aC5wb3coMTAsIE9QKSAqIE1hdGgucG93KDEwLCAtT04pOwogICAgICAgIGNvbnN0IHNjYWxpbmdBYnMgPSBTICogTWF0aC5wb3coMTAsIFNQKSAqIE1hdGgucG93KDEwLCAtU04pOwogICAgICAgIGNvbnN0IG9mZnNldFZhbCA9IChPUyA9PT0gMSA\/IC1vZmZzZXRBYnMgOiBvZmZzZXRBYnMpOwogICAgICAgIGNvbnN0IHNjYWxpbmdWYWwgPSAoU1MgPT09IDEgPyAtc2NhbGluZ0FicyA6IHNjYWxpbmdBYnMpOwoKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5mby1zY2FsaW5nIikudmFsdWUgPSBzY2FsaW5nVmFsLnRvRml4ZWQoNik7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tb2Zmc2V0IikudmFsdWUgPSBvZmZzZXRWYWwudG9GaXhlZCg2KTsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLWN1cnJlbnQtc2NhbGUiKS52YWx1ZSA9IHNjYWxpbmdWYWwudG9GaXhlZCg2KTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsaWItY3VycmVudC1vZmZzZXQiKS52YWx1ZSA9IG9mZnNldFZhbC50b0ZpeGVkKDYpOwoKICAgICAgICB1cGRhdGVTdGF0dXMoIlNlbnNvciBpbmZvIGFuZCBjYWxpYnJhdGlvbiByZWFkIHN1Y2Nlc3NmdWxseSIsICJzdWNjZXNzIik7CiAgICB9CgogICAgLy8gV3JpdGUgbmV3IGNhbGlicmF0aW9uIHZhbHVlcyB0byBzZW5zb3IgKHZpYSBNb2RidXMgRkMxNikKICAgIGFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FsaWJyYXRpb25Ub1NlbnNvcihzY2FsaW5nLCBvZmZzZXQpIHsKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgY29ubmVjdGVkIHRvIGEgc2Vuc29yLiIpOwogICAgICAgIH0KICAgICAgICB1cGRhdGVTdGF0dXMoIldyaXRpbmcgY2FsaWJyYXRpb27igKYiLCAicmVhZGluZyIpOwogICAgICAgIGNvbnN0IHN0YXJ0UmVnID0gc2VsZWN0ZWRTZW5zb3IucmVnaXN0ZXJzLmNhbGlicmF0aW9uU2NhbGluZyB8fCAwOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1vZGJ1cy53cml0ZUNhbGlicmF0aW9uKHN0YXJ0UmVnLCBzY2FsaW5nLCBvZmZzZXQpOwogICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2Vuc29yIHJlamVjdGVkIHRoZSB3cml0ZSBjb21tYW5kLiIpOwogICAgICAgIH0KICAgICAgICB1cGRhdGVTdGF0dXMoIkNhbGlicmF0aW9uIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IiwgInN1Y2Nlc3MiKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDQuIENhbGlicmF0aW9uIGRhdGEgcG9pbnRzIHRhYmxlICsgcmVncmVzc2lvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBjYWxpYlRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLXRib2R5Iik7CiAgICBjb25zdCBidG5BZGRSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWFkZC1yb3ciKTsKICAgIGNvbnN0IGJ0bkNsZWFyUm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY2xlYXItcm93cyIpOwogICAgY29uc3QgYnRuQ2FsYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY2FsYyIpOwogICAgY29uc3QgYnRuQXBwbHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWFwcGx5Iik7CiAgICBjb25zdCBidG5SZXNldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tcmVzZXQiKTsgLy8gTmV3IEJ1dHRvbgoKICAgIGNvbnN0IGNhbGNTY2FsaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsYy1zY2FsaW5nIik7CiAgICBjb25zdCBjYWxjT2Zmc2V0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsYy1vZmZzZXQiKTsKICAgIGNvbnN0IGNhbGNSMkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGMtcjIiKTsKCiAgICBsZXQgbGFzdENhbGMgPSBudWxsOyAgLy8geyBzY2FsaW5nLCBvZmZzZXQsIHIyIH0KCiAgICBidG5BZGRSb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBhZGRSb3coKSk7CiAgICBidG5DbGVhclJvd3MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbGVhclJvd3MpOwoKICAgIC8vIC0tLSBGRUFUVVJFIDE6IFNBTklUWSBDSEVDSyBCRUZPUkUgV1JJVEUgLS0tCgogICAgLy8gLS0tIFdSSVRFIEJVVFRPTiBMT0dJQyAtLS0KICAgIGJ0bkFwcGx5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgIC8vIDEuIFJlYWQgSW5wdXRzCiAgICAgICAgY29uc3Qgc2NhbGluZ0lucHV0ID0gcGFyc2VGbG9hdChjYWxjU2NhbGluZ0VsLnZhbHVlKTsKICAgICAgICBjb25zdCBvZmZzZXRJbnB1dCA9IHBhcnNlRmxvYXQoY2FsY09mZnNldEVsLnZhbHVlKTsKCiAgICAgICAgLy8gMi4gVmFsaWRhdGlvbgogICAgICAgIGlmIChpc05hTihzY2FsaW5nSW5wdXQpIHx8IGlzTmFOKG9mZnNldElucHV0KSkgewogICAgICAgICAgICBhbGVydCgiRXJyb3I6IFBsZWFzZSBlbnRlciB2YWxpZCBudW1iZXJzLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTYWZldHkgQ2hlY2tzLi4uCiAgICAgICAgaWYgKHNjYWxpbmdJbnB1dCA+IDEwMDAwMCB8fCBzY2FsaW5nSW5wdXQgPDAuMDAwMDEpIHsgaWYgKCFjb25maXJtKGBXYXJuaW5nOiBTY2FsaW5nIEZhY3RvciAke3NjYWxpbmdJbnB1dH0gaXMgdW51c3VhbC4gUHJvY2VlZD9gKSkgcmV0dXJuOyB9IGlmIChsYXN0Q2FsYyAmJiBsYXN0Q2FsYy5yMiAhPT0gbnVsbCAmJiBsYXN0Q2FsYy5yMiA8MC4zMCkgeyBpZiAoIWNvbmZpcm0oYFdBUk5JTkc6IExvdyBBY2N1cmFjeSAoUsKyID0gJHtsYXN0Q2FsYy5yMi50b0ZpeGVkKDQpfSkuIENvbnRpbnVlP2ApKSByZXR1cm47IH0gLy8gMy4gUGVyZm9ybSBXcml0ZSB1cGRhdGVTdGF0dXMoIldyaXRpbmcgY2FsaWJyYXRpb24uLi4iLCAiY29ubmVjdGluZyIpOyB0cnkgeyBhd2FpdCB3cml0ZUNhbGlicmF0aW9uVG9TZW5zb3Ioc2NhbGluZ0lucHV0LCBvZmZzZXRJbnB1dCk7IC8vIE5FVyBXQVk6IFNIT1cgUE9QVVAgbW9kYWxPdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAiZmxleCI7IC8vIEFsc28gdXBkYXRlIHN0YXR1cyBiYXIgYmVoaW5kIHRoZSBtb2RhbCBqdXN0IGluIGNhc2UgdXBkYXRlU3RhdHVzKCIgV3JpdGUgQ29tcGxldGUuIFdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QuIiwgInN1Y2Nlc3MiKTsgLy8gTG9jayBVSSBidG5BcHBseS5kaXNhYmxlZCA9IHRydWU7IGJ0bkFwcGx5LnN0eWxlLm9wYWNpdHkgPSAiMC41IjsgfSBjYXRjaCAoZXJyKSB7IHVwZGF0ZVN0YXR1cygiV3JpdGUgZmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UsICJlcnJvciIpOyBhbGVydCgiV3JpdGUgRmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UpOyAvLyBVc2UgYWxlcnQgZm9yIGVycm9yIHNvIHRoZXkgc2VlIGl0IH0gfSk7IC8vIC0tLSBGRUFUVVJFIDI6IEZBQ1RPUlkgUkVTRVQgQlVUVE9OIC0tLSBidG5SZXNldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJQbGVhc2UgY29ubmVjdCB0byBhIHNlbnNvciBmaXJzdC4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgY29uZmlybVJlc2V0ID0gY29uZmlybSgKICAgICAgICAgICAgIkZBQ1RPUlkgUkVTRVQgV0FSTklOR1xuXG4iICsKICAgICAgICAgICAgIlRoaXMgd2lsbCBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgY2FsaWJyYXRpb24gd2l0aCBkZWZhdWx0IHZhbHVlczpcbiIgKwogICAgICAgICAgICAiU2NhbGluZzogMS4wXG5PZmZzZXQ6IDAuMFxuXG4iICsKICAgICAgICAgICAgIlRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIFByb2NlZWQ\/IgogICAgICAgICk7CgogICAgICAgIGlmIChjb25maXJtUmVzZXQpIHsKICAgICAgICAgICAgYXdhaXQgd3JpdGVDYWxpYnJhdGlvblRvU2Vuc29yKDEuMCwgMC4wKTsKICAgICAgICAgICAgdXBkYXRlU3RhdHVzKCJGYWN0b3J5IERlZmF1bHRzIFJlc3RvcmVkIChTY2FsZTogMS4wLCBPZmZzZXQ6IDAuMCkiLCAic3VjY2VzcyIpOwogICAgICAgICAgICAvLyBDbGVhciBVSSB0byByZWZsZWN0IHRoZSByZXNldAogICAgICAgICAgICBjbGVhclJvd3MoKTsKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC50ZXh0Q29udGVudCA9ICIxLjAwMDAwMCI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC50ZXh0Q29udGVudCA9ICIwLjAwMDAwMCI7CiAgICAgICAgICAgIGNhbGNSMkVsLnRleHRDb250ZW50ID0gIihEZWZhdWx0KSI7CiAgICAgICAgICAgIGxhc3RDYWxjID0ge3NjYWxpbmc6IDEuMCwgb2Zmc2V0OiAwLjAsIHIyOiAxLjB9OwogICAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGFkZFJvdyhyYXcgPSAiIiwga25vd24gPSAiIikgewogICAgICAgIGNvbnN0IHJvd0luZGV4ID0gY2FsaWJUYm9keS5jaGlsZHJlbi5sZW5ndGggKyAxOwogICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKICAgICAgICBjb25zdCB0ZEluZGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICB0ZEluZGV4LnRleHRDb250ZW50ID0gcm93SW5kZXg7CgogICAgICAgIGNvbnN0IHRkUmF3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICBjb25zdCBpbnB1dFJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgaW5wdXRSYXcudHlwZSA9ICJudW1iZXIiOwogICAgICAgIGlucHV0UmF3LnN0ZXAgPSAiYW55IjsKICAgICAgICBpbnB1dFJhdy52YWx1ZSA9IHJhdzsKICAgICAgICBpbnB1dFJhdy5wbGFjZWhvbGRlciA9ICJlLmcuIDQuMCI7IC8vIEhpbnQKICAgICAgICB0ZFJhdy5hcHBlbmRDaGlsZChpbnB1dFJhdyk7CgogICAgICAgIGNvbnN0IHRkS25vd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwogICAgICAgIGNvbnN0IGlucHV0S25vd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgIGlucHV0S25vd24udHlwZSA9ICJudW1iZXIiOwogICAgICAgIGlucHV0S25vd24uc3RlcCA9ICJhbnkiOwogICAgICAgIGlucHV0S25vd24udmFsdWUgPSBrbm93bjsKICAgICAgICBpbnB1dEtub3duLnBsYWNlaG9sZGVyID0gImUuZy4gMTAwIjsgLy8gSGludAogICAgICAgIHRkS25vd24uYXBwZW5kQ2hpbGQoaW5wdXRLbm93bik7CgogICAgICAgIGNvbnN0IHRkQWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICBjb25zdCBidG5EZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgICBidG5EZWwudGV4dENvbnRlbnQgPSAi4pyVIjsKICAgICAgICBidG5EZWwuY2xhc3NOYW1lID0gInNlY29uZGFyeSBkYW5nZXIiOwogICAgICAgIGJ0bkRlbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgdHIucmVtb3ZlKCk7CiAgICAgICAgICAgIHJlbnVtYmVyUm93cygpOwogICAgICAgIH0pOwogICAgICAgIHRkQWN0aW9uLmFwcGVuZENoaWxkKGJ0bkRlbCk7CgogICAgICAgIHRyLmFwcGVuZENoaWxkKHRkSW5kZXgpOwogICAgICAgIHRyLmFwcGVuZENoaWxkKHRkUmF3KTsKICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZEtub3duKTsKICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZEFjdGlvbik7CiAgICAgICAgY2FsaWJUYm9keS5hcHBlbmRDaGlsZCh0cik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVudW1iZXJSb3dzKCkgewogICAgICAgIFsuLi5jYWxpYlRib2R5LmNoaWxkcmVuXS5mb3JFYWNoKCh0ciwgaWR4KSA9PiB7CiAgICAgICAgICAgIHRyLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgPSBpZHggKyAxOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyUm93cygpIHsKICAgICAgICBjYWxpYlRib2R5LmlubmVySFRNTCA9ICIiOwogICAgICAgIGxhc3RDYWxjID0gbnVsbDsKICAgICAgICBjYWxjU2NhbGluZ0VsLnRleHRDb250ZW50ID0gIuKAkyI7CiAgICAgICAgY2FsY09mZnNldEVsLnRleHRDb250ZW50ID0gIuKAkyI7CiAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSAi4oCTIjsKICAgICAgICBjYWxjUjJFbC5jbGFzc05hbWUgPSAiIjsgLy8gUmVzZXQgY29sb3JzCiAgICAgICAgYnRuQXBwbHkuZGlzYWJsZWQgPSB0cnVlOwogICAgfQoKICAgIC8vIFN0YXJ0IHdpdGggMyBlbXB0eSByb3dzIGJ5IGRlZmF1bHQKICAgIGZvciAobGV0IGkgPSAwOyBpIDwzOyBpKyspIGFkZFJvdygpOyAvLyAtLS0gRkVBVFVSRSAzOiBJTlBVVCBWQUxJREFUSU9OIC0tLSBmdW5jdGlvbiBjb2xsZWN0RGF0YXBvaW50cygpIHsgY29uc3QgcG9pbnRzID0gW107IGxldCBlcnJvckZvdW5kID0gZmFsc2U7IFsuLi5jYWxpYlRib2R5LmNoaWxkcmVuXS5mb3JFYWNoKHRyID0+IHsKICAgICAgICAgICAgY29uc3QgcmF3SW5wdXQgPSB0ci5jaGlsZHJlblsxXS5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICAgICAgICBjb25zdCBrbm93bklucHV0ID0gdHIuY2hpbGRyZW5bMl0ucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKCiAgICAgICAgICAgIGNvbnN0IHJhd1ZhbCA9IHBhcnNlRmxvYXQocmF3SW5wdXQudmFsdWUpOwogICAgICAgICAgICBjb25zdCBrbm93blZhbCA9IHBhcnNlRmxvYXQoa25vd25JbnB1dC52YWx1ZSk7CgogICAgICAgICAgICAvLyBSZXNldCBzdHlsZXMKICAgICAgICAgICAgcmF3SW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAiIjsKICAgICAgICAgICAga25vd25JbnB1dC5zdHlsZS5ib3JkZXJDb2xvciA9ICIiOwoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIEVtcHR5IFJvd3MgKElnbm9yZSBpZiBCT1RIIGFyZSBlbXB0eSkKICAgICAgICAgICAgaWYgKHJhd0lucHV0LnZhbHVlLnRyaW0oKSA9PT0gIiIgJiYga25vd25JbnB1dC52YWx1ZS50cmltKCkgPT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8vIFNraXAgZW1wdHkgcm93CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGZvciBQYXJ0aWFsIFJvd3MgKE9uZSBlbXB0eSwgb25lIGZ1bGwpCiAgICAgICAgICAgIGlmIChpc05hTihyYXdWYWwpIHx8IGlzTmFOKGtub3duVmFsKSkgewogICAgICAgICAgICAgICAgZXJyb3JGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocmF3VmFsKSkgcmF3SW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAicmVkIjsKICAgICAgICAgICAgICAgIGlmIChpc05hTihrbm93blZhbCkpIGtub3duSW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAicmVkIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHt4OiByYXdWYWwsIHk6IGtub3duVmFsfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKGVycm9yRm91bmQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0OiBTb21lIHJvd3MgYXJlIGluY29tcGxldGUuIFBsZWFzZSBmaWxsIGJvdGggdmFsdWVzIG9yIGRlbGV0ZSB0aGUgcm93LiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBvaW50czsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlTGluZWFyUmVncmVzc2lvbihwb2ludHMpIHsKICAgICAgICBjb25zdCBuID0gcG9pbnRzLmxlbmd0aDsKICAgICAgICBpZiAobiA8MykgeyB0aHJvdyBuZXcgRXJyb3IoIkF0IGxlYXN0IDMgdmFsaWQgZGF0YSBwb2ludHMgYXJlIHJlcXVpcmVkLiIpOyB9IGxldCBzdW1YID0gMCwgc3VtWSA9IDAsIHN1bVhZID0gMCwgc3VtWDIgPSAwOyBmb3IgKGNvbnN0IHAgb2YgcG9pbnRzKSB7IHN1bVggKz0gcC54OyBzdW1ZICs9IHAueTsgc3VtWFkgKz0gcC54ICogcC55OyBzdW1YMiArPSBwLnggKiBwLng7IH0gY29uc3QgbWVhblkgPSBzdW1ZIC8gbjsgY29uc3QgZGVub21pbmF0b3IgPSBuICogc3VtWDIgLSBzdW1YICogc3VtWDsgLy8gU2FmZXR5OiBQcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8gKGFsbCBYIHZhbHVlcyBhcmUgdGhlIHNhbWUpIGlmIChNYXRoLmFicyhkZW5vbWluYXRvcikgPDFlLTkpIHsgdGhyb3cgbmV3IEVycm9yKCJEYXRhIEVycm9yOiBBbGwgJ1NlbnNvciBPdXRwdXQnIHZhbHVlcyBhcmUgaWRlbnRpY2FsLiBDYW5ub3QgY2FsY3VsYXRlIHNsb3BlLiIpOyB9IGNvbnN0IHNsb3BlID0gKG4gKiBzdW1YWSAtIHN1bVggKiBzdW1ZKSAvIGRlbm9taW5hdG9yOyBjb25zdCBvZmZzZXQgPSAoc3VtWSAtIHNsb3BlICogc3VtWCkgLyBuOyAvLyBDb21wdXRlIFLCsiBsZXQgc3NUb3QgPSAwLCBzc1JlcyA9IDA7IGZvciAoY29uc3QgcCBvZiBwb2ludHMpIHsgY29uc3QgeUhhdCA9IHNsb3BlICogcC54ICsgb2Zmc2V0OyBzc1RvdCArPSAocC55IC0gbWVhblkpICoqIDI7IHNzUmVzICs9IChwLnkgLSB5SGF0KSAqKiAyOyB9IGNvbnN0IHIyID0gKHNzVG90ID09PSAwKSA\/IDEgOiAxIC0gc3NSZXMgLyBzc1RvdDsgcmV0dXJuIHtzbG9wZSwgb2Zmc2V0LCByMn07IH0gLy8gLS0tIENBTENVTEFURSBCVVRUT04gLS0tIGJ0bkNhbGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgLy8gU2FmZXR5IGNoZWNrIHRvIHByZXZlbnQgb2ZmbGluZSBjYWxjdWxhdGlvbnMKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgYWxlcnQoIkVycm9yOiBQbGVhc2UgY29ubmVjdCB0byBhIHNlbnNvciBiZWZvcmUgY2FsY3VsYXRpbmcuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gY29sbGVjdERhdGFwb2ludHMoKTsKCiAgICAgICAgICAgIC8vIDEuIENhbGN1bGF0ZSB0aGUgcmVncmVzc2lvbiAoVGhlIERFTFRBKSBiYXNlZCBvbiB0aGUgVUkgdGFibGUKICAgICAgICAgICAgY29uc3Qge3Nsb3BlLCBvZmZzZXQsIHIyfSA9IGNvbXB1dGVMaW5lYXJSZWdyZXNzaW9uKHBvaW50cyk7CgogICAgICAgICAgICAvLyAyLiBGZXRjaCB0aGUgQ1VSUkVOVCBjYWxpYnJhdGlvbiB0aGUgdXNlciBoYXMgZW50ZXJlZC9jb25maXJtZWQgaW4gdGhlIFVJCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLWN1cnJlbnQtc2NhbGUiKS52YWx1ZSkgfHwgMS4wOwogICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsaWItY3VycmVudC1vZmZzZXQiKS52YWx1ZSkgfHwgMC4wOwoKICAgICAgICAgICAgLy8gMy4gVEhFIE1BR0lDIE1BVEg6IE1lcmdlIHRoZSBjYWxjdWxhdGVkIGRlbHRhIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCiAgICAgICAgICAgIGNvbnN0IGZpbmFsU2NhbGUgPSBzbG9wZSAqIGN1cnJlbnRTY2FsZTsKICAgICAgICAgICAgY29uc3QgZmluYWxPZmZzZXQgPSAoc2xvcGUgKiBjdXJyZW50T2Zmc2V0KSArIG9mZnNldDsKCiAgICAgICAgICAgIGxhc3RDYWxjID0ge3NjYWxpbmc6IGZpbmFsU2NhbGUsIG9mZnNldDogZmluYWxPZmZzZXQsIHIyfTsKCiAgICAgICAgICAgIC8vIDQuIEZJTEwgSU5QVVRTIChEaXNwbGF5aW5nIGFsbCAzIHN0YXRlcykKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGMtZGVsdGEtc2NhbGUiKS52YWx1ZSA9IHNsb3BlLnRvRml4ZWQoNik7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYWxjLWRlbHRhLW9mZnNldCIpLnZhbHVlID0gb2Zmc2V0LnRvRml4ZWQoNik7CgogICAgICAgICAgICBjYWxjU2NhbGluZ0VsLnZhbHVlID0gZmluYWxTY2FsZS50b0ZpeGVkKDYpOwogICAgICAgICAgICBjYWxjT2Zmc2V0RWwudmFsdWUgPSBmaW5hbE9mZnNldC50b0ZpeGVkKDYpOwogICAgICAgICAgICBjYWxjUjJFbC50ZXh0Q29udGVudCA9IHIyLnRvRml4ZWQoNCk7CgogICAgICAgICAgICAvLyA1LiBMT0NLIE5FVyBJTlBVVFMgKFJlYWQtb25seSB1bmxlc3MgJ01hbnVhbCBFZGl0JyBpcyBjbGlja2VkKQogICAgICAgICAgICBjYWxjU2NhbGluZ0VsLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FsY09mZnNldEVsLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2YzZjRmNiI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2YzZjRmNiI7CgogICAgICAgICAgICAvLyA2LiBSMiBGZWVkYmFjawogICAgICAgICAgICBjYWxjUjJFbC5jbGFzc05hbWUgPSAiIjsKICAgICAgICAgICAgaWYgKHIyID49IDAuMykgewogICAgICAgICAgICAgICAgY2FsY1IyRWwuY2xhc3NMaXN0LmFkZCgidmFsLWdvb2QiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhgQ2FsaWJyYXRpb24gY2FsY3VsYXRlZDogQWNjZXB0YWJsZSBmaXQgKFLCsiA9ICR7cjIudG9GaXhlZCg0KX0pYCwgInN1Y2Nlc3MiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNhbGNSMkVsLmNsYXNzTGlzdC5hZGQoInZhbC1iYWQiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhgQ2FsaWJyYXRpb24gY2FsY3VsYXRlZDogTG93IGFjY3VyYWN5IChSwrIgPDAuMykuIENoZWNrIGRhdGEgcG9pbnRzLmAsICJlcnJvciIpOyB9IC8vIDcuIEVuYWJsZSBXcml0ZSBidG5BcHBseS5kaXNhYmxlZCA9IGZhbHNlOyBidG5BcHBseS5zdHlsZS5vcGFjaXR5ID0gIjEuMCI7IH0gY2F0Y2ggKGVycikgeyBzaG93RXJyb3IoZXJyLm1lc3NhZ2UpOyB9IH0pOyAvLyAtLS0gRkVBVFVSRTogTUFOVUFMIEVESVQgVE9HR0xFIC0tLSBidG5FbmFibGVFZGl0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgIC8vIDEuIEFzayBmb3IgcGVybWlzc2lvbiAoU2FmZXR5KQogICAgICAgIGNvbnN0IGNvbmZpcm1FZGl0ID0gY29uZmlybSgKICAgICAgICAgICAgIk1BTlVBTCBPVkVSUklERVxuXG4iICsKICAgICAgICAgICAgIkRvIHlvdSB3YW50IHRvIG1hbnVhbGx5IGVudGVyIFNjYWxpbmcgYW5kIE9mZnNldCB2YWx1ZXM\/XG4iICsKICAgICAgICAgICAgIlRoaXMgYnlwYXNzZXMgdGhlIGNhbGN1bGF0aW9uIHN0ZXAuIgogICAgICAgICk7CgogICAgICAgIGlmIChjb25maXJtRWRpdCkgewogICAgICAgICAgICAvLyAyLiBVbmxvY2sgdGhlIElucHV0cyBzbyB1c2VyIGNhbiB0eXBlCiAgICAgICAgICAgIGNhbGNTY2FsaW5nRWwuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgY2FsY09mZnNldEVsLmRpc2FibGVkID0gZmFsc2U7CgogICAgICAgICAgICAvLyBWaXN1YWwgZmVlZGJhY2sKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2ZmZmZmZiI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2ZmZmZmZiI7CiAgICAgICAgICAgIGNhbGNTY2FsaW5nRWwuZm9jdXMoKTsKCiAgICAgICAgICAgIC8vIDMuIElNUE9SVEFOVDogRW5hYmxlIHRoZSBXcml0ZSBidXR0b24gaW1tZWRpYXRlbHkKICAgICAgICAgICAgLy8gKEV2ZW4gaWYgbm8gY2FsY3VsYXRpb24gd2FzIGRvbmUpCiAgICAgICAgICAgIGJ0bkFwcGx5LmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGJ0bkFwcGx5LnN0eWxlLm9wYWNpdHkgPSAiMS4wIjsKCiAgICAgICAgICAgIC8vIDQuIFVwZGF0ZSBVSSB0byBzaG93IHdlIGFyZSBpbiBtYW51YWwgbW9kZQogICAgICAgICAgICBpZiAobGFzdENhbGMpIGxhc3RDYWxjLnIyID0gbnVsbDsgLy8gQ2xlYXIgb2xkIFIyIGlmIGl0IGV4aXN0ZWQKICAgICAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSAiTWFudWFsIElucHV0IjsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDUuIEV4cG9ydCAvIEltcG9ydCBjYWxpYnJhdGlvbiBKU09OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGNvbnN0IGJ0bkV4cG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tZXhwb3J0Iik7CiAgICBjb25zdCBidG5JbXBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWltcG9ydCIpOwogICAgY29uc3QgZmlsZUltcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaWxlLWltcG9ydCIpOwoKICAgIGJ0bkV4cG9ydC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwb2ludHMgPSBjb2xsZWN0RGF0YXBvaW50cygpOwoKICAgICAgICAgICAgLy8gR2F0aGVyIGRhdGEKICAgICAgICAgICAgY29uc3Qgc2VyaWFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tc2VyaWFsIikudmFsdWUgfHwgIlVua25vd25TZXJpYWwiOwogICAgICAgICAgICBjb25zdCBmaXJtd2FyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbmZvLWZpcm13YXJlIikudmFsdWUgfHwgbnVsbDsKCiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgICAgICAgICAgICBzZW5zb3JJZDogc2VsZWN0ZWRTZW5zb3IgPyBzZWxlY3RlZFNlbnNvci5pZCA6IG51bGwsCiAgICAgICAgICAgICAgICBzZXJpYWxOdW1iZXI6IHNlcmlhbCwKICAgICAgICAgICAgICAgIGZpcm13YXJlOiBmaXJtd2FyZSwKICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uOiBsYXN0Q2FsYyB8fCBudWxsLAogICAgICAgICAgICAgICAgZGF0YXBvaW50czogcG9pbnRzLAogICAgICAgICAgICAgICAgbWV0YTogewogICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICBhcHA6ICJBbWNvbkFwcCIsCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogIjEuMCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIEdlbmVyYXRlIFN0YW5kYXJkIEZpbGVuYW1lOiBBRV9jYWxpYnJhdGlvbiBwcm9maWxlX3NlcmlhbF95eW1tZGRfaGhtbQogICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICBjb25zdCB5eSA9IFN0cmluZyhub3cuZ2V0RnVsbFllYXIoKSkuc2xpY2UoLTIpOwogICAgICAgICAgICBjb25zdCBtbSA9IFN0cmluZyhub3cuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgICAgIGNvbnN0IGRkID0gU3RyaW5nKG5vdy5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgICAgIGNvbnN0IGhoID0gU3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgICAgICBjb25zdCBtaW4gPSBTdHJpbmcobm93LmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKTsKCiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGAke3l5fSR7bW19JHtkZH1fJHtoaH0ke21pbn1gOwogICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGBBRV9jYWxpYnJhdGlvbiBwcm9maWxlXyR7c2VyaWFsfV8ke3RpbWVzdGFtcH0uanNvbmA7CgogICAgICAgICAgICAvLyBUcmlnZ2VyIERvd25sb2FkCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMildLCB7dHlwZTogImFwcGxpY2F0aW9uL2pzb24ifSk7CiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKICAgICAgICAgICAgYS5jbGljaygpOwoKICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGBFeHBvcnRlZDogJHtmaWxlbmFtZX1gLCAic3VjY2VzcyIpOwoKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJFeHBvcnQgZmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0pOwogICAgYnRuSW1wb3J0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gZmlsZUltcG9ydC5jbGljaygpKTsKCgogICAgZmlsZUltcG9ydC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZSkgPT4gewogICAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTsKICAgICAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZWFkZXIucmVzdWx0KTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnNlbnNvcklkKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vuc29yID0gU0VOU09SX1JFR0lTVFJZLmZpbmQocyA9PiBzLmlkID09PSBkYXRhLnNlbnNvcklkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2Vuc29yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmQgPSBzZW5zb3JHcmlkLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNlbnNvci1pZD0iJHtzZW5zb3IuaWR9Il1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmQpIGNhcmQuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGVhclJvd3MoKTsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuZGF0YXBvaW50cykpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFwb2ludHMuZm9yRWFjaChwID0+IGFkZFJvdyhwLngsIHAueSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsaWJyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBsYXN0Q2FsYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZzogZGF0YS5jYWxpYnJhdGlvbi5zY2FsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGRhdGEuY2FsaWJyYXRpb24ub2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICByMjogZGF0YS5jYWxpYnJhdGlvbi5yMgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC50ZXh0Q29udGVudCA9IGRhdGEuY2FsaWJyYXRpb24uc2NhbGluZy50b0ZpeGVkKDYpOwogICAgICAgICAgICAgICAgICAgIGNhbGNPZmZzZXRFbC50ZXh0Q29udGVudCA9IGRhdGEuY2FsaWJyYXRpb24ub2Zmc2V0LnRvRml4ZWQoNik7CiAgICAgICAgICAgICAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSBkYXRhLmNhbGlicmF0aW9uLnIyLnRvRml4ZWQoNCk7CiAgICAgICAgICAgICAgICAgICAgYnRuQXBwbHkuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygiQ2FsaWJyYXRpb24gcHJvZmlsZSBpbXBvcnRlZCIsICJzdWNjZXNzIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCJFcnJvciByZWFkaW5nIEpTT046ICIgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpOwogICAgfSk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA2LiBEdW1teSBzZW5zb3IgZm9yIG9mZmxpbmUgZGVidWdnaW5nIChubyBoYXJkd2FyZSBuZWVkZWQpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICB3aW5kb3cuZW5hYmxlRHVtbXlTZW5zb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gbWFrZSBzdXJlIGEgc2Vuc29yIGlzIHNlbGVjdGVkCiAgICAgICAgc2VsZWN0ZWRTZW5zb3IgPSBTRU5TT1JfUkVHSVNUUllbMF07CgogICAgICAgIC8vIHNpbXBsZSBpbi1tZW1vcnkgInNlbnNvciIgc3RhdGUKICAgICAgICBjb25zdCBkdW1teSA9IHsKICAgICAgICAgICAgc2VyaWFsOiA1NDI0LAogICAgICAgICAgICBmaXJtd2FyZTogMjUwNiwKICAgICAgICAgICAgLy8gZGVmYXVsdCBvZmZzZXQ9MCwgc2NhbGluZz0wLjAwMDEgZW5jb2RlZCBsaWtlIGluIHRoZSBtYW51YWwKICAgICAgICAgICAgTzogMCwgT1M6IDAsIE9QOiAwLCBPTjogNCwKICAgICAgICAgICAgUzogMSwgU1M6IDAsIFNQOiAwLCBTTjogNAogICAgICAgIH07CgogICAgICAgIC8vIGZha2UgbW9kYnVzIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIHNhbWUgbWV0aG9kcwogICAgICAgIG1vZGJ1cyA9IHsKICAgICAgICAgICAgYXN5bmMgcmVhZElucHV0UmVnaXN0ZXJzKHN0YXJ0LCBxdHkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJbRFVNTVldIHJlYWRJbnB1dFJlZ2lzdGVycyIsIHtzdGFydCwgcXR5fSk7CiAgICAgICAgICAgICAgICAvLyBqdXN0IHJldHVybiBzb21ldGhpbmcgcGxhdXNpYmxlCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyAwfWBdOiAxMjM0LCAgICAgICAgICAvLyBtZWFzdXJlbWVudAogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyAxfWBdOiAyMDAwLCAgICAgICAgICAvLyB0ZW1wCiAgICAgICAgICAgICAgICAgICAgW2ByZWdfJHtzdGFydCArIDJ9YF06IDUwMCwgICAgICAgICAgIC8vIGh1bWlkaXR5CiAgICAgICAgICAgICAgICAgICAgW2ByZWdfJHtzdGFydCArIDN9YF06IGR1bW15LnNlcmlhbCwgIC8vIHNlcmlhbAogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyA0fWBdOiBkdW1teS5maXJtd2FyZSAvLyBmaXJtd2FyZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXN5bmMgcmVhZFJlZ2lzdGVycyhzdGFydCwgcXR5KSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiW0RVTU1ZXSByZWFkUmVnaXN0ZXJzIiwge3N0YXJ0LCBxdHl9KTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IHsKICAgICAgICAgICAgICAgICAgICAwOiBkdW1teS5PLAogICAgICAgICAgICAgICAgICAgIDE6IGR1bW15Lk9TLAogICAgICAgICAgICAgICAgICAgIDI6IGR1bW15Lk9QLAogICAgICAgICAgICAgICAgICAgIDM6IGR1bW15Lk9OLAogICAgICAgICAgICAgICAgICAgIDQ6IGR1bW15LlMsCiAgICAgICAgICAgICAgICAgICAgNTogZHVtbXkuU1MsCiAgICAgICAgICAgICAgICAgICAgNjogZHVtbXkuU1AsCiAgICAgICAgICAgICAgICAgICAgNzogZHVtbXkuU04KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDxxdHk7IGkrKykgeyBvdXRbYHJlZ18ke3N0YXJ0ICsgaX1gXSA9IG1hcFtzdGFydCArIGldID8\/IDA7IH0gcmV0dXJuIG91dDsgfSwgYXN5bmMgd3JpdGVDYWxpYnJhdGlvbihzdGFydFJlZywgc2NhbGluZywgb2Zmc2V0KSB7IGNvbnNvbGUubG9nKCJbRFVNTVldIHdyaXRlQ2FsaWJyYXRpb24iLCB7c3RhcnRSZWcsIHNjYWxpbmcsIG9mZnNldH0pOyBjb25zdCBERUNJTUFMUyA9IDQ7IGNvbnN0IE1BWF9VMTYgPSA2NTUzNTsgLy8gZW5jb2RlIG9mZnNldCBjb25zdCBvZmZzZXRTaWduID0gb2Zmc2V0IDwwID8gMSA6IDA7IGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7IGxldCBPID0gTWF0aC5yb3VuZChhYnNPZmZzZXQgKiBNYXRoLnBvdygxMCwgREVDSU1BTFMpKTsgaWYgKE8+IE1BWF9VMTYpIE8gPSBNQVhfVTE2OwogICAgICAgICAgICAgICAgY29uc3QgT1AgPSAwOwogICAgICAgICAgICAgICAgY29uc3QgT04gPSBERUNJTUFMUzsKCiAgICAgICAgICAgICAgICAvLyBlbmNvZGUgc2NhbGluZwogICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVTaWduID0gc2NhbGluZyA8MCA\/IDEgOiAwOyBjb25zdCBhYnNTY2FsZSA9IE1hdGguYWJzKHNjYWxpbmcpOyBsZXQgUyA9IE1hdGgucm91bmQoYWJzU2NhbGUgKiBNYXRoLnBvdygxMCwgREVDSU1BTFMpKTsgaWYgKFM+IE1BWF9VMTYpIFMgPSBNQVhfVTE2OwogICAgICAgICAgICAgICAgY29uc3QgU1AgPSAwOwogICAgICAgICAgICAgICAgY29uc3QgU04gPSBERUNJTUFMUzsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgInNlbnNvciIgbWVtb3J5CiAgICAgICAgICAgICAgICBkdW1teS5PID0gTzsKICAgICAgICAgICAgICAgIGR1bW15Lk9TID0gb2Zmc2V0U2lnbjsKICAgICAgICAgICAgICAgIGR1bW15Lk9QID0gT1A7CiAgICAgICAgICAgICAgICBkdW1teS5PTiA9IE9OOwogICAgICAgICAgICAgICAgZHVtbXkuUyA9IFM7CiAgICAgICAgICAgICAgICBkdW1teS5TUyA9IHNjYWxlU2lnbjsKICAgICAgICAgICAgICAgIGR1bW15LlNQID0gU1A7CiAgICAgICAgICAgICAgICBkdW1teS5TTiA9IFNOOwoKICAgICAgICAgICAgICAgIC8vIHJldHVybiBub24tbnVsbCAib2siIGZyYW1lCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzEsIDE2LCAwLCBzdGFydFJlZywgMCwgOCwgMTYsIDBdKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHVwZGF0ZVN0YXR1cygiRHVtbXkgc2Vuc29yIGVuYWJsZWQgKG5vIGhhcmR3YXJlKSIsICJzdWNjZXNzIik7CiAgICB9Owo8L3NjcmlwdD4KCjxmb290ZXI+CiAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDAuODVlbTsgY29sb3I6ICM4ODg7IG1hcmdpbi10b3A6IDFyZW07IHRleHQtYWxpZ246IHJpZ2h0OyBwYWRkaW5nOiAwLjVyZW0gMS41cmVtOyI+CiAgVmVyc2nDs246IDEuMi4wIHwgw5psdGltYSBhY3R1YWxpemFjacOzbjogTWFyem8gZGUgMjAyNgogICAgPC9kaXY+CjwvZm9vdGVyPgo8L2Rpdj4=[\/vc_raw_html][\/vc_column][\/vc_row][\/vc_section][vc_section disable_element=\u00bbyes\u00bb el_class=\u00bbborder-bottom uk-padding-large-top\u00bb][vc_row el_class=\u00bbuk-container uk-container-medium uk-margin-large\u00bb][vc_column][vc_custom_heading text=\u00bb-\u00bb font_container=\u00bbtag:h2|text_align:center\u00bb el_class=\u00bbttl-h2-center uk-margin-large\u00bb][vc_column_text el_class=\u00bbuk-margin-medium\u00bb]<\/p>\n<p style=\"text-align: center;\"><a class=\"uk-button uk-button-large uk-button-primary\" href=\"https:\/\/www.amcon-eu.com\/our-services\/warranty-and-after-sales-services\/\">  Descargar el Manual del usuario  <i class=\"fa-solid fa-download\"><\/i><\/a><\/p>\n<p>[\/vc_column_text][\/vc_column][\/vc_row][\/vc_section]<\/p>\n<\/section>","protected":false},"excerpt":{"rendered":"<p>[vc_section el_class=\u00bbborder-bottom\u00bb][vc_row el_class=\u00bbuk-container uk-padding-top\u00bb][vc_column][vc_custom_heading text=\u00bbHerramienta de calibraci\u00f3n de sensores OAE-SCOUT\u00bb font_container=\u00bbtag:h1|text_align:left\u00bb use_theme_fonts=\u00bbyes\u00bb el_class=\u00bbttl-h1&#8243;][vc_column_text el_class=\u00bbborder-bottom uk-padding-bottom uk-margin-medium-bottom\u00bb] Esta herramienta requiere Google Chrome o Microsoft Edge y un sensor OAE-SCOUT conectado mediante USB. [\/vc_column_text][vc_column_text el_class=\u00bbborder-bottom uk-padding-bottom uk-margin-medium-bottom\u00bb] Descargar el Manual del Usuario de OAE-SCOUT [\/vc_column_text][vc_raw_html]PHN0eWxlPgoKICAgICAgICAvKiBGb290ZXIgcmVzZXQgKi8KICAgICAgICAuYW1jb24tdG9vbCBmb290ZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICAgICAgcGFkZGluZzogMCAhaW1wb3J0YW50OwogICAgICAgIH0KCi5hbWNvbi10b29sIHsKICAgICAgICAgICAgZm9udC1mYW1pbHk6IHN5c3RlbS11aSwgLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAiU2Vnb2UgVUkiLCBzYW5zLXNlcmlmOwogICAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBjb2xvcjogIzA4M2I0MTsKICAgICAgICB9CgogICAgICAgIC8qIEhlYWRlciAqLwogICAgICAgIC5hbWNvbi10b29sIGhlYWRlciB7CiAgICAgICAgICAgIHBhZGRpbmc6IDFyZW0gMS41cmVtOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYzhmMGVlOyAvKiBBTUNPTiBhcXVhICovCiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYTZkYmQ4OwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAuYW1jb24tbG9nbyB7CiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDUwcHg7IC8qIFByZXZlbnRzIHRoZSBoZWFkZXIgZnJvbSBnZXR0aW5nIGh1Z2UgKi8KICAgICAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgfQouYW1jb24tdG9vbCBoZWFkZXIgaDEgewogICAgICAgICAgICBmb250LXNpemU6IDEuNHJlbTsKICAgICAgICAgICAgY29sb3I6ICMwMDZjNjc7CiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgICAgIH0KCiAgICAgICAgLyogTWFpbiBsYXlvdXQgKi8KICAgICAgICAuYW1jb24tdG9vbCBtYWluIHsKICAgICAgICAgICAgbWF4LXdpZHRoOiAxMTYwcHg7CiAgICAgICAgICAgIG1hcmdpbjogMCBhdXRvOwogICAgICAgICAgICBwYWRkaW5nOiAxLjVyZW07CiAgICAgICAgfQoKICAgICAgICAvKiBTZWN0aW9ucyAqLwogICAgICAgIC5hbWNvbi10b29sIHNlY3Rpb24gewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmZmZmY7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbSAxLjI1cmVtOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZTFlZmVmOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjA2KTsKICAgICAgICB9Ci5hbWNvbi10b29sIHNlY3Rpb24gaDIgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAwOwogICAgICAgICAgICBmb250LXNpemU6IDEuMTVyZW07CiAgICAgICAgICAgIGNvbG9yOiAjMDA2YzY3OwogICAgICAgIH0KCiAgICAgICAgLyogU2Vuc29yIGNhcmRzICovCiAgICAgICAgLnNlbnNvci1ncmlkIHsKICAgICAgICAgICAgZGlzcGxheTogZ3JpZDsKICAgICAgICAgICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMjBweCwgMWZyKSk7CiAgICAgICAgICAgIGdhcDogMXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zZW5zb3ItY2FyZCB7CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q4ZWFlYTsKICAgICAgICAgICAgcGFkZGluZzogMC43NXJlbTsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZmZmZjsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgICAgICBnYXA6IDAuNXJlbTsKICAgICAgICAgICAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMTVzLCBib3gtc2hhZG93IDAuMTVzOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnNlbnNvci1jYXJkLnNlbGVjdGVkIHsKICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiAjMDBhN2EwOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZjFmZmZlOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDAgMCAycHggIzAwYTdhMCBpbnNldDsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zZW5zb3ItY2FyZDpob3ZlciB7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogIzAwYTdhMDsKICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4wNSk7CiAgICAgICAgfQoKICAgICAgICAvKiBTVEFUVVMgQkFSICovCiAgICAgICAgI3N0YXR1cy1iYXIgewogICAgICAgICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICAgICAgICB0b3A6IDA7CiAgICAgICAgICAgIHotaW5kZXg6IDEwMDA7CiAgICAgICAgICAgIHBhZGRpbmc6IDFyZW07CiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAuNXJlbTsKICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgICAgICBib3gtc2hhZG93OiAwIDRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEpOwogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsgLyogRW5zdXJlIGl0J3MgdmlzaWJsZSAqLwogICAgICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuM3MgZWFzZSwgY29sb3IgMC4zcyBlYXNlOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnN0YXR1cy1pZGxlIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1ZTdlYjsKICAgICAgICAgICAgY29sb3I6ICMxZjI5Mzc7CiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDRweCBzb2xpZCAjOWNhM2FmOwogICAgICAgIH0KLmFtY29uLXRvb2wgLnN0YXR1cy1jb25uZWN0aW5nIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzNiODJmNjsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXItYm90dG9tOiA0cHggc29saWQgIzFkNGVkODsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zdGF0dXMtc3VjY2VzcyB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMyMmM1NWU7CiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICAgICAgYm9yZGVyLWJvdHRvbTogNHB4IHNvbGlkICMxNTgwM2Q7CiAgICAgICAgfQouYW1jb24tdG9vbCAuc3RhdHVzLWVycm9yIHsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2VmNDQ0NDsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgICAgICBib3JkZXItYm90dG9tOiA0cHggc29saWQgI2I5MWMxYzsKICAgICAgICB9Ci5hbWNvbi10b29sIC5zdGF0dXMtd2FybmluZyB7CiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZiZWI7CiAgICAgICAgICAgIGNvbG9yOiAjOTI0MDBlOwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZmNkMzRkOwogICAgICAgIH0KCiAgICAgICAgLyogRmllbGRzZXRzICovCiAgICAgICAgZmllbGRzZXQgewogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjRyZW07CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjZmU4ZTc7CiAgICAgICAgICAgIHBhZGRpbmc6IDAuNzVyZW07CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmY2ZmZmY7CiAgICAgICAgfQouYW1jb24tdG9vbCBmaWVsZHNldCBsZWdlbmQgewogICAgICAgICAgICBwYWRkaW5nOiAwIDAuNHJlbTsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjlyZW07CiAgICAgICAgICAgIGNvbG9yOiAjMDA2YzY3OwogICAgICAgIH0KCiAgICAgICAgLyogTGF5b3V0IGhlbHBlcnMgKi8KICAgICAgICAucm93IHsKICAgICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICAgICAgICBnYXA6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAuY29sIHsKICAgICAgICAgICAgZmxleDogMSAxIDA7CiAgICAgICAgICAgIG1pbi13aWR0aDogMjAwcHg7CiAgICAgICAgfQouYW1jb24tdG9vbCAubXQtMDUgewogICAgICAgICAgICBtYXJnaW4tdG9wOiAwLjVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubXQtMSB7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDFyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubWItMDUgewogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAudGV4dC1zbSB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogMC45cmVtOwogICAgICAgICAgICBjb2xvcjogIzRiNmI2YTsKICAgICAgICB9Ci5hbWNvbi10b29sIC5mbGV4LWJldHdlZW4gewogICAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGdhcDogMC43NXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIGlucHV0W3R5cGU9InRleHQiXSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgICBwYWRkaW5nOiAwLjM1cmVtIDAuNXJlbTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMC4zNXJlbTsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2JjZGVkYzsKICAgICAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgICAgIGNvbG9yOiAjMDA0ZTRhOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIGlucHV0W3JlYWRvbmx5XSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmNGZhZmE7CiAgICAgICAgICAgIGNvbG9yOiAjN2FhOWE2OwogICAgICAgIH0KLmFtY29uLXRvb2wgbGFiZWwgewogICAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgICAgZm9udC1zaXplOiAwLjg1cmVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjRyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCBsYWJlbCBpbnB1dCB7CiAgICAgICAgICAgIG1hcmdpbi10b3A6IDAuMnJlbTsKICAgICAgICB9CgogICAgICAgIC8qIEJ1dHRvbnMgKi8KICAgICAgICBidXR0b24gewogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjM1cmVtOwogICAgICAgICAgICBwYWRkaW5nOiAwLjRyZW0gMC43cmVtOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMDBhN2EwOwogICAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICMwMDkyOGI7CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgfQouYW1jb24tdG9vbCBidXR0b246aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjMDA4ZTg4OwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uLnNlY29uZGFyeSB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBjb2xvcjogIzAwNmM2NzsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgIzAwYTdhMDsKICAgICAgICB9Ci5hbWNvbi10b29sIGJ1dHRvbi5zZWNvbmRhcnk6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTZmZWZjOwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uLmRhbmdlciB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNkOTQyNDI7CiAgICAgICAgICAgIGJvcmRlci1jb2xvcjogI2IzMzAzMDsKICAgICAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIH0KLmFtY29uLXRvb2wgYnV0dG9uOmRpc2FibGVkIHsKICAgICAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgICAgICBjdXJzb3I6IG5vdC1hbGxvd2VkOwogICAgICAgIH0KCiAgICAgICAgLyogVGFibGUgKi8KICAgICAgICB0YWJsZSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgICAgICBmb250LXNpemU6IDAuOXJlbTsKICAgICAgICB9Ci5hbWNvbi10b29sIHRoLCAuYW1jb24tdG9vbCB0ZCB7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkMmU5ZTk7CiAgICAgICAgICAgIHBhZGRpbmc6IDAuMzVyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCB0aCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNlZWZhZmE7CiAgICAgICAgICAgIGNvbG9yOiAjMDA1ZTU4OwogICAgICAgIH0KLmFtY29uLXRvb2wgLnZhbC1nb29kIHsKICAgICAgICAgICAgY29sb3I6ICMxNmEzNGE7IC8qIEdyZWVuICovCiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgfQouYW1jb24tdG9vbCAudmFsLWJhZCB7CiAgICAgICAgICAgIGNvbG9yOiAjZGMyNjI2OyAvKiBSZWQgKi8KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICB9Ci5hbWNvbi10b29sIC52YWwtb2sgewogICAgICAgICAgICBjb2xvcjogI2Q5NzcwNjsgLyogT3JhbmdlIC0gZm9yICJva2F5IiBidXQgbm90IHBlcmZlY3QgKi8KICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICB9CgogICAgICAgIC8qIEZhY3RvcnkgUmVzZXQgYnV0dG9uICovCiAgICAgICAgYnV0dG9uLnNlY29uZGFyeS5kYW5nZXIgewogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgICAgICBjb2xvcjogI2RjMjYyNjsgLyogUmVkIFRleHQgKi8KICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RjMjYyNjsKICAgICAgICB9Ci5hbWNvbi10b29sIGJ1dHRvbi5zZWNvbmRhcnkuZGFuZ2VyOmhvdmVyOm5vdCg6ZGlzYWJsZWQpIHsKICAgICAgICAgICAgYmFja2dyb3VuZDogI2RjMjYyNjsgLyogU29saWQgUmVkIG9uIEhvdmVyICovCiAgICAgICAgICAgIGNvbG9yOiB3aGl0ZTsgLyogV2hpdGUgVGV4dCBvbiBIb3ZlciAqLwogICAgICAgICAgICBib3JkZXItY29sb3I6ICNiOTFjMWM7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDEycHggcmdiYSgyMjAsIDM4LCAzOCwgMC4zKTsgLyogUmVkZGlzaCBzaGFkb3cgKi8KICAgICAgICB9CgogICAgICAgIC8qIC0tLSBNT0RBTCBTVFlMRVMgKE5ldykgLS0tICovCiAgICAgICAgLm1vZGFsLW92ZXJsYXkgewogICAgICAgICAgICBkaXNwbGF5OiBub25lOyAvKiBIaWRkZW4gYnkgZGVmYXVsdCAqLwogICAgICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgICAgIHRvcDogMDsKICAgICAgICAgICAgbGVmdDogMDsKICAgICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjc1KTsgLyogRGFyayBiYWNrZ3JvdW5kIHRvIGJsb2NrIHZpZXcgKi8KICAgICAgICAgICAgei1pbmRleDogOTk5OTsgLyogT24gdG9wIG9mIGV2ZXJ5dGhpbmcgKi8KICAgICAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cigycHgpOyAvKiBCbHVyIHRoZSBiYWNrZ3JvdW5kIGZvciBmb2N1cyAqLwogICAgICAgIH0KLmFtY29uLXRvb2wgLm1vZGFsLWJveCB7CiAgICAgICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgICAgICBwYWRkaW5nOiAycmVtOwogICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwLjc1cmVtOwogICAgICAgICAgICB3aWR0aDogOTAlOwogICAgICAgICAgICBtYXgtd2lkdGg6IDQ1MHB4OwogICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICAgIGJveC1zaGFkb3c6IDAgMjBweCAyNXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgICAgICBhbmltYXRpb246IHBvcEluIDAuM3MgZWFzZS1vdXQ7CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtaWNvbiB7CiAgICAgICAgICAgIGZvbnQtc2l6ZTogNHJlbTsKICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogMXJlbTsKICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtYm94IGgyIHsKICAgICAgICAgICAgY29sb3I6ICMwNjVmNDY7IC8qIFN1Y2Nlc3MgR3JlZW4gKi8KICAgICAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICAgICAgZm9udC1zaXplOiAxLjhyZW07CiAgICAgICAgfQouYW1jb24tdG9vbCAubW9kYWwtaW5zdHJ1Y3Rpb24gewogICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmYmViOyAvKiBXYXJuaW5nIFllbGxvdyBiYWNrZ3JvdW5kICovCiAgICAgICAgICAgIGJvcmRlcjogMnB4IHNvbGlkICNmNTllMGI7IC8qIFdhcm5pbmcgT3JhbmdlIGJvcmRlciAqLwogICAgICAgICAgICBjb2xvcjogIzkyNDAwZTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbTsKICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMC41cmVtOwogICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxLjVyZW07CiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIH0KLmFtY29uLXRvb2wgI2J0bi1tb2RhbC1jbG9zZSB7CiAgICAgICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgICAgICBmb250LXNpemU6IDEuMnJlbTsKICAgICAgICAgICAgcGFkZGluZzogMXJlbTsKICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwYTdhMDsKICAgICAgICB9CgogICAgICAgIEBrZXlmcmFtZXMgcG9wSW4gewogICAgICAgICAgICBmcm9tIHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC44KTsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdG8gewogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKPC9zdHlsZT4KCjxkaXYgY2xhc3M9ImFtY29uLXRvb2wiPgo8bWFpbj4KICAgIDxkaXYgaWQ9InN0YXR1cy1iYXIiIGNsYXNzPSJzdGF0dXMtYmFyIHN0YXR1cy1pZGxlIj5BIGxhIGVzcGVyYSBkZSBsYSBzZWxlY2Npw7NuIGRlbCBzZW5zb3IuLi48L2Rpdj4KICAgIDwhLS0gU0VDVElPTjogU2Vuc29yIHNlbGVjdGlvbiAtLT4KICAgIDxzZWN0aW9uIGlkPSJzZW5zb3Itc2VsZWN0LXNlY3Rpb24iPgogICAgICAgIDxoMj4xLiBFbGlnZSBlbCB0aXBvIGRlIHNlbnNvcjwvaDI+CiAgICAgICAgPHAgY2xhc3M9InRleHQtc20gbWItMDUiPgogIFNlbGVjY2lvbmEgdHUgdGlwbyBkZSBzZW5zb3IuIChJbmRpY2FkbyBlbiBsYSBwbGFjYSBkZSBpZGVudGlmaWNhY2nDs24gZGVsIHNlbnNvcik8YnIvPiBDb25lY3RhIGVsIHNlbnNvciBhIHR1IGRpc3Bvc2l0aXZvIGVuY2h1ZmFuZG8gZWwgY2FibGUgY29udmVyc29yIE1vZGJ1cy1VU0IgYSBsYSBzYWxpZGEKIGRlIGxhIGNhamEgZGUgY29udHJvbCBkZWwgc2Vuc29yLiAKICAgICAgICA8L3A+CiAgICAgICAgPGRpdiBjbGFzcz0ic2Vuc29yLWdyaWQiIGlkPSJzZW5zb3ItZ3JpZCI+CiAgICAgICAgICAgIDwhLS0gU2Vuc29yIGNhcmRzIHJlbmRlcmVkIGJ5IEpTIC0tPgogICAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDwhLS0gU0VDVElPTjogQ29ubmVjdGlvbiAtLT4KICAgIDxzZWN0aW9uIGlkPSJjb25uZWN0aW9uLXNlY3Rpb24iPgogICAgICAgIDxoMj4yLiBDb25lY3RhciBhbCBzZW5zb3I8L2gyPgogICAgICAgIDxmaWVsZHNldD4KICAgICAgICAgICAgPGxlZ2VuZD5BanVzdGVzIGRlIHNlcmllPC9sZWdlbmQ+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5WZWxvY2lkYWQgZW4gYmF1ZGlvcyAocG9yIGRlZmVjdG86IDk2MDApCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJiYXVkLXJhdGUiIHZhbHVlPSI5NjAwIj4KICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EaXJlY2Npw7NuIGRlbCBlc2NsYXZvIChwb3IgZGVmZWN0bzogNzMpCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJudW1iZXIiIGlkPSJzbGF2ZS1hZGRyZXNzIiB2YWx1ZT0iNzMiPgogICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im10LTA1Ij4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1jb25uZWN0Ij5Db25lY3RhciB2w61hIFdlYlNlcmlhbDwvYnV0dG9uPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWRpc2Nvbm5lY3QiIGNsYXNzPSJzZWNvbmRhcnkiIGRpc2FibGVkPSJkaXNhYmxlZCI+RGVzY29uZWN0YXI8L2J1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9maWVsZHNldD4KCiAgICAgICAgPGRpdiBjbGFzcz0icm93IG10LTEiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+SW5mb3JtYWNpw7NuIGRlbCBzZW5zb3I8L2xlZ2VuZD4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+TsO6bWVybyBkZSBzZXJpZQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImluZm8tc2VyaWFsIiByZWFkb25seT0icmVhZG9ubHkiLz4KIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkZpcm13YXJlCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1maXJtd2FyZSIgcmVhZG9ubHk9InJlYWRvbmx5Ii8+CiA8L2xhYmVsPiAKICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2wiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0PgogICAgICAgICAgICAgICAgICAgIDxsZWdlbmQ+Q2FsaWJyYWNpw7NuIGFjdHVhbDwvbGVnZW5kPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD5GYWN0b3IgZGUgZXNjYWxhCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1zY2FsaW5nIiByZWFkb25seT0icmVhZG9ubHkiLz4KIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRlc3BsYXphbWllbnRvCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaW5mby1vZmZzZXQiIHJlYWRvbmx5PSJyZWFkb25seSIvPgogPC9sYWJlbD4gCiAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvc2VjdGlvbj4KCiAgICA8IS0tIFNFQ1RJT046IENhbGlicmF0aW9uIC0tPgogICAgPHNlY3Rpb24gaWQ9ImNhbGlicmF0aW9uLXNlY3Rpb24iPgogICAgICAgIDxoMj4zLiBDYWxpYnJhY2nDs248L2gyPgogICAgICAgIDxwIGNsYXNzPSJ0ZXh0LXNtIj4KICBBw7FhZGUgcHVudG9zIGRlIGRhdG9zIGVuIGxvcyBxdWUgYXNpZ25lcyBsYSBzYWxpZGEgYnJ1dGEgeSBubyBjYWxpYnJhZGEgZGVsIHNlbnNvciBhIHVuIHZhbG9yIGRlIHJlZmVyZW5jaWEgY29ub2NpZG8uCiAgKE3DrW5pbW8gMyBwdW50b3MgZGUgZGF0b3MsIHJlY29tZW5kYWRvIDUtNTAuKQogICAgICAgIDwvcD4KCiAgICAgICAgPGRpdiBjbGFzcz0iZmxleC1iZXR3ZWVuIG1iLTA1Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRleHQtc20iPlB1bnRvcyBkZSBkYXRvczwvc3Bhbj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1hZGQtcm93IiBjbGFzcz0ic2Vjb25kYXJ5Ij4rIEHDsWFkaXIgcHVudG8gZGUgZGF0b3M8L2J1dHRvbj4KICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1jbGVhci1yb3dzIiBjbGFzcz0ic2Vjb25kYXJ5Ij5Cb3JyYXIgdG9kbzwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRhYmxlIGlkPSJjYWxpYi10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPiM8L3RoPgogICAgICAgICAgICAgICAgPHRoPlNhbGlkYSBkZWwgc2Vuc29yIHNpbiBjYWxpYnJhcjwvdGg+CiAgICAgICAgICAgICAgICA8dGg+VmFsb3IgZGUgcmVmZXJlbmNpYSBjb25vY2lkbzwvdGg+CiAgICAgICAgICAgICAgICA8dGg+PC90aD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5IGlkPSJjYWxpYi10Ym9keSI+CiAgICAgICAgICAgIDwhLS0gcm93cyBhZGRlZCBieSBKUyAtLT4KICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICA8L3RhYmxlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbGV4LWJldHdlZW4gbXQtMSI+CiAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMC43NXJlbTsgbWluLXdpZHRoOiAyODBweDsiPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iYnRuLWNhbGMiIHN0eWxlPSJ3aWR0aDogMTAwJTsiPlBhc28gMTogQ2FsY3VsYXIgbGEgQ2FsaWJyYWNpw7NuPC9idXR0b24+CiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tYXBwbHkiIGNsYXNzPSJzZWNvbmRhcnkiIGRpc2FibGVkPSJkaXNhYmxlZCIgc3R5bGU9IndpZHRoOiAxMDAlOyI+UGFzbyAyOiBFc2NyaWJpciBsYSBudWV2YSBjYWxpYnJhY2nDs24KIDwvYnV0dG9uPiAKCiAgICAgICAgICAgICAgICA8aHIgc3R5bGU9IndpZHRoOiAxMDAlOyBib3JkZXI6IDA7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZDJlOWU5OyBtYXJnaW46IDAuMjVyZW0gMDsiPgoKICAgICAgICAgICAgICAgIDxkZXRhaWxzIHN0eWxlPSJ3aWR0aDogMTAwJTsgYmFja2dyb3VuZDogI2ZjZmZmZjsgYm9yZGVyOiAxcHggc29saWQgI2NmZThlNzsgYm9yZGVyLXJhZGl1czogMC4zNXJlbTsgcGFkZGluZzogMC41cmVtOyI+CiAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnkgc3R5bGU9ImN1cnNvcjogcG9pbnRlcjsgY29sb3I6ICMwMDZjNjc7IGZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtYWxpZ246IGNlbnRlcjsiPgogIEFqdXN0ZXMgYXZhbnphZG9zCiAgICAgICAgICAgICAgICAgICAgPC9zdW1tYXJ5PgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6IDAuNzVyZW07IGRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogMC41cmVtOyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1yZXNldCIgY2xhc3M9InNlY29uZGFyeSBkYW5nZXIiIHN0eWxlPSJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyI+CiAgUmVhanVzdGUgZGUgZXNjYWxhIHkgZGVzcGxhemFtaWVudG8gKEVzY2FsYSAxLDAgLyBEZXNwbGF6YW1pZW50byAwLDApCiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kZXRhaWxzPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iY2FsYy1yZXN1bHRzIiBzdHlsZT0ibWFyZ2luLXRvcDogMXJlbTsgcGFkZGluZzogMXJlbTsgYmFja2dyb3VuZDogI2Y5ZmFmYjsgYm9yZGVyOiAxcHggc29saWQgI2U1ZTdlYjsgYm9yZGVyLXJhZGl1czogMC41cmVtOyI+CiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmZsZXg7IGp1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczpjZW50ZXI7IG1hcmdpbi1ib3R0b206IDAuNXJlbTsiPgogICAgICAgICAgICAgICAgICAgIDxoMyBzdHlsZT0ibWFyZ2luOjA7IGZvbnQtc2l6ZTogMXJlbTsgY29sb3I6IzExMTgyNzsiPlZpc3RhIHByZXZpYSBkZSBsYSBjYWxpYnJhY2nDs248L2gzPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1lbmFibGUtZWRpdCIgY2xhc3M9InNlY29uZGFyeSIgc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggOHB4OyI+CiAgRWRpY2nDs24gbWFudWFsCiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnIgMWZyOyBnYXA6IDE1cHg7IG1hcmdpbi1ib3R0b206IDFyZW07Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW46IDAgMCA1cHggMDsgY29sb3I6ICM0YjU1NjM7IGZvbnQtc2l6ZTogMC45cmVtOyI+Q2FsaWJyYWNpw7NuIGFjdHVhbDwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDhweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICM2YjcyODA7IG1hcmdpbi1ib3R0b206IDJweDsiPkVzY2FsYTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iY2FsaWItY3VycmVudC1zY2FsZSIgc3RlcD0iYW55IiBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsiIHBsYWNlaG9sZGVyPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgc3R5bGU9ImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogIzZiNzI4MDsgbWFyZ2luLWJvdHRvbTogMnB4OyI+RGVzcGxhemFtaWVudG88L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImNhbGliLWN1cnJlbnQtb2Zmc2V0IiBzdGVwPSJhbnkiIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyIgcGxhY2Vob2xkZXI9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0idGV4dC1hbGlnbjogY2VudGVyOyBib3JkZXItbGVmdDogMnB4IGRhc2hlZCAjY2JkNWUxOyBib3JkZXItcmlnaHQ6IDJweCBkYXNoZWQgI2NiZDVlMTsgcGFkZGluZzogMCAxNXB4OyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBzdHlsZT0ibWFyZ2luOiAwIDAgNXB4IDA7IGNvbG9yOiAjMWI2OGE3OyBmb250LXNpemU6IDAuOXJlbTsiPkRlbHRhIGNhbGN1bGFkbzwvaDQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi1ib3R0b206IDhweDsiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPSJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICM2YjcyODA7IG1hcmdpbi1ib3R0b206IDJweDsiPkVzY2FsYSBEZWx0YTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNhbGMtZGVsdGEtc2NhbGUiIHJlYWRvbmx5IGRpc2FibGVkIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBiYWNrZ3JvdW5kOiAjZTJlOGYwOyIgdmFsdWU9Ii0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5EZXNwbGF6YW1pZW50byBEZWx0YTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImNhbGMtZGVsdGEtb2Zmc2V0IiByZWFkb25seSBkaXNhYmxlZCBzdHlsZT0id2lkdGg6IDEwMCU7IHRleHQtYWxpZ246IGNlbnRlcjsgYmFja2dyb3VuZDogI2UyZThmMDsiIHZhbHVlPSItIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9InRleHQtYWxpZ246IGNlbnRlcjsiPgogICAgICAgICAgICAgICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbjogMCAwIDVweCAwOyBjb2xvcjogIzA1OTY2OTsgZm9udC1zaXplOiAwLjlyZW07Ij5OdWV2YSBjYWxpYnJhY2nDs248L2g0PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJtYXJnaW4tYm90dG9tOiA4cHg7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5OdWV2YSBlc2NhbGE8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImNhbGMtc2NhbGluZyIgc3RlcD0iYW55IiBkaXNhYmxlZCBwbGFjZWhvbGRlcj0iLSIgc3R5bGU9IndpZHRoOiAxMDAlOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzA1OTY2OTsgYmFja2dyb3VuZC1jb2xvcjogI2YzZjRmNjsiPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT0iZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiAjNmI3MjgwOyBtYXJnaW4tYm90dG9tOiAycHg7Ij5OdWV2byBkZXNwbGF6YW1pZW50bzwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ibnVtYmVyIiBpZD0iY2FsYy1vZmZzZXQiIHN0ZXA9ImFueSIgZGlzYWJsZWQgcGxhY2Vob2xkZXI9Ii0iIHN0eWxlPSJ3aWR0aDogMTAwJTsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwNTk2Njk7IGJhY2tncm91bmQtY29sb3I6ICNmM2Y0ZjY7Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDAuOXJlbTsgY29sb3I6ICM2YjcyODA7Ij4KICBSZWdyZXNpw7NuIFLCsjogPHNwYW4gaWQ9ImNhbGMtcjIiIHN0eWxlPSJmb250LXdlaWdodDpib2xkOyBjb2xvcjogIzM3NDE1MTsiPi0tPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9zZWN0aW9uPgoKICAgIDwhLS0gU0VDVElPTjogRXhwb3J0IC8gSW1wb3J0IC0tPgogICAgPHNlY3Rpb24gaWQ9ImV4cG9ydC1pbXBvcnQtc2VjdGlvbiI+CiAgICAgICAgPGgyPjQuIEV4cG9ydGFyIC8gSW1wb3J0YXIgY2FsaWJyYWNpw7NuPC9oMj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0ZXh0LXNtIj4KICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbi1ib3R0b206IDAuNXJlbTsiPgogIEd1YXJkYXIgbyBjYXJnYXIgcGVyZmlsZXMgZGUgY2FsaWJyYWNpw7NuIGNvbW8gSlNPTi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cCBzdHlsZT0iY29sb3I6ICM2NjY7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbWFyZ2luLWJvdHRvbTogMXJlbTsiPgogIE5vdGE6IExvcyBhcmNoaXZvcyBzZSBub21icmFuIGF1dG9tw6F0aWNhbWVudGUgPHN0cm9uZz5BRV9wZXJmaWwgZGUgY2FsaWJyYWNpw7NuX1tTZXJpZV1fW0ZlY2hhXV9bSG9yYV0uanNvbjwvc3Ryb25nPgogICAgICAgICAgICA8L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ibXQtMDUiPgogICAgICAgICAgICA8YnV0dG9uIGlkPSJidG4tZXhwb3J0IiBjbGFzcz0ic2Vjb25kYXJ5Ij5FeHBvcnRhciBjYWxpYnJhY2nDs24gSlNPTjwvYnV0dG9uPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iZmlsZSIgaWQ9ImZpbGUtaW1wb3J0IiBhY2NlcHQ9Ii5qc29uIiBzdHlsZT0iZGlzcGxheTpub25lIi8+CiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1pbXBvcnQiIGNsYXNzPSJzZWNvbmRhcnkiPkltcG9ydGFyIGNhbGlicmFjacOzbiBKU09OPC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L3NlY3Rpb24+CiAgICA8ZGl2IGlkPSJtb2RhbC1vdmVybGF5IiBjbGFzcz0ibW9kYWwtb3ZlcmxheSI+CiAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtYm94Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibW9kYWwtaWNvbiI+4pyFPC9kaXY+CiAgICAgICAgICAgIDxoMj7CoUVzY3JpYmUgY29uIMOpeGl0byE8L2gyPgoKICAgICAgICAgICAgPHAgc3R5bGU9ImZvbnQtc2l6ZTogMS4xcmVtOyBjb2xvcjogIzM3NDE1MTsgbWFyZ2luLWJvdHRvbTogMS41cmVtOyI+CiAgTG9zIG51ZXZvcyB2YWxvcmVzIGRlIGNhbGlicmFjacOzbiBzZSBoYW4gZ3VhcmRhZG8gZW4gZWwgc2Vuc29yLgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJtb2RhbC1pbnN0cnVjdGlvbiI+CiAgICAgICAgICAgICAgICA8c3Ryb25nPkFDQ0nDk04gUkVRVUVSSURBPC9zdHJvbmc+CiAgICAgICAgICAgICAgICA8cCBzdHlsZT0ibWFyZ2luLXRvcDowLjVyZW07IG1hcmdpbi1ib3R0b206IDA7Ij4KICBEZWJlcyBwdWxzYXIgZWwgYm90w7NuIDx1PkRFU0NPTkVDVEFSPC91PiBlbiBsYSBhcHAgeS9vIDx1PlJFRlJFU0NBUjwvdT4gbGEgcMOhZ2luYSBwYXJhIHZlcmlmaWNhciBsb3MgbnVldm9zIGFqdXN0ZXMgZGUKLgogICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxidXR0b24gaWQ9ImJ0bi1tb2RhbC1jbG9zZSI+VmFsZSwgbG8gZW50aWVuZG88L2J1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L21haW4+CjxzY3JpcHQ+CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDAuIEJhc2ljIHN0YXRlICYgaGVscGVycwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBidG5FbmFibGVFZGl0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1lbmFibGUtZWRpdCIpOwogICAgY29uc3Qgc3RhdHVzQmFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN0YXR1cy1iYXIiKTsKICAgIGNvbnN0IG1vZGFsT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb2RhbC1vdmVybGF5Iik7CiAgICBjb25zdCBidG5Nb2RhbENsb3NlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1tb2RhbC1jbG9zZSIpOwogICAgYnRuTW9kYWxDbG9zZS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICBtb2RhbE92ZXJsYXkuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1cyhtZXNzYWdlLCBzdGF0ZSA9ICJpZGxlIikgewogICAgICAgIHN0YXR1c0Jhci5jbGFzc05hbWUgPSAic3RhdHVzLWJhciI7CiAgICAgICAgc3RhdHVzQmFyLmNsYXNzTGlzdC5hZGQoYHN0YXR1cy0ke3N0YXRlfWApOwogICAgICAgIHN0YXR1c0Jhci50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2hvd0Vycm9yKG1zZykgewogICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTsKICAgICAgICB1cGRhdGVTdGF0dXMobXNnLCAiZXJyb3IiKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDEuIFNlbnNvciByZWdpc3RyeQogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBTRU5TT1JfUkVHSVNUUlkgPSBbCiAgICAgICAgewogICAgICAgICAgICBpZDogImFtY29uLTEiLAogICAgICAgICAgICBuYW1lOiAiT0FFLVNDT1VUIENha2UgRHJ5bmVzcyBTZW5zb3IiLAogICAgICAgICAgICBkZXNjcmlwdGlvbjogIlNpbmdsZS1jaGFubmVsIEFNQ09OIE9FTSBzZW5zb3IgZm9yIENha2UgRHJ5bmVzcyBtZWFzdXJlbWVudCIsCiAgICAgICAgICAgIGltZ1NyYzogIiIsCiAgICAgICAgICAgIHJlZ2lzdGVyczogewogICAgICAgICAgICAgICAgLy8gRGVmaW5lcyB3aGVyZSB0byBzdGFydCByZWFkaW5nIGFuZCBob3cgbWFueSB0byByZWFkCiAgICAgICAgICAgICAgICBpbnB1dFN0YXJ0OiAwLAogICAgICAgICAgICAgICAgaW5wdXRDb3VudDogNSwgICAvLyBXYXMgaGFyZGNvZGVkIGFzIDUKCiAgICAgICAgICAgICAgICBob2xkaW5nU3RhcnQ6IDAsCiAgICAgICAgICAgICAgICBob2xkaW5nQ291bnQ6IDgsIC8vIFdhcyBoYXJkY29kZWQgYXMgOAoKICAgICAgICAgICAgICAgIC8vIFNwZWNpZmljIGxvY2F0aW9ucyBvZiBkYXRhIHdpdGhpbiB0aG9zZSBibG9ja3MKICAgICAgICAgICAgICAgIC8vIEZvciBBbWNvbi0xLCB0aGVzZSBhcmUgYWJzb2x1dGUgYWRkcmVzc2VzLgogICAgICAgICAgICAgICAgc25JbmRleDogMywgICAgICAvLyBTZXJpYWwgTnVtYmVyIGlzIGF0IElucHV0IFJlZyAzCiAgICAgICAgICAgICAgICBmd0luZGV4OiA0LCAgICAgIC8vIEZpcm13YXJlIGlzIGF0IElucHV0IFJlZyA0CgogICAgICAgICAgICAgICAgY2FsaWJyYXRpb25TY2FsaW5nOiAwLCAvLyBTdGFydCBhZGRyZXNzIGZvciBzY2FsaW5nIHJlZ2lzdGVycwogICAgICAgICAgICAgICAgY2FsaWJyYXRpb25PZmZzZXQ6IDEgICAvLyBTdGFydCBhZGRyZXNzIGZvciBvZmZzZXQgcmVnaXN0ZXJzIChOb3QgdXNlZCBpbiBjdXJyZW50IGxvZ2ljLCBidXQgZ29vZCBmb3IgdGhlIGFkZCBuZXcgc2Vuc29yIGRvY3VtZW50KQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgXTsKICAgIGxldCBzZWxlY3RlZFNlbnNvciA9IG51bGw7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyAyLiBSZW5kZXIgc2Vuc29yIGNhcmRzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGNvbnN0IHNlbnNvckdyaWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2Vuc29yLWdyaWQiKTsKICAgIGZ1bmN0aW9uIHJlbmRlclNlbnNvckNhcmRzKCkgewogICAgICAgIHNlbnNvckdyaWQuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgU0VOU09SX1JFR0lTVFJZLmZvckVhY2goc2Vuc29yID0+IHsKICAgICAgICAgICAgY29uc3QgY2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICAgICAgICBjYXJkLmNsYXNzTmFtZSA9ICJzZW5zb3ItY2FyZCI7CiAgICAgICAgICAgIGNhcmQuZGF0YXNldC5zZW5zb3JJZCA9IHNlbnNvci5pZDsKICAgICAgICAgICAgY2FyZC5pbm5lckhUTUwgPSBgCiAgICAgICAgPGgzPiR7c2Vuc29yLm5hbWV9PC9oMz4KICAgICAgICA8cD4ke3NlbnNvci5kZXNjcmlwdGlvbn08L3A+CiAgICAgIGA7CiAgICAgICAgICAgIGNhcmQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIuc2Vuc29yLWNhcmQiKS5mb3JFYWNoKGMgPT4gYy5jbGFzc0xpc3QucmVtb3ZlKCJzZWxlY3RlZCIpKTsKICAgICAgICAgICAgICAgIGNhcmQuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQiKTsKICAgICAgICAgICAgICAgIHNlbGVjdGVkU2Vuc29yID0gc2Vuc29yOwogICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGBTZWxlY3RlZCBzZW5zb3I6ICR7c2Vuc29yLm5hbWV9YCwgImlkbGUiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNlbnNvckdyaWQuYXBwZW5kQ2hpbGQoY2FyZCk7CiAgICAgICAgfSk7CiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IHNlbnNvciBieSBkZWZhdWx0CiAgICAgICAgY29uc3QgZmlyc3RDYXJkID0gc2Vuc29yR3JpZC5xdWVyeVNlbGVjdG9yKCIuc2Vuc29yLWNhcmQiKTsKICAgICAgICBpZiAoZmlyc3RDYXJkKSBmaXJzdENhcmQuY2xpY2soKTsKICAgIH0KICAgIHJlbmRlclNlbnNvckNhcmRzKCk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyAzLiBNb2RidXMgLyBXZWJTZXJpYWwgaW50ZWdyYXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgY29uc3QgT0xQQVNfRklMVEVSID0gWwogICAgICAgIHt1c2JWZW5kb3JJZDogMTAyNywgdXNiUHJvZHVjdElkOiAyNDU3N30sICAvLyBGVERJIGNhYmxlIHByb2R1Y3QgSURzCiAgICAgICAge3VzYlZlbmRvcklkOiAxMDI3LCB1c2JQcm9kdWN0SWQ6IDI0NTk3fQogICAgXTsKCiAgICBjbGFzcyBNb2RidXMgewogICAgICAgIGNvbnN0cnVjdG9yKHNldHRpbmdzKSB7CiAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuZnJvbUVudHJpZXMoc2V0dGluZ3MpOwogICAgICAgICAgICAvLyBFeHRyYWN0IHNsYXZlIGFkZHJlc3MgKGFjY2VwdCAic2xhdmVfYWRkcmVzcyIgb3IgInNsYXZlQWRkcmVzcyIpCiAgICAgICAgICAgIHRoaXMuc2xhdmUgPSB0aGlzLnNldHRpbmdzLnNsYXZlX2FkZHJlc3MgfHwgdGhpcy5zZXR0aW5ncy5zbGF2ZUFkZHJlc3MgfHwgMTsKICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCA9IDEwMDA7CiAgICAgICAgICAgIHRoaXMucG9ydCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucmVhZGVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyOiBzcGxpdCAxNi1iaXQgdmFsdWUgaW50byBNU0IgYW5kIExTQgogICAgICAgICNtc2JBbmRMc2IodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIFsodmFsdWUgPj4gOCkgJiAweEZGLCB2YWx1ZSAmIDB4RkZdOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyOiBDUkMtMTYgKE1vZGJ1cykgY2FsY3VsYXRpb24KICAgICAgICAjY3JjMTYoYnl0ZXMpIHsKICAgICAgICAgICAgbGV0IGNyYyA9IDB4RkZGRjsKICAgICAgICAgICAgZm9yIChsZXQgYiBvZiBieXRlcykgewogICAgICAgICAgICAgICAgY3JjIF49IGI7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8ODsgaSsrKSB7IGNvbnN0IG9kZCA9IGNyYyAmIDB4MDE7IGNyYz4+PSAxOwogICAgICAgICAgICAgICAgICAgIGlmIChvZGQpIGNyYyBePSAweEEwMDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtjcmMgJiAweEZGLCAoY3JjID4+IDgpICYgMHhGRl07ICAvLyBbbG93LCBoaWdoXQogICAgICAgIH0KCiAgICAgICAgLy8gQnVpbGQgTW9kYnVzIGZyYW1lIGZvciBnaXZlbiBmdW5jdGlvbiBjb2RlLCBzdGFydCwgcXVhbnRpdHksIGFuZCBwYXlsb2FkIChmb3Igd3JpdGVzKQogICAgICAgICNmcmFtZShmYywgc3RhcnQsIHF0eSwgcGF5bG9hZCA9IFtdKSB7CiAgICAgICAgICAgIGxldCBmcmFtZSA9IFt0aGlzLnNsYXZlLCBmY107CiAgICAgICAgICAgIGNvbnN0IFttc2IxLCBsc2IxXSA9IHRoaXMuI21zYkFuZExzYihzdGFydCk7CiAgICAgICAgICAgIGNvbnN0IFttc2IyLCBsc2IyXSA9IHRoaXMuI21zYkFuZExzYihxdHkpOwogICAgICAgICAgICBmcmFtZS5wdXNoKG1zYjEsIGxzYjEsIG1zYjIsIGxzYjIpOwogICAgICAgICAgICBpZiAoZmMgPT09IDE2KSB7ICAvLyBXcml0ZSBtdWx0aXBsZSByZWdpc3RlcnMKICAgICAgICAgICAgICAgIGZyYW1lLnB1c2gocGF5bG9hZC5sZW5ndGggKiAyKTsKICAgICAgICAgICAgICAgIHBheWxvYWQuZm9yRWFjaCh2YWwgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IFthLCBiXSA9IHRoaXMuI21zYkFuZExzYih2YWwpOwogICAgICAgICAgICAgICAgICAgIGZyYW1lLnB1c2goYSwgYik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBbY3JjTCwgY3JjSF0gPSB0aGlzLiNjcmMxNihmcmFtZSk7CiAgICAgICAgICAgIGZyYW1lLnB1c2goY3JjTCwgY3JjSCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShmcmFtZSk7CiAgICAgICAgfQoKICAgICAgICBhc3luYyBjb25uZWN0KHBvcnQpIHsKICAgICAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDsKICAgICAgICAgICAgdGhpcy53cml0ZXIgPSBwb3J0LndyaXRhYmxlLmdldFdyaXRlcigpOwogICAgICAgICAgICB0aGlzLnJlYWRlciA9IHBvcnQucmVhZGFibGUuZ2V0UmVhZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gTG93LWxldmVsIGZyYW1lIHdyaXRlICsgcmVhZCAocmV0dXJucyBmdWxsIHJlc3BvbnNlIGJ5dGVzIG9yIG51bGwpCiAgICAgICAgYXN5bmMgd3JpdGVGcmFtZShmcmFtZSkgewogICAgICAgICAgICBjb25zb2xlLmxvZygiJWNXUklURSBGUkFNRSDihpIiLCAiY29sb3I6IzM4YmRmOCIsIGZyYW1lKTsKCiAgICAgICAgICAgIGlmICghdGhpcy53cml0ZXIgfHwgIXRoaXMucmVhZGVyKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIk1vZGJ1cyB3cml0ZXIvcmVhZGVyIG5vdCBpbml0aWFsaXplZCIpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDEpIFNlbmQgdGhlIHJlcXVlc3QKICAgICAgICAgICAgYXdhaXQgdGhpcy53cml0ZXIud3JpdGUoZnJhbWUpOwoKICAgICAgICAgICAgLy8gMikgV2FpdCBhIGJpdCBzbyB0aGUgc2Vuc29yIGNhbiByZXNwb25kIGZ1bGx5CiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxNTAwKSk7CgogICAgICAgICAgICAvLyAzKSBTaW5nbGUgcmVhZCB3aXRoIHRpbWVvdXQKICAgICAgICAgICAgY29uc3QgcmVhZFByb21pc2UgPSB0aGlzLnJlYWRlci5yZWFkKCk7CiAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRQcm9taXNlID0gbmV3IFByb21pc2UoKF8sIHJlamVjdCkgPT4KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcigiUmVhZGVyIHRpbWVvdXQiKSksIDYwMDAwKQogICAgICAgICAgICApOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHt2YWx1ZSwgZG9uZX0gPSBhd2FpdCBQcm9taXNlLnJhY2UoW3JlYWRQcm9taXNlLCB0aW1lb3V0UHJvbWlzZV0pOwoKICAgICAgICAgICAgICAgIGlmIChkb25lIHx8ICF2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiTm8gZGF0YSByZWNlaXZlZCBmcm9tIHNlbnNvciIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCIlY1JFQUQgRlJBTUUg4oaQIiwgImNvbG9yOiM0YWRlODAiLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7IC8vIFVpbnQ4QXJyYXkKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiUmVhZCBlcnJvcjoiLCBlKTsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBhc3luYyByZWFkSW5wdXRSZWdpc3RlcnMoc3RhcnQsIHF0eSkgewogICAgICAgICAgICBjb25zdCBmcmFtZSA9IHRoaXMuI2ZyYW1lKDQsIHN0YXJ0LCBxdHkpOwogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud3JpdGVGcmFtZShmcmFtZSk7CiAgICAgICAgICAgIGlmICghcmVzcG9uc2UpIHJldHVybiBudWxsOwoKICAgICAgICAgICAgLy8gRXhwZWN0ZWQ6IGFkZHIoMSkgKyBmYygxKSArIGJ5dGVDb3VudCgxKSArIGRhdGEoMipxdHkpICsgQ1JDKDIpID0gMyArIDIqcXR5ICsgMgogICAgICAgICAgICBjb25zdCBleHBlY3RlZE1pbiA9IDMgKyBxdHkgKiAyOwogICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoIDxleHBlY3RlZE1pbikgeyBjb25zb2xlLndhcm4oIlNob3J0IEZDNCByZXNwb25zZToiLCByZXNwb25zZS5sZW5ndGgsICJieXRlcywgZXhwZWN0ZWQg4omlIiwgZXhwZWN0ZWRNaW4pOyByZXR1cm4gbnVsbDsgfSBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyhyZXNwb25zZS5idWZmZXIpOyBsZXQgcmVzdWx0ID0ge307IGxldCBvZmZzZXQgPSAzOyAvLyBmaXJzdCBkYXRhIGJ5dGUgYWZ0ZXIgW2FkZHIsIGZjLCBieXRlQ291bnRdIGZvciAobGV0IGkgPSAwOyBpIDxxdHk7IGkrKykgeyByZXN1bHRbYHJlZ18ke3N0YXJ0ICsgaX1gXSA9IGR2LmdldFVpbnQxNihvZmZzZXQsIGZhbHNlKTsgb2Zmc2V0ICs9IDI7IH0gcmV0dXJuIHJlc3VsdDsgfSBhc3luYyByZWFkUmVnaXN0ZXJzKHN0YXJ0LCBxdHkpIHsgY29uc3QgZnJhbWUgPSB0aGlzLiNmcmFtZSgzLCBzdGFydCwgcXR5KTsgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndyaXRlRnJhbWUoZnJhbWUpOyBpZiAoIXJlc3BvbnNlKSByZXR1cm4gbnVsbDsgY29uc3QgZXhwZWN0ZWRNaW4gPSAzICsgcXR5ICogMjsgaWYgKHJlc3BvbnNlLmxlbmd0aCA8ZXhwZWN0ZWRNaW4pIHsgY29uc29sZS53YXJuKCJTaG9ydCBGQzMgcmVzcG9uc2U6IiwgcmVzcG9uc2UubGVuZ3RoLCAiYnl0ZXMsIGV4cGVjdGVkIOKJpSIsIGV4cGVjdGVkTWluKTsgcmV0dXJuIG51bGw7IH0gY29uc3QgZHYgPSBuZXcgRGF0YVZpZXcocmVzcG9uc2UuYnVmZmVyKTsgbGV0IHJlc3VsdCA9IHt9OyBsZXQgb2Zmc2V0ID0gMzsgZm9yIChsZXQgaSA9IDA7IGkgPHF0eTsgaSsrKSB7IHJlc3VsdFtgcmVnXyR7c3RhcnQgKyBpfWBdID0gZHYuZ2V0VWludDE2KG9mZnNldCwgZmFsc2UpOyBvZmZzZXQgKz0gMjsgfSByZXR1cm4gcmVzdWx0OyB9IGFzeW5jIHdyaXRlQ2FsaWJyYXRpb24oc3RhcnRSZWcsIHNjYWxpbmcsIG9mZnNldCkgeyBjb25zb2xlLmxvZygiV3JpdGluZyBDYWxpYnJhdGlvbi4uLiIpOyAvLyBVUEdSQURFRCBIZWxwZXIgZnVuY3Rpb246IEhhbmRsZXMgYm90aCBEZWNpbWFscyBBTkQgTWFzc2l2ZSBJbnRlZ2VycyBjb25zdCBlbmNvZGVNb2RidXNGbG9hdCA9ICh2YWwpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWwgPT09IDAgfHwgaXNOYU4odmFsKSkgcmV0dXJuIHttYWc6IDAsIHNpZ246IDAsIHBvc0V4cDogMCwgbmVnRXhwOiAwfTsKICAgICAgICAgICAgICAgIGNvbnN0IHNpZ24gPSB2YWwgPDAgPyAxIDogMDsgY29uc3QgYWJzVmFsID0gTWF0aC5hYnModmFsKTsgLy8gMS4gVHJ5IE5lZ2F0aXZlIEV4cG9uZW50IChEZWNpbWFscykgZm9yIChsZXQgZSA9IDY7IGU+PSAwOyBlLS0pIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtID0gTWF0aC5yb3VuZChhYnNWYWwgKiBNYXRoLnBvdygxMCwgZSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChtID4gMCAmJiBtIDw9IDY1NTM1KSByZXR1cm4ge21hZzogbSwgc2lnbjogc2lnbiwgcG9zRXhwOiAwLCBuZWdFeHA6IGV9OyB9IC8vIDIuIFRyeSBQb3NpdGl2ZSBFeHBvbmVudCAoTWFzc2l2ZSBOdW1iZXJzPiA2NTUzNSkKICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAxOyBwIDw9IDEwOyBwKyspIHsgY29uc3QgbSA9IE1hdGgucm91bmQoYWJzVmFsIC8gTWF0aC5wb3coMTAsIHApKTsgaWYgKG0+IDAgJiYgbSA8PSA2NTUzNSkgcmV0dXJuIHttYWc6IG0sIHNpZ246IHNpZ24sIHBvc0V4cDogcCwgbmVnRXhwOiAwfTsgfSAvLyBGYWxsYmFjayBzYWZldHkgaWYgKGFic1ZhbD4gNjU1MzUpIHJldHVybiB7bWFnOiA2NTUzNSwgc2lnbjogc2lnbiwgcG9zRXhwOiAwLCBuZWdFeHA6IDB9OwogICAgICAgICAgICAgICAgcmV0dXJuIHttYWc6IDAsIHNpZ246IHNpZ24sIHBvc0V4cDogMCwgbmVnRXhwOiAwfTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIDEgJiAyLiBEeW5hbWljYWxseSBlbmNvZGUgYm90aCB2YXJpYWJsZXMgc2FmZWx5IQogICAgICAgICAgICBjb25zdCBvID0gZW5jb2RlTW9kYnVzRmxvYXQob2Zmc2V0KTsKICAgICAgICAgICAgY29uc3QgcyA9IGVuY29kZU1vZGJ1c0Zsb2F0KHNjYWxpbmcpOwoKICAgICAgICAgICAgLy8gMy4gQ09OU1RSVUNUIFBBWUxPQUQKICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IFsKICAgICAgICAgICAgICAgIG8ubWFnLCBvLnNpZ24sIG8ucG9zRXhwLCBvLm5lZ0V4cCwgLy8gUmVncyAwLTM6IE9mZnNldAogICAgICAgICAgICAgICAgcy5tYWcsIHMuc2lnbiwgcy5wb3NFeHAsIHMubmVnRXhwICAvLyBSZWdzIDQtNzogU2NhbGluZwogICAgICAgICAgICBdOwoKICAgICAgICAgICAgLy8gNC4gQnVpbGQgRnJhbWUKICAgICAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLiNmcmFtZSgxNiwgc3RhcnRSZWcsIHBheWxvYWQubGVuZ3RoLCBwYXlsb2FkKTsKCiAgICAgICAgICAgIC8vIDUuIFNFTkQgQU5EIENPTlNVTUUgRUNITwogICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud3JpdGVGcmFtZShmcmFtZSk7CgogICAgICAgICAgICByZXR1cm4gKHJlc3BvbnNlICE9PSBudWxsKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gR2xvYmFsIGhhbmRsZXMgZm9yIGN1cnJlbnQgTW9kYnVzIGNvbm5lY3Rpb24KICAgIGxldCBtb2RidXMgPSBudWxsOwogICAgbGV0IHBvcnQgPSBudWxsOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gMy5hIENvbm5lY3QgLyBEaXNjb25uZWN0CiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3RUb1NlbnNvcigpIHsKICAgICAgICBpZiAoIXNlbGVjdGVkU2Vuc29yKSB7CiAgICAgICAgICAgIHNob3dFcnJvcigiU2VsZWN0IGEgc2Vuc29yIGZpcnN0LiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVN0YXR1cygiUmVxdWVzdGluZyBzZXJpYWwgcG9ydOKApiIsICJjb25uZWN0aW5nIik7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcG9ydCA9IGF3YWl0IG5hdmlnYXRvci5zZXJpYWwucmVxdWVzdFBvcnQoe2ZpbHRlcnM6IE9MUEFTX0ZJTFRFUn0pOwogICAgICAgICAgICBjb25zdCBiYXVkID0gcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJhdWQtcmF0ZSIpLnZhbHVlKSB8fCA5NjAwOwogICAgICAgICAgICBjb25zdCBzbGF2ZUFkZHIgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2xhdmUtYWRkcmVzcyIpLnZhbHVlKSB8fCAxOwogICAgICAgICAgICBhd2FpdCBwb3J0Lm9wZW4oewogICAgICAgICAgICAgICAgYmF1ZFJhdGU6IGJhdWQsCiAgICAgICAgICAgICAgICBkYXRhQml0czogOCwKICAgICAgICAgICAgICAgIHN0b3BCaXRzOiAxLAogICAgICAgICAgICAgICAgcGFyaXR5OiAibm9uZSIsCiAgICAgICAgICAgICAgICBidWZmZXJTaXplOiAyNTUsCiAgICAgICAgICAgICAgICBmbG93Q29udHJvbDogIm5vbmUiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBtb2RidXMgPSBuZXcgTW9kYnVzKFtbInNsYXZlX2FkZHJlc3MiLCBzbGF2ZUFkZHJdXSk7CiAgICAgICAgICAgIGF3YWl0IG1vZGJ1cy5jb25uZWN0KHBvcnQpOwogICAgICAgICAgICAvLyBFbmFibGUvZGlzYWJsZSBVSSBidXR0b25zCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY29ubmVjdCIpLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1kaXNjb25uZWN0IikuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUmVhZCBzZW5zb3IgaW5mb3JtYXRpb24gYW5kIGN1cnJlbnQgY2FsaWJyYXRpb24gYWZ0ZXIgY29ubmVjdGluZwogICAgICAgICAgICBhd2FpdCByZWFkU2Vuc29ySW5mb0FuZENhbGlicmF0aW9uKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzaG93RXJyb3IoIkNvbm5lY3Rpb24gZmFpbGVkOiAiICsgZS5tZXNzYWdlKTsKICAgICAgICB9CiAgICB9CgogICAgYXN5bmMgZnVuY3Rpb24gZGlzY29ubmVjdFNlbnNvcigpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAobW9kYnVzPy5yZWFkZXIpIGF3YWl0IG1vZGJ1cy5yZWFkZXIucmVsZWFzZUxvY2soKTsKICAgICAgICAgICAgaWYgKG1vZGJ1cz8ud3JpdGVyKSBhd2FpdCBtb2RidXMud3JpdGVyLnJlbGVhc2VMb2NrKCk7CiAgICAgICAgICAgIGlmIChwb3J0KSBhd2FpdCBwb3J0LmNsb3NlKCk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oIkRpc2Nvbm5lY3QgZXJyb3I6IiwgZSk7CiAgICAgICAgfQogICAgICAgIHBvcnQgPSBudWxsOwogICAgICAgIG1vZGJ1cyA9IG51bGw7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ0bi1jb25uZWN0IikuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWRpc2Nvbm5lY3QiKS5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgdXBkYXRlU3RhdHVzKCJEaXNjb25uZWN0ZWQiLCAiaWRsZSIpOwogICAgfQoKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY29ubmVjdCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgY29ubmVjdFRvU2Vuc29yKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tZGlzY29ubmVjdCIpLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgZGlzY29ubmVjdFNlbnNvcik7CgogICAgLy8gTGlzdGVuIGZvciBoYXJkd2FyZSBkaXNjb25uZWN0IChlLmcuLCBVU0IgY2FibGUgdW5wbHVnZ2VkKQogICAgbmF2aWdhdG9yLnNlcmlhbC5hZGRFdmVudExpc3RlbmVyKCJkaXNjb25uZWN0IiwgYXN5bmMgKCkgPT4gewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGF3YWl0IGRpc2Nvbm5lY3RTZW5zb3IoKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICBzaG93RXJyb3IoIlNlbnNvciBkaXNjb25uZWN0ZWQiKTsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDMuYiBEZWJ1ZyBoZWxwZXJzIChhY2Nlc3NpYmxlIGZyb20gY29uc29sZSBmb3IgdGVzdGluZykKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgd2luZG93LmRlYnVnUGluZyA9IGFzeW5jIGZ1bmN0aW9uICgpIHsKICAgICAgICBjb25zb2xlLmxvZygiPT09IGRlYnVnUGluZzogRkM0IElOUFVUIFJFR0lTVEVSUyAw4oCTNSA9PT0iKTsKICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBtb2RidXMucmVhZElucHV0UmVnaXN0ZXJzKDAsIDUpOwogICAgICAgIGNvbnNvbGUubG9nKCJGQzQgcmVzdWx0OiIsIHJlcyk7CiAgICB9OwogICAgd2luZG93LmRlYnVnSW5wdXQgPSBhc3luYyBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFtb2RidXMpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKCJNb2RidXMgbm90IGluaXRpYWxpemVkLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUubG9nKCI9PT0gZGVidWdJbnB1dDogcmVhZCBJTlBVVCBSRUdJU1RFUlMgKEZDNCkgMOKAkzUgPT09Iik7CiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgbW9kYnVzLnJlYWRJbnB1dFJlZ2lzdGVycygwLCA1KTsKICAgICAgICBjb25zb2xlLmxvZygiRkM0IHJlc3VsdDoiLCByZXMpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDMuYyBSZWFkIHNlbnNvciBpbmZvIGFuZCBjYWxpYnJhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBhc3luYyBmdW5jdGlvbiByZWFkU2Vuc29ySW5mb0FuZENhbGlicmF0aW9uKCkgewogICAgICAgIGlmICghbW9kYnVzIHx8ICFzZWxlY3RlZFNlbnNvcikgcmV0dXJuOwoKICAgICAgICAvLyBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgcmVnaXN0cnkKICAgICAgICBjb25zdCByZWdDb25maWcgPSBzZWxlY3RlZFNlbnNvci5yZWdpc3RlcnM7CgogICAgICAgIC8vIC0tLSAxKSBSRUFEIElOUFVUIFJFR0lTVEVSUyAtLS0KICAgICAgICAvLyBVc2UgdGhlIGR5bmFtaWMgc3RhcnQgYW5kIGNvdW50IGZyb20gdGhlIHJlZ2lzdHJ5CiAgICAgICAgY29uc29sZS5sb2coYFJlYWRpbmcgJHtyZWdDb25maWcuaW5wdXRDb3VudH0gSW5wdXQgUmVnaXN0ZXJzIHN0YXJ0aW5nIGF0ICR7cmVnQ29uZmlnLmlucHV0U3RhcnR9Li4uYCk7CiAgICAgICAgY29uc3QgaW5wdXRzID0gYXdhaXQgbW9kYnVzLnJlYWRJbnB1dFJlZ2lzdGVycyhyZWdDb25maWcuaW5wdXRTdGFydCwgcmVnQ29uZmlnLmlucHV0Q291bnQpOwoKICAgICAgICBpZiAoIWlucHV0cykgewogICAgICAgICAgICBzaG93RXJyb3IoIkZhaWxlZCB0byByZWFkIGlucHV0IHJlZ2lzdGVycyAoU04vRlcpLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zb2xlLmxvZygiSU5QVVQgUkVHSVNURVJTOiIsIGlucHV0cyk7CgogICAgICAgIC8vIE1hcCB0aGUgcmVzdWx0IGtleXMgKGUuZy4sICJyZWdfMyIpIGJhc2VkIG9uIHRoZSByZWdpc3RyeSBkZWZpbml0aW9uCiAgICAgICAgY29uc3Qgc24gPSBpbnB1dHNbYHJlZ18ke3JlZ0NvbmZpZy5zbkluZGV4fWBdOwogICAgICAgIGNvbnN0IGZ3ID0gaW5wdXRzW2ByZWdfJHtyZWdDb25maWcuZndJbmRleH1gXTsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tc2VyaWFsIikudmFsdWUgPSBzbiA\/PyAiIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5mby1maXJtd2FyZSIpLnZhbHVlID0gZncgPz8gIiI7CgogICAgICAgIC8vIC0tLSAyKSBSRUFEIEhPTERJTkcgUkVHSVNURVJTIChDYWxpYnJhdGlvbikgLS0tCiAgICAgICAgLy8gVXNlIHRoZSBkeW5hbWljIHN0YXJ0IGFuZCBjb3VudCBmcm9tIHRoZSByZWdpc3RyeQogICAgICAgIGNvbnNvbGUubG9nKGBSZWFkaW5nICR7cmVnQ29uZmlnLmhvbGRpbmdDb3VudH0gSG9sZGluZyBSZWdpc3RlcnMgc3RhcnRpbmcgYXQgJHtyZWdDb25maWcuaG9sZGluZ1N0YXJ0fS4uLmApOwogICAgICAgIGNvbnN0IGNhbGliID0gYXdhaXQgbW9kYnVzLnJlYWRSZWdpc3RlcnMocmVnQ29uZmlnLmhvbGRpbmdTdGFydCwgcmVnQ29uZmlnLmhvbGRpbmdDb3VudCk7CgogICAgICAgIGlmICghY2FsaWIpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJGYWlsZWQgdG8gcmVhZCBjYWxpYnJhdGlvbiByZWdpc3RlcnMuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnNvbGUubG9nKCJIT0xESU5HIFJFR0lTVEVSUzoiLCBjYWxpYik7CgogICAgICAgIC8vIERldGVybWluZSByZWdpc3RlciBrZXlzIGJhc2VkIG9uIHN0YXJ0IGFkZHJlc3MKICAgICAgICAvLyBUaGUgcmVnaXN0ZXJzIGZvciBjYWxpYnJhdGlvbiBhcmUgc2VxdWVudGlhbDogTywgT1MsIE9QLCBPTiwgUywgU1MsIFNQLCBTTgogICAgICAgIGNvbnN0IHN0YXJ0ID0gcmVnQ29uZmlnLmhvbGRpbmdTdGFydDsKCiAgICAgICAgY29uc3QgTyA9IGNhbGliW2ByZWdfJHtzdGFydCArIDB9YF0gPz8gMDsgLy8gb2Zmc2V0IG1hZ25pdHVkZQogICAgICAgIGNvbnN0IE9TID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgMX1gXSA\/PyAwOyAvLyBvZmZzZXQgc2lnbgogICAgICAgIGNvbnN0IE9QID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgMn1gXSA\/PyAwOyAvLyBvZmZzZXQgcG9zIGV4cAogICAgICAgIGNvbnN0IE9OID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgM31gXSA\/PyAwOyAvLyBvZmZzZXQgbmVnIGV4cAoKICAgICAgICBjb25zdCBTID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgNH1gXSA\/PyAwOyAvLyBzY2FsaW5nIG1hZ25pdHVkZQogICAgICAgIGNvbnN0IFNTID0gY2FsaWJbYHJlZ18ke3N0YXJ0ICsgNX1gXSA\/PyAwOyAvLyBzY2FsaW5nIHNpZ24KICAgICAgICBjb25zdCBTUCA9IGNhbGliW2ByZWdfJHtzdGFydCArIDZ9YF0gPz8gMDsgLy8gc2NhbGluZyBwb3MgZXhwCiAgICAgICAgY29uc3QgU04gPSBjYWxpYltgcmVnXyR7c3RhcnQgKyA3fWBdID8\/IDA7IC8vIHNjYWxpbmcgbmVnIGV4cAoKICAgICAgICAvLyBEZWNvZGUgU2NpZW50aWZpYyBOb3RhdGlvbiAoU2FtZSBsb2dpYykKICAgICAgICBjb25zdCBvZmZzZXRBYnMgPSBPICogTWF0aC5wb3coMTAsIE9QKSAqIE1hdGgucG93KDEwLCAtT04pOwogICAgICAgIGNvbnN0IHNjYWxpbmdBYnMgPSBTICogTWF0aC5wb3coMTAsIFNQKSAqIE1hdGgucG93KDEwLCAtU04pOwogICAgICAgIGNvbnN0IG9mZnNldFZhbCA9IChPUyA9PT0gMSA\/IC1vZmZzZXRBYnMgOiBvZmZzZXRBYnMpOwogICAgICAgIGNvbnN0IHNjYWxpbmdWYWwgPSAoU1MgPT09IDEgPyAtc2NhbGluZ0FicyA6IHNjYWxpbmdBYnMpOwoKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaW5mby1zY2FsaW5nIikudmFsdWUgPSBzY2FsaW5nVmFsLnRvRml4ZWQoNik7CiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tb2Zmc2V0IikudmFsdWUgPSBvZmZzZXRWYWwudG9GaXhlZCg2KTsKCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLWN1cnJlbnQtc2NhbGUiKS52YWx1ZSA9IHNjYWxpbmdWYWwudG9GaXhlZCg2KTsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsaWItY3VycmVudC1vZmZzZXQiKS52YWx1ZSA9IG9mZnNldFZhbC50b0ZpeGVkKDYpOwoKICAgICAgICB1cGRhdGVTdGF0dXMoIlNlbnNvciBpbmZvIGFuZCBjYWxpYnJhdGlvbiByZWFkIHN1Y2Nlc3NmdWxseSIsICJzdWNjZXNzIik7CiAgICB9CgogICAgLy8gV3JpdGUgbmV3IGNhbGlicmF0aW9uIHZhbHVlcyB0byBzZW5zb3IgKHZpYSBNb2RidXMgRkMxNikKICAgIGFzeW5jIGZ1bmN0aW9uIHdyaXRlQ2FsaWJyYXRpb25Ub1NlbnNvcihzY2FsaW5nLCBvZmZzZXQpIHsKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOb3QgY29ubmVjdGVkIHRvIGEgc2Vuc29yLiIpOwogICAgICAgIH0KICAgICAgICB1cGRhdGVTdGF0dXMoIldyaXRpbmcgY2FsaWJyYXRpb27igKYiLCAicmVhZGluZyIpOwogICAgICAgIGNvbnN0IHN0YXJ0UmVnID0gc2VsZWN0ZWRTZW5zb3IucmVnaXN0ZXJzLmNhbGlicmF0aW9uU2NhbGluZyB8fCAwOwogICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IG1vZGJ1cy53cml0ZUNhbGlicmF0aW9uKHN0YXJ0UmVnLCBzY2FsaW5nLCBvZmZzZXQpOwogICAgICAgIGlmICghcmVzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2Vuc29yIHJlamVjdGVkIHRoZSB3cml0ZSBjb21tYW5kLiIpOwogICAgICAgIH0KICAgICAgICB1cGRhdGVTdGF0dXMoIkNhbGlicmF0aW9uIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5IiwgInN1Y2Nlc3MiKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDQuIENhbGlicmF0aW9uIGRhdGEgcG9pbnRzIHRhYmxlICsgcmVncmVzc2lvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBjb25zdCBjYWxpYlRib2R5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLXRib2R5Iik7CiAgICBjb25zdCBidG5BZGRSb3cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWFkZC1yb3ciKTsKICAgIGNvbnN0IGJ0bkNsZWFyUm93cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY2xlYXItcm93cyIpOwogICAgY29uc3QgYnRuQ2FsYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tY2FsYyIpOwogICAgY29uc3QgYnRuQXBwbHkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWFwcGx5Iik7CiAgICBjb25zdCBidG5SZXNldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tcmVzZXQiKTsgLy8gTmV3IEJ1dHRvbgoKICAgIGNvbnN0IGNhbGNTY2FsaW5nRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsYy1zY2FsaW5nIik7CiAgICBjb25zdCBjYWxjT2Zmc2V0RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsYy1vZmZzZXQiKTsKICAgIGNvbnN0IGNhbGNSMkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGMtcjIiKTsKCiAgICBsZXQgbGFzdENhbGMgPSBudWxsOyAgLy8geyBzY2FsaW5nLCBvZmZzZXQsIHIyIH0KCiAgICBidG5BZGRSb3cuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBhZGRSb3coKSk7CiAgICBidG5DbGVhclJvd3MuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCBjbGVhclJvd3MpOwoKICAgIC8vIC0tLSBGRUFUVVJFIDE6IFNBTklUWSBDSEVDSyBCRUZPUkUgV1JJVEUgLS0tCgogICAgLy8gLS0tIFdSSVRFIEJVVFRPTiBMT0dJQyAtLS0KICAgIGJ0bkFwcGx5LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgYXN5bmMgKCkgPT4gewogICAgICAgIC8vIDEuIFJlYWQgSW5wdXRzCiAgICAgICAgY29uc3Qgc2NhbGluZ0lucHV0ID0gcGFyc2VGbG9hdChjYWxjU2NhbGluZ0VsLnZhbHVlKTsKICAgICAgICBjb25zdCBvZmZzZXRJbnB1dCA9IHBhcnNlRmxvYXQoY2FsY09mZnNldEVsLnZhbHVlKTsKCiAgICAgICAgLy8gMi4gVmFsaWRhdGlvbgogICAgICAgIGlmIChpc05hTihzY2FsaW5nSW5wdXQpIHx8IGlzTmFOKG9mZnNldElucHV0KSkgewogICAgICAgICAgICBhbGVydCgiRXJyb3I6IFBsZWFzZSBlbnRlciB2YWxpZCBudW1iZXJzLiIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTYWZldHkgQ2hlY2tzLi4uCiAgICAgICAgaWYgKHNjYWxpbmdJbnB1dCA+IDEwMDAwMCB8fCBzY2FsaW5nSW5wdXQgPDAuMDAwMDEpIHsgaWYgKCFjb25maXJtKGBXYXJuaW5nOiBTY2FsaW5nIEZhY3RvciAke3NjYWxpbmdJbnB1dH0gaXMgdW51c3VhbC4gUHJvY2VlZD9gKSkgcmV0dXJuOyB9IGlmIChsYXN0Q2FsYyAmJiBsYXN0Q2FsYy5yMiAhPT0gbnVsbCAmJiBsYXN0Q2FsYy5yMiA8MC4zMCkgeyBpZiAoIWNvbmZpcm0oYFdBUk5JTkc6IExvdyBBY2N1cmFjeSAoUsKyID0gJHtsYXN0Q2FsYy5yMi50b0ZpeGVkKDQpfSkuIENvbnRpbnVlP2ApKSByZXR1cm47IH0gLy8gMy4gUGVyZm9ybSBXcml0ZSB1cGRhdGVTdGF0dXMoIldyaXRpbmcgY2FsaWJyYXRpb24uLi4iLCAiY29ubmVjdGluZyIpOyB0cnkgeyBhd2FpdCB3cml0ZUNhbGlicmF0aW9uVG9TZW5zb3Ioc2NhbGluZ0lucHV0LCBvZmZzZXRJbnB1dCk7IC8vIE5FVyBXQVk6IFNIT1cgUE9QVVAgbW9kYWxPdmVybGF5LnN0eWxlLmRpc3BsYXkgPSAiZmxleCI7IC8vIEFsc28gdXBkYXRlIHN0YXR1cyBiYXIgYmVoaW5kIHRoZSBtb2RhbCBqdXN0IGluIGNhc2UgdXBkYXRlU3RhdHVzKCIgV3JpdGUgQ29tcGxldGUuIFdhaXRpbmcgZm9yIGRpc2Nvbm5lY3QuIiwgInN1Y2Nlc3MiKTsgLy8gTG9jayBVSSBidG5BcHBseS5kaXNhYmxlZCA9IHRydWU7IGJ0bkFwcGx5LnN0eWxlLm9wYWNpdHkgPSAiMC41IjsgfSBjYXRjaCAoZXJyKSB7IHVwZGF0ZVN0YXR1cygiV3JpdGUgZmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UsICJlcnJvciIpOyBhbGVydCgiV3JpdGUgRmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UpOyAvLyBVc2UgYWxlcnQgZm9yIGVycm9yIHNvIHRoZXkgc2VlIGl0IH0gfSk7IC8vIC0tLSBGRUFUVVJFIDI6IEZBQ1RPUlkgUkVTRVQgQlVUVE9OIC0tLSBidG5SZXNldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGFzeW5jICgpID0+IHsKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJQbGVhc2UgY29ubmVjdCB0byBhIHNlbnNvciBmaXJzdC4iKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgY29uZmlybVJlc2V0ID0gY29uZmlybSgKICAgICAgICAgICAgIkZBQ1RPUlkgUkVTRVQgV0FSTklOR1xuXG4iICsKICAgICAgICAgICAgIlRoaXMgd2lsbCBvdmVyd3JpdGUgdGhlIGN1cnJlbnQgY2FsaWJyYXRpb24gd2l0aCBkZWZhdWx0IHZhbHVlczpcbiIgKwogICAgICAgICAgICAiU2NhbGluZzogMS4wXG5PZmZzZXQ6IDAuMFxuXG4iICsKICAgICAgICAgICAgIlRoaXMgYWN0aW9uIGNhbm5vdCBiZSB1bmRvbmUuIFByb2NlZWQ\/IgogICAgICAgICk7CgogICAgICAgIGlmIChjb25maXJtUmVzZXQpIHsKICAgICAgICAgICAgYXdhaXQgd3JpdGVDYWxpYnJhdGlvblRvU2Vuc29yKDEuMCwgMC4wKTsKICAgICAgICAgICAgdXBkYXRlU3RhdHVzKCJGYWN0b3J5IERlZmF1bHRzIFJlc3RvcmVkIChTY2FsZTogMS4wLCBPZmZzZXQ6IDAuMCkiLCAic3VjY2VzcyIpOwogICAgICAgICAgICAvLyBDbGVhciBVSSB0byByZWZsZWN0IHRoZSByZXNldAogICAgICAgICAgICBjbGVhclJvd3MoKTsKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC50ZXh0Q29udGVudCA9ICIxLjAwMDAwMCI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC50ZXh0Q29udGVudCA9ICIwLjAwMDAwMCI7CiAgICAgICAgICAgIGNhbGNSMkVsLnRleHRDb250ZW50ID0gIihEZWZhdWx0KSI7CiAgICAgICAgICAgIGxhc3RDYWxjID0ge3NjYWxpbmc6IDEuMCwgb2Zmc2V0OiAwLjAsIHIyOiAxLjB9OwogICAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGFkZFJvdyhyYXcgPSAiIiwga25vd24gPSAiIikgewogICAgICAgIGNvbnN0IHJvd0luZGV4ID0gY2FsaWJUYm9keS5jaGlsZHJlbi5sZW5ndGggKyAxOwogICAgICAgIGNvbnN0IHRyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKTsKICAgICAgICBjb25zdCB0ZEluZGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICB0ZEluZGV4LnRleHRDb250ZW50ID0gcm93SW5kZXg7CgogICAgICAgIGNvbnN0IHRkUmF3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICBjb25zdCBpbnB1dFJhdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7CiAgICAgICAgaW5wdXRSYXcudHlwZSA9ICJudW1iZXIiOwogICAgICAgIGlucHV0UmF3LnN0ZXAgPSAiYW55IjsKICAgICAgICBpbnB1dFJhdy52YWx1ZSA9IHJhdzsKICAgICAgICBpbnB1dFJhdy5wbGFjZWhvbGRlciA9ICJlLmcuIDQuMCI7IC8vIEhpbnQKICAgICAgICB0ZFJhdy5hcHBlbmRDaGlsZChpbnB1dFJhdyk7CgogICAgICAgIGNvbnN0IHRkS25vd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpOwogICAgICAgIGNvbnN0IGlucHV0S25vd24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgIGlucHV0S25vd24udHlwZSA9ICJudW1iZXIiOwogICAgICAgIGlucHV0S25vd24uc3RlcCA9ICJhbnkiOwogICAgICAgIGlucHV0S25vd24udmFsdWUgPSBrbm93bjsKICAgICAgICBpbnB1dEtub3duLnBsYWNlaG9sZGVyID0gImUuZy4gMTAwIjsgLy8gSGludAogICAgICAgIHRkS25vd24uYXBwZW5kQ2hpbGQoaW5wdXRLbm93bik7CgogICAgICAgIGNvbnN0IHRkQWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTsKICAgICAgICBjb25zdCBidG5EZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJidXR0b24iKTsKICAgICAgICBidG5EZWwudGV4dENvbnRlbnQgPSAi4pyVIjsKICAgICAgICBidG5EZWwuY2xhc3NOYW1lID0gInNlY29uZGFyeSBkYW5nZXIiOwogICAgICAgIGJ0bkRlbC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICAgICAgdHIucmVtb3ZlKCk7CiAgICAgICAgICAgIHJlbnVtYmVyUm93cygpOwogICAgICAgIH0pOwogICAgICAgIHRkQWN0aW9uLmFwcGVuZENoaWxkKGJ0bkRlbCk7CgogICAgICAgIHRyLmFwcGVuZENoaWxkKHRkSW5kZXgpOwogICAgICAgIHRyLmFwcGVuZENoaWxkKHRkUmF3KTsKICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZEtub3duKTsKICAgICAgICB0ci5hcHBlbmRDaGlsZCh0ZEFjdGlvbik7CiAgICAgICAgY2FsaWJUYm9keS5hcHBlbmRDaGlsZCh0cik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVudW1iZXJSb3dzKCkgewogICAgICAgIFsuLi5jYWxpYlRib2R5LmNoaWxkcmVuXS5mb3JFYWNoKCh0ciwgaWR4KSA9PiB7CiAgICAgICAgICAgIHRyLmZpcnN0Q2hpbGQudGV4dENvbnRlbnQgPSBpZHggKyAxOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyUm93cygpIHsKICAgICAgICBjYWxpYlRib2R5LmlubmVySFRNTCA9ICIiOwogICAgICAgIGxhc3RDYWxjID0gbnVsbDsKICAgICAgICBjYWxjU2NhbGluZ0VsLnRleHRDb250ZW50ID0gIuKAkyI7CiAgICAgICAgY2FsY09mZnNldEVsLnRleHRDb250ZW50ID0gIuKAkyI7CiAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSAi4oCTIjsKICAgICAgICBjYWxjUjJFbC5jbGFzc05hbWUgPSAiIjsgLy8gUmVzZXQgY29sb3JzCiAgICAgICAgYnRuQXBwbHkuZGlzYWJsZWQgPSB0cnVlOwogICAgfQoKICAgIC8vIFN0YXJ0IHdpdGggMyBlbXB0eSByb3dzIGJ5IGRlZmF1bHQKICAgIGZvciAobGV0IGkgPSAwOyBpIDwzOyBpKyspIGFkZFJvdygpOyAvLyAtLS0gRkVBVFVSRSAzOiBJTlBVVCBWQUxJREFUSU9OIC0tLSBmdW5jdGlvbiBjb2xsZWN0RGF0YXBvaW50cygpIHsgY29uc3QgcG9pbnRzID0gW107IGxldCBlcnJvckZvdW5kID0gZmFsc2U7IFsuLi5jYWxpYlRib2R5LmNoaWxkcmVuXS5mb3JFYWNoKHRyID0+IHsKICAgICAgICAgICAgY29uc3QgcmF3SW5wdXQgPSB0ci5jaGlsZHJlblsxXS5xdWVyeVNlbGVjdG9yKCJpbnB1dCIpOwogICAgICAgICAgICBjb25zdCBrbm93bklucHV0ID0gdHIuY2hpbGRyZW5bMl0ucXVlcnlTZWxlY3RvcigiaW5wdXQiKTsKCiAgICAgICAgICAgIGNvbnN0IHJhd1ZhbCA9IHBhcnNlRmxvYXQocmF3SW5wdXQudmFsdWUpOwogICAgICAgICAgICBjb25zdCBrbm93blZhbCA9IHBhcnNlRmxvYXQoa25vd25JbnB1dC52YWx1ZSk7CgogICAgICAgICAgICAvLyBSZXNldCBzdHlsZXMKICAgICAgICAgICAgcmF3SW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAiIjsKICAgICAgICAgICAga25vd25JbnB1dC5zdHlsZS5ib3JkZXJDb2xvciA9ICIiOwoKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIEVtcHR5IFJvd3MgKElnbm9yZSBpZiBCT1RIIGFyZSBlbXB0eSkKICAgICAgICAgICAgaWYgKHJhd0lucHV0LnZhbHVlLnRyaW0oKSA9PT0gIiIgJiYga25vd25JbnB1dC52YWx1ZS50cmltKCkgPT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8vIFNraXAgZW1wdHkgcm93CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGZvciBQYXJ0aWFsIFJvd3MgKE9uZSBlbXB0eSwgb25lIGZ1bGwpCiAgICAgICAgICAgIGlmIChpc05hTihyYXdWYWwpIHx8IGlzTmFOKGtub3duVmFsKSkgewogICAgICAgICAgICAgICAgZXJyb3JGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoaXNOYU4ocmF3VmFsKSkgcmF3SW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAicmVkIjsKICAgICAgICAgICAgICAgIGlmIChpc05hTihrbm93blZhbCkpIGtub3duSW5wdXQuc3R5bGUuYm9yZGVyQ29sb3IgPSAicmVkIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBvaW50cy5wdXNoKHt4OiByYXdWYWwsIHk6IGtub3duVmFsfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKGVycm9yRm91bmQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGlucHV0OiBTb21lIHJvd3MgYXJlIGluY29tcGxldGUuIFBsZWFzZSBmaWxsIGJvdGggdmFsdWVzIG9yIGRlbGV0ZSB0aGUgcm93LiIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHBvaW50czsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21wdXRlTGluZWFyUmVncmVzc2lvbihwb2ludHMpIHsKICAgICAgICBjb25zdCBuID0gcG9pbnRzLmxlbmd0aDsKICAgICAgICBpZiAobiA8MykgeyB0aHJvdyBuZXcgRXJyb3IoIkF0IGxlYXN0IDMgdmFsaWQgZGF0YSBwb2ludHMgYXJlIHJlcXVpcmVkLiIpOyB9IGxldCBzdW1YID0gMCwgc3VtWSA9IDAsIHN1bVhZID0gMCwgc3VtWDIgPSAwOyBmb3IgKGNvbnN0IHAgb2YgcG9pbnRzKSB7IHN1bVggKz0gcC54OyBzdW1ZICs9IHAueTsgc3VtWFkgKz0gcC54ICogcC55OyBzdW1YMiArPSBwLnggKiBwLng7IH0gY29uc3QgbWVhblkgPSBzdW1ZIC8gbjsgY29uc3QgZGVub21pbmF0b3IgPSBuICogc3VtWDIgLSBzdW1YICogc3VtWDsgLy8gU2FmZXR5OiBQcmV2ZW50IGRpdmlzaW9uIGJ5IHplcm8gKGFsbCBYIHZhbHVlcyBhcmUgdGhlIHNhbWUpIGlmIChNYXRoLmFicyhkZW5vbWluYXRvcikgPDFlLTkpIHsgdGhyb3cgbmV3IEVycm9yKCJEYXRhIEVycm9yOiBBbGwgJ1NlbnNvciBPdXRwdXQnIHZhbHVlcyBhcmUgaWRlbnRpY2FsLiBDYW5ub3QgY2FsY3VsYXRlIHNsb3BlLiIpOyB9IGNvbnN0IHNsb3BlID0gKG4gKiBzdW1YWSAtIHN1bVggKiBzdW1ZKSAvIGRlbm9taW5hdG9yOyBjb25zdCBvZmZzZXQgPSAoc3VtWSAtIHNsb3BlICogc3VtWCkgLyBuOyAvLyBDb21wdXRlIFLCsiBsZXQgc3NUb3QgPSAwLCBzc1JlcyA9IDA7IGZvciAoY29uc3QgcCBvZiBwb2ludHMpIHsgY29uc3QgeUhhdCA9IHNsb3BlICogcC54ICsgb2Zmc2V0OyBzc1RvdCArPSAocC55IC0gbWVhblkpICoqIDI7IHNzUmVzICs9IChwLnkgLSB5SGF0KSAqKiAyOyB9IGNvbnN0IHIyID0gKHNzVG90ID09PSAwKSA\/IDEgOiAxIC0gc3NSZXMgLyBzc1RvdDsgcmV0dXJuIHtzbG9wZSwgb2Zmc2V0LCByMn07IH0gLy8gLS0tIENBTENVTEFURSBCVVRUT04gLS0tIGJ0bkNhbGMuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiB7CiAgICAgICAgLy8gU2FmZXR5IGNoZWNrIHRvIHByZXZlbnQgb2ZmbGluZSBjYWxjdWxhdGlvbnMKICAgICAgICBpZiAoIW1vZGJ1cyB8fCAhc2VsZWN0ZWRTZW5zb3IpIHsKICAgICAgICAgICAgYWxlcnQoIkVycm9yOiBQbGVhc2UgY29ubmVjdCB0byBhIHNlbnNvciBiZWZvcmUgY2FsY3VsYXRpbmcuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3QgcG9pbnRzID0gY29sbGVjdERhdGFwb2ludHMoKTsKCiAgICAgICAgICAgIC8vIDEuIENhbGN1bGF0ZSB0aGUgcmVncmVzc2lvbiAoVGhlIERFTFRBKSBiYXNlZCBvbiB0aGUgVUkgdGFibGUKICAgICAgICAgICAgY29uc3Qge3Nsb3BlLCBvZmZzZXQsIHIyfSA9IGNvbXB1dGVMaW5lYXJSZWdyZXNzaW9uKHBvaW50cyk7CgogICAgICAgICAgICAvLyAyLiBGZXRjaCB0aGUgQ1VSUkVOVCBjYWxpYnJhdGlvbiB0aGUgdXNlciBoYXMgZW50ZXJlZC9jb25maXJtZWQgaW4gdGhlIFVJCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTY2FsZSA9IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGliLWN1cnJlbnQtc2NhbGUiKS52YWx1ZSkgfHwgMS4wOwogICAgICAgICAgICBjb25zdCBjdXJyZW50T2Zmc2V0ID0gcGFyc2VGbG9hdChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2FsaWItY3VycmVudC1vZmZzZXQiKS52YWx1ZSkgfHwgMC4wOwoKICAgICAgICAgICAgLy8gMy4gVEhFIE1BR0lDIE1BVEg6IE1lcmdlIHRoZSBjYWxjdWxhdGVkIGRlbHRhIHdpdGggdGhlIGN1cnJlbnQgdmFsdWVzCiAgICAgICAgICAgIGNvbnN0IGZpbmFsU2NhbGUgPSBzbG9wZSAqIGN1cnJlbnRTY2FsZTsKICAgICAgICAgICAgY29uc3QgZmluYWxPZmZzZXQgPSAoc2xvcGUgKiBjdXJyZW50T2Zmc2V0KSArIG9mZnNldDsKCiAgICAgICAgICAgIGxhc3RDYWxjID0ge3NjYWxpbmc6IGZpbmFsU2NhbGUsIG9mZnNldDogZmluYWxPZmZzZXQsIHIyfTsKCiAgICAgICAgICAgIC8vIDQuIEZJTEwgSU5QVVRTIChEaXNwbGF5aW5nIGFsbCAzIHN0YXRlcykKICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNhbGMtZGVsdGEtc2NhbGUiKS52YWx1ZSA9IHNsb3BlLnRvRml4ZWQoNik7CiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjYWxjLWRlbHRhLW9mZnNldCIpLnZhbHVlID0gb2Zmc2V0LnRvRml4ZWQoNik7CgogICAgICAgICAgICBjYWxjU2NhbGluZ0VsLnZhbHVlID0gZmluYWxTY2FsZS50b0ZpeGVkKDYpOwogICAgICAgICAgICBjYWxjT2Zmc2V0RWwudmFsdWUgPSBmaW5hbE9mZnNldC50b0ZpeGVkKDYpOwogICAgICAgICAgICBjYWxjUjJFbC50ZXh0Q29udGVudCA9IHIyLnRvRml4ZWQoNCk7CgogICAgICAgICAgICAvLyA1LiBMT0NLIE5FVyBJTlBVVFMgKFJlYWQtb25seSB1bmxlc3MgJ01hbnVhbCBFZGl0JyBpcyBjbGlja2VkKQogICAgICAgICAgICBjYWxjU2NhbGluZ0VsLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FsY09mZnNldEVsLmRpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2YzZjRmNiI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2YzZjRmNiI7CgogICAgICAgICAgICAvLyA2LiBSMiBGZWVkYmFjawogICAgICAgICAgICBjYWxjUjJFbC5jbGFzc05hbWUgPSAiIjsKICAgICAgICAgICAgaWYgKHIyID49IDAuMykgewogICAgICAgICAgICAgICAgY2FsY1IyRWwuY2xhc3NMaXN0LmFkZCgidmFsLWdvb2QiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhgQ2FsaWJyYXRpb24gY2FsY3VsYXRlZDogQWNjZXB0YWJsZSBmaXQgKFLCsiA9ICR7cjIudG9GaXhlZCg0KX0pYCwgInN1Y2Nlc3MiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNhbGNSMkVsLmNsYXNzTGlzdC5hZGQoInZhbC1iYWQiKTsKICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhgQ2FsaWJyYXRpb24gY2FsY3VsYXRlZDogTG93IGFjY3VyYWN5IChSwrIgPDAuMykuIENoZWNrIGRhdGEgcG9pbnRzLmAsICJlcnJvciIpOyB9IC8vIDcuIEVuYWJsZSBXcml0ZSBidG5BcHBseS5kaXNhYmxlZCA9IGZhbHNlOyBidG5BcHBseS5zdHlsZS5vcGFjaXR5ID0gIjEuMCI7IH0gY2F0Y2ggKGVycikgeyBzaG93RXJyb3IoZXJyLm1lc3NhZ2UpOyB9IH0pOyAvLyAtLS0gRkVBVFVSRTogTUFOVUFMIEVESVQgVE9HR0xFIC0tLSBidG5FbmFibGVFZGl0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gewogICAgICAgIC8vIDEuIEFzayBmb3IgcGVybWlzc2lvbiAoU2FmZXR5KQogICAgICAgIGNvbnN0IGNvbmZpcm1FZGl0ID0gY29uZmlybSgKICAgICAgICAgICAgIk1BTlVBTCBPVkVSUklERVxuXG4iICsKICAgICAgICAgICAgIkRvIHlvdSB3YW50IHRvIG1hbnVhbGx5IGVudGVyIFNjYWxpbmcgYW5kIE9mZnNldCB2YWx1ZXM\/XG4iICsKICAgICAgICAgICAgIlRoaXMgYnlwYXNzZXMgdGhlIGNhbGN1bGF0aW9uIHN0ZXAuIgogICAgICAgICk7CgogICAgICAgIGlmIChjb25maXJtRWRpdCkgewogICAgICAgICAgICAvLyAyLiBVbmxvY2sgdGhlIElucHV0cyBzbyB1c2VyIGNhbiB0eXBlCiAgICAgICAgICAgIGNhbGNTY2FsaW5nRWwuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgY2FsY09mZnNldEVsLmRpc2FibGVkID0gZmFsc2U7CgogICAgICAgICAgICAvLyBWaXN1YWwgZmVlZGJhY2sKICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2ZmZmZmZiI7CiAgICAgICAgICAgIGNhbGNPZmZzZXRFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAiI2ZmZmZmZiI7CiAgICAgICAgICAgIGNhbGNTY2FsaW5nRWwuZm9jdXMoKTsKCiAgICAgICAgICAgIC8vIDMuIElNUE9SVEFOVDogRW5hYmxlIHRoZSBXcml0ZSBidXR0b24gaW1tZWRpYXRlbHkKICAgICAgICAgICAgLy8gKEV2ZW4gaWYgbm8gY2FsY3VsYXRpb24gd2FzIGRvbmUpCiAgICAgICAgICAgIGJ0bkFwcGx5LmRpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIGJ0bkFwcGx5LnN0eWxlLm9wYWNpdHkgPSAiMS4wIjsKCiAgICAgICAgICAgIC8vIDQuIFVwZGF0ZSBVSSB0byBzaG93IHdlIGFyZSBpbiBtYW51YWwgbW9kZQogICAgICAgICAgICBpZiAobGFzdENhbGMpIGxhc3RDYWxjLnIyID0gbnVsbDsgLy8gQ2xlYXIgb2xkIFIyIGlmIGl0IGV4aXN0ZWQKICAgICAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSAiTWFudWFsIElucHV0IjsKICAgICAgICB9CiAgICB9KTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIDUuIEV4cG9ydCAvIEltcG9ydCBjYWxpYnJhdGlvbiBKU09OCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIGNvbnN0IGJ0bkV4cG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidG4tZXhwb3J0Iik7CiAgICBjb25zdCBidG5JbXBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnRuLWltcG9ydCIpOwogICAgY29uc3QgZmlsZUltcG9ydCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaWxlLWltcG9ydCIpOwoKICAgIGJ0bkV4cG9ydC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgICBjb25zdCBwb2ludHMgPSBjb2xsZWN0RGF0YXBvaW50cygpOwoKICAgICAgICAgICAgLy8gR2F0aGVyIGRhdGEKICAgICAgICAgICAgY29uc3Qgc2VyaWFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImluZm8tc2VyaWFsIikudmFsdWUgfHwgIlVua25vd25TZXJpYWwiOwogICAgICAgICAgICBjb25zdCBmaXJtd2FyZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpbmZvLWZpcm13YXJlIikudmFsdWUgfHwgbnVsbDsKCiAgICAgICAgICAgIGNvbnN0IHBheWxvYWQgPSB7CiAgICAgICAgICAgICAgICBzZW5zb3JJZDogc2VsZWN0ZWRTZW5zb3IgPyBzZWxlY3RlZFNlbnNvci5pZCA6IG51bGwsCiAgICAgICAgICAgICAgICBzZXJpYWxOdW1iZXI6IHNlcmlhbCwKICAgICAgICAgICAgICAgIGZpcm13YXJlOiBmaXJtd2FyZSwKICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uOiBsYXN0Q2FsYyB8fCBudWxsLAogICAgICAgICAgICAgICAgZGF0YXBvaW50czogcG9pbnRzLAogICAgICAgICAgICAgICAgbWV0YTogewogICAgICAgICAgICAgICAgICAgIGV4cG9ydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICBhcHA6ICJBbWNvbkFwcCIsCiAgICAgICAgICAgICAgICAgICAgdmVyc2lvbjogIjEuMCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIC8vIEdlbmVyYXRlIFN0YW5kYXJkIEZpbGVuYW1lOiBBRV9jYWxpYnJhdGlvbiBwcm9maWxlX3NlcmlhbF95eW1tZGRfaGhtbQogICAgICAgICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICBjb25zdCB5eSA9IFN0cmluZyhub3cuZ2V0RnVsbFllYXIoKSkuc2xpY2UoLTIpOwogICAgICAgICAgICBjb25zdCBtbSA9IFN0cmluZyhub3cuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgICAgIGNvbnN0IGRkID0gU3RyaW5nKG5vdy5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgICAgIGNvbnN0IGhoID0gU3RyaW5nKG5vdy5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgICAgICBjb25zdCBtaW4gPSBTdHJpbmcobm93LmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKTsKCiAgICAgICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGAke3l5fSR7bW19JHtkZH1fJHtoaH0ke21pbn1gOwogICAgICAgICAgICBjb25zdCBmaWxlbmFtZSA9IGBBRV9jYWxpYnJhdGlvbiBwcm9maWxlXyR7c2VyaWFsfV8ke3RpbWVzdGFtcH0uanNvbmA7CgogICAgICAgICAgICAvLyBUcmlnZ2VyIERvd25sb2FkCiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkocGF5bG9hZCwgbnVsbCwgMildLCB7dHlwZTogImFwcGxpY2F0aW9uL2pzb24ifSk7CiAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7CiAgICAgICAgICAgIGEuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7CiAgICAgICAgICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTsKICAgICAgICAgICAgYS5jbGljaygpOwoKICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGBFeHBvcnRlZDogJHtmaWxlbmFtZX1gLCAic3VjY2VzcyIpOwoKICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgc2hvd0Vycm9yKCJFeHBvcnQgZmFpbGVkOiAiICsgZXJyLm1lc3NhZ2UpOwogICAgICAgIH0KICAgIH0pOwogICAgYnRuSW1wb3J0LmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gZmlsZUltcG9ydC5jbGljaygpKTsKCgogICAgZmlsZUltcG9ydC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLCAoZSkgPT4gewogICAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTsKICAgICAgICBpZiAoIWZpbGUpIHJldHVybjsKICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpOwogICAgICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShyZWFkZXIucmVzdWx0KTsKICAgICAgICAgICAgICAgIGlmIChkYXRhLnNlbnNvcklkKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vuc29yID0gU0VOU09SX1JFR0lTVFJZLmZpbmQocyA9PiBzLmlkID09PSBkYXRhLnNlbnNvcklkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2Vuc29yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhcmQgPSBzZW5zb3JHcmlkLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXNlbnNvci1pZD0iJHtzZW5zb3IuaWR9Il1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhcmQpIGNhcmQuY2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGVhclJvd3MoKTsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEuZGF0YXBvaW50cykpIHsKICAgICAgICAgICAgICAgICAgICBkYXRhLmRhdGFwb2ludHMuZm9yRWFjaChwID0+IGFkZFJvdyhwLngsIHAueSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRhdGEuY2FsaWJyYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBsYXN0Q2FsYyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGluZzogZGF0YS5jYWxpYnJhdGlvbi5zY2FsaW5nLAogICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ6IGRhdGEuY2FsaWJyYXRpb24ub2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICByMjogZGF0YS5jYWxpYnJhdGlvbi5yMgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY2FsY1NjYWxpbmdFbC50ZXh0Q29udGVudCA9IGRhdGEuY2FsaWJyYXRpb24uc2NhbGluZy50b0ZpeGVkKDYpOwogICAgICAgICAgICAgICAgICAgIGNhbGNPZmZzZXRFbC50ZXh0Q29udGVudCA9IGRhdGEuY2FsaWJyYXRpb24ub2Zmc2V0LnRvRml4ZWQoNik7CiAgICAgICAgICAgICAgICAgICAgY2FsY1IyRWwudGV4dENvbnRlbnQgPSBkYXRhLmNhbGlicmF0aW9uLnIyLnRvRml4ZWQoNCk7CiAgICAgICAgICAgICAgICAgICAgYnRuQXBwbHkuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cygiQ2FsaWJyYXRpb24gcHJvZmlsZSBpbXBvcnRlZCIsICJzdWNjZXNzIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgc2hvd0Vycm9yKCJFcnJvciByZWFkaW5nIEpTT046ICIgKyBlcnIubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpOwogICAgfSk7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyA2LiBEdW1teSBzZW5zb3IgZm9yIG9mZmxpbmUgZGVidWdnaW5nIChubyBoYXJkd2FyZSBuZWVkZWQpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICB3aW5kb3cuZW5hYmxlRHVtbXlTZW5zb3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gbWFrZSBzdXJlIGEgc2Vuc29yIGlzIHNlbGVjdGVkCiAgICAgICAgc2VsZWN0ZWRTZW5zb3IgPSBTRU5TT1JfUkVHSVNUUllbMF07CgogICAgICAgIC8vIHNpbXBsZSBpbi1tZW1vcnkgInNlbnNvciIgc3RhdGUKICAgICAgICBjb25zdCBkdW1teSA9IHsKICAgICAgICAgICAgc2VyaWFsOiA1NDI0LAogICAgICAgICAgICBmaXJtd2FyZTogMjUwNiwKICAgICAgICAgICAgLy8gZGVmYXVsdCBvZmZzZXQ9MCwgc2NhbGluZz0wLjAwMDEgZW5jb2RlZCBsaWtlIGluIHRoZSBtYW51YWwKICAgICAgICAgICAgTzogMCwgT1M6IDAsIE9QOiAwLCBPTjogNCwKICAgICAgICAgICAgUzogMSwgU1M6IDAsIFNQOiAwLCBTTjogNAogICAgICAgIH07CgogICAgICAgIC8vIGZha2UgbW9kYnVzIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIHNhbWUgbWV0aG9kcwogICAgICAgIG1vZGJ1cyA9IHsKICAgICAgICAgICAgYXN5bmMgcmVhZElucHV0UmVnaXN0ZXJzKHN0YXJ0LCBxdHkpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCJbRFVNTVldIHJlYWRJbnB1dFJlZ2lzdGVycyIsIHtzdGFydCwgcXR5fSk7CiAgICAgICAgICAgICAgICAvLyBqdXN0IHJldHVybiBzb21ldGhpbmcgcGxhdXNpYmxlCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyAwfWBdOiAxMjM0LCAgICAgICAgICAvLyBtZWFzdXJlbWVudAogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyAxfWBdOiAyMDAwLCAgICAgICAgICAvLyB0ZW1wCiAgICAgICAgICAgICAgICAgICAgW2ByZWdfJHtzdGFydCArIDJ9YF06IDUwMCwgICAgICAgICAgIC8vIGh1bWlkaXR5CiAgICAgICAgICAgICAgICAgICAgW2ByZWdfJHtzdGFydCArIDN9YF06IGR1bW15LnNlcmlhbCwgIC8vIHNlcmlhbAogICAgICAgICAgICAgICAgICAgIFtgcmVnXyR7c3RhcnQgKyA0fWBdOiBkdW1teS5maXJtd2FyZSAvLyBmaXJtd2FyZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXN5bmMgcmVhZFJlZ2lzdGVycyhzdGFydCwgcXR5KSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiW0RVTU1ZXSByZWFkUmVnaXN0ZXJzIiwge3N0YXJ0LCBxdHl9KTsKICAgICAgICAgICAgICAgIGNvbnN0IG1hcCA9IHsKICAgICAgICAgICAgICAgICAgICAwOiBkdW1teS5PLAogICAgICAgICAgICAgICAgICAgIDE6IGR1bW15Lk9TLAogICAgICAgICAgICAgICAgICAgIDI6IGR1bW15Lk9QLAogICAgICAgICAgICAgICAgICAgIDM6IGR1bW15Lk9OLAogICAgICAgICAgICAgICAgICAgIDQ6IGR1bW15LlMsCiAgICAgICAgICAgICAgICAgICAgNTogZHVtbXkuU1MsCiAgICAgICAgICAgICAgICAgICAgNjogZHVtbXkuU1AsCiAgICAgICAgICAgICAgICAgICAgNzogZHVtbXkuU04KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB7fTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDxxdHk7IGkrKykgeyBvdXRbYHJlZ18ke3N0YXJ0ICsgaX1gXSA9IG1hcFtzdGFydCArIGldID8\/IDA7IH0gcmV0dXJuIG91dDsgfSwgYXN5bmMgd3JpdGVDYWxpYnJhdGlvbihzdGFydFJlZywgc2NhbGluZywgb2Zmc2V0KSB7IGNvbnNvbGUubG9nKCJbRFVNTVldIHdyaXRlQ2FsaWJyYXRpb24iLCB7c3RhcnRSZWcsIHNjYWxpbmcsIG9mZnNldH0pOyBjb25zdCBERUNJTUFMUyA9IDQ7IGNvbnN0IE1BWF9VMTYgPSA2NTUzNTsgLy8gZW5jb2RlIG9mZnNldCBjb25zdCBvZmZzZXRTaWduID0gb2Zmc2V0IDwwID8gMSA6IDA7IGNvbnN0IGFic09mZnNldCA9IE1hdGguYWJzKG9mZnNldCk7IGxldCBPID0gTWF0aC5yb3VuZChhYnNPZmZzZXQgKiBNYXRoLnBvdygxMCwgREVDSU1BTFMpKTsgaWYgKE8+IE1BWF9VMTYpIE8gPSBNQVhfVTE2OwogICAgICAgICAgICAgICAgY29uc3QgT1AgPSAwOwogICAgICAgICAgICAgICAgY29uc3QgT04gPSBERUNJTUFMUzsKCiAgICAgICAgICAgICAgICAvLyBlbmNvZGUgc2NhbGluZwogICAgICAgICAgICAgICAgY29uc3Qgc2NhbGVTaWduID0gc2NhbGluZyA8MCA\/IDEgOiAwOyBjb25zdCBhYnNTY2FsZSA9IE1hdGguYWJzKHNjYWxpbmcpOyBsZXQgUyA9IE1hdGgucm91bmQoYWJzU2NhbGUgKiBNYXRoLnBvdygxMCwgREVDSU1BTFMpKTsgaWYgKFM+IE1BWF9VMTYpIFMgPSBNQVhfVTE2OwogICAgICAgICAgICAgICAgY29uc3QgU1AgPSAwOwogICAgICAgICAgICAgICAgY29uc3QgU04gPSBERUNJTUFMUzsKCiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgInNlbnNvciIgbWVtb3J5CiAgICAgICAgICAgICAgICBkdW1teS5PID0gTzsKICAgICAgICAgICAgICAgIGR1bW15Lk9TID0gb2Zmc2V0U2lnbjsKICAgICAgICAgICAgICAgIGR1bW15Lk9QID0gT1A7CiAgICAgICAgICAgICAgICBkdW1teS5PTiA9IE9OOwogICAgICAgICAgICAgICAgZHVtbXkuUyA9IFM7CiAgICAgICAgICAgICAgICBkdW1teS5TUyA9IHNjYWxlU2lnbjsKICAgICAgICAgICAgICAgIGR1bW15LlNQID0gU1A7CiAgICAgICAgICAgICAgICBkdW1teS5TTiA9IFNOOwoKICAgICAgICAgICAgICAgIC8vIHJldHVybiBub24tbnVsbCAib2siIGZyYW1lCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoWzEsIDE2LCAwLCBzdGFydFJlZywgMCwgOCwgMTYsIDBdKTsKICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIHVwZGF0ZVN0YXR1cygiRHVtbXkgc2Vuc29yIGVuYWJsZWQgKG5vIGhhcmR3YXJlKSIsICJzdWNjZXNzIik7CiAgICB9Owo8L3NjcmlwdD4KCjxmb290ZXI+CiAgICA8ZGl2IHN0eWxlPSJmb250LXNpemU6IDAuODVlbTsgY29sb3I6ICM4ODg7IG1hcmdpbi10b3A6IDFyZW07IHRleHQtYWxpZ246IHJpZ2h0OyBwYWRkaW5nOiAwLjVyZW0gMS41cmVtOyI+CiAgVmVyc2nDs246IDEuMi4wIHwgw5psdGltYSBhY3R1YWxpemFjacOzbjogTWFyem8gZGUgMjAyNgogICAgPC9kaXY+CjwvZm9vdGVyPgo8L2Rpdj4=[\/vc_raw_html][\/vc_column][\/vc_row][\/vc_section][vc_section disable_element=\u00bbyes\u00bb el_class=\u00bbborder-bottom uk-padding-large-top\u00bb][vc_row el_class=\u00bbuk-container uk-container-medium uk-margin-large\u00bb][vc_column][vc_custom_heading text=\u00bb-\u00bb font_container=\u00bbtag:h2|text_align:center\u00bb el_class=\u00bbttl-h2-center uk-margin-large\u00bb][vc_column_text el_class=\u00bbuk-margin-medium\u00bb] Descargar el Manual del usuario [\/vc_column_text][\/vc_column][\/vc_row][\/vc_section]<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"class_list":["post-29550","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %<\/title>\n<meta name=\"description\" content=\"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %\" \/>\n<meta property=\"og:description\" content=\"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/\" \/>\n<meta property=\"og:site_name\" content=\"AMCON Europe\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/AMCON.Europe.sro\" \/>\n<meta property=\"article:modified_time\" content=\"2026-05-20T15:42:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.amcon-eu.com\/wp-content\/uploads\/2025\/06\/AMCON-Europe_site-image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"33 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/\",\"url\":\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/\",\"name\":\"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %\",\"isPartOf\":{\"@id\":\"https:\/\/www.amcon-eu.com\/es\/#website\"},\"datePublished\":\"2026-04-23T11:00:12+00:00\",\"dateModified\":\"2026-05-20T15:42:03+00:00\",\"description\":\"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u30db\u30fc\u30e0\",\"item\":\"https:\/\/www.amcon-eu.com\/es\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.amcon-eu.com\/es\/#website\",\"url\":\"https:\/\/www.amcon-eu.com\/es\/\",\"name\":\"AMCON Europe\",\"description\":\"Convenient Sludge Dewatering\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.amcon-eu.com\/es\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %","description":"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/","og_locale":"es_ES","og_type":"article","og_title":"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %","og_description":"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.","og_url":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/","og_site_name":"AMCON Europe","article_publisher":"https:\/\/www.facebook.com\/AMCON.Europe.sro","article_modified_time":"2026-05-20T15:42:03+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/www.amcon-eu.com\/wp-content\/uploads\/2025\/06\/AMCON-Europe_site-image.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Tiempo de lectura":"33 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/","url":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/","name":"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT | %","isPartOf":{"@id":"https:\/\/www.amcon-eu.com\/es\/#website"},"datePublished":"2026-04-23T11:00:12+00:00","dateModified":"2026-05-20T15:42:03+00:00","description":"Calibra tu Sensor de sequedad de pasteles OAE-SCOUT en tu navegador. Con\u00e9ctate por USB, calcula nuevos ajustes y descarga el Manual del usuario oficial aqu\u00ed.","breadcrumb":{"@id":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.amcon-eu.com\/es\/herramienta-de-calibracion-de-sensores-oae-scout\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u30db\u30fc\u30e0","item":"https:\/\/www.amcon-eu.com\/es\/"},{"@type":"ListItem","position":2,"name":"Herramienta de calibraci\u00f3n de sensores OAE-SCOUT"}]},{"@type":"WebSite","@id":"https:\/\/www.amcon-eu.com\/es\/#website","url":"https:\/\/www.amcon-eu.com\/es\/","name":"AMCON Europe","description":"Convenient Sludge Dewatering","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.amcon-eu.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"}]}},"_links":{"self":[{"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/pages\/29550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/comments?post=29550"}],"version-history":[{"count":10,"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/pages\/29550\/revisions"}],"predecessor-version":[{"id":29766,"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/pages\/29550\/revisions\/29766"}],"wp:attachment":[{"href":"https:\/\/www.amcon-eu.com\/es\/wp-json\/wp\/v2\/media?parent=29550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}