Online PHP and Javascript Decoder decode hidden script to uncover its real functionality


PD9waHANCi8qKg0KICogQ29yZSBQbHVnaW4gQ2xhc3MNCiAqIEZpbGUgbsOgeSBuw6puIMSRxrDhu6NjIG3DoyBow7NhIGLhurFuZyBJb25DdWJlDQogKi8NCg0KaWYgKCFkZWZpbmVkKCdBQlNQQVRIJykpIGV4aXQ7DQoNCmNsYXNzIFZFR19Db3JlIHsNCiAgICANCiAgICBwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2UgPSBudWxsOw0KICAgIHByaXZhdGUgJGxpY2Vuc2UgPSBudWxsOw0KICAgIHByaXZhdGUgJGlzX2xpY2Vuc2VkID0gZmFsc2U7DQogICAgDQogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfaW5zdGFuY2UoKSB7DQogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokaW5zdGFuY2UpIHsNCiAgICAgICAgICAgIHNlbGY6OiRpbnN0YW5jZSA9IG5ldyBzZWxmKCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsNCiAgICB9DQogICAgDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCiAgICAgICAgJHRoaXMtPmxpY2Vuc2UgPSBWRUdfTGljZW5zZTo6Z2V0X2luc3RhbmNlKCk7DQogICAgICAgICR0aGlzLT5pc19saWNlbnNlZCA9ICR0aGlzLT5saWNlbnNlLT5pc192YWxpZCgpOw0KICAgICAgICANCiAgICAgICAgLy8gQWx3YXlzIGFkZCBhZG1pbiBtZW51DQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX21lbnUnLCBbJHRoaXMsICdhZGRfYWRtaW5fbWVudSddKTsNCiAgICAgICAgDQogICAgICAgIC8vIE9ubHkgaW5pdCBpZiBsaWNlbnNlZA0KICAgICAgICBpZiAoJHRoaXMtPmlzX2xpY2Vuc2VkKSB7DQogICAgICAgICAgICAkdGhpcy0+aW5pdF9wbHVnaW4oKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX25vdGljZXMnLCBbJHRoaXMsICdsaWNlbnNlX25vdGljZSddKTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICANCiAgICAvKioNCiAgICAgKiBJbml0aWFsaXplIHBsdWdpbiBmdW5jdGlvbmFsaXR5DQogICAgICovDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBpbml0X3BsdWdpbigpIHsNCiAgICAgICAgYWRkX2FjdGlvbignaW5pdCcsIFskdGhpcywgJ3JlZ2lzdGVyX3Bvc3RfdHlwZSddKTsNCiAgICAgICAgYWRkX2FjdGlvbignYWRkX21ldGFfYm94ZXMnLCBbJHRoaXMsICdhZGRfbWV0YV9ib3hlcyddKTsNCiAgICAgICAgYWRkX2FjdGlvbignc2F2ZV9wb3N0JywgWyR0aGlzLCAnc2F2ZV9tZXRhJ10pOw0KICAgICAgICBhZGRfYWN0aW9uKCd3cF9lbnF1ZXVlX3NjcmlwdHMnLCBbJHRoaXMsICdmcm9udGVuZF9hc3NldHMnXSk7DQogICAgICAgIGFkZF9hY3Rpb24oJ2FkbWluX2VucXVldWVfc2NyaXB0cycsIFskdGhpcywgJ2FkbWluX2Fzc2V0cyddKTsNCiAgICAgICAgYWRkX2FjdGlvbignd3BfZm9vdGVyJywgWyR0aGlzLCAncHJpbnRfbGlnaHRib3gnXSk7DQogICAgICAgIGFkZF9zaG9ydGNvZGUoJ3ZpZGVvX2dhbGxlcnknLCBbJHRoaXMsICdyZW5kZXJfZ2FsbGVyeSddKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRtaW4gbm90aWNlIGZvciB1bmxpY2Vuc2VkDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGxpY2Vuc2Vfbm90aWNlKCkgew0KICAgICAgICAkc2NyZWVuID0gZ2V0X2N1cnJlbnRfc2NyZWVuKCk7DQogICAgICAgIGlmICgkc2NyZWVuICYmICRzY3JlZW4tPmlkID09PSAnc2V0dGluZ3NfcGFnZV92ZWctbGljZW5zZScpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICA/Pg0KICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Ugbm90aWNlLWVycm9yIj4NCiAgICAgICAgICAgIDxwPg0KICAgICAgICAgICAgICAgIDxzdHJvbmc+SFRLIFZpZGVvIEVtYmVkIEdhbGxlcnk6PC9zdHJvbmc+IA0KICAgICAgICAgICAgICAgIFBsdWdpbiBjaMawYSDEkcaw4bujYyBrw61jaCBob+G6oXQuIA0KICAgICAgICAgICAgICAgIDxhIGhyZWY9Ijw/cGhwIGVjaG8gZXNjX3VybChhZG1pbl91cmwoJ29wdGlvbnMtZ2VuZXJhbC5waHA/cGFnZT12ZWctbGljZW5zZScpKTsgPz4iPk5o4bqtcCBsaWNlbnNlIGtleTwvYT4gDQogICAgICAgICAgICAgICAgxJHhu4Mgc+G7rSBk4bulbmcgxJHhuqd5IMSR4bunIHTDrW5oIG7Eg25nLg0KICAgICAgICAgICAgPC9wPg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPD9waHANCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRkIGFkbWluIG1lbnUNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX2FkbWluX21lbnUoKSB7DQogICAgICAgIGFkZF9vcHRpb25zX3BhZ2UoDQogICAgICAgICAgICAnSFRLIFZpZGVvIEdhbGxlcnkgTGljZW5zZScsDQogICAgICAgICAgICAnVkVHIExpY2Vuc2UnLA0KICAgICAgICAgICAgJ21hbmFnZV9vcHRpb25zJywNCiAgICAgICAgICAgICd2ZWctbGljZW5zZScsDQogICAgICAgICAgICBbJHRoaXMsICdyZW5kZXJfbGljZW5zZV9wYWdlJ10NCiAgICAgICAgKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVuZGVyIGxpY2Vuc2UgYWRtaW4gcGFnZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfbGljZW5zZV9wYWdlKCkgew0KICAgICAgICBpZiAoIWN1cnJlbnRfdXNlcl9jYW4oJ21hbmFnZV9vcHRpb25zJykpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJG1lc3NhZ2UgPSAnJzsNCiAgICAgICAgJG1zZ190eXBlID0gJyc7DQogICAgICAgIA0KICAgICAgICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uDQogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3ZlZ19hY3Rpb24nXSkgJiYgY2hlY2tfYWRtaW5fcmVmZXJlcigndmVnX2xpY2Vuc2VfYWN0aW9uJywgJ3ZlZ19ub25jZScpKSB7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgkX1BPU1RbJ3ZlZ19hY3Rpb24nXSA9PT0gJ2FjdGl2YXRlJyAmJiAhZW1wdHkoJF9QT1NUWyd2ZWdfbGljZW5zZV9rZXknXSkpIHsNCiAgICAgICAgICAgICAgICAkcmVzdWx0ID0gJHRoaXMtPmxpY2Vuc2UtPmFjdGl2YXRlKCRfUE9TVFsndmVnX2xpY2Vuc2Vfa2V5J10pOw0KICAgICAgICAgICAgICAgICRtZXNzYWdlID0gJHJlc3VsdFsnbWVzc2FnZSddOw0KICAgICAgICAgICAgICAgICRtc2dfdHlwZSA9ICRyZXN1bHRbJ3N1Y2Nlc3MnXSA/ICdzdWNjZXNzJyA6ICdlcnJvcic7DQogICAgICAgICAgICAgICAgJHRoaXMtPmlzX2xpY2Vuc2VkID0gJHJlc3VsdFsnc3VjY2VzcyddOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBpZiAoJF9QT1NUWyd2ZWdfYWN0aW9uJ10gPT09ICdkZWFjdGl2YXRlJykgew0KICAgICAgICAgICAgICAgICRyZXN1bHQgPSAkdGhpcy0+bGljZW5zZS0+ZGVhY3RpdmF0ZSgpOw0KICAgICAgICAgICAgICAgICRtZXNzYWdlID0gJHJlc3VsdFsnbWVzc2FnZSddOw0KICAgICAgICAgICAgICAgICRtc2dfdHlwZSA9ICd3YXJuaW5nJzsNCiAgICAgICAgICAgICAgICAkdGhpcy0+aXNfbGljZW5zZWQgPSBmYWxzZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGRvbWFpbiA9ICR0aGlzLT5saWNlbnNlLT5nZXRfY3VycmVudF9kb21haW4oKTsNCiAgICAgICAgJGxpY2Vuc2Vfa2V5ID0gJHRoaXMtPmxpY2Vuc2UtPmdldF9saWNlbnNlX2tleSgpOw0KICAgICAgICAkaXNfYWN0aXZlID0gJHRoaXMtPmxpY2Vuc2UtPmlzX3ZhbGlkKCk7DQogICAgICAgIA0KICAgICAgICA/Pg0KICAgICAgICA8ZGl2IGNsYXNzPSJ3cmFwIj4NCiAgICAgICAgICAgIDxoMT7wn46sIEhUSyBWaWRlbyBFbWJlZCBHYWxsZXJ5PC9oMT4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPD9waHAgaWYgKCRtZXNzYWdlKTogPz4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJub3RpY2Ugbm90aWNlLTw/cGhwIGVjaG8gZXNjX2F0dHIoJG1zZ190eXBlKTsgPz4gaXMtZGlzbWlzc2libGUiPg0KICAgICAgICAgICAgICAgICAgICA8cD48P3BocCBlY2hvIGVzY19odG1sKCRtZXNzYWdlKTsgPz48L3A+DQogICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBnYXA6MjBweDsgZmxleC13cmFwOndyYXA7IG1hcmdpbi10b3A6MjBweDsiPg0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIDwhLS0gTGljZW5zZSBCb3ggLS0+DQogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZmZmOyBwYWRkaW5nOjI1cHg7IGJvcmRlcjoxcHggc29saWQgI2NjZDBkNDsgYm9yZGVyLXJhZGl1czo4cHg7IGZsZXg6MTsgbWluLXdpZHRoOjM1MHB4OyBtYXgtd2lkdGg6NTAwcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgPGgyIHN0eWxlPSJtYXJnaW4tdG9wOjA7IGJvcmRlci1ib3R0b206MXB4IHNvbGlkICNlZWU7IHBhZGRpbmctYm90dG9tOjEwcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIPCflJAgVGjDtG5nIHRpbiBMaWNlbnNlDQogICAgICAgICAgICAgICAgICAgIDwvaDI+DQogICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9ImZvcm0tdGFibGUiIHN0eWxlPSJtYXJnaW46MDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT0id2lkdGg6MTIwcHg7Ij5Eb21haW46PC90aD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PGNvZGUgc3R5bGU9ImJhY2tncm91bmQ6I2YwZjBmMTsgcGFkZGluZzo1cHggMTBweDsiPjw/cGhwIGVjaG8gZXNjX2h0bWwoJGRvbWFpbik7ID8+PC9jb2RlPjwvdGQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5UcuG6oW5nIHRow6FpOjwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJGlzX2FjdGl2ZSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6IzQ2YjQ1MDsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1zaXplOjE0cHg7Ij7inJMgxJDDoyBrw61jaCBob+G6oXQ8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6I2RjMzIzMjsgZm9udC13ZWlnaHQ6Ym9sZDsgZm9udC1zaXplOjE0cHg7Ij7inJcgQ2jGsGEga8OtY2ggaG/huqF0PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+UGhpw6puIGLhuqNuOjwvdGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxjb2RlPjw/cGhwIGVjaG8gZXNjX2h0bWwoVkVHX1ZFUlNJT04pOyA/PjwvY29kZT48L3RkPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4NCiAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgIDxociBzdHlsZT0ibWFyZ2luOjIwcHggMDsiPg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIHdwX25vbmNlX2ZpZWxkKCd2ZWdfbGljZW5zZV9hY3Rpb24nLCAndmVnX25vbmNlJyk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW4tYm90dG9tOjEwcHg7Ij48c3Ryb25nPkxpY2Vuc2UgS2V5Ojwvc3Ryb25nPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2ZWdfbGljZW5zZV9rZXkiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSI8P3BocCBlY2hvIGVzY19hdHRyKCRsaWNlbnNlX2tleSk7ID8+Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJOaOG6rXAgbGljZW5zZSBrZXkgY+G7p2EgYuG6oW4uLi4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9IndpZHRoOjEwMCU7IHBhZGRpbmc6MTBweDsgZm9udC1zaXplOjE0cHg7IGJvcmRlci1yYWRpdXM6NHB4OyBib3JkZXI6MXB4IHNvbGlkICM4YzhmOTQ7Ig0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVjaG8gJGlzX2FjdGl2ZSA/ICdyZWFkb25seScgOiAnJzsgPz4+DQogICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9Im1hcmdpbi10b3A6MTVweDsgZGlzcGxheTpmbGV4OyBnYXA6MTBweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGlmICghJGlzX2FjdGl2ZSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJ2ZWdfYWN0aW9uIiB2YWx1ZT0iYWN0aXZhdGUiIGNsYXNzPSJidXR0b24gYnV0dG9uLXByaW1hcnkgYnV0dG9uLWxhcmdlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIPCfmoAgS8OtY2ggaG/huqF0IExpY2Vuc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIG5hbWU9InZlZ19hY3Rpb24iIHZhbHVlPSJkZWFjdGl2YXRlIiBjbGFzcz0iYnV0dG9uIGJ1dHRvbi1zZWNvbmRhcnkiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2xpY2s9InJldHVybiBjb25maXJtKCdC4bqhbiBjw7MgY2jhuq9jIG114buRbiBo4buneSBrw61jaCBob+G6oXQgbGljZW5zZT8nKTsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSOG7p3kga8OtY2ggaG/huqF0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8IS0tIEd1aWRlIEJveCAtLT4NCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmOGY5ZmE7IHBhZGRpbmc6MjVweDsgYm9yZGVyOjFweCBzb2xpZCAjY2NkMGQ0OyBib3JkZXItcmFkaXVzOjhweDsgZmxleDoxOyBtaW4td2lkdGg6MzUwcHg7IG1heC13aWR0aDo1MDBweDsiPg0KICAgICAgICAgICAgICAgICAgICA8aDIgc3R5bGU9Im1hcmdpbi10b3A6MDsgYm9yZGVyLWJvdHRvbToxcHggc29saWQgI2RkZDsgcGFkZGluZy1ib3R0b206MTBweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAg8J+TliBIxrDhu5tuZyBk4bqrbiBz4butIGThu6VuZw0KICAgICAgICAgICAgICAgICAgICA8L2gyPg0KICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpc19hY3RpdmUpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGg0PlNob3J0Y29kZTo8L2g0Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPGNvZGUgc3R5bGU9ImRpc3BsYXk6YmxvY2s7IGJhY2tncm91bmQ6I2ZmZjsgcGFkZGluZzoxMHB4OyBib3JkZXItcmFkaXVzOjRweDsiPlt2aWRlb19nYWxsZXJ5IGNvbHVtbnM9IjQiXTwvY29kZT4NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW4tdG9wOjE1cHg7Ij5UaGFtIHPhu5E6PC9oND4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48Y29kZT5jb2x1bW5zPC9jb2RlPiAtIFPhu5EgY+G7mXQgKDEtNCksIG3hurdjIMSR4buLbmg6IDQ8L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgPGg0IHN0eWxlPSJtYXJnaW4tdG9wOjE1cHg7Ij5MaW5rIHZpZGVvIGjhu5cgdHLhu6M6PC9oND4NCiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBzdHlsZT0ibWFyZ2luLWxlZnQ6MjBweDsgZm9udC1zaXplOjEzcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+WW91VHViZTogeW91dHViZS5jb20vd2F0Y2g/dj0uLi48L2xpPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5Zb3VUdWJlIFNob3J0czogeW91dHViZS5jb20vc2hvcnRzLy4uLjwvbGk+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPlZpZGVvIHRy4buxYyB0aeG6v3A6IC5tcDQsIC53ZWJtPC9saT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+DQogICAgICAgICAgICAgICAgICAgIDw/cGhwIGVsc2U6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJiYWNrZ3JvdW5kOiNmZmYzY2Q7IHBhZGRpbmc6MTVweDsgYm9yZGVyLXJhZGl1czo0cHg7IGJvcmRlci1sZWZ0OjRweCBzb2xpZCAjZmZjMTA3OyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjowOyI+PHN0cm9uZz7imqDvuI8gQ+G6p24ga8OtY2ggaG/huqF0IGxpY2Vuc2U8L3N0cm9uZz48L3A+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjoxMHB4IDAgMDsiPlZ1aSBsw7JuZyBuaOG6rXAgbGljZW5zZSBrZXkgxJHhu4Mgc+G7rSBk4bulbmcgcGx1Z2luLjwvcD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICA8aDQgc3R5bGU9Im1hcmdpbi10b3A6MjBweDsiPk11YSBsaWNlbnNlIHThuqFpOjwvaDQ+DQogICAgICAgICAgICAgICAgICAgICAgICA8cD48YSBocmVmPSJodHRwczovL2hvYW5ndGhpZW5raW0udm4iIHRhcmdldD0iX2JsYW5rIj5odHRwczovL2hvYW5ndGhpZW5raW0udm48L2E+PC9wPg0KICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgDQogICAgICAgICAgICA8IS0tIENvbnRhY3QgQm94IC0tPg0KICAgICAgICAgICAgPGRpdiBzdHlsZT0iYmFja2dyb3VuZDojZTdmM2ZmOyBwYWRkaW5nOjIwcHg7IGJvcmRlcjoxcHggc29saWQgIzAwNzNhYTsgYm9yZGVyLXJhZGl1czo4cHg7IG1hcmdpbi10b3A6MjBweDsgbWF4LXdpZHRoOjEwMCU7Ij4NCiAgICAgICAgICAgICAgICA8aDMgc3R5bGU9Im1hcmdpbi10b3A6MDsgY29sb3I6IzAwNzNhYTsiPvCfk54gVGjDtG5nIHRpbiBsacOqbiBo4buHICYgaOG7lyB0cuG7ozwvaDM+DQogICAgICAgICAgICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTpmbGV4OyBnYXA6MzBweDsgZmxleC13cmFwOndyYXA7Ij4NCiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjowOyI+PHN0cm9uZz5XZWJzaXRlOjwvc3Ryb25nPiA8YSBocmVmPSJodHRwczovL2hvYW5ndGhpZW5raW0udm4iIHRhcmdldD0iX2JsYW5rIj5ob2FuZ3RoaWVua2ltLnZuPC9hPjwvcD4NCiAgICAgICAgICAgICAgICAgICAgPHAgc3R5bGU9Im1hcmdpbjowOyI+PHN0cm9uZz5Ib3RsaW5lOjwvc3Ryb25nPiAwMzkgNzczIDU4NTk8L3A+DQogICAgICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW46MDsiPjxzdHJvbmc+RW1haWw6PC9zdHJvbmc+IGluZm9AaG9hbmd0aGllbmtpbS52bjwvcD4NCiAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICA8L2Rpdj4NCiAgICAgICAgPD9waHANCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVnaXN0ZXIgY3VzdG9tIHBvc3QgdHlwZQ0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3Rlcl9wb3N0X3R5cGUoKSB7DQogICAgICAgIHJlZ2lzdGVyX3Bvc3RfdHlwZSgndmlkZW9fZW1iZWQnLCBbDQogICAgICAgICAgICAnbGFiZWxzJyA9PiBbDQogICAgICAgICAgICAgICAgJ25hbWUnICAgICAgICAgICAgICAgPT4gJ1ZpZGVvIEdhbGxlcnknLA0KICAgICAgICAgICAgICAgICdzaW5ndWxhcl9uYW1lJyAgICAgID0+ICdWaWRlbycsDQogICAgICAgICAgICAgICAgJ2FkZF9uZXcnICAgICAgICAgICAgPT4gJ1Row6ptIHZpZGVvJywNCiAgICAgICAgICAgICAgICAnYWRkX25ld19pdGVtJyAgICAgICA9PiAnVGjDqm0gdmlkZW8gbeG7m2knLA0KICAgICAgICAgICAgICAgICdlZGl0X2l0ZW0nICAgICAgICAgID0+ICdDaOG7iW5oIHPhu61hIHZpZGVvJywNCiAgICAgICAgICAgICAgICAnbmV3X2l0ZW0nICAgICAgICAgICA9PiAnVmlkZW8gbeG7m2knLA0KICAgICAgICAgICAgICAgICd2aWV3X2l0ZW0nICAgICAgICAgID0+ICdYZW0gdmlkZW8nLA0KICAgICAgICAgICAgICAgICdzZWFyY2hfaXRlbXMnICAgICAgID0+ICdUw6xtIHZpZGVvJywNCiAgICAgICAgICAgICAgICAnbm90X2ZvdW5kJyAgICAgICAgICA9PiAnS2jDtG5nIHTDrG0gdGjhuqV5IHZpZGVvJywNCiAgICAgICAgICAgICAgICAnbWVudV9uYW1lJyAgICAgICAgICA9PiAnVmlkZW8gR2FsbGVyeScNCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICAncHVibGljJyAgICAgICAgICAgICA9PiBmYWxzZSwNCiAgICAgICAgICAgICdzaG93X3VpJyAgICAgICAgICAgID0+IHRydWUsDQogICAgICAgICAgICAnc2hvd19pbl9tZW51JyAgICAgICA9PiB0cnVlLA0KICAgICAgICAgICAgJ3N1cHBvcnRzJyAgICAgICAgICAgPT4gWyd0aXRsZSddLA0KICAgICAgICAgICAgJ21lbnVfaWNvbicgICAgICAgICAgPT4gJ2Rhc2hpY29ucy12aWRlby1hbHQzJywNCiAgICAgICAgICAgICdtZW51X3Bvc2l0aW9uJyAgICAgID0+IDI1LA0KICAgICAgICBdKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogQWRkIG1ldGEgYm94ZXMNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gYWRkX21ldGFfYm94ZXMoKSB7DQogICAgICAgIGFkZF9tZXRhX2JveCgNCiAgICAgICAgICAgICd2ZWdfdmlkZW9fZGV0YWlscycsDQogICAgICAgICAgICAn8J+TuSBDaGkgdGnhur90IHZpZGVvJywNCiAgICAgICAgICAgIFskdGhpcywgJ3JlbmRlcl9tZXRhX2JveCddLA0KICAgICAgICAgICAgJ3ZpZGVvX2VtYmVkJywNCiAgICAgICAgICAgICdub3JtYWwnLA0KICAgICAgICAgICAgJ2hpZ2gnDQogICAgICAgICk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFJlbmRlciBtZXRhIGJveA0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiByZW5kZXJfbWV0YV9ib3goJHBvc3QpIHsNCiAgICAgICAgd3Bfbm9uY2VfZmllbGQoJ3ZlZ19zYXZlX21ldGEnLCAndmVnX21ldGFfbm9uY2UnKTsNCiAgICAgICAgDQogICAgICAgICR2aWRlb191cmwgPSBnZXRfcG9zdF9tZXRhKCRwb3N0LT5JRCwgJ192ZWdfdmlkZW9fdXJsJywgdHJ1ZSk7DQogICAgICAgICR0aHVtYl9pZCA9IGdldF9wb3N0X21ldGEoJHBvc3QtPklELCAnX3ZlZ190aHVtYl9pZCcsIHRydWUpOw0KICAgICAgICAkdGh1bWJfdXJsID0gJHRodW1iX2lkID8gd3BfZ2V0X2F0dGFjaG1lbnRfdXJsKCR0aHVtYl9pZCkgOiAnJzsNCiAgICAgICAgJGRlc2NyaXB0aW9uID0gZ2V0X3Bvc3RfbWV0YSgkcG9zdC0+SUQsICdfdmVnX2Rlc2NyaXB0aW9uJywgdHJ1ZSk7DQogICAgICAgID8+DQogICAgICAgIA0KICAgICAgICA8dGFibGUgY2xhc3M9ImZvcm0tdGFibGUiPg0KICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgIDx0aD48bGFiZWwgZm9yPSJ2ZWdfdmlkZW9fdXJsIj5MaW5rIHZpZGVvIDxzcGFuIHN0eWxlPSJjb2xvcjpyZWQ7Ij4qPC9zcGFuPjwvbGFiZWw+PC90aD4NCiAgICAgICAgICAgICAgICA8dGQ+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ1cmwiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InZlZ192aWRlb191cmwiIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0idmVnX3ZpZGVvX3VybCIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iPD9waHAgZWNobyBlc2NfYXR0cigkdmlkZW9fdXJsKTsgPz4iIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImxhcmdlLXRleHQiDQogICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj0uLi4gaG/hurdjIGxpbmsgLm1wNCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZGVzY3JpcHRpb24iPkjhu5cgdHLhu6M6IFlvdVR1YmUsIFlvdVR1YmUgU2hvcnRzLCBob+G6t2MgbGluayB2aWRlbyB0cuG7sWMgdGnhur9wICgubXA0LCAud2VibSk8L3A+DQogICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgPHRoPjxsYWJlbD7huqJuaCB0aHVtYm5haWw8L2xhYmVsPjwvdGg+DQogICAgICAgICAgICAgICAgPHRkPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJ2ZWctdGh1bWItcHJldmlldyIgc3R5bGU9Im1hcmdpbi1ib3R0b206MTBweDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCR0aHVtYl91cmwpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPSI8P3BocCBlY2hvIGVzY191cmwoJHRodW1iX3VybCk7ID8+IiBzdHlsZT0ibWF4LXdpZHRoOjMwMHB4OyBoZWlnaHQ6YXV0bzsgYm9yZGVyLXJhZGl1czo4cHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/cGhwIGVuZGlmOyA/Pg0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9InZlZ190aHVtYl9pZCIgbmFtZT0idmVnX3RodW1iX2lkIiB2YWx1ZT0iPD9waHAgZWNobyBlc2NfYXR0cigkdGh1bWJfaWQpOyA/PiI+DQogICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iYnV0dG9uIiBpZD0idmVnLXNlbGVjdC10aHVtYiI+8J+TtyBDaOG7jW4g4bqjbmg8L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJidXR0b24iIGlkPSJ2ZWctcmVtb3ZlLXRodW1iIiA8P3BocCBlY2hvICEkdGh1bWJfaWQgPyAnc3R5bGU9ImRpc3BsYXk6bm9uZTsiJyA6ICcnOyA/Pj7inYwgWMOzYSDhuqNuaDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iZGVzY3JpcHRpb24iPk7hur91IGtow7RuZyBjaOG7jW4sIHPhur0gdOG7sSDEkeG7mW5nIGzhuqV5IHRodW1ibmFpbCB04burIFlvdVR1YmUgKG7hur91IGPDsyk8L3A+DQogICAgICAgICAgICAgICAgPC90ZD4NCiAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8dHI+DQogICAgICAgICAgICAgICAgPHRoPjxsYWJlbCBmb3I9InZlZ19kZXNjcmlwdGlvbiI+TcO0IHThuqM8L2xhYmVsPjwvdGg+DQogICAgICAgICAgICAgICAgPHRkPg0KICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9InZlZ19kZXNjcmlwdGlvbiIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJ2ZWdfZGVzY3JpcHRpb24iIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cz0iMyIgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ibGFyZ2UtdGV4dCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJNw7QgdOG6oyBuZ+G6r24gduG7gSB2aWRlby4uLiI+PD9waHAgZWNobyBlc2NfdGV4dGFyZWEoJGRlc2NyaXB0aW9uKTsgPz48L3RleHRhcmVhPg0KICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICA8L3RyPg0KICAgICAgICA8L3RhYmxlPg0KICAgICAgICANCiAgICAgICAgPHNjcmlwdD4NCiAgICAgICAgalF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbigkKSB7DQogICAgICAgICAgICB2YXIgZnJhbWU7DQogICAgICAgICAgICANCiAgICAgICAgICAgICQoJyN2ZWctc2VsZWN0LXRodW1iJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoZnJhbWUpIHsNCiAgICAgICAgICAgICAgICAgICAgZnJhbWUub3BlbigpOw0KICAgICAgICAgICAgICAgICAgICByZXR1cm47DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGZyYW1lID0gd3AubWVkaWEoew0KICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0No4buNbiDhuqNuaCB0aHVtYm5haWwnLA0KICAgICAgICAgICAgICAgICAgICBidXR0b246IHsgdGV4dDogJ1Phu60gZOG7pW5nIOG6o25oIG7DoHknIH0sDQogICAgICAgICAgICAgICAgICAgIG11bHRpcGxlOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGZyYW1lLm9uKCdzZWxlY3QnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnQgPSBmcmFtZS5zdGF0ZSgpLmdldCgnc2VsZWN0aW9uJykuZmlyc3QoKS50b0pTT04oKTsNCiAgICAgICAgICAgICAgICAgICAgJCgnI3ZlZ190aHVtYl9pZCcpLnZhbChhdHRhY2htZW50LmlkKTsNCiAgICAgICAgICAgICAgICAgICAgJCgnI3ZlZy10aHVtYi1wcmV2aWV3JykuaHRtbCgnPGltZyBzcmM9IicgKyBhdHRhY2htZW50LnVybCArICciIHN0eWxlPSJtYXgtd2lkdGg6MzAwcHg7IGhlaWdodDphdXRvOyBib3JkZXItcmFkaXVzOjhweDsiPicpOw0KICAgICAgICAgICAgICAgICAgICAkKCcjdmVnLXJlbW92ZS10aHVtYicpLnNob3coKTsNCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBmcmFtZS5vcGVuKCk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJCgnI3ZlZy1yZW1vdmUtdGh1bWInKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAkKCcjdmVnX3RodW1iX2lkJykudmFsKCcnKTsNCiAgICAgICAgICAgICAgICAkKCcjdmVnLXRodW1iLXByZXZpZXcnKS5odG1sKCcnKTsNCiAgICAgICAgICAgICAgICAkKHRoaXMpLmhpZGUoKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgICAgPC9zY3JpcHQ+DQogICAgICAgIDw/cGhwDQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFNhdmUgbWV0YSBkYXRhDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHNhdmVfbWV0YSgkcG9zdF9pZCkgew0KICAgICAgICBpZiAoIWlzc2V0KCRfUE9TVFsndmVnX21ldGFfbm9uY2UnXSkgfHwgIXdwX3ZlcmlmeV9ub25jZSgkX1BPU1RbJ3ZlZ19tZXRhX25vbmNlJ10sICd2ZWdfc2F2ZV9tZXRhJykpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGRlZmluZWQoJ0RPSU5HX0FVVE9TQVZFJykgJiYgRE9JTkdfQVVUT1NBVkUpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgaWYgKGdldF9wb3N0X3R5cGUoJHBvc3RfaWQpICE9PSAndmlkZW9fZW1iZWQnKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3ZlZ192aWRlb191cmwnXSkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9wb3N0X21ldGEoJHBvc3RfaWQsICdfdmVnX3ZpZGVvX3VybCcsIGVzY191cmxfcmF3KCRfUE9TVFsndmVnX3ZpZGVvX3VybCddKSk7DQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGlmIChpc3NldCgkX1BPU1RbJ3ZlZ190aHVtYl9pZCddKSkgew0KICAgICAgICAgICAgdXBkYXRlX3Bvc3RfbWV0YSgkcG9zdF9pZCwgJ192ZWdfdGh1bWJfaWQnLCBhYnNpbnQoJF9QT1NUWyd2ZWdfdGh1bWJfaWQnXSkpOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBpZiAoaXNzZXQoJF9QT1NUWyd2ZWdfZGVzY3JpcHRpb24nXSkpIHsNCiAgICAgICAgICAgIHVwZGF0ZV9wb3N0X21ldGEoJHBvc3RfaWQsICdfdmVnX2Rlc2NyaXB0aW9uJywgc2FuaXRpemVfdGV4dGFyZWFfZmllbGQoJF9QT1NUWyd2ZWdfZGVzY3JpcHRpb24nXSkpOw0KICAgICAgICB9DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIEFkbWluIGFzc2V0cw0KICAgICAqLw0KICAgIHB1YmxpYyBmdW5jdGlvbiBhZG1pbl9hc3NldHMoJGhvb2spIHsNCiAgICAgICAgZ2xvYmFsICRwb3N0X3R5cGU7DQogICAgICAgIGlmICgkcG9zdF90eXBlID09PSAndmlkZW9fZW1iZWQnKSB7DQogICAgICAgICAgICB3cF9lbnF1ZXVlX21lZGlhKCk7DQogICAgICAgIH0NCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogRnJvbnRlbmQgYXNzZXRzDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIGZyb250ZW5kX2Fzc2V0cygpIHsNCiAgICAgICAgd3BfZW5xdWV1ZV9zdHlsZSgndmVnLXN0eWxlJywgVkVHX1BMVUdJTl9VUkwgLiAnYXNzZXRzL3N0eWxlLmNzcycsIFtdLCBWRUdfVkVSU0lPTik7DQogICAgICAgIHdwX2VucXVldWVfc2NyaXB0KCd2ZWctc2NyaXB0JywgVkVHX1BMVUdJTl9VUkwgLiAnYXNzZXRzL2Zyb250ZW5kLmpzJywgW10sIFZFR19WRVJTSU9OLCB0cnVlKTsNCiAgICB9DQogICAgDQogICAgLyoqDQogICAgICogUmVuZGVyIGdhbGxlcnkgc2hvcnRjb2RlDQogICAgICovDQogICAgcHVibGljIGZ1bmN0aW9uIHJlbmRlcl9nYWxsZXJ5KCRhdHRzKSB7DQogICAgICAgIGlmICghJHRoaXMtPmlzX2xpY2Vuc2VkKSB7DQogICAgICAgICAgICByZXR1cm4gJzxkaXYgc3R5bGU9InBhZGRpbmc6MjBweDsgYmFja2dyb3VuZDojZmZmM2NkOyBib3JkZXI6MXB4IHNvbGlkICNmZmMxMDc7IGJvcmRlci1yYWRpdXM6OHB4OyB0ZXh0LWFsaWduOmNlbnRlcjsiPg0KICAgICAgICAgICAgICAgIDxwIHN0eWxlPSJtYXJnaW46MDsgY29sb3I6Izg1NjQwNDsiPuKaoO+4jyBQbHVnaW4gSFRLIFZpZGVvIEVtYmVkIEdhbGxlcnkgY2jGsGEgxJHGsOG7o2Mga8OtY2ggaG/huqF0IGxpY2Vuc2UuPC9wPg0KICAgICAgICAgICAgPC9kaXY+JzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgJGF0dHMgPSBzaG9ydGNvZGVfYXR0cyhbJ2NvbHVtbnMnID0+IDRdLCAkYXR0cywgJ3ZpZGVvX2dhbGxlcnknKTsNCiAgICAgICAgJGNvbHVtbnMgPSBtYXgoMSwgbWluKDQsIGludHZhbCgkYXR0c1snY29sdW1ucyddKSkpOw0KICAgICAgICANCiAgICAgICAgJHZpZGVvcyA9IGdldF9wb3N0cyhbDQogICAgICAgICAgICAncG9zdF90eXBlJyAgICAgID0+ICd2aWRlb19lbWJlZCcsDQogICAgICAgICAgICAncG9zdHNfcGVyX3BhZ2UnID0+IC0xLA0KICAgICAgICAgICAgJ3Bvc3Rfc3RhdHVzJyAgICA9PiAncHVibGlzaCcsDQogICAgICAgICAgICAnb3JkZXJieScgICAgICAgID0+ICdtZW51X29yZGVyIGRhdGUnLA0KICAgICAgICAgICAgJ29yZGVyJyAgICAgICAgICA9PiAnQVNDJw0KICAgICAgICBdKTsNCiAgICAgICAgDQogICAgICAgIGlmIChlbXB0eSgkdmlkZW9zKSkgew0KICAgICAgICAgICAgcmV0dXJuICc8cCBzdHlsZT0idGV4dC1hbGlnbjpjZW50ZXI7IGNvbG9yOiM2NjY7Ij5DaMawYSBjw7MgdmlkZW8gbsOgby48L3A+JzsNCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgb2Jfc3RhcnQoKTsNCiAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0idmVnLWdyaWQgdmVnLWNvbHMtJyAuICRjb2x1bW5zIC4gJyI+JzsNCiAgICAgICAgDQogICAgICAgIGZvcmVhY2ggKCR2aWRlb3MgYXMgJHZpZGVvKSB7DQogICAgICAgICAgICAkdGl0bGUgPSBnZXRfdGhlX3RpdGxlKCR2aWRlbyk7DQogICAgICAgICAgICAkdXJsID0gZ2V0X3Bvc3RfbWV0YSgkdmlkZW8tPklELCAnX3ZlZ192aWRlb191cmwnLCB0cnVlKTsNCiAgICAgICAgICAgICR0aHVtYl9pZCA9IGdldF9wb3N0X21ldGEoJHZpZGVvLT5JRCwgJ192ZWdfdGh1bWJfaWQnLCB0cnVlKTsNCiAgICAgICAgICAgICR0aHVtYiA9ICR0aHVtYl9pZCA/IHdwX2dldF9hdHRhY2htZW50X3VybCgkdGh1bWJfaWQpIDogJyc7DQogICAgICAgICAgICAkZGVzYyA9IGdldF9wb3N0X21ldGEoJHZpZGVvLT5JRCwgJ192ZWdfZGVzY3JpcHRpb24nLCB0cnVlKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gQXV0byBZb3VUdWJlIHRodW1ibmFpbA0KICAgICAgICAgICAgaWYgKCEkdGh1bWIgJiYgcHJlZ19tYXRjaCgnJSg/OnlvdXR1YmUoPzotbm9jb29raWUpP1wuY29tLyg/OnNob3J0cy98d2F0Y2hcP3Y9fGVtYmVkLyl8eW91dHVcLmJlLykoW0EtWmEtejAtOV8tXXsxMX0pJWknLCAkdXJsLCAkbSkpIHsNCiAgICAgICAgICAgICAgICAkdGh1bWIgPSAiaHR0cHM6Ly9pbWcueW91dHViZS5jb20vdmkveyRtWzFdfS9ocWRlZmF1bHQuanBnIjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHZpZGVvIHR5cGUNCiAgICAgICAgICAgICR2aWRlb190eXBlID0gJ2RpcmVjdCc7DQogICAgICAgICAgICAkdmlkZW9faWQgPSAnJzsNCiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCclKD86eW91dHViZSg/Oi1ub2Nvb2tpZSkjb20vKD86c2hvcnRzL3x3YXRjaFw/dj18ZW1iZWQvKXx5b3V0dVwuYmUvKShbQS1aYS16MC05Xy1dezExfSklaScsICR1cmwsICRtKSkgew0KICAgICAgICAgICAgICAgICR2aWRlb190eXBlID0gJ3lvdXR1YmUnOw0KICAgICAgICAgICAgICAgICR2aWRlb19pZCA9ICRtWzFdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICBlY2hvICc8ZGl2IGNsYXNzPSJ2ZWctaXRlbSI+JzsNCiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9InZlZy12aWRlby13cmFwcGVyIiBkYXRhLXZpZGVvLXR5cGU9IicgLiBlc2NfYXR0cigkdmlkZW9fdHlwZSkgLiAnIiAnOw0KICAgICAgICAgICAgZWNobyAkdmlkZW9fdHlwZSA9PT0gJ3lvdXR1YmUnID8gJ2RhdGEtdmlkZW8taWQ9IicgLiBlc2NfYXR0cigkdmlkZW9faWQpIC4gJyInIDogJ2RhdGEtdmlkZW8tc3JjPSInIC4gZXNjX3VybCgkdXJsKSAuICciJzsNCiAgICAgICAgICAgIGVjaG8gJz4nOw0KICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0idmVnLXRodW1iIj4nOw0KICAgICAgICAgICAgZWNobyAnPGltZyBzcmM9IicgLiBlc2NfdXJsKCR0aHVtYikgLiAnIiBhbHQ9IicgLiBlc2NfYXR0cigkdGl0bGUpIC4gJyIgbG9hZGluZz0ibGF6eSI+JzsNCiAgICAgICAgICAgIGVjaG8gJzxkaXYgY2xhc3M9InZlZy1vdmVybGF5Ij48c3ZnIHdpZHRoPSI2MCIgaGVpZ2h0PSI2MCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNOCA1djE0bDExLTd6IiBmaWxsPSIjZmZmIi8+PC9zdmc+PC9kaXY+JzsNCiAgICAgICAgICAgIGVjaG8gJzwvZGl2Pic7DQogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOw0KICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0idmVnLXRpdGxlIj4nIC4gZXNjX2h0bWwoJHRpdGxlKSAuICc8L2Rpdj4nOw0KICAgICAgICAgICAgaWYgKCRkZXNjKSB7DQogICAgICAgICAgICAgICAgZWNobyAnPGRpdiBjbGFzcz0idmVnLWRlc2NyaXB0aW9uIj4nIC4gZXNjX2h0bWwoJGRlc2MpIC4gJzwvZGl2Pic7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlY2hvICc8L2Rpdj4nOw0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICBlY2hvICc8L2Rpdj4nOw0KICAgICAgICByZXR1cm4gb2JfZ2V0X2NsZWFuKCk7DQogICAgfQ0KICAgIA0KICAgIC8qKg0KICAgICAqIFByaW50IGxpZ2h0Ym94IEhUTUwNCiAgICAgKi8NCiAgICBwdWJsaWMgZnVuY3Rpb24gcHJpbnRfbGlnaHRib3goKSB7DQogICAgICAgIGlmICghJHRoaXMtPmlzX2xpY2Vuc2VkKSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgPz4NCiAgICAgICAgPGRpdiBpZD0idmVnLXZpZGVvLWxpZ2h0Ym94IiBjbGFzcz0idmVnLWxpZ2h0Ym94Ij4NCiAgICAgICAgICAgIDxkaXYgY2xhc3M9InZlZy1saWdodGJveC1iYWNrZHJvcCI+PC9kaXY+DQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2ZWctbGlnaHRib3gtaW5uZXIiIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSI+DQogICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idmVnLWxpZ2h0Ym94LWNsb3NlIiBhcmlhLWxhYmVsPSLEkMOzbmciPiZ0aW1lczs8L2J1dHRvbj4NCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJ2ZWctbGlnaHRib3gtY29udGVudCI+PC9kaXY+DQogICAgICAgICAgICA8L2Rpdj4NCiAgICAgICAgPC9kaXY+DQogICAgICAgIDw/cGhwDQogICAgfQ0KfQ0K



© 2023 Quttera Ltd. All rights reserved.