{"remainingRequest":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/thread-loader/dist/cjs.js!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/babel-loader/lib/index.js!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js??ref--0-0!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js??vue-loader-options!/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/voip/conference/Conference.vue?vue&type=script&lang=js&","dependencies":[{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/src/ui/voip/conference/Conference.vue","mtime":1703127644290},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js","mtime":1702017034107},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/thread-loader/dist/cjs.js","mtime":1702017030024},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/babel-loader/lib/index.js","mtime":1702017034360},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/cache-loader/dist/cjs.js","mtime":1702017034107},{"path":"/data/jenkins/workspace/badp-bcxin-web-5.x-vuechat/node_modules/vue-loader/lib/index.js","mtime":1702017029242}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:aW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmlsdGVyIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuZmluZCI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbmQtaW5kZXgiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mb3ItZWFjaCI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnNsaWNlIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuc3BsaWNlIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuZnVuY3Rpb24ubmFtZSI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5leGVjIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLmZvci1lYWNoIjsKaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICIvZGF0YS9qZW5raW5zL3dvcmtzcGFjZS9iYWRwLWJjeGluLXdlYi01LngtdnVlY2hhdC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkiOwppbXBvcnQgInJlZ2VuZXJhdG9yLXJ1bnRpbWUvcnVudGltZSI7CmltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tICIvZGF0YS9qZW5raW5zL3dvcmtzcGFjZS9iYWRwLWJjeGluLXdlYi01LngtdnVlY2hhdC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vYXN5bmNUb0dlbmVyYXRvciI7CmltcG9ydCBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciBmcm9tICIvZGF0YS9qZW5raW5zL3dvcmtzcGFjZS9iYWRwLWJjeGluLXdlYi01LngtdnVlY2hhdC9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCmltcG9ydCBhdmVuZ2luZWtpdCBmcm9tICIuLi8uLi8uLi93ZmMvYXYvaW50ZXJuYWwvZW5naW5lLm1pbiI7CmltcG9ydCBDYWxsU2Vzc2lvbkNhbGxiYWNrIGZyb20gIi4uLy4uLy4uL3dmYy9hdi9lbmdpbmUvY2FsbFNlc3Npb25DYWxsYmFjayI7CmltcG9ydCBDYWxsU3RhdGUgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS9jYWxsU3RhdGUiOwppbXBvcnQgQ2xpY2tPdXRzaWRlIGZyb20gJ3Z1ZS1jbGljay1vdXRzaWRlJzsKaW1wb3J0IGxvY2FsU3RvcmFnZUVtaXR0ZXIgZnJvbSAiLi4vLi4vLi4vaXBjL2xvY2FsU3RvcmFnZUVtaXR0ZXIiOwppbXBvcnQgeyBjdXJyZW50V2luZG93LCBpc0VsZWN0cm9uIH0gZnJvbSAiLi4vLi4vLi4vcGxhdGZvcm0iOwppbXBvcnQgU2NyZWVuT3JXaW5kb3dQaWNrZXIgZnJvbSAiLi4vU2NyZWVuT3JXaW5kb3dQaWNrZXIiOwppbXBvcnQgQ2FsbEVuZFJlYXNvbiBmcm9tICIuLi8uLi8uLi93ZmMvYXYvZW5naW5lL2NhbGxFbmRSZWFzb24iOwppbXBvcnQgU2NyZWVuU2hhcmVDb250cm9sVmlldyBmcm9tICIuLi9TY3JlZW5TaGFyZUNvbnRyb2xWaWV3IjsKaW1wb3J0IGF2ZW5naW5la2l0cHJveHkgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS9hdmVuZ2luZWtpdHByb3h5IjsKaW1wb3J0IEVsZWN0cm9uV2luZG93c0NvbnRyb2xCdXR0b25WaWV3IGZyb20gIi4uLy4uL2NvbW1vbi9FbGVjdHJvbldpbmRvd3NDb250cm9sQnV0dG9uVmlldyI7CmltcG9ydCBzdG9yZSBmcm9tICIuLi8uLi8uLi9zdG9yZSI7CmltcG9ydCBWaWRlb1R5cGUgZnJvbSAiLi4vLi4vLi4vd2ZjL2F2L2VuZ2luZS92aWRlb1R5cGUiOwppbXBvcnQgSXBjRXZlbnRUeXBlIGZyb20gIi4uLy4uLy4uL2lwY0V2ZW50VHlwZSI7CmltcG9ydCBDb25mZXJlbmNlUGFydGljaXBhbnRWaWRlb1ZpZXcgZnJvbSAiLi9Db25mZXJlbmNlUGFydGljaXBhbnRWaWRlb1ZpZXciOwppbXBvcnQgQ29udmVyc2F0aW9uVmlldyBmcm9tICIuLi8uLi9tYWluL2NvbnZlcnNhdGlvbi9Db252ZXJzYXRpb25WaWV3IjsKaW1wb3J0IENvbmZlcmVuY2VTaW1wbGVJbmZvVmlldyBmcm9tICIuL0NvbmZlcmVuY2VTaW1wbGVJbmZvVmlldyI7CmltcG9ydCBDaG9vc2VDb25mZXJlbmNlTGF5b3V0VmlldyBmcm9tICIuL0Nob29zZUNvbmZlcmVuY2VMYXlvdXRWaWV3IjsKaW1wb3J0IENvbmZlcmVuY2VDb252ZXJzYXRpb25GbG9hdGluZ1ZpZXcgZnJvbSAiLi9Db25mZXJlbmNlQ29udmVyc2F0aW9uRmxvYXRpbmdWaWV3IjsKaW1wb3J0IGNvbmZlcmVuY2VNYW5hZ2VyIGZyb20gIi4vY29uZmVyZW5jZU1hbmFnZXIiOwppbXBvcnQgQ29uZmVyZW5jZU1hbmFnZVZpZXcgZnJvbSAiLi9Db25mZXJlbmNlTWFuYWdlVmlldyI7CmltcG9ydCB3ZmMgZnJvbSAiLi4vLi4vLi4vd2ZjL2NsaWVudC93ZmMiOwppbXBvcnQgTG9jYWxTdG9yYWdlSXBjRXZlbnRUeXBlIGZyb20gIi4uLy4uLy4uL2lwYy9sb2NhbFN0b3JhZ2VJcGNFdmVudFR5cGUiOwppbXBvcnQgVXNlckluZm8gZnJvbSAiLi4vLi4vLi4vd2ZjL21vZGVsL3VzZXJJbmZvIjsKaW1wb3J0IENvbnZlcnNhdGlvblR5cGUgZnJvbSAiLi4vLi4vLi4vd2ZjL21vZGVsL2NvbnZlcnNhdGlvblR5cGUiOwppbXBvcnQgQ29udmVyc2F0aW9uIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jb252ZXJzYXRpb24iOwppbXBvcnQgQ29udmVyc2F0aW9uSW5mbyBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvY29udmVyc2F0aW9uSW5mbyI7CmltcG9ydCBDaGFubmVsSW5mbyBmcm9tICIuLi8uLi8uLi93ZmMvbW9kZWwvY2hhbm5lbEluZm8iOwppbXBvcnQgQ2hhdFJvb21JbmZvIGZyb20gIi4uLy4uLy4uL3dmYy9tb2RlbC9jaGF0Um9vbUluZm8iOwpleHBvcnQgZGVmYXVsdCB7CiAgbmFtZTogJ0NvbmZlcmVuY2UnLAogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBzZXNzaW9uOiBudWxsLAogICAgICBhdWRpb09ubHk6IGZhbHNlLAogICAgICBzdGF0dXM6IDEsCiAgICAgIHNlbGZVc2VySW5mbzogbnVsbCwKICAgICAgcGFydGljaXBhbnRVc2VySW5mb3M6IFtdLAogICAgICBzdGFydFRpbWVzdGFtcDogMCwKICAgICAgY3VycmVudFRpbWVzdGFtcDogMCwKICAgICAgc2hvd1NsaWRlcjogZmFsc2UsCiAgICAgIHNob3dDb25mZXJlbmNlTWFuYWdlVmlldzogZmFsc2UsCiAgICAgIHNob3dDb252ZXJzYXRpb25WaWV3OiBmYWxzZSwKICAgICAgc2hhcmVkTWlzY1N0YXRlOiBzdG9yZS5zdGF0ZS5taXNjLAogICAgICB2aWRlb0lucHV0RGV2aWNlSW5kZXg6IDAsCiAgICAgIHJlZnJlc2hVc2VySW5mb0ludGVybmFsOiAwLAogICAgICBlbmRSZWFzb246IHVuZGVmaW5lZCwKICAgICAgY29uZmVyZW5jZU1hbmFnZXI6IGNvbmZlcmVuY2VNYW5hZ2VyLAogICAgICAvLyAtMe+8jOm7mOiupOW4g+WxgO+8jOS5n+WwseaYr+Wuq+agvOW4g+WxgO+8mzAsIOWuq+agvOinhuWbvu+8mzHvvIzmvJTorrLogIXop4blm74KICAgICAgY3VycmVudExheW91dDogLTEsCiAgICAgIC8vIOWuq+agvOinhuWbvgogICAgICBjdXJyZW50R3JpZFBhZ2VJbmRleDogMCwKICAgICAgcGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlOiA5LAogICAgICAvLyDmvJTorrLogIXop4blm74KICAgICAgc3BlYWtpbmdWaWRlb1BhcnRpY2lwYW50OiBudWxsLAogICAgICBoaWRlRm9jdXNMYXlvdXRQYXJ0aWNpcGFudExpc3RWaWRlb1ZpZXc6IGZhbHNlLAogICAgICBzaG93Q29uZmVyZW5jZVNpbXBsZUluZm9WaWV3OiBmYWxzZSwKICAgICAgc2hvd0Nob29zZUxheW91dFZpZXc6IGZhbHNlCiAgICB9OwogIH0sCiAgY29tcG9uZW50czogewogICAgQ29uZmVyZW5jZU1hbmFnZVZpZXc6IENvbmZlcmVuY2VNYW5hZ2VWaWV3LAogICAgQ29uZmVyZW5jZUNvbnZlcnNhdGlvbkZsb2F0aW5nVmlldzogQ29uZmVyZW5jZUNvbnZlcnNhdGlvbkZsb2F0aW5nVmlldywKICAgIENob29zZUNvbmZlcmVuY2VMYXlvdXRWaWV3OiBDaG9vc2VDb25mZXJlbmNlTGF5b3V0VmlldywKICAgIENvbmZlcmVuY2VTaW1wbGVJbmZvVmlldzogQ29uZmVyZW5jZVNpbXBsZUluZm9WaWV3LAogICAgQ29uZmVyZW5jZVBhcnRpY2lwYW50VmlkZW9WaWV3OiBDb25mZXJlbmNlUGFydGljaXBhbnRWaWRlb1ZpZXcsCiAgICBTY3JlZW5TaGFyZUNvbnRyb2xWaWV3OiBTY3JlZW5TaGFyZUNvbnRyb2xWaWV3LAogICAgRWxlY3Ryb25XaW5kb3dzQ29udHJvbEJ1dHRvblZpZXc6IEVsZWN0cm9uV2luZG93c0NvbnRyb2xCdXR0b25WaWV3LAogICAgQ29udmVyc2F0aW9uVmlldzogQ29udmVyc2F0aW9uVmlldwogIH0sCiAgbWV0aG9kczogewogICAgLy8g55So5p2l6Kej5YazIGlPUyDkuIrvvIzkuI3og73oh6rliqjmkq3mlL7pl67popgKICAgIGF1dG9QbGF5OiBmdW5jdGlvbiBhdXRvUGxheSgpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKCiAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGNvbnNvbGUubG9nKCdhdXRvIHBsYXknKTsKCiAgICAgIGlmICghdGhpcy5hdXRvUGxheUludGVydmFsKSB7CiAgICAgICAgdGhpcy5hdXRvUGxheUludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwogICAgICAgICAgICB2YXIgYWxsUGxheWluZyA9IHRydWU7CgogICAgICAgICAgICB2YXIgX2l0ZXJhdG9yID0gX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIodmlkZW9zKSwKICAgICAgICAgICAgICAgIF9zdGVwOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvci5zKCk7ICEoX3N0ZXAgPSBfaXRlcmF0b3IubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgdmFyIHZpZGVvID0gX3N0ZXAudmFsdWU7CgogICAgICAgICAgICAgICAgaWYgKHZpZGVvLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICBhbGxQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gLy8gcGFydGljaXBhbnRVc2VySW5mb3Mg5LiN5YyF5ZCr6Ieq5bexCgogICAgICAgICAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICBfaXRlcmF0b3IuZShlcnIpOwogICAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICAgIF9pdGVyYXRvci5mKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChhbGxQbGF5aW5nICYmIHZpZGVvcy5sZW5ndGggPT09IF90aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbHRlcihmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgIHJldHVybiAhcC5faXNBdWRpZW5jZTsKICAgICAgICAgICAgfSkubGVuZ3RoICsgMSkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoX3RoaXMuYXV0b1BsYXlJbnRlcnZhbCk7CiAgICAgICAgICAgICAgX3RoaXMuYXV0b1BsYXlJbnRlcnZhbCA9IDA7CiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2F1dG8gcGxheSwgYWxsUGxheWluZycsIHZpZGVvcy5sZW5ndGgpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIF9pdGVyYXRvcjIgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2aWRlb3MpLAogICAgICAgICAgICAgICAgX3N0ZXAyOwoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBmb3IgKF9pdGVyYXRvcjIucygpOyAhKF9zdGVwMiA9IF9pdGVyYXRvcjIubigpKS5kb25lOykgewogICAgICAgICAgICAgICAgdmFyIF92aWRlbyA9IF9zdGVwMi52YWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoX3ZpZGVvLnBhdXNlZCkgewogICAgICAgICAgICAgICAgICBfdmlkZW8ucGxheSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5lKGVycik7CiAgICAgICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICAgICAgX2l0ZXJhdG9yMi5mKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gY2F0Y2ggKGUpIHsvLyBkbyBub3RoaW5nCiAgICAgICAgICB9CiAgICAgICAgfSwgMTAwKTsKICAgICAgfQogICAgfSwKICAgIHNldHVwU2Vzc2lvbkNhbGxiYWNrOiBmdW5jdGlvbiBzZXR1cFNlc3Npb25DYWxsYmFjaygpIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CgogICAgICB2YXIgc2Vzc2lvbkNhbGxiYWNrID0gbmV3IENhbGxTZXNzaW9uQ2FsbGJhY2soKTsKCiAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRDaGFuZ2VTdGF0ZSA9IGZ1bmN0aW9uIChzdGF0ZSkgewogICAgICAgIGNvbnNvbGUubG9nKCdkaWRDaGFuZ2VTdGF0ZScsIHN0YXRlKTsKICAgICAgICBfdGhpczIuc3RhdHVzID0gc3RhdGU7CgogICAgICAgIGlmIChzdGF0ZSA9PT0gQ2FsbFN0YXRlLlNUQVRVU19DT05ORUNURUQpIHsKICAgICAgICAgIC8vIOavlOWmguayoeacieaRhOWDj+WktO+8jOS9huWPkei1t+inhumikemAmuivneaXtu+8jOS8muiHquWKqCBtdXRlVmlkZW8KICAgICAgICAgIF90aGlzMi5zZWxmVXNlckluZm8uX2lzVmlkZW9NdXRlZCA9IF90aGlzMi5zZXNzaW9uLnZpZGVvTXV0ZWQ7CgogICAgICAgICAgaWYgKF90aGlzMi5zdGFydFRpbWVzdGFtcCA9PT0gMCkgewogICAgICAgICAgICBfdGhpczIuc3RhcnRUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgICAgICAgX3RoaXMyLnRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgIF90aGlzMi5jdXJyZW50VGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgIH0sIDEwMDApOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT09IENhbGxTdGF0ZS5TVEFUVVNfSURMRSkgewogICAgICAgICAgaWYgKF90aGlzMi50aW1lcikgewogICAgICAgICAgICBjbGVhckludGVydmFsKF90aGlzMi50aW1lcik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLm9uSW5pdGlhbCA9IGZ1bmN0aW9uIChzZXNzaW9uLCBzZWxmVXNlckluZm8sIGluaXRpYXRvclVzZXJJbmZvKSB7CiAgICAgICAgLy90aGlzLnNlc3Npb24ucm90YXRlQW5nID0gOTA7CiAgICAgICAgc2VsZlVzZXJJbmZvLl9pc0hvc3QgPSBzZXNzaW9uLmhvc3QgPT09IHNlbGZVc2VySW5mby51aWQ7CiAgICAgICAgc2VsZlVzZXJJbmZvLl9pc0F1ZGllbmNlID0gc2Vzc2lvbi5hdWRpZW5jZTsKICAgICAgICBzZWxmVXNlckluZm8uX2lzVmlkZW9NdXRlZCA9IHNlc3Npb24udmlkZW9NdXRlZDsKICAgICAgICBzZWxmVXNlckluZm8uX2lzQXVkaW9NdXRlZCA9IHNlc3Npb24uYXVkaW9NdXRlZDsKICAgICAgICBzZWxmVXNlckluZm8uX3ZvbHVtZSA9IDA7IC8vIOWFiOa3u+WKoOWxnuaAp++8jOWcqOi1i+WAvO+8jOaJjeiDvSByZWFjdGl2ZQoKICAgICAgICBfdGhpczIuc2VsZlVzZXJJbmZvID0gc2VsZlVzZXJJbmZvOwogICAgICAgIF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcyA9IFtzZWxmVXNlckluZm9dOwogICAgICAgIGNvbnNvbGUubG9nKCdvbmluaXRpYWwnLCBzZWxmVXNlckluZm8uX2lzQXVkaWVuY2UpOyAvLyBwbHMgcmVmZXIgdG86IGh0dHBzOi8vdnVlanMub3JnL3YyL2d1aWRlL3JlYWN0aXZpdHkuaHRtbAoKICAgICAgICBfdGhpczIuJHNldChfdGhpczIuc2VsZlVzZXJJbmZvLCAnX3N0cmVhbScsIG51bGwpOwoKICAgICAgICBfdGhpczIuJHNldChfdGhpczIuc2VsZlVzZXJJbmZvLCAnX3NjcmVlblNoYXJlU3RyZWFtJywgbnVsbCk7CgogICAgICAgIF90aGlzMi4kc2V0KF90aGlzMi5zZWxmVXNlckluZm8sICdfaXNTY3JlZW5TaGFyaW5nJywgZmFsc2UpOwoKICAgICAgICBfdGhpczIucGFydGljaXBhbnRVc2VySW5mb3MuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuIF90aGlzMi4kc2V0KHAsICJfc3RyZWFtIiwgbnVsbCk7CiAgICAgICAgfSk7CgogICAgICAgIF90aGlzMi5zZXNzaW9uID0gc2Vzc2lvbjsKICAgICAgICBkb2N1bWVudC50aXRsZSA9IHNlc3Npb24udGl0bGU7CiAgICAgICAgY29uZmVyZW5jZU1hbmFnZXIuZ2V0Q29uZmVyZW5jZUluZm8oc2Vzc2lvbi5jYWxsSWQpOwogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZENyZWF0ZUxvY2FsVmlkZW9UcmFjayA9IGZ1bmN0aW9uIChzdHJlYW0sIHNjcmVlblNoYXJlKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2RpZENyZWF0ZUxvY2FsVmlkZW9UcmFjaycsIHNjcmVlblNoYXJlKTsKCiAgICAgICAgaWYgKHNjcmVlblNoYXJlKSB7CiAgICAgICAgICBfdGhpczIuc2VsZlVzZXJJbmZvLl9zY3JlZW5TaGFyZVN0cmVhbSA9IHN0cmVhbTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5fc3RyZWFtID0gc3RyZWFtOwogICAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5fc2NyZWVuU2hhcmVTdHJlYW0gPSBudWxsOwogICAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBfdGhpczIuc2VsZlVzZXJJbmZvLl9pc1NjcmVlblNoYXJpbmcgPSBzY3JlZW5TaGFyZTsKCiAgICAgICAgX3RoaXMyLmF1dG9QbGF5KCk7CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkUm90YXRlTG9jYWxWaWRlb1RyYWNrID0gZnVuY3Rpb24gKHN0cmVhbSkgewogICAgICAgIGNvbnNvbGUubG9nKCdkaWRSb3RhdGVMb2NhbFZpZGVvVHJhY2snLCBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKSk7CiAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5fc3RyZWFtID0gc3RyZWFtOwogICAgICAgIF90aGlzMi5zZWxmVXNlckluZm8uX3N0cmVhbS50aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsKICAgICAgfTsKCiAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRTY3JlZW5TaGFyZUVuZGVkID0gZnVuY3Rpb24gKCkgewogICAgICAgIGNvbnNvbGUubG9nKCdkaWRTY3JlZW5TaGFyZUVuZGVkJywgX3RoaXMyLnNlc3Npb24udmlkZW9NdXRlZCwgX3RoaXMyLnNlc3Npb24uYXVkaW9NdXRlZCk7CgogICAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0SWdub3JlTW91c2VFdmVudHMoZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5faXNTY3JlZW5TaGFyaW5nID0gZmFsc2U7CiAgICAgICAgX3RoaXMyLnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkID0gX3RoaXMyLnNlc3Npb24udmlkZW9NdXRlZDsKICAgICAgfTsKCiAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRDcmVhdGVMb2NhbFZpZGVvVHJhY2tFcnJvciA9IGZ1bmN0aW9uICgpIHsvLyBUT0RPCiAgICAgICAgLy8g5rKh5pyJ5pGE5YOP5aS05oiW6ICF6bqm5YWL6aOO77yM5Yqg5YWl5Lya6K6u5pe277yM5Lya5Zue6LCD5Yiw5q2k5aSE77yM6Ieq5bex5pat5Lya5pi+56S66Ieq5bex55qE5aS05YOP77yM5YW25LuW56uv5Lya5pi+56S66buR5bGPCiAgICAgICAgLy8g5Y+v5Lul6L+b6KGM55u45YWz5o+Q56S6CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkUmVjZWl2ZVJlbW90ZVZpZGVvVHJhY2sgPSBmdW5jdGlvbiAodXNlcklkLCBzdHJlYW0sIHNjcmVlblNoYXJpbmcpIHsKICAgICAgICB2YXIgcDsKICAgICAgICBjb25zb2xlLmxvZygnZGlkUmVjZWl2ZVJlbW90ZVZpZGVvVHJhY2snLCB1c2VySWQsIHN0cmVhbSwgc2NyZWVuU2hhcmluZyk7CiAgICAgICAgdmFyIGluZGV4ID0gLTE7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwID0gX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zW2ldOwoKICAgICAgICAgIGlmIChwLnVpZCA9PT0gdXNlcklkICYmIHAuX2lzU2NyZWVuU2hhcmluZyA9PT0gc2NyZWVuU2hhcmluZykgewogICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgIHAuX3N0cmVhbSA9IHN0cmVhbTsKICAgICAgICAgICAgcC5fc3RyZWFtLnRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IC8vIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgLy8gICAgIHRoaXMuJHNldCh0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLCBpbmRleCwgcCk7CiAgICAgICAgLy8gfQoKCiAgICAgICAgX3RoaXMyLmF1dG9QbGF5KCk7CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkUmVtb3ZlUmVtb3RlVmlkZW9UcmFjayA9IGZ1bmN0aW9uICh1c2VySWQpIHsKICAgICAgICBjb25zb2xlLmxvZygnZGlkUmVtb3ZlUmVtb3RlVmlkZW9UcmFjaycsIHVzZXJJZCk7CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkUGFydGljaXBhbnRKb2luZWQgPSBmdW5jdGlvbiAodXNlcklkLCBzY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2RpZFBhcnRpY2lwYW50Sm9pbmVkJywgdXNlcklkLCBzY3JlZW5TaGFyaW5nKTsKICAgICAgICB2YXIgdXNlckluZm8gPSB3ZmMuZ2V0VXNlckluZm8odXNlcklkKTsKCiAgICAgICAgdmFyIHN1YnNjcmliZXIgPSBfdGhpczIuc2Vzc2lvbi5nZXRTdWJzY3JpYmVyKHVzZXJJZCwgc2NyZWVuU2hhcmluZyk7CgogICAgICAgIHVzZXJJbmZvLl9zdHJlYW0gPSBzdWJzY3JpYmVyLnN0cmVhbTsKICAgICAgICB1c2VySW5mby5faXNBdWRpZW5jZSA9IHN1YnNjcmliZXIuYXVkaWVuY2U7CiAgICAgICAgdXNlckluZm8uX2lzSG9zdCA9IF90aGlzMi5zZXNzaW9uLmhvc3QgPT09IHVzZXJJZDsKICAgICAgICB1c2VySW5mby5faXNWaWRlb011dGVkID0gc3Vic2NyaWJlci52aWRlb011dGVkOwogICAgICAgIHVzZXJJbmZvLl9pc0F1ZGlvTXV0ZWQgPSBzdWJzY3JpYmVyLmF1ZGlvTXV0ZWQ7CiAgICAgICAgdXNlckluZm8uX3ZvbHVtZSA9IDA7CiAgICAgICAgdXNlckluZm8uX2lzU2NyZWVuU2hhcmluZyA9IHNjcmVlblNoYXJpbmc7IC8vIOWKqOaAgea3u+WKoOeahOWxnuaAp+S4jeaYryByZWFjdGl2ZSDnmoTvvIzmlYXnm7TmjqXliJvlu7rkuKrmlrDnmoTlr7nosaEKICAgICAgICAvLyDlhbblrp7ov5nkuKrpl67popjlvojlpYfmgKrvvIzlj6rmnInlj5HotbfkvJrorq7vvIznrKzkuIDmrKHov5vlhaXor6XkvJrorq7nmoTml7blgJnvvIzlhbbku5bnq6/liqDlhaXvvIzlj4LkuI7ogIXliJfooajkvJrkuI3liLfmlrDvvJvph43mlrDov5vlhaXnrYnvvIzpg73kuIDliIfmraPluLgKCiAgICAgICAgX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zLnB1c2goT2JqZWN0LmFzc2lnbihuZXcgVXNlckluZm8oKSwgdXNlckluZm8pKTsKCiAgICAgICAgY29uc29sZS5sb2coJ2pvaW5lZCcsIHVzZXJJbmZvLCBzdWJzY3JpYmVyLmF1ZGllbmNlLCBfdGhpczIucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoKTsKICAgICAgfTsKCiAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRQYXJ0aWNpcGFudExlZnQgPSBmdW5jdGlvbiAodXNlcklkLCBlbmRSZWFzb24sIHNjcmVlblNoYXJpbmcpIHsKICAgICAgICBjb25zb2xlLmxvZygnZGlkUGFydGljaXBhbnRMZWZ0JywgdXNlcklkLCBlbmRSZWFzb24sIHNjcmVlblNoYXJpbmcsIEpTT04uc3RyaW5naWZ5KF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcyksIF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGgpOyAvL3RoaXMucGFydGljaXBhbnRVc2VySW5mb3MgPSB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbHRlcihwID0+IHAudWlkICE9PSB1c2VySWQgJiYgcC5faXNTY3JlZW5TaGFyaW5nICE9PSBzY3JlZW5TaGFyaW5nKTsKCiAgICAgICAgX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zID0gX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbHRlcihmdW5jdGlvbiAocCkgewogICAgICAgICAgcmV0dXJuICEocC51aWQgPT09IHVzZXJJZCAmJiBwLl9pc1NjcmVlblNoYXJpbmcgPT09IHNjcmVlblNoYXJpbmcpOwogICAgICAgIH0pOyAvL2ZpeG1lIOS4iumdouWPr+iDveS8muayoeacieinpuWPkemHjeaWsOiuoeeulyBmb2N1c1ZpZGVvUGFydGljaXBhbnQKCiAgICAgICAgY29uc29sZS5sb2coJ2RpZFBhcnRpY2lwYW50TGVmdCBkJywgdXNlcklkLCBlbmRSZWFzb24sIHNjcmVlblNoYXJpbmcsIF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGgpOwogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZENhbGxFbmRXaXRoUmVhc29uID0gZnVuY3Rpb24gKHJlYXNvbikgewogICAgICAgIGNvbnNvbGUubG9nKCdjYWxsRW5kV2l0aFJlYXNvbicsIHJlYXNvbik7CiAgICAgICAgY29uZmVyZW5jZU1hbmFnZXIuYWRkSGlzdG9yeShjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mbywgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mby5zdGFydFRpbWUgKiAxMDAwKTsgLy8g5Y+v5Lul5qC55o2ucmVhc29u77yM6L+b6KGM5LiA5Lqb5o+Q56S6CiAgICAgICAgLy8gYWxlcnQoJ+S8muiuruW3sue7k+adnycpOwoKICAgICAgICBfdGhpczIuZW5kUmVhc29uID0gcmVhc29uOwoKICAgICAgICBpZiAocmVhc29uID09PSBDYWxsRW5kUmVhc29uLlJFQVNPTl9NZWRpYUVycm9yKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAocmVhc29uID09PSBDYWxsRW5kUmVhc29uLlJvb21Ob3RFeGlzdCkgewogICAgICAgICAgY29uc29sZS5sb2coJ2pvaW4gY29uZmVyZW5jZSBmYWlsZWQnLCByZWFzb24sIF90aGlzMi5zZXNzaW9uKTsKICAgICAgICAgIHZhciBvYmogPSB7CiAgICAgICAgICAgIHJlYXNvbjogcmVhc29uLAogICAgICAgICAgICBzZXNzaW9uOiBfdGhpczIuc2Vzc2lvbgogICAgICAgICAgfTsKICAgICAgICAgIGxvY2FsU3RvcmFnZUVtaXR0ZXIuc2VuZChMb2NhbFN0b3JhZ2VJcGNFdmVudFR5cGUuam9pbkNvbmZlcmVuY2VGYWlsZWQsIG9iaik7CiAgICAgICAgfQoKICAgICAgICBfdGhpczIuc2Vzc2lvbi5jbG9zZVZvaXBXaW5kb3coKTsKCiAgICAgICAgX3RoaXMyLnNlc3Npb24gPSBudWxsOwogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLm9uUmVxdWVzdENoYW5nZU1vZGUgPSBmdW5jdGlvbiAoYXVkaWVuY2UpIHsKICAgICAgICBjb25zb2xlLmxvZygnb25SZXF1ZXN0Q2hhbmdlTW9kZScsIGF1ZGllbmNlKTsKCiAgICAgICAgaWYgKGF1ZGllbmNlKSB7CiAgICAgICAgICBfdGhpczIuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZSh0cnVlKTsKCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBfdGhpczIuJGFsZXJ0KHsKICAgICAgICAgIGNvbnRlbnQ6ICfkuLvmjIHkurrpgoDor7fkvaDlj4LkuI7kupLliqgnLAogICAgICAgICAgY2FuY2VsQ2FsbGJhY2s6IGZ1bmN0aW9uIGNhbmNlbENhbGxiYWNrKCkgey8vIGRvIG5vdGhpbmcKICAgICAgICAgIH0sCiAgICAgICAgICBjb25maXJtQ2FsbGJhY2s6IGZ1bmN0aW9uIGNvbmZpcm1DYWxsYmFjaygpIHsKICAgICAgICAgICAgX3RoaXMyLnNlc3Npb24uc3dpdGNoQXVkaWVuY2UoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZENoYW5nZVR5cGUgPSBmdW5jdGlvbiAodXNlcklkLCBhdWRpZW5jZSwgc2NyZWVuU2hhcmluZykgewogICAgICAgIGNvbnNvbGUubG9nKCdkaWRDaGFuZ2VUeXBlJywgdXNlcklkLCBhdWRpZW5jZSwgc2NyZWVuU2hhcmluZyk7CgogICAgICAgIF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICBpZiAodS51aWQgPT09IHVzZXJJZCAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IHNjcmVlblNoYXJpbmcpIHsKICAgICAgICAgICAgdS5faXNBdWRpZW5jZSA9IGF1ZGllbmNlOwoKICAgICAgICAgICAgaWYgKGF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgdS5fc3RyZWFtID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKF90aGlzMi5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgJiYgX3RoaXMyLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudC51aWQgPT09IHUudWlkKSB7CiAgICAgICAgICAgICAgX3RoaXMyLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIHNlc3Npb25DYWxsYmFjay5kaWRSZXBvcnRBdWRpb1ZvbHVtZSA9IGZ1bmN0aW9uICh1c2VySWQsIHZvbHVtZSkgewogICAgICAgIHZhciB1c2VySW5mbzsKCiAgICAgICAgaWYgKHVzZXJJZCA9PT0gX3RoaXMyLnNlbGZVc2VySW5mby51aWQpIHsKICAgICAgICAgIF90aGlzMi5zZWxmVXNlckluZm8uX3ZvbHVtZSA9IHZvbHVtZTsKICAgICAgICAgIHVzZXJJbmZvID0gX3RoaXMyLnNlbGZVc2VySW5mbzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3RoaXMyLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2goZnVuY3Rpb24gKHUpIHsKICAgICAgICAgICAgaWYgKHUudWlkID09PSB1c2VySWQgJiYgdS5faXNTY3JlZW5TaGFyaW5nID09PSBmYWxzZSkgewogICAgICAgICAgICAgIHUuX3ZvbHVtZSA9IHZvbHVtZTsKICAgICAgICAgICAgICB1c2VySW5mbyA9IHU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKF90aGlzMi5jdXJyZW50TGF5b3V0ID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoIXVzZXJJbmZvKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAodXNlckluZm8uX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKF90aGlzMi5jb25mZXJlbmNlRm9jdXNVc2VyKSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMyLmNvbmZlcmVuY2VGb2N1c1VzZXI7CiAgICAgICAgfQoKICAgICAgICBpZiAoIV90aGlzMi5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQpIHsKICAgICAgICAgIF90aGlzMi5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgPSB1c2VySW5mbzsKICAgICAgICB9IGVsc2UgaWYgKHVzZXJJbmZvLl92b2x1bWUgPiBfdGhpczIuc3BlYWtpbmdWaWRlb1BhcnRpY2lwYW50Ll92b2x1bWUpIHsKICAgICAgICAgIF90aGlzMi5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgPSB1c2VySW5mbzsKICAgICAgICB9CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkTXV0ZVN0YXRlQ2hhbmdlZCA9IGZ1bmN0aW9uIChwYXJ0aWNpcGFudHMpIHsKICAgICAgICBjb25zb2xlLmxvZygnY29uZmVyZW5jZScsICdkaWRNdXRlU3RhdGVDaGFuZ2VkJywgcGFydGljaXBhbnRzKTsKICAgICAgICBwYXJ0aWNpcGFudHMuZm9yRWFjaChmdW5jdGlvbiAocCkgewogICAgICAgICAgLy8g6Ieq5bexCiAgICAgICAgICBpZiAocCA9PT0gX3RoaXMyLnNlbGZVc2VySW5mby51aWQpIHsKICAgICAgICAgICAgY29uc29sZS5sb2coJ2NvbmZlcmVuY2UnLCAnZGlkTXV0ZVN0YXRlQ2hhbmdlZCBzZWxmJywgX3RoaXMyLnNlc3Npb24udmlkZW9NdXRlZCk7CiAgICAgICAgICAgIF90aGlzMi5zZWxmVXNlckluZm8uX2lzVmlkZW9NdXRlZCA9IF90aGlzMi5zZXNzaW9uLnZpZGVvTXV0ZWQ7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgcyA9IF90aGlzMi5zZXNzaW9uLmdldFN1YnNjcmliZXIocCk7CgogICAgICAgICAgaWYgKCFzKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zb2xlLmxvZygnY29uZmVyZW5jZScsICdkaWRNdXRlU3RhdGVDaGFuZ2VkJywgcCwgcy52aWRlb011dGVkLCBzLmF1ZGlvTXV0ZWQpOwoKICAgICAgICAgIF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgICAgIGlmICh1LnVpZCA9PT0gcCAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgdmFyIHN1YnNjcmliZXIgPSBfdGhpczIuc2Vzc2lvbi5nZXRTdWJzY3JpYmVyKHApOwoKICAgICAgICAgICAgICB1Ll9pc1ZpZGVvTXV0ZWQgPSBzdWJzY3JpYmVyLnZpZGVvTXV0ZWQ7CiAgICAgICAgICAgICAgdS5faXNBdWRpb011dGVkID0gc3Vic2NyaWJlci5hdWRpb011dGVkOwoKICAgICAgICAgICAgICBpZiAoX3RoaXMyLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCAmJiBfdGhpczIuc3BlYWtpbmdWaWRlb1BhcnRpY2lwYW50LnVpZCA9PT0gdS51aWQpIHsKICAgICAgICAgICAgICAgIF90aGlzMi5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICBzZXNzaW9uQ2FsbGJhY2suZGlkTWVkaWFMb3N0UGFja2V0ID0gZnVuY3Rpb24gKG1lZGlhLCBsb3N0UGFja2V0LCBzY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2RpZE1lZGlhTG9zdFBhY2tldCcsIG1lZGlhLCBsb3N0UGFja2V0LCBzY3JlZW5TaGFyaW5nKTsKCiAgICAgICAgaWYgKGxvc3RQYWNrZXQgPiA2KSB7CiAgICAgICAgICBjb25zb2xlLmxvZygn5oKo55qE572R57uc5LiN5aW9Jyk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgc2Vzc2lvbkNhbGxiYWNrLmRpZFVzZXJNZWRpYUxvc3RQYWNrZXQgPSBmdW5jdGlvbiAodXNlcklkLCBtZWRpYSwgbG9zdFBhY2tldCwgdXBsaW5rLCBzY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgY29uc29sZS5sb2coJ2RpZFVzZXJNZWRpYUxvc3RQYWNrZXQnLCB1c2VySWQsIG1lZGlhLCBsb3N0UGFja2V0LCB1cGxpbmssIHNjcmVlblNoYXJpbmcpOyAvL+WmguaenHVwbGluayB0dXJl5a+55pa5572R57uc5LiN5aW977yMZmFsc2XmgqjnmoTnvZHnu5zkuI3lpb0KICAgICAgICAvL+aOpeaUtuaWueS4ouWMhei2hei/hzEw5Li6572R57uc5LiN5aW9CgogICAgICAgIGlmIChsb3N0UGFja2V0ID4gMTApIHsKICAgICAgICAgIGlmICh1cGxpbmspIHsKICAgICAgICAgICAgdmFyIHVzZXJJbmZvcyA9IF90aGlzMi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maWx0ZXIoZnVuY3Rpb24gKHUpIHsKICAgICAgICAgICAgICByZXR1cm4gdS51aWQgPT09IHVzZXJJZCAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IHNjcmVlblNoYXJpbmc7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHVzZXJJbmZvcyAmJiB1c2VySW5mb3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGNvbnNvbGUubG9nKHVzZXJJbmZvc1swXS5kaXNwbGF5TmFtZSwgIue9kee7nOS4jeWlvSIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zb2xlLmxvZygn5oKo55qE572R57uc5LiN5aW9Jyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgIGF2ZW5naW5la2l0LnNldHVwKHNlc3Npb25DYWxsYmFjayk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYXZlbmdpbmVraXQuc2Vzc2lvbkNhbGxiYWNrID0gc2Vzc2lvbkNhbGxiYWNrOwogICAgICB9CiAgICB9LAogICAgaGFuZ3VwOiBmdW5jdGlvbiBoYW5ndXAoKSB7CiAgICAgIHRoaXMuc2Vzc2lvbi5sZWF2ZUNvbmZlcmVuY2UodHJ1ZSk7IC8v6YKA6K+35pa56K6+572udHJ1ZSx3ZWLnq6/nprvlvIDkvJrorq7vvIxhcHDkuZ/nprvlvIAtLeaguOW/gwoKICAgICAgY29uZmVyZW5jZU1hbmFnZXIuYWRkSGlzdG9yeShjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mbywgbmV3IERhdGUoKS5nZXRUaW1lKCkgLSBjb25mZXJlbmNlTWFuYWdlci5jb25mZXJlbmNlSW5mby5zdGFydFRpbWUgKiAxMDAwKTsKICAgIH0sCiAgICBtdXRlQXVkaW86IGZ1bmN0aW9uIG11dGVBdWRpbygpIHsKICAgICAgdmFyIGVuYWJsZSA9IHRoaXMuc2Vzc2lvbi5hdWRpb011dGVkID8gdHJ1ZSA6IGZhbHNlOwoKICAgICAgaWYgKGVuYWJsZSAmJiB0aGlzLnNlc3Npb24uYXVkaWVuY2UgJiYgIWNvbmZlcmVuY2VNYW5hZ2VyLmlzT3duZXIoKSAmJiAhY29uZmVyZW5jZU1hbmFnZXIuY29uZmVyZW5jZUluZm8uYWxsb3dTd2l0Y2hNb2RlKSB7CiAgICAgICAgdGhpcy5yZXF1ZXN0VW5tdXRlKHRydWUpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5lbmFibGVBdWRpbyhlbmFibGUpOwogICAgfSwKICAgIGVuYWJsZUF1ZGlvOiBmdW5jdGlvbiBlbmFibGVBdWRpbyhlbmFibGUpIHsKICAgICAgdmFyIF90aGlzMyA9IHRoaXM7CgogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlKCkgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUkKF9jb250ZXh0KSB7CiAgICAgICAgICB3aGlsZSAoMSkgewogICAgICAgICAgICBzd2l0Y2ggKF9jb250ZXh0LnByZXYgPSBfY29udGV4dC5uZXh0KSB7CiAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLnNlc3Npb24uc2V0QXVkaW9FbmFibGVkKGVuYWJsZSk7CgogICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgIHJlc3VsdCA9IF9jb250ZXh0LnNlbnQ7CgogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICBfY29udGV4dC5uZXh0ID0gNTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIF9jb250ZXh0LmFicnVwdCgicmV0dXJuIik7CgogICAgICAgICAgICAgIGNhc2UgNToKICAgICAgICAgICAgICAgIF90aGlzMy5zZWxmVXNlckluZm8uX2lzQXVkaW9NdXRlZCA9ICFlbmFibGU7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbXV0ZUF1ZGlvJywgX3RoaXMzLnNlbGZVc2VySW5mby5faXNBdWRpb011dGVkLCBfdGhpczMuc2Vzc2lvbi5hdWRpZW5jZSk7CgogICAgICAgICAgICAgICAgaWYgKCFlbmFibGUpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE0OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIV90aGlzMy5zZXNzaW9uLmF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxMjsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDExOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKGZhbHNlKTsKCiAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgIF90aGlzMy5zZWxmVXNlckluZm8uX2lzQXVkaWVuY2UgPSBmYWxzZTsKCiAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICBjYXNlIDE0OgogICAgICAgICAgICAgICAgaWYgKCEoX3RoaXMzLnNlc3Npb24udmlkZW9NdXRlZCAmJiAhX3RoaXMzLnNlc3Npb24uYXVkaWVuY2UpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0Lm5leHQgPSAxODsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgX2NvbnRleHQubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKHRydWUpOwoKICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgX3RoaXMzLnNlbGZVc2VySW5mby5faXNBdWRpZW5jZSA9IHRydWU7CgogICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dC5zdG9wKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LCBfY2FsbGVlKTsKICAgICAgfSkpKCk7CiAgICB9LAogICAgbXV0ZVZpZGVvOiBmdW5jdGlvbiBtdXRlVmlkZW8oKSB7CiAgICAgIHZhciBlbmFibGUgPSB0aGlzLnNlc3Npb24udmlkZW9NdXRlZCA/IHRydWUgOiBmYWxzZTsKCiAgICAgIGlmIChlbmFibGUgJiYgdGhpcy5zZXNzaW9uLmF1ZGllbmNlICYmICFjb25mZXJlbmNlTWFuYWdlci5pc093bmVyKCkgJiYgIWNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLmFsbG93U3dpdGNoTW9kZSkgewogICAgICAgIHRoaXMucmVxdWVzdFVubXV0ZShmYWxzZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0aGlzLmVuYWJsZVZpZGVvKGVuYWJsZSk7CiAgICB9LAogICAgZW5hYmxlVmlkZW86IGZ1bmN0aW9uIGVuYWJsZVZpZGVvKGVuYWJsZSkgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKCiAgICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvciggLyojX19QVVJFX18qL3JlZ2VuZXJhdG9yUnVudGltZS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUyKCkgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUyJChfY29udGV4dDIpIHsKICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQyLnByZXYgPSBfY29udGV4dDIubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMjsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczQuc2Vzc2lvbi5zZXRWaWRlb0VuYWJsZWQoZW5hYmxlKTsKCiAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NvbnRleHQyLnNlbnQ7CgogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuYWJydXB0KCJyZXR1cm4iKTsKCiAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgX3RoaXM0LnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkID0gIWVuYWJsZTsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdtdXRlVmlkZW8gcmVzdWx0JywgX3RoaXM0LnNlbGZVc2VySW5mby5faXNWaWRlb011dGVkLCBfdGhpczQuc2Vzc2lvbi5hdWRpZW5jZSk7CgogICAgICAgICAgICAgICAgaWYgKCFlbmFibGUpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQyLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFfdGhpczQuc2Vzc2lvbi5hdWRpZW5jZSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDEyOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDExOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKGZhbHNlKTsKCiAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgIF90aGlzNC5zZWxmVXNlckluZm8uX2lzQXVkaWVuY2UgPSBmYWxzZTsKCiAgICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgICAgIF9jb250ZXh0Mi5uZXh0ID0gMTg7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICAgIGlmICghKF90aGlzNC5zZXNzaW9uLmF1ZGlvTXV0ZWQgJiYgIV90aGlzNC5zZXNzaW9uLmF1ZGllbmNlKSkgewogICAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE4OwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBfY29udGV4dDIubmV4dCA9IDE3OwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzNC5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKHRydWUpOwoKICAgICAgICAgICAgICBjYXNlIDE3OgogICAgICAgICAgICAgICAgX3RoaXM0LnNlbGZVc2VySW5mby5faXNBdWRpZW5jZSA9IHRydWU7CgogICAgICAgICAgICAgIGNhc2UgMTg6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDIuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTIpOwogICAgICB9KSkoKTsKICAgIH0sCiAgICByZXF1ZXN0VW5tdXRlOiBmdW5jdGlvbiByZXF1ZXN0VW5tdXRlKGF1ZGlvKSB7CiAgICAgIGlmIChhdWRpbyAmJiBjb25mZXJlbmNlTWFuYWdlci5hbGxvd1VubXV0ZUF1ZGlvKSB7CiAgICAgICAgdGhpcy5lbmFibGVBdWRpbyh0cnVlKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICghYXVkaW8gJiYgY29uZmVyZW5jZU1hbmFnZXIuYWxsb3dVbm11dGVWaWRlbykgewogICAgICAgIHRoaXMuZW5hYmxlVmlkZW8odHJ1ZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB0aGlzLiRhbGVydCh7CiAgICAgICAgY29udGVudDogYXVkaW8gPyAn5Li75oyB5Lq65LiN5YWB6K646Kej6Zmk6Z2Z6Z+z77yM5oKo5Y+v5Lul5ZCR5Li75oyB5Lq655Sz6K+36Kej6Zmk6Z2Z6Z+zJyA6ICfkuLvmjIHkurrkuI3lhYHorrjmiZPlvIDmkYTlg4/lpLTvvIzmgqjlj6/ku6XlkJHkuLvmjIHkurrnlLPor7fmiZPlvIDmkYTlg4/lpLQnLAogICAgICAgIGNvbmZpcm1UZXh0OiAn55Sz6K+3JywKICAgICAgICBjYW5jZWxDYWxsYmFjazogZnVuY3Rpb24gY2FuY2VsQ2FsbGJhY2soKSB7Ly8gZG8gbm90aGluZwogICAgICAgIH0sCiAgICAgICAgY29uZmlybUNhbGxiYWNrOiBmdW5jdGlvbiBjb25maXJtQ2FsbGJhY2soKSB7CiAgICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5hcHBseVVubXV0ZShhdWRpbywgZmFsc2UpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgZG93bjJ2b2ljZTogZnVuY3Rpb24gZG93bjJ2b2ljZSgpIHsKICAgICAgdGhpcy5zZXNzaW9uLmRvd25ncmFkZTJWb2ljZSgpOwogICAgfSwKICAgIG1lbWJlcnM6IGZ1bmN0aW9uIG1lbWJlcnMoKSB7CiAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3ID0gIXRoaXMuc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3OwogICAgICB0aGlzLnRvZ2dsZVNsaWRlclZpZXcoKTsKICAgIH0sCiAgICBjaGF0OiBmdW5jdGlvbiBjaGF0KCkgewogICAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uVmlldyA9ICF0aGlzLnNob3dDb252ZXJzYXRpb25WaWV3OwogICAgICAgIHRoaXMudG9nZ2xlU2xpZGVyVmlldygpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBjb252ZXJzYXRpb24gPSBuZXcgQ29udmVyc2F0aW9uKENvbnZlcnNhdGlvblR5cGUuQ2hhdFJvb20sIHRoaXMuc2Vzc2lvbi5jYWxsSWQsIDApOwogICAgICAgIHZhciBjaGF0cm9vbUluZm8gPSBuZXcgQ2hhdFJvb21JbmZvKCk7CiAgICAgICAgY2hhdHJvb21JbmZvLmNoYXRSb29tSWQgPSB0aGlzLnNlc3Npb24uY2FsbElkOwogICAgICAgIGNoYXRyb29tSW5mby50aXRsZSA9IHRoaXMuc2Vzc2lvbi50aXRsZTsKICAgICAgICBjb252ZXJzYXRpb24uX3RhcmdldCA9IGNoYXRyb29tSW5mbzsKICAgICAgICBjb252ZXJzYXRpb24uX3RhcmdldC5fZGlzcGxheU5hbWUgPSBjaGF0cm9vbUluZm8udGl0bGU7CiAgICAgICAgdmFyIGNvbnZlcnNhdGlvbkluZm8gPSBuZXcgQ29udmVyc2F0aW9uSW5mbygpOwogICAgICAgIGNvbnZlcnNhdGlvbkluZm8uY29udmVyc2F0aW9uID0gY29udmVyc2F0aW9uOwogICAgICAgIHN0b3JlLnNldEN1cnJlbnRDb252ZXJzYXRpb25JbmZvKGNvbnZlcnNhdGlvbkluZm8pOwogICAgICAgIHRoaXMuJHJvdXRlci5yZXBsYWNlKCcvaG9tZScpOwogICAgICB9CiAgICB9LAogICAgaGlkZVBhcnRpY2lwYW50TGlzdDogZnVuY3Rpb24gaGlkZVBhcnRpY2lwYW50TGlzdCgpIHsKICAgICAgdGhpcy5zaG93Q29uZmVyZW5jZU1hbmFnZVZpZXcgJiYgKHRoaXMuc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3ID0gZmFsc2UpOwogICAgICB0aGlzLnRvZ2dsZVNsaWRlclZpZXcoKTsKICAgIH0sCiAgICB0b2dnbGVTbGlkZXJWaWV3OiBmdW5jdGlvbiB0b2dnbGVTbGlkZXJWaWV3KCkgewogICAgICBpZiAoIXRoaXMuc2hvd1NsaWRlcikgewogICAgICAgIGlmIChpc0VsZWN0cm9uKCkpIHsKICAgICAgICAgIHZhciBzaXplID0gY3VycmVudFdpbmRvdy5nZXRTaXplKCk7CiAgICAgICAgICBjdXJyZW50V2luZG93LnNldFNpemUoc2l6ZVswXSArIDM1MCwgc2l6ZVsxXSwgZmFsc2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3aW5kb3cucmVzaXplVG8od2luZG93LmlubmVyV2lkdGggKyAzNjAsIHdpbmRvdy5vdXRlckhlaWdodCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tc2xpZGVyLXdpZHRoJywgJzM1MHB4Jyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlzRWxlY3Ryb24oKSkgewogICAgICAgICAgdmFyIF9zaXplID0gY3VycmVudFdpbmRvdy5nZXRTaXplKCk7CgogICAgICAgICAgdGhpcy4kcmVmcy5yb290Q29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCctLXNsaWRlci13aWR0aCcsICcwcHgnKTsKICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0U2l6ZShfc2l6ZVswXSAtIDM1MCwgX3NpemVbMV0sIGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy4kcmVmcy5yb290Q29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCctLXNsaWRlci13aWR0aCcsICcwcHgnKTsKICAgICAgICAgIHdpbmRvdy5yZXNpemVUbyh3aW5kb3cuaW5uZXJXaWR0aCAtIDM1MCwgd2luZG93Lm91dGVySGVpZ2h0KTsKICAgICAgICB9CgogICAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VNYW5hZ2VWaWV3ID0gZmFsc2U7CiAgICAgICAgdGhpcy5zaG93Q29udmVyc2F0aW9uVmlldyA9IGZhbHNlOwogICAgICB9CgogICAgICB0aGlzLnNob3dTbGlkZXIgPSAhdGhpcy5zaG93U2xpZGVyOwogICAgfSwKICAgIHNjcmVlblNoYXJlOiBmdW5jdGlvbiBzY3JlZW5TaGFyZSgpIHsKICAgICAgdmFyIF90aGlzNSA9IHRoaXM7CgogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoIC8qI19fUFVSRV9fKi9yZWdlbmVyYXRvclJ1bnRpbWUubWFyayhmdW5jdGlvbiBfY2FsbGVlMygpIHsKICAgICAgICB2YXIgYmVmb3JlQ2xvc2U7CiAgICAgICAgcmV0dXJuIHJlZ2VuZXJhdG9yUnVudGltZS53cmFwKGZ1bmN0aW9uIF9jYWxsZWUzJChfY29udGV4dDMpIHsKICAgICAgICAgIHdoaWxlICgxKSB7CiAgICAgICAgICAgIHN3aXRjaCAoX2NvbnRleHQzLnByZXYgPSBfY29udGV4dDMubmV4dCkgewogICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIGlmICghX3RoaXM1LnNlc3Npb24uc2NyZWVuU2hhcmluZykgewogICAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDY7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIF90aGlzNS5zZXNzaW9uLnN0b3BTY3JlZW5TaGFyZSgpOwoKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdG9wU2NyZWVuU2hhcmUnLCBfdGhpczUuc2Vzc2lvbi52aWRlb011dGVkLCBfdGhpczUuc2Vzc2lvbi5hdWRpb011dGVkKTsKCiAgICAgICAgICAgICAgICBpZiAoX3RoaXM1LnNlc3Npb24udmlkZW9NdXRlZCAmJiBfdGhpczUuc2Vzc2lvbi5hdWRpb011dGVkKSB7CiAgICAgICAgICAgICAgICAgIF90aGlzNS5zZXNzaW9uLnN3aXRjaEF1ZGllbmNlKHRydWUpOwogICAgICAgICAgICAgICAgfSAvLyBjdXJyZW50V2luZG93LnNldElnbm9yZU1vdXNlRXZlbnRzKGZhbHNlKQoKCiAgICAgICAgICAgICAgICBfY29udGV4dDMubmV4dCA9IDE1OwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgIGlmICghaXNFbGVjdHJvbigpKSB7CiAgICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTE7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGJlZm9yZUNsb3NlID0gZnVuY3Rpb24gYmVmb3JlQ2xvc2UoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgLy8gV2hhdCBhIGdhbWJsZS4uLiA1MCUgY2hhbmNlIHRvIGNhbmNlbCBjbG9zaW5nCiAgICAgICAgICAgICAgICAgIGlmICghZXZlbnQucGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBpZiAoZXZlbnQucGFyYW1zLnNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSBldmVudC5wYXJhbXMuc291cmNlOwogICAgICAgICAgICAgICAgICAgIHZhciBkZXNrdG9wU2hhcmVPcHRpb25zID0gewogICAgICAgICAgICAgICAgICAgICAgc291cmNlSWQ6IHNvdXJjZS5pZCwKICAgICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAxMjgwLAogICAgICAgICAgICAgICAgICAgICAgbWF4V2lkdGg6IDEyODAsCiAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IDcyMCwKICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodDogNzIwCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKF90aGlzNS5zZXNzaW9uLmF1ZGllbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczUuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZShmYWxzZSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzNS5zZXNzaW9uLnN0YXJ0U2NyZWVuU2hhcmUoZGVza3RvcFNoYXJlT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBfdGhpczUuc2Vzc2lvbi5zdGFydFNjcmVlblNoYXJlKGRlc2t0b3BTaGFyZU9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgYXZlbmdpbmVraXRwcm94eS5lbWl0VG9NYWluKElwY0V2ZW50VHlwZS5TVEFSVF9TQ1JFRU5fU0hBUkUsIHt9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBfdGhpczUuJG1vZGFsLnNob3coU2NyZWVuT3JXaW5kb3dQaWNrZXIsIHt9LCB7CiAgICAgICAgICAgICAgICAgIHdpZHRoOiA4MDAsCiAgICAgICAgICAgICAgICAgIGhlaWdodDogNjAwLAogICAgICAgICAgICAgICAgICBuYW1lOiAnc2NyZWVuLXdpbmRvdy1waWNrZXItbW9kYWwnLAogICAgICAgICAgICAgICAgICBjbGlja1RvQ2xvc2U6IGZhbHNlCiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgIC8vICdiZWZvcmUtb3Blbic6IGJlZm9yZU9wZW4sCiAgICAgICAgICAgICAgICAgICdiZWZvcmUtY2xvc2UnOiBiZWZvcmVDbG9zZSAvLyAnY2xvc2VkJzogY2xvc2VkLAoKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIF9jb250ZXh0My5uZXh0ID0gMTU7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgICAgIGlmICghX3RoaXM1LnNlc3Npb24uYXVkaWVuY2UpIHsKICAgICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgX2NvbnRleHQzLm5leHQgPSAxNDsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpczUuc2Vzc2lvbi5zd2l0Y2hBdWRpZW5jZShmYWxzZSk7CgogICAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgICBfdGhpczUuc2Vzc2lvbi5zdGFydFNjcmVlblNoYXJlKHsKICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlOiAzMAogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICAgIHJldHVybiBfY29udGV4dDMuc3RvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSwgX2NhbGxlZTMpOwogICAgICB9KSkoKTsKICAgIH0sCiAgICAvLyDorr7nva7pn7PpopHovpPlh7rorr7lpIcKICAgIHNldEF1ZGlvT3V0cHV0RGV2aWNlSWQ6IGZ1bmN0aW9uIHNldEF1ZGlvT3V0cHV0RGV2aWNlSWQoZGV2aWNlSWQpIHsKICAgICAgdmFyIGF1ZGlvRWxzID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2F1ZGlvJyk7CgogICAgICB2YXIgX2l0ZXJhdG9yMyA9IF9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyKGF1ZGlvRWxzKSwKICAgICAgICAgIF9zdGVwMzsKCiAgICAgIHRyeSB7CiAgICAgICAgZm9yIChfaXRlcmF0b3IzLnMoKTsgIShfc3RlcDMgPSBfaXRlcmF0b3IzLm4oKSkuZG9uZTspIHsKICAgICAgICAgIHZhciBhdWRpb0VsID0gX3N0ZXAzLnZhbHVlOwogICAgICAgICAgYXVkaW9FbC5zZXRTaW5rSWQoZGV2aWNlSWQpOwogICAgICAgIH0KICAgICAgfSBjYXRjaCAoZXJyKSB7CiAgICAgICAgX2l0ZXJhdG9yMy5lKGVycik7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgX2l0ZXJhdG9yMy5mKCk7CiAgICAgIH0KCiAgICAgIHZhciB2aWRlb0VscyA9IHRoaXMuJGVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKCd2aWRlbycpOwoKICAgICAgdmFyIF9pdGVyYXRvcjQgPSBfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlcih2aWRlb0VscyksCiAgICAgICAgICBfc3RlcDQ7CgogICAgICB0cnkgewogICAgICAgIGZvciAoX2l0ZXJhdG9yNC5zKCk7ICEoX3N0ZXA0ID0gX2l0ZXJhdG9yNC5uKCkpLmRvbmU7KSB7CiAgICAgICAgICB2YXIgdmlkZW9FbCA9IF9zdGVwNC52YWx1ZTsKICAgICAgICAgIHZpZGVvRWwuc2V0U2lua0lkKGRldmljZUlkKTsKICAgICAgICB9CiAgICAgIH0gY2F0Y2ggKGVycikgewogICAgICAgIF9pdGVyYXRvcjQuZShlcnIpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIF9pdGVyYXRvcjQuZigpOwogICAgICB9CiAgICB9LAogICAgaGFuZHVwOiBmdW5jdGlvbiBoYW5kdXAoKSB7CiAgICAgIGNvbmZlcmVuY2VNYW5hZ2VyLmhhbmRVcCghY29uZmVyZW5jZU1hbmFnZXIuaXNIYW5kVXApOwogICAgfSwKICAgIHVzZXJOYW1lOiBmdW5jdGlvbiB1c2VyTmFtZSh1c2VyKSB7CiAgICAgIHZhciBuYW1lID0gJyc7CgogICAgICBpZiAodXNlci5ncm91cEFsaWFzKSB7CiAgICAgICAgbmFtZSA9IHVzZXIuZ3JvdXBBbGlhczsKICAgICAgfSBlbHNlIGlmICh1c2VyLmZyaWVuZEFsaWFzKSB7CiAgICAgICAgbmFtZSA9IHVzZXIuZnJpZW5kQWxpYXM7CiAgICAgIH0gZWxzZSBpZiAodXNlci5kaXNwbGF5TmFtZSkgewogICAgICAgIG5hbWUgPSB1c2VyLmRpc3BsYXlOYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIG5hbWUgPSB1c2VyLm5hbWU7CiAgICAgIH0KCiAgICAgIHJldHVybiBuYW1lOwogICAgfSwKICAgIHRpbWVzdGFtcEZvcm1hdDogZnVuY3Rpb24gdGltZXN0YW1wRm9ybWF0KHRpbWVzdGFtcCkgewogICAgICB0aW1lc3RhbXAgPSB+fih0aW1lc3RhbXAgLyAxMDAwKTsKICAgICAgdmFyIHN0ciA9ICcnOwogICAgICB2YXIgaG91ciA9IH5+KHRpbWVzdGFtcCAvIDM2MDApOwogICAgICBzdHIgPSBob3VyID4gMCA/IChob3VyIDwgMTAgPyAiMCIgOiAiIikgKyBob3VyICsgJzonIDogJyc7CiAgICAgIHZhciBtaW4gPSB+fih0aW1lc3RhbXAgJSAzNjAwIC8gNjApOwogICAgICBzdHIgKz0gKG1pbiA8IDEwID8gIjAiIDogIiIpICsgbWluICsgJzonOwogICAgICB2YXIgc2VjID0gfn4odGltZXN0YW1wICUgNjApOwogICAgICBzdHIgKz0gKHNlYyA8IDEwID8gIjAiIDogIiIpICsgc2VjOwogICAgICByZXR1cm4gc3RyOwogICAgfSwKICAgIC8vIFRPRE8g5Yig6Zmk77yM5Y+v5Lul55u05o6l55uR5ZCs55So5oi35L+h5oGv5Y+Y5YyW5LqGCiAgICByZWZyZXNoVXNlckluZm9zOiBmdW5jdGlvbiByZWZyZXNoVXNlckluZm9zKCkgewogICAgICB2YXIgX3RoaXM2ID0gdGhpczsKCiAgICAgIHZhciB0b1JlZnJlc2hVc2VycyA9IFtdOwogICAgICB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZvckVhY2goZnVuY3Rpb24gKHB1KSB7CiAgICAgICAgaWYgKCFwdS51cGRhdGVEdCkgewogICAgICAgICAgdG9SZWZyZXNoVXNlcnMucHVzaChwdS51aWQpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBpZiAodG9SZWZyZXNoVXNlcnMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCd0byByZWZyZXNoVXNlcnMnLCB0b1JlZnJlc2hVc2Vycyk7CiAgICAgICAgdmFyIHVzZXJJbmZvcyA9IHdmYy5nZXRVc2VySW5mb3ModG9SZWZyZXNoVXNlcnMsICcnKTsKICAgICAgICB1c2VySW5mb3MuZm9yRWFjaChmdW5jdGlvbiAodSkgewogICAgICAgICAgdmFyIGluZGV4ID0gX3RoaXM2LnBhcnRpY2lwYW50VXNlckluZm9zLmZpbmRJbmRleChmdW5jdGlvbiAocCkgewogICAgICAgICAgICByZXR1cm4gcC51aWQgPT09IHUudWlkOwogICAgICAgICAgfSk7CgogICAgICAgICAgaWYgKHUudXBkYXRlRHQgJiYgaW5kZXggPiAtMSkgewogICAgICAgICAgICB2YXIgb3UgPSBfdGhpczYucGFydGljaXBhbnRVc2VySW5mb3NbaW5kZXhdOwogICAgICAgICAgICB1Ll9zdHJlYW0gPSBvdS5fc3RyZWFtOwogICAgICAgICAgICB1Ll9pc0F1ZGllbmNlID0gb3UuX2lzQXVkaWVuY2U7CiAgICAgICAgICAgIHUuX2lzSG9zdCA9IG91Ll9pc0hvc3Q7CiAgICAgICAgICAgIHUuX2lzVmlkZW9NdXRlZCA9IG91Ll9pc1ZpZGVvTXV0ZWQ7CiAgICAgICAgICAgIHUuX2lzQXVkaW9NdXRlZCA9IG91Ll9pc0F1ZGlvTXV0ZWQ7CiAgICAgICAgICAgIHUuX3ZvbHVtZSA9IG91Ll92b2x1bWU7IC8vIEZZSTogaHR0cHM6Ly92Mi52dWVqcy5vcmcvdjIvZ3VpZGUvcmVhY3Rpdml0eSNDaGFuZ2UtRGV0ZWN0aW9uLUNhdmVhdHMKCiAgICAgICAgICAgIF90aGlzNi5wYXJ0aWNpcGFudFVzZXJJbmZvcy5zcGxpY2UoaW5kZXgsIDEsIHUpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9LAogICAgcmVqb2luQ29uZmVyZW5jZTogZnVuY3Rpb24gcmVqb2luQ29uZmVyZW5jZSgpIHsKICAgICAgYXZlbmdpbmVraXQuam9pbkNvbmZlcmVuY2UoewogICAgICAgIGNhbGxJZDogdGhpcy5zZXNzaW9uLmNhbGxJZCwKICAgICAgICBwaW46IHRoaXMuc2Vzc2lvbi5waW4sCiAgICAgICAgaG9zdDogdGhpcy5zZXNzaW9uLmhvc3QsCiAgICAgICAgdGlsZTogdGhpcy5zZXNzaW9uLnRpdGxlLAogICAgICAgIGRlc2M6IHRoaXMuc2Vzc2lvbi5kZXNjLAogICAgICAgIGF1ZGlvT25seTogdGhpcy5zZXNzaW9uLmF1ZGlvT25seSwKICAgICAgICBhdWRpZW5jZTogdGhpcy5zZXNzaW9uLmF1ZGllbmNlLAogICAgICAgIGFkdmFuY2U6IHRoaXMuc2Vzc2lvbi5hZHZhbmNlLAogICAgICAgIG11dGVWaWRlbzogdGhpcy5zZXNzaW9uLnZpZGVvTXV0ZWQsCiAgICAgICAgbXV0ZUF1ZGlvOiB0aGlzLnNlc3Npb24uYXVkaW9NdXRlZCwKICAgICAgICBleHRyYTogdGhpcy5zZXNzaW9uLmV4dHJhLAogICAgICAgIGNhbGxFeHRyYTogdGhpcy5zZXNzaW9uLmNhbGxFeHRyYSwKICAgICAgICBzZWxmVXNlckluZm86IHRoaXMuc2VsZlVzZXJJbmZvCiAgICAgIH0pOwogICAgICB0aGlzLmVuZFJlYXNvbiA9IHVuZGVmaW5lZDsKICAgIH0sCiAgICBwcmVQYWdlOiBmdW5jdGlvbiBwcmVQYWdlKCkgewogICAgICB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4LS07CgogICAgICBpZiAodGhpcy5jdXJyZW50R3JpZFBhZ2VJbmRleCA8IDApIHsKICAgICAgICB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ID0gTWF0aC5jZWlsKHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoIC8gdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UpIC0gMTsKICAgICAgfQogICAgfSwKICAgIG5leHRQYWdlOiBmdW5jdGlvbiBuZXh0UGFnZSgpIHsKICAgICAgaWYgKHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoIC8gdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UgPiB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ICsgMSkgewogICAgICAgIHRoaXMuY3VycmVudEdyaWRQYWdlSW5kZXgrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ID0gMDsKICAgICAgfQogICAgfSwKICAgIHVwZGF0ZUNvdW50UGVyUGFnZTogZnVuY3Rpb24gdXBkYXRlQ291bnRQZXJQYWdlKGNvdW50KSB7CiAgICAgIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlID0gY291bnQ7CiAgICB9LAogICAgc2V0Q3VycmVudExheW91dDogZnVuY3Rpb24gc2V0Q3VycmVudExheW91dChsYXlvdXQpIHsKICAgICAgdmFyIF90aGlzNyA9IHRoaXM7CgogICAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0ID09PSBsYXlvdXQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0gLy8g5ryU6K6y6ICF5biD5bGACgoKICAgICAgaWYgKGxheW91dCA9PT0gMSkgewogICAgICAgIC8vIOa8lOiusuiAheW4g+WxgO+8jOWIh+aNouS4uuWwj+a1ge+8jOeEtuWQjueEpueCueeUqOaIt+WIh+aNouS4uuWkp+a1gQogICAgICAgIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MuZm9yRWFjaChmdW5jdGlvbiAodSkgewogICAgICAgICAgaWYgKHUudWlkICE9PSBfdGhpczcuc2VsZlVzZXJJbmZvLnVpZCAmJiAhdS5faXNBdWRpZW5jZSAmJiAhdS5faXNWaWRlb011dGVkKSB7CiAgICAgICAgICAgIF90aGlzNy5zZXNzaW9uLnNldFBhcnRpY2lwYW50VmlkZW9UeXBlKHUudWlkLCB1Ll9pc1NjcmVlblNoYXJpbmcsIFZpZGVvVHlwZS5TTUFMTF9TVFJFQU0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIC8v5a6r5qC85biD5bGA77yMIOW9k+WJjemhteWIh+aNouS4uuWkp+a1ge+8jOacquaYvuekuueahO+8jOWPlua2iOiuoumYhe+8jOeUsSBjdXJyZW50UGFnZVBhcnRpY2lwYW50cyDlia/kvZznlKjop6blj5EKICAgICAgICB0aGlzLmN1cnJlbnRHcmlkUGFnZUluZGV4ID0gMDsKICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyID0gbnVsbDsKICAgICAgfQoKICAgICAgdGhpcy5jdXJyZW50TGF5b3V0ID0gbGF5b3V0OwogICAgICB0aGlzLnNob3dDaG9vc2VMYXlvdXRWaWV3ID0gZmFsc2U7CiAgICB9LAogICAgdG9nZ2xlUGFydGljaXBhbnRMaXN0VmlkZW9WaWV3OiBmdW5jdGlvbiB0b2dnbGVQYXJ0aWNpcGFudExpc3RWaWRlb1ZpZXcoKSB7CiAgICAgIHRoaXMuaGlkZUZvY3VzTGF5b3V0UGFydGljaXBhbnRMaXN0VmlkZW9WaWV3ID0gIXRoaXMuaGlkZUZvY3VzTGF5b3V0UGFydGljaXBhbnRMaXN0VmlkZW9WaWV3OwogICAgfSwKICAgIGhpZGVDb25mZXJlbmNlU2ltcGxlSW5mb1ZpZXc6IGZ1bmN0aW9uIGhpZGVDb25mZXJlbmNlU2ltcGxlSW5mb1ZpZXcoZXZlbnQpIHsKICAgICAgaWYgKGV2ZW50LnRhcmdldC5pZCA9PT0gJ2luZm8taWNvbicpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRoaXMuc2hvd0NvbmZlcmVuY2VTaW1wbGVJbmZvVmlldyA9IGZhbHNlOwogICAgfSwKICAgIGhpZGVDaG9vc2VMYXlvdXRWaWV3OiBmdW5jdGlvbiBoaWRlQ2hvb3NlTGF5b3V0VmlldyhldmVudCkgewogICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAnZ3JpZC1pY29uJykgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5zaG93Q2hvb3NlTGF5b3V0VmlldyA9IGZhbHNlOwogICAgfQogIH0sCiAgY29tcHV0ZWQ6IHsKICAgIGR1cmF0aW9uOiBmdW5jdGlvbiBkdXJhdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY3VycmVudFRpbWVzdGFtcCA8PSAwKSB7CiAgICAgICAgcmV0dXJuICcwMDowMCc7CiAgICAgIH0KCiAgICAgIHZhciBlc2NhcGVNaWxsaXMgPSB0aGlzLmN1cnJlbnRUaW1lc3RhbXAgLSB0aGlzLnN0YXJ0VGltZXN0YW1wOwogICAgICByZXR1cm4gdGhpcy50aW1lc3RhbXBGb3JtYXQoZXNjYXBlTWlsbGlzKTsKICAgIH0sCiAgICBzcGVha2luZ1VzZXJOYW1lOiBmdW5jdGlvbiBzcGVha2luZ1VzZXJOYW1lKCkgewogICAgICB2YXIgbWF4Vm9sdW1lID0gdGhpcy5zZWxmVXNlckluZm8uX3ZvbHVtZTsKICAgICAgdmFyIHNwZWFraW5nVXNlckluZm8gPSB0aGlzLnNlbGZVc2VySW5mbzsKICAgICAgdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5mb3JFYWNoKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgaWYgKHUuX3ZvbHVtZSA+IG1heFZvbHVtZSkgewogICAgICAgICAgc3BlYWtpbmdVc2VySW5mbyA9IHU7CiAgICAgICAgICBtYXhWb2x1bWUgPSB1Ll92b2x1bWU7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGlmICghbWF4Vm9sdW1lKSB7CiAgICAgICAgcmV0dXJuICcnOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy51c2VyTmFtZShzcGVha2luZ1VzZXJJbmZvKTsKICAgIH0sCiAgICBjdXJyZW50UGFnZVBhcnRpY2lwYW50czogZnVuY3Rpb24gY3VycmVudFBhZ2VQYXJ0aWNpcGFudHMoKSB7CiAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KCiAgICAgIHZhciBmb2N1c1VzZXIgPSB0aGlzLmNvbmZlcmVuY2VGb2N1c1VzZXI7IC8vIHNvcnQgbm90IGluIHBsYWNl77yM6YG/5YWN5Ymv5L2c55SoCgogICAgICB2YXIgc29ydGVkUGFydGljaXBhbnRVc2VySW5mb3MgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcykuc29ydChmdW5jdGlvbiAobzEsIG8yKSB7CiAgICAgICAgaWYgKGZvY3VzVXNlcikgewogICAgICAgICAgaWYgKG8xLnVpZCA9PT0gZm9jdXNVc2VyLnVpZCAmJiBvMS5faXNTY3JlZW5TaGFyaW5nID09PSBmb2N1c1VzZXIuX2lzU2NyZWVuU2hhcmluZykgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG8yLnVpZCA9PT0gZm9jdXNVc2VyLnVpZCAmJiBvMi5faXNTY3JlZW5TaGFyaW5nID09PSBmb2N1c1VzZXIuX2lzU2NyZWVuU2hhcmluZykgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvMS5faXNBdWRpZW5jZSAmJiAhbzIuX2lzQXVkaWVuY2UpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0gZWxzZSBpZiAoIW8xLl9pc0F1ZGllbmNlICYmIG8yLl9pc0F1ZGllbmNlKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfSBlbHNlIGlmIChvMS5faXNBdWRpZW5jZSAmJiBvMi5faXNBdWRpZW5jZSkgewogICAgICAgICAgcmV0dXJuIG8xLnVpZC5sb2NhbGVDb21wYXJlKG8yLnVpZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChvMS5faXNTY3JlZW5TaGFyaW5nICYmICFvMi5faXNTY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIW8xLl9pc1NjcmVlblNoYXJpbmcgJiYgbzIuX2lzU2NyZWVuU2hhcmluZykgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIW8xLl9pc1ZpZGVvTXV0ZWQgJiYgbzIuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG8xLl9pc1ZpZGVvTXV0ZWQgJiYgIW8yLl9pc1ZpZGVvTXV0ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG8xLnVpZC5sb2NhbGVDb21wYXJlKG8yLnVpZCk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHZhciBzdGFydCA9IHRoaXMuY3VycmVudEdyaWRQYWdlSW5kZXggKiB0aGlzLnBhcnRpY2lwYW50Q291bnRQZXJHcmlkUGFnZTsKICAgICAgdmFyIGVuZCA9IHN0YXJ0ICsgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UgPiBzb3J0ZWRQYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGggPyBzb3J0ZWRQYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGggOiBzdGFydCArIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlOyAvLyBzaWRlIGVmZmVjdAogICAgICAvLyBUT0RPIOS8mOWMlgogICAgICAvLyDnm7jpgrvpobXliIfmjaLml7bvvIzkuI3og73nkIbop6Plj5bmtojorqLpmIXvvIzlj6/og73ov5jliIfmjaLlm57ljrvvvIzpgqPmoLfnmoTor53vvIzlsLHkvJrmnInkuIDlsI/mrrXml7bpl7TvvIzkuI3mmL7npLrop4bpopHmtYEKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc29ydGVkUGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdSA9IHNvcnRlZFBhcnRpY2lwYW50VXNlckluZm9zW2ldOwoKICAgICAgICBpZiAodS51aWQgPT09IHRoaXMuc2VsZlVzZXJJbmZvLnVpZCB8fCB1Ll9pc0F1ZGllbmNlIHx8IHUuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA+PSBzdGFydCAmJiBpIDwgZW5kKSB7CiAgICAgICAgICBjb25zb2xlLmxvZygnc2V0IHZpZGVvIHR5cGUgYmlnJywgdS51aWQpOwogICAgICAgICAgdGhpcy5zZXNzaW9uLnNldFBhcnRpY2lwYW50VmlkZW9UeXBlKHUudWlkLCB1Ll9pc1NjcmVlblNoYXJpbmcsIFZpZGVvVHlwZS5CSUdfU1RSRUFNKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2coJ3NldCB2aWRlbyB0eXBlIG5vbmUnLCB1LnVpZCk7CiAgICAgICAgICB0aGlzLnNlc3Npb24uc2V0UGFydGljaXBhbnRWaWRlb1R5cGUodS51aWQsIHUuX2lzU2NyZWVuU2hhcmluZywgVmlkZW9UeXBlLk5PTkUpOwogICAgICAgIH0KICAgICAgfSAvLyBzaWRlIGVmZmVjdAoKCiAgICAgIHJldHVybiBzb3J0ZWRQYXJ0aWNpcGFudFVzZXJJbmZvcy5zbGljZShzdGFydCwgZW5kKTsKICAgIH0sCiAgICBncmlkUGFnZUNvdW50OiBmdW5jdGlvbiBncmlkUGFnZUNvdW50KCkgewogICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MubGVuZ3RoIC8gdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2UpOwogICAgfSwKICAgIGNvbmZlcmVuY2VGb2N1c1VzZXI6IGZ1bmN0aW9uIGNvbmZlcmVuY2VGb2N1c1VzZXIoKSB7CiAgICAgIHZhciBmb2N1cyA9IGNvbmZlcmVuY2VNYW5hZ2VyLmNvbmZlcmVuY2VJbmZvLmZvY3VzOwoKICAgICAgaWYgKCFmb2N1cykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICB2YXIgZm9jdXNVc2VyID0gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5maW5kKGZ1bmN0aW9uICh1KSB7CiAgICAgICAgcmV0dXJuIHUudWlkID09PSBmb2N1cyAmJiB1Ll9pc1NjcmVlblNoYXJpbmcgPT09IHRydWU7CiAgICAgIH0pOwoKICAgICAgaWYgKCFmb2N1c1VzZXIpIHsKICAgICAgICBmb2N1c1VzZXIgPSB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbmQoZnVuY3Rpb24gKHUpIHsKICAgICAgICAgIHJldHVybiB1LnVpZCA9PT0gZm9jdXM7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmb2N1c1VzZXI7CiAgICB9LAogICAgY29uZmVyZW5jZUxvY2FsRm9jdXNVc2VyOiBmdW5jdGlvbiBjb25mZXJlbmNlTG9jYWxGb2N1c1VzZXIoKSB7CiAgICAgIHJldHVybiBjb25mZXJlbmNlTWFuYWdlci5sb2NhbEZvY3VzVXNlcjsKICAgIH0sCiAgICAvLyDku6XnlKjmiLfmiYvliqjpgInmi6nnmoTkuLrlh4YKICAgIGNvbXB1dGVkQ3VycmVudExheW91dDogZnVuY3Rpb24gY29tcHV0ZWRDdXJyZW50TGF5b3V0KCkgewogICAgICBpZiAodGhpcy5jdXJyZW50TGF5b3V0ID09PSAtMSAmJiB0aGlzLmNvbmZlcmVuY2VGb2N1c1VzZXIpIHsKICAgICAgICByZXR1cm4gMTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuY3VycmVudExheW91dDsKICAgIH0sCiAgICAvLyBUT0RPIOWPr+S7pee8k+WtmOWIsCBjb25mZXJlbmNlTWFuYWdlciDph4zpnaIKICAgIGNvbXB1dGVkRm9jdXNWaWRlb1BhcnRpY2lwYW50OiBmdW5jdGlvbiBjb21wdXRlZEZvY3VzVmlkZW9QYXJ0aWNpcGFudCgpIHsKICAgICAgaWYgKHRoaXMuY3VycmVudExheW91dCA9PT0gMCkgewogICAgICAgIGNvbnNvbGUubG9nKCdjb21wdXRlZFNwZWFraW5nUGFydGljaXBhbnQgbnVsbCcpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICB2YXIgc3A7CgogICAgICBpZiAodGhpcy5jb25mZXJlbmNlRm9jdXNVc2VyICYmICF0aGlzLmNvbmZlcmVuY2VGb2N1c1VzZXIuX2lzVmlkZW9NdXRlZCkgewogICAgICAgIHNwID0gdGhpcy5jb25mZXJlbmNlRm9jdXNVc2VyOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmVyZW5jZUxvY2FsRm9jdXNVc2VyICYmICF0aGlzLmNvbmZlcmVuY2VMb2NhbEZvY3VzVXNlci5faXNWaWRlb011dGVkKSB7CiAgICAgICAgc3AgPSB0aGlzLmNvbmZlcmVuY2VMb2NhbEZvY3VzVXNlcjsKICAgICAgfSBlbHNlIGlmICh0aGlzLnNwZWFraW5nVmlkZW9QYXJ0aWNpcGFudCkgewogICAgICAgIHNwID0gdGhpcy5zcGVha2luZ1ZpZGVvUGFydGljaXBhbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3AgPSB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbmQoZnVuY3Rpb24gKHUpIHsKICAgICAgICAgIHJldHVybiAhdS5faXNBdWRpZW5jZSAmJiAhdS5faXNWaWRlb011dGVkICYmIHUuX2lzU2NyZWVuU2hhcmluZyA9PT0gdHJ1ZTsKICAgICAgICB9KTsKCiAgICAgICAgaWYgKCFzcCkgewogICAgICAgICAgc3AgPSB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmZpbmQoZnVuY3Rpb24gKHUpIHsKICAgICAgICAgICAgcmV0dXJuICF1Ll9pc0F1ZGllbmNlICYmICF1Ll9pc1ZpZGVvTXV0ZWQ7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyKSB7CiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFBhcnRpY2lwYW50VmlkZW9UeXBlKGNvbmZlcmVuY2VNYW5hZ2VyLmN1cnJlbnRGb2N1c1VzZXIudWlkLCBjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyLl9pc1NjcmVlblNoYXJpbmcsIFZpZGVvVHlwZS5TTUFMTF9TVFJFQU0pOwogICAgICB9CgogICAgICBpZiAoc3ApIHsKICAgICAgICBjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyID0gc3A7CiAgICAgICAgdGhpcy5zZXNzaW9uLnNldFBhcnRpY2lwYW50VmlkZW9UeXBlKGNvbmZlcmVuY2VNYW5hZ2VyLmN1cnJlbnRGb2N1c1VzZXIudWlkLCBjb25mZXJlbmNlTWFuYWdlci5jdXJyZW50Rm9jdXNVc2VyLl9pc1NjcmVlblNoYXJpbmcsIFZpZGVvVHlwZS5CSUdfU1RSRUFNKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodGhpcy5zZXNzaW9uLnNjcmVlblNoYXJpbmcpIHsKICAgICAgICAgIHNwID0gdGhpcy5zZWxmVXNlckluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zb2xlLmxvZygnY29tcHV0ZWRTcGVha2luZ1BhcnRpY2lwYW50Jywgc3ApOwogICAgICByZXR1cm4gc3A7CiAgICB9CiAgfSwKICB3YXRjaDogewogICAgcGFydGljaXBhbnRVc2VySW5mb3M6IHsKICAgICAgZGVlcDogdHJ1ZSwKICAgICAgaGFuZGxlcjogZnVuY3Rpb24gaGFuZGxlcihpbmZvcykgewogICAgICAgIHZhciBhdWRpb09ubHkgPSB0cnVlOyAvLyBjb25zb2xlLmxvZygncGFydGljaXBhbnRVc2VySW5mb3MnLCB0aGlzLnNlc3Npb24uc2NyZWVuU2hhcmluZyk7CgogICAgICAgIGlmICh0aGlzLnNlc3Npb24uc2NyZWVuU2hhcmluZykgewogICAgICAgICAgYXVkaW9Pbmx5ID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgdSA9IHRoaXMucGFydGljaXBhbnRVc2VySW5mb3NbaV07CgogICAgICAgICAgICBpZiAoIXUuX2lzQXVkaWVuY2UgJiYgIXUuX2lzVmlkZW9NdXRlZCkgewogICAgICAgICAgICAgIGF1ZGlvT25seSA9IGZhbHNlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLmF1ZGlvT25seSA9IGF1ZGlvT25seTsgLy8gbXV0ZSBzZWxmIGF1ZGlvCgogICAgICAgIHZhciByZWYgPSB0aGlzLiRyZWZzW3RoaXMuc2VsZlVzZXJJbmZvLnVpZCArICctYXVkaW8nXTsKCiAgICAgICAgaWYgKHJlZiAmJiByZWYubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy4kcmVmc1t0aGlzLnNlbGZVc2VySW5mby51aWQgKyAnLWF1ZGlvJ11bMF0ubXV0ZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuYXVkaW9Pbmx5KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfSAvLyDlrqvmoLzluIPlsYAKCgogICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDApIHsKICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuY3VycmVudEdyaWRQYWdlSW5kZXggKiB0aGlzLnBhcnRpY2lwYW50Q291bnRQZXJHcmlkUGFnZTsKICAgICAgICAgIHZhciBlbmQgPSBzdGFydCArIHRoaXMucGFydGljaXBhbnRDb3VudFBlckdyaWRQYWdlID4gdGhpcy5wYXJ0aWNpcGFudFVzZXJJbmZvcy5sZW5ndGggPyB0aGlzLnBhcnRpY2lwYW50VXNlckluZm9zLmxlbmd0aCA6IHN0YXJ0ICsgdGhpcy5wYXJ0aWNpcGFudENvdW50UGVyR3JpZFBhZ2U7CiAgICAgICAgICB2YXIgY291bnQgPSBlbmQgLSBzdGFydDsKICAgICAgICAgIHZhciB3aWR0aCA9ICcxMDAlJzsKICAgICAgICAgIHZhciBoZWlnaHQgPSAnMTAwJSc7CgogICAgICAgICAgaWYgKGNvdW50IDw9IDEpIHsKICAgICAgICAgICAgd2lkdGggPSAnMTAwJSc7CiAgICAgICAgICAgIGhlaWdodCA9ICcxMDAlJzsKICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gNCkgewogICAgICAgICAgICB3aWR0aCA9ICc1MCUnOwogICAgICAgICAgICBoZWlnaHQgPSAnNDUlJzsKICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPD0gOSkgewogICAgICAgICAgICB3aWR0aCA9ICczMyUnOwogICAgICAgICAgICBoZWlnaHQgPSAnMzMlJzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIG1heCAxNgogICAgICAgICAgICB3aWR0aCA9ICcyNSUnOwogICAgICAgICAgICBoZWlnaHQgPSAnMjUlJzsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAodGhpcy4kcmVmcy5yb290Q29udGFpbmVyKSB7CiAgICAgICAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1wYXJ0aWNpcGFudC12aWRlby1pdGVtLXdpZHRoJywgd2lkdGgpOwogICAgICAgICAgICB0aGlzLiRyZWZzLnJvb3RDb250YWluZXIuc3R5bGUuc2V0UHJvcGVydHkoJy0tcGFydGljaXBhbnQtdmlkZW8taXRlbS1oZWlnaHQnLCBoZWlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGN1cnJlbnRQYWdlUGFydGljaXBhbnRzOiB7CiAgICAgIGRlZXA6IHRydWUsCiAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uIGhhbmRsZXIoaW5mb3MpIHsKICAgICAgICBpZiAodGhpcy5hdWRpb09ubHkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLmN1cnJlbnRMYXlvdXQgPT09IDApIHsKICAgICAgICAgIHZhciBjb3VudCA9IHRoaXMuY3VycmVudFBhZ2VQYXJ0aWNpcGFudHMubGVuZ3RoOwogICAgICAgICAgdmFyIHdpZHRoID0gJzEwMCUnOwogICAgICAgICAgdmFyIGhlaWdodCA9ICcxMDAlJzsKCiAgICAgICAgICBpZiAoY291bnQgPD0gMSkgewogICAgICAgICAgICB3aWR0aCA9ICcxMDAlJzsKICAgICAgICAgICAgaGVpZ2h0ID0gJzEwMCUnOwogICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSA0KSB7CiAgICAgICAgICAgIHdpZHRoID0gJzUwJSc7CiAgICAgICAgICAgIGhlaWdodCA9ICc0NSUnOwogICAgICAgICAgfSBlbHNlIGlmIChjb3VudCA8PSA5KSB7CiAgICAgICAgICAgIHdpZHRoID0gJzMzJSc7CiAgICAgICAgICAgIGhlaWdodCA9ICczMyUnOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gbWF4IDE2CiAgICAgICAgICAgIHdpZHRoID0gJzI1JSc7CiAgICAgICAgICAgIGhlaWdodCA9ICcyNSUnOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICh0aGlzLiRyZWZzLnJvb3RDb250YWluZXIpIHsKICAgICAgICAgICAgdGhpcy4kcmVmcy5yb290Q29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KCctLXBhcnRpY2lwYW50LXZpZGVvLWl0ZW0td2lkdGgnLCB3aWR0aCk7CiAgICAgICAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1wYXJ0aWNpcGFudC12aWRlby1pdGVtLWhlaWdodCcsIGhlaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSwKICBkaXJlY3RpdmVzOiB7CiAgICBDbGlja091dHNpZGU6IENsaWNrT3V0c2lkZQogIH0sCiAgY3JlYXRlZDogZnVuY3Rpb24gY3JlYXRlZCgpIHsKICAgIHZhciBfdGhpczggPSB0aGlzOwoKICAgIGRvY3VtZW50LnRpdGxlID0gJ+WcqOe6v+S8muiuric7CiAgICBjb25mZXJlbmNlTWFuYWdlci5zZXRWdWVJbnN0YW5jZSh0aGlzKTsKICAgIHRoaXMucmVmcmVzaFVzZXJJbmZvSW50ZXJuYWwgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7CiAgICAgIF90aGlzOC5yZWZyZXNoVXNlckluZm9zKCk7CiAgICB9LCAzICogMTAwMCk7CiAgICB0aGlzLiRldmVudEJ1cy4kb24oJ211dGVWaWRlbycsIGZ1bmN0aW9uIChtdXRlKSB7CiAgICAgIGlmIChfdGhpczguc2Vzc2lvbi52aWRlb011dGVkICE9PSBtdXRlKSB7CiAgICAgICAgdmFyIGVuYWJsZSA9IF90aGlzOC5zZXNzaW9uLnZpZGVvTXV0ZWQgPyB0cnVlIDogZmFsc2U7CgogICAgICAgIF90aGlzOC5lbmFibGVWaWRlbyhlbmFibGUpOwogICAgICB9CiAgICB9KTsKICAgIHRoaXMuJGV2ZW50QnVzLiRvbignbXV0ZUF1ZGlvJywgZnVuY3Rpb24gKG11dGUpIHsKICAgICAgaWYgKF90aGlzOC5zZXNzaW9uLmF1ZGlvTXV0ZWQgIT09IG11dGUpIHsKICAgICAgICB2YXIgZW5hYmxlID0gX3RoaXM4LnNlc3Npb24uYXVkaW9NdXRlZCA/IHRydWUgOiBmYWxzZTsKCiAgICAgICAgX3RoaXM4LmVuYWJsZUF1ZGlvKGVuYWJsZSk7CiAgICAgIH0KICAgIH0pOwogIH0sCiAgbW91bnRlZDogZnVuY3Rpb24gbW91bnRlZCgpIHsKICAgIHZhciBfdGhpczkgPSB0aGlzOwoKICAgIHRoaXMuc2V0dXBTZXNzaW9uQ2FsbGJhY2soKTsKCiAgICBpZiAoaXNFbGVjdHJvbigpKSB7CiAgICAgIC8vCiAgICAgIC8vIHRoaXMuJG9uKCdzdG9wLXNjcmVlbi1zaGFyZScsICgpID0+IHsKICAgICAgLy8gICAgIHRoaXMuc2Vzc2lvbi5zdG9wU2NyZWVuU2hhcmUoKTsKICAgICAgLy8gICAgIHRoaXMuJGZvcmNlVXBkYXRlKCk7CiAgICAgIC8vIH0pCiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICBpZiAoIV90aGlzOS5zZXNzaW9uIHx8ICFfdGhpczkuc2Vzc2lvbi5zY3JlZW5TaGFyaW5nKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmlkID09PSAibWFpbi1jb250ZW50LWNvbnRhaW5lciIpIHsKICAgICAgICAgIGN1cnJlbnRXaW5kb3cuc2V0SWdub3JlTW91c2VFdmVudHModHJ1ZSwgewogICAgICAgICAgICBmb3J3YXJkOiB0cnVlCiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFdpbmRvdy5zZXRJZ25vcmVNb3VzZUV2ZW50cyhmYWxzZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICBjdXJyZW50V2luZG93LnNldElnbm9yZU1vdXNlRXZlbnRzKGZhbHNlKTsKICAgICAgfSk7CiAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb25mZXJlbmNlLWNvbnRhaW5lci1tYXJnaW4tdG9wJywgJzMwcHgnKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuJHJlZnMucm9vdENvbnRhaW5lci5zdHlsZS5zZXRQcm9wZXJ0eSgnLS1jb25mZXJlbmNlLWNvbnRhaW5lci1tYXJnaW4tdG9wJywgJzBweCcpOwogICAgfQogIH0sCiAgZGVzdHJveWVkOiBmdW5jdGlvbiBkZXN0cm95ZWQoKSB7CiAgICB2YXIgX3RoaXMxMCA9IHRoaXM7CgogICAgLy8gcmVzZXQKICAgIHRoaXMuJHNldCh0aGlzLnNlbGZVc2VySW5mbywgJ19zdHJlYW0nLCBudWxsKTsKICAgIHRoaXMucGFydGljaXBhbnRVc2VySW5mb3MuZm9yRWFjaChmdW5jdGlvbiAobSkgewogICAgICByZXR1cm4gX3RoaXMxMC4kc2V0KG0sICJfc3RyZWFtIiwgbnVsbCk7CiAgICB9KTsKICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZWZyZXNoVXNlckluZm9JbnRlcm5hbCk7CiAgICB0aGlzLiRldmVudEJ1cy4kb2ZmKCdtdXRlVmlkZW8nKTsKICAgIHRoaXMuJGV2ZW50QnVzLiRvZmYoJ211dGVBdWRpbycpOwogICAgdGhpcy5jb25mZXJlbmNlTWFuYWdlci5kZXN0cm95KCk7CiAgfQp9Ow=="},null]}