| 1 |
- {"remainingRequest":"E:\\item\\newItem\\admin\\node_modules\\babel-loader\\lib\\index.js!E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!E:\\item\\newItem\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!E:\\item\\newItem\\admin\\node_modules\\iview-loader\\index.js??ref--0-2!E:\\item\\newItem\\admin\\src\\pages\\system\\maintain\\systemFile\\opendir.vue?vue&type=script&lang=js&","dependencies":[{"path":"E:\\item\\newItem\\admin\\src\\pages\\system\\maintain\\systemFile\\opendir.vue","mtime":1677828270249},{"path":"E:\\item\\newItem\\admin\\babel.config.js","mtime":1677828270071},{"path":"E:\\item\\newItem\\admin\\.babelrc","mtime":1677828270070},{"path":"E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"E:\\item\\newItem\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000},{"path":"E:\\item\\newItem\\admin\\node_modules\\iview-loader\\index.js","mtime":1570440814000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tICJFOi9pdGVtL25ld0l0ZW0vYWRtaW4vbm9kZV9tb2R1bGVzL0B2dWUvYmFiZWwtcHJlc2V0LWFwcC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vZGVmaW5lUHJvcGVydHkuanMiOwppbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAiRTovaXRlbS9uZXdJdGVtL2FkbWluL25vZGVfbW9kdWxlcy9AdnVlL2JhYmVsLXByZXNldC1hcHAvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLWluZGV4LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LnRvLXN0cmluZy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmcuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5udW1iZXIuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZS5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCmltcG9ydCB7IHJlc29sdmVDb21wb25lbnQgfSBmcm9tICd2dWUnOwppbXBvcnQgeyBvcGVuZGlyTGlzdEFwaSwgb3BlbmZpbGVBcGksIHNhdmVmaWxlQXBpLCBvcGVuZGlyTG9naW5BcGksIGNyZWF0ZUZvbGRlciwgY3JlYXRlRmlsZSwgZGVsRm9sZGVyLCByZW5hbWUgfSBmcm9tICdAL2FwaS9zeXN0ZW0nOwppbXBvcnQgQ29kZU1pcnJvciBmcm9tICdjb2RlbWlycm9yL2xpYi9jb2RlbWlycm9yJzsKaW1wb3J0IGxvZ2luRnJvbSBmcm9tICcuL2NvbXBvbmVudHMvbG9naW5Gcm9tJzsKaW1wb3J0IHsgc2V0Q29va2llcywgZ2V0Q29va2llcywgcmVtb3ZlQ29va2llcyB9IGZyb20gJ0AvbGlicy91dGlsJzsgLy8gaW1wb3J0IEZ1bGxzY3JlZW4gZnJvbSAnQC9jb21wb25lbnRzL21haW4vY29tcG9uZW50cy9mdWxsc2NyZWVuJzsKCmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJzsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICdvcGVuZGlyJywKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgbW9kYWxzOiBmYWxzZSwKICAgICAgLy/nvJbovpHlmajlvIDlhbMKICAgICAgZWRpdG9yOiAnJywKICAgICAgLy/lvZPliY3nvJbovpHlmajlr7nosaEKICAgICAgZWRpdG9ySW5kZXg6IFsvL+mAiemhueWNoeaVsOe7hAogICAgICB7CiAgICAgICAgdGFiOiB0cnVlLAogICAgICAgIGluZGV4OiAnMCcsCiAgICAgICAgdGl0bGU6ICcnLAogICAgICAgIGljb246ICcnCiAgICAgIH1dLAogICAgICBlZGl0b3JMaXN0OiBbXSwKICAgICAgLy/nvJbovpHlmajmlbDnu4QKICAgICAgaW5kZXhFZGl0b3I6IDAsCiAgICAgIC8v5b2T5YmN57yW6L6R5Zmo57Si5byVCiAgICAgIGNvZGU6ICcnLAogICAgICAvL+W9k+WJjeaWh+S7tuaJk+W8gOaXtueahOWGheWuuQogICAgICBuYXZMaXN0OiBbXSwKICAgICAgLy/lt6bkvqflr7zoiKrmlbDmja4KICAgICAgbmF2SXRlbToge30sCiAgICAgIC8v5bem5L6n5a+86Iiq54K55Ye75piv6YCJ5Lit55qE5pWw5o2uCiAgICAgIGNvbnRleHREYXRhOiBudWxsLAogICAgICAvL+W3puS+p+WvvOiIquWPs+mUrueCueWHu+aYr+S6p+eUn+eahOaVsOaNruWvueixoQogICAgICBmaWxlVHlwZTogJycsCiAgICAgIC8vIOaWh+S7tuaTjeS9nOexu+WeiyBjcmVhdGVGb2xkZXJ85Yib5bu65paH5Lu25aS5IGNyZWF0ZUZpbGV85Yib5bu65paH5Lu2IGRlbEZvbGRlcnzliKDpmaTmlofku7blpLnmiJbogIXmlofku7YKICAgICAgY2xhc3NOYW1lOiAnJywKICAgICAgLy/lhajlsY8gY2xhc3PlkI0KICAgICAgLy8gZnVsbHNjcmVlbjpmYWxzZSwgIC8vIOaYr+WQpuWFqOWxjwogICAgICBpc1NhdmU6IHRydWUsCiAgICAgIC8v5b2T5YmN5paH5Lu25piv5ZCm5L+d5a2YCiAgICAgIGlzU2hvd0xvZ246IGZhbHNlLAogICAgICAvLyDnmbvlvZUKICAgICAgaXNTaG93TGlzdDogZmFsc2UsCiAgICAgIC8vIOeZu+W9leS5i+WQjuWIl+ihqAogICAgICBzcGluU2hvdzogZmFsc2UsCiAgICAgIGxvYWRpbmc6IGZhbHNlLAogICAgICB0YWJMaXN0OiBbXSwKICAgICAgY29sdW1uczQ6IFt7CiAgICAgICAgdGl0bGU6ICfmlofku7Yv5paH5Lu25aS55ZCNJywKICAgICAgICBzbG90OiAnZmlsZW5hbWUnLAogICAgICAgIG1pbldpZHRoOiAxNTAsCiAgICAgICAgYmFjazogJ+i/lOWbnuS4iue6pycKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5paH5Lu2L+aWh+S7tuWkuei3r+W+hCcsCiAgICAgICAga2V5OiAncmVhbF9wYXRoJywKICAgICAgICBtaW5XaWR0aDogMTUwCiAgICAgIH0sIHsKICAgICAgICB0aXRsZTogJ+aWh+S7ti/mlofku7blpLnlpKflsI8nLAogICAgICAgIGtleTogJ3NpemUnLAogICAgICAgIG1pbldpZHRoOiAxMDAKICAgICAgfSwgewogICAgICAgIHRpdGxlOiAn5piv5ZCm5Y+v5YaZJywKICAgICAgICBzbG90OiAnaXNXcml0YWJsZScsCiAgICAgICAgbWluV2lkdGg6IDEwMAogICAgICB9LCB7CiAgICAgICAgdGl0bGU6ICfmm7TmlrDml7bpl7QnLAogICAgICAgIGtleTogJ210aW1lJywKICAgICAgICBtaW5XaWR0aDogMTUwCiAgICAgIH0sIHsKICAgICAgICB0aXRsZTogJ+aTjeS9nCcsCiAgICAgICAgc2xvdDogJ2FjdGlvbicsCiAgICAgICAgbWluV2lkdGg6IDE1MAogICAgICB9XSwKICAgICAgZm9ybUl0ZW06IHsKICAgICAgICAvL+iusOW9leW9k+WJjei3r+W+hOS/oeaBr++8jOiOt+WPluaWh+S7tuWIl+ihqOaXtuS9v+eUqAogICAgICAgIGRpcjogJycsCiAgICAgICAgc3VwZXJpb3I6IDAsCiAgICAgICAgZmlsZWRpcjogJycsCiAgICAgICAgZmlsZVRva2VuOiBnZXRDb29raWVzKCdmaWxlX3Rva2VuJykKICAgICAgfSwKICAgICAgZGlyOiAnJywKICAgICAgLy/lvZPliY3lrozmlbTmlofku7bot6/lvoQKICAgICAgLy8gcm93czoge30sICAvLwogICAgICBwYXRobmFtZTogJycsCiAgICAgIC8vIOW9k+WJjeaWh+S7tui3r+W+hAogICAgICB0aXRsZTogJycsCiAgICAgIC8v5b2T5YmN5paH5Lu25qCH6aKYCiAgICAgIGZvcm1GaWxlOiB7CiAgICAgICAgLy/ph43lkb3lkI3ooajljZUKICAgICAgICBmaWxlbmFtZTogJycKICAgICAgfSwKICAgICAgcnVsZUlubGluZTogewogICAgICAgIGZpbGVuYW1lOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAn6K+36L6T5YWl5paH5Lu25oiW5paH5Lu25aS555qE5ZCN5a2XJywKICAgICAgICAgIHRyaWdnZXI6ICdibHVyJwogICAgICAgIH1dCiAgICAgIH0sCiAgICAgIGZvcm1TaG93OiBmYWxzZSwKICAgICAgLy/ooajljZXlvIDlhbMKICAgICAgZm9ybVRpdGxlOiAnJywKICAgICAgLy/ooajljZXmoIfpopgKICAgICAgZmlsZVRva2VuOiBnZXRDb29raWVzKCdmaWxlX3Rva2VuJykKICAgIH07CiAgfSwKICBjb21wb25lbnRzOiB7CiAgICBsb2dpbkZyb206IGxvZ2luRnJvbQogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIHRoaXMuaW5pdEVkaXRvcigpOwogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIHRoaXMuZ2V0TGlzdCgpOwogIH0sCiAgYmVmb3JlRGVzdHJveTogZnVuY3Rpb24gYmVmb3JlRGVzdHJveSgpIHsKICAgIHJlbW92ZUNvb2tpZXMoJ2ZpbGVfdG9rZW4nKTsKICB9LAogIGNvbXB1dGVkOiB7fSwKICBtZXRob2RzOiB7CiAgICAvLyDngrnlh7vooYwKICAgIGN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uIGN1cnJlbnRDaGFuZ2UoY3VycmVudFJvdykgewogICAgICBpZiAoY3VycmVudFJvdy5pc0RpcikgewogICAgICAgIHRoaXMub3BlbihjdXJyZW50Um93KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmVkaXQoY3VycmVudFJvdyk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqDQogICAgICog5paH5Lu25YiX6KGoDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJlZnJlc2ggICAvLyDmmK/lkKbph43mlrDliqDovb0gYm9vbA0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpc19lZGl0ICAgLy8g5piv5ZCm5piv57yW6L6R5Zmo5Lit55qE5Yi35pawIGJvb2wNCiAgICAgKi8KICAgIGdldExpc3Q6IGZ1bmN0aW9uIGdldExpc3QocmVmcmVzaCwgaXNfZWRpdCkgewogICAgICB2YXIgX3RoaXMgPSB0aGlzOwoKICAgICAgdmFyIHBhcmFtczsKCiAgICAgIGlmIChyZWZyZXNoKSB7CiAgICAgICAgcGFyYW1zID0gewogICAgICAgICAgZGlyOiAnJywKICAgICAgICAgIHN1cGVyaW9yOiAwLAogICAgICAgICAgZmlsZWRpcjogJycsCiAgICAgICAgICBmaWxlVG9rZW46IHRoaXMuZmlsZVRva2VuCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJhbXMgPSB0aGlzLmZvcm1JdGVtOwogICAgICAgIHBhcmFtcy5maWxlVG9rZW4gPSB0aGlzLmZpbGVUb2tlbjsKICAgICAgfQoKICAgICAgaWYgKCFpc19lZGl0KSB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICBvcGVuZGlyTGlzdEFwaShwYXJhbXMpLnRoZW4oIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIF9yZWYgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUocmVzKSB7CiAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgZGF0YSA9IHJlcy5kYXRhOwoKICAgICAgICAgICAgICAgICAgaWYgKGlzX2VkaXQpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5uYXZMaXN0ID0gZGF0YS5uYXZMaXN0OwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIF90aGlzLm5hdkxpc3RGb3JUYWIgPSBkYXRhLm5hdkxpc3Q7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMudGFiTGlzdCA9IGRhdGEubGlzdDsgLy8gdGhpcy5uYXZMaXN0ID0gZGF0YS5uYXZMaXN0OwoKICAgICAgICAgICAgICAgICAgICBfdGhpcy5pc1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgX3RoaXMuZGlyID0gZGF0YS5kaXI7CiAgICAgICAgICAgICAgICAgIF90aGlzLmlzU2hvd0xvZ24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgX3RoaXMubG9hZGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgICB9KSk7CgogICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gpIHsKICAgICAgICAgIHJldHVybiBfcmVmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgfSgpKS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgX3RoaXMuY2F0Y2hGdW4ocmVzKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/mlrDlu7rmlofku7blkI7ph43mlrDliqDovb3lt6bkvqflr7zoiKoKICAgIGdldExpc3RJdGVtOiBmdW5jdGlvbiBnZXRMaXN0SXRlbShkYXRhKSB7CiAgICAgIHZhciBfdGhpczIgPSB0aGlzOwoKICAgICAgb3BlbmRpckxpc3RBcGkoZGF0YSkudGhlbiggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICB2YXIgX3JlZjIgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKHJlcykgewogICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Mi5wcmV2ID0gX2NvbnRleHQyLm5leHQpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLmNvbnRleHREYXRhLCAnY2hpbGRyZW4nLCByZXMuZGF0YS5uYXZMaXN0KTsKCiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQyLnN0b3AoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWUyKTsKICAgICAgICB9KSk7CgogICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3gyKSB7CiAgICAgICAgICByZXR1cm4gX3JlZjIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICBfdGhpczIuY2F0Y2hGdW4ocmVzKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g6L+U5Zue5LiK57qnCiAgICBnb0JhY2s6IGZ1bmN0aW9uIGdvQmFjayhpc19lZGl0KSB7CiAgICAgIHRoaXMuZm9ybUl0ZW0gPSB7CiAgICAgICAgZGlyOiB0aGlzLmRpciwKICAgICAgICBzdXBlcmlvcjogMSwKICAgICAgICBmaWxlZGlyOiAnJwogICAgICB9OwogICAgICB0aGlzLmdldExpc3QoZmFsc2UsIGlzX2VkaXQpOwogICAgfSwKICAgIC8vIOaJk+W8gAogICAgb3BlbjogZnVuY3Rpb24gb3Blbihyb3cpIHsKICAgICAgLy8gdGhpcy5yb3dzID0gcm93OwogICAgICB0aGlzLmZvcm1JdGVtID0gewogICAgICAgIGRpcjogcm93LnBhdGgsCiAgICAgICAgc3VwZXJpb3I6IDAsCiAgICAgICAgZmlsZWRpcjogcm93LmZpbGVuYW1lLAogICAgICAgIGZpbGVUb2tlbjogdGhpcy5maWxlVG9rZW4KICAgICAgfTsKICAgICAgdGhpcy5nZXRMaXN0KGZhbHNlLCBmYWxzZSk7CiAgICB9LAogICAgLy8g57yW6L6RCiAgICBlZGl0OiBmdW5jdGlvbiBlZGl0KHJvdykgewogICAgICB0aGlzLm5hdkl0ZW0gPSByb3c7CiAgICAgIHRoaXMuc3BpblNob3cgPSB0cnVlOwogICAgICB0aGlzLnBhdGhuYW1lID0gcm93LnBhdGhuYW1lOwogICAgICB0aGlzLnRpdGxlID0gcm93LmZpbGVuYW1lOwogICAgICB0aGlzLmVkaXRvckluZGV4WzBdLnRpdGxlID0gcm93LmZpbGVuYW1lOwogICAgICB0aGlzLmVkaXRvckluZGV4WzBdLnBhdGhuYW1lID0gcm93LnBhdGhuYW1lOwogICAgICB0aGlzLm5hdkxpc3QgPSB0aGlzLm5hdkxpc3RGb3JUYWI7CiAgICAgIHRoaXMuZGlyID0gcm93LnBhdGg7IC8vIOWIm+W7uuS7o+eggeWuueWZqAoKICAgICAgaWYgKHRoaXMuZWRpdG9yTGlzdC5sZW5ndGggPD0gMCkgewogICAgICAgIHRoaXMuaW5pdEVkaXRvcigpOwogICAgICB9CgogICAgICB0aGlzLm9wZW5maWxlKHJvdy5wYXRobmFtZSwgZmFsc2UpOwogICAgfSwKCiAgICAvKioNCiAgICAgKiDkv53lrZgNCiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5kZXggICAvLyDlvZPliY3ntKLlvJUNCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdHlwZSAgICAvLyB0cnVlIOS4jeabtOaWsOW9k+WJjeacrOWcsOaVsOaNru+8jGZhbHNl5oiW6ICF5Li656m6IOabtOaWsOW9k+WJjeaVsOaNrg0KICAgICAqLwogICAgc2F2ZWZpbGU6IGZ1bmN0aW9uIHNhdmVmaWxlKGluZGV4LCB0eXBlKSB7CiAgICAgIHZhciBjb2RlID0gdGhpcy5lZGl0b3JMaXN0W2luZGV4XS5lZGl0b3IuZ2V0VmFsdWUoKTsKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgY29tbWVudDogY29kZSwKICAgICAgICBmaWxlcGF0aDogdGhpcy5lZGl0b3JMaXN0W2luZGV4XS5wYXRoLAogICAgICAgIGZpbGVUb2tlbjogdGhpcy5maWxlVG9rZW4KICAgICAgfTsKICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICBzYXZlZmlsZUFwaShkYXRhKS50aGVuKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTMocmVzKSB7CiAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTMkKF9jb250ZXh0MykgewogICAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICBpZiAoIXR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGF0LmNvZGUgPSBjb2RlOwogICAgICAgICAgICAgICAgICAgIHRoYXQuaXNTYXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGF0LmVkaXRvckluZGV4W2luZGV4XS5pY29uID0gJyc7CiAgICAgICAgICAgICAgICAgICAgdGhhdC5lZGl0b3JMaXN0W2luZGV4XS5pc1NhdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB0aGF0LiRNZXNzYWdlLnN1Y2Nlc3MocmVzLm1zZyk7CiAgICAgICAgICAgICAgICAgIHRoYXQuJE1vZGFsLnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwgX2NhbGxlZTMpOwogICAgICAgIH0pKTsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHsKICAgICAgICAgIHJldHVybiBfcmVmMy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICAgIH0oKSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgIHRoYXQuY2F0Y2hGdW4ocmVzKTsKICAgICAgfSk7CiAgICB9LAogICAgLy8g5Yi35pawCiAgICByZWZyZXNoZmlsZTogZnVuY3Rpb24gcmVmcmVzaGZpbGUoKSB7CiAgICAgIC8vIOWIt+aWsOe8lui+keWZqAogICAgICBpZiAodGhpcy5lZGl0b3JMaXN0W3RoaXMuaW5kZXhFZGl0b3JdKSB0aGlzLm9wZW5maWxlKHRoaXMuZWRpdG9yTGlzdFt0aGlzLmluZGV4RWRpdG9yXS5wYXRoLCB0cnVlKTsKICAgIH0sCiAgICAvL+iuoeeul3Rva2Vu6L+H5pyf5pe26Ze0CiAgICBnZXRFeHBpcmVzVGltZTogZnVuY3Rpb24gZ2V0RXhwaXJlc1RpbWUoZXhwaXJlc1RpbWUpIHsKICAgICAgdmFyIG5vd1RpbWVOdW0gPSBNYXRoLnJvdW5kKG5ldyBEYXRlKCkgLyAxMDAwKTsKICAgICAgdmFyIGV4cGlyZXNUaW1lTnVtID0gZXhwaXJlc1RpbWUgLSBub3dUaW1lTnVtOwogICAgICByZXR1cm4gcGFyc2VGbG9hdChwYXJzZUZsb2F0KHBhcnNlRmxvYXQoZXhwaXJlc1RpbWVOdW0gLyA2MCkgLyA2MCkgLyAyNCk7CiAgICB9LAogICAgLy8g5L6n6L655qCP5byC5q2l5Yqg6L29CiAgICBsb2FkRGF0YTogZnVuY3Rpb24gbG9hZERhdGEoaXRlbSwgY2FsbGJhY2spIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICBpZiAoaXRlbS5pc0RpcikgewogICAgICAgIHRoaXMuZm9ybUl0ZW0gPSB7CiAgICAgICAgICBkaXI6IGl0ZW0ucGF0aCwKICAgICAgICAgIHN1cGVyaW9yOiAwLAogICAgICAgICAgZmlsZWRpcjogaXRlbS50aXRsZSwKICAgICAgICAgIGZpbGVUb2tlbjogdGhpcy5maWxlVG9rZW4KICAgICAgICB9OwogICAgICAgIG9wZW5kaXJMaXN0QXBpKHRoaXMuZm9ybUl0ZW0pLnRoZW4oIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICB2YXIgX3JlZjQgPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU0KHJlcykgewogICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTQkKF9jb250ZXh0NCkgewogICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0NC5wcmV2ID0gX2NvbnRleHQ0Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHJlcy5kYXRhLm5hdkxpc3QpOwoKICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDQuc3RvcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgX2NhbGxlZTQpOwogICAgICAgICAgfSkpOwoKICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g0KSB7CiAgICAgICAgICAgIHJldHVybiBfcmVmNC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgfTsKICAgICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgIGlmIChyZXMuc3RhdHVzID09IDExMDAwOCkgewogICAgICAgICAgICBfdGhpczMuJE1lc3NhZ2UuZXJyb3IocmVzLm1zZyk7CgogICAgICAgICAgICBfdGhpczMuaXNTaG93TG9nbiA9IHRydWU7CiAgICAgICAgICAgIF90aGlzMy5pc1Nob3dMaXN0ID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzMy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfdGhpczMuY2F0Y2hGdW4ocmVzKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIC8vIOiHquWumuS5ieaYvuekugogICAgcmVuZGVyQ29udGVudDogZnVuY3Rpb24gcmVuZGVyQ29udGVudChoLCBfcmVmNSkgewogICAgICB2YXIgX3N0eWxlOwoKICAgICAgdmFyIHJvb3QgPSBfcmVmNS5yb290LAogICAgICAgICAgbm9kZSA9IF9yZWY1Lm5vZGUsCiAgICAgICAgICBkYXRhID0gX3JlZjUuZGF0YTsKICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICByZXR1cm4gaCgnc3BhbicsIHsKICAgICAgICBzdHlsZTogKF9zdHlsZSA9IHsKICAgICAgICAgIGRpc3BsYXk6ICdpbmxpbmUtYmxvY2snLAogICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsCiAgICAgICAgICB1c2VyU2VsZWN0OiAnbnVsbCcsCiAgICAgICAgICBjb2xvcjogJyNjY2NjY2MnCiAgICAgICAgfSwgX2RlZmluZVByb3BlcnR5KF9zdHlsZSwgImRpc3BsYXkiLCAnaW5saW5lLWJsb2NrJyksIF9kZWZpbmVQcm9wZXJ0eShfc3R5bGUsICJ3aWR0aCIsICcxMDAlJyksIF9kZWZpbmVQcm9wZXJ0eShfc3R5bGUsICJib3JkZXJSYWRpcyIsICc1cHgnKSwgX3N0eWxlKSwKICAgICAgICBvbjogewogICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIGNsaWNrKCkgewogICAgICAgICAgICB0aGF0LmNsaWNrRGlyKGRhdGEsIHJvb3QsIG5vZGUpOwogICAgICAgICAgfSwKICAgICAgICAgIGNvbnRleHRtZW51OiBmdW5jdGlvbiBjb250ZXh0bWVudSgpIHsvLyB0aGF0LmhhbmRsZUNvbnRleHREZWxGb2xkZXIoZGF0YSxyb290LG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgW2goJ3NwYW4nLCBbaCgnSWNvbicsIHsKICAgICAgICBwcm9wczogewogICAgICAgICAgdHlwZTogZGF0YS5pc0RpciA/ICdtZC1mb2xkZXInIDogJ2lvcy1kb2N1bWVudC1vdXRsaW5lJwogICAgICAgIH0sCiAgICAgICAgc3R5bGU6IHsKICAgICAgICAgIG1hcmdpblJpZ2h0OiAnOHB4JwogICAgICAgIH0KICAgICAgfSksIGgoJ3NwYW4nLCB7CiAgICAgICAgYXR0cnM6IHsKICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlCiAgICAgICAgfQogICAgICB9LCBkYXRhLnRpdGxlKV0pXSk7CiAgICB9LAoKICAgIC8qKg0KICAgICAqIOS+p+i+ueagj+eCueWHu+S6i+S7tg0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhDQogICAgICovCiAgICBjbGlja0RpcjogZnVuY3Rpb24gY2xpY2tEaXIoZGF0YSwgcm9vdCwgbm9kZSkgewogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHRoYXQubmF2SXRlbSA9IGRhdGE7CiAgICAgIHRoYXQucGF0aG5hbWUgPSBkYXRhLnBhdGhuYW1lOwoKICAgICAgaWYgKCFkYXRhLmlzRGlyKSB7CiAgICAgICAgdmFyIGkgPSB0aGF0LmVkaXRvckluZGV4LmZpbmRJbmRleChmdW5jdGlvbiAoZSkgewogICAgICAgICAgcmV0dXJuIGUucGF0aG5hbWUgPT09IGRhdGEucGF0aG5hbWU7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChpID4gLTEpIHsKICAgICAgICAgIHRoYXQudG9nZ2xlRWRpdG9yKGkpOwogICAgICAgICAgdGhhdC5pbmRleEVkaXRvciA9IGkudG9TdHJpbmcoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGluZGV4ID0gdGhhdC5lZGl0b3JJbmRleC5sZW5ndGg7IC8vIOWIm+W7unRhYnMKCiAgICAgICAgICB0aGF0LmVkaXRvckluZGV4LnB1c2goewogICAgICAgICAgICB0YWI6IHRydWUsCiAgICAgICAgICAgIGluZGV4OiBpbmRleC50b1N0cmluZygpLAogICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSwKICAgICAgICAgICAgaWNvbjogJycsCiAgICAgICAgICAgIHBhdGhuYW1lOiBkYXRhLnBhdGhuYW1lCiAgICAgICAgICB9KTsKICAgICAgICAgIHRoYXQuaW5kZXhFZGl0b3IgPSBpbmRleC50b1N0cmluZygpOyAvLyDliJvlu7rku6PnoIHlrrnlmagKCiAgICAgICAgICB0aGF0LmluaXRFZGl0b3IoKTsKICAgICAgICAgIHRoYXQub3BlbmZpbGUoZGF0YS5wYXRobmFtZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgLy/kvqfovrnmoI/lj7PplK7ngrnlh7vkuovku7YKICAgIGhhbmRsZUNvbnRleHRNZW51OiBmdW5jdGlvbiBoYW5kbGVDb250ZXh0TWVudShkYXRhLCBldmVudCwgcG9zaXRpb24pIHsKICAgICAgcG9zaXRpb24ubGVmdCA9IE51bWJlcihwb3NpdGlvbi5sZWZ0LnNsaWNlKDAsIC0yKSkgKyA3NSArICdweCc7CiAgICAgIHRoaXMuY29udGV4dERhdGEgPSBkYXRhOwogICAgfSwKICAgIC8vIOaWh+S7tuaTjeS9nOexu+WeiyBjcmVhdGVGb2xkZXJ85Yib5bu65paH5Lu25aS5IGNyZWF0ZUZpbGV85Yib5bu65paH5Lu2IGRlbEZvbGRlcnzliKDpmaTmlofku7blpLnmiJbogIXmlofku7YgcmVuYW1lRmlsZXzmlofku7bph43lkb3lkI0KICAgIC8v5Yib5bu65paH5Lu25aS5CiAgICBoYW5kbGVDb250ZXh0Q3JlYXRlRm9sZGVyOiBmdW5jdGlvbiBoYW5kbGVDb250ZXh0Q3JlYXRlRm9sZGVyKCkgewogICAgICB0aGlzLmZvcm1GaWxlLmZpbGVuYW1lID0gJyc7CiAgICAgIHRoaXMuZm9ybVRpdGxlID0gJ+WIm+W7uuaWh+S7tuWkuSc7CiAgICAgIHRoaXMuZm9ybVNob3cgPSB0cnVlOwogICAgICB0aGlzLmZpbGVUeXBlID0gJ2NyZWF0ZUZvbGRlcic7CiAgICB9LAogICAgLy/liJvlu7rmlofku7YKICAgIGhhbmRsZUNvbnRleHRDcmVhdGVGaWxlOiBmdW5jdGlvbiBoYW5kbGVDb250ZXh0Q3JlYXRlRmlsZSgpIHsKICAgICAgdGhpcy5mb3JtRmlsZS5maWxlbmFtZSA9ICcnOwogICAgICB0aGlzLmZvcm1UaXRsZSA9ICfliJvlu7rmlofku7YnOwogICAgICB0aGlzLmZvcm1TaG93ID0gdHJ1ZTsKICAgICAgdGhpcy5maWxlVHlwZSA9ICdjcmVhdGVGaWxlJzsKICAgIH0sCiAgICAvL+WIoOmZpOaWh+S7tgogICAgaGFuZGxlQ29udGV4dERlbEZvbGRlcjogZnVuY3Rpb24gaGFuZGxlQ29udGV4dERlbEZvbGRlcigpIHsKICAgICAgdmFyIF90aGlzNCA9IHRoaXM7CgogICAgICB2YXIgdGhhdCA9IHRoaXM7CiAgICAgIHRoYXQuJE1vZGFsLmNvbmZpcm0oewogICAgICAgIHRpdGxlOiAn5Yig6Zmk5paH5Lu25aS55ZKM5paH5Lu2JywKICAgICAgICBjb250ZW50OiAn5oKo56Gu5a6a6KaB5Yig6Zmk5pS55paH5Lu277yfJywKICAgICAgICBsb2FkaW5nOiB0cnVlLAogICAgICAgIG9uT2s6IGZ1bmN0aW9uIG9uT2soKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IHsKICAgICAgICAgICAgcGF0aDogdGhhdC5jb250ZXh0RGF0YS5wYXRobmFtZSwKICAgICAgICAgICAgZmlsZVRva2VuOiBfdGhpczQuZmlsZVRva2VuCiAgICAgICAgICB9OwogICAgICAgICAgZGVsRm9sZGVyKGRhdGEpLnRoZW4oIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfcmVmNiA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTUocmVzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWU1JChfY29udGV4dDUpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ1LnByZXYgPSBfY29udGV4dDUubmV4dCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICAgIHRoYXQubG9vcERlbCh0aGF0Lm5hdkxpc3QsIHRoYXQuY29udGV4dERhdGEubm9kZUtleSk7CiAgICAgICAgICAgICAgICAgICAgICB0aGF0LiRNb2RhbC5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICAgICAgIHRoYXQuJE1lc3NhZ2Uuc3VjY2Vzcygn5Yig6Zmk5oiQ5YqfJyk7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0NS5zdG9wKCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9LCBfY2FsbGVlNSk7CiAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g1KSB7CiAgICAgICAgICAgICAgcmV0dXJuIF9yZWY2LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgdGhhdC5jYXRjaEZ1bihyZXMpOwogICAgICAgICAgfSk7CiAgICAgICAgfSwKICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gb25DYW5jZWwoKSB7CiAgICAgICAgICB0aGF0LiRNZXNzYWdlLmluZm8oJ+WPlua2iOWIoOmZpCcpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy/ph43lkb3lkI0KICAgIGhhbmRsZUNvbnRleHRSZW5hbWU6IGZ1bmN0aW9uIGhhbmRsZUNvbnRleHRSZW5hbWUoKSB7CiAgICAgIHRoaXMuZm9ybUZpbGUuZmlsZW5hbWUgPSB0aGlzLmNvbnRleHREYXRhLnRpdGxlOwogICAgICB0aGlzLmZvcm1UaXRsZSA9ICfph43lkb3lkI3mlofku7YnOwogICAgICB0aGlzLmZvcm1TaG93ID0gdHJ1ZTsKICAgICAgdGhpcy5maWxlVHlwZSA9ICdyZW5hbWVGaWxlJzsKICAgIH0sCiAgICAvL+aJk+W8gOaWh+S7tgogICAgb3BlbmZpbGU6IGZ1bmN0aW9uIG9wZW5maWxlKHBhdGgsIGlzX2VkaXQpIHsKICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICB2YXIgcGFyYW1zID0gewogICAgICAgIGZpbGVwYXRoOiBwYXRoLAogICAgICAgIGZpbGVUb2tlbjogdGhpcy5maWxlVG9rZW4KICAgICAgfTsKICAgICAgb3BlbmZpbGVBcGkocGFyYW1zKS50aGVuKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfcmVmNyA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTYocmVzKSB7CiAgICAgICAgICB2YXIgZGF0YTsKICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlNiQoX2NvbnRleHQ2KSB7CiAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgc3dpdGNoIChfY29udGV4dDYucHJldiA9IF9jb250ZXh0Ni5uZXh0KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgIGRhdGEgPSByZXMuZGF0YTsKICAgICAgICAgICAgICAgICAgdGhhdC5jb2RlID0gZGF0YS5jb250ZW50OyAvLyDkv53lrZjnm7jlr7nkv6Hmga8KCiAgICAgICAgICAgICAgICAgIHRoYXQuZWRpdG9yTGlzdFt0aGF0LmluZGV4RWRpdG9yXS5wYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgICAgdGhhdC5lZGl0b3JMaXN0W3RoYXQuaW5kZXhFZGl0b3JdLm9sZENvZGUgPSB0aGF0LmNvZGU7IC8v5pS55Y+Y5bGe5oCnCgogICAgICAgICAgICAgICAgICB0aGF0LmNoYW5nZU1vZGVsKGRhdGEubW9kZSwgdGhhdC5jb2RlKTsKCiAgICAgICAgICAgICAgICAgIGlmICghaXNfZWRpdCkgewogICAgICAgICAgICAgICAgICAgIHRoYXQubW9kYWxzID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGF0LnNwaW5TaG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ2LnN0b3AoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sIF9jYWxsZWU2KTsKICAgICAgICB9KSk7CgogICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g2KSB7CiAgICAgICAgICByZXR1cm4gX3JlZjcuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICB0aGF0LmNhdGNoRnVuKHJlcyk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvKioNCiAgICAgKiDliJ3lp4vljJbnvJbovpHlmagNCiAgICAgKi8KICAgIGluaXRFZGl0b3I6IGZ1bmN0aW9uIGluaXRFZGl0b3IoKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgdGhhdC4kbmV4dFRpY2soZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKG1vbmFjbyk7IC8vIOWIneWni+WMlue8lui+keWZqO+8jOehruS/nWRvbeW3sue7j+a4suafkwoKICAgICAgICB0aGF0LmVkaXRvciA9IG1vbmFjby5lZGl0b3IuY3JlYXRlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250YWluZXJfJyArIHRoYXQuaW5kZXhFZGl0b3IpLCB7CiAgICAgICAgICB2YWx1ZTogdGhhdC5jb2RlLAogICAgICAgICAgLy/nvJbovpHlmajliJ3lp4vmmL7npLrmloflrZcKICAgICAgICAgIGxhbmd1YWdlOiAnc3FsJywKICAgICAgICAgIC8v6K+t6KiA5pSv5oyB6Ieq6KGM5p+l6ZiFZGVtbwogICAgICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLAogICAgICAgICAgLy/oh6rliqjluIPlsYAKICAgICAgICAgIHRoZW1lOiAndnMnLAogICAgICAgICAgLy/lrpjmlrnoh6rluKbkuInnp43kuLvpoph2cywgaGMtYmxhY2ssIG9yIHZzLWRhcmsKICAgICAgICAgIGZvbGRpbmdTdHJhdGVneTogJ2luZGVudGF0aW9uJywKICAgICAgICAgIC8vIOS7o+eggeWPr+WIhuWwj+auteaKmOWPoAogICAgICAgICAgb3ZlcnZpZXdSdWxlckJvcmRlcjogZmFsc2UsCiAgICAgICAgICAvLyDkuI3opoHmu5rliqjmnaHnmoTovrnmoYYKICAgICAgICAgIHNjcm9sbGJhcjogewogICAgICAgICAgICAvLyDmu5rliqjmnaHorr7nva4KICAgICAgICAgICAgdmVydGljYWxTY3JvbGxiYXJTaXplOiA0LAogICAgICAgICAgICAvLyDnq5bmu5rliqjmnaEKICAgICAgICAgICAgaG9yaXpvbnRhbFNjcm9sbGJhclNpemU6IDEwIC8vIOaoqua7muWKqOadoQoKICAgICAgICAgIH0sCiAgICAgICAgICBhdXRvSW5kZW50OiB0cnVlLAogICAgICAgICAgLy8g6Ieq5Yqo5biD5bGACiAgICAgICAgICB0YWJTaXplOiA0LAogICAgICAgICAgLy8gdGFi57yp6L+b6ZW/5bqmCiAgICAgICAgICBhdXRvQ2xvc2luZ092ZXJ0eXBlOiAnYWx3YXlzJwogICAgICAgIH0pOyAvL+a3u+WKoOaMiemUruebkeWQrAoKICAgICAgICB0aGF0LmVkaXRvci5hZGRDb21tYW5kKG1vbmFjby5LZXlNb2QuQ3RybENtZCB8IG1vbmFjby5LZXlDb2RlLktFWV9TLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICB0aGF0LnNhdmVmaWxlKHRoYXQuaW5kZXhFZGl0b3IpOwogICAgICAgIH0pOwogICAgICAgIHRoYXQuZWRpdG9yLm9uS2V5VXAoZnVuY3Rpb24gKCkgewogICAgICAgICAgLy8g5b2T6ZSu55uY5oyJ5LiL77yM5Yik5pat5b2T5YmN57yW6L6R5Zmo5paH5pys5LiO5bey5L+d5a2Y55qE57yW6L6R5Zmo5paH5pys5piv5ZCm5LiA6Ie0CiAgICAgICAgICBpZiAodGhhdC5lZGl0b3IuZ2V0VmFsdWUoKSAhPSB0aGF0LmNvZGUpIHsKICAgICAgICAgICAgdGhhdC5pc1NhdmUgPSBmYWxzZTsKICAgICAgICAgICAgdGhhdC5lZGl0b3JJbmRleFt0aGF0LmluZGV4RWRpdG9yXS5pY29uID0gJ21kLXdhcm5pbmcnOwogICAgICAgICAgICB0aGF0LmVkaXRvckxpc3RbdGhhdC5pbmRleEVkaXRvcl0uaXNTYXZlID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdGhhdC5lZGl0b3JMaXN0LnB1c2goewogICAgICAgICAgZWRpdG9yOiB0aGF0LmVkaXRvciwKICAgICAgICAgIG9sZENvZGU6IHRoYXQuY29kZSwKICAgICAgICAgIHBhdGg6ICcnLAogICAgICAgICAgaXNTYXZlOiB0cnVlLAogICAgICAgICAgaW5kZXg6IHRoYXQuaW5kZXhFZGl0b3IKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9LAoKICAgIC8qKg0KICAgICAqIOWIh+aNouivreiogA0KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlDQogICAgICovCiAgICBjaGFuZ2VNb2RlbDogZnVuY3Rpb24gY2hhbmdlTW9kZWwobW9kZSwgdmFsdWUpIHsKICAgICAgdmFyIG9sZE1vZGVsID0gdGhpcy5lZGl0b3JMaXN0W3RoaXMuaW5kZXhFZGl0b3JdLmVkaXRvci5nZXRNb2RlbCgpOyAvL+iOt+WPluaXp+aooeWeiwogICAgICAvLyB2YXIgdmFsdWUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpOy8v6I635Y+W5pen55qE5paH5pysCiAgICAgIC8v5Yib5bu65paw5qih5Z6L77yMdmFsdWXkuLrml6fmlofmnKzvvIxpZOS4um1vZGVJZO+8jOWNs+ivreiogO+8iGxhbmd1YWdlLmlk77yJCiAgICAgIC8vbW9kZXNJZHPljbPkuLrmlK/mjIHor63oqIAKICAgICAgLy8gdmFyIG1vZGVzSWRzID0gbW9uYWNvLmxhbmd1YWdlcy5nZXRMYW5ndWFnZXMoKS5tYXAoZnVuY3Rpb24obGFuZykgeyByZXR1cm4gbGFuZy5pZDsgfSk7CgogICAgICBpZiAoIW1vZGUpIG1vZGUgPSBvbGRNb2RlbC5nZXRMYW5ndWFnZUlkKCk7IC8vIGlmKCF2YWx1ZSkgdmFsdWUgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpOwoKICAgICAgdmFyIG5ld01vZGVsID0gbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh2YWx1ZSwgbW9kZSk7IC8v5bCG5pen5qih5Z6L6ZSA5q+BCgogICAgICBpZiAob2xkTW9kZWwpIHsKICAgICAgICBvbGRNb2RlbC5kaXNwb3NlKCk7CiAgICAgIH0gLy/orr7nva7mlrDmqKHlnosKCgogICAgICB0aGlzLmVkaXRvckxpc3RbdGhpcy5pbmRleEVkaXRvcl0uZWRpdG9yLnNldE1vZGVsKG5ld01vZGVsKTsKICAgIH0sCiAgICAvLyDmlofku7bmk43kvZznsbvlnosgY3JlYXRlRm9sZGVyfOWIm+W7uuaWh+S7tuWkuSBjcmVhdGVGaWxlfOWIm+W7uuaWh+S7tiBkZWxGb2xkZXJ85Yig6Zmk5paH5Lu25aS55oiW6ICF5paH5Lu2CiAgICBoYW5kbGVTdWJtaXQ6IGZ1bmN0aW9uIGhhbmRsZVN1Ym1pdChuYW1lKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwoKICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICB2YXIgZGF0YSA9ICcnOwogICAgICB2YXIgZGF0YUl0ZW0gPSAnJzsKICAgICAgdGhpcy4kcmVmc1tuYW1lXS52YWxpZGF0ZShmdW5jdGlvbiAodmFsaWQpIHsKICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgIHN3aXRjaCAodGhhdC5maWxlVHlwZSkgewogICAgICAgICAgICBjYXNlICdjcmVhdGVGb2xkZXInOgogICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICBwYXRoOiB0aGF0LmNvbnRleHREYXRhLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgbmFtZTogdGhhdC5mb3JtRmlsZS5maWxlbmFtZSwKICAgICAgICAgICAgICAgIGZpbGVUb2tlbjogX3RoaXM1LmZpbGVUb2tlbgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY3JlYXRlRm9sZGVyKGRhdGEpLnRoZW4oIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgX3JlZjggPSBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWU3KHJlcykgewogICAgICAgICAgICAgICAgICByZXR1cm4gcmVnZW5lcmF0b3JSdW50aW1lLndyYXAoZnVuY3Rpb24gX2NhbGxlZTckKF9jb250ZXh0NykgewogICAgICAgICAgICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0Ny5wcmV2ID0gX2NvbnRleHQ3Lm5leHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFJdGVtID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyOiB0aGF0LmNvbnRleHREYXRhLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcmlvcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVkaXI6IHRoYXQuY29udGV4dERhdGEudGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlVG9rZW46IF90aGlzNS5maWxlVG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuZ2V0TGlzdEl0ZW0oZGF0YUl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGF0LmZvcm1TaG93KSB0aGF0LmZvcm1TaG93ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC4kTWVzc2FnZS5zdWNjZXNzKCfliJvlu7rmiJDlip8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ3LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU3KTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94NykgewogICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjguYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfSgpKS5jYXRjaChmdW5jdGlvbiAocmVzKSB7CiAgICAgICAgICAgICAgICB0aGF0LmNhdGNoRnVuKHJlcyk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlICdjcmVhdGVGaWxlJzoKICAgICAgICAgICAgICBkYXRhID0gewogICAgICAgICAgICAgICAgcGF0aDogdGhhdC5jb250ZXh0RGF0YS5wYXRobmFtZSwKICAgICAgICAgICAgICAgIG5hbWU6IHRoYXQuZm9ybUZpbGUuZmlsZW5hbWUsCiAgICAgICAgICAgICAgICBmaWxlVG9rZW46IF90aGlzNS5maWxlVG9rZW4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNyZWF0ZUZpbGUoZGF0YSkudGhlbiggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBfcmVmOSA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTgocmVzKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlOCQoX2NvbnRleHQ4KSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ4LnByZXYgPSBfY29udGV4dDgubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUl0ZW0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI6IHRoYXQuY29udGV4dERhdGEucGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyaW9yOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZWRpcjogdGhhdC5jb250ZXh0RGF0YS50aXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVUb2tlbjogX3RoaXM1LmZpbGVUb2tlbgogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZXRMaXN0SXRlbShkYXRhSXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuZm9ybVNob3cpIHRoYXQuZm9ybVNob3cgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0LiRNZXNzYWdlLnN1Y2Nlc3MoJ+WIm+W7uuaIkOWKnycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDguc3RvcCgpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSwgX2NhbGxlZTgpOwogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoX3g4KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBfcmVmOS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9KCkpLmNhdGNoKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgIHRoYXQuY2F0Y2hGdW4ocmVzKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgJ3JlbmFtZUZpbGUnOgogICAgICAgICAgICAgIGRhdGEgPSB7CiAgICAgICAgICAgICAgICBuZXduYW1lOiB0aGF0LmNvbnRleHREYXRhLnBhdGggKyAnXFwnICsgdGhhdC5mb3JtRmlsZS5maWxlbmFtZSwKICAgICAgICAgICAgICAgIG9sZG5hbWU6IHRoYXQuY29udGV4dERhdGEucGF0aG5hbWUsCiAgICAgICAgICAgICAgICBmaWxlVG9rZW46IF90aGlzNS5maWxlVG9rZW4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHJlbmFtZShkYXRhKS50aGVuKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIF9yZWYxMCA9IF9hc3luY1RvR2VuZXJhdG9yKCAvKiNfX1BVUkVfXyovcmVnZW5lcmF0b3JSdW50aW1lLm1hcmsoZnVuY3Rpb24gX2NhbGxlZTkocmVzKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiByZWdlbmVyYXRvclJ1bnRpbWUud3JhcChmdW5jdGlvbiBfY2FsbGVlOSQoX2NvbnRleHQ5KSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQ5LnByZXYgPSBfY29udGV4dDkubmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC4kc2V0KHRoYXQuY29udGV4dERhdGEsICd0aXRsZScsIHRoYXQuZm9ybUZpbGUuZmlsZW5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQuJE1lc3NhZ2Uuc3VjY2Vzcygn5L+u5pS55oiQ5YqfJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoYXQuZm9ybVNob3cpIHRoYXQuZm9ybVNob3cgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQ5LnN0b3AoKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0sIF9jYWxsZWU5KTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKF94OSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gX3JlZjEwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0oKSkuY2F0Y2goZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgdGhhdC5jYXRjaEZ1bihyZXMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczUuJE1lc3NhZ2UuZXJyb3IoJ0ZhaWwhJyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCgogICAgLyoqDQogICAgICog6YCA5Ye66KGo5Y2VDQogICAgICovCiAgICBmb3JtRXhpdDogZnVuY3Rpb24gZm9ybUV4aXQoKSB7CiAgICAgIHRoaXMuZm9ybVNob3cgPSBmYWxzZTsKICAgIH0sCgogICAgLyoqDQogICAgICog5aSE55CG5o6l5Y+j5Zue6LCDDQogICAgICogQHBhcmFtIHtPYmplY3R9IHJlcw0KICAgICAqLwogICAgY2F0Y2hGdW46IGZ1bmN0aW9uIGNhdGNoRnVuKHJlcykgewogICAgICBpZiAocmVzLnN0YXR1cykgewogICAgICAgIGlmIChyZXMuc3RhdHVzID09IDQwMCkgdGhpcy4kTWVzc2FnZS5lcnJvcihyZXMubXNnKTsKCiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT0gMTEwMDA4KSB7CiAgICAgICAgICAvLyB0aGlzLiRNZXNzYWdlLmVycm9yKHJlcy5tc2cpOwogICAgICAgICAgdGhpcy5pc1Nob3dMb2duID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuaXNTaG93TGlzdCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9IGVsc2Ugey8vIHRoaXMuJE1lc3NhZ2UuZXJyb3IoJ+aWh+S7tue8lueggeS4jeiiq+WFvOWuue+8jOaXoOazleato+ehruivu+WPluaWh+S7tiEnKTsKICAgICAgfSAvL+WFs+mXreiSmeeJiOWxggoKCiAgICAgIGlmICh0aGlzLnNwaW5TaG93KSB0aGlzLnNwaW5TaG93ID0gZmFsc2U7IC8vIOWFs+mXreaWh+S7tuWIl+ihqOWxleekugoKICAgICAgaWYgKHRoaXMubG9hZGluZykgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICB9LAogICAgbG9vcERlbDogZnVuY3Rpb24gbG9vcERlbChkYXRhLCBub2RlS2V5KSB7CiAgICAgIHZhciBfdGhpczYgPSB0aGlzOwoKICAgICAgZGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgIGlmIChpdGVtLm5vZGVLZXkgPT09IG5vZGVLZXkpIHsKICAgICAgICAgIHJldHVybiBkYXRhLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXM2Lmxvb3BEZWwoaXRlbS5jaGlsZHJlbiwgbm9kZUtleSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCgogICAgLyoqDQogICAgICog56qX5Y+j5pyA5aSn5YyWDQogICAgICovCiAgICB3aW5DaGFuZ2VzOiBmdW5jdGlvbiB3aW5DaGFuZ2VzKCkgewogICAgICBpZiAodGhpcy5jbGFzc05hbWUpIHsKICAgICAgICB0aGlzLmNsYXNzTmFtZSA9ICcnOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuY2xhc3NOYW1lID0gJ2RpeS1mdWxsc2NyZWVuJzsKICAgICAgfQogICAgfSwKCiAgICAvKioNCiAgICAgKiDliIfmjaLpgInpobnljaENCiAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5kZXgNCiAgICAgKi8KICAgIHRvZ2dsZUVkaXRvcjogZnVuY3Rpb24gdG9nZ2xlRWRpdG9yKGluZGV4KSB7CiAgICAgIGluZGV4ID0gTnVtYmVyKGluZGV4KTsKICAgICAgdGhpcy5jb2RlID0gdGhpcy5lZGl0b3JMaXN0W2luZGV4XS5vbGRDb2RlOyAvL+iuvue9ruaWh+S7tuaJk+W8gOaXtueahOS7o+eggQoKICAgICAgdGhpcy5lZGl0b3IgPSB0aGlzLmVkaXRvckxpc3RbaW5kZXhdLmVkaXRvcjsgLy/orr7nva7nvJbovpHlmajlrp7kvosKICAgIH0sCiAgICBoYW5kbGVUYWJSZW1vdmU6IGZ1bmN0aW9uIGhhbmRsZVRhYlJlbW92ZShpbmRleCkgewogICAgICB2YXIgdGhhdCA9IHRoaXM7IC8vIOWFs+mXremAiemhueWNoQoKICAgICAgdGhhdC5lZGl0b3JJbmRleFtpbmRleF0udGFiID0gZmFsc2U7IC8vIOWFs+mXremAiemhueWNoQogICAgICAvLyDliKTmlq3lvZPliY3mlofku7bmnInmsqHmnInkv53lrZgKCiAgICAgIGlmICghdGhhdC5lZGl0b3JMaXN0W2luZGV4XS5pc1NhdmUpIHsKICAgICAgICB0aGF0LiRNb2RhbC5jb25maXJtKHsKICAgICAgICAgIHRpdGxlOiAn5paH5Lu25pyq5L+d5a2YJywKICAgICAgICAgIGNvbnRlbnQ6ICfmgqjmmK/lkKbpnIDopoHkv53lrZjlvZPliY3mlofku7YnLAogICAgICAgICAgbG9hZGluZzogdHJ1ZSwKICAgICAgICAgIG9uT2s6IGZ1bmN0aW9uIG9uT2soKSB7CiAgICAgICAgICAgIC8vIOS/neWtmOaWh+S7tgogICAgICAgICAgICB0aGF0LnNhdmVmaWxlKGluZGV4KTsKICAgICAgICAgIH0sCiAgICAgICAgICBvbkNhbmNlbDogZnVuY3Rpb24gb25DYW5jZWwoKSB7CiAgICAgICAgICAgIHRoYXQuJE1lc3NhZ2UuaW5mbygn5Y+W5raI5L+d5a2YJyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICAvL+e8lui+keWZqOeKtuaAgeWPmOWMlgogICAgZWRpdE1vZGFsQ2hhbmdlOiBmdW5jdGlvbiBlZGl0TW9kYWxDaGFuZ2UoKSB7CiAgICAgIHZhciB0aGF0ID0gdGhpczsKICAgICAgdGhhdC5lZGl0b3JMaXN0LmZvckVhY2goZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgewogICAgICAgIGlmICh2YWx1ZS5pc1NhdmUgPT09IGZhbHNlKSB7CiAgICAgICAgICBpZiAoY29uZmlybSgiIi5jb25jYXQodGhhdC5lZGl0b3JJbmRleFtpbmRleF0udGl0bGUsICJcdTY1ODdcdTRFRjZcdTY3MkFcdTRGRERcdTVCNTgsXHU2NjJGXHU1NDI2XHU4OTgxXHU0RkREXHU1QjU4XHU4QkU1XHU2NTg3XHU0RUY2IikpKSB7CiAgICAgICAgICAgIC8vIOS/neWtmOW9k+WJjeaWh+S7tgogICAgICAgICAgICB0aGF0LnNhdmVmaWxlKGluZGV4LCB0cnVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoYXQuJE1lc3NhZ2UuaW5mbygiXHU1REYyXHU1M0Q2XHU2RDg4Ii5jb25jYXQodGhhdC5lZGl0b3JJbmRleFtpbmRleF0udGl0bGUsICJcdTY1ODdcdTRFRjZcdTRGRERcdTVCNTgiKSk7CiAgICAgICAgICB9CiAgICAgICAgfSAvLyDplIDmr4HlvZPliY3nvJbovpHlmagKCgogICAgICAgIHRoYXQuZWRpdG9yTGlzdFtpbmRleF0uZWRpdG9yLmRpc3Bvc2UoKTsKICAgICAgICB0aGF0LmVkaXRvckxpc3RbaW5kZXhdLmVkaXRvciA9IG51bGw7CiAgICAgIH0pOyAvLyDliJ3lp4vor53mlbDmja4KCiAgICAgIHRoYXQubW9kYWxzID0gZmFsc2U7IC8v57yW6L6R5Zmo5byA5YWzCgogICAgICB0aGF0LmVkaXRvciA9ICcnOyAvL+W9k+WJjee8lui+keWZqOWvueixoQoKICAgICAgdGhhdC5lZGl0b3JJbmRleCA9IFsvL+mAiemhueWNoeaVsOe7hAogICAgICB7CiAgICAgICAgdGFiOiB0cnVlLAogICAgICAgIGluZGV4OiAnMCcsCiAgICAgICAgdGl0bGU6ICcnLAogICAgICAgIGljb246ICcnCiAgICAgIH1dOwogICAgICB0aGF0LmVkaXRvckxpc3QgPSBbXTsgLy/nvJbovpHlmajmlbDnu4QKCiAgICAgIHRoYXQuaW5kZXhFZGl0b3IgPSAnMCc7IC8v5b2T5YmN57yW6L6R5Zmo57Si5byVCgogICAgICB0aGF0LmNvZGUgPSAnJzsgLy/lvZPliY3mlofku7bmiZPlvIDml7bnmoTlhoXlrrkKCiAgICAgIHRoYXQubmF2TGlzdCA9IFtdOyAvL+W3puS+p+WvvOiIquaVsOaNrgoKICAgICAgdGhhdC5uYXZJdGVtID0ge307IC8v5bem5L6n5a+86Iiq54K55Ye75piv6YCJ5Lit55qE5pWw5o2uCgogICAgICB0aGF0LmNvbnRleHREYXRhID0gbnVsbDsgLy/lt6bkvqflr7zoiKrlj7PplK7ngrnlh7vmmK/kuqfnlJ/nmoTmlbDmja7lr7nosaEKICAgIH0KICB9Cn07"},{"version":3,"mappings":"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","names":["opendirListApi","openfileApi","savefileApi","opendirLoginApi","createFolder","createFile","delFolder","rename","name","data","modals","editor","editorIndex","tab","index","title","icon","editorList","indexEditor","code","navList","navItem","contextData","fileType","className","isSave","isShowLogn","isShowList","spinShow","loading","tabList","columns4","slot","minWidth","back","key","formItem","dir","superior","filedir","fileToken","pathname","formFile","filename","ruleInline","required","message","trigger","formShow","formTitle","components","loginFrom","mounted","created","beforeDestroy","removeCookies","computed","methods","currentChange","currentRow","getList","refresh","is_edit","params","then","res","catch","getListItem","goBack","open","row","edit","savefile","type","comment","filepath","that","refreshfile","getExpiresTime","expiresTime","loadData","item","callback","renderContent","h","style","display","cursor","userSelect","color","on","click","contextmenu","props","marginRight","attrs","clickDir","root","node","handleContextMenu","event","position","handleContextCreateFolder","handleContextCreateFile","handleContextDelFolder","content","onOk","path","onCancel","handleContextRename","openfile","initEditor","console","value","language","automaticLayout","theme","foldingStrategy","overviewRulerBorder","scrollbar","verticalScrollbarSize","horizontalScrollbarSize","autoIndent","tabSize","autoClosingOvertype","oldCode","changeModel","mode","oldModel","handleSubmit","dataItem","newname","oldname","formExit","catchFun","loopDel","nodeKey","winChanges","toggleEditor","handleTabRemove","editModalChange"],"sourceRoot":"src/pages/system/maintain/systemFile","sources":["opendir.vue"],"sourcesContent":["<template>\r\n <div>\r\n <Card :bordered=\"false\" dis-hover class=\"ivu-mt\">\r\n <div v-if=\"isShowList\" class=\"backs\" @click=\"goBack(false)\">\r\n <Icon type=\"ios-folder-outline\" class=\"mr5 icon\" /><span>返回上级</span>\r\n </div>\r\n <Table\r\n v-if=\"isShowList\"\r\n ref=\"selection\"\r\n :columns=\"columns4\"\r\n :data=\"tabList\"\r\n :loading=\"loading\"\r\n no-data-text=\"暂无数据\"\r\n highlight-row\r\n class=\"mt20\"\r\n @on-current-change=\"currentChange\"\r\n no-filtered-data-text=\"暂无筛选结果\"\r\n >\r\n <template slot-scope=\"{ row }\" slot=\"filename\">\r\n <Icon type=\"ios-folder-outline\" v-if=\"row.isDir\" class=\"mr5\" />\r\n <Icon type=\"ios-document-outline\" v-else class=\"mr5\" />\r\n <span>{{ row.filename }}</span>\r\n </template>\r\n <template slot-scope=\"{ row }\" slot=\"isWritable\">\r\n <span v-text=\"row.isWritable ? '是' : '否'\"></span>\r\n </template>\r\n <template slot-scope=\"{ row, index }\" slot=\"action\">\r\n <a @click=\"open(row)\" v-if=\"row.isDir\">打开</a>\r\n <a @click=\"edit(row)\" v-else>编辑</a>\r\n </template>\r\n </Table>\r\n </Card>\r\n <Modal\r\n :class-name=\"className\"\r\n v-model=\"modals\"\r\n scrollable\r\n footer-hide\r\n closable\r\n :mask-closable=\"false\"\r\n width=\"80%\"\r\n :before-close=\"editModalChange\"\r\n >\r\n <p slot=\"header\" class=\"diy-header\" ref=\"diyHeader\">\r\n <span>{{ title }}</span>\r\n <Icon\r\n @click=\"winChanges\"\r\n class=\"diy-header-icon\"\r\n :type=\"className ? 'ios-contract' : 'ios-qr-scanner'\"\r\n size=\"20\"\r\n />\r\n </p>\r\n <div style=\"height: 100%\">\r\n <Button type=\"primary\" id=\"savefile\" class=\"diy-button\" @click=\"savefile(indexEditor)\">保存</Button>\r\n <Button id=\"refresh\" class=\"diy-button\" @click=\"refreshfile\">刷新</Button>\r\n\r\n <div class=\"file-box\">\r\n <div class=\"show-info\">\r\n <div class=\"show-text\" :title=\"navItem.pathname\">目录: {{ navItem.pathname }}</div>\r\n <div class=\"diy-button-list\">\r\n <Button class=\"diy-button\" @click=\"goBack(true)\">返回上一级</Button>\r\n <Button class=\"diy-button\" @click=\"getList(true, true)\">刷新</Button>\r\n </div>\r\n </div>\r\n <div class=\"file-left\">\r\n <Tree\r\n class=\"diy-tree-render\"\r\n :data=\"navList\"\r\n :render=\"renderContent\"\r\n :load-data=\"loadData\"\r\n @on-contextmenu=\"handleContextMenu\"\r\n expand-node\r\n >\r\n <template transfer slot=\"contextMenu\">\r\n <DropdownItem v-if=\"contextData && contextData.isDir\" @click.native=\"handleContextCreateFolder()\"\r\n >新建文件夹</DropdownItem\r\n >\r\n <DropdownItem v-if=\"contextData && contextData.isDir\" @click.native=\"handleContextCreateFile()\"\r\n >新建文件</DropdownItem\r\n >\r\n <DropdownItem @click.native=\"handleContextRename()\">重命名</DropdownItem>\r\n <DropdownItem @click.native=\"handleContextDelFolder()\" style=\"color: #ed4014\">删除</DropdownItem>\r\n </template>\r\n </Tree>\r\n </div>\r\n <div class=\"file-fix\"></div>\r\n <div class=\"file-content\">\r\n <Tabs\r\n type=\"card\"\r\n v-model=\"indexEditor\"\r\n style=\"height: 100%\"\r\n @on-click=\"toggleEditor\"\r\n :animated=\"false\"\r\n closable\r\n @on-tab-remove=\"handleTabRemove\"\r\n >\r\n <TabPane\r\n v-for=\"value in editorIndex\"\r\n :key=\"value.index\"\r\n :name=\"value.index.toString()\"\r\n :label=\"value.title\"\r\n :icon=\"value.icon\"\r\n v-if=\"value.tab\"\r\n >\r\n <div ref=\"container\" :id=\"'container_' + value.index\" style=\"height: 100%; min-height: 560px\"></div>\r\n </TabPane>\r\n </Tabs>\r\n </div>\r\n <Spin size=\"large\" fix v-if=\"spinShow\"></Spin>\r\n </div>\r\n </div>\r\n </Modal>\r\n\r\n <div v-show=\"formShow\" class=\"diy-from\">\r\n <div class=\"diy-from-header\">\r\n {{ formTitle\r\n }}<span :title=\"contextData ? contextData.pathname : ''\">{{ contextData ? contextData.pathname : '' }}</span>\r\n </div>\r\n <Form ref=\"formInline\" :model=\"formFile\" :rules=\"ruleInline\" inline>\r\n <FormItem prop=\"filename\" class=\"diy-file\">\r\n <Input type=\"text\" class=\"diy-file\" v-model=\"formFile.filename\" placeholder=\"请输入名字\">\r\n <Icon type=\"ios-folder-open-outline\" slot=\"prepend\"></Icon>\r\n </Input>\r\n </FormItem>\r\n <FormItem>\r\n <Button class=\"diy-button\" @click=\"handleSubmit('formInline')\">确定</Button>\r\n </FormItem>\r\n <FormItem>\r\n <Button class=\"diy-button\" @click=\"formExit()\">取消</Button>\r\n </FormItem>\r\n <div class=\"form-mask\" v-show=\"formShow\"></div>\r\n </Form>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport { resolveComponent } from 'vue';\r\nimport {\r\n opendirListApi,\r\n openfileApi,\r\n savefileApi,\r\n opendirLoginApi,\r\n createFolder,\r\n createFile,\r\n delFolder,\r\n rename,\r\n} from '@/api/system';\r\nimport CodeMirror from 'codemirror/lib/codemirror';\r\nimport loginFrom from './components/loginFrom';\r\nimport { setCookies, getCookies, removeCookies } from '@/libs/util';\r\n// import Fullscreen from '@/components/main/components/fullscreen';\r\nimport * as monaco from 'monaco-editor';\r\nexport default {\r\n name: 'opendir',\r\n data() {\r\n return {\r\n modals: false, //编辑器开关\r\n editor: '', //当前编辑器对象\r\n editorIndex: [\r\n //选项卡数组\r\n {\r\n tab: true,\r\n index: '0',\r\n title: '',\r\n icon: '',\r\n },\r\n ],\r\n editorList: [], //编辑器数组\r\n indexEditor: 0, //当前编辑器索引\r\n code: '', //当前文件打开时的内容\r\n navList: [], //左侧导航数据\r\n navItem: {}, //左侧导航点击是选中的数据\r\n contextData: null, //左侧导航右键点击是产生的数据对象\r\n\r\n fileType: '', // 文件操作类型 createFolder|创建文件夹 createFile|创建文件 delFolder|删除文件夹或者文件\r\n className: '', //全屏 class名\r\n // fullscreen:false, // 是否全屏\r\n isSave: true, //当前文件是否保存\r\n\r\n isShowLogn: false, // 登录\r\n isShowList: false, // 登录之后列表\r\n\r\n spinShow: false,\r\n loading: false,\r\n tabList: [],\r\n columns4: [\r\n {\r\n title: '文件/文件夹名',\r\n slot: 'filename',\r\n minWidth: 150,\r\n back: '返回上级',\r\n },\r\n {\r\n title: '文件/文件夹路径',\r\n key: 'real_path',\r\n minWidth: 150,\r\n },\r\n {\r\n title: '文件/文件夹大小',\r\n key: 'size',\r\n minWidth: 100,\r\n },\r\n {\r\n title: '是否可写',\r\n slot: 'isWritable',\r\n minWidth: 100,\r\n },\r\n {\r\n title: '更新时间',\r\n key: 'mtime',\r\n minWidth: 150,\r\n },\r\n {\r\n title: '操作',\r\n slot: 'action',\r\n minWidth: 150,\r\n },\r\n ],\r\n formItem: {\r\n //记录当前路径信息,获取文件列表时使用\r\n dir: '',\r\n superior: 0,\r\n filedir: '',\r\n fileToken: getCookies('file_token'),\r\n },\r\n dir: '', //当前完整文件路径\r\n // rows: {}, //\r\n pathname: '', // 当前文件路径\r\n title: '', //当前文件标题\r\n\r\n formFile: {\r\n //重命名表单\r\n filename: '',\r\n },\r\n ruleInline: {\r\n filename: [{ required: true, message: '请输入文件或文件夹的名字', trigger: 'blur' }],\r\n },\r\n formShow: false, //表单开关\r\n formTitle: '', //表单标题\r\n fileToken: getCookies('file_token'),\r\n };\r\n },\r\n\r\n components: {\r\n loginFrom,\r\n },\r\n mounted() {\r\n this.initEditor();\r\n },\r\n created() {\r\n this.getList();\r\n },\r\n beforeDestroy() {\r\n removeCookies('file_token');\r\n },\r\n computed: {},\r\n methods: {\r\n // 点击行\r\n currentChange(currentRow) {\r\n if (currentRow.isDir) {\r\n this.open(currentRow);\r\n } else {\r\n this.edit(currentRow);\r\n }\r\n },\r\n /**\r\n * 文件列表\r\n * @param {Object} refresh // 是否重新加载 bool\r\n * @param {Object} is_edit // 是否是编辑器中的刷新 bool\r\n */\r\n getList(refresh, is_edit) {\r\n let params;\r\n if (refresh) {\r\n params = {\r\n dir: '',\r\n superior: 0,\r\n filedir: '',\r\n fileToken: this.fileToken,\r\n };\r\n } else {\r\n params = this.formItem;\r\n params.fileToken = this.fileToken;\r\n }\r\n if (!is_edit) this.loading = true;\r\n opendirListApi(params)\r\n .then(async (res) => {\r\n let data = res.data;\r\n if (is_edit) {\r\n this.navList = data.navList;\r\n } else {\r\n this.navListForTab = data.navList;\r\n this.tabList = data.list;\r\n // this.navList = data.navList;\r\n this.isShowList = true;\r\n }\r\n this.dir = data.dir;\r\n this.isShowLogn = false;\r\n this.loading = false;\r\n })\r\n .catch((res) => {\r\n this.catchFun(res);\r\n });\r\n },\r\n //新建文件后重新加载左侧导航\r\n getListItem(data) {\r\n opendirListApi(data)\r\n .then(async (res) => {\r\n this.$set(this.contextData, 'children', res.data.navList);\r\n })\r\n .catch((res) => {\r\n this.catchFun(res);\r\n });\r\n },\r\n\r\n // 返回上级\r\n goBack(is_edit) {\r\n this.formItem = {\r\n dir: this.dir,\r\n superior: 1,\r\n filedir: '',\r\n };\r\n this.getList(false, is_edit);\r\n },\r\n // 打开\r\n open(row) {\r\n // this.rows = row;\r\n this.formItem = {\r\n dir: row.path,\r\n superior: 0,\r\n filedir: row.filename,\r\n fileToken: this.fileToken,\r\n };\r\n this.getList(false, false);\r\n },\r\n // 编辑\r\n edit(row) {\r\n this.navItem = row;\r\n this.spinShow = true;\r\n this.pathname = row.pathname;\r\n this.title = row.filename;\r\n this.editorIndex[0].title = row.filename;\r\n this.editorIndex[0].pathname = row.pathname;\r\n this.navList = this.navListForTab;\r\n this.dir = row.path;\r\n // 创建代码容器\r\n if (this.editorList.length <= 0) {\r\n this.initEditor();\r\n }\r\n this.openfile(row.pathname, false);\r\n },\r\n /**\r\n * 保存\r\n * @param {Object} index // 当前索引\r\n * @param {Object} type // true 不更新当前本地数据,false或者为空 更新当前数据\r\n */\r\n savefile(index, type) {\r\n let code = this.editorList[index].editor.getValue();\r\n let data = {\r\n comment: code,\r\n filepath: this.editorList[index].path,\r\n fileToken: this.fileToken,\r\n };\r\n let that = this;\r\n savefileApi(data)\r\n .then(async (res) => {\r\n if (!type) {\r\n that.code = code;\r\n that.isSave = true;\r\n that.editorIndex[index].icon = '';\r\n that.editorList[index].isSave = true;\r\n }\r\n that.$Message.success(res.msg);\r\n that.$Modal.remove();\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n },\r\n // 刷新\r\n refreshfile() {\r\n // 刷新编辑器\r\n if (this.editorList[this.indexEditor]) this.openfile(this.editorList[this.indexEditor].path, true);\r\n },\r\n //计算token过期时间\r\n getExpiresTime(expiresTime) {\r\n let nowTimeNum = Math.round(new Date() / 1000);\r\n let expiresTimeNum = expiresTime - nowTimeNum;\r\n return parseFloat(parseFloat(parseFloat(expiresTimeNum / 60) / 60) / 24);\r\n },\r\n // 侧边栏异步加载\r\n loadData(item, callback) {\r\n if (item.isDir) {\r\n this.formItem = {\r\n dir: item.path,\r\n superior: 0,\r\n filedir: item.title,\r\n fileToken: this.fileToken,\r\n };\r\n opendirListApi(this.formItem)\r\n .then(async (res) => {\r\n callback(res.data.navList);\r\n })\r\n .catch((res) => {\r\n if (res.status == 110008) {\r\n this.$Message.error(res.msg);\r\n this.isShowLogn = true;\r\n this.isShowList = false;\r\n this.loading = false;\r\n } else {\r\n this.catchFun(res);\r\n }\r\n });\r\n }\r\n },\r\n // 自定义显示\r\n renderContent(h, { root, node, data }) {\r\n let that = this;\r\n return h(\r\n 'span',\r\n {\r\n style: {\r\n display: 'inline-block',\r\n cursor: 'pointer',\r\n userSelect: 'null',\r\n color: '#cccccc',\r\n display: 'inline-block',\r\n width: '100%',\r\n borderRadis: '5px',\r\n },\r\n on: {\r\n click: () => {\r\n that.clickDir(data, root, node);\r\n },\r\n contextmenu: () => {\r\n // that.handleContextDelFolder(data,root,node);\r\n },\r\n },\r\n },\r\n [\r\n h('span', [\r\n h('Icon', {\r\n props: {\r\n type: data.isDir ? 'md-folder' : 'ios-document-outline',\r\n },\r\n style: {\r\n marginRight: '8px',\r\n },\r\n }),\r\n h(\r\n 'span',\r\n {\r\n attrs: {\r\n title: data.title,\r\n },\r\n },\r\n data.title,\r\n ),\r\n ]),\r\n ],\r\n );\r\n },\r\n /**\r\n * 侧边栏点击事件\r\n * @param {Object} data\r\n */\r\n clickDir(data, root, node) {\r\n let that = this;\r\n that.navItem = data;\r\n that.pathname = data.pathname;\r\n\r\n if (!data.isDir) {\r\n let i = that.editorIndex.findIndex((e) => {\r\n return e.pathname === data.pathname;\r\n });\r\n if (i > -1) {\r\n that.toggleEditor(i);\r\n that.indexEditor = i.toString();\r\n } else {\r\n let index = that.editorIndex.length;\r\n // 创建tabs\r\n that.editorIndex.push({\r\n tab: true,\r\n index: index.toString(),\r\n title: data.title,\r\n icon: '',\r\n pathname: data.pathname,\r\n });\r\n that.indexEditor = index.toString();\r\n // 创建代码容器\r\n that.initEditor();\r\n that.openfile(data.pathname, true);\r\n }\r\n }\r\n },\r\n //侧边栏右键点击事件\r\n handleContextMenu(data, event, position) {\r\n position.left = Number(position.left.slice(0, -2)) + 75 + 'px';\r\n this.contextData = data;\r\n },\r\n // 文件操作类型 createFolder|创建文件夹 createFile|创建文件 delFolder|删除文件夹或者文件 renameFile|文件重命名\r\n //创建文件夹\r\n handleContextCreateFolder() {\r\n this.formFile.filename = '';\r\n this.formTitle = '创建文件夹';\r\n this.formShow = true;\r\n this.fileType = 'createFolder';\r\n },\r\n //创建文件\r\n handleContextCreateFile() {\r\n this.formFile.filename = '';\r\n this.formTitle = '创建文件';\r\n this.formShow = true;\r\n this.fileType = 'createFile';\r\n },\r\n //删除文件\r\n handleContextDelFolder() {\r\n let that = this;\r\n that.$Modal.confirm({\r\n title: '删除文件夹和文件',\r\n content: '您确定要删除改文件?',\r\n loading: true,\r\n onOk: () => {\r\n let data = {\r\n path: that.contextData.pathname,\r\n fileToken: this.fileToken,\r\n };\r\n delFolder(data)\r\n .then(async (res) => {\r\n that.loopDel(that.navList, that.contextData.nodeKey);\r\n that.$Modal.remove();\r\n that.$Message.success('删除成功');\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n },\r\n onCancel: () => {\r\n that.$Message.info('取消删除');\r\n },\r\n });\r\n },\r\n //重命名\r\n handleContextRename() {\r\n this.formFile.filename = this.contextData.title;\r\n this.formTitle = '重命名文件';\r\n this.formShow = true;\r\n this.fileType = 'renameFile';\r\n },\r\n //打开文件\r\n openfile(path, is_edit) {\r\n let that = this;\r\n let params = {\r\n filepath: path,\r\n fileToken: this.fileToken,\r\n };\r\n openfileApi(params)\r\n .then(async (res) => {\r\n let data = res.data;\r\n that.code = data.content;\r\n // 保存相对信息\r\n that.editorList[that.indexEditor].path = path;\r\n that.editorList[that.indexEditor].oldCode = that.code;\r\n //改变属性\r\n that.changeModel(data.mode, that.code);\r\n if (!is_edit) {\r\n that.modals = true;\r\n that.spinShow = false;\r\n }\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n },\r\n /**\r\n * 初始化编辑器\r\n */\r\n initEditor() {\r\n let that = this;\r\n that.$nextTick(() => {\r\n console.log(monaco);\r\n // 初始化编辑器,确保dom已经渲染\r\n that.editor = monaco.editor.create(document.getElementById('container_' + that.indexEditor), {\r\n value: that.code, //编辑器初始显示文字\r\n language: 'sql', //语言支持自行查阅demo\r\n automaticLayout: true, //自动布局\r\n theme: 'vs', //官方自带三种主题vs, hc-black, or vs-dark\r\n foldingStrategy: 'indentation', // 代码可分小段折叠\r\n overviewRulerBorder: false, // 不要滚动条的边框\r\n scrollbar: {\r\n // 滚动条设置\r\n verticalScrollbarSize: 4, // 竖滚动条\r\n horizontalScrollbarSize: 10, // 横滚动条\r\n },\r\n autoIndent: true, // 自动布局\r\n tabSize: 4, // tab缩进长度\r\n autoClosingOvertype: 'always',\r\n });\r\n //添加按键监听\r\n that.editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KEY_S, function () {\r\n that.savefile(that.indexEditor);\r\n });\r\n that.editor.onKeyUp(() => {\r\n // 当键盘按下,判断当前编辑器文本与已保存的编辑器文本是否一致\r\n if (that.editor.getValue() != that.code) {\r\n that.isSave = false;\r\n that.editorIndex[that.indexEditor].icon = 'md-warning';\r\n that.editorList[that.indexEditor].isSave = false;\r\n }\r\n });\r\n that.editorList.push({\r\n editor: that.editor,\r\n oldCode: that.code,\r\n path: '',\r\n isSave: true,\r\n index: that.indexEditor,\r\n });\r\n });\r\n },\r\n /**\r\n * 切换语言\r\n * @param {Object} mode\r\n */\r\n changeModel(mode, value) {\r\n var oldModel = this.editorList[this.indexEditor].editor.getModel(); //获取旧模型\r\n // var value = this.editor.getValue();//获取旧的文本\r\n //创建新模型,value为旧文本,id为modeId,即语言(language.id)\r\n //modesIds即为支持语言\r\n // var modesIds = monaco.languages.getLanguages().map(function(lang) { return lang.id; });\r\n if (!mode) mode = oldModel.getLanguageId();\r\n // if(!value) value = this.editor.getValue();\r\n\r\n var newModel = monaco.editor.createModel(value, mode);\r\n //将旧模型销毁\r\n if (oldModel) {\r\n oldModel.dispose();\r\n }\r\n //设置新模型\r\n this.editorList[this.indexEditor].editor.setModel(newModel);\r\n },\r\n // 文件操作类型 createFolder|创建文件夹 createFile|创建文件 delFolder|删除文件夹或者文件\r\n handleSubmit(name) {\r\n let that = this;\r\n let data = '';\r\n let dataItem = '';\r\n this.$refs[name].validate((valid) => {\r\n if (valid) {\r\n switch (that.fileType) {\r\n case 'createFolder':\r\n data = {\r\n path: that.contextData.pathname,\r\n name: that.formFile.filename,\r\n fileToken: this.fileToken,\r\n };\r\n createFolder(data)\r\n .then(async (res) => {\r\n dataItem = {\r\n dir: that.contextData.path,\r\n superior: 0,\r\n filedir: that.contextData.title,\r\n fileToken: this.fileToken,\r\n };\r\n that.getListItem(dataItem);\r\n if (that.formShow) that.formShow = false;\r\n that.$Message.success('创建成功');\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n break;\r\n case 'createFile':\r\n data = {\r\n path: that.contextData.pathname,\r\n name: that.formFile.filename,\r\n fileToken: this.fileToken,\r\n };\r\n createFile(data)\r\n .then(async (res) => {\r\n dataItem = {\r\n dir: that.contextData.path,\r\n superior: 0,\r\n filedir: that.contextData.title,\r\n fileToken: this.fileToken,\r\n };\r\n that.getListItem(dataItem);\r\n if (that.formShow) that.formShow = false;\r\n that.$Message.success('创建成功');\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n break;\r\n case 'renameFile':\r\n data = {\r\n newname: that.contextData.path + '\\\\' + that.formFile.filename,\r\n oldname: that.contextData.pathname,\r\n fileToken: this.fileToken,\r\n };\r\n rename(data)\r\n .then(async (res) => {\r\n that.$set(that.contextData, 'title', that.formFile.filename);\r\n that.$Message.success('修改成功');\r\n if (that.formShow) that.formShow = false;\r\n })\r\n .catch((res) => {\r\n that.catchFun(res);\r\n });\r\n break;\r\n }\r\n } else {\r\n this.$Message.error('Fail!');\r\n }\r\n });\r\n },\r\n /**\r\n * 退出表单\r\n */\r\n formExit() {\r\n this.formShow = false;\r\n },\r\n\r\n /**\r\n * 处理接口回调\r\n * @param {Object} res\r\n */\r\n catchFun(res) {\r\n if (res.status) {\r\n if (res.status == 400) this.$Message.error(res.msg);\r\n if (res.status == 110008) {\r\n // this.$Message.error(res.msg);\r\n this.isShowLogn = true;\r\n this.isShowList = false;\r\n this.loading = false;\r\n }\r\n } else {\r\n // this.$Message.error('文件编码不被兼容,无法正确读取文件!');\r\n }\r\n //关闭蒙版层\r\n if (this.spinShow) this.spinShow = false;\r\n // 关闭文件列表展示\r\n if (this.loading) this.loading = false;\r\n },\r\n loopDel(data, nodeKey) {\r\n data.forEach((item, index) => {\r\n if (item.nodeKey === nodeKey) {\r\n return data.splice(index, 1);\r\n }\r\n if (item.children.length > 0) {\r\n return this.loopDel(item.children, nodeKey);\r\n }\r\n });\r\n },\r\n /**\r\n * 窗口最大化\r\n */\r\n winChanges() {\r\n if (this.className) {\r\n this.className = '';\r\n } else {\r\n this.className = 'diy-fullscreen';\r\n }\r\n },\r\n /**\r\n * 切换选项卡\r\n * @param {Object} index\r\n */\r\n toggleEditor(index) {\r\n index = Number(index);\r\n this.code = this.editorList[index].oldCode; //设置文件打开时的代码\r\n this.editor = this.editorList[index].editor; //设置编辑器实例\r\n },\r\n handleTabRemove(index) {\r\n let that = this;\r\n\r\n // 关闭选项卡\r\n that.editorIndex[index].tab = false; // 关闭选项卡\r\n // 判断当前文件有没有保存\r\n if (!that.editorList[index].isSave) {\r\n that.$Modal.confirm({\r\n title: '文件未保存',\r\n content: '您是否需要保存当前文件',\r\n loading: true,\r\n onOk: () => {\r\n // 保存文件\r\n that.savefile(index);\r\n },\r\n onCancel: () => {\r\n that.$Message.info('取消保存');\r\n },\r\n });\r\n }\r\n },\r\n //编辑器状态变化\r\n editModalChange() {\r\n let that = this;\r\n that.editorList.forEach(function (value, index) {\r\n if (value.isSave === false) {\r\n if (confirm(`${that.editorIndex[index].title}文件未保存,是否要保存该文件`)) {\r\n // 保存当前文件\r\n that.savefile(index, true);\r\n } else {\r\n that.$Message.info(`已取消${that.editorIndex[index].title}文件保存`);\r\n }\r\n }\r\n // 销毁当前编辑器\r\n that.editorList[index].editor.dispose();\r\n that.editorList[index].editor = null;\r\n });\r\n // 初始话数据\r\n that.modals = false; //编辑器开关\r\n that.editor = ''; //当前编辑器对象\r\n that.editorIndex = [\r\n //选项卡数组\r\n {\r\n tab: true,\r\n index: '0',\r\n title: '',\r\n icon: '',\r\n },\r\n ];\r\n that.editorList = []; //编辑器数组\r\n that.indexEditor = '0'; //当前编辑器索引\r\n that.code = ''; //当前文件打开时的内容\r\n that.navList = []; //左侧导航数据\r\n that.navItem = {}; //左侧导航点击是选中的数据\r\n that.contextData = null; //左侧导航右键点击是产生的数据对象\r\n },\r\n },\r\n};\r\n</script>\r\n<style scoped>\r\n.file-left /deep/ .ivu-tree-title {\r\n font-weight: 500;\r\n font-family: SourceHanSansSC-regular, '微软雅黑', Arial, Helvetica, sans-serif;\r\n}\r\n.file-content /deep/ .ivu-tabs.ivu-tabs-card > .ivu-tabs-bar .ivu-tabs-tab-active {\r\n border-bottom: 1px solid orange;\r\n}\r\n</style>\r\n<style scoped lang=\"stylus\">\r\n.file-left\r\n padding-left 10px\r\n >>>.ivu-icon-ios-arrow-forward\r\n font-size 18px !important;\r\n\t color #cccccc\r\n >>>.ivu-icon-ios-folder-outline\r\n font-size 14px !important;\r\n >>>.ivu-icon-ios-document-outline\r\n font-size 18px !important;\r\n\t>>>.ivu-icon-md-folder{\r\n \tfont-size 18px !important;\r\n\t color #d6ab34 !important;\r\n\t}\r\n >>> .ivu-table-row\r\n cursor pointer;\r\n.mr5\r\n margin-right 5px\r\n.backs\r\n cursor pointer;\r\n display inline-block;\r\n .icon\r\n margin-bottom 3px\r\n>>>.CodeMirror\r\n height: 70vh !important;\r\n\r\n.file-box\r\n\tdisplay: flex;\r\n\talign-items: flex-start;\r\n\tjustify-content: space-between;\r\n\tposition: relative;\r\n\theight: 95%;\r\n\tmin-height: 600px;\r\n\toverflow: hidden;\r\n.file-box\r\n\t.file-left\r\n\t\tposition: absolute;\r\n\t\ttop: 53px;\r\n\t\tleft: 0;\r\n\t\theight: 90%;\r\n\t\t// height: 100%;\r\n\t\t// min-height: 600px;\r\n\t\twidth:25%;\r\n\t\tmax-width: 250px;\r\n\t\toverflow: auto;\r\n\t\tbackground-color: #222222;\r\n\t\tbox-shadow: #000000 -6px 0 6px -6px inset;\r\n\t.file-fix\r\n\t\tflex: 1;\r\n\t\tmax-width: 250px;\r\n\t\theight: 76vh;\r\n\t\tmin-height: 600px;\r\n\t\t// bottom: 0px;\r\n\t\t// overflow: auto;\r\n\t\tmin-height: 600px;\r\n\t\tbackground-color: #222222;\r\n.file-box\r\n\t.file-content\r\n\t\t// position: absolute;\r\n\t\t// top: 53px;\r\n\t\t// left: 25%;\r\n\t\tflex: 3;\r\n\t\toverflow: hidden;\r\n\t\tmin-height: 600px;\r\n\t\theight: 100%;\r\n>>>.ivu-modal-body\r\n\t\tpadding: 0;\r\n>>>.ivu-modal-content\r\n\tbackground-color: #292929\r\n.diy-button\r\n\t// float: left;\r\n\theight: 35px;\r\n\tpadding: 0 15px;\r\n\tfont-size: 13px;\r\n\ttext-align: center;\r\n\tcolor: #fff;\r\n\tborder: 0;\r\n\tborder-right: 1px solid #4c4c4c;\r\n\tcursor: pointer;\r\n\tborder-radius: 0\r\n\tbackground-color: #565656\r\n\r\n.form-mask\r\n\tz-index: -1;\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\tmargin: auto;\r\n\tbackground: rgba(0,0,0,0.3);\r\n.diy-from-header\r\n\theight: 30px\r\n\tline-height: 30px;\r\n\tbackground-color: #fff;\r\n\ttext-align: left;\r\n\tpadding-left: 20px\r\n\tfont-size: 16px;\r\n\tmargin-bottom: 15px;\r\n\tspan\r\n\t\tdisplay: inline-block;\r\n\t\tfloat: right;\r\n\t\tcolor: #999;\r\n\t\ttext-align: right;\r\n\t\tfont-size: 12px;\r\n\t\twidth: 280px;\r\n\t\tword-break:keep-all;/* 不换行 */\r\n\t\twhite-space:nowrap;/* 不换行 */\r\n\t\toverflow:hidden;\r\n\t\ttext-overflow:ellipsis;\r\n.diy-from\r\n\tz-index: 9999;\r\n\twidth: 400px;\r\n\theight: 100px;\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbottom: 0;\r\n\tmargin: auto;\r\n\ttext-align: center;\r\n\tbackground-color: #2f2f2f;\r\n.show-info\r\n\tbackground-color: #383838;\r\n\tcolor: #FFF;\r\n\twidth: 25%;\r\n\tmax-width: 250px;\r\n\tposition: absolute;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tz-index: 1122;\r\n\t.diy-button\r\n\t\twidth: 50%;\r\n\t\theight: 25px;\r\n\t.diy-button-list\r\n\t\tdisplay: flex;\r\n\t\talign-items: center;\r\n\t.show-text\r\n\t\tpadding-left: 10px;\r\n\t\tword-break:keep-all;/* 不换行 */\r\n\t\twhite-space:nowrap;/* 不换行 */\r\n\t\toverflow:hidden;\r\n\t\ttext-overflow:ellipsis;\r\n\t\tpadding: 7px 5px;\r\nbody >>>.ivu-select-dropdown{\r\n\tbackground: #fff;\r\n}\r\n.diy-tree-render\r\n\t>>>li\r\n\t\toverflow: hidden;\r\n\t>>>.ivu-tree-title\r\n\t\twidth: 90%;\r\n\t\tmax-width:250px;\r\n\t\tpadding: 0;\r\n\t\tpadding-left: 5px\r\n>>>.ivu-tree-children\r\n\t\t.ivu-tree-title:hover\r\n\t\t\tbackground-color:#2f2f2f !important;\r\n.file-box\r\n\t.file-left::-webkit-scrollbar\r\n\t\twidth: 4px;\r\n.file-box\r\n\t.file-left::-webkit-scrollbar-thumb\r\n\t\tborder-radius: 10px;\r\n\t\t-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);\r\n\t\tbackground: rgba(255, 255, 255, 0.2);\r\n.file-box\r\n\t.file-left::-webkit-scrollbar-track\r\n\t\t-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);\r\n\t\tborder-radius: 0;\r\n\t\tbackground: rgba(0,0,0,0.1);\r\n.diy-header\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: space-between;\r\n\t.diy-header-icon\r\n\t\tmargin-right: 30px;\r\n\t\tcursor: pointer;\r\n\t.diy-header-icon:hover\r\n\t\topacity: 0.8;\r\n// 自定义方法缩小\r\n>>>.diy-fullscreen\r\n\t\toverflow: hidden;\r\n\t\t.ivu-modal\r\n\t\t\ttop: 0px;\r\n\t\t\tleft: 0px;\r\n\t\t\tright: 0px;\r\n\t\t\tbottom: 0px;\r\n\t\t\theight: 100%;\r\n\t\t\twidth: 100% !important;\r\n\t\t\t.ivu-modal-content\r\n\t\t\t\theight: 100%;\r\n\t\t\t\t.ivu-modal-body\r\n\t\t\t\t\theight: 100%;\r\n\t\t\t.ivu-tabs\r\n\t\t\t\t.ivu-tabs-content-animated\r\n\t\t\t\t\theight: 92%;\r\n\t\t\t\t\tbackground-color:#2f2f2f !important;\r\n\t\t\t.ivu-tabs-content\r\n\t\t\t\theight: 100%\r\n\t\t\t.ivu-tabs\r\n\t\t\t\t.ivu-tabs-tabpane\r\n\t\t\t\t\theight: 92%\r\n>>>.ivu-modal\r\n\t\ttop: 70px;\r\n\t.ivu-modal-content\r\n\t\t.ivu-modal-body\r\n\t\t\tmin-height: 632px;\r\n\t\t\theight: 80vh;\r\n\t\t\toverflow: hidden;\r\n\t.ivu-tabs\r\n\t\t.ivu-tabs-content-animated\r\n\t\t\tmin-height:560px;\r\n\t\t\theight: 73vh;\r\n\t\t\tmargin-top: -1px;\r\n\t\t.ivu-tabs-tabpane\r\n\t\t\tmin-height:560px;\r\n\t\t\theight: 73vh;\r\n\t\t\tmargin-top: -1px;\r\n\t.ivu-tabs-nav .ivu-tabs-tab .ivu-icon\r\n\t\tcolor: #f00;\r\n>>>body .ivu-select-dropdown .ivu-dropdown-transfer\r\n\t\tbackground:red !important;\r\n// 导航栏右键样式 无效\r\n\r\n\r\n.file-left /deep/ .ivu-select-dropdown.ivu-dropdown-transfer .ivu-dropdown-menu .ivu-dropdown-item:hover{\r\n\tbackground-color: #e5e5e5 !important;\r\n}\r\n// 选项卡头部\r\n>>>.ivu-tabs.ivu-tabs-card > .ivu-tabs-bar .ivu-tabs-nav-container\r\n\tbackground-color: #333;\r\n</style>\r\n"]}]}
|