{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipHotTable.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipHotTable.vue","mtime":1733309211891},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\babel.config.js","mtime":1733906004399},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9yZWFkT25seUVycm9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWFkT25seUVycm9yLmpzIjsKaW1wb3J0IF9vYmplY3RTcHJlYWQgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL29iamVjdFNwcmVhZDIuanMiOwppbXBvcnQgX3RvQ29uc3VtYWJsZUFycmF5IGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS90b0NvbnN1bWFibGVBcnJheS5qcyI7CmltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2RlZmluZVByb3BlcnR5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuY29uY2F0LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuam9pbi5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuanNvbi5zdHJpbmdpZnkuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIucGFyc2UtaW50LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMubnVtYmVyLnRvLWZpeGVkLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmV4ZWMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudGVzdC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcubWF0Y2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5ib2xkLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZvci1lYWNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgdXRpbHMgZnJvbSAiQC91dGlscy5qcyI7CmltcG9ydCBGb3JtTWF0aCBmcm9tICJAL21hdGguanMiOwppbXBvcnQgeyBIb3RUYWJsZSB9IGZyb20gIkBoYW5kc29udGFibGUvdnVlIjsKaW1wb3J0IFN1YkRhdGFEZXRhaWwgZnJvbSAiQC9jb21wb25lbnRzL2Zsb3cvU3ViRGF0YURldGFpbC52dWUiOwppbXBvcnQgImhhbmRzb250YWJsZS9kaXN0L2hhbmRzb250YWJsZS5mdWxsLmNzcyI7CmltcG9ydCBIYW5kc29udGFibGUgZnJvbSAiaGFuZHNvbnRhYmxlIjsKaW1wb3J0ICJoYW5kc29udGFibGUvbGFuZ3VhZ2VzL3poLUNOIjsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICJlaXAtaG90LXRhYmxlIiwKICBwcm9wczogewogICAgb3B0aW9uczogU3RyaW5nLAogICAgaW5pdGNvbmY6IFN0cmluZywKICAgIHBlcm1pc3Npb246IE9iamVjdCwKICAgIGlzSW5pdFRlbXBsYXRlRGF0YTogU3RyaW5nLAogICAgaW5pdEZpbGxEYXRhVHlwZTogU3RyaW5nLAogICAgYWRkSW5pdFRlbXBsYXRlRGF0YTogU3RyaW5nLAogICAgLy/lhYHorrjmt7vliqDliJ3lp4vljJbmlbDmja4KICAgIGluaXRTdW1Sb3c6IFN0cmluZywKICAgIC8v5Yid5aeL5YyW57uf6K6h6KGMCiAgICBuYW1lOiBTdHJpbmcKICB9LAogIGNvbXBvbmVudHM6IHsKICAgIEhvdFRhYmxlOiBIb3RUYWJsZSwKICAgIFN1YkRhdGFEZXRhaWw6IFN1YkRhdGFEZXRhaWwKICB9LAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICByb290OiAnaG90LXRhYmxlJywKICAgICAgbXlSZW5kZXJlcjogdGhpcy5yZW5kZXJlck1lLAogICAgICBzdWJUYWJsZVBhdGg6ICcnLAogICAgICBmb3JtRmllbGRzOiBbXSwKICAgICAgZm9ybUlkOiAnJywKICAgICAgaG90U2V0dGluZ3M6IF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoX2RlZmluZVByb3BlcnR5KF9kZWZpbmVQcm9wZXJ0eShfZGVmaW5lUHJvcGVydHkoewogICAgICAgIGRhdGE6IFsKICAgICAgICAvL+aVsOaNruWPr+S7peaYr+S6jOe7tOaVsOe7hO+8jOS5n+WPr+S7peaYr+aVsOe7hOWvueixoQogICAgICAgIFtdXSwKICAgICAgICBjbGFzc05hbWU6ICJodENlbnRlciBodE1pZGRsZSIsCiAgICAgICAgLy/ljZXlhYPmoLzmloflrZflr7npvZDmlrnlvI8oaHRMZWZ0LGh0UmlnaHQsaHRDZW50ZXIpCiAgICAgICAgY3VycmVudFJvd0NsYXNzTmFtZTogIm15LXNlbGVjdFJvdyIsCiAgICAgICAgLy/nu5npgInkuK3ooYzmt7vliqDoh6rlrprkuYljbGFzc+exu+WQjQogICAgICAgIGN1cnJlbnRDb2xDbGFzc05hbWU6ICJteS1zZWxlY3RDb2wiLAogICAgICAgIC8v57uZ6YCJ5Lit5YiX5re75Yqg6Ieq5a6a5LmJY2xhc3PnsbvlkI0KICAgICAgICBhdXRvV3JhcFJvdzogdHJ1ZSwKICAgICAgICAvL+aWh+Wtl+aYr+WQpuiHquWKqOaNouihjCjlvZPmsqHmnInorr7nva5jb2xXaWR0aHPml7bnlJ/mlYgpCiAgICAgICAgZml4ZWRDb2x1bW5zTGVmdDogMSwKICAgICAgICAvL+WbuuWumuW3pui+ueWIl+aVsAogICAgICAgIGZpeGVkUm93c1RvcDogMCwKICAgICAgICAvL+WbuuWumuS4iui+ueWIl+aVsAogICAgICAgIC8vIGZpbGxIYW5kbGU6IHRydWUsIC8v5piv5ZCm5byA5ZCv5ouW5ou95aSN5Yi25pON5L2cKHRydWUsZmFsc2UsJ2hvcml6b250YWwn5rC05bmz5aSN5Yi2LCd2ZXJ0aWNhbCflnoLnm7TlpI3liLYpCiAgICAgICAgYXV0b1Jvd1NpemU6IGZhbHNlLAogICAgICAgIGF1dG9Db2x1bW5TaXplOiB0cnVlLAogICAgICAgIC8vIGhpZ2hsaWdodGVkUm93czpbXSwKICAgICAgICAvLyByZWFkT25seTp0cnVlLAogICAgICAgIC8vIGNvbW1lbnRzOiB0cnVlLAogICAgICAgIHdpZHRoOiAiMTAwJSIsCiAgICAgICAgaGVpZ2h0OiAiODB2aCIsCiAgICAgICAgc3RyZXRjaEg6ICdhbGwnLAogICAgICAgIGxhbmd1YWdlOiAiemgtQ04iLAogICAgICAgIGNvbEhlYWRlcnM6IHRydWUsCiAgICAgICAgLy9bJ0EnLCAnQicsICdDJ10sIC8v5piv5ZCm5bGV56S65YiX6KGo5aS0LOm7mOiupOaYr0EsQixD562J5a2X5q+NLOWPr+S7pVsn5YiXMScsJ+WIlzInXei/m+ihjOiHquWumuS5ieWxleekugogICAgICAgIHJvd0hlYWRlcnM6IHRydWUsCiAgICAgICAgLy/mmK/lkKblsZXnpLrooYzooajlpLQs6buY6K6k5pivMSwyLDPnrYnmlbDmja4s5Y+v5LulWyfooYwxJywn6KGMMidd6L+b6KGM6Ieq5a6a5LmJ5bGV56S6CiAgICAgICAgY29udGV4dE1lbnU6IHsKICAgICAgICAgIGl0ZW1zOiB7fQogICAgICAgIH0sCiAgICAgICAgbGljZW5zZUtleTogIm5vbi1jb21tZXJjaWFsLWFuZC1ldmFsdWF0aW9uIiwKICAgICAgICBtZXJnZUNlbGxzOiB0cnVlLAogICAgICAgIC8vY29udGV4dE1lbnU6IHRydWUsCiAgICAgICAgd29yZFdyYXA6IHRydWUsCiAgICAgICAgLy/oh6rliqjmjaLooYwKICAgICAgICAvLyBtZXJnZUNlbGxzOiB0cnVlLAogICAgICAgIC8vIG1hbnVhbENvbHVtbkZyZWV6ZTogdHJ1ZSwgLy/miYvliqjlm7rlrprliJcgID8KICAgICAgICAvLyBtYW51YWxDb2x1bW5Nb3ZlOiB0cnVlLCAvL+aJi+WKqOenu+WKqOWIlwogICAgICAgIC8vIG1hbnVhbFJvd01vdmU6IHRydWUsICAgLy/miYvliqjnp7vliqjooYwKICAgICAgICBtYW51YWxDb2x1bW5SZXNpemU6IHRydWUsCiAgICAgICAgLy/miYvlt6Xmm7TmlLnliJfot50KICAgICAgICBtYW51YWxSb3dSZXNpemU6IHRydWUsCiAgICAgICAgLy/miYvliqjmm7TmlLnooYzot50KICAgICAgICAvLyBjb21tZW50czogdHJ1ZSwgLy/mt7vliqDms6jph4ogIAogICAgICAgIC8vIGN1c3RvbUJvcmRlcnM6W10sLy/mt7vliqDovrnmoYYKICAgICAgICBjb2x1bW5Tb3J0aW5nOiBmYWxzZSwKICAgICAgICAvLyBzdHJldGNoSDogJ2FsbCcsLy/moLnmja7lrr3luqbmqKrlkJHmianlsZXvvIxsYXN0OuWPquaJqeWxleacgOWQjuS4gOWIl++8jG5vbmXvvJrpu5jorqTkuI3mianlsZUKICAgICAgICAvLyBmaWxsSGFuZGxlOiB0cnVlLCAvL+mAieS4reaLluaLveWkjeWItiBwb3NzaWJsZSB2YWx1ZXM6IHRydWUsIGZhbHNlLCAiaG9yaXpvbnRhbCIsICJ2ZXJ0aWNhbCIKICAgICAgICAvLyBmaXhlZENvbHVtbnNMZWZ0OiAxLC8v5Zu65a6a5bem6L655YiX5pWwCiAgICAgICAgLy8gZml4ZWRSb3dzVG9wOiAwLC8v5Zu65a6a5LiK6L655YiX5pWwCiAgICAgICAgLy8gYmVmb3JlUmVtb3ZlUm93OiB0aGlzLmJlZm9yZVJlbW92ZVJvd01lLAogICAgICAgIGFmdGVyQ3JlYXRlUm93OiB0aGlzLmFmdGVyQ3JlYXRlUm93TWUsCiAgICAgICAgYWZ0ZXJDaGFuZ2U6IHRoaXMuYWZ0ZXJDaGFuZ2VNZSwKICAgICAgICBhZnRlclNlbGVjdGlvbkVuZDogdGhpcy5hZnRlclNlbGVjdGlvbkVuZE1lLAogICAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyTWUsCiAgICAgICAgY2VsbHM6IHRoaXMuY2VsbHNNZSwKICAgICAgICBhZnRlckxvYWREYXRhOiB0aGlzLmFmdGVyTG9hZERhdGFNZQogICAgICB9LCAibWVyZ2VDZWxscyIsIFsvL+WQiOW5tgogICAgICAgIC8vIHtyb3c6IDEsIGNvbDogMSwgcm93c3BhbjogMywgY29sc3BhbjogM30sICAvL+aMh+WumuWQiOW5tu+8jOS7ju+8iDEsMe+8ieW8gOWni+ihjDPliJcz5ZCI5bm25oiQ5LiA5qC8CiAgICAgICAgLy8ge3JvdzogMywgY29sOiA0LCByb3dzcGFuOiAyLCBjb2xzcGFuOiAyfQogICAgICBdKSwgImNvbHVtbnMiLCBbXSksICJoaWRkZW5Db2x1bW5zIiwgewogICAgICAgIGNvcHlQYXN0ZUVuYWJsZWQ6IHRydWUsCiAgICAgICAgaW5kaWNhdG9yczogdHJ1ZSwKICAgICAgICBjb2x1bW5zOiBbXQogICAgICB9KSwgIm5lc3RlZEhlYWRlcnMiLCBudWxsKSwgImZvcm11bGFzIiwgZmFsc2UpLAogICAgICBtYXRoRXhwTWFwOiB7fSwKICAgICAgcm93TWF0aEV4cE1hcDoge30sCiAgICAgIG1hdGhFeHBJdGVtTWFwOiB7fSwKICAgICAgaW5pdEN1c3REaWFsb2dDb25mOiB7fSwKICAgICAgY3VzdG9tRGlhbG9nOiB7fSwKICAgICAgZmlsbE9yZzoge30sCiAgICAgIHJlYWRPbmx5Q29sdW1uTWFwOiB7fSwKICAgICAgY2VsbFN0eWxlTWFwOiB7fSwKICAgICAgLy/liJfmoLflvI8KICAgICAgbWF0aFJvd0NlbGxNYXA6IHt9LAogICAgICAvL+iuoeeul+WNleWFg+agvAogICAgICBhbGxNYXRoRXhwTGlzdDoge30sCiAgICAgIC8v5omA5pyJ5LiO6K6h566X55u45YWz55qE5YiXCiAgICAgIGNyb3NzTWFwcGluZ3M6IHt9LAogICAgICAvL+i3qOihqOWPluaVsOiuvue9rgogICAgICBjcm9zc01hcHBpbmdTdWJUYWJsZXM6IFtdLAogICAgICAvL+iiq+WPluaVsOeahOWtkOihqAogICAgICBtYWluRmllbGRNYXRoTWFwOiB7fSwKICAgICAgLy/mtonlj4rkuLvooajorqHnrpflhazlvI8KICAgICAgaW5pdFJvd0RhdGE6IHt9LAogICAgICBhbGxSb3dNYXRoTWFwOiB7fSwKICAgICAgLy/ot6jooYzov5DnrpflhazlvI8KICAgICAgZmlyc3RTdW1NYXA6IHt9LAogICAgICAvL+mmluihjOaxh+aAuwogICAgICBpbnN0SWQ6ICcnLAogICAgICAvL+a1geeoi+WunuS+i0lECiAgICAgIGRlZklkOiAnJywKICAgICAgLy/mtYHnqIvlrprkuYlJRAogICAgICBpbml0RGF0YUJhY2s6IFtdLAogICAgICAvL+WIneWni+WMluaVsOaNruWkh+S7vQogICAgICBpbml0U3VtUm93RmllbGQ6ICcnLAogICAgICAvL+e7n+iuoeihjOagh+etvuWtl+autQogICAgICBpbml0U3VtUm93VmFsdWU6ICcnLAogICAgICAvL+e7n+iuoeihjOagh+etvuWtl+auteWAvAogICAgICBjcm9zc01hcHBpbmdGaWVsZHM6IHt9LAogICAgICAvL+i3qOihqOWPluaVsOWNleWFg+agvAogICAgICBtZXJnZUNlbGxGaWVsZDogJycsCiAgICAgIC8v5ZCI5bm25Y2V5YWD5qC85YiXCiAgICAgIHJlYWRPbmx5Um93c01hcDoge30sCiAgICAgIC8v5Y2V5YWD5qC85Y+q6K+76K6+572uCiAgICAgIGNlbGxDYWxjczogW10sCiAgICAgIC8v5Y2V5YWD5qC86K6h566X5YWs5byPCiAgICAgIHJlcXVpcmVkUm93c01hcDoge30sCiAgICAgIC8v5b+F5aGr6K6+572u77yM5o+Q5Lqk5pe25qCh6aqMCiAgICAgIGZpZWxkTmFtZU1hcDoge30KICAgIH07CiAgfSwKICBjb21wdXRlZDogewogICAgaG90SW5zdGFuY2U6IGZ1bmN0aW9uIGhvdEluc3RhbmNlKCkgewogICAgICByZXR1cm4gdGhpcy4kcmVmcy5ob3R0YWJsZS5ob3RJbnN0YW5jZTsKICAgIH0KICB9LAogIG1vdW50ZWQ6IGZ1bmN0aW9uIG1vdW50ZWQoKSB7CiAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgIGlmIChmb3JtSW5zdCAmJiBmb3JtSW5zdC4kcGFyZW50KSB7CiAgICAgIHZhciBjb2x1bW5Tb3J0ID0gdHJ1ZTsKICAgICAgaWYgKGZvcm1JbnN0LiRwYXJlbnQuaW5zdElkKSB7CiAgICAgICAgdGhpcy5pbnN0SWQgPSBmb3JtSW5zdC4kcGFyZW50Lmluc3RJZDsKICAgICAgICBjb2x1bW5Tb3J0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGZvcm1JbnN0LiRwYXJlbnQuZGVmSWQpIHsKICAgICAgICB0aGlzLmRlZklkID0gZm9ybUluc3QuJHBhcmVudC5kZWZJZDsKICAgICAgICBjb2x1bW5Tb3J0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgLy/mtYHnqIvkuK3kuI3lhYHorrjmjpLluo/vvIzlnKjln7rnoYDmlbDmja7nu7TmiqTkuK3lhYHorrjmjpLluo8KICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5Tb3J0aW5nID0gY29sdW1uU29ydDsKICAgIH0KICAgIGlmICh0aGlzLm9wdGlvbnMpIHsKICAgICAgdmFyIG9wdGlvbnNKb24gPSBKU09OLnBhcnNlKHRoaXMub3B0aW9ucyk7CiAgICAgIHRoaXMuc3ViVGFibGVQYXRoID0gb3B0aW9uc0pvbi5zdWJUYWJsZVBhdGg7CiAgICAgIHZhciByZWxhdGlvbnMgPSBvcHRpb25zSm9uLmNvbEhlYWRlcnNSZWxhdGlvbnM7CiAgICAgIHZhciBpc01hdGhFeHAgPSBmYWxzZTsgLy/mmK/lkKbljIXlkKvorqHnrpflhazlvI8KICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgaWYgKG9wdGlvbnNKb24uaW5pdFN1bVJvd0ZpZWxkKSB7CiAgICAgICAgdGhpcy5pbml0U3VtUm93RmllbGQgPSBvcHRpb25zSm9uLmluaXRTdW1Sb3dGaWVsZDsKICAgICAgfQogICAgICBpZiAob3B0aW9uc0pvbi5pbml0U3VtUm93VmFsdWUpIHsKICAgICAgICB0aGlzLmluaXRTdW1Sb3dWYWx1ZSA9IG9wdGlvbnNKb24uaW5pdFN1bVJvd1ZhbHVlOwogICAgICB9CiAgICAgIC8v6K6+572u5o6n5Lu26auY5bqmCiAgICAgIGlmIChvcHRpb25zSm9uLmhlaWdodCkgewogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuaGVpZ2h0ID0gb3B0aW9uc0pvbi5oZWlnaHQgKyAndmgnOwogICAgICB9CiAgICAgIC8v5pS26ZuG5Y2V5YWD5qC86K6h566X5YWs5byPCiAgICAgIGlmIChvcHRpb25zSm9uLmNlbGxDYWxjcyAmJiBvcHRpb25zSm9uLmNlbGxDYWxjcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5jZWxsQ2FsY3MgPSBfdG9Db25zdW1hYmxlQXJyYXkob3B0aW9uc0pvbi5jZWxsQ2FsY3MpOwogICAgICAgIC8v6K6h566X5Y2V5YWD5qC85Y+q6K+7CiAgICAgICAgdGhpcy5jZWxsQ2FsY3MuZm9yRWFjaChmdW5jdGlvbiAoY2VsbENhbGMpIHsKICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBjZWxsQ2FsYy5jZWxsRmllbGQuc3BsaXQoJy4nKVsyXTsKICAgICAgICAgIF90aGlzLnJlYWRPbmx5Um93c01hcFtmaWVsZE5hbWUgKyAnXycgKyAoY2VsbENhbGMucm93SW5kZXggLSAxKV0gPSB0cnVlOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5pS26ZuG6KGo5aS044CB5YiX5ZCI5bm25Y2V5YWD5qC844CB6K6h566X5YWs5byP44CB5a2X5q615p2D6ZmQ562JCiAgICAgIGlmIChyZWxhdGlvbnMgJiYgcmVsYXRpb25zLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgaG90RmllbGRQZXJtaXNzaW9uID0gdGhpcy5wZXJtaXNzaW9uID8gdGhpcy5wZXJtaXNzaW9uWydmaWVsZHMnXVtvcHRpb25zSm9uLmJvU3ViRW50aXR5XSA6IFtdOwogICAgICAgIHZhciBoZWFkZXJzID0gW107CiAgICAgICAgdmFyIGNvbHVtbnMgPSBbXTsKICAgICAgICB2YXIgZGF0YUxpc3QgPSBbW11dOwogICAgICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKCkgewogICAgICAgICAgdmFyIHJlbGF0aW9uID0gcmVsYXRpb25zW2luZGV4XTsKICAgICAgICAgIF90aGlzMi5maWVsZE5hbWVNYXBbcmVsYXRpb24ubmFtZV0gPSByZWxhdGlvbi5kZXNjOwogICAgICAgICAgaGVhZGVycy5wdXNoKHJlbGF0aW9uLmRlc2MpOwogICAgICAgICAgX3RoaXMuaW5pdFJvd0RhdGFbcmVsYXRpb24ubmFtZV0gPSAnJzsKICAgICAgICAgIHZhciBjb2x1bW4gPSByZWxhdGlvbi5jb2x1bW47CiAgICAgICAgICBjb2x1bW4uY2xhc3NOYW1lID0gJ2h0TGVmdCc7CiAgICAgICAgICBpZiAoY29sdW1uLnR5cGUgPT0gJ2Ryb3Bkb3duJyAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi5zb3VyY2UpICYmIGNvbHVtbi5zb3VyY2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgc291cmNlQXJyYXkgPSBbXTsKICAgICAgICAgICAgY29sdW1uLnNvdXJjZS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWUgIT0gJycgJiYgaXRlbS52YWx1ZSAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgc291cmNlQXJyYXkucHVzaChpdGVtLnZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb2x1bW4uc291cmNlID0gc291cmNlQXJyYXk7CiAgICAgICAgICB9CiAgICAgICAgICAvL+aUtumbhuiuoeeul+WFrOW8jwogICAgICAgICAgaWYgKGNvbHVtbi5tYXRoRXhwKSB7CiAgICAgICAgICAgIF90aGlzMi5pbml0TWF0aE1hcChjb2x1bW4pOwogICAgICAgICAgICBpc01hdGhFeHAgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbHVtbi5yb3dNYXRoRXhwICYmIEFycmF5LmlzQXJyYXkoY29sdW1uLnJvd01hdGhFeHApICYmIGNvbHVtbi5yb3dNYXRoRXhwLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgX3RoaXMyLmluaXRSb3dNYXRoTWFwKGNvbHVtbik7CiAgICAgICAgICAgIGlzTWF0aEV4cCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICAvL+aUtumbhuWQiOW5tuWIlwogICAgICAgICAgaWYgKGNvbHVtbi5tZXJnZUNlbGwgPT09IHRydWUpIHsKICAgICAgICAgICAgdmFyIGNlbGxGaWVsZCA9IHsKICAgICAgICAgICAgICBmaWVsZDogY29sdW1uLmRhdGEsCiAgICAgICAgICAgICAgaW5kZXg6IGluZGV4CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICghX3RoaXMyLm1lcmdlQ2VsbEZpZWxkKSB7CiAgICAgICAgICAgICAgX3RoaXMyLm1lcmdlQ2VsbEZpZWxkID0gX29iamVjdFNwcmVhZCh7fSwgY2VsbEZpZWxkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpczIuYWRkQ2VsbEZpZWxkQ2hpbGRyZW4oX3RoaXMyLm1lcmdlQ2VsbEZpZWxkLCBjZWxsRmllbGQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvL+W6lOeUqOa1geeoi+ihqOWNleadg+mZkAogICAgICAgICAgaWYgKGhvdEZpZWxkUGVybWlzc2lvbltjb2x1bW4uZGF0YV0gPT0gJ3InKSB7CiAgICAgICAgICAgIGNvbHVtbi5yZWFkT25seSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKGhvdEZpZWxkUGVybWlzc2lvbltjb2x1bW4uZGF0YV0gPT0gJ24nKSB7CiAgICAgICAgICAgIF90aGlzMi5ob3RTZXR0aW5ncy5oaWRkZW5Db2x1bW5zLmNvbHVtbnMucHVzaChpbmRleCk7CiAgICAgICAgICB9IGVsc2UgaWYgKGhvdEZpZWxkUGVybWlzc2lvbltjb2x1bW4uZGF0YV0gPT0gJ2InKSB7CiAgICAgICAgICAgIGNvbHVtbi5yZXF1aXJlZCA9IHRydWU7CiAgICAgICAgICAgIF90aGlzMi5yZXF1aXJlZFJvd3NNYXBbY29sdW1uLmRhdGFdID0gdHJ1ZTsKICAgICAgICAgIH0KCiAgICAgICAgICAvL+aUtumbhuWPquivuwogICAgICAgICAgaWYgKGNvbHVtbi5yZWFkT25seSkgewogICAgICAgICAgICBfdGhpczIucmVhZE9ubHlDb2x1bW5NYXBbaW5kZXhdID0gewogICAgICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZGF0YSwKICAgICAgICAgICAgICBkZXNjOiByZWxhdGlvbi5kZXNjCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5yZWFkT25seVJvd3MpIHsKICAgICAgICAgICAgLy/ljZXlhYPmoLzlj6ror7sKICAgICAgICAgICAgdmFyIHJlYWRPbmx5Um93cyA9IGNvbHVtbi5yZWFkT25seVJvd3Muc3BsaXQoJywnKTsKICAgICAgICAgICAgcmVhZE9ubHlSb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvd0luZGV4KSB7CiAgICAgICAgICAgICAgX3RoaXMucmVhZE9ubHlSb3dzTWFwW2NvbHVtbi5kYXRhICsgJ18nICsgKHJvd0luZGV4IC0gMSldID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy/mlLbpm4blv4XloasKICAgICAgICAgIGlmIChjb2x1bW4ucmVxdWlyZWQpIHsKICAgICAgICAgICAgX3RoaXMyLnJlcXVpcmVkUm93c01hcFtjb2x1bW4uZGF0YV0gPSB7CiAgICAgICAgICAgICAgYWxsOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgaWYgKGNvbHVtbi5yZXF1aXJlZFJvd3MpIHsKICAgICAgICAgICAgLy/ljZXlhYPmoLzlv4XloasKICAgICAgICAgICAgdmFyIHJlcXVpcmVkUm93cyA9IGNvbHVtbi5yZXF1aXJlZFJvd3Muc3BsaXQoJywnKTsKICAgICAgICAgICAgX3RoaXMucmVxdWlyZWRSb3dzTWFwW2NvbHVtbi5kYXRhXSA9IHsKICAgICAgICAgICAgICBhbGw6IGZhbHNlLAogICAgICAgICAgICAgIHJvd3M6IHJlcXVpcmVkUm93cwogICAgICAgICAgICB9OwogICAgICAgICAgfQoKICAgICAgICAgIC8v5pS26ZuG5YiX5qC35byPCiAgICAgICAgICBfdGhpczIuaGFuZENlbGxTdHlsZShjb2x1bW4pOwoKICAgICAgICAgIC8v5pS26ZuG6aaW6KGM5rGH5oC7CiAgICAgICAgICBpZiAocmVsYXRpb24uaXNTdW0gPT0gdHJ1ZSkgewogICAgICAgICAgICBfdGhpczIuZmlyc3RTdW1NYXBbcmVsYXRpb24ubmFtZV0gPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbik7CiAgICAgICAgfTsKICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgcmVsYXRpb25zLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgX2xvb3AoKTsKICAgICAgICB9CiAgICAgICAgLy/mlLbpm4bot6jooajlj5bmlbDorr7nva4KICAgICAgICB2YXIgY3Jvc3NNYXBwaW5nID0gb3B0aW9uc0pvbi5jcm9zc01hcHBpbmc7CiAgICAgICAgaWYgKGNyb3NzTWFwcGluZyAmJiBBcnJheS5pc0FycmF5KGNyb3NzTWFwcGluZykgJiYgY3Jvc3NNYXBwaW5nLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciBzdWJUYWJsZU1hcCA9IHt9OwogICAgICAgICAgY3Jvc3NNYXBwaW5nLmZvckVhY2goZnVuY3Rpb24gKGNyb3NzTWFwKSB7CiAgICAgICAgICAgIHZhciBjZnJvbUZpZWxkcyA9IGNyb3NzTWFwLmZyb21GaWVsZHM7CiAgICAgICAgICAgIGlmIChjcm9zc01hcC50b0ZpZWxkICYmIGNmcm9tRmllbGRzICYmIEFycmF5LmlzQXJyYXkoY2Zyb21GaWVsZHMpICYmIGNmcm9tRmllbGRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAvL+aUtumbhui3qOihqOWPluaVsOWtl+auteWPiuS9jee9ru+8iOiuvue9ruWPquivu++8iQogICAgICAgICAgICAgIHZhciBjcm9zc0ZpZWxkID0gY3Jvc3NNYXAudG9GaWVsZC5zcGxpdCgnLicpWzJdOwogICAgICAgICAgICAgIGlmICghX3RoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2Nyb3NzRmllbGRdKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbY3Jvc3NGaWVsZF0gPSB7fTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgX3RoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2Nyb3NzRmllbGRdW2Nyb3NzTWFwLnRvSW5kZXggLSAxXSA9IHRydWU7CiAgICAgICAgICAgICAgdmFyIHN1YlRhYmxlTmFtZSA9ICcnOwogICAgICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgY2Zyb21GaWVsZHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgIHZhciBtZnJvbUZpZWxkcyA9IGNmcm9tRmllbGRzW2tdLmZyb21GaWVsZC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgdmFyIHN1YlBhdGggPSBtZnJvbUZpZWxkc1swXSArICcuJyArIG1mcm9tRmllbGRzWzFdOwogICAgICAgICAgICAgICAgaWYgKCFfdGhpcy5jcm9zc01hcHBpbmdzW21mcm9tRmllbGRzWzFdXSkgewogICAgICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdzW21mcm9tRmllbGRzWzFdXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzdWJUYWJsZU1hcFtzdWJQYXRoXSkgewogICAgICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdTdWJUYWJsZXMucHVzaChzdWJQYXRoKTsKICAgICAgICAgICAgICAgICAgc3ViVGFibGVNYXBbc3ViUGF0aF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3ViVGFibGVOYW1lID0gbWZyb21GaWVsZHNbMV07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF90aGlzLmNyb3NzTWFwcGluZ3Nbc3ViVGFibGVOYW1lXS5wdXNoKGNyb3NzTWFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8v5pS26ZuG5Li76KGo6K6h566X6K6+572uCiAgICAgICAgdGhpcy5pbml0TWFpbk1hdGhNYXAob3B0aW9uc0pvbi5tYWluVGFibGVDYWxjcyk7CgogICAgICAgIC8v5pS26ZuG5omA5pyJ6K6h566X5YWs5byP55u45YWz5Y2V5YWD5qC85L+h5oGvCiAgICAgICAgdGhpcy5pbml0QWxsTWF0aEZpZWxkKCk7CiAgICAgICAgLy/liJ3lp4vljJbltYzlpZfooajlpLQKICAgICAgICB0aGlzLmluaXROZXN0ZWRIZWFkZXJzKG9wdGlvbnNKb24sIHJlbGF0aW9ucyk7CiAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb2xIZWFkZXJzID0gaGVhZGVyczsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnMgPSBjb2x1bW5zOwogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGRhdGFMaXN0OwogICAgICAgIHRoaXMuaG90U2V0dGluZ3MubWVyZ2VDZWxscyA9IHRoaXMuYnVpbGRNZXJnZUNlbGwoZGF0YUxpc3QpOwogICAgICB9CiAgICAgIC8v5aSE55CG5paw5aKe5ZKM5Yig6Zmk5p2D6ZmQCiAgICAgIHRoaXMuaGFuZGxlck1lbnUob3B0aW9uc0pvbiwgaXNNYXRoRXhwKTsKICAgICAgLy/ojrflj5blrZDooajlrZfmrrXlsZ7mgKcKICAgICAgLy8gdGhpcy5pbml0Rm9ybUZpZWxkcygpOwogICAgfQogICAgaWYgKHRoaXMuaW5pdGNvbmYpIHsKICAgICAgdmFyIGluaXRDb25mSnNvbiA9IEpTT04ucGFyc2UodGhpcy5pbml0Y29uZik7CiAgICAgIGlmIChpbml0Q29uZkpzb24pIHsKICAgICAgICB0aGlzLmluaXRDdXN0RGlhbG9nQ29uZiA9IGluaXRDb25mSnNvbjsKICAgICAgICBpZiAoaW5pdENvbmZKc29uLm9yZ0NvbmZpZyAmJiAoaW5pdENvbmZKc29uLm9yZ0NvbmZpZy5pZCB8fCBpbml0Q29uZkpzb24ub3JnQ29uZmlnLm5hbWUgfHwgaW5pdENvbmZKc29uLm9yZ0NvbmZpZy5jb2RlIHx8IGluaXRDb25mSnNvbi5vcmdDb25maWcuaW5zdElkKSkgewogICAgICAgICAgLy/liJ3lp4vljJbpg6jpl6jloavliLbljZXkvY0KICAgICAgICAgIHRoaXMuaW5pdEZpbGxPcmcoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9LAogIG1ldGhvZHM6IHsKICAgIGFkZENlbGxGaWVsZENoaWxkcmVuOiBmdW5jdGlvbiBhZGRDZWxsRmllbGRDaGlsZHJlbihmaWVsZCwgY2hpbGRyZW4pIHsKICAgICAgaWYgKGZpZWxkLmNoaWxkcmVuKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2VsbEZpZWxkQ2hpbGRyZW4oZmllbGQuY2hpbGRyZW4sIGNoaWxkcmVuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmaWVsZC5jaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgICB9CiAgICB9LAogICAgaW5pdEZpbGxPcmc6IGZ1bmN0aW9uIGluaXRGaWxsT3JnKCkgewogICAgICB2YXIgY3VzdERpYWxvZyA9IHRoaXMuaW5pdEN1c3REaWFsb2dDb25mOwogICAgICB2YXIgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImN1cnJlbnRVc2VyIikpOwogICAgICBpZiAoY3VzdERpYWxvZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiAoY3VzdERpYWxvZy5vcmdDb25maWcuaWQgfHwgY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlIHx8IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCkgJiYgIXRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgIGlmICghbG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQpKSB7CiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgX3RoaXMuJGh0dHAuZ2V0KCcke3VjfS9hcGkvb3JnL3YxL29yZy9nZXRGaWxsT3JnJykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgICB2YXIgcmVwID0gcmVzcC5kYXRhOwogICAgICAgICAgICBpZiAocmVwLnN0YXRlKSB7CiAgICAgICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IHJlcC52YWx1ZTsKICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCwgSlNPTi5zdHJpbmdpZnkocmVwLnZhbHVlKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVwLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5blvZPliY3nlKjmiLfloavliLbljZXkvY3lpLHotKXvvIEiLAogICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmZpbGxPcmcgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJjdXJGaWxsT3JnXyIgKyBjdXJyZW50VXNlci5hY2NvdW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaW5pdE1hdGhNYXA6IGZ1bmN0aW9uIGluaXRNYXRoTWFwKGNvbHVtbikgewogICAgICAvL+aUtumbhuihjOWGheiuoeeul+WFrOW8jwogICAgICBpZiAoY29sdW1uLm1hdGhFeHApIHsKICAgICAgICAvL+aUtumbhuiuoeeul+WNleWFg+agvAogICAgICAgIHRoaXMubWF0aFJvd0NlbGxNYXBbY29sdW1uLmRhdGFdID0ge307CiAgICAgICAgdGhpcy5tYXRoUm93Q2VsbE1hcFtjb2x1bW4uZGF0YV1bLTFdID0gdHJ1ZTsKICAgICAgICB0aGlzLm1hdGhFeHBNYXBbY29sdW1uLmRhdGFdID0gY29sdW1uLm1hdGhFeHA7CiAgICAgICAgdGhpcy5tYXRoRXhwSXRlbU1hcFtjb2x1bW4uZGF0YV0gPSB7fTsKICAgICAgICB0aGlzLm1hdGhFeHBJdGVtTWFwW2NvbHVtbi5kYXRhXVtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsKICAgICAgICB2YXIgZmllbGRzID0gdGhpcy5wYXJzZUZ1bmNleHBGaWVsZChjb2x1bW4ubWF0aEV4cCk7CiAgICAgICAgaWYgKGZpZWxkcykgewogICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgIGZpZWxkcy5mb3JFYWNoKGZ1bmN0aW9uIChmaWVsZCkgewogICAgICAgICAgICB2YXIgZmllbGRBcnJheSA9IGZpZWxkLnNwbGl0KCcuJyk7CiAgICAgICAgICAgIHZhciBuYSA9IGZpZWxkQXJyYXlbMV07CiAgICAgICAgICAgIHZhciBzYSA9IGZpZWxkQXJyYXlbM107CiAgICAgICAgICAgIGlmICghX3RoaXMubWF0aEV4cEl0ZW1NYXBbbmFdKSB7CiAgICAgICAgICAgICAgX3RoaXMubWF0aEV4cEl0ZW1NYXBbbmFdID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3RoaXMubWF0aEV4cEl0ZW1NYXBbbmFdW2NvbHVtbi5kYXRhXSA9IGNvbHVtbi5tYXRoRXhwOwogICAgICAgICAgICBpZiAoIV90aGlzLm1hdGhFeHBJdGVtTWFwW3NhXSkgewogICAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW3NhXSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW3NhXVtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGluaXRSb3dNYXRoTWFwOiBmdW5jdGlvbiBpbml0Um93TWF0aE1hcChjb2x1bW4pIHsKICAgICAgLy/mlLbpm4bot6jooYzorqHnrpflhazlvI8KICAgICAgaWYgKGNvbHVtbi5yb3dNYXRoRXhwKSB7CiAgICAgICAgdmFyIHJvd01hdGhFeHAgPSBjb2x1bW4ucm93TWF0aEV4cDsKICAgICAgICB0aGlzLmFsbFJvd01hdGhNYXBbY29sdW1uLmRhdGFdID0gcm93TWF0aEV4cDsKICAgICAgICBpZiAoIXRoaXMubWF0aFJvd0NlbGxNYXBbY29sdW1uLmRhdGFdKSB7CiAgICAgICAgICB0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXSA9IHt9OwogICAgICAgIH0KICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHJvd01hdGhFeHAuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgLy/mlLbpm4borqHnrpfljZXlhYPmoLwKICAgICAgICAgIF90aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXVtpdGVtLnNuIC0gMV0gPSB0cnVlOwogICAgICAgICAgdmFyIHN0YXRGdW4gPSBpdGVtLm1hdGhFeHA7CiAgICAgICAgICB2YXIgbXlyZWdleHAgPSAvXFsoLio/KVxdL2c7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBteXJlZ2V4cC5leGVjKHN0YXRGdW4pOwogICAgICAgICAgdmFyIGFycnMgPSBbXTsKICAgICAgICAgIHdoaWxlIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciBpZHggPSBtYXRjaFsxXTsKICAgICAgICAgICAgdmFyIGlkZXhWYWwgPSBpZHguaW5kZXhPZignOicpID09IC0xID8gX3RoaXMudG9OdW1iZXIoaWR4KSA6IGlkeDsKICAgICAgICAgICAgdmFyIGhhcyA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdjsgdiA9IGFycnNbaSsrXTspIHsKICAgICAgICAgICAgICBpZiAodiA9PSBpZGV4VmFsKSBoYXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzKSB7CiAgICAgICAgICAgICAgYXJycy5wdXNoKGlkZXhWYWwpOwogICAgICAgICAgICAgIGlmICghX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV0pIHsKICAgICAgICAgICAgICAgIF90aGlzLnJvd01hdGhFeHBNYXBbY29sdW1uLmRhdGFdID0ge307CiAgICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXSA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIV90aGlzLnJvd01hdGhFeHBNYXBbY29sdW1uLmRhdGFdW2lkZXhWYWxdKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXSA9IFtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXS5wdXNoKGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hdGNoID0gbXlyZWdleHAuZXhlYyhzdGF0RnVuKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIGluaXRNYWluTWF0aE1hcDogZnVuY3Rpb24gaW5pdE1haW5NYXRoTWFwKG1haW5UYWJsZUNhbGNzKSB7CiAgICAgIC8v5pS26ZuG5Li76KGo6K6h566X5YWs5byPCiAgICAgIGlmIChtYWluVGFibGVDYWxjcyAmJiBBcnJheS5pc0FycmF5KG1haW5UYWJsZUNhbGNzKSAmJiBtYWluVGFibGVDYWxjcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIG1haW5GaWVsZE1hdGhNYXAgPSB7fTsKICAgICAgICBtYWluVGFibGVDYWxjcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxjKSB7CiAgICAgICAgICBpZiAoY2FsYy5zdW1GaWVsZCAmJiBjYWxjLm1haW5GaWVsZCkgewogICAgICAgICAgICB2YXIgc3VtRmllbGRQYXRoID0gY2FsYy5zdW1GaWVsZC5zcGxpdCgiLiIpOwogICAgICAgICAgICBtYWluRmllbGRNYXRoTWFwW3N1bUZpZWxkUGF0aFsyXV0gPSBjYWxjOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMubWFpbkZpZWxkTWF0aE1hcCA9IG1haW5GaWVsZE1hdGhNYXA7CiAgICAgIH0KICAgIH0sCiAgICBpbml0QWxsTWF0aEZpZWxkOiBmdW5jdGlvbiBpbml0QWxsTWF0aEZpZWxkKCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgcm93TWF0aE1hcCA9IF90aGlzLnJvd01hdGhFeHBNYXA7CiAgICAgIHZhciBtYXRoTWFwID0gX3RoaXMubWF0aEV4cE1hcDsKICAgICAgdmFyIG1hdGhFeHBJdGVtTWFwID0gX3RoaXMubWF0aEV4cEl0ZW1NYXA7CiAgICAgIHZhciByb3dFeGVjQXJyYXkgPSBbXTsKICAgICAgaWYgKHJvd01hdGhNYXApIHsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93TWF0aE1hcCkgewogICAgICAgICAgaWYgKHJvd01hdGhNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICB2YXIgcm93TWF0aCA9IHJvd01hdGhNYXBba2V5XTsKICAgICAgICAgICAgdmFyIHJvd0l0ZW0gPSB7CiAgICAgICAgICAgICAgbmFtZToga2V5LAogICAgICAgICAgICAgIGlzQWxsOiBmYWxzZSwKICAgICAgICAgICAgICBpbmRleDogW10KICAgICAgICAgICAgfTsKICAgICAgICAgICAgZm9yICh2YXIgaWR4IGluIHJvd01hdGgpIHsKICAgICAgICAgICAgICBpZiAocm93TWF0aC5oYXNPd25Qcm9wZXJ0eShpZHgpKSB7CiAgICAgICAgICAgICAgICBpZiAoaWR4LmluZGV4T2YoJzonKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICB2YXIgZkFycmF5ID0gaWR4LnNwbGl0KCI6Iik7CiAgICAgICAgICAgICAgICAgIGlmIChmQXJyYXkubGVuZ3RoID09IDIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYSA9IF90aGlzLnRvTnVtYmVyKGZBcnJheVswXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGIgPSBfdGhpcy50b051bWJlcihmQXJyYXlbMV0pOwogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSBhOyBpIDw9IGI7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgcm93SXRlbS5pbmRleC5wdXNoKGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcm93SXRlbS5pbmRleC5wdXNoKF90aGlzLnRvTnVtYmVyKF90aGlzLnRvTnVtYmVyKGlkeCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcm93RXhlY0FycmF5LnB1c2gocm93SXRlbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChtYXRoTWFwKSB7CiAgICAgICAgZm9yICh2YXIgbWEgaW4gbWF0aE1hcCkgewogICAgICAgICAgaWYgKG1hdGhNYXAuaGFzT3duUHJvcGVydHkobWEpKSB7CiAgICAgICAgICAgIHJvd0V4ZWNBcnJheS5wdXNoKHsKICAgICAgICAgICAgICBuYW1lOiBtYSwKICAgICAgICAgICAgICBpc0FsbDogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHJvd0V4ZWNBcnJheSAmJiByb3dFeGVjQXJyYXkubGVuZ3RoID4gMCkgewogICAgICAgIF90aGlzLmFsbE1hdGhFeHBMaXN0ID0gcm93RXhlY0FycmF5OwogICAgICB9CiAgICB9LAogICAgLy/liJ3lp4vljJbltYzlpZfooajlpLQKICAgIGluaXROZXN0ZWRIZWFkZXJzOiBmdW5jdGlvbiBpbml0TmVzdGVkSGVhZGVycyhvcHRpb25zLCBoZWFkZXJzKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBnZXRSb3dMYWJsZSA9IGZ1bmN0aW9uIGdldFJvd0xhYmxlKGNlbGwpIHsKICAgICAgICB2YXIgc3RhcnQgPSBjZWxsLnN0YXJ0RmllbGQ7CiAgICAgICAgdmFyIGVuZCA9IGNlbGwuZW5kRmllbGQ7CiAgICAgICAgdmFyIGNvbHNwYW4gPSAwOwogICAgICAgIHZhciBpc0VuZCA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKCFpc0VuZCkgewogICAgICAgICAgICBpZiAoc3RhcnQgPT0gaGVhZGVyc1tpXS5uYW1lKSB7CiAgICAgICAgICAgICAgY29sc3BhbisrOwogICAgICAgICAgICB9IGVsc2UgaWYgKGVuZCA9PSBoZWFkZXJzW2ldLm5hbWUpIHsKICAgICAgICAgICAgICBjb2xzcGFuKys7CiAgICAgICAgICAgICAgaXNFbmQgPSB0cnVlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNvbHNwYW4gPiAwKSB7CiAgICAgICAgICAgICAgY29sc3BhbisrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsYWJlbDogY2VsbC5uYW1lLAogICAgICAgICAgY29sc3BhbjogY29sc3BhbgogICAgICAgIH07CiAgICAgIH07CiAgICAgIHZhciBnZXRJc0luTmVzdGVkID0gZnVuY3Rpb24gZ2V0SXNJbk5lc3RlZChuYW1lLCBpdGVtSGVhZGVycykgewogICAgICAgIHZhciByb3dMYWJsZSA9IG51bGw7CiAgICAgICAgaXRlbUhlYWRlcnMuZm9yRWFjaChmdW5jdGlvbiAoY2VsbCkgewogICAgICAgICAgaWYgKCFyb3dMYWJsZSAmJiBuYW1lID09IGNlbGwuc3RhcnRGaWVsZCkgewogICAgICAgICAgICByb3dMYWJsZSA9IGdldFJvd0xhYmxlKGNlbGwpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByb3dMYWJsZTsKICAgICAgfTsKICAgICAgaWYgKG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMubmVzdGVkSGVhZGVycyAhPSAndW5kZWZpbmVkJyAmJiBvcHRpb25zLm5lc3RlZEhlYWRlcnMpIHsKICAgICAgICB2YXIgbXlOZXN0ZWRIZWFkZXJzID0gW107CiAgICAgICAgb3B0aW9ucy5uZXN0ZWRIZWFkZXJzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIG5lc3RlZEhlYWRlciA9IFtdOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciByb3dMYWJsZSA9IGdldElzSW5OZXN0ZWQoaGVhZGVyc1tpXS5uYW1lLCByb3cuaGVhZGVycyk7CiAgICAgICAgICAgIGlmICghcm93TGFibGUpIHsKICAgICAgICAgICAgICBuZXN0ZWRIZWFkZXIucHVzaChoZWFkZXJzW2ldLmRlc2MpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG5lc3RlZEhlYWRlci5wdXNoKHJvd0xhYmxlKTsKICAgICAgICAgICAgICBpID0gaSArIHJvd0xhYmxlLmNvbHNwYW4gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkobmVzdGVkSGVhZGVyKSAhPT0gSlNPTi5zdHJpbmdpZnkoaGVhZGVycykpIHsKICAgICAgICAgICAgbXlOZXN0ZWRIZWFkZXJzLnB1c2gobmVzdGVkSGVhZGVyKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBpZiAobXlOZXN0ZWRIZWFkZXJzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciBoZWFkZXJBcnJheSA9IFtdOwogICAgICAgICAgaGVhZGVycy5mb3JFYWNoKGZ1bmN0aW9uIChteUhlYWRlcikgewogICAgICAgICAgICBoZWFkZXJBcnJheS5wdXNoKG15SGVhZGVyLmRlc2MpOwogICAgICAgICAgfSk7CiAgICAgICAgICBteU5lc3RlZEhlYWRlcnMucHVzaChoZWFkZXJBcnJheSk7CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm5lc3RlZEhlYWRlcnMgPSBteU5lc3RlZEhlYWRlcnM7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaW5pdEZvcm1GaWVsZHM6IGZ1bmN0aW9uIGluaXRGb3JtRmllbGRzKCkgewogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRoaXMuZm9ybUlkID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcGFyZW50LiRwYXJlbnQuZm9ybUlkOwogICAgICBpZiAodGhpcy5mb3JtSWQgJiYgdHlwZW9mIHRoaXMuZm9ybUlkICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdmFyIHBhdGhzID0gdGhpcy5zdWJUYWJsZVBhdGguc3BsaXQoJy4nKTsKICAgICAgICB2YXIgZW50TmFtZSA9IHBhdGhzWzFdLnNwbGl0KCdzdWJfJylbMV07CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB0aGlzLiRodHRwLmdldCgnJHtmb3JtfS9mb3JtL2Zvcm0vdjEvZ2V0Rm9ybUZpZWxkcz9mb3JtSWQ9JyArIHRoaXMuZm9ybUlkICsgJyZlbnROYW1lPScgKyBlbnROYW1lKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICBpZiAocmVzcC5kYXRhKSB7CiAgICAgICAgICAgIF90aGlzLmZvcm1GaWVsZHMgPSByZXNwLmRhdGE7CiAgICAgICAgICB9CiAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7fSk7CiAgICAgIH0KICAgIH0sCiAgICBoYW5kbGVyTWVudTogZnVuY3Rpb24gaGFuZGxlck1lbnUob3B0aW9uc0pvbiwgaXNNYXRoRXhwKSB7CiAgICAgIGlmICh0aGlzLnBlcm1pc3Npb24gJiYgdGhpcy5wZXJtaXNzaW9uWyd0YWJsZSddKSB7CiAgICAgICAgdmFyIHRhYlBlcm1pc3Npb24gPSB0aGlzLnBlcm1pc3Npb25bJ3RhYmxlJ11bb3B0aW9uc0pvbi5ib1N1YkVudGl0eV07CiAgICAgICAgdmFyIF9fdGhpcyA9IHRoaXM7CiAgICAgICAgLy8gdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicm93X2RldGFpbCJdID0ge25hbWU6J+aYjue7hicsY2FsbGJhY2s6ZnVuY3Rpb24oKXsKICAgICAgICAvLyAgICAgICBsZXQgY2VsbCA9IHRoaXMuZ2V0U2VsZWN0ZWQoKVswXTsKICAgICAgICAvLyAgICAgICBjb25zdCBpbmRleCA9IGNlbGxbMF07CiAgICAgICAgLy8gICAgICAgY29uc3QgY3VyRGF0YSA9IF9fdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsKICAgICAgICAvLyAgICAgICBfX3RoaXMuJHJlZnNbJ3N1YkRhdGFEZXRhaWwnXS5oYW5kbGVPcGVuKGN1ckRhdGFbaW5kZXhdLF9fdGhpcy5mb3JtRmllbGRzKTsKICAgICAgICAvLyAgICAgfSwKICAgICAgICAvLyB9OwogICAgICAgIGlmICh0YWJQZXJtaXNzaW9uICYmIHRhYlBlcm1pc3Npb24uYWRkID09IHRydWUpIHsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJvd19hYm92ZSJdID0gewogICAgICAgICAgICBuYW1lOiAn5LiK5pa55o+S5YWl5LiA6KGMJwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJvd19iZWxvdyJdID0gewogICAgICAgICAgICBuYW1lOiAn5LiL5pa55o+S5YWl5LiA6KGMJwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJvd191cCJdID0gewogICAgICAgICAgICBuYW1lOiAn5LiK56e7JywKICAgICAgICAgICAgY2FsbGJhY2s6IGZ1bmN0aW9uIGNhbGxiYWNrKCkgewogICAgICAgICAgICAgIHZhciBjZWxsID0gdGhpcy5nZXRTZWxlY3RlZCgpWzBdOwogICAgICAgICAgICAgIHZhciBpbmRleCA9IGNlbGxbMF07CiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICBfX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAi5bey57uP5piv5YiX6KGo5Lit56ys5LiA5L2NIiwKICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGRhdGFMaXN0ID0gX190aGlzLmhvdFNldHRpbmdzLmRhdGE7CiAgICAgICAgICAgICAgICB2YXIgdCA9IGRhdGFMaXN0W2luZGV4IC0gMV07CiAgICAgICAgICAgICAgICBkYXRhTGlzdFtpbmRleCAtIDFdID0gZGF0YUxpc3RbaW5kZXhdOwogICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXhdID0gdDsKICAgICAgICAgICAgICAgIF9fdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW107CiAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGRhdGFMaXN0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuY29udGV4dE1lbnUuaXRlbXNbInJvd19kb3duIl0gPSB7CiAgICAgICAgICAgIG5hbWU6ICfkuIvnp7snLAogICAgICAgICAgICBjYWxsYmFjazogZnVuY3Rpb24gY2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgdmFyIGNlbGwgPSB0aGlzLmdldFNlbGVjdGVkKClbMF07CiAgICAgICAgICAgICAgdmFyIGluZGV4ID0gY2VsbFswXTsKICAgICAgICAgICAgICB2YXIgZGF0YUxpc3QgPSBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YTsKICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGRhdGFMaXN0Lmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIF9fdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLlt7Lnu4/mmK/liJfooajkuK3mnIDlkI7kuIDkvY0iLAogICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgdCA9IGRhdGFMaXN0W2luZGV4ICsgMV07CiAgICAgICAgICAgICAgICBkYXRhTGlzdFtpbmRleCArIDFdID0gZGF0YUxpc3RbaW5kZXhdOwogICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXhdID0gdDsKICAgICAgICAgICAgICAgIF9fdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW107CiAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGRhdGFMaXN0OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGlmICh0YWJQZXJtaXNzaW9uICYmIHRhYlBlcm1pc3Npb24uZGVsID09IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicmVtb3ZlX3JvdyJdID0gewogICAgICAgICAgICAgIG5hbWU6ICfliKDpmaTooYwnCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgaGFuZENlbGxTdHlsZTogZnVuY3Rpb24gaGFuZENlbGxTdHlsZShjb2x1bW4pIHsKICAgICAgaWYgKGNvbHVtbi5zdHlsZSkgewogICAgICAgIHZhciBjc3R5bGUgPSAnJzsKICAgICAgICBpZiAoY29sdW1uLnN0eWxlLmRpeVN0eWxlKSB7CiAgICAgICAgICBjc3R5bGUgPSBjb2x1bW4uc3R5bGUuZGl5U3R5bGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChjb2x1bW4uc3R5bGUuYmFja2dyb3VuZCkgewogICAgICAgICAgICBjc3R5bGUgPSAnYmFja2dyb3VuZC1jb2xvcjonICsgY29sdW1uLnN0eWxlLmJhY2tncm91bmQgKyAnOyc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29sdW1uLnN0eWxlLmJvbGQpIHsKICAgICAgICAgICAgY3N0eWxlID0gY3N0eWxlICsgJ2ZvbnQtd2VpZ2h0OiBib2xkOyc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY29sdW1uLnN0eWxlLnNpemUpIHsKICAgICAgICAgICAgY3N0eWxlID0gY3N0eWxlICsgJ2ZvbnQtc2l6ZTonICsgY29sdW1uLnN0eWxlLnNpemUgKyAncHg7JzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjb2x1bW4uc3R5bGUuY29sb3IpIHsKICAgICAgICAgICAgY3N0eWxlID0gY3N0eWxlICsgJ2NvbG9yOicgKyBjb2x1bW4uc3R5bGUuY29sb3IgKyAnOyc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjc3R5bGUpIHsKICAgICAgICAgIHRoaXMuY2VsbFN0eWxlTWFwW2NvbHVtbi5kYXRhXSA9IGNzdHlsZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBjZWxsc01lOiBmdW5jdGlvbiBjZWxsc01lKHJvdywgY29sLCBwcm9wKSB7CiAgICAgIHZhciBjZWxsUHJvcGVydGllcyA9IHsKICAgICAgICByZW5kZXJlcjogdGhpcy5yZW5kZXJlck1lCiAgICAgIH07CiAgICAgIC8v6K6h566X5YWs5byP5Y2V5YWD5qC86K6+572u5Y+q6K+7CiAgICAgIGlmICh0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdICYmICh0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdWy0xXSA9PT0gdHJ1ZSB8fCB0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdW3Jvd10gPT09IHRydWUpKSB7CiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW3Byb3BdICYmIHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW3Byb3BdW3Jvd10gPT09IHRydWUpIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5maXJzdFN1bU1hcFtwcm9wXSAmJiByb3cgPT0gMCkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICh0aGlzLnJlYWRPbmx5Um93c01hcFtwcm9wICsgJ18nICsgcm93XSA9PT0gdHJ1ZSkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gY2VsbFByb3BlcnRpZXM7CiAgICB9LAogICAgYWZ0ZXJMb2FkRGF0YU1lOiBmdW5jdGlvbiBhZnRlckxvYWREYXRhTWUoKSB7CiAgICAgIC8vIGlmKHRoaXMuaXNJbml0VGVtcGxhdGVEYXRhIT09J3RydWUnICYmIHRoaXMuaG90U2V0dGluZ3MuZGF0YSAmJiB0aGlzLmhvdFNldHRpbmdzLmRhdGEubGVuZ3RoPT0xICYmIAogICAgICAvLyAgIEFycmF5LmlzQXJyYXkodGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKSl7CiAgICAgIC8vICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdID0gey4uLnRoaXMuaW5pdFJvd0RhdGF9OwogICAgICAvLyB9CiAgICAgIC8vdGhpcy5ob3RJbnN0YW5jZS5yZW5kZXIoKTsKICAgIH0sCiAgICByZW5kZXJlck1lOiBmdW5jdGlvbiByZW5kZXJlck1lKGluc3RhbmNlLCB0ZCwgcm93LCBjb2wsIHByb3AsIHZhbHVlLCBjZWxsUHJvcGVydGllcykgewogICAgICBIYW5kc29udGFibGUucmVuZGVyZXJzLlRleHRSZW5kZXJlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICBpZiAodGhpcy5jZWxsU3R5bGVNYXBbcHJvcF0pIHsKICAgICAgICB0ZC5zdHlsZSA9IHRoaXMuY2VsbFN0eWxlTWFwW3Byb3BdOwogICAgICB9CiAgICAgIHRkLnN0eWxlLmxpbmVIZWlnaHQgPSAnMjJweCc7CiAgICAgIGlmICh0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdICYmICh0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdWy0xXSA9PT0gdHJ1ZSB8fCB0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdW3Jvd10gPT09IHRydWUpKSB7CiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOwogICAgICAgIHRkLnN0eWxlLmJhY2tncm91bmQgPSAnI0Y1RjdGQSc7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbcHJvcF0gJiYgdGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbcHJvcF1bcm93XSA9PT0gdHJ1ZSkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgICB0ZC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNGNUY3RkEnOwogICAgICB9IGVsc2UgaWYgKHRoaXMuZmlyc3RTdW1NYXBbcHJvcF0gJiYgcm93ID09IDApIHsKICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7CiAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRjVGN0ZBJzsKICAgICAgfSBlbHNlIGlmICh0aGlzLnJlYWRPbmx5Um93c01hcFtwcm9wICsgJ18nICsgcm93XSA9PT0gdHJ1ZSkgewogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsKICAgICAgICB0ZC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNGNUY3RkEnOwogICAgICB9CiAgICB9LAogICAgYnVpbGRNZXJnZUNlbGw6IGZ1bmN0aW9uIGJ1aWxkTWVyZ2VDZWxsKGRhdGFMaXN0KSB7CiAgICAgIGlmICghZGF0YUxpc3QpIHsKICAgICAgICBkYXRhTGlzdCA9IHRoaXMuZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgIH0KICAgICAgaWYgKGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCA9PSAxICYmIE9iamVjdC5rZXlzKGRhdGFMaXN0WzBdKS5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgbWVyZ2VDZWxscyA9IFtdOwogICAgICB2YXIgbWVyZ2VmID0gewogICAgICAgIHJvdzogMCwKICAgICAgICBjb2w6IDAsCiAgICAgICAgcm93c3BhbjogZGF0YUxpc3QubGVuZ3RoLAogICAgICAgIGNvbHNwYW46IDEKICAgICAgfTsKICAgICAgdGhpcy5nZXRDaGlsZHJlbk1lcmdlQ2VsbChtZXJnZUNlbGxzLCBkYXRhTGlzdCwgbWVyZ2VmLCB0aGlzLm1lcmdlQ2VsbEZpZWxkKTsKICAgICAgdGhpcy5tZXJnZUNlbGxzID0gbWVyZ2VDZWxsczsKICAgICAgcmV0dXJuIG1lcmdlQ2VsbHM7CiAgICB9LAogICAgZ2V0Q2hpbGRyZW5NZXJnZUNlbGw6IGZ1bmN0aW9uIGdldENoaWxkcmVuTWVyZ2VDZWxsKG1lcmdlQ2VsbHMsIGRhdGFMaXN0LCBtZXJnZSwgZmllbGQpIHsKICAgICAgdmFyIG1maWVsZCA9IGZpZWxkOwogICAgICB2YXIgbWVyZ2VNYXAgPSB7fTsKICAgICAgdmFyIGluZGV4TWFwID0ge307CiAgICAgIGZvciAodmFyIGkgPSBtZXJnZS5yb3c7IGkgPCBtZXJnZS5yb3cgKyBtZXJnZS5yb3dzcGFuOyBpKyspIHsKICAgICAgICB2YXIgaXRlbSA9IGRhdGFMaXN0W2ldOwogICAgICAgIGluZGV4TWFwW21maWVsZC5maWVsZF0gPSBtZmllbGQuaW5kZXg7CiAgICAgICAgaWYgKCFtZXJnZU1hcFttZmllbGQuZmllbGRdKSB7CiAgICAgICAgICBtZXJnZU1hcFttZmllbGQuZmllbGRdID0gewogICAgICAgICAgICB2YWx1ZTogaXRlbVttZmllbGQuZmllbGRdLAogICAgICAgICAgICBzaXplOiAxLAogICAgICAgICAgICBzdGFydFJvdzogaQogICAgICAgICAgfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG9tZmllbGQgPSBtZXJnZU1hcFttZmllbGQuZmllbGRdOwogICAgICAgICAgaWYgKG9tZmllbGQudmFsdWUgPT0gbnVsbCB8fCBvbWZpZWxkLnZhbHVlID09ICdudWxsJyB8fCBvbWZpZWxkLnZhbHVlID09ICd1bmRlZmluZWQnIHx8IG9tZmllbGQudmFsdWUgPT09ICcnIHx8IG9tZmllbGQudmFsdWUgIT0gaXRlbVttZmllbGQuZmllbGRdKSB7CiAgICAgICAgICAgIGlmIChvbWZpZWxkLnNpemUgPiAxKSB7CiAgICAgICAgICAgICAgdmFyIG1lcmdlZiA9IHsKICAgICAgICAgICAgICAgIHJvdzogb21maWVsZC5zdGFydFJvdywKICAgICAgICAgICAgICAgIGNvbDogbWZpZWxkLmluZGV4LAogICAgICAgICAgICAgICAgcm93c3Bhbjogb21maWVsZC5zaXplLAogICAgICAgICAgICAgICAgY29sc3BhbjogMQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgbWVyZ2VDZWxscy5wdXNoKF9vYmplY3RTcHJlYWQoe30sIG1lcmdlZikpOwogICAgICAgICAgICAgIGlmIChtZmllbGQuY2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5NZXJnZUNlbGwobWVyZ2VDZWxscywgZGF0YUxpc3QsIG1lcmdlZiwgbWZpZWxkLmNoaWxkcmVuKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsZXRlIG1lcmdlTWFwW21maWVsZC5maWVsZF07CiAgICAgICAgICAgIG1lcmdlTWFwW21maWVsZC5maWVsZF0gPSB7CiAgICAgICAgICAgICAgdmFsdWU6IGl0ZW1bbWZpZWxkLmZpZWxkXSwKICAgICAgICAgICAgICBzaXplOiAxLAogICAgICAgICAgICAgIHN0YXJ0Um93OiBpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvbWZpZWxkLnNpemUrKzsKICAgICAgICAgICAgbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXSA9IG9tZmllbGQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZvciAodmFyIGtleSBpbiBtZXJnZU1hcCkgewogICAgICAgIGlmIChtZXJnZU1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICB2YXIgX21lcmdlID0gbWVyZ2VNYXBba2V5XTsKICAgICAgICAgIGlmIChfbWVyZ2Uuc2l6ZSA+IDEpIHsKICAgICAgICAgICAgdmFyIF9tZXJnZWYgPSB7CiAgICAgICAgICAgICAgcm93OiBfbWVyZ2Uuc3RhcnRSb3csCiAgICAgICAgICAgICAgY29sOiBpbmRleE1hcFtrZXldLAogICAgICAgICAgICAgIHJvd3NwYW46IF9tZXJnZS5zaXplLAogICAgICAgICAgICAgIGNvbHNwYW46IDEKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbWVyZ2VDZWxscy5wdXNoKF9vYmplY3RTcHJlYWQoe30sIF9tZXJnZWYpKTsKICAgICAgICAgICAgaWYgKG1maWVsZC5jaGlsZHJlbikgewogICAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5NZXJnZUNlbGwobWVyZ2VDZWxscywgZGF0YUxpc3QsIF9tZXJnZWYsIG1maWVsZC5jaGlsZHJlbik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBiZWZvcmVSZW1vdmVSb3dNZTogZnVuY3Rpb24gYmVmb3JlUmVtb3ZlUm93TWUoY2hhbmdlcywgc291cmNlKSB7Ly8g5pWw5o2u5pS55Y+Y5pe26Kem5Y+R5q2k5pa55rOVCiAgICB9LAogICAgLy8g5re75Yqg6KGMCiAgICBhZnRlckNyZWF0ZVJvd01lOiBmdW5jdGlvbiBhZnRlckNyZWF0ZVJvd01lKGNoYW5nZXMpIHsKICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhW2NoYW5nZXNdID0gX29iamVjdFNwcmVhZCh7fSwgdGhpcy5pbml0Um93RGF0YSk7CiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSkpIHsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSBfb2JqZWN0U3ByZWFkKHt9LCB0aGlzLmluaXRSb3dEYXRhKTsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSB0aGlzLmZpbGxPcmdEYXRhRmllbGQodGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKTsKICAgICAgfQogICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbY2hhbmdlc10gPSB0aGlzLmZpbGxPcmdEYXRhRmllbGQodGhpcy5ob3RTZXR0aW5ncy5kYXRhW2NoYW5nZXNdKTsKICAgIH0sCiAgICAvLyDmlrDlop7ooYzml7bvvIzliqjmgIHmlLnlj5jlgLwKICAgIGFmdGVyQ2hhbmdlTWU6IGZ1bmN0aW9uIGFmdGVyQ2hhbmdlTWUoY2hhbmdlcywgc291cmNlKSB7CiAgICAgIGlmIChzb3VyY2UgPT0gJ2VkaXQnIHx8IHNvdXJjZSA9PSAnQXV0b2ZpbGwuZmlsbCcpIHsKICAgICAgICAvL+aJp+ihjOiuoeeul+WFrOW8jwogICAgICAgIC8vdGhpcy5leGVjTWF0aEV4cFNpbmdsZShjaGFuZ2VzKTsKICAgICAgICAvL3RoaXMuZXhlY01hdGhFeHBBbGwoY2hhbmdlcyk7CiAgICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cChudWxsLCBjaGFuZ2VzKTsKICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPT0gJ0NvcHlQYXN0ZS5wYXN0ZScgJiYgY2hhbmdlcyAmJiBjaGFuZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgaG90RGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOwogICAgICAgIHZhciBpc0NoYW5nZSA9IGZhbHNlOwogICAgICAgIGlmIChob3REYXRhKSB7CiAgICAgICAgICBjaGFuZ2VzLmZvckVhY2goZnVuY3Rpb24gKGNoYW5nZSkgewogICAgICAgICAgICB2YXIgY2hhbmdlSW5kZXggPSBjaGFuZ2VbMF07CiAgICAgICAgICAgIHZhciBjaGFuZ2VGaWVsZCA9IGNoYW5nZVsxXTsKICAgICAgICAgICAgdmFyIGNoYW5nZVZhbHVlID0gY2hhbmdlWzNdOwogICAgICAgICAgICBpZiAoY2hhbmdlVmFsdWUgPT09ICfjgIAnKSB7CiAgICAgICAgICAgICAgaG90RGF0YVtjaGFuZ2VJbmRleF1bY2hhbmdlRmllbGRdID0gJyc7CiAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChpc0NoYW5nZSkgewogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbXTsKICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gaG90RGF0YTsKICAgICAgICAgIH0KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHRoaXMuZXhlY0Nyb3NzTWFwcGluZygpOyAvL+aJp+ihjOi3qOihqOWPluaVsAogICAgICAgICAgICB0aGlzLmV4ZWNDZWxsTWF0aEV4cChob3REYXRhKTsgLy/miafooYzorqHnrpflhazlvI8gCiAgICAgICAgICB9IGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgZXhlY01hdGhFeHBBbGw6IGZ1bmN0aW9uIGV4ZWNNYXRoRXhwQWxsKGNoYW5nZXMpIHsKICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgaXNDaGFuZ2UgPSBmYWxzZTsKICAgICAgICB2YXIgaG90RGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOwogICAgICAgIHZhciBmc3VtTWFwID0gdGhpcy5maXJzdFN1bU1hcDsKICAgICAgICB2YXIgY2hhbmdlRmllbGRzID0ge307CiAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHsKICAgICAgICAgIC8v5omn6KGM6Leo6KGM6K6h566X5YWs5byPCiAgICAgICAgICB2YXIgY2hhbmdlSW5kZXggPSBjaGFuZ2VbMF07CiAgICAgICAgICB2YXIgY2hhbmdlRmllbGQgPSBjaGFuZ2VbMV07CiAgICAgICAgICBjaGFuZ2VGaWVsZHNbY2hhbmdlRmllbGRdID0gdHJ1ZTsKICAgICAgICAgIC8v5omn6KGM6KGM5YaF6K6h566X5YWs5byPCiAgICAgICAgICB2YXIgZXhlTWF0aFJlc3VsdCA9IF90aGlzLmV4ZUFsbE1hdGhFeHAoaG90RGF0YSwgX3RoaXMsIGNoYW5nZUluZGV4LCBpc0NoYW5nZSk7CiAgICAgICAgICBob3REYXRhID0gZXhlTWF0aFJlc3VsdC5kYXRhOwogICAgICAgICAgaWYgKGV4ZU1hdGhSZXN1bHQuaXNDaGFuZ2UpIHsKICAgICAgICAgICAgaXNDaGFuZ2UgPSBleGVNYXRoUmVzdWx0LmlzQ2hhbmdlOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvL+aJp+ihjOi3qOihjOiuoeeul+WFrOW8jwogICAgICAgIHZhciBleGVSb3dSZXN1bHQgPSBfdGhpcy5leGVBbGxSb3dNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBpc0NoYW5nZSk7CiAgICAgICAgaG90RGF0YSA9IGV4ZVJvd1Jlc3VsdC5kYXRhOwogICAgICAgIGlmIChleGVSb3dSZXN1bHQuaXNDaGFuZ2UpIHsKICAgICAgICAgIGlzQ2hhbmdlID0gZXhlUm93UmVzdWx0LmlzQ2hhbmdlOwogICAgICAgIH0KCiAgICAgICAgLy/miafooYzljZXlhYPmoLzorqHnrpflhazlvI8KICAgICAgICB2YXIgZXhlQ2VsbFJlc3VsdCA9IF90aGlzLmV4ZUNlbGxNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBpc0NoYW5nZSk7CiAgICAgICAgaG90RGF0YSA9IGV4ZUNlbGxSZXN1bHQuZGF0YTsKICAgICAgICBpZiAoZXhlQ2VsbFJlc3VsdC5pc0NoYW5nZSkgewogICAgICAgICAgaXNDaGFuZ2UgPSBleGVDZWxsUmVzdWx0LmlzQ2hhbmdlOwogICAgICAgIH0KCiAgICAgICAgLy/miafooYzpppbooYzmsYfmgLsKICAgICAgICBpZiAoJ3t9JyAhPSBKU09OLnN0cmluZ2lmeShmc3VtTWFwKSkgewogICAgICAgICAgZm9yICh2YXIgc3VtS2V5IGluIGZzdW1NYXApIHsKICAgICAgICAgICAgaWYgKGZzdW1NYXAuaGFzT3duUHJvcGVydHkoc3VtS2V5KSkgewogICAgICAgICAgICAgIHZhciB0ZW1wUmVzdWx0ID0gX3RoaXMuZXhlRmlyc3RSb3dTdW0oaG90RGF0YSwgc3VtS2V5LCBfdGhpcywgaXNDaGFuZ2UsIGZzdW1NYXApOwogICAgICAgICAgICAgIGhvdERhdGEgPSB0ZW1wUmVzdWx0LmRhdGE7CiAgICAgICAgICAgICAgaWYgKHRlbXBSZXN1bHQuaXNDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdGVtcFJlc3VsdC5pc0NoYW5nZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8v5omn6KGM5Li76KGo57uf6K6h5YWs5byPCiAgICAgICAgZm9yICh2YXIgY0ZpZWxkIGluIGNoYW5nZUZpZWxkcykgewogICAgICAgICAgaWYgKGNoYW5nZUZpZWxkcy5oYXNPd25Qcm9wZXJ0eShjRmllbGQpKSB7CiAgICAgICAgICAgIF90aGlzLmV4ZU1haW5GaWVsZE1hdGhFeHAoaG90RGF0YSwgY0ZpZWxkLCBfdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpc0NoYW5nZSkgewogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW107CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBob3REYXRhOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5tZXJnZUNlbGxzICYmIHRoaXMubWVyZ2VDZWxscy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm1lcmdlQ2VsbHMgPSB0aGlzLmJ1aWxkTWVyZ2VDZWxsKGhvdERhdGEpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGV4ZUFsbE1hdGhFeHA6IGZ1bmN0aW9uIGV4ZUFsbE1hdGhFeHAoaG90RGF0YSwgX3RoaXMsIGZpZWxkSW5kZXgsIGlzQ2hhbmdlKSB7CiAgICAgIC8v5omn6KGM5omA5pyJ6KGM5YaF6L+Q566XCiAgICAgIGlmIChfdGhpcy5tYXRoRXhwTWFwKSB7CiAgICAgICAgZm9yICh2YXIgZmllbGROYW1lIGluIF90aGlzLm1hdGhFeHBNYXApIHsKICAgICAgICAgIC8v5aaC5p6c6KGM5YaF6L+Q566X5a+55bqU5Y2V5YWD5qC85YyF5ZCr6Leo6KGM6L+Q566X77yM5YiZ5Lul6Leo6KGM6L+Q566X5Li65Li777yM5LiN6L+b6KGM6KGM5YaF6L+Q566XCiAgICAgICAgICBpZiAoX3RoaXMubWF0aEV4cE1hcC5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpICYmICF0aGlzLmlzSW5Sb3dNYXRoKGZpZWxkTmFtZSwgZmllbGRJbmRleCkpIHsKICAgICAgICAgICAgdmFyIGN1cmV4cCA9IF90aGlzLm1hdGhFeHBNYXBbZmllbGROYW1lXTsKICAgICAgICAgICAgdmFyIGN1cnZhbHVlID0gdGhpcy5jYWxjRXhwVmFsdWUoY3VyZXhwLCBob3REYXRhLCBmaWVsZEluZGV4KTsKICAgICAgICAgICAgaWYgKGhvdERhdGFbZmllbGRJbmRleF0pIHsKICAgICAgICAgICAgICBob3REYXRhW2ZpZWxkSW5kZXhdW2ZpZWxkTmFtZV0gPSBjdXJ2YWx1ZTsKICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGRhdGE6IGhvdERhdGEsCiAgICAgICAgICBpc0NoYW5nZTogaXNDaGFuZ2UKICAgICAgICB9OwogICAgICB9CiAgICB9LAogICAgLy/liKTmlq3ooYzlhoXov5DnrpfnmoTljZXlhYPmoLzmmK/lkKbljIXlkKvot6jooYzov5DnrpcKICAgIGlzSW5Sb3dNYXRoOiBmdW5jdGlvbiBpc0luUm93TWF0aChmaWVsZCwgZmllbGRJbmRleCkgewogICAgICB2YXIgaXNJbiA9IGZhbHNlOwogICAgICBpZiAodGhpcy5hbGxSb3dNYXRoTWFwICYmIHRoaXMuYWxsUm93TWF0aE1hcFtmaWVsZF0pIHsKICAgICAgICB2YXIgcm93TWF0aHMgPSB0aGlzLmFsbFJvd01hdGhNYXBbZmllbGRdOwogICAgICAgIGlmIChyb3dNYXRocyAmJiByb3dNYXRocy5sZW5ndGggPiAwKSB7CiAgICAgICAgICByb3dNYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRoSXRlbSkgewogICAgICAgICAgICBpZiAobWF0aEl0ZW0uc24gLSAxID09IGZpZWxkSW5kZXgpIHsKICAgICAgICAgICAgICBpc0luID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpc0luOwogICAgfSwKICAgIGV4ZUFsbFJvd01hdGhFeHA6IGZ1bmN0aW9uIGV4ZUFsbFJvd01hdGhFeHAoaG90RGF0YSwgX3RoaXMsIGlzQ2hhbmdlKSB7CiAgICAgIC8v5omn6KGM5omA5pyJ6Leo6KGM6L+Q566XCiAgICAgIGlmIChfdGhpcy5hbGxSb3dNYXRoTWFwKSB7CiAgICAgICAgdmFyIF9sb29wMiA9IGZ1bmN0aW9uIF9sb29wMihmaWVsZE5hbWUpIHsKICAgICAgICAgIGlmIChfdGhpcy5hbGxSb3dNYXRoTWFwLmhhc093blByb3BlcnR5KGZpZWxkTmFtZSkpIHsKICAgICAgICAgICAgdmFyIGZyb3dNYXRocyA9IF90aGlzLmFsbFJvd01hdGhNYXBbZmllbGROYW1lXTsKICAgICAgICAgICAgaWYgKGZyb3dNYXRocyAmJiBmcm93TWF0aHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGZyb3dNYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChtYXRoSXRlbSkgewogICAgICAgICAgICAgICAgaWYgKGhvdERhdGFbbWF0aEl0ZW0uc24gLSAxXSkgewogICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBfdGhpcy5jYWxjUm93c0V4cFZhbHVlKG1hdGhJdGVtLm1hdGhFeHAsIGhvdERhdGEsIGZpZWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgIGhvdERhdGFbbWF0aEl0ZW0uc24gLSAxXVtmaWVsZE5hbWVdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgZm9yICh2YXIgZmllbGROYW1lIGluIF90aGlzLmFsbFJvd01hdGhNYXApIHsKICAgICAgICAgIF9sb29wMihmaWVsZE5hbWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IGhvdERhdGEsCiAgICAgICAgaXNDaGFuZ2U6IGlzQ2hhbmdlCiAgICAgIH07CiAgICB9LAogICAgZXhlQ2VsbE1hdGhFeHA6IGZ1bmN0aW9uIGV4ZUNlbGxNYXRoRXhwKGhvdERhdGEsIF90aGlzLCBpc0NoYW5nZSkgewogICAgICAvL+aJp+ihjOaJgOacieWNleWFg+agvOiuoeeul+WFrOW8jwogICAgICBpZiAoX3RoaXMuY2VsbENhbGNzICYmIF90aGlzLmNlbGxDYWxjcy5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICAgIF90aGlzLmNlbGxDYWxjcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICB2YXIgZmllbGROYW1lID0gaXRlbS5jZWxsRmllbGQuc3BsaXQoJy4nKVsyXTsKICAgICAgICAgIGlmIChob3REYXRhW2l0ZW0ucm93SW5kZXggLSAxXSkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBfdGhpcy5jYWxjQ2VsbEV4cFZhbHVlKGl0ZW0ubWF0aEV4cCwgaG90RGF0YSwgZm9ybUluc3QpOwogICAgICAgICAgICBob3REYXRhW2l0ZW0ucm93SW5kZXggLSAxXVtmaWVsZE5hbWVdID0gdmFsdWU7CiAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIGRhdGE6IGhvdERhdGEsCiAgICAgICAgaXNDaGFuZ2U6IGlzQ2hhbmdlCiAgICAgIH07CiAgICB9LAogICAgZXhlRmlyc3RSb3dTdW06IGZ1bmN0aW9uIGV4ZUZpcnN0Um93U3VtKGhvdERhdGEsIGZpZWxkTmFtZSwgX3RoaXMsIGlzQ2hhbmdlLCBmc3VtTWFwKSB7CiAgICAgIGlmIChob3REYXRhICYmIGhvdERhdGEubGVuZ3RoID4gMCkgewogICAgICAgIGlmIChmc3VtTWFwW2ZpZWxkTmFtZV0gPT09IHRydWUpIHsKICAgICAgICAgIHZhciBleGVWYWx1ZSA9IF90aGlzLnN1bUNvbChob3REYXRhLCBmaWVsZE5hbWUsIHRydWUsIF90aGlzKTsKICAgICAgICAgIGhvdERhdGFbMF1bZmllbGROYW1lXSA9IHRoaXMudG9maXhlZChleGVWYWx1ZSwgMik7CiAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgZGF0YTogaG90RGF0YSwKICAgICAgICBpc0NoYW5nZTogaXNDaGFuZ2UKICAgICAgfTsKICAgIH0sCiAgICBzdW1Db2w6IGZ1bmN0aW9uIHN1bUNvbChkYXRhLCBmaWVsZCwgb3V0Rmlyc3QsIF90aGlzKSB7CiAgICAgIC8v5rGH5oC75p+Q5YiX5pWw5o2u77yMCiAgICAgIHZhciBzdW0gPSAwOwogICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZGF0YS5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgIGlmICghKG91dEZpcnN0ICYmIGluZGV4ID09IDApKSB7CiAgICAgICAgICAgIHZhciBlbCA9IGRhdGFbaW5kZXhdOwogICAgICAgICAgICBzdW0gKz0gX3RoaXMudG9OdW1iZXIoZWxbZmllbGRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN1bTsKICAgIH0sCiAgICAvL+aJp+ihjOi3qOihjOiuoeeul+WFrOW8jwogICAgZXhlUm93TWF0aEV4cDogZnVuY3Rpb24gZXhlUm93TWF0aEV4cChob3REYXRhLCBmaWVsZEluZGV4LCBmaWVsZE5hbWUsIF90aGlzLCBpc0NoYW5nZSwgaXNSZXBlYXQpIHsKICAgICAgLy9jb25zdCBmaWVsZEluZGV4ID0gZmZpZWxkSW5kZXgrMTsvL190aGlzLnJvd01hdGhFeHBNYXBbY29sdW1uLmRhdGFdCiAgICAgIC8v5omn6KGM5b2T5YmN5a2X5q615raJ5Y+K55qE6K6h566X5YWs5byP77yI5Li65LqG5L+d6K+B5omn6KGM6aG65bqP77yM5YWI5omn6KGM5b2T5YmN57yW6L6R5a2X5q6155u45YWz6K6h566X5YWs5byP77yJCiAgICAgIGZvciAodmFyIHJtZSBpbiBfdGhpcy5yb3dNYXRoRXhwTWFwKSB7CiAgICAgICAgaWYgKF90aGlzLnJvd01hdGhFeHBNYXAuaGFzT3duUHJvcGVydHkocm1lKSkgewogICAgICAgICAgdmFyIGZyb3dNYXRocyA9IF90aGlzLnJvd01hdGhFeHBNYXBbcm1lXTsKICAgICAgICAgIHZhciBleHBBcnJheSA9IFtdOwogICAgICAgICAgaWYgKGZyb3dNYXRocykgewogICAgICAgICAgICBpZiAoZnJvd01hdGhzW2ZpZWxkSW5kZXhdKSB7CiAgICAgICAgICAgICAgZXhwQXJyYXkucHVzaChmaWVsZEluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBmbSBpbiBmcm93TWF0aHMpIHsKICAgICAgICAgICAgICBpZiAoZnJvd01hdGhzLmhhc093blByb3BlcnR5KGZtKSkgewogICAgICAgICAgICAgICAgaWYgKGZtLmluZGV4T2YoIjoiKSAhPSAtMSkgewogICAgICAgICAgICAgICAgICB2YXIgZkFycmF5ID0gZm0uc3BsaXQoIjoiKTsKICAgICAgICAgICAgICAgICAgaWYgKGZBcnJheS5sZW5ndGggPT0gMikgewogICAgICAgICAgICAgICAgICAgIHZhciBhID0gX3RoaXMudG9OdW1iZXIoZkFycmF5WzBdKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYiA9IF90aGlzLnRvTnVtYmVyKGZBcnJheVsxXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkSW5kZXggPj0gYSAmJiBmaWVsZEluZGV4IDw9IGIpIHsKICAgICAgICAgICAgICAgICAgICAgIGV4cEFycmF5LnB1c2goZm0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGV4cEFycmF5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy/lhYjmiafooYznm7TmjqXlhbPogZTnmoTljZXlhYPmoLzorqHnrpcKICAgICAgICAgICAgZXhwQXJyYXkuZm9yRWFjaChmdW5jdGlvbiAoZXhwS2V5KSB7CiAgICAgICAgICAgICAgdmFyIGV4cEl0ZW1zID0gX3RoaXMucm93TWF0aEV4cE1hcFtmaWVsZE5hbWVdW2V4cEtleV07CiAgICAgICAgICAgICAgZXhwSXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoZUl0ZW0pIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IF90aGlzLmNhbGNSb3dzRXhwVmFsdWUoZUl0ZW0ubWF0aEV4cCwgaG90RGF0YSwgZmllbGROYW1lKTsKICAgICAgICAgICAgICAgIGlmIChob3REYXRhW2VJdGVtLnNuIC0gMV0pIHsKICAgICAgICAgICAgICAgICAgaG90RGF0YVtlSXRlbS5zbiAtIDFdW2ZpZWxkTmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBkYXRhOiBob3REYXRhLAogICAgICAgIGlzQ2hhbmdlOiBpc0NoYW5nZQogICAgICB9OwogICAgfSwKICAgIC8v5omn6KGM6KGM5YaF6K6h566X5YWs5byPCiAgICBleGVNYXRoRXhwOiBmdW5jdGlvbiBleGVNYXRoRXhwKGhvdERhdGEsIGZpZWxkSW5kZXgsIGZpZWxkTmFtZSwgX3RoaXMsIGlzQ2hhbmdlLCBpc1JlcGVhdCkgewogICAgICAvL+aJp+ihjOW9k+WJjeWtl+autea2ieWPiueahOiuoeeul+WFrOW8j++8iOS4uuS6huS/neivgeaJp+ihjOmhuuW6j++8jOWFiOaJp+ihjOW9k+WJjee8lui+keWtl+auteebuOWFs+iuoeeul+WFrOW8j++8iQogICAgICB2YXIgY3VyRXhwTWFwID0gX3RoaXMubWF0aEV4cEl0ZW1NYXBbZmllbGROYW1lXTsKICAgICAgaWYgKGN1ckV4cE1hcCkgewogICAgICAgIGZvciAodmFyIGN1cmtleSBpbiBjdXJFeHBNYXApIHsKICAgICAgICAgIGlmIChjdXJFeHBNYXAuaGFzT3duUHJvcGVydHkoY3Vya2V5KSkgewogICAgICAgICAgICB2YXIgY3VyZXhwID0gY3VyRXhwTWFwW2N1cmtleV07CiAgICAgICAgICAgIHZhciBjdXJ2YWx1ZSA9IHRoaXMuY2FsY0V4cFZhbHVlKGN1cmV4cCwgaG90RGF0YSwgZmllbGRJbmRleCk7CiAgICAgICAgICAgIGlmIChob3REYXRhW2ZpZWxkSW5kZXhdKSB7CiAgICAgICAgICAgICAgaG90RGF0YVtmaWVsZEluZGV4XVtjdXJrZXldID0gY3VydmFsdWU7CiAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgIC8v5omn6KGM5Li76KGo57uf6K6h5YWs5byPCiAgICAgICAgICAgICAgX3RoaXMuZXhlTWFpbkZpZWxkTWF0aEV4cChob3REYXRhLCBjdXJrZXksIF90aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL+aJp+ihjOWFtuS7luWtl+autea2ieWPiueahOiuoeeul+WFrOW8j++8iOmYsuatouacieWFs+iBlOiuoeeul++8iQogICAgICAgIGZvciAodmFyIGl0ZW1LZXkgaW4gX3RoaXMubWF0aEV4cEl0ZW1NYXApIHsKICAgICAgICAgIGlmIChfdGhpcy5tYXRoRXhwSXRlbU1hcC5oYXNPd25Qcm9wZXJ0eShpdGVtS2V5KSAmJiBmaWVsZE5hbWUgIT0gaXRlbUtleSkgewogICAgICAgICAgICB2YXIgZXhwTWFwID0gX3RoaXMubWF0aEV4cEl0ZW1NYXBbaXRlbUtleV07CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBleHBNYXApIHsKICAgICAgICAgICAgICBpZiAoZXhwTWFwLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIHZhciBleHAgPSBleHBNYXBba2V5XTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuY2FsY0V4cFZhbHVlKGV4cCwgaG90RGF0YSwgZmllbGRJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoaG90RGF0YVtmaWVsZEluZGV4XSkgewogICAgICAgICAgICAgICAgICBob3REYXRhW2ZpZWxkSW5kZXhdW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAvL+aJp+ihjOS4u+ihqOe7n+iuoeWFrOW8jwogICAgICAgICAgICAgICAgICBfdGhpcy5leGVNYWluRmllbGRNYXRoRXhwKGhvdERhdGEsIGtleSwgX3RoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaXNSZXBlYXQpIHsKICAgICAgICByZXR1cm4gX3RoaXMuZXhlTWF0aEV4cChob3REYXRhLCBmaWVsZEluZGV4LCBmaWVsZE5hbWUsIF90aGlzLCBpc0NoYW5nZSwgZmFsc2UpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBkYXRhOiBob3REYXRhLAogICAgICAgICAgaXNDaGFuZ2U6IGlzQ2hhbmdlCiAgICAgICAgfTsKICAgICAgfQogICAgfSwKICAgIC8v5omn6KGM5Li76KGo5a2X5q6157uf6K6h5YWs5byPCiAgICBleGVNYWluRmllbGRNYXRoRXhwOiBmdW5jdGlvbiBleGVNYWluRmllbGRNYXRoRXhwKGhvdERhdGEsIGZpZWxkTmFtZSwgX3RoaXMpIHsKICAgICAgdmFyIGNhbGMgPSB0aGlzLm1haW5GaWVsZE1hdGhNYXBbZmllbGROYW1lXTsKICAgICAgaWYgKGNhbGMpIHsKICAgICAgICB2YXIgc3VtVmFsdWUgPSAwOwogICAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICAgIGlmIChjYWxjLm1haW5GaWVsZCAmJiBob3REYXRhICYmIGhvdERhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgaG90RGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIHN1bVZhbHVlICs9IF90aGlzMy50b051bWJlcihpdGVtW2ZpZWxkTmFtZV0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgICBpZiAoZm9ybUluc3QgJiYgZm9ybUluc3RbJ2RhdGEnXSkgewogICAgICAgICAgdmFyIG1haW5GaWVsZFBhdGggPSBjYWxjLm1haW5GaWVsZC5zcGxpdCgiLiIpOwogICAgICAgICAgZm9ybUluc3RbJ2RhdGEnXVttYWluRmllbGRQYXRoWzBdXVttYWluRmllbGRQYXRoWzFdXSA9IHN1bVZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIC8v5Y2V5YWD5qC86KKr6YCJ5Lit77yM5aaC5p6c5piv5Y+q6K+777yM5o+Q56S65p2D6ZmQ5L+h5oGvCiAgICBhZnRlclNlbGVjdGlvbkVuZE1lOiBmdW5jdGlvbiBhZnRlclNlbGVjdGlvbkVuZE1lKHIsIGMsIHIyLCBjMikgewogICAgICB2YXIgcmVhZE9ubHlGaWVsZCA9IHRoaXMucmVhZE9ubHlDb2x1bW5NYXBbY107CiAgICAgIGlmIChyID09IHIyICYmIGMgPT0gYzIgJiYgcmVhZE9ubHlGaWVsZCkgewogICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuWtl+auteOAkCIgKyByZWFkT25seUZpZWxkWydkZXNjJ10gKyAi44CR5LiN5Y+v5aGr5YaZ77yBIiwKICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuaG90U2V0dGluZ3MuY29sdW1uc1tjXSkgewogICAgICAgIHZhciBmaWVsZE5hbWUgPSB0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnNbY11bJ2RhdGEnXTsKICAgICAgICBpZiAoZmllbGROYW1lICYmIHRoaXMucmVhZE9ubHlSb3dzTWFwW2ZpZWxkTmFtZSArICdfJyArIHJdID09PSB0cnVlKSB7CiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgICAgbWVzc2FnZTogIuW9k+WJjeWNleWFg+agvOS4jeWPr+Whq+WGme+8gSIsCiAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChmaWVsZE5hbWUgJiYgdGhpcy5tYXRoUm93Q2VsbE1hcFtmaWVsZE5hbWVdICYmICh0aGlzLm1hdGhSb3dDZWxsTWFwW2ZpZWxkTmFtZV1bLTFdID09PSB0cnVlIHx8IHRoaXMubWF0aFJvd0NlbGxNYXBbZmllbGROYW1lXVtyXSA9PT0gdHJ1ZSkpIHsKICAgICAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICBtZXNzYWdlOiAi5b2T5YmN5Li66K6h566X5Y2V5YWD5qC877yM5LiN5Y+v5aGr5YaZ77yBIiwKICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2ZpZWxkTmFtZV0gJiYgdGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbZmllbGROYW1lXVtyXSA9PT0gdHJ1ZSkgewogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgIG1lc3NhZ2U6ICLlvZPliY3kuLrot6jooajlj5bmlbDljZXlhYPmoLzvvIzkuI3lj6/loavlhpnvvIEiLAogICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5maXJzdFN1bU1hcFtmaWVsZE5hbWVdICYmIHIgPT0gMCkgewogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgIG1lc3NhZ2U6ICLlvZPliY3kuLrmsYfmgLvljZXlhYPmoLzvvIzkuI3lj6/loavlhpnvvIEiLAogICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIHRvTnVtYmVyOiBmdW5jdGlvbiB0b051bWJlcih4KSB7CiAgICAgIGlmICh0eXBlb2YgeCA9PSAndW5kZWZpbmVkJyB8fCB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZCB8fCB4ID09PSAnJykgcmV0dXJuIDA7CiAgICAgIGlmICh0eXBlb2YgeCA9PSAic3RyaW5nIikgewogICAgICAgIHggPSB4LnJlcGxhY2UoLywvZywgIiIpOwogICAgICB9CiAgICAgIHZhciBtYXRjaCA9IHgudG9TdHJpbmcoKS5tYXRjaCgvKFskfO+/pV0pXGQrXC4/XGQqLyk7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIHggPSB4LnJlcGxhY2UobWF0Y2hbMV0sICcnKTsKICAgICAgfQogICAgICByZXR1cm4gTnVtYmVyKHgpOwogICAgfSwKICAgIGNhbGNFeHBWYWx1ZTogZnVuY3Rpb24gY2FsY0V4cFZhbHVlKGV4cCwgc2NvcGUsIHN1YkluZGV4KSB7CiAgICAgIGlmICghZXhwKSByZXR1cm4gMDsKICAgICAgdmFyIHJlZyA9IC8oW1xbfFx7XSkuKj9cKCguKj8pXClbXH18XF1dL2c7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKHJlZywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBzeW1ib2wgPSBhcmd1bWVudHNbMV0sCiAgICAgICAgICBuYW1lID0gYXJndW1lbnRzWzJdLAogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIGlmIChzY29wZSkgewogICAgICAgICAgLy/lrZDooajnu5/orqHorqHnrpfmg4XlhrXvvIzlpJrooYzmlbDmja4KICAgICAgICAgIGlmIChzeW1ib2wgPT0gJ1snKSB7CiAgICAgICAgICAgIHZhciB2YWxBcnJheSA9IFtdOwogICAgICAgICAgICB2YXIgc3ViTXNnID0gbmFtZS5zcGxpdCgiLiIpOwogICAgICAgICAgICBpZiAoc3ViTXNnLmxlbmd0aCA8IDEpIHsKICAgICAgICAgICAgICB0aHJvdyAiXHU1QjUwXHU4ODY4XHU3RURGXHU4QkExXHU3Njg0XHU4ODY4XHU4RkJFXHU1RjBGIi5jb25jYXQobmFtZSwgIlx1OTUxOVx1OEJFRiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWJNc2dTaXplID0gc3ViTXNnLmxlbmd0aDsKICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IHN1Yk1zZ1tzdWJNc2dTaXplIC0gMV07CiAgICAgICAgICAgIHZhciBmdmFsdWUgPSAwOwogICAgICAgICAgICBpZiAoc2NvcGVbc3ViSW5kZXhdICYmIHNjb3BlW3N1YkluZGV4XVtmaWVsZE5hbWVdKSB7CiAgICAgICAgICAgICAgZnZhbHVlID0gX3RoaXMudG9OdW1iZXIoc2NvcGVbc3ViSW5kZXhdW2ZpZWxkTmFtZV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhbEFycmF5LnB1c2goZnZhbHVlKTsKICAgICAgICAgICAgdmFsdWUgPSAiWyIuY29uY2F0KHZhbEFycmF5LmpvaW4oJywnKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgc3ViTXNnID0gbmFtZS5zcGxpdCgiLiIpOwogICAgICAgICAgICB2YXIgZmllbGROYW1lID0gc3ViTXNnW3N1Yk1zZy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgdmFyIHZhbCA9IHNjb3BlW3N1YkluZGV4XSA/IF90aGlzLnRvTnVtYmVyKHNjb3BlW3N1YkluZGV4XVtmaWVsZE5hbWVdKSA6IDA7CiAgICAgICAgICAgIHZhbCA9IF90aGlzLnRvTnVtYmVyKHZhbCk7CiAgICAgICAgICAgIGlmICghaXNOYU4odmFsKSAmJiAiIiAhPSB2YWwpIHZhbHVlID0gdmFsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA8IDApIHsKICAgICAgICAgIHZhbHVlID0gJygnICsgdmFsdWUgKyAnKSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfSk7CiAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKC9bfFxbfFxdXS9nLCAiIik7CiAgICAgIGlmIChleHAuc3Vic3RyaW5nKDAsIDE2KSAhPSAiRm9ybU1hdGgudG9maXhlZCIpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbHVlKHRoaXMudG9maXhlZChldmFsKCIoIi5jb25jYXQoZXhwLCAiKSIpKSwgMCkpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZShldmFsKCIoIi5jb25jYXQoZXhwLCAiKSIpKSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuiuoeeul+WFrOW8j+aJp+ihjOWksei0pe+8miIgKyBlcnJvciwKICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfSwKICAgIGNhbGNSb3dzRXhwVmFsdWU6IGZ1bmN0aW9uIGNhbGNSb3dzRXhwVmFsdWUoZXhwLCBzY29wZSwgZk5hbWUpIHsKICAgICAgaWYgKCFleHApIHJldHVybiAwOwogICAgICB2YXIgcmVnID0gL1xbKC4qPylcXS9nOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc3ltYm9sID0gYXJndW1lbnRzWzFdLAogICAgICAgICAgY2luZGV4ID0gYXJndW1lbnRzWzJdLAogICAgICAgICAgZXhwU3RyID0gYXJndW1lbnRzWzNdLAogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIGlmIChzY29wZSkgewogICAgICAgICAgaWYgKHN5bWJvbC5pbmRleE9mKCc6JykgPiAtMSkgewogICAgICAgICAgICB2YXIgc3VtU3RyID0gZXhwU3RyLnN1YnN0cmluZyhjaW5kZXggLSAxMywgY2luZGV4IC0gMSk7CiAgICAgICAgICAgIGlmIChzdW1TdHIgPT09ICdGb3JtTWF0aC5zdW0nKSB7CiAgICAgICAgICAgICAgdmFyIGlkeEFycmF5ID0gc3ltYm9sLnNwbGl0KCc6Jyk7CiAgICAgICAgICAgICAgdmFyIGEgPSBfdGhpcy50b051bWJlcihpZHhBcnJheVswXSk7CiAgICAgICAgICAgICAgdmFyIGIgPSBfdGhpcy50b051bWJlcihpZHhBcnJheVsxXSk7CiAgICAgICAgICAgICAgdmFyIHRlbXBWYWx1ZSA9IFtdOwogICAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gYTsgaW5kZXggPD0gYjsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gaW5kZXggLSAxOwogICAgICAgICAgICAgICAgaWYgKHNjb3BlW3Jvd0luZGV4XSkgewogICAgICAgICAgICAgICAgICB0ZW1wVmFsdWUucHVzaChfdGhpcy50b051bWJlcihzY29wZVtyb3dJbmRleF1bZk5hbWVdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhbHVlID0gIlsiICsgdGVtcFZhbHVlICsgIl0iOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgdmFsID0gMDsKICAgICAgICAgICAgdmFyIHJvd0luZGV4ID0gX3RoaXMudG9OdW1iZXIoc3ltYm9sKSAtIDE7CiAgICAgICAgICAgIGlmIChzY29wZVtyb3dJbmRleF0pIHsKICAgICAgICAgICAgICB2YWwgPSBfdGhpcy50b051bWJlcihzY29wZVtyb3dJbmRleF1bZk5hbWVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWwgPSBfdGhpcy50b051bWJlcih2YWwpOwogICAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkgJiYgIiIgIT0gdmFsKSB2YWx1ZSA9IHZhbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgdmFsdWUgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPCAwKSB7CiAgICAgICAgICB2YWx1ZSA9ICcoJyArIHZhbHVlICsgJyknOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoZXhwLnN1YnN0cmluZygwLCAxNikgIT0gIkZvcm1NYXRoLnRvZml4ZWQiKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZSh0aGlzLnRvZml4ZWQoZXZhbCgiKCIuY29uY2F0KGV4cCwgIikiKSksIDApKTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0VmFsdWUgPSAwOwogICAgICB0cnkgewogICAgICAgIHJlc3VsdFZhbHVlID0gdGhpcy5pc1ZhbHVlKGV2YWwoIigiLmNvbmNhdChleHAsICIpIikpKTsKICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICBtZXNzYWdlOiAi6K6h566X5YWs5byP5omn6KGM5aSx6LSl77yaIiArIGVycm9yLAogICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHRWYWx1ZTsKICAgIH0sCiAgICBjYWxjQ2VsbEV4cFZhbHVlOiBmdW5jdGlvbiBjYWxjQ2VsbEV4cFZhbHVlKGV4cCwgc2NvcGUsIGZvcm1JbnN0KSB7CiAgICAgIGlmICghZXhwKSByZXR1cm4gMDsKICAgICAgdmFyIHJlZyA9IC8oW1xbfFx7XSkuKj9cKCguKj8pXClbXH18XF1dL2c7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBzdWJEYXRhTWFwID0ge307CiAgICAgIHN1YkRhdGFNYXBbX3RoaXMuc3ViVGFibGVQYXRoXSA9IHNjb3BlOwogICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgc3ltYm9sID0gYXJndW1lbnRzWzFdLAogICAgICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXSwKICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICBpZiAoc2NvcGUpIHsKICAgICAgICAgIC8v5a2Q6KGo57uf6K6h6K6h566X5oOF5Ya177yM5aSa6KGM5pWw5o2uCiAgICAgICAgICBpZiAoc3ltYm9sID09ICdbJykgewogICAgICAgICAgICB2YXIgdmFsQXJyYXkgPSBbXTsKICAgICAgICAgICAgdmFyIHN1Yk1zZyA9IG5hbWUuc3BsaXQoIi4iKTsKICAgICAgICAgICAgaWYgKHN1Yk1zZy5sZW5ndGggPCAxKSB7CiAgICAgICAgICAgICAgdGhyb3cgIlx1NUI1MFx1ODg2OFx1N0VERlx1OEJBMVx1NzY4NFx1ODg2OFx1OEZCRVx1NUYwRiIuY29uY2F0KG5hbWUsICJcdTk1MTlcdThCRUYiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3ViTXNnU2l6ZSA9IHN1Yk1zZy5sZW5ndGg7CiAgICAgICAgICAgIHZhciBmdmFsdWUgPSAwOwogICAgICAgICAgICBpZiAoc3ViTXNnU2l6ZSA+IDMpIHsKICAgICAgICAgICAgICB2YXIgZmllbGROYW1lU3RyID0gc3ViTXNnW3N1Yk1zZ1NpemUgLSAxXTsKICAgICAgICAgICAgICB2YXIgaW5kZXhTdHIgPSBmaWVsZE5hbWVTdHIubWF0Y2goL1xbKC4rPylcXS9nKTsKICAgICAgICAgICAgICB2YXIgc3ViSW5kZXggPSBfdGhpcy50b051bWJlcihpbmRleFN0clswXS5yZXBsYWNlKC9cWyguKz8pXF0vZywgJyQxJykpIC0gMTsKICAgICAgICAgICAgICB2YXIgZk5hbWUgPSBmaWVsZE5hbWVTdHIucmVwbGFjZShpbmRleFN0clswXSwgJycpOwogICAgICAgICAgICAgIHZhciBzdWJQYXRoID0gc3ViTXNnWzFdICsgJy4nICsgc3ViTXNnWzJdOwogICAgICAgICAgICAgIGlmICghc3ViRGF0YU1hcFtzdWJQYXRoXSAmJiBfdGhpcy5zdWJUYWJsZVBhdGggIT0gc3ViUGF0aCkgewogICAgICAgICAgICAgICAgdmFyIGhvdFRhYmxlUmVmID0gJ2hvdHRhYmxlLicgKyBzdWJQYXRoOwogICAgICAgICAgICAgICAgdmFyIGhvdFRhYmxlT2JqID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl07CiAgICAgICAgICAgICAgICBpZiAoaG90VGFibGVPYmopIHsKICAgICAgICAgICAgICAgICAgc3ViRGF0YU1hcFtzdWJQYXRoXSA9IGZvcm1JbnN0LiRyZWZzWyJvbmxpbmVGb3JtIl0uJHJlZnNbaG90VGFibGVSZWZdLmdldEhvdFRhYmxlRGF0YSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgdmFyIHBhdGhzID0gc3ViUGF0aC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICBpZiAoZm9ybUluc3QuZGF0YVtwYXRoc1swXV0gJiYgZm9ybUluc3QuZGF0YVtwYXRoc1swXV1bcGF0aHNbMV1dKSB7CiAgICAgICAgICAgICAgICAgICAgc3ViRGF0YU1hcFtzdWJQYXRoXSA9IGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc3ViRGF0YU1hcFtzdWJQYXRoXSkgewogICAgICAgICAgICAgICAgdmFyIHN1YkRhdGEgPSBfdG9Db25zdW1hYmxlQXJyYXkoc3ViRGF0YU1hcFtzdWJQYXRoXSk7CiAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtzdWJJbmRleF0gJiYgc3ViRGF0YVtzdWJJbmRleF1bZk5hbWVdKSB7CiAgICAgICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKHN1YkRhdGFbc3ViSW5kZXhdW2ZOYW1lXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXSAmJiBmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV1bc3ViTXNnWzJdXSkgewogICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXVtzdWJNc2dbMl1dKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWxBcnJheS5wdXNoKGZ2YWx1ZSk7CiAgICAgICAgICAgIHZhbHVlID0gIlsiLmNvbmNhdCh2YWxBcnJheS5qb2luKCcsJykpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHN1Yk1zZyA9IG5hbWUuc3BsaXQoIi4iKTsKICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IHN1Yk1zZ1tzdWJNc2cubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHZhciB2YWwgPSAwOwogICAgICAgICAgICBpZiAoZm9ybUluc3QuZGF0YVtzdWJNc2dbMV1dICYmIGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXVtzdWJNc2dbMl1dKSB7CiAgICAgICAgICAgICAgdmFsID0gX3RoaXMudG9OdW1iZXIoZm9ybUluc3QuZGF0YVtzdWJNc2dbMV1dW3N1Yk1zZ1syXV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXNOYU4odmFsKSAmJiAiIiAhPSB2YWwpIHZhbHVlID0gdmFsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICB2YWx1ZSA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICh2YWx1ZSA8IDApIHsKICAgICAgICAgIHZhbHVlID0gJygnICsgdmFsdWUgKyAnKSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfSk7CiAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKC9bfFxbfFxdXS9nLCAiIik7CiAgICAgIGlmIChleHAuc3Vic3RyaW5nKDAsIDE2KSAhPSAiRm9ybU1hdGgudG9maXhlZCIpIHsKICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbHVlKHRoaXMudG9maXhlZChldmFsKCIoIi5jb25jYXQoZXhwLCAiKSIpKSwgMCkpOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZShldmFsKCIoIi5jb25jYXQoZXhwLCAiKSIpKSk7CiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuiuoeeul+WFrOW8j+aJp+ihjOWksei0pe+8miIgKyBlcnJvciwKICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgfSwKICAgIGdldFZhbHVlQnlQYXRoOiBmdW5jdGlvbiBnZXRWYWx1ZUJ5UGF0aChwYXRoLCBzdWJJbmRleCkgewogICAgICB2YXIgb2JqID0gdGhpcy5ob3RTZXR0aW5ncy5kYXRhOwogICAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICghL15cdz8uKltcd3xcXV0kLy50ZXN0KHBhdGgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFyIHBhdGhBcnkgPSBwYXRoLnNwbGl0KCIuIik7CiAgICAgIGlmIChwYXRoQXJ5Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgcmV0dXJuIG9ialtwYXRoXTsKICAgICAgfSBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsKICAgICAgICB2YXIgcmV0ID0gb2JqOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aEFyeS5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHJldCA9PT0gbnVsbCB8fCByZXQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBrZXkgPSBwYXRoQXJ5W2ldOwogICAgICAgICAgdmFyIG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICByZXQgPSByZXRbbWF0Y2hbMV1dW21hdGNoWzJdXTsKICAgICAgICAgIH0gZWxzZSBpZiAocmV0ICYmIHJldC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICAgICAgaWYgKHN1YkluZGV4ICE9IG51bGwgJiYgc3ViSW5kZXggIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgdmFyIHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsKICAgICAgICAgICAgICBpZiAoIWlzTmFOKHByZUluZGV4KSkgewogICAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0ID0gcmV0W2luZGV4XVtrZXldOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gcmV0W2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAogICAgaXNWYWx1ZTogZnVuY3Rpb24gaXNWYWx1ZSh2YWx1ZSkgewogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgcmV0dXJuICIiOwogICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJJbmZpbml0eSIpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICB9LAogICAgdG9maXhlZDogZnVuY3Rpb24gdG9maXhlZCh4LCBiKSB7CiAgICAgIHZhciB0bXAgPSB0aGlzLnRvTnVtYmVyKHgpOwogICAgICBiID0gdGhpcy50b051bWJlcihiKTsKICAgICAgaWYgKGlzTmFOKHRtcCkgfHwgdG1wID09PSAiIiB8fCBpc05hTihiKSkgcmV0dXJuIHg7CiAgICAgIHJldHVybiB0bXAudG9GaXhlZChiKTsKICAgIH0sCiAgICBwYXJzZUZ1bmNleHBGaWVsZDogZnVuY3Rpb24gcGFyc2VGdW5jZXhwRmllbGQoc3RhdEZ1bikgewogICAgICB2YXIgbXlyZWdleHAgPSAvW3t8W10uKj9cKCguKj8pXClbfXxcXV0vZzsKICAgICAgdmFyIG1hdGNoID0gbXlyZWdleHAuZXhlYyhzdGF0RnVuKTsKICAgICAgdmFyIGFycnMgPSBbXTsKICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsKICAgICAgICB2YXIgc3RyID0gbWF0Y2hbMV07CiAgICAgICAgdmFyIGhhcyA9IGZhbHNlOwogICAgICAgIGZvciAodmFyIGkgPSAwLCB2OyB2ID0gYXJyc1tpKytdOykgewogICAgICAgICAgaWYgKHYgPT0gc3RyKSBoYXMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWhhcykgYXJycy5wdXNoKHN0cik7CiAgICAgICAgbWF0Y2ggPSBteXJlZ2V4cC5leGVjKHN0YXRGdW4pOwogICAgICB9CiAgICAgIHJldHVybiBhcnJzOwogICAgfSwKICAgIGZpbGxiYWNrSG90VGFibGVEYXRhOiBmdW5jdGlvbiBmaWxsYmFja0hvdFRhYmxlRGF0YShzdWJEYXRhLCBuZWVkRXhlY0Nyb3NzKSB7CiAgICAgIGlmIChzdWJEYXRhICYmIHN1YkRhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3ViRGF0YSkpOwogICAgICAgIHZhciBtZXJnZUNlbGxzID0gdGhpcy5idWlsZE1lcmdlQ2VsbChzdWJEYXRhKTsKICAgICAgICBpZiAobWVyZ2VDZWxscyAmJiB0eXBlb2YgbWVyZ2VDZWxscyAhPSAndW5kZWZpbmVkJykgewogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gbWVyZ2VDZWxsczsKICAgICAgICB9CiAgICAgICAgaWYgKG5lZWRFeGVjQ3Jvc3MgIT09IGZhbHNlKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICAvL3RoaXMuZXhlY0Nyb3NzTWFwcGluZygpOy8v5omn6KGM6Leo6KGo5Y+W5pWwCiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge30KICAgICAgICB9CiAgICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cChzdWJEYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbW11dOwogICAgICB9CiAgICB9LAogICAgbWVyZ2VDZWxsUmVmcmVzaDogZnVuY3Rpb24gbWVyZ2VDZWxsUmVmcmVzaCgpIHsKICAgICAgLy/miafooYzlkIjlubbljZXlhYPmoLwKICAgICAgdmFyIGRhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsKICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gdGhpcy5idWlsZE1lcmdlQ2VsbChkYXRhKTsKICAgIH0sCiAgICBleGVjQ2VsbE1hdGhFeHA6IGZ1bmN0aW9uIGV4ZWNDZWxsTWF0aEV4cChkYXRhKSB7CiAgICAgIC8v6L+Z6YeM5omn6KGMM+mBjSDpmLLmraLljIXlkKvooYzlhoXorqHnrpflkozot6jooYzorqHnrpflhYjlkI7pobrluo/pg73mnInnmoTmg4XlhrUKICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cChkYXRhKTsKICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cCgpOwogICAgICB0aGlzLmV4ZWNJbkNlbGxNYXRoRXhwKCk7CiAgICB9LAogICAgZXhlY0luQ2VsbE1hdGhFeHA6IGZ1bmN0aW9uIGV4ZWNJbkNlbGxNYXRoRXhwKGRhdGEsIGNoYW5nZXMpIHsKICAgICAgLy/miafooYzorqHnrpflhazlvI8KICAgICAgaWYgKCFkYXRhKSB7CiAgICAgICAgZGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOwogICAgICB9CiAgICAgIHZhciBpc25lZWRGc3VtID0gZmFsc2U7CiAgICAgIGlmICghY2hhbmdlcykgewogICAgICAgIGNoYW5nZXMgPSBbXTsKICAgICAgfQogICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAwIHx8IHRoaXMuYWxsTWF0aEV4cExpc3QgJiYgdGhpcy5hbGxNYXRoRXhwTGlzdC5sZW5ndGggPiAwICYmIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwIHx8IHRoaXMuY2VsbENhbGNzIHx8IHRoaXMuY2VsbENhbGNzLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLmFsbE1hdGhFeHBMaXN0OwogICAgICAgIGlmIChpdGVtcyAmJiBpdGVtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgZGF0YVNpemUgPSBkYXRhLmxlbmd0aDsKICAgICAgICAgIGl0ZW1zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgaWYgKGl0ZW0uaXNBbGwpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFTaXplOyBpKyspIHsKICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgIDA6IGksCiAgICAgICAgICAgICAgICAgIDE6IGl0ZW1bJ25hbWUnXQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChpdGVtLmluZGV4ICYmIGl0ZW0uaW5kZXgubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGl0ZW0uaW5kZXgubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgMDogaXRlbS5pbmRleFtfaV0sCiAgICAgICAgICAgICAgICAgICAgMTogaXRlbVsnbmFtZSddCiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBjZWxsQ2FsY3MgPSB0aGlzLmNlbGxDYWxjczsKICAgICAgICBpZiAoY2VsbENhbGNzICYmIGNlbGxDYWxjcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YXIgY2VsbENhbGMgPSBjZWxsQ2FsY3NbMF07CiAgICAgICAgICBjaGFuZ2VzLnB1c2goewogICAgICAgICAgICAwOiBjZWxsQ2FsYy5yb3dJbmRleCwKICAgICAgICAgICAgMTogY2VsbENhbGMuY2VsbEZpZWxkLnNwbGl0KCcuJylbMl0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIC8vdGhpcy5leGVjTWF0aEV4cFNpbmdsZShjaGFuZ2VzKTsKICAgICAgICAgIHRoaXMuZXhlY01hdGhFeHBBbGwoY2hhbmdlcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlzbmVlZEZzdW0gPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpc25lZWRGc3VtID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoaXNuZWVkRnN1bSkgewogICAgICAgIC8v5omn6KGM6aaW6KGM5rGH5oC7CiAgICAgICAgdmFyIGZzdW1NYXAgPSB0aGlzLmZpcnN0U3VtTWFwOwogICAgICAgIGlmICgne30nICE9IEpTT04uc3RyaW5naWZ5KGZzdW1NYXApKSB7CiAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgdmFyIGlzQ2hhbmdlID0gZmFsc2U7CiAgICAgICAgICB2YXIgaG90RGF0YSA9IHRoaXMuZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgICAgICBmb3IgKHZhciBzdW1LZXkgaW4gZnN1bU1hcCkgewogICAgICAgICAgICBpZiAoZnN1bU1hcC5oYXNPd25Qcm9wZXJ0eShzdW1LZXkpKSB7CiAgICAgICAgICAgICAgdmFyIHRlbXBSZXN1bHQgPSBfdGhpcy5leGVGaXJzdFJvd1N1bShob3REYXRhLCBzdW1LZXksIF90aGlzLCBpc0NoYW5nZSwgZnN1bU1hcCk7CiAgICAgICAgICAgICAgaG90RGF0YSA9IHRlbXBSZXN1bHQuZGF0YTsKICAgICAgICAgICAgICBpZiAodGVtcFJlc3VsdC5pc0NoYW5nZSkgewogICAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0ZW1wUmVzdWx0LmlzQ2hhbmdlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzQ2hhbmdlKSB7CiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOwogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBob3REYXRhOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMubWVyZ2VDZWxscyAmJiB0aGlzLm1lcmdlQ2VsbHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm1lcmdlQ2VsbHMgPSB0aGlzLmJ1aWxkTWVyZ2VDZWxsKGhvdERhdGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGV4ZWNDcm9zc01hcHBpbmc6IGZ1bmN0aW9uIGV4ZWNDcm9zc01hcHBpbmcoKSB7CiAgICAgIGlmICh0aGlzLmNyb3NzTWFwcGluZ3MgJiYgdGhpcy5jcm9zc01hcHBpbmdTdWJUYWJsZXMubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBzdWJEYXRhID0ge307CiAgICAgICAgdmFyIGN1ckRhdGEgPSB0aGlzLmdldEhvdFRhYmxlRGF0YSgpOwogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICAgIHRoaXMuY3Jvc3NNYXBwaW5nU3ViVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKHN1YikgewogICAgICAgICAgdmFyIGhvdFRhYmxlUmVmID0gJ2hvdHRhYmxlLicgKyBzdWI7CiAgICAgICAgICB2YXIgaG90VGFibGVPYmogPSBmb3JtSW5zdC4kcmVmc1sib25saW5lRm9ybSJdLiRyZWZzW2hvdFRhYmxlUmVmXTsKICAgICAgICAgIGlmIChob3RUYWJsZU9iaikgewogICAgICAgICAgICBzdWJEYXRhW3N1Yl0gPSBmb3JtSW5zdC4kcmVmc1sib25saW5lRm9ybSJdLiRyZWZzW2hvdFRhYmxlUmVmXS5nZXRIb3RUYWJsZURhdGEoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBwYXRocyA9IHN1Yi5zcGxpdCgnLicpOwogICAgICAgICAgICBpZiAoZm9ybUluc3QuZGF0YVtwYXRoc1swXV0gJiYgZm9ybUluc3QuZGF0YVtwYXRoc1swXV1bcGF0aHNbMV1dKSB7CiAgICAgICAgICAgICAgc3ViRGF0YVtzdWJdID0gZm9ybUluc3QuZGF0YVtwYXRoc1swXV1bcGF0aHNbMV1dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGlzQ2hhbmdlID0gZmFsc2U7CiAgICAgICAgZm9yICh2YXIgc3ViVGFibGVQYXRoIGluIF90aGlzLmNyb3NzTWFwcGluZ3MpIHsKICAgICAgICAgIGlmIChfdGhpcy5jcm9zc01hcHBpbmdzLmhhc093blByb3BlcnR5KHN1YlRhYmxlUGF0aCkpIHsKICAgICAgICAgICAgdmFyIHRvRkxpc3QgPSBfdGhpcy5jcm9zc01hcHBpbmdzW3N1YlRhYmxlUGF0aF07CiAgICAgICAgICAgIHRvRkxpc3QuZm9yRWFjaChmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgICAgdmFyIGZyb21GaWVsZHMgPSBtYXBbJ2Zyb21GaWVsZHMnXTsKICAgICAgICAgICAgICB2YXIgdG9JbmRleCA9IF90aGlzLnRvTnVtYmVyKG1hcFsndG9JbmRleCddKSAtIDE7CiAgICAgICAgICAgICAgdmFyIHRvRmllbGRQYXRoID0gbWFwWyd0b0ZpZWxkJ10uc3BsaXQoJy4nKTsKICAgICAgICAgICAgICBpZiAoZnJvbUZpZWxkcyAmJiBmcm9tRmllbGRzLmxlbmd0aCA+IDAgJiYgY3VyRGF0YVt0b0luZGV4XSkgewogICAgICAgICAgICAgICAgdmFyIHN1bVZhbHVlID0gMDsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnJvbUZpZWxkcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmcm9tRmllbGRzW2ldOwogICAgICAgICAgICAgICAgICB2YXIgZnJvbUZpZWxkUGF0aCA9IGZpZWxkLmZyb21GaWVsZC5zcGxpdCgnLicpOwogICAgICAgICAgICAgICAgICB2YXIgZnJvbUluZGV4ID0gX3RoaXMudG9OdW1iZXIoZmllbGRbJ2Zyb21JbmRleCddKSAtIDE7CiAgICAgICAgICAgICAgICAgIHZhciBzdWJQYXRoID0gZnJvbUZpZWxkUGF0aFswXSArICcuJyArIGZyb21GaWVsZFBhdGhbMV07CiAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhW3N1YlBhdGhdICYmIHN1YkRhdGFbc3ViUGF0aF1bZnJvbUluZGV4XSAmJiBjdXJEYXRhW3RvSW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF1bZnJvbUZpZWxkUGF0aFsyXV0gIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZW1wVmFsdWUgPSBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF1bZnJvbUZpZWxkUGF0aFsyXV07CiAgICAgICAgICAgICAgICAgICAgICBzdW1WYWx1ZSArPSBfdGhpcy50b051bWJlcih0ZW1wVmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VyRGF0YVt0b0luZGV4XVt0b0ZpZWxkUGF0aFsyXV0gPSBzdW1WYWx1ZTsKICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNDaGFuZ2UpIHsKICAgICAgICAgIHRoaXMuZmlsbGJhY2tIb3RUYWJsZURhdGEoY3VyRGF0YSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGdldEJhY2tNZXJnZURhdGE6IGZ1bmN0aW9uIGdldEJhY2tNZXJnZURhdGEoZXhlTWF0aCkgewogICAgICAvL+iOt+WPluaBouWkjeWQiOW5tuWNleWFg+agvOWQjueahOaVsOaNrgogICAgICAvL+WPluaVsOWJjeWFiOaJp+ihjOi3qOihqOWPluaVsOWSjOiuoeeul+WFrOW8jwogICAgICBpZiAoZXhlTWF0aCA9PT0gdHJ1ZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICB0aGlzLmV4ZWNDcm9zc01hcHBpbmcoKTsgLy/miafooYzot6jooajlj5bmlbAKICAgICAgICAgIHRoaXMuZXhlY0NlbGxNYXRoRXhwKCk7IC8v5omn6KGM6K6h566X5YWs5byPIAogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciBkYXRhID0gdGhpcy5ob3RTZXR0aW5ncy5kYXRhOwogICAgICB2YXIgcm93ID0gdGhpcy5pbml0Um93RGF0YTsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgLy/lpITnkIbliJ3lp4vljJbml7bnmoTnrKzkuIDooYzmlbDmja7nsbvlnovkuLrmlbDnu4Tovaxqc29u5Li656m66Zeu6aKYCiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiBBcnJheS5pc0FycmF5KGRhdGFbMF0pICYmIHJvdyAmJiBKU09OLnN0cmluZ2lmeShyb3cpICE9ICd7fScpIHsKICAgICAgICB2YXIgbmV3Um93ID0ge307CiAgICAgICAgdmFyIG9sZFJvdyA9IHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXTsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gcm93KSB7CiAgICAgICAgICBpZiAocm93Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgbmV3Um93W2tleV0gPSB0eXBlb2Ygb2xkUm93W2tleV0gPT0gJ3VuZGVmaW5lZCcgPyAnJyA6IG9sZFJvd1trZXldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkYXRhWzBdID0gbmV3Um93OwogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSA9IG5ld1JvdzsKICAgICAgfQogICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA9PSAxICYmIEpTT04uc3RyaW5naWZ5KGRhdGFbMF0pID09IEpTT04uc3RyaW5naWZ5KHRoaXMuaW5pdFJvd0RhdGEpKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHZhciBtZXJnZUNlbGxzID0gdGhpcy5tZXJnZUNlbGxzOwogICAgICBpZiAobWVyZ2VDZWxscyAmJiBtZXJnZUNlbGxzLmxlbmd0aCA+IDAgJiYgZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgY29sdW1ucyA9IHRoaXMuaG90U2V0dGluZ3MuY29sdW1uczsKICAgICAgICBtZXJnZUNlbGxzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgIHZhciByb3dJbmRleCA9IGl0ZW0ucm93OwogICAgICAgICAgaWYgKGRhdGFbcm93SW5kZXhdKSB7CiAgICAgICAgICAgIHZhciByb3dzcGFuID0gaXRlbS5yb3dzcGFuOwogICAgICAgICAgICB2YXIgZmllbGQgPSBjb2x1bW5zW2l0ZW1bJ2NvbCddXVsnZGF0YSddOwogICAgICAgICAgICB2YXIgYmFzZVZhbHVlID0gZGF0YVtyb3dJbmRleF1bZmllbGRdOwogICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IHJvd0luZGV4OyBpbmRleCA8IHJvd0luZGV4ICsgcm93c3BhbjsgaW5kZXgrKykgewogICAgICAgICAgICAgIGlmIChkYXRhW2luZGV4XSkgewogICAgICAgICAgICAgICAgZGF0YVtpbmRleF1bZmllbGRdID0gYmFzZVZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5aSE55CG5aGr5Yi25Y2V5L2N77yI5aSN5Yi255qE5pe25YCZ77yJCiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmY7CiAgICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCAmJiBjdXN0RGlhbG9nICYmIGN1c3REaWFsb2cub3JnQ29uZmlnICYmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIHRoaXMuZmlsbE9yZy5pZCB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpKSB7CiAgICAgICAgdmFyIGZpbGxGaWxsT2JqID0gdGhpcy5nZXRPcmdGaWxsRmllbGRPYmooY3VzdERpYWxvZyk7CiAgICAgICAgaWYgKGZpbGxGaWxsT2JqLm9yZ05hbWVGaWVsZCB8fCBmaWxsRmlsbE9iai5vcmdJZEZpZWxkIHx8IGZpbGxGaWxsT2JqLm9yZ0NvZGVGaWVsZCB8fCBmaWxsRmlsbE9iai5pbnN0SWRGaWVsZCkgewogICAgICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgIGlmIChmaWxsRmlsbE9iai5vcmdOYW1lRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmoub3JnTmFtZUZpZWxkXSkgewogICAgICAgICAgICAgIGl0ZW1bZmlsbEZpbGxPYmoub3JnTmFtZUZpZWxkXSA9IF90aGlzLmZpbGxPcmcubmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmlsbEZpbGxPYmoub3JnSWRGaWVsZCAmJiAhaXRlbVtmaWxsRmlsbE9iai5vcmdJZEZpZWxkXSkgewogICAgICAgICAgICAgIGl0ZW1bZmlsbEZpbGxPYmoub3JnSWRGaWVsZF0gPSBfdGhpcy5maWxsT3JnLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWxsRmlsbE9iai5vcmdDb2RlRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkXSkgewogICAgICAgICAgICAgIGl0ZW1bZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkXSA9IF90aGlzLmZpbGxPcmcuY29kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmlsbEZpbGxPYmouaW5zdElkRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmouaW5zdElkRmllbGRdKSB7CiAgICAgICAgICAgICAgaXRlbVtmaWxsRmlsbE9iai5pbnN0SWRGaWVsZF0gPSBfdGhpcy5pbnN0SWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZGF0YTsKICAgIH0sCiAgICBnZXRPcmdGaWxsRmllbGRPYmo6IGZ1bmN0aW9uIGdldE9yZ0ZpbGxGaWVsZE9iaihjdXN0RGlhbG9nKSB7CiAgICAgIHZhciBvcmdGaWxsRmllbGRPYmogPSB7CiAgICAgICAgb3JnTmFtZUZpZWxkOiAnJywKICAgICAgICBvcmdJZEZpZWxkOiAnJywKICAgICAgICBvcmdDb2RlRmllbGQ6ICcnLAogICAgICAgIGluc3RJZEZpZWxkOiAnJwogICAgICB9OwogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSkgewogICAgICAgIHZhciBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKTsKICAgICAgICBvcmdGaWxsRmllbGRPYmoub3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgIH0KICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKSB7CiAgICAgICAgdmFyIGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7CiAgICAgICAgb3JnRmlsbEZpZWxkT2JqLm9yZ0lkRmllbGQgPSBpZFBhdGhbaWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICB9CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKSB7CiAgICAgICAgdmFyIGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOwogICAgICAgIG9yZ0ZpbGxGaWVsZE9iai5vcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGggLSAxXTsKICAgICAgfQogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKSB7CiAgICAgICAgdmFyIGluc3RJZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQuc3BsaXQoJy4nKTsKICAgICAgICBvcmdGaWxsRmllbGRPYmouaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgIH0KICAgICAgcmV0dXJuIG9yZ0ZpbGxGaWVsZE9iajsKICAgIH0sCiAgICBnZXRIb3RUYWJsZURhdGE6IGZ1bmN0aW9uIGdldEhvdFRhYmxlRGF0YShleGVNYXRoKSB7CiAgICAgIC8v5aaC5p6c5piv5L+d5a2Y5oiW5o+Q5Lqk5pe26ZyA6L+b6KGM5b+F5aGr5qCh6aqMCiAgICAgIHZhciBkYXRhID0gdGhpcy5nZXRCYWNrTWVyZ2VEYXRhKGV4ZU1hdGgpOwogICAgICBpZiAoZXhlTWF0aCA9PT0gdHJ1ZSkgewogICAgICAgIGlmICghdGhpcy52YWxpZGF0ZUNlbGxzKGRhdGEpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfSwKICAgIHZhbGlkYXRlQ2VsbHM6IGZ1bmN0aW9uIHZhbGlkYXRlQ2VsbHMoZGF0YSkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgaXNUcnVlID0gdHJ1ZTsKICAgICAgdmFyIHJlcXVpcmVkcyA9IHRoaXMucmVxdWlyZWRSb3dzTWFwOwogICAgICBpZiAocmVxdWlyZWRzICYmICd7fScgIT09IEpTT04uc3RyaW5naWZ5KHJlcXVpcmVkcykpIHsKICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS5sZW5ndGggPCAxKSB7CiAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgIG1lc3NhZ2U6ICLlrZDooajjgJAiICsgX3RoaXMubmFtZSArICLjgJHlrZjlnKjlv4XloavpobnmnKrloavlhpnvvIEiLAogICAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgICB9KTsKICAgICAgICAgIGlzVHJ1ZSA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgX2xvb3AzID0gZnVuY3Rpb24gX2xvb3AzKGZpZWxkKSB7CiAgICAgICAgICAgIGlmIChyZXF1aXJlZHMuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7CiAgICAgICAgICAgICAgdmFyIHJlcXVpcmVkID0gcmVxdWlyZWRzW2ZpZWxkXTsKICAgICAgICAgICAgICBpZiAocmVxdWlyZWQuYWxsID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhW2ldW2ZpZWxkXSAmJiBkYXRhW2ldW2ZpZWxkXSAhPT0gMCAmJiBkYXRhW2ldW2ZpZWxkXSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAi5a2Q6KGo44CQIiArIF90aGlzLm5hbWUgKyAi44CR5Lit56ys44CQIiArIChpICsgMSkgKyAi44CR6KGM44CQIiArIF90aGlzLmZpZWxkTmFtZU1hcFtmaWVsZF0gKyAi44CR5b+F5aGr77yBIiwKICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpc1RydWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgdjogZmFsc2UKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZC5yb3dzICYmIHJlcXVpcmVkLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcmVxdWlyZWQucm93cy5mb3JFYWNoKGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICAgICAgICBpZiAoIWRhdGFbaW5kZXggLSAxXSB8fCAhZGF0YVtpbmRleCAtIDFdW2ZpZWxkXSAmJiBkYXRhW2luZGV4IC0gMV1bZmllbGRdICE9PSAwICYmIGRhdGFbaW5kZXggLSAxXVtmaWVsZF0gIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogIuWtkOihqOOAkCIgKyBfdGhpcy5uYW1lICsgIuOAkeS4reesrOOAkCIgKyBpbmRleCArICLjgJHooYzjgJAiICsgX3RoaXMuZmllbGROYW1lTWFwW2ZpZWxkXSArICLjgJHlv4XloavvvIEiLAogICAgICAgICAgICAgICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlzVHJ1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgX3JldDsKICAgICAgICBmb3IgKHZhciBmaWVsZCBpbiByZXF1aXJlZHMpIHsKICAgICAgICAgIF9yZXQgPSBfbG9vcDMoZmllbGQpOwogICAgICAgICAgaWYgKF9yZXQpIHJldHVybiBfcmV0LnY7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBpc1RydWU7CiAgICB9LAogICAgaW5pdFRlbXBsYXRlRGF0YTogZnVuY3Rpb24gaW5pdFRlbXBsYXRlRGF0YSgpIHsKICAgICAgaWYgKHRoaXMuaXNJbml0VGVtcGxhdGVEYXRhICE9PSAndHJ1ZScpIHsKICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjAogICAgICAgIHRoaXMudG9BZGRJbml0U3VtUm93KCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIC8v5aaC5p6c5bey5pyJ5pWw5o2u5YiZ5LiN6ZyA6KaB5YaN5qyh5Yid5aeL5YyWCiAgICAgIHZhciBjdXJEYXRhID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsKICAgICAgdmFyIGluaXRUeXBlID0gdGhpcy5pbml0RmlsbERhdGFUeXBlOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoX3RoaXMpOwogICAgICBpZiAoIWluaXRUeXBlIHx8IGluaXRUeXBlID09ICdlbXB0eScpIHsKICAgICAgICBpZiAoY3VyRGF0YS5sZW5ndGggPT0gMCB8fCBjdXJEYXRhLmxlbmd0aCA9PSAxICYmIChBcnJheS5pc0FycmF5KGN1ckRhdGFbMF0pIHx8IEpTT04uc3RyaW5naWZ5KGN1ckRhdGFbMF0pID09IEpTT04uc3RyaW5naWZ5KHRoaXMuaW5pdFJvd0RhdGEpKSkgewogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW1tdXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy/liJ3lp4vljJbnu5/orqHooYwKICAgICAgICAgIHRoaXMudG9BZGRJbml0U3VtUm93KCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGluaXRUeXBlID09ICdjb3ZlcicpIHsKICAgICAgICB2YXIgcGF0aHMgPSB0aGlzLnN1YlRhYmxlUGF0aC5zcGxpdCgnLicpOwogICAgICAgIGZvcm1JbnN0WydkYXRhJ11bcGF0aHNbMF1dW3BhdGhzWzFdXSA9IFtdOwogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtbXV07CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLmluaXRDdXN0RGlhbG9nQ29uZiB8fCAhdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYuY3VzdERpYWxvZyB8fCAhdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYuY3VzdERpYWxvZy5hbGlhcykgewogICAgICAgIC8v5Yid5aeL5YyW57uf6K6h6KGMCiAgICAgICAgdGhpcy50b0FkZEluaXRTdW1Sb3coKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHsKICAgICAgICBsb2NrOiB0cnVlLAogICAgICAgIHRleHQ6ICfmraPlnKjliJ3lp4vljJbloavmiqXmqKHmnb8uLi4nLAogICAgICAgIHNwaW5uZXI6ICdlbC1pY29uLWxvYWRpbmcnLAogICAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDAsIDAsIDAsIDAuNyknCiAgICAgIH0pOwogICAgICB0aGlzLiRodHRwLmdldCgnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRCeUFsaWFzP2FsaWFzPScgKyB0aGlzLmluaXRDdXN0RGlhbG9nQ29uZi5jdXN0RGlhbG9nLmFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgX3RoaXMuY3VzdG9tRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgbWVzc2FnZTogIuiOt+WPluiHquWumuS5ieWvueivneahhuWksei0pe+8gSIsCiAgICAgICAgICB0eXBlOiAiZXJyb3IiCiAgICAgICAgfSk7CiAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBjdXN0ZGlhbG9nID0gX3RoaXMuaW5pdEN1c3REaWFsb2dDb25mOwogICAgICAgIHZhciBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudFVzZXIiKSk7CiAgICAgICAgaWYgKCFjdXN0ZGlhbG9nLm9yZ0NvbmZpZy5jb2RlICYmICFjdXN0ZGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmICFjdXN0ZGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMpOwogICAgICAgIH0gZWxzZSBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQpKSB7CiAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICBfdGhpcy5maWxsT3JnID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCkpOwogICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpcy4kaHR0cC5nZXQoJyR7dWN9L2FwaS9vcmcvdjEvb3JnL2dldEZpbGxPcmcnKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgICAgdmFyIHJlcCA9IHJlc3AuZGF0YTsKICAgICAgICAgICAgaWYgKHJlcC5zdGF0ZSkgewogICAgICAgICAgICAgIF90aGlzLmZpbGxPcmcgPSByZXAudmFsdWU7CiAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQsIEpTT04uc3RyaW5naWZ5KHJlcC52YWx1ZSkpOwogICAgICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXAubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgbWVzc2FnZTogIuiOt+WPluW9k+WJjeeUqOaIt+Whq+WItuWNleS9jeWksei0pe+8gSIsCiAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBjbG9zZUxvYWRpbmc6IGZ1bmN0aW9uIGNsb3NlTG9hZGluZyhsb2FkaW5nKSB7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGxvYWRpbmcuY2xvc2UoKTsKICAgICAgfSwgMjAwMCk7CiAgICB9LAogICAgdG9GaWxsSW5pdERhdGE6IGZ1bmN0aW9uIHRvRmlsbEluaXREYXRhKF90aGlzKSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIF90aGlzLmZpbGxJbml0RGF0YShfdGhpcyk7CiAgICAgIH0sIDEwMDApOwogICAgfSwKICAgIGZpbGxJbml0RGF0YTogZnVuY3Rpb24gZmlsbEluaXREYXRhKF90aGlzKSB7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gX3RoaXMuaW5pdEN1c3REaWFsb2dDb25mLmN1c3REaWFsb2c7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShfdGhpcyk7CiAgICAgIHZhciBjdXJEYXRhID0gZm9ybUluc3RbJ2RhdGEnXTsKICAgICAgLy/lpITnkIblr7nor53moYbnmoTlj4LmlbDkvKDlhaUKICAgICAgdmFyIHBhcmFtcyA9IFtdOwogICAgICBpZiAoY3VzdERpYWxvZy5jb25kaXRpb25zKSB7CiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkKICAgICAgICB2YXIgYmluZExpc3QgPSBjdXN0RGlhbG9nLmNvbmRpdGlvbnM7CiAgICAgICAgaWYgKGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGJpbmRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICIzIiAmJiBlbGUuYmluZCkgewogICAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQ7CiAgICAgICAgICAgICAgdmFyIGJpbmRBcnJheSA9IGVsZS5iaW5kLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgaWYgKGJpbmRBcnJheS5sZW5ndGggPT0gMykgewogICAgICAgICAgICAgICAgb2JqLmJpbmQgPSBjdXJEYXRhW2JpbmRBcnJheVsxXV1bYmluZEFycmF5WzJdXTsKICAgICAgICAgICAgICAgIHBhcmFtcy5wdXNoKG9iaik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPScgKyBjdXN0RGlhbG9nLmFsaWFzOwogICAgICBpZiAocGFyYW1zLmxlbmd0aCA+IDApIHsKICAgICAgICB2YXIgcGFTdHIgPSAnJzsKICAgICAgICBwYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGEpIHsKICAgICAgICAgIGlmIChwYVN0cikgewogICAgICAgICAgICBwYVN0ciArPSAnLCc7CiAgICAgICAgICB9CiAgICAgICAgICBwYVN0ciA9IHBhU3RyICsgJyInICsgcGEuZmllbGQgKyAnIjoiJyArIHBhLmJpbmQgKyAnIic7CiAgICAgICAgfSk7CiAgICAgICAgdXJsID0gdXJsICsgJyZtYXBQYXJhbT0nICsgcGFTdHI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdXJsID0gdXJsICsgJyZtYXBQYXJhbT0nOwogICAgICB9CiAgICAgIHZhciBwYXJhbSA9IHsKICAgICAgICBwYWdlQmVhbjogewogICAgICAgICAgcGFnZTogMSwKICAgICAgICAgIHBhZ2VTaXplOiAxMDAwLAogICAgICAgICAgc2hvd1RvdGFsOiB0cnVlCiAgICAgICAgfQogICAgICB9OwogICAgICBfdGhpcy4kaHR0cC5wb3N0KHVybCwgcGFyYW0pLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICB2YXIgcmVzcG9uc2UgPSByZXNwLmRhdGE7CiAgICAgICAgaWYgKHJlc3BvbnNlLnJvd3MpIHsKICAgICAgICAgIF90aGlzLnN5bmNJbml0VGFibGVWYWx1ZShyZXNwb25zZS5yb3dzKTsKICAgICAgICAgIGlmIChyZXNwb25zZS5yb3dzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgIC8v5Yid5aeL5YyW57uf6K6h6KGMCiAgICAgICAgICAgIF90aGlzLnRvQWRkSW5pdFN1bVJvdygpOwogICAgICAgICAgICBfdGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdID0gX3RoaXMuZmlsbE9yZ0RhdGFGaWVsZChfdGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sIGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5bliJ3lp4vljJbmlbDmja7lpLHotKXvvIEiLAogICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBnZXRGaWxsT3JnT2JqOiBmdW5jdGlvbiBnZXRGaWxsT3JnT2JqKGN1c3REaWFsb2cpIHsKICAgICAgLy/ojrflj5bloavliLbljZXkvY3jgIHlrp7kvovkv6Hmga8KICAgICAgdmFyIGZpbGxPcmcgPSBudWxsOwogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcgJiYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkIHx8IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpICYmIHRoaXMuZmlsbE9yZy5pZCkgewogICAgICAgIGZpbGxPcmcgPSB7fTsKICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIG9yZ05hbWVGaWVsZCkgewogICAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgdmFyIGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgICAgdmFyIGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGU7CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIHsKICAgICAgICAgIHZhciBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmlsbE9yZzsKICAgIH0sCiAgICAvLyDlkIzmraXliJ3lp4vljJbmlbDmja7nu5PmnpwKICAgIHN5bmNJbml0VGFibGVWYWx1ZTogZnVuY3Rpb24gc3luY0luaXRUYWJsZVZhbHVlKHMpIHsKICAgICAgdmFyIGN1c3REaWFsb2cgPSB0aGlzLmluaXRDdXN0RGlhbG9nQ29uZjsKICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsKICAgICAgdmFyIHN0ciA9IFtdOwogICAgICB2YXIgaWRzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvVXBwZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b1VwcGVyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmNvbW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHZhciB0ZW1wID0gIiI7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdmEgPSBzWzBdW2ZpZWxkW2ldXTsKICAgICAgICAgIHR5cGVvZiB2YSA9PSAndW5kZWZpbmVkJyA/ICcnIDogdmEsIF9yZWFkT25seUVycm9yKCJ2YSIpOwogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyB2YSArICciLCc7CiAgICAgICAgfQogICAgICAgIGlmICh0ZW1wICE9ICIiKSB7CiAgICAgICAgICB0ZW1wID0gInsiICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICJ9IjsKICAgICAgICB9CiAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICIiOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfdmEgPSBzW2ldW2ZpZWxkW2pdXTsKICAgICAgICAgICAgdHlwZW9mIF92YSA9PSAndW5kZWZpbmVkJyA/ICcnIDogX3ZhLCBfcmVhZE9ubHlFcnJvcigidmEiKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfdmEgKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsKICAgICAgICAgICAgdGVtcCA9ICJ7IiArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAifSI7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKTsKICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpOwogICAgICAgIH0KICAgICAgfQogICAgICAvL+WkhOeQhuWhq+WItumDqOmXqAogICAgICB2YXIgZmlsbE9yZyA9IHRoaXMuZ2V0RmlsbE9yZ09iaihjdXN0RGlhbG9nKTsKCiAgICAgIC8v5aSE55CG5a6e5L6LaWTlm57loasKICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnICYmIGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCAmJiB0aGlzLmluc3RJZCkgewogICAgICAgIGlmIChmaWxsT3JnID09IG51bGwpIHsKICAgICAgICAgIGZpbGxPcmcgPSB7fTsKICAgICAgICB9CiAgICAgICAgdmFyIGluc3RJZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQuc3BsaXQoJy4nKTsKICAgICAgICB2YXIgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgZmlsbE9yZ1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZDsKICAgICAgfQogICAgICB2YXIgcmV0dXJuRGF0YSA9IHN0cjsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB2YXIgZmlsbGRhdGEgPSB0aGlzLmhvdFNldHRpbmdzLmRhdGE7CiAgICAgIGlmIChmaWxsZGF0YSAmJiBmaWxsZGF0YS5sZW5ndGggPT0gMSkgewogICAgICAgIGZpbGxkYXRhID0gW107CiAgICAgICAgLy9pZihPYmplY3Qua2V5cyh0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0pLmxlbmd0aD09MCB8fCBKU09OLnN0cmluZ2lmeSh0aGlzLmluaXRSb3dEYXRhKSA9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0pKXsKICAgICAgICB2YXIgaW5pdFN1bVJvdyA9IHRoaXMuZ2V0SW5pdFN1bVJvdygpOwogICAgICAgIGlmIChpbml0U3VtUm93KSB7CiAgICAgICAgICBmaWxsZGF0YS5wdXNoKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgaW5pdFN1bVJvdyksIGZpbGxPcmcpKTsKICAgICAgICB9CiAgICAgICAgLy99CiAgICAgIH0KICAgICAgdmFyIGZpbGxJbml0RGF0YSA9IFtdOwogICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0gX3RoaXMuaW5pdFJvd0RhdGEgPyBfdGhpcy5pbml0Um93RGF0YSA6IHt9OwogICAgICAgIGN1c3REaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7CiAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOwogICAgICAgICAgICB2YXIgZnJvbSA9ICIiOwogICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAicmVzdGZ1bCIpIHsKICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb207CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViTGluZURhdGFbdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV1dID0gcm93W2Zyb21dOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChmaWxsT3JnICE9IG51bGwpIHsKICAgICAgICAgIHN1YkxpbmVEYXRhID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzdWJMaW5lRGF0YSksIGZpbGxPcmcpOwogICAgICAgIH0KICAgICAgICBmaWxsSW5pdERhdGEucHVzaChfb2JqZWN0U3ByZWFkKHt9LCBzdWJMaW5lRGF0YSkpOwogICAgICB9KTsKICAgICAgaWYgKHRoaXMuYWRkSW5pdFRlbXBsYXRlRGF0YSA9PT0gJ3RydWUnKSB7CiAgICAgICAgdGhpcy5pbml0RGF0YUJhY2sgPSBmaWxsSW5pdERhdGE7CiAgICAgIH0KICAgICAgZmlsbGRhdGEgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGZpbGxkYXRhKSwgZmlsbEluaXREYXRhKTsKICAgICAgdGhpcy5maWxsYmFja0hvdFRhYmxlRGF0YShmaWxsZGF0YSwgZmFsc2UpOwogICAgfSwKICAgIGZpbGxPcmdEYXRhRmllbGQ6IGZ1bmN0aW9uIGZpbGxPcmdEYXRhRmllbGQocm93KSB7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmY7CiAgICAgIGlmIChjdXN0RGlhbG9nICYmIGN1c3REaWFsb2cub3JnQ29uZmlnKSB7CiAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgJiYgdGhpcy5maWxsT3JnLmlkKSB7CiAgICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICByb3dbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOwogICAgICAgICAgaWYgKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKSB7CiAgICAgICAgICAgIHZhciBpZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZC5zcGxpdCgnLicpOwogICAgICAgICAgICB2YXIgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHJvd1tvcmdJZEZpZWxkXSA9IHRoaXMuZmlsbE9yZy5pZDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlKSB7CiAgICAgICAgICAgIHZhciBjb2RlUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUuc3BsaXQoJy4nKTsKICAgICAgICAgICAgdmFyIG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgICByb3dbb3JnQ29kZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5jb2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkICYmIHRoaXMuaW5zdElkKSB7CiAgICAgICAgICB2YXIgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgcm93W2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcm93OwogICAgfSwKICAgIHRvQWRkSW5pdFN1bVJvdzogZnVuY3Rpb24gdG9BZGRJbml0U3VtUm93KCkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuZ2V0SG90VGFibGVEYXRhKCk7CiAgICAgIGlmICghZGF0YSB8fCBkYXRhLmxlbmd0aCA8IDEgfHwgZGF0YS5sZW5ndGggPT0gMSAmJiBKU09OLnN0cmluZ2lmeShkYXRhWzBdKSA9PT0gSlNPTi5zdHJpbmdpZnkodGhpcy5pbml0Um93RGF0YSkpIHsKICAgICAgICB2YXIgaW5pdFN1bVJvdyA9IHRoaXMuZ2V0SW5pdFN1bVJvdygpOwogICAgICAgIGlmIChpbml0U3VtUm93KSB7CiAgICAgICAgICB2YXIgcm93cyA9IFtdOwogICAgICAgICAgcm93cy5wdXNoKF9vYmplY3RTcHJlYWQoe30sIGluaXRTdW1Sb3cpKTsKICAgICAgICAgIHRoaXMuZmlsbGJhY2tIb3RUYWJsZURhdGEocm93cyk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgZ2V0SW5pdFN1bVJvdzogZnVuY3Rpb24gZ2V0SW5pdFN1bVJvdygpIHsKICAgICAgaWYgKHRoaXMuaW5pdFN1bVJvdyA9PT0gJ3RydWUnKSB7CiAgICAgICAgdmFyIG5ld1JvdyA9IF9vYmplY3RTcHJlYWQoe30sIHRoaXMuaW5pdFJvd0RhdGEpOwogICAgICAgIGlmICh0aGlzLmluaXRTdW1Sb3dGaWVsZCAmJiB0aGlzLmluaXRTdW1Sb3dWYWx1ZSkgewogICAgICAgICAgbmV3Um93W3RoaXMuaW5pdFN1bVJvd0ZpZWxkXSA9IHRoaXMuaW5pdFN1bVJvd1ZhbHVlOwogICAgICAgIH0KICAgICAgICB2YXIgZmlsbE9yZyA9IHRoaXMuZ2V0RmlsbE9yZ09iaih0aGlzLmluaXRDdXN0RGlhbG9nQ29uZik7CiAgICAgICAgaWYgKGZpbGxPcmcgPT0gbnVsbCkgewogICAgICAgICAgZmlsbE9yZyA9IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBuZXdSb3cpLCBmaWxsT3JnKTsKICAgICAgfQogICAgICByZXR1cm4gJyc7CiAgICB9LAogICAgdG9BZGRJbml0VGVtcGxhdGVEYXRhOiBmdW5jdGlvbiB0b0FkZEluaXRUZW1wbGF0ZURhdGEoKSB7CiAgICAgIGlmICh0aGlzLmFkZEluaXRUZW1wbGF0ZURhdGEgPT09ICd0cnVlJyAmJiB0aGlzLmluaXREYXRhQmFjayAmJiBBcnJheS5pc0FycmF5KHRoaXMuaW5pdERhdGFCYWNrKSAmJiB0aGlzLmluaXREYXRhQmFjay5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIGN1ckRhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsKICAgICAgICBpZiAoIShjdXJEYXRhICYmIEFycmF5LmlzQXJyYXkodGhpcy5pbml0RGF0YUJhY2spKSkgewogICAgICAgICAgY3VyRGF0YSA9IFtbXV07CiAgICAgICAgfQogICAgICAgIGN1ckRhdGEgPSBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGN1ckRhdGEpLCBfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5pbml0RGF0YUJhY2spKTsKICAgICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKGN1ckRhdGEpOwogICAgICB9IGVsc2UgaWYgKCF0aGlzLmluaXREYXRhQmFjayB8fCB0aGlzLmluaXREYXRhQmFjay5sZW5ndGggPCAxKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICBtZXNzYWdlOiAi5Yid5aeL5YyW5pWw5o2u5Li656m644CCIiwKICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgZ2V0VGFibGVIZWFkZXJzOiBmdW5jdGlvbiBnZXRUYWJsZUhlYWRlcnMoKSB7CiAgICAgIHZhciBvcHRpb25zSm9uID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMpOwogICAgICB2YXIgcmVsYXRpb25zID0gb3B0aW9uc0pvbi5jb2xIZWFkZXJzUmVsYXRpb25zOwogICAgICB2YXIgaGVhZGVycyA9IHsKICAgICAgICBuZXN0ZWQ6IHRoaXMuaG90U2V0dGluZ3MubmVzdGVkSGVhZGVycyA/IHRydWUgOiBmYWxzZSwKICAgICAgICBoZWFkZXI6IFtdCiAgICAgIH07CiAgICAgIHJlbGF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgaGVhZGVycy5oZWFkZXIucHVzaCh7CiAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsCiAgICAgICAgICBkZXNjOiBpdGVtLmRlc2MKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIHJldHVybiBoZWFkZXJzOwogICAgfQogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHt9Cn07"},null]}