USBbaW1wb3J0IHN5cwppbXBvcnQgcGFuZGFzIGFzIHBkCmZyb20gUHlRdDUuUXRXaWRnZXRzIGltcG9ydCAoUUFwcGxpY2F0aW9uLCBRTWFpbldpbmRvdywgUVdpZGdldCwgUVZCb3hMYXlvdXQsIFFIQm94TGF5b3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFMYWJlbCwgUVB1c2hCdXR0b24sIFFUYWJsZVdpZGdldCwgUVRhYmxlV2lkZ2V0SXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRRmlsZURpYWxvZywgUVRhYldpZGdldCwgUUNoZWNrQm94LCBRR3JvdXBCb3gsIFFNZXNzYWdlQm94LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQcm9ncmVzc0JhciwgUVNjcm9sbEFyZWEsIFFGcmFtZSwgUURpYWxvZywgUURpYWxvZ0J1dHRvbkJveCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVkJveExheW91dCBhcyBRVkJveExheW91dDIsIFFHcmlkTGF5b3V0KQpmcm9tIFB5UXQ1LlF0Q29yZSBpbXBvcnQgUXQsIFFUaW1lcgpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQoKIyDlrprkuYnlr4bnuqfkvJjlhYjnuqcKU0VDVVJJVFlfTEVWRUxTID0gewogICAgJ+e7neWvhic6IDMsCiAgICAn5py65a+GJzogMiwKICAgICfnp5jlr4YnOiAxCn0KCgpjbGFzcyBFeGNlbFByb2Nlc3NvcjoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBkZXRlY3RfZXhjZWxfdHlwZShkZik6CiAgICAgICAgIiIi6K+G5YirRXhjZWzmlofku7bnsbvlnosiIiIKICAgICAgICBjb2x1bW5zID0gc2V0KGRmLmNvbHVtbnMpCgogICAgICAgICMgQeexu0V4Y2Vs55qE54m55b6B5a2X5q61CiAgICAgICAgYV90eXBlX2NvbHVtbnMgPSB7J+W6j+WPtycsICflr4bnuqcnLCAn5qGj5qGI5ZCN56ewJywgJ+WIm+W7uuaXpeacnycsICfkv53nrqHpg6jpl6gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICfotKPku7vkuronLCAn5a2Y5pS+5L2N572uJywgJ+S/neWvhuacn+mZkCcsICfop6Plr4bmnaHku7YnLCAn6aG15pWwJywgJ+Wkh+azqCd9CgogICAgICAgICMgQuexu0V4Y2Vs55qE54m55b6B5a2X5q61CiAgICAgICAgYl90eXBlX2NvbHVtbnMgPSB7J+e8lueggScsICflr4bnuqcnLCAn5pyA5pep5pel5pyfJywgJ+acgOaZmuaXpeacnycsICfmgLvpobXmlbAnfQoKICAgICAgICBpZiBhX3R5cGVfY29sdW1ucy5pc3N1YnNldChjb2x1bW5zKToKICAgICAgICAgICAgcmV0dXJuICdBJwogICAgICAgIGVsaWYgYl90eXBlX2NvbHVtbnMuaXNzdWJzZXQoY29sdW1ucyk6CiAgICAgICAgICAgIHJldHVybiAnQicKICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gTm9uZQoKICAgIEBzdGF0aWNtZXRob2QKICAgIGRlZiBwcm9jZXNzX3R5cGVfYShkZik6CiAgICAgICAgIiIi5aSE55CGQeexu0V4Y2Vs5pWw5o2uIiIiCiAgICAgICAgIyDmj5Dlj5bliY3nvIAgKOWmgkdCLTEg4oaSIEdCKQogICAgICAgIGRmWyfliY3nvIAnXSA9IGRmWyfluo/lj7cnXS5zdHIuZXh0cmFjdChyJyhbQS1aYS16XSspJylbMF0KCiAgICAgICAgcmVzdWx0cyA9IFtdCiAgICAgICAgZm9yIHByZWZpeCwgZ3JvdXAgaW4gZGYuZ3JvdXBieSgn5YmN57yAJyk6CiAgICAgICAgICAgICMg6I635Y+W5pyA6auY5a+G57qnCiAgICAgICAgICAgIG1heF9zZWN1cml0eSA9IGdyb3VwLmxvY1tncm91cFsn5a+G57qnJ10ubWFwKFNFQ1VSSVRZX0xFVkVMUykuaWR4bWF4KCksICflr4bnuqcnXQoKICAgICAgICAgICAgIyDovazmjaLml6XmnJ/moLzlvI/lubbojrflj5bmnIDml6nlkozmnIDmmZrml6XmnJ8KICAgICAgICAgICAgZGF0ZXMgPSBwZC50b19kYXRldGltZShncm91cFsn5Yib5bu65pel5pyfJ10pCiAgICAgICAgICAgIG1pbl9kYXRlID0gZGF0ZXMubWluKCkuc3RyZnRpbWUoJyVZLSVtLSVkJykKICAgICAgICAgICAgbWF4X2RhdGUgPSBkYXRlcy5tYXgoKS5zdHJmdGltZSgnJVktJW0tJWQnKQoKICAgICAgICAgICAgIyDorqHnrpfmgLvpobXmlbAKICAgICAgICAgICAgdG90YWxfcGFnZXMgPSBncm91cFsn6aG15pWwJ10uc3VtKCkKCiAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHsKICAgICAgICAgICAgICAgICfnvJbnoIEnOiBwcmVmaXgsCiAgICAgICAgICAgICAgICAn5a+G57qnJzogbWF4X3NlY3VyaXR5LAogICAgICAgICAgICAgICAgJ+acgOaXqeaXpeacnyc6IG1pbl9kYXRlLAogICAgICAgICAgICAgICAgJ+acgOaZmuaXpeacnyc6IG1heF9kYXRlLAogICAgICAgICAgICAgICAgJ+aAu+mhteaVsCc6IHRvdGFsX3BhZ2VzCiAgICAgICAgICAgIH0pCgogICAgICAgIHJldHVybiBwZC5EYXRhRnJhbWUocmVzdWx0cykKCiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgcHJvY2Vzc190eXBlX2IoZGYpOgogICAgICAgICIiIuWkhOeQhkLnsbtFeGNlbOaVsOaNriIiIgogICAgICAgICMg55u05o6l6L+U5Zue5Y6f5aeL5pWw5o2u77yM5L2G5YiG5oiQ5Lik5Liq5qih5p2/CiAgICAgICAgdGVtcGxhdGUxID0gZGZbWyfnvJbnoIEnLCAn5a+G57qnJywgJ+acgOaXqeaXpeacnyddXS5jb3B5KCkKICAgICAgICB0ZW1wbGF0ZTIgPSBkZltbJ+acgOaZmuaXpeacnycsICfmgLvpobXmlbAnXV0uY29weSgpCiAgICAgICAgcmV0dXJuIHRlbXBsYXRlMSwgdGVtcGxhdGUyCgoKY2xhc3MgVGVtcGxhdGVTZWxlY3Rpb25EaWFsb2coUURpYWxvZyk6CiAgICAiIiLkvJjljJblkI7nmoTmqKHmnb/pgInmi6nlr7nor53moYYiIiIKCiAgICBkZWYgX19pbml0X18oc2VsZiwgdGVtcGxhdGVzLCBwYXJlbnQ9Tm9uZSk6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXyhwYXJlbnQpCiAgICAgICAgc2VsZi5zZXRXaW5kb3dUaXRsZSgi6YCJ5oup5a+85Ye65qih5p2/IikKICAgICAgICBzZWxmLnNldE1pbmltdW1XaWR0aCg0MDApCgogICAgICAgICMg5Li75biD5bGACiAgICAgICAgbGF5b3V0ID0gUVZCb3hMYXlvdXQyKHNlbGYpCgogICAgICAgICMg5qCH6aKY5ZKM5YWo6YCJ5oyJ6ZKuCiAgICAgICAgaGVhZGVyX2xheW91dCA9IFFIQm94TGF5b3V0KCkKICAgICAgICBzZWxmLnRpdGxlX2xhYmVsID0gUUxhYmVsKCLor7fpgInmi6nopoHlr7zlh7rnmoTmqKHmnb86IikKICAgICAgICBzZWxmLnRpdGxlX2xhYmVsLnNldFN0eWxlU2hlZXQoImZvbnQtd2VpZ2h0OiBib2xkOyBmb250LXNpemU6IDE0cHg7IikKCiAgICAgICAgc2VsZi5zZWxlY3RfYWxsX2J0biA9IFFQdXNoQnV0dG9uKCLlhajpgIkiKQogICAgICAgIHNlbGYuc2VsZWN0X2FsbF9idG4uc2V0Rml4ZWRXaWR0aCg4MCkKICAgICAgICBzZWxmLnNlbGVjdF9hbGxfYnRuLnNldFN0eWxlU2hlZXQoImJhY2tncm91bmQtY29sb3I6ICNmMGYwZjA7IikKICAgICAgICBzZWxmLnNlbGVjdF9hbGxfYnRuLmNsaWNrZWQuY29ubmVjdChzZWxmLnRvZ2dsZV9zZWxlY3RfYWxsKQoKICAgICAgICBoZWFkZXJfbGF5b3V0LmFkZFdpZGdldChzZWxmLnRpdGxlX2xhYmVsKQogICAgICAgIGhlYWRlcl9sYXlvdXQuYWRkU3RyZXRjaCgpCiAgICAgICAgaGVhZGVyX2xheW91dC5hZGRXaWRnZXQoc2VsZi5zZWxlY3RfYWxsX2J0bikKCiAgICAgICAgIyDmqKHmnb/pgInmi6nljLrln58KICAgICAgICBzZWxmLnRlbXBsYXRlX2ZyYW1lID0gUUZyYW1lKCkKICAgICAgICBzZWxmLnRlbXBsYXRlX2ZyYW1lLnNldEZyYW1lU2hhcGUoUUZyYW1lLlN0eWxlZFBhbmVsKQogICAgICAgIHNlbGYudGVtcGxhdGVfbGF5b3V0ID0gUUdyaWRMYXlvdXQoKQogICAgICAgIHNlbGYudGVtcGxhdGVfbGF5b3V0LnNldFNwYWNpbmcoMTApCgogICAgICAgIHNlbGYuY2hlY2tib3hlcyA9IFtdCiAgICAgICAgZm9yIGksIHRlbXBsYXRlIGluIGVudW1lcmF0ZSh0ZW1wbGF0ZXMpOgogICAgICAgICAgICBjaGVja2JveCA9IFFDaGVja0JveCh0ZW1wbGF0ZSkKICAgICAgICAgICAgY2hlY2tib3guc2V0Q2hlY2tlZChUcnVlKQogICAgICAgICAgICBjaGVja2JveC5zZXRTdHlsZVNoZWV0KCJRQ2hlY2tCb3ggeyBwYWRkaW5nOiA1cHg7IH0iKQogICAgICAgICAgICBzZWxmLmNoZWNrYm94ZXMuYXBwZW5kKGNoZWNrYm94KQogICAgICAgICAgICBzZWxmLnRlbXBsYXRlX2xheW91dC5hZGRXaWRnZXQoY2hlY2tib3gsIGkgLy8gMiwgaSAlIDIpCgogICAgICAgIHNlbGYudGVtcGxhdGVfZnJhbWUuc2V0TGF5b3V0KHNlbGYudGVtcGxhdGVfbGF5b3V0KQoKICAgICAgICAjIOaMiemSruWMuuWfnwogICAgICAgIHNlbGYuYnV0dG9uX2JveCA9IFFEaWFsb2dCdXR0b25Cb3goUURpYWxvZ0J1dHRvbkJveC5PayB8IFFEaWFsb2dCdXR0b25Cb3guQ2FuY2VsKQogICAgICAgIHNlbGYuYnV0dG9uX2JveC5hY2NlcHRlZC5jb25uZWN0KHNlbGYuYWNjZXB0KQogICAgICAgIHNlbGYuYnV0dG9uX2JveC5yZWplY3RlZC5jb25uZWN0KHNlbGYucmVqZWN0KQoKICAgICAgICAjIOa3u+WKoOWIsOS4u+W4g+WxgAogICAgICAgIGxheW91dC5hZGRMYXlvdXQoaGVhZGVyX2xheW91dCkKICAgICAgICBsYXlvdXQuYWRkV2lkZ2V0KHNlbGYudGVtcGxhdGVfZnJhbWUpCiAgICAgICAgbGF5b3V0LmFkZFdpZGdldChzZWxmLmJ1dHRvbl9ib3gpCgogICAgICAgICMg5Yid5aeL54q25oCBCiAgICAgICAgc2VsZi5hbGxfc2VsZWN0ZWQgPSBUcnVlCgogICAgZGVmIHRvZ2dsZV9zZWxlY3RfYWxsKHNlbGYpOgogICAgICAgICIiIuWIh+aNouWFqOmAieeKtuaAgSIiIgogICAgICAgIHNlbGYuYWxsX3NlbGVjdGVkID0gbm90IHNlbGYuYWxsX3NlbGVjdGVkCiAgICAgICAgZm9yIGNiIGluIHNlbGYuY2hlY2tib3hlczoKICAgICAgICAgICAgY2Iuc2V0Q2hlY2tlZChzZWxmLmFsbF9zZWxlY3RlZCkKCiAgICAgICAgc2VsZi5zZWxlY3RfYWxsX2J0bi5zZXRUZXh0KCLlj5bmtojlhajpgIkiIGlmIHNlbGYuYWxsX3NlbGVjdGVkIGVsc2UgIuWFqOmAiSIpCgogICAgZGVmIGdldF9zZWxlY3RlZF90ZW1wbGF0ZXMoc2VsZik6CiAgICAgICAgIiIi6I635Y+W6YCJ5Lit55qE5qih5p2/IiIiCiAgICAgICAgcmV0dXJuIFtjYi50ZXh0KCkgZm9yIGNiIGluIHNlbGYuY2hlY2tib3hlcyBpZiBjYi5pc0NoZWNrZWQoKV0KCgpjbGFzcyBNYWluV2luZG93KFFNYWluV2luZG93KToKICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKCkKICAgICAgICBzZWxmLnNldFdpbmRvd1RpdGxlKCJFeGNlbOaVsOaNruWkhOeQhuW3peWFtyIpCiAgICAgICAgc2VsZi5zZXRHZW9tZXRyeSgxMDAsIDEwMCwgMTAwMCwgODAwKQoKICAgICAgICAjIOWIneWni+WMluWPmOmHjwogICAgICAgIHNlbGYuY3VycmVudF9maWxlID0gTm9uZQogICAgICAgIHNlbGYuY3VycmVudF9kZiA9IE5vbmUKICAgICAgICBzZWxmLmV4Y2VsX3R5cGUgPSBOb25lCiAgICAgICAgc2VsZi5wcm9jZXNzZWRfZGF0YSA9IE5vbmUKCiAgICAgICAgIyDliJvlu7pVSQogICAgICAgIHNlbGYuaW5pdF91aSgpCgogICAgZGVmIGluaXRfdWkoc2VsZik6CiAgICAgICAgIiIi5Yid5aeL5YyW55So5oi355WM6Z2iIiIiCiAgICAgICAgbWFpbl93aWRnZXQgPSBRV2lkZ2V0KCkKICAgICAgICBtYWluX2xheW91dCA9IFFWQm94TGF5b3V0KCkKCiAgICAgICAgIyDpobbpg6jmjqfliLbljLrln58KICAgICAgICBjb250cm9sX2dyb3VwID0gUUdyb3VwQm94KCLmlofku7bmk43kvZwiKQogICAgICAgIGNvbnRyb2xfbGF5b3V0ID0gUUhCb3hMYXlvdXQoKQoKICAgICAgICBzZWxmLmltcG9ydF9idG4gPSBRUHVzaEJ1dHRvbigi5a+85YWlRXhjZWzmlofku7YiKQogICAgICAgIHNlbGYuaW1wb3J0X2J0bi5jbGlja2VkLmNvbm5lY3Qoc2VsZi5pbXBvcnRfZXhjZWwpCgogICAgICAgIHNlbGYucHJvY2Vzc19idG4gPSBRUHVzaEJ1dHRvbigi5aSE55CG5pWw5o2uIikKICAgICAgICBzZWxmLnByb2Nlc3NfYnRuLmNsaWNrZWQuY29ubmVjdChzZWxmLnByb2Nlc3NfZGF0YSkKICAgICAgICBzZWxmLnByb2Nlc3NfYnRuLnNldEVuYWJsZWQoRmFsc2UpCgogICAgICAgIHNlbGYuZXhwb3J0X2J0biA9IFFQdXNoQnV0dG9uKCLlr7zlh7rnu5PmnpwiKQogICAgICAgIHNlbGYuZXhwb3J0X2J0bi5jbGlja2VkLmNvbm5lY3Qoc2VsZi5leHBvcnRfcmVzdWx0cykKICAgICAgICBzZWxmLmV4cG9ydF9idG4uc2V0RW5hYmxlZChGYWxzZSkKCiAgICAgICAgY29udHJvbF9sYXlvdXQuYWRkV2lkZ2V0KHNlbGYuaW1wb3J0X2J0bikKICAgICAgICBjb250cm9sX2xheW91dC5hZGRXaWRnZXQoc2VsZi5wcm9jZXNzX2J0bikKICAgICAgICBjb250cm9sX2xheW91dC5hZGRXaWRnZXQoc2VsZi5leHBvcnRfYnRuKQogICAgICAgIGNvbnRyb2xfZ3JvdXAuc2V0TGF5b3V0KGNvbnRyb2xfbGF5b3V0KQoKICAgICAgICAjIOS4remXtOaYvuekuuWMuuWfnyAtIOS9v+eUqOWIhuWJsuW4g+WxgAogICAgICAgIGRpc3BsYXlfZ3JvdXAgPSBRR3JvdXBCb3goIuaVsOaNruWkhOeQhiIpCiAgICAgICAgZGlzcGxheV9sYXlvdXQgPSBRVkJveExheW91dCgpCgogICAgICAgICMg5Y6f5aeL5pWw5o2u5Yy65Z+fCiAgICAgICAgcmF3X2RhdGFfZ3JvdXAgPSBRR3JvdXBCb3goIuWOn+Wni+aVsOaNriIpCiAgICAgICAgcmF3X2RhdGFfbGF5b3V0ID0gUVZCb3hMYXlvdXQoKQoKICAgICAgICBzZWxmLnJhd19kYXRhX3RhYmxlID0gUVRhYmxlV2lkZ2V0KCkKICAgICAgICByYXdfZGF0YV9sYXlvdXQuYWRkV2lkZ2V0KHNlbGYucmF3X2RhdGFfdGFibGUpCiAgICAgICAgcmF3X2RhdGFfZ3JvdXAuc2V0TGF5b3V0KHJhd19kYXRhX2xheW91dCkKCiAgICAgICAgIyDlpITnkIbnu5PmnpzljLrln58KICAgICAgICByZXN1bHRfZ3JvdXAgPSBRR3JvdXBCb3goIuaVsOaNruaxh+aAuyIpCiAgICAgICAgcmVzdWx0X2xheW91dCA9IFFWQm94TGF5b3V0KCkKCiAgICAgICAgIyDnu5PmnpzooajmoLzljLrln58gLSDkvb/nlKjmoIfnrb7pobUKICAgICAgICBzZWxmLnJlc3VsdF90YWJzID0gUVRhYldpZGdldCgpCiAgICAgICAgc2VsZi5yZXN1bHRfdGFicy5zZXRUYWJQb3NpdGlvbihRVGFiV2lkZ2V0Lk5vcnRoKQogICAgICAgIHNlbGYucmVzdWx0X3RhYnMuc2V0TW92YWJsZShUcnVlKQoKICAgICAgICAjIOi/m+W6puadoQogICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyID0gUVByb2dyZXNzQmFyKCkKICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRSYW5nZSgwLCAxMDApCiAgICAgICAgc2VsZi5wcm9ncmVzc19iYXIuaGlkZSgpCgogICAgICAgIHJlc3VsdF9sYXlvdXQuYWRkV2lkZ2V0KHNlbGYucmVzdWx0X3RhYnMpCiAgICAgICAgcmVzdWx0X2xheW91dC5hZGRXaWRnZXQoc2VsZi5wcm9ncmVzc19iYXIpCiAgICAgICAgcmVzdWx0X2dyb3VwLnNldExheW91dChyZXN1bHRfbGF5b3V0KQoKICAgICAgICAjIOa3u+WKoOWIsOS4u+aYvuekuuWMuuWfnwogICAgICAgIGRpc3BsYXlfbGF5b3V0LmFkZFdpZGdldChyYXdfZGF0YV9ncm91cCkKICAgICAgICBkaXNwbGF5X2xheW91dC5hZGRXaWRnZXQocmVzdWx0X2dyb3VwKQogICAgICAgIGRpc3BsYXlfZ3JvdXAuc2V0TGF5b3V0KGRpc3BsYXlfbGF5b3V0KQoKICAgICAgICAjIOW6lemDqOeKtuaAgeWMuuWfnwogICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsID0gUUxhYmVsKCLlsLHnu6oiKQogICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsLnNldEFsaWdubWVudChRdC5BbGlnbkNlbnRlcikKCiAgICAgICAgIyDmt7vliqDliLDkuLvluIPlsYAKICAgICAgICBtYWluX2xheW91dC5hZGRXaWRnZXQoY29udHJvbF9ncm91cCkKICAgICAgICBtYWluX2xheW91dC5hZGRXaWRnZXQoZGlzcGxheV9ncm91cCkKICAgICAgICBtYWluX2xheW91dC5hZGRXaWRnZXQoc2VsZi5zdGF0dXNfbGFiZWwpCgogICAgICAgIG1haW5fd2lkZ2V0LnNldExheW91dChtYWluX2xheW91dCkKICAgICAgICBzZWxmLnNldENlbnRyYWxXaWRnZXQobWFpbl93aWRnZXQpCgogICAgZGVmIGltcG9ydF9leGNlbChzZWxmKToKICAgICAgICAiIiLlr7zlhaVFeGNlbOaWh+S7tiIiIgogICAgICAgIGZpbGVfcGF0aCwgXyA9IFFGaWxlRGlhbG9nLmdldE9wZW5GaWxlTmFtZSgKICAgICAgICAgICAgc2VsZiwgIumAieaLqUV4Y2Vs5paH5Lu2IiwgIiIsICJFeGNlbOaWh+S7tiAoKi54bHN4ICoueGxzKSIpCgogICAgICAgIGlmIGZpbGVfcGF0aDoKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2ZpbGUgPSBmaWxlX3BhdGgKICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9kZiA9IHBkLnJlYWRfZXhjZWwoZmlsZV9wYXRoKQogICAgICAgICAgICAgICAgc2VsZi5leGNlbF90eXBlID0gRXhjZWxQcm9jZXNzb3IuZGV0ZWN0X2V4Y2VsX3R5cGUoc2VsZi5jdXJyZW50X2RmKQoKICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhjZWxfdHlwZToKICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3dfZGF0YV9pbl90YWJsZShzZWxmLnJhd19kYXRhX3RhYmxlLCBzZWxmLmN1cnJlbnRfZGYpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2J0bi5zZXRFbmFibGVkKFRydWUpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXNfbGFiZWwuc2V0VGV4dChmIuW3suWvvOWFpToge2ZpbGVfcGF0aH0gKOexu+Weizoge3NlbGYuZXhjZWxfdHlwZX0pIikKICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgUU1lc3NhZ2VCb3gud2FybmluZyhzZWxmLCAi6ZSZ6K+vIiwgIuaXoOazleivhuWIq+eahEV4Y2Vs5qC85byPISIpCiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZSgpCgogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgICAgICBRTWVzc2FnZUJveC5jcml0aWNhbChzZWxmLCAi6ZSZ6K+vIiwgZiLor7vlj5bmlofku7blpLHotKU6IHtzdHIoZSl9IikKICAgICAgICAgICAgICAgIHNlbGYucmVzZXRfc3RhdGUoKQoKICAgIGRlZiBwcm9jZXNzX2RhdGEoc2VsZik6CiAgICAgICAgIiIi5aSE55CG5pWw5o2uIiIiCiAgICAgICAgaWYgc2VsZi5jdXJyZW50X2RmIGlzIE5vbmUgb3Igc2VsZi5leGNlbF90eXBlIGlzIE5vbmU6CiAgICAgICAgICAgIHJldHVybgoKICAgICAgICB0cnk6CiAgICAgICAgICAgICMg5pi+56S66L+b5bqm5p2hCiAgICAgICAgICAgIHNlbGYucHJvZ3Jlc3NfYmFyLnNob3coKQogICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5zZXRWYWx1ZSgwKQogICAgICAgICAgICBRQXBwbGljYXRpb24ucHJvY2Vzc0V2ZW50cygpICAjIOW8uuWItuabtOaWsFVJCgogICAgICAgICAgICAjIOa4hemZpOaXp+eahOe7k+aenAogICAgICAgICAgICBzZWxmLmNsZWFyX3Jlc3VsdHMoKQoKICAgICAgICAgICAgIyDmqKHmi5/lpITnkIbov5vluqYKICAgICAgICAgICAgc2VsZi5zaW11bGF0ZV9wcm9ncmVzcygpCgogICAgICAgICAgICAjIOWunumZheWkhOeQhuaVsOaNrgogICAgICAgICAgICBRVGltZXIuc2luZ2xlU2hvdCgxMDAsIHNlbGYuYWN0dWFsX2RhdGFfcHJvY2Vzc2luZykKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBRTWVzc2FnZUJveC5jcml0aWNhbChzZWxmLCAi6ZSZ6K+vIiwgZiLmlbDmja7lpITnkIblpLHotKU6IHtzdHIoZSl9IikKICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZSgpCgogICAgZGVmIHNpbXVsYXRlX3Byb2dyZXNzKHNlbGYpOgogICAgICAgICIiIuaooeaLn+WkhOeQhui/m+W6piIiIgogICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEwMSk6CiAgICAgICAgICAgIGRlZiB1cGRhdGVfcHJvZ3Jlc3ModmFsdWUpOgogICAgICAgICAgICAgICAgcmV0dXJuIGxhbWJkYTogc2VsZi5wcm9ncmVzc19iYXIuc2V0VmFsdWUodmFsdWUpCgogICAgICAgICAgICBRVGltZXIuc2luZ2xlU2hvdChpICogMjAsIHVwZGF0ZV9wcm9ncmVzcyhpKSkKCiAgICBkZWYgYWN0dWFsX2RhdGFfcHJvY2Vzc2luZyhzZWxmKToKICAgICAgICAiIiLlrp7pmYXmlbDmja7lpITnkIYiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGlmIHNlbGYuZXhjZWxfdHlwZSA9PSAnQSc6CiAgICAgICAgICAgICAgICAjIOWkhOeQhkHnsbvmlbDmja4KICAgICAgICAgICAgICAgIHByb2Nlc3NlZF9kZiA9IEV4Y2VsUHJvY2Vzc29yLnByb2Nlc3NfdHlwZV9hKHNlbGYuY3VycmVudF9kZikKCiAgICAgICAgICAgICAgICAjIOWIm+W7uuaooeadvzEKICAgICAgICAgICAgICAgIHRlbXBsYXRlMSA9IHByb2Nlc3NlZF9kZltbJ+e8lueggScsICflr4bnuqcnLCAn5pyA5pep5pel5pyfJywgJ+acgOaZmuaXpeacnycsICfmgLvpobXmlbAnXV0KICAgICAgICAgICAgICAgIHNlbGYuYWRkX3Jlc3VsdF90YWIoIuaooeadvzEiLCB0ZW1wbGF0ZTEpCgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZGF0YSA9IHsn5qih5p2/MSc6IHRlbXBsYXRlMX0KCiAgICAgICAgICAgIGVsaWYgc2VsZi5leGNlbF90eXBlID09ICdCJzoKICAgICAgICAgICAgICAgICMg5aSE55CGQuexu+aVsOaNrgogICAgICAgICAgICAgICAgdGVtcGxhdGUxLCB0ZW1wbGF0ZTIgPSBFeGNlbFByb2Nlc3Nvci5wcm9jZXNzX3R5cGVfYihzZWxmLmN1cnJlbnRfZGYpCgogICAgICAgICAgICAgICAgIyDliJvlu7rmqKHmnb8x5ZKM5qih5p2/MgogICAgICAgICAgICAgICAgc2VsZi5hZGRfcmVzdWx0X3RhYigi5qih5p2/MSIsIHRlbXBsYXRlMSkKICAgICAgICAgICAgICAgIHNlbGYuYWRkX3Jlc3VsdF90YWIoIuaooeadvzIiLCB0ZW1wbGF0ZTIpCgogICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAn5qih5p2/MSc6IHRlbXBsYXRlMSwKICAgICAgICAgICAgICAgICAgICAn5qih5p2/Mic6IHRlbXBsYXRlMgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgc2VsZi5leHBvcnRfYnRuLnNldEVuYWJsZWQoVHJ1ZSkKICAgICAgICAgICAgc2VsZi5zdGF0dXNfbGFiZWwuc2V0VGV4dChmIuaVsOaNruWkhOeQhuWujOaIkCAo57G75Z6LOiB7c2VsZi5leGNlbF90eXBlfSkiKQogICAgICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5oaWRlKCkKCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgICAgICBRTWVzc2FnZUJveC5jcml0aWNhbChzZWxmLCAi6ZSZ6K+vIiwgZiLmlbDmja7lpITnkIblpLHotKU6IHtzdHIoZSl9IikKICAgICAgICAgICAgc2VsZi5yZXNldF9zdGF0ZSgpCgogICAgZGVmIGFkZF9yZXN1bHRfdGFiKHNlbGYsIHRpdGxlLCBkZik6CiAgICAgICAgIiIi5re75Yqg57uT5p6c5qCH562+6aG1IiIiCiAgICAgICAgc2Nyb2xsID0gUVNjcm9sbEFyZWEoKQogICAgICAgIHNjcm9sbC5zZXRXaWRnZXRSZXNpemFibGUoVHJ1ZSkKCiAgICAgICAgdGFibGUgPSBRVGFibGVXaWRnZXQoKQogICAgICAgIHNlbGYuc2hvd19kYXRhX2luX3RhYmxlKHRhYmxlLCBkZikKCiAgICAgICAgc2Nyb2xsLnNldFdpZGdldCh0YWJsZSkKICAgICAgICBzZWxmLnJlc3VsdF90YWJzLmFkZFRhYihzY3JvbGwsIHRpdGxlKQoKICAgIGRlZiBjbGVhcl9yZXN1bHRzKHNlbGYpOgogICAgICAgICIiIua4hemZpOe7k+aenOWMuuWfnyIiIgogICAgICAgIHdoaWxlIHNlbGYucmVzdWx0X3RhYnMuY291bnQoKSA+IDA6CiAgICAgICAgICAgIHNlbGYucmVzdWx0X3RhYnMucmVtb3ZlVGFiKDApCgogICAgZGVmIGV4cG9ydF9yZXN1bHRzKHNlbGYpOgogICAgICAgICIiIuWvvOWHuue7k+aenCIiIgogICAgICAgIGlmIG5vdCBzZWxmLnByb2Nlc3NlZF9kYXRhOgogICAgICAgICAgICByZXR1cm4KCiAgICAgICAgdHJ5OgogICAgICAgICAgICAjIOaYvuekuuaooeadv+mAieaLqeWvueivneahhgogICAgICAgICAgICBkaWFsb2cgPSBUZW1wbGF0ZVNlbGVjdGlvbkRpYWxvZyhsaXN0KHNlbGYucHJvY2Vzc2VkX2RhdGEua2V5cygpKSwgc2VsZikKICAgICAgICAgICAgaWYgZGlhbG9nLmV4ZWNfKCkgIT0gUURpYWxvZy5BY2NlcHRlZDoKICAgICAgICAgICAgICAgIHJldHVybgoKICAgICAgICAgICAgc2VsZWN0ZWRfdGVtcGxhdGVzID0gZGlhbG9nLmdldF9zZWxlY3RlZF90ZW1wbGF0ZXMoKQogICAgICAgICAgICBpZiBub3Qgc2VsZWN0ZWRfdGVtcGxhdGVzOgogICAgICAgICAgICAgICAgUU1lc3NhZ2VCb3gud2FybmluZyhzZWxmLCAi6K2m5ZGKIiwgIuivt+iHs+WwkemAieaLqeS4gOS4quaooeadv+WvvOWHuiEiKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBmaWxlX3BhdGgsIF8gPSBRRmlsZURpYWxvZy5nZXRTYXZlRmlsZU5hbWUoCiAgICAgICAgICAgICAgICBzZWxmLCAi5L+d5a2Y57uT5p6cIiwgIiIsICJFeGNlbOaWh+S7tiAoKi54bHN4KSIpCgogICAgICAgICAgICBpZiBmaWxlX3BhdGg6CiAgICAgICAgICAgICAgICB3aXRoIHBkLkV4Y2VsV3JpdGVyKGZpbGVfcGF0aCkgYXMgd3JpdGVyOgogICAgICAgICAgICAgICAgICAgIGZvciB0ZW1wbGF0ZV9uYW1lIGluIHNlbGVjdGVkX3RlbXBsYXRlczoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVtcGxhdGVfbmFtZSBpbiBzZWxmLnByb2Nlc3NlZF9kYXRhOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZGF0YVt0ZW1wbGF0ZV9uYW1lXS50b19leGNlbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXIsIHNoZWV0X25hbWU9dGVtcGxhdGVfbmFtZSwgaW5kZXg9RmFsc2UpCgogICAgICAgICAgICAgICAgc2VsZi5zdGF0dXNfbGFiZWwuc2V0VGV4dChmIue7k+aenOW3suS/neWtmOWIsDoge2ZpbGVfcGF0aH0iKQogICAgICAgICAgICAgICAgUU1lc3NhZ2VCb3guaW5mb3JtYXRpb24oc2VsZiwgIuaIkOWKnyIsIGYi5bey5a+85Ye66YCJ5a6a55qEe2xlbihzZWxlY3RlZF90ZW1wbGF0ZXMpfeS4quaooeadvyEiKQoKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIFFNZXNzYWdlQm94LmNyaXRpY2FsKHNlbGYsICLplJnor68iLCBmIuWvvOWHuuWksei0pToge3N0cihlKX0iKQoKICAgIGRlZiBzaG93X2RhdGFfaW5fdGFibGUoc2VsZiwgdGFibGUsIGRmKToKICAgICAgICAiIiLlnKjooajmoLzkuK3mmL7npLrmlbDmja4iIiIKICAgICAgICB0YWJsZS5jbGVhcigpCgogICAgICAgICMg6K6+572u6KGM5YiX5pWwCiAgICAgICAgcm93cywgY29scyA9IGRmLnNoYXBlCiAgICAgICAgdGFibGUuc2V0Um93Q291bnQocm93cykKICAgICAgICB0YWJsZS5zZXRDb2x1bW5Db3VudChjb2xzKQoKICAgICAgICAjIOiuvue9ruihqOWktAogICAgICAgIHRhYmxlLnNldEhvcml6b250YWxIZWFkZXJMYWJlbHMoZGYuY29sdW1ucykKCiAgICAgICAgIyDloavlhYXmlbDmja4KICAgICAgICBmb3IgaSBpbiByYW5nZShyb3dzKToKICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoY29scyk6CiAgICAgICAgICAgICAgICBpdGVtID0gUVRhYmxlV2lkZ2V0SXRlbShzdHIoZGYuaWF0W2ksIGpdKSkKICAgICAgICAgICAgICAgIGl0ZW0uc2V0RmxhZ3MoaXRlbS5mbGFncygpIF4gUXQuSXRlbUlzRWRpdGFibGUpICAjIOiuvue9ruS4uuS4jeWPr+e8lui+kQogICAgICAgICAgICAgICAgdGFibGUuc2V0SXRlbShpLCBqLCBpdGVtKQoKICAgICAgICAjIOiwg+aVtOWIl+WuvQogICAgICAgIHRhYmxlLnJlc2l6ZUNvbHVtbnNUb0NvbnRlbnRzKCkKCiAgICBkZWYgcmVzZXRfc3RhdGUoc2VsZik6CiAgICAgICAgIiIi6YeN572u54q25oCBIiIiCiAgICAgICAgc2VsZi5jdXJyZW50X2ZpbGUgPSBOb25lCiAgICAgICAgc2VsZi5jdXJyZW50X2RmID0gTm9uZQogICAgICAgIHNlbGYuZXhjZWxfdHlwZSA9IE5vbmUKICAgICAgICBzZWxmLnByb2Nlc3NlZF9kYXRhID0gTm9uZQoKICAgICAgICBzZWxmLnJhd19kYXRhX3RhYmxlLmNsZWFyKCkKICAgICAgICBzZWxmLmNsZWFyX3Jlc3VsdHMoKQoKICAgICAgICBzZWxmLnByb2dyZXNzX2Jhci5oaWRlKCkKCiAgICAgICAgc2VsZi5wcm9jZXNzX2J0bi5zZXRFbmFibGVkKEZhbHNlKQogICAgICAgIHNlbGYuZXhwb3J0X2J0bi5zZXRFbmFibGVkKEZhbHNlKQogICAgICAgIHNlbGYuc3RhdHVzX2xhYmVsLnNldFRleHQoIuWwsee7qiIpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIGFwcCA9IFFBcHBsaWNhdGlvbihzeXMuYXJndikKCiAgICAjIOiuvue9ruW6lOeUqOeoi+W6j+agt+W8jwogICAgYXBwLnNldFN0eWxlKCJGdXNpb24iKQoKICAgIHdpbmRvdyA9IE1haW5XaW5kb3coKQogICAgd2luZG93LnNob3coKQogICAgc3lzLmV4aXQoYXBwLmV4ZWNfKCkpCg==123