{"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\\EipSunDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSunDialog.vue","mtime":1733309211938},{"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:aW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX3JlZ2VuZXJhdG9yUnVudGltZSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vcmVnZW5lcmF0b3JSdW50aW1lLmpzIjsKaW1wb3J0IF9hc3luY1RvR2VuZXJhdG9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9hc3luY1RvR2VuZXJhdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZXJyb3IuY2F1c2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5wdXNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXNuZXh0Lml0ZXJhdG9yLmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2guanMiOwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwovLwoKaW1wb3J0IHsgbWFwU3RhdGUgfSBmcm9tICJ2dWV4IjsKaW1wb3J0IHV0aWxzIGZyb20gIkAvdXRpbHMuanMiOwppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICJAL2hvdGVudC11aS11dGlsLmpzIjsKaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gImVsZW1lbnQtdWkiOwppbXBvcnQgcmVxIGZyb20gIkAvcmVxdWVzdC5qcyI7CmltcG9ydCBzdWJfcGlvX21peGluIGZyb20gIkAvc3ViLXBlcm1pc3Npb24tbWl4aW4uanMiOwppbXBvcnQgRWlwVGFnIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFRhZy52dWUiOwppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUiOwpleHBvcnQgZGVmYXVsdCB7CiAgY29tcG9uZW50czogewogICAgRWlwVGFnOiBFaXBUYWcsCiAgICBFaXBTZWxlY3REaWE6IEVpcFNlbGVjdERpYQogIH0sCiAgbmFtZTogImVpcC1kaWFsb2ciLAogIHByb3BzOiBbInZhbGlkYXRlIiwgInZhbHVlIiwgIm5hbWUiLCAicGVybWlzc2lvbiIsICJhdHRlciIsICJzaW5nbGUiLCAic2VsZWN0b3Jjb25maWciLCAiY3VzdGRpYWxvZyIsICJwbGFjZWhvbGRlciIsICJ0b29sdGlwcGxhY2VtZW50IiwgJ2luaXRGaWxsRGF0YScsICdpbml0RmlsbERhdGFUeXBlJywgJ3JlbGF0aW9uJywgJ21heFJvdyddLAogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLAogIC8v5re35YWl5pa55byP5byV5YWl6KGo5Y2V57uE5Lu25Lit5YWs5YWx5bGe5oCn77yM5aSE55CG5a2Q6KGo44CB5a2Z6KGo6KGM5YaF6IGU5Yqo77yI5YiH6Z2i5L+u5pS5cGVybWlzc2lvbl9zdWLvvIkKICBkYXRhOiBmdW5jdGlvbiBkYXRhKCkgewogICAgcmV0dXJuIHsKICAgICAgZGF0YTogewogICAgICAgIHF4ZGQ6IHt9CiAgICAgIH0sCiAgICAgIGlucHV0U3VmZml4V2lkdGg6IDAsCiAgICAgIHBsYWNlaG9sZGVyQm86ICIiLAogICAgICBxdWlja1NlYXJjaDogIiIsCiAgICAgIC8v5aGr5YaZ5o+Q56S6CiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLAogICAgICAvL+WPguaVsOafpeivouWtl+autQogICAgICBub2RlS2V5OiAiSURfIiwKICAgICAgLy/moJHlvaLmlbDmja7niLZJZAogICAgICBjdXN0b21EaWFsb2dTaG93TGlzdDogZmFsc2UsCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwKICAgICAgc2VsZWN0T3JnUHJvcHM6IHsKICAgICAgICBsYWJlbDogIm5hbWUiCiAgICAgIH0sCiAgICAgIHN0eWxlOiAiIiwKICAgICAgLy/lr7nor53moYblrr3pq5gKICAgICAgc2VsZWN0T3JnczogbnVsbCwKICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLAogICAgICBjb25maWc6IG51bGwsCiAgICAgIHVwZGF0aW5nOiBmYWxzZSwKICAgICAgZGlzcGxheWZpZWxkOiBbXSwKICAgICAgLy/mmL7npLrlrZfmrrUKICAgICAgY3VzdG9tRGlhbG9nOiB7fSwKICAgICAgcXVlcnlQYXJhbTogIiIsCiAgICAgIC8v5p+l6K+i5p2h5Lu26L6T5YWl55qE5YC8CiAgICAgIHByb3BzMTogW10sCiAgICAgIHNob3dEYXRhOiBbXSwKICAgICAgY2hlY2tCb3hEYXRhQWxsOiBbXSwKICAgICAgLy/pgInkuK3lr7nosaHnmoTpm4blkIgKICAgICAgZGVmYXVsdFByb3BzOiB7CiAgICAgICAgY2hpbGRyZW46ICJjaGlsZHJlbiIsCiAgICAgICAgbGFiZWw6ICJsYWJlbCIKICAgICAgfSwKICAgICAgcHJvcHNEYXRhOiBbXSwKICAgICAgcXVlcnlzU2hvdzogZmFsc2UsCiAgICAgIC8v5piv5ZCm5pi+56S65pCc57Si5qGGCiAgICAgIHVuZGVmaW5lZGE6ICIiLAogICAgICBpc0N1cnJlbnRDaGFuZ2U6IGZhbHNlLAogICAgICAvL+aYr+WQpuS4jeaJp+ihjCBvcmdUYWJsZVNlbGVjdGlvbuaWueazlQogICAgICBwYWdpbmF0aW9uOiB7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgdG90YWw6IDAKICAgICAgfSwKICAgICAgcGFyYW06IFtdLAogICAgICAvL+e7keWumueahOihqOWNleWtl+autQogICAgICB0cmVlTGlzdDogW10sCiAgICAgIGRpc3BsYXlGaWVsZDoge30sCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwKICAgICAgcGxhY2Vob2xkZXJzOiBbXSwKICAgICAgb2xkc2VsZWN0T3JnczogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6IFtdLAogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6IFtdLAogICAgICBjb21iaW5hdGlvblRyZWVRdWVyeXM6IFtdLAogICAgICBjb21iaW5hdGlvblJ1bGU6IHt9LAogICAgICB0b2dnbGVCdG46ICJlbC1pY29uLWFycm93LWxlZnQiLAogICAgICB0cmVlU2hvdzogdHJ1ZSwKICAgICAgdHJhbnN0aW9uV2lkdGg6ICIyNSUiLAogICAgICBsZWZ0VHJlZVRpdGxlOiAiIiwKICAgICAgd3JpdGVhYmxlOiB0cnVlLAogICAgICBpc1Nob3c6IHRydWUKICAgIH07CiAgfSwKICB3YXRjaDogewogICAgcHJvcHMxOiBmdW5jdGlvbiBwcm9wczEobmV3VmFsLCBvbGRWYWwpIHsKICAgICAgLy/moJHlvaIKICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKTsKICAgICAgICB9CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgZGF0YS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbX2ldLCB0cnVlKTsKICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKGRhdGFbX2ldLCB0aGlzXyk7CiAgICAgICAgICB9CiAgICAgICAgfSwgMjAwKTsKICAgICAgfQogICAgfQogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIGlmICh0aGlzLmluaXRGaWxsRGF0YSkgewogICAgICB0aGlzLmluaXRUZW1wbGF0ZURhdGEoKTsKICAgIH0KICAgIHZhciByZXF1ZXN0VHlwZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KCc/JylbMF0uc3BsaXQoJy8nKTsKICAgIHZhciBpc0RvbmVMaXN0ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJy8nKTsKICAgIGlmIChyZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAxXSA9PSAnZ2V0JyB8fCByZXF1ZXN0VHlwZVtyZXF1ZXN0VHlwZS5sZW5ndGggLSAyXSA9PSAnZ2V0JyB8fCBpc0RvbmVMaXN0W2lzRG9uZUxpc3QubGVuZ3RoIC0gMV0gPT0gJ2RvbmVMaXN0JykgewogICAgICB0aGlzLmlzU2hvdyA9IGZhbHNlOwogICAgfQogIH0sCiAgY29tcHV0ZWQ6IG1hcFN0YXRlKHsKICAgIHRvdGFsOiBmdW5jdGlvbiB0b3RhbChzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnRvdGFsOwogICAgfSwKICAgIGRpYWxvZ0RhdGE6IGZ1bmN0aW9uIGRpYWxvZ0RhdGEoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy5yb3dzOwogICAgfSwKICAgIGlucHV0VmFsOiBmdW5jdGlvbiBpbnB1dFZhbCgpIHsKICAgICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUgPT0gInx8W10iKSB7CiAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbXTsKICAgICAgICAvLyB0aGlzLnNob3dEYXRhID0gW107CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCIsIik7CiAgICAgICAgaWYgKHRoaXMudmFsdWUuaW5kZXhPZigifHwiKSA+IDApIHsKICAgICAgICAgIG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzBdLnNwbGl0KCIsIik7CiAgICAgICAgICAvLyB0aGlzLnNob3dEYXRhPUpTT04ucGFyc2UodGhpcy52YWx1ZS5zcGxpdCgifHwiKVsxXSk7CiAgICAgICAgfQogICAgICAgIC8vICB0aGlzLnNob3dEYXRhID10aGlzLnNlbGVjdE9yZ3M7CiAgICAgICAgdmFyIGlkQXJ5ID0gbnVsbDsKICAgICAgICB2YXIgYWNjb3VudEFyeSA9IG51bGw7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIG5hbWVBcnkuZm9yRWFjaChmdW5jdGlvbiAobSwgaSkgewogICAgICAgICAgdmFyIG4gPSB7CiAgICAgICAgICAgIHZhbHVlOiBtCiAgICAgICAgICB9OwogICAgICAgICAgcmVzdWx0LnB1c2gobik7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgfSwKICAgIGlucHV0V3JpdGVhYmxlOiBmdW5jdGlvbiBpbnB1dFdyaXRlYWJsZSgpIHsKICAgICAgcmV0dXJuIHRoaXMud3JpdGVhYmxlID8gdXRpbHMuZ2V0V3JpdGVhYmxlKHRoaXMucGVybWlzc2lvbl9zdWIpIDogdGhpcy53cml0ZWFibGU7CiAgICB9LAogICAgaW5wdXRWYWxpZGF0ZTogZnVuY3Rpb24gaW5wdXRWYWxpZGF0ZSgpIHsKICAgICAgdmFyIHZhbGlkYXRlT2JqID0gdGhpcy4kc3RvcmUuc3RhdGUuaW5kZXgudmFsaWRhdGU7CiAgICAgIHJldHVybiB1dGlscy5hZGRSZXF1aXJlZE9yTm90KHRoaXMucGVybWlzc2lvbl9zdWIsIHRoaXMudmFsaWRhdGUsIHZhbGlkYXRlT2JqLCB0aGlzKTsKICAgIH0sCiAgICBpbnB1dE5hbWU6IGZ1bmN0aW9uIGlucHV0TmFtZSgpIHsKICAgICAgdmFyIGxhYmVsZGVzYyA9ICIiOwogICAgICBpZiAodGhpcy4kc2xvdHMgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlbiAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dCkgewogICAgICAgIGxhYmVsZGVzYyA9IHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0OwogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCkgKyAiLSIgKyBsYWJlbGRlc2M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKTsKICAgICAgfQogICAgfSwKICAgIC8vIOaYr+WQpuacieWbnuWhq+iuvue9rgogICAgYmluZFNldDogZnVuY3Rpb24gYmluZFNldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0b3Jjb25maWcgPyB0aGlzLnNlbGVjdG9yY29uZmlnLmJpbmQgOiBudWxsOwogICAgfQogIH0pLAogIGNyZWF0ZWQ6IGZ1bmN0aW9uIGNyZWF0ZWQoKSB7CiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHsKICAgICAgdGhpcy5wbGFjZWhvbGRlckJvID0gIuivt+mAieaLqeWGheWuuSI7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSB0aGlzLnBsYWNlaG9sZGVyOwogICAgfQogICAgdGhpcy4kdmFsaWRhdG9yID0gdGhpcy4kcm9vdC4kdmFsaWRhdG9yOwogIH0sCiAgbWV0aG9kczogewogICAgc2VsZWN0QWxsOiBmdW5jdGlvbiBzZWxlY3RBbGwoc2VsZWN0aW9uKSB7CiAgICAgIGlmICh0aGlzLm9sZHNlbGVjdE9yZ3MgIT0gbnVsbCAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewogICAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgc2VsZWN0aW9uLmxlbmd0aDsgeCsrKSB7CiAgICAgICAgICBpZiAodGhpcy5pbmRleEFycmF5KHRoaXMub2xkc2VsZWN0T3Jncywgc2VsZWN0aW9uW3hdKSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW3hdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5vbGRzZWxlY3RPcmdzKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcChzZWxlY3Rpb24pOwogICAgICB9CiAgICB9LAogICAgY2hlY2tOb2RlOiBmdW5jdGlvbiBjaGVja05vZGUoZGF0YSwgdGhpc18sIHBub2RlKSB7CiAgICAgIGlmIChkYXRhLlBpZCkgewogICAgICAgIHZhciBub2RlID0gdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKGRhdGEuUGlkKTsKICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICAgIGlmIChub2RlLmRhdGEuUGlkKSB7CiAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuaW5kZXRlcm1pbmF0ZSA9IHRydWU7CiAgICAgICAgICB0aGlzLmNoZWNrTm9kZSh0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuZGF0YSwgdGhpc18sIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKSk7CiAgICAgICAgfQogICAgICAgIGlmICghbm9kZS5pbmRldGVybWluYXRlKSB7CiAgICAgICAgICBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChwbm9kZSAmJiAhcG5vZGUuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgIHBub2RlLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLy/lm57ovabmn6Xor6IKICAgIHNlYXJjaEVudGVyRnVuOiBmdW5jdGlvbiBzZWFyY2hFbnRlckZ1bihlKSB7CiAgICAgIHZhciBrZXlDb2RlID0gd2luZG93LmV2ZW50ID8gZS5rZXlDb2RlIDogZS53aGljaDsKICAgICAgaWYgKGtleUNvZGUgPT0gMTMpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICB9LAogICAgaGFuZGxlU2l6ZUNoYW5nZTogZnVuY3Rpb24gaGFuZGxlU2l6ZUNoYW5nZShzaXplKSB7CiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZTsKICAgICAgdGhpcy5zZWFyY2goKTsKICAgIH0sCiAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiBoYW5kbGVDdXJyZW50Q2hhbmdlKGN1cnJlbnRQYWdlKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwKSB7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uY2hlY2tCb3hEYXRhQWxsLCByb3cpOwogICAgICAgICAgaWYgKHJlcyA9PSAtMSkgewogICAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgLy/ngrnlh7vnrKzlh6DpobUKICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZTsKICAgICAgdGhpcy5zZWFyY2goKTsKICAgIH0sCiAgICBjaGVja0xpc3Q6IGZ1bmN0aW9uIGNoZWNrTGlzdCgpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgLy/liJfooagKICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsICE9IHVuZGVmaW5lZCAmJiB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgICB2YXIgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5kaWFsb2dEYXRhLCByb3cpOwogICAgICAgICAgICB0aGlzXy51bmRlZmluZWRhID0gcmVzOwogICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7CiAgICAgICAgICAgICAgdGhpc18uaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICAgICAgICB0aGlzXy50b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCAzMDApOwogICAgfSwKICAgIHRvZ2dsZVJvd1NlbGVjdGlvbjogZnVuY3Rpb24gdG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdmFsKSB7CiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHRoaXMuZGlhbG9nRGF0YVtyZXNdLCB2YWwpOwogICAgfSwKICAgIHNob3dEaWFsb2c6IGZ1bmN0aW9uIHNob3dEaWFsb2coaXRlbSkgewogICAgICB2YXIgX3RoaXMyID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgLy/nrKzkuozmrKHngrnlh7vlrZDooajlm57loavlr7nor53moYYg56ys5LiA5qyh6YCJ5Lit55qE5pWw5o2u5LiN5piv6YCJ5Lit54q25oCBCiAgICAgIGlmICh0aGlzXy5zZWxlY3RPcmdzKSB7CiAgICAgICAgdGhpc18uc2VsZWN0T3Jncy5lbXB0eSgpOwogICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5lbXB0eSgpOwogICAgICB9CiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzOwogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9nZXRCeUFsaWFzIiwgYWxpYXMpLnRoZW4oZnVuY3Rpb24gKGN1c3RvbURpYWxvZykgewogICAgICAgIGlmICghY3VzdG9tRGlhbG9nIHx8ICFjdXN0b21EaWFsb2cuYWxpYXMpIHsKICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoIuWvueivneahhuWIq+WQjeOAkCIgKyBhbGlhcyArICLjgJHkuI3lrZjlnKjvvIEiKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7CiAgICAgICAgICB2YXIgZGlzcGxheWxpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgdGhpc18ubm9kZUtleSA9IGRpc3BsYXlsaXN0LmlkOwogICAgICAgIH0KICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQogICAgICAgIHZhciBiaW5kTGlzdCA9IHRoaXNfLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jb25kaXRpb25zOwogICAgICAgIHRoaXNfLnBhcmFtID0gW107IC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgICAgaWYgKGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIGJpbmRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICIzIiAmJiBlbGUuYmluZCkgewogICAgICAgICAgICAgIHZhciBvYmogPSB7fTsKICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQ7CiAgICAgICAgICAgICAgb2JqLmJpbmQgPSBlbGUuYmluZDsKICAgICAgICAgICAgICB0aGlzXy5wYXJhbS5wdXNoKG9iaik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvL+WIpOaWreWvueivneahhuafpeivouaYr+WQpuacieadoeS7tgogICAgICAgIHZhciB1c2VySW5wdXRMaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gIiI7IC8v5aGr5YaZ5o+Q56S6IHBsYWNlaG9sZGVyCiAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZCA9IFtdOwogICAgICAgIHZhciBxdWVyeVBhcmFtcyA9IFtdOwogICAgICAgIHZhciBwbGFjZWhvbGRlcnMgPSBbXTsKICAgICAgICBpZiAodXNlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICB1c2VySW5wdXRMaXN0LmZvckVhY2goZnVuY3Rpb24gKGVsZSkgewogICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICIxIikgewogICAgICAgICAgICAgIG9ialtlbGUuZmllbGRdID0gIiI7CiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChvYmopOwogICAgICAgICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQucHVzaChlbGUpOwogICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5wdXNoKCLor7fovpPlhaUiICsgZWxlLmNvbW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIF90aGlzMi4kc2V0KF90aGlzMiwgInF1ZXJ5UGFyYW1zIiwgcXVlcnlQYXJhbXMpOwogICAgICAgICAgX3RoaXMyLiRzZXQoX3RoaXMyLCAicGxhY2Vob2xkZXJzIiwgcGxhY2Vob2xkZXJzKTsKICAgICAgICB9CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmL7npLrmnaHku7bmn6Xor6LovpPlhaXmoYYKICAgICAgICBpZiAodGhpc18ucXVpY2tTZWFyY2ggIT0gIiIpIHsKICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gIuivt+i+k+WFpSIgKyBfdGhpczIucXVpY2tTZWFyY2ggKyAi5p+l6K+iIjsKICAgICAgICB0aGlzXy5zdHlsZSA9ICJoZWlnaHQ6IiArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAicHgiOwogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsKICAgICAgICAgIF90aGlzMi5zdHlsZSA9ICJoZWlnaHQ6NDQwcHgiOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsKICAgICAgICAgIC8v5YiX6KGoCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgLy/moJHlvaIKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1RyZWVTaG93KHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICAvL+WIpOaWreaVsOaNruaYr+WQpuWMheWQq+afkOS4quWvueixoe+8jOW5tui/lOWbnuaVsOaNruWMheWQq+WvueixoeeahOS4i+aghwogICAgaW5kZXhBcnJheTogZnVuY3Rpb24gaW5kZXhBcnJheShhcnJheSwgaXRlbSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChKU09OLnN0cmluZ2lmeShhcnJheVtpXSkgPT0gSlNPTi5zdHJpbmdpZnkoaXRlbSkpIHsKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9LAogICAgLy/ngrnlh7vliJfooajmn5DkuIDkuKrlpI3pgInmoYbml7bop6blj5EKICAgIG9uVGFibGVTZWxlY3Q6IGZ1bmN0aW9uIG9uVGFibGVTZWxlY3Qocm93cywgcm93KSB7CiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7CiAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQogICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTE7CiAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgIH0KICAgIH0sCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOadoeaVsOaNruaXtuinpuWPkQogICAgb3JnUm93Q2xpY2s6IGZ1bmN0aW9uIG9yZ1Jvd0NsaWNrKHJvdywgY29sdW1uLCBldmVudCkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0LmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdKS50cmlnZ2VyKCJjbGljayIpOwogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHJvdyk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEpIHsKICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQogICAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0T3JncyAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJiB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gdHJ1ZTsKICAgICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpOwogICAgICB9CiAgICB9LAogICAgLy/liJfooajlpI3pgInmoYbmnInmlLnlj5jml7bop6blj5EKICAgIG9yZ1RhYmxlU2VsZWN0aW9uOiBmdW5jdGlvbiBvcmdUYWJsZVNlbGVjdGlvbihzZWxlY3Rpb24pIHsKICAgICAgLy/lhajpgInnmoTmg4XlhrXnibnmrorlpITnkIYo5Li65LqG5LiO5Y6f5pys5Yqf6IO96YC76L6R5LiN5Yay56qBLOWFiOWkjeWItuS4gOS7veaXp+eahOmAieS4reaVsOaNri7nhLblkI7mi7/liLDlhajpgInkuovku7bkuK3ljrvorqHnrpcpCiAgICAgIHRoaXMub2xkc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMuc2VsZWN0T3Jncyk7CiAgICAgIC8v5aSa6YCJCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSAmJiAhdGhpcy5pc0N1cnJlbnRDaGFuZ2UpIHsKICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7CiAgICAgICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA9PSAxICYmICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gc2VsZWN0aW9uOwogICAgICAgICAgfSBlbHNlIGlmICgoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApICYmIHNlbGVjdGlvbi5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZvciAodmFyIHUgPSB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoIC0gMTsgdSA+PSAwOyB1LS0pIHsKICAgICAgICAgICAgICAgIHZhciByZXMgPSB0aGlzLmluZGV4QXJyYXkoc2VsZWN0aW9uLCB0aGlzLnNlbGVjdE9yZ3NbdV0pOwogICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgewogICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIF9pMiA9IDA7IF9pMiA8IHNlbGVjdGlvbi5sZW5ndGg7IF9pMisrKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW19pMl0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBfaTMgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgX2kzID49IDA7IF9pMy0tKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW19pM10pOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgZGlhbG9nQ29uZmlybTogZnVuY3Rpb24gZGlhbG9nQ29uZmlybSgpIHsKICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcigi6K+36YCJ5oup5pWw5o2u5Zue5aGrIik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMucXVlcnlQYXJhbSA9ICIiOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7CiAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpOwogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7CiAgICB9LAogICAgLy/ph43nva4KICAgIHJlc2V0OiBmdW5jdGlvbiByZXNldCgpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CiAgICAgIHRoaXMucXVlcnlQYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW1PYmopIHsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1PYmopIHsKICAgICAgICAgIF90aGlzMy5xdWVyeVBhcmFtc1trZXldID0gIiI7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgLy/nu4TlkIjmoJHph43nva4KICAgICAgaWYgKHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlKSB7CiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUuc3RvcmUubm9kZXNNYXA7CiAgICAgICAgZm9yICh2YXIga2V5IGluIG5vZGVzKSB7CiAgICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnNwbGljZSgwKTsKICAgICAgdGhpcy5zZWFyY2godHJ1ZSk7CiAgICB9LAogICAgLy/mn6Xor6IKICAgIHNlYXJjaDogZnVuY3Rpb24gc2VhcmNoKHJlc2V0UGFnaW50aW9uKSB7CiAgICAgIHZhciBfdGhpczQgPSB0aGlzOwogICAgICB2YXIgcXVlcnlzID0gW107IC8v5p+l6K+i5p2h5Lu2CiAgICAgIHZhciBxdWVyeUZpbHRlciA9IHt9OwogICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5wYWdpbmF0aW9uKSA9PSAie30iKSB7CiAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0gewogICAgICAgICAgcGFnZTogMSwKICAgICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICAgIHNob3dUb3RhbDogInRydWUiCiAgICAgICAgfTsKICAgICAgfQogICAgICB2YXIgcGFnZUJlYW4gPSB7CiAgICAgICAgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbgogICAgICB9OwogICAgICBpZiAocmVzZXRQYWdpbnRpb24pIHsKICAgICAgICBwYWdlQmVhbi5wYWdlQmVhbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICJ0cnVlIgogICAgICAgIH07CiAgICAgIH0KICAgICAgLy/nlKjmiLfovpPlhaXnmoQKICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMubGVuZ3RoICE9IDAgJiYgdGhpcy5xdWVyeVBhcmFtc1swXSAhPSAiIikgewogICAgICAgIHRoaXMuY29uZGl0aW9uQmluZC5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtLCBpbmRleCkgewogICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwKICAgICAgICAgICAgdmFsdWU6IF90aGlzNC5xdWVyeVBhcmFtc1tpdGVtLmZpZWxkXSwKICAgICAgICAgICAgZ3JvdXA6ICJtYWluIiwKICAgICAgICAgICAgb3BlcmF0aW9uOiAiTElLRSIsCiAgICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLy/lj4LmlbDkvKDlhaXnmoTmn6Xor6Lmi7zmjqUKICAgICAgaWYgKHRoaXMucGFyYW0pIHsKICAgICAgICB2YXIgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh7CiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLAogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksCiAgICAgICAgICAgIGdyb3VwOiAibWFpbiIsCiAgICAgICAgICAgIG9wZXJhdGlvbjogIkxJS0UiLAogICAgICAgICAgICByZWxhdGlvbjogIkFORCIKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5p2l6Ieq57uE5ZCI5a+56K+d5qGG55qECiAgICAgIGlmICh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cyAmJiB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5sZW5ndGggIT0gMCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHF1ZXJ5cy5sZW5ndGggPiAwKSB7CiAgICAgICAgcXVlcnlGaWx0ZXIgPSB7CiAgICAgICAgICBwYWdlQmVhbjogcGFnZUJlYW4ucGFnZUJlYW4sCiAgICAgICAgICBxdWVyeXM6IHF1ZXJ5cwogICAgICAgIH07CiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBxdWVyeUZpbHRlcjsKICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldGxpc3RKc29uIiwgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgX3RoaXM0LmNoZWNrTGlzdCgpOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcGFnZUJlYW47CiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9nZXRsaXN0SnNvbiIsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNC5jaGVja0xpc3QoKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfSwKICAgIGRvUXVlcnk6IGZ1bmN0aW9uIGRvUXVlcnkocGFyYW0pIHsKICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcigvKiNfX1BVUkVfXyovX3JlZ2VuZXJhdG9yUnVudGltZSgpLm1hcmsoZnVuY3Rpb24gX2NhbGxlZSgpIHsKICAgICAgICB2YXIgcGFyYW1Mb2FkRGF0YSwgcEluc3QsIGksIGJpbmRWYWwsIG9iaiwgcXVlcnlVcmwsIHJlcXVlc3RNZXRob2Q7CiAgICAgICAgcmV0dXJuIF9yZWdlbmVyYXRvclJ1bnRpbWUoKS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgc3dpdGNoIChfY29udGV4dC5wcmV2ID0gX2NvbnRleHQubmV4dCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YSA9IFtdOwogICAgICAgICAgICAgIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKF90aGlzNSk7IC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgIGJpbmRWYWwgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGRQYXRoLCBudWxsKTsKICAgICAgICAgICAgICAgICAgb2JqID0gewogICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGJpbmRWYWwKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgcGFyYW1Mb2FkRGF0YS5wdXNoKG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0iICsgcGFyYW0uYWxpYXMgKyAiJnBhZ2U9MSIgOiBwYXJhbS51cmw7CiAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZCA9ICJQT1NUIjsgLy/lpoLmnpzlhbPogZTmlbDmja7liJfooajmn6Xor6LmlbDmja7kuI3mmK/mlbDmja7mupDliJnor7fmsYLmlrnms5XkuLpyZXN0ZnVs6YWN572u55qE6K+35rGC5pa55byPCiAgICAgICAgICAgICAgaWYgKHBhcmFtLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy/mn6Xor6LmlbDmja4KICAgICAgICAgICAgICByZXEucmVxdWVzdCh7CiAgICAgICAgICAgICAgICB1cmw6IHF1ZXJ5VXJsLAogICAgICAgICAgICAgICAgbWV0aG9kOiByZXF1ZXN0TWV0aG9kLAogICAgICAgICAgICAgICAgZGF0YTogcGFyYW1Mb2FkRGF0YQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlcykgewogICAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmnInlhbPogZTmn6Xor6LmlbDmja7ov5Tlm54KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbAKICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaW8gPSAwOyBpbyA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW8rKykgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gIiI7CiAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbCArIHJlcy5kYXRhLnJvd3Nbal1bcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkXSArICIsIjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoIi4iKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOayoeaVsOaNrueahOaDheWGtQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCJzdWJfIiwgIiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5b6X5Yiw5a2Q6KGo55qE5omA5pyJ5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN1YkluaXREYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXS5pbml0RGF0YVtzdWJUYWJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+aKiuaVsOe7hOmHjOmdoueahOWAvOS4uiBudWxsIOi9rOaNouS4uuepuuWtl+espuS4sgogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgvbnVsbC9nLCAnIiInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIF9zdWJEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5pbmRleE9mKCJzdWJfIikgPT0gMCAmJiBfc3ViRGF0YVtrZXldLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YkRhdGFba2V5XSA9IFtdOyAvL+acieWImea4heepugogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfc3ViRGF0YVtrZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSAiIjsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dLnB1c2goX3N1YkRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmnInmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8v5rKh5pyJ6L+U5Zue55qE5YC85YiZ5riF56m6CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGggIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAgIHZhciBfcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCIuIik7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoX3BhdGhBcnIubGVuZ3RoID09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy/kuLvooagKICAgICAgICAgICAgICAgICAgICAgICAgLy/otYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAiIiwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfc3ViRGF0YTIgPSBwSW5zdC5kYXRhW19wYXRoQXJyWzFdXVtfcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMDsgX3AgPCBfc3ViRGF0YTIubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUKICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICIiLCBfcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlICJlbmQiOgogICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZSk7CiAgICAgIH0pKSgpOwogICAgfSwKICAgIC8vIOWQjOatpemAieaLqee7k+aenAogICAgc3luY0lucHV0VmFsdWU6IGZ1bmN0aW9uIHN5bmNJbnB1dFZhbHVlKCkgewogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIC8v5ou/5Yiw6L+U5Zue55qE5a2X5q61CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIHZhciBpZHMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5jb21tZW50LnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCB8fCB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoIDwgMSkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICB9IGVsc2UgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXNfLmluZGV4QXJyYXkpLmluZGV4T2YoSlNPTi5zdHJpbmdpZnkocm93KSkgPT0gLTEpIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdyk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3M7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzWzBdW2ZpZWxkW2ldXSk7CiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIGVuY29kZVN0ciArICciLCc7CiAgICAgICAgfQogICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICB9CiAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSk7CiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJldHVybkRhdGEgPSBzdHI7CiAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgIHZhciBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgcmV0dXJuU2l6ZSA9IHJldHVybkRhdGEubGVuZ3RoOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgIGlmIChyZXR1cm5TaXplID4gMSkgewogICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5LiA5a+55LiA5a2Z6KGo5Y+q6IO96YCJ5oup5LiA5p2h5pWw5o2uIik7CiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsKICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9OwogICAgICAgICAgX3RoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOwogICAgICAgICAgICAgIHZhciBmcm9tID0gIiI7CiAgICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb207CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgLy/lrZDooajnmoTkuIvmoIcKICAgICAgICAgICAgdmFyIHN1YkluZGV4ID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KF90aGlzLiRlbCwgImRhdGEtaW5kZXgiKTsKICAgICAgICAgICAgLy/liKTmlq3lrZnooajmmK/lkKbnrYnkuo7nqboKICAgICAgICAgICAgaWYgKCFmb3JtSW5zdFsiZGF0YSJdW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSkgewogICAgICAgICAgICAgIC8v5aaC5p6c562J5LqO56m65YiZ6K6p5a6D562J5LqO56m65pWw57uECiAgICAgICAgICAgICAgZm9ybUluc3RbImRhdGEiXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dW3N1YkluZGV4XVt0YXJnZXRBcnJheVsyXV0gPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3ViQm8gPSBmb3JtSW5zdFsiZGF0YSJdW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXTsKICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblpKfkuo7lrZnooajmlbDmja7mnIDlpKfooYzmlbAKICAgICAgICAgICAgaWYgKHRoaXNfLm1heFJvdyAhPSAwICYmIHN1YkJvLmxlbmd0aCArIHJldHVyblNpemUgPiB0aGlzXy5tYXhSb3cpIHsKICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5a2Z6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQIiArIHRoaXNfLm1heFJvdyArICLjgJEiKTsKICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFbmRJdGVyYXRpdmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqAogICAgICAgICAgICBpZiAoX3RoaXMucmVsYXRpb24gJiYgX3RoaXMucmVsYXRpb24gPT0gIm9uZXRvb25lIikgewogICAgICAgICAgICAgIHN1YkJvLmVtcHR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViQm8ucHVzaChzdWJMaW5lRGF0YSk7CiAgICAgICAgICAgIHJldHVyblNpemUtLTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gIkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7CiAgICAgIH0KICAgICAgOwogICAgfSwKICAgIC8v5Y+W5raI5oyJ6ZKuCiAgICBkaWFsb2dDYW5jZWw6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbCgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXNfLnF1ZXJ5UGFyYW0gPSAiIjsKICAgICAgdGhpc18uJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICAgIC8v5Yik5pat5piv5ZCm5piv54K55Ye75LqG56Gu6K6k5YaN54K55Ye75Y+W5raI55qEICBpbnB1dFZhbOayoeacieWAvOWImeihqOekuuebtOaOpeeCueWHu+eahOWPlua2iAogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsKICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IF90b0NvbnN1bWFibGVBcnJheSh0aGlzXy5zaG93RGF0YSk7CiAgICAgICAgICBfdGhpczYuY2hlY2tCb3hEYXRhQWxsID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNlbGVjdE9yZ3MpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgZGlhbG9nVHJlZUNvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ1RyZWVDb25maXJtKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgaWYgKHRoaXNfLnByb3BzRGF0YS5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQ7CiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsKICAgICAgICB2YXIgbm9kZXMgPSB0aGlzLnByb3BzRGF0YVswXTsKICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfSc7CiAgICAgICAgfQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqAogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuS4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNriIpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIHZhciBwYXRoQXJyYXkgPSBudWxsOwogICAgICAgICAgX3RoaXM3LmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGZ1bmN0aW9uIChjb24pIHsKICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgiLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdICYmICFwYXRoQXJyYXkpIHsKICAgICAgICAgICAgICBwYXRoQXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsKICAgICAgICAgICAgaWYgKHRoaXNfLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7CiAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSByb3dbZnJvbV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHBhdGhBcnJheSkgewogICAgICAgICAgICAvL+WtkOihqOeahOS4i+aghwogICAgICAgICAgICB2YXIgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCAiZGF0YS1pbmRleCIpOwogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepugogICAgICAgICAgICBpZiAoIWZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dKSB7CiAgICAgICAgICAgICAgLy/lpoLmnpznrYnkuo7nqbrliJnorqnlroPnrYnkuo7nqbrmlbDnu4QKICAgICAgICAgICAgICBmb3JtSW5zdFsiZGF0YSJdW3BhdGhBcnJheVswXV1bcGF0aEFycmF5WzFdXVtzdWJJbmRleF1bcGF0aEFycmF5WzJdXSA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtmeihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLlrZnooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAiICsgdGhpc18ubWF4Um93ICsgIuOAkSIpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoCiAgICAgICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAib25ldG9vbmUiKSB7CiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gIkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7CiAgICAgIH0KICAgICAgOwogICAgfSwKICAgIGRpYWxvZ0NhbmNlbFRyZWU6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbFRyZWUoKSB7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgfSwKICAgIGdldENoZWNrZWQ6IGZ1bmN0aW9uIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWROb2RlcygpOwogICAgICB9CiAgICB9LAogICAgdHJlZUNsaWNrOiBmdW5jdGlvbiB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9CiAgICB9LAogICAgY2xlYXJBbGxTZWxlY3RPcmdzOiBmdW5jdGlvbiBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7CiAgICAgIHRoaXMuc2VsZWN0T3JncyA9IG51bGw7CiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0sCiAgICByZW1vdmVTZWxlY3RPcmc6IGZ1bmN0aW9uIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy4kZW1pdCgiaW5wdXQiLCAiIik7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOwogICAgICAgIC8v5qCR5b2iCiAgICAgICAgaWYgKHRoaXMucHJvcHNEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsKICAgICAgICAgICAgX3RoaXM4LmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIF90aGlzOC50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSk7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB0aGlzLmlucHV0VmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgIiwiOwogICAgICAgIH0pOwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9ICIiKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgInx8IiArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsIHZhbHVlKTsKICAgICAgfQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7CiAgICB9LAogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodDogZnVuY3Rpb24gY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsKICAgICAgdmFyIF90aGlzOSA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghX3RoaXM5LiRyZWZzLnRhZ1NwYW5zKSByZXR1cm47CiAgICAgICAgaWYgKF90aGlzOS4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsKICAgICAgICAgIF90aGlzOS5pbnB1dFN1ZmZpeEhlaWdodCA9IF90aGlzOS4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfdGhpczkuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMDsKICAgICAgICB9CiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BCiAgICAgICAgX3RoaXM5LiR2YWxpZGF0b3IudmFsaWRhdGUoKTsKICAgICAgfSwgMCk7CiAgICB9LAogICAgY3VzdG9tRGlhbG9nU2hvdzogZnVuY3Rpb24gY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nID0gcGFnZVBhcmFtLmN1c3RvbURpYWxvZzsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cucXVlcnlVcmwgPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9IiArIHRoaXMuY3VzdG9tRGlhbG9nLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAiIikgOiB0aGlzLmN1c3RvbURpYWxvZy51cmw7CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoIDwgMSkgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICJ0cnVlIgogICAgICAgIH07CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY3VzdG9tRGlhbG9nVHJlZVNob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1RyZWVTaG93KHBhZ2VQYXJhbSkgewogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZzsKICAgICAgdmFyIG1hcFBhcmFtID0gIiI7CiAgICAgIGlmIChwYWdlUGFyYW0ucGFyYW0gIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgbWFwUGFyYW0gPSBKU09OLnN0cmluZ2lmeShwYWdlUGFyYW0ucGFyYW0pOwogICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOwogICAgICB9CiAgICAgIHZhciByZXF1ZXN0VHlwZSA9IGN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiID8gIkdFVCIgOiBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgPyBjdXN0b21EaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgIHZhciB1cmwgPSAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsgcGFnZVBhcmFtLmFsaWFzICsgIiZtYXBQYXJhbT0iICsgbWFwUGFyYW07CiAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgdXJsID0gY3VzdG9tRGlhbG9nLnVybDsKICAgICAgICB2YXIgdGVtcGxhdGVQYSA9IGN1c3RvbURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBsakNoYXIgPSB1cmwuaW5kZXhPZigiPyIpID09IC0xID8gIj8iIDogIiYiOwogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXF1ZXN0UGFyYW1zID0ge307CiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqID0gcGFyYW1zT2JqOwogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyk7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgfSwKICAgIC8v5qCR5b2i5p+l6K+iCiAgICBzZWFyY2hUcmVlOiBmdW5jdGlvbiBzZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpIHsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5ID0gcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9PSAiUE9TVCIgPyByZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCwgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmopIDogcmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7CiAgICAgIHF1ZXJ5LnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgLy/mmL7npLrlrZfmrrXphY3nva4KICAgICAgICB2YXIgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQ7CiAgICAgICAgLy/miorlr7nor53moYbphY3nva7nmoTmmL7npLrlrZfmrrXmmL7npLrlkI3np7DotYvlgLznu5nmoJHlvaLnmoTmmL7npLrlgLwKICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwb25zZS5kYXRhOwogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvCiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YShyZXNwb25zZS5kYXRhLCBkaXNwbGF5ZmllbGQuaWQsIGRpc3BsYXlmaWVsZC5waWQsIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwgZGlzcGxheWZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlmaWVsZC5wdmFsdWUgOiAwKTsKICAgICAgfSk7CiAgICB9LAogICAgLy/liqDovb3moJHnmoTkv6Hmga8KICAgIHRvVHJlZURhdGE6IGZ1bmN0aW9uIHRvVHJlZURhdGEoZGF0YSwgaWQsIHBpZCwgbmFtZSwgcHZhbHVlKSB7CiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsKICAgIH0sCiAgICB0cmFuc2xhdGVEYXRhVG9UcmVlOiBmdW5jdGlvbiB0cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQogICAgICB2YXIgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWU7CiAgICAgIH0pOwogICAgICBpZiAoIXBhcmVudHMpIHsKICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWVbcGlkXSAhPT0gInVuZGVmaW5lZCIgJiYgdmFsdWVbcGlkXSAhPSBudWxsICYmIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBwYXJlbnRzOwogICAgfSwKICAgIGxvYWRUcmVlOiBmdW5jdGlvbiBsb2FkVHJlZShub2RlLCByZXNvbHZlKSB7CiAgICAgIHZhciBfdGhpczEwID0gdGhpczsKICAgICAgaWYgKG5vZGUpIHsKICAgICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSB0aGlzXy5jdXN0b21EaWFsb2cuc3R5bGUgPT0gMiA/IHRoaXNfLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA6IHRoaXNfLmRpc3BsYXlGaWVsZDsKICAgICAgICByZXNvbHZlKHRoaXMudHJlZUxpc3QuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW2Rpc3BsYXlGaWVsZC5waWRdID09PSBub2RlLmRhdGFbZGlzcGxheUZpZWxkLmlkXTsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMxMC5zaG93RGF0YS5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgaWYgKHYuUGlkID09IG5vZGUua2V5KSB7CiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0sIDQwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgYWZ0ZXJPcGVuOiBmdW5jdGlvbiBhZnRlck9wZW4oKSB7CiAgICAgIC8v5omT5byA5a+56K+d5qGG5LmL5ZCO5Yqg6L295qCRCiAgICAgIHRoaXMubG9hZENvbWJpbmF0aW9uVHJlZSgpOwogICAgfSwKICAgIGxvYWRDb21iaW5hdGlvblRyZWU6IGZ1bmN0aW9uIGxvYWRDb21iaW5hdGlvblRyZWUoKSB7CiAgICAgIHZhciBfdGhpczExID0gdGhpczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsKICAgICAgdGhpcy5jb21iaW5hdGlvblJ1bGUgPSBjb21iaW5hdGlvblJ1bGU7CiAgICAgIHZhciB0cmVlQWxpYXMgPSBjb21iaW5hdGlvblJ1bGUubGVmdFRyZWU7CiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uCiAgICAgIHJlcS5nZXQoIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0iICsgdHJlZUFsaWFzKS50aGVuKGZ1bmN0aW9uIChyZXNwKSB7CiAgICAgICAgdmFyIHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7CiAgICAgICAgX3RoaXMxMS5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOwogICAgICAgIHZhciByZXFQYXJhbSA9IHt9OwogICAgICAgIHZhciByZXF1ZXN0VHlwZSA9IHRyZWVEaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICJHRVQiIDogdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA/IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgOiAiUE9TVCI7CiAgICAgICAgdmFyIHVybCA9ICIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPSIgKyB0cmVlQWxpYXMgKyAiJm1hcFBhcmFtPSI7CiAgICAgICAgdmFyIHBhcmFtc09iaiA9IHt9OwogICAgICAgIGlmICh0cmVlRGlhbG9nLmRzVHlwZSAhPSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgIHVybCA9IHRyZWVEaWFsb2cudXJsOwogICAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSB0cmVlRGlhbG9nLmRhdGFQYXJhbTsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7CiAgICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07CiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RUeXBlID09ICJQT1NUIikgewogICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCJcXHsiICsgY29uLmZpZWxkICsgIlxcfSIsICJnIiksIGNvbi5kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsKICAgICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsKICAgICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgICBfdGhpczExLiRzdG9yZS5kaXNwYXRjaCgiZGlhbG9nL2dldFRyZWVEYXRhIiwgcmVxdWVzdFBhcmFtcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgICAgaWYgKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkICYmIHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOwogICAgICAgICAgICB2YXIgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOwogICAgICAgICAgICBfdGhpczExLmRlZmF1bHRQcm9wcy5sYWJlbCA9IGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgX3RoaXMxMS50cmVlTGlzdCA9IHJlc3A7CiAgICAgICAgICAgIF90aGlzMTEuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOwogICAgICAgICAgICBfdGhpczExLmNvbWJpbmF0aW9uVHJlZURhdGEgPSBfdGhpczExLnRvVHJlZURhdGEocmVzcCwgZGlzcGxheUZpZWxkLmlkLCBkaXNwbGF5RmllbGQucGlkLCBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlGaWVsZC5wdmFsdWUgPyBkaXNwbGF5RmllbGQucHZhbHVlIDogIjAiLCByZXN1bHRmaWVsZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfSwKICAgIGNvbWJpVHJlZUNsaWNrOiBmdW5jdGlvbiBjb21iaVRyZWVDbGljayhwYXJhbU9iaiwgbm9kZSwgbm9kZUNvbXBvbmVudCkgewogICAgICAvL+e7hOWQiOWvueivneahhueCueWHu+W3puagkQogICAgICAvL+a4heepuuaXp+eahAogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdmFsdWUgPSBwYXJhbU9ialtydWxlc1tpXS50cmVlRmllbGRdOwogICAgICAgIHZhciBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsKICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsKICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSwKICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgIGdyb3VwOiAidHJlZUdyb3VwIiwKICAgICAgICAgIG9wZXJhdGlvbjogdGhpcy5nZXRPcGVyYXRpb24ocnVsZXNbaV0uY29uZGl0aW9uKSwKICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIgogICAgICAgIH0pOwogICAgICB9CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgLy/ojrflj5bov5DnrpfnrKblj7cKICAgIGdldE9wZXJhdGlvbjogZnVuY3Rpb24gZ2V0T3BlcmF0aW9uKG9sZCkgewogICAgICBpZiAoIW9sZCkgewogICAgICAgIHJldHVybiAiIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJFUSIpIHsKICAgICAgICByZXR1cm4gIkVRVUFMIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIkxGSyIpIHsKICAgICAgICByZXR1cm4gIkxJS0UiOwogICAgICB9CiAgICAgIGlmIChvbGQgPT0gIklOIikgewogICAgICAgIHJldHVybiAiSU4iOwogICAgICB9CiAgICB9LAogICAgdG9nZ2xlVHJlZTogZnVuY3Rpb24gdG9nZ2xlVHJlZSgpIHsKICAgICAgaWYgKHRoaXMudHJlZVNob3cpIHsKICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIwJSI7CiAgICAgICAgdGhpcy50b2dnbGVCdG4gPSAiZWwtaWNvbi1hcnJvdy1yaWdodCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IHRydWU7CiAgICAgICAgdGhpcy50cmFuc3Rpb25XaWR0aCA9ICIyNSUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctbGVmdCI7CiAgICAgIH0KICAgIH0KICB9Cn07"},null]}