{"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\\EipSubDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSubDialog.vue","mtime":1733309211891},{"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},{"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:aW1wb3J0IF9yZWFkT25seUVycm9yIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWFkT25seUVycm9yLmpzIjsKaW1wb3J0IF90b0NvbnN1bWFibGVBcnJheSBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vdG9Db25zdW1hYmxlQXJyYXkuanMiOwppbXBvcnQgX29iamVjdFNwcmVhZCBmcm9tICJEOi9qZW5raW5zL3dvcmtzcGFjZS9kYXRhU2hhcmUtZnZ1ZS9ub2RlX21vZHVsZXMvQGJhYmVsL3J1bnRpbWUvaGVscGVycy9lc20vb2JqZWN0U3ByZWFkMi5qcyI7CmltcG9ydCBfcmVnZW5lcmF0b3JSdW50aW1lIGZyb20gIkQ6L2plbmtpbnMvd29ya3NwYWNlL2RhdGFTaGFyZS1mdnVlL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL2VzbS9yZWdlbmVyYXRvclJ1bnRpbWUuanMiOwppbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSAiRDovamVua2lucy93b3Jrc3BhY2UvZGF0YVNoYXJlLWZ2dWUvbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2FzeW5jVG9HZW5lcmF0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5lcnJvci5jYXVzZS5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlci5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LnB1c2guanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zcGxpY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5mdW5jdGlvbi5uYW1lLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuaXRlcmF0b3IuY29uc3RydWN0b3IuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5maWx0ZXIuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5pdGVyYXRvci5mb3ItZWFjaC5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLmpzb24uc3RyaW5naWZ5LmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMub2JqZWN0LmtleXMuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmNvbnN0cnVjdG9yLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMucmVnZXhwLmRvdC1hbGwuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYy5qcyI7CmltcG9ydCAiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC5zdGlja3kuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAudG8tc3RyaW5nLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLnJlcGxhY2UuanMiOwppbXBvcnQgImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuc2VhcmNoLmpzIjsKaW1wb3J0ICJjb3JlLWpzL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5mb3ItZWFjaC5qcyI7Ci8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCi8vCgppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gInZ1ZXgiOwppbXBvcnQgdXRpbHMgZnJvbSAiQC91dGlscy5qcyI7CmltcG9ydCBob3RlbnRVaVV0aWxzIGZyb20gIkAvaG90ZW50LXVpLXV0aWwuanMiOwppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAiZWxlbWVudC11aSI7CmltcG9ydCByZXEgZnJvbSAiQC9yZXF1ZXN0LmpzIjsKaW1wb3J0IHN1Yl9waW9fbWl4aW4gZnJvbSAiQC9zdWItcGVybWlzc2lvbi1taXhpbi5qcyI7CmltcG9ydCBFaXBUYWcgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSI7CmltcG9ydCBFaXBTZWxlY3REaWEgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwU2VsZWN0RGlhLnZ1ZSI7CmV4cG9ydCBkZWZhdWx0IHsKICBjb21wb25lbnRzOiB7CiAgICBFaXBUYWc6IEVpcFRhZywKICAgIEVpcFNlbGVjdERpYTogRWlwU2VsZWN0RGlhCiAgfSwKICBuYW1lOiAiZWlwLWRpYWxvZyIsCiAgcHJvcHM6IFsidmFsaWRhdGUiLCAidmFsdWUiLCAibmFtZSIsICJwZXJtaXNzaW9uIiwgImF0dGVyIiwgInNpbmdsZSIsICJzZWxlY3RvcmNvbmZpZyIsICJjdXN0ZGlhbG9nIiwgInBsYWNlaG9sZGVyIiwgInRvb2x0aXBwbGFjZW1lbnQiLCAnaW5pdEZpbGxEYXRhJywgJ2luaXRGaWxsRGF0YVR5cGUnLCAncmVsYXRpb24nLCAnbWF4Um93J10sCiAgbWl4aW5zOiBbc3ViX3Bpb19taXhpbl0sCiAgLy/mt7flhaXmlrnlvI/lvJXlhaXooajljZXnu4Tku7bkuK3lhazlhbHlsZ7mgKfvvIzlpITnkIblrZDooajjgIHlrZnooajooYzlhoXogZTliqjvvIjliIfpnaLkv67mlLlwZXJtaXNzaW9uX3N1Yu+8iQogIGRhdGE6IGZ1bmN0aW9uIGRhdGEoKSB7CiAgICByZXR1cm4gewogICAgICBkYXRhOiB7CiAgICAgICAgcXhkZDoge30KICAgICAgfSwKICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwKICAgICAgcGxhY2Vob2xkZXJCbzogIiIsCiAgICAgIHF1aWNrU2VhcmNoOiAiIiwKICAgICAgLy/loavlhpnmj5DnpLoKICAgICAgY29uZGl0aW9uQmluZDogW10sCiAgICAgIC8v5Y+C5pWw5p+l6K+i5a2X5q61CiAgICAgIG5vZGVLZXk6ICJJRF8iLAogICAgICAvL+agkeW9ouaVsOaNrueItklkCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwKICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLAogICAgICBzZWxlY3RPcmdQcm9wczogewogICAgICAgIGxhYmVsOiAibmFtZSIKICAgICAgfSwKICAgICAgc3R5bGU6ICIiLAogICAgICAvL+WvueivneahhuWuvemrmAogICAgICBzZWxlY3RPcmdzOiBudWxsLAogICAgICBpbnB1dFN1ZmZpeEhlaWdodDogMzMsCiAgICAgIGNvbmZpZzogbnVsbCwKICAgICAgdXBkYXRpbmc6IGZhbHNlLAogICAgICBkaXNwbGF5ZmllbGQ6IFtdLAogICAgICAvL+aYvuekuuWtl+autQogICAgICBjdXN0b21EaWFsb2c6IHt9LAogICAgICBxdWVyeVBhcmFtOiAiIiwKICAgICAgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwKICAgICAgcHJvcHMxOiBbXSwKICAgICAgc2hvd0RhdGE6IFtdLAogICAgICBjaGVja0JveERhdGFBbGw6IFtdLAogICAgICAvL+mAieS4reWvueixoeeahOmbhuWQiAogICAgICBkZWZhdWx0UHJvcHM6IHsKICAgICAgICBjaGlsZHJlbjogImNoaWxkcmVuIiwKICAgICAgICBsYWJlbDogImxhYmVsIgogICAgICB9LAogICAgICBwcm9wc0RhdGE6IFtdLAogICAgICBxdWVyeXNTaG93OiBmYWxzZSwKICAgICAgLy/mmK/lkKbmmL7npLrmkJzntKLmoYYKICAgICAgdW5kZWZpbmVkYTogIiIsCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsCiAgICAgIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVCiAgICAgIHBhZ2luYXRpb246IHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiAyMCwKICAgICAgICB0b3RhbDogMAogICAgICB9LAogICAgICBwYXJhbTogW10sCiAgICAgIC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIHRyZWVMaXN0OiBbXSwKICAgICAgZGlzcGxheUZpZWxkOiB7fSwKICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICBwbGFjZWhvbGRlcnM6IFtdLAogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwKICAgICAgY29tYmluYXRpb25UcmVlRGF0YTogW10sCiAgICAgIGNvbWJpVHJlZURpc3BsYXlGaWVsZDogW10sCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sCiAgICAgIGNvbWJpbmF0aW9uUnVsZToge30sCiAgICAgIHRvZ2dsZUJ0bjogImVsLWljb24tYXJyb3ctbGVmdCIsCiAgICAgIHRyZWVTaG93OiB0cnVlLAogICAgICB0cmFuc3Rpb25XaWR0aDogIjI1JSIsCiAgICAgIGxlZnRUcmVlVGl0bGU6ICIiLAogICAgICB3cml0ZWFibGU6IHRydWUsCiAgICAgIGlzU2hvdzogdHJ1ZQogICAgfTsKICB9LAogIHdhdGNoOiB7CiAgICBwcm9wczE6IGZ1bmN0aW9uIHByb3BzMShuZXdWYWwsIG9sZFZhbCkgewogICAgICAvL+agkeW9ogogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGF0YSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgZGF0YS5wdXNoKHRoaXMuc2hvd0RhdGFbaV0pOwogICAgICAgIH0KICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBkYXRhLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtfaV0sIHRydWUpOwogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtfaV0sIHRoaXNfKTsKICAgICAgICAgIH0KICAgICAgICB9LCAyMDApOwogICAgICB9CiAgICB9CiAgfSwKICBtb3VudGVkOiBmdW5jdGlvbiBtb3VudGVkKCkgewogICAgdmFyIHJlcXVlc3RUeXBlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnLycpOwogICAgdmFyIGlzRG9uZUxpc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpOwogICAgaWYgKHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDFdID09ICdnZXQnIHx8IHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDJdID09ICdnZXQnIHx8IGlzRG9uZUxpc3RbaXNEb25lTGlzdC5sZW5ndGggLSAxXSA9PSAnZG9uZUxpc3QnKSB7CiAgICAgIHRoaXMuaXNTaG93ID0gZmFsc2U7CiAgICB9IGVsc2UgewogICAgICBpZiAodGhpcy5pbml0RmlsbERhdGEgPT0gJ3RydWUnKSB7CiAgICAgICAgdGhpcy5pbml0VGVtcGxhdGVEYXRhKCk7CiAgICAgIH0KICAgIH0KICB9LAogIGNvbXB1dGVkOiBtYXBTdGF0ZSh7CiAgICB0b3RhbDogZnVuY3Rpb24gdG90YWwoc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLmRpYWxvZy50b3RhbDsKICAgIH0sCiAgICBkaWFsb2dEYXRhOiBmdW5jdGlvbiBkaWFsb2dEYXRhKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cucm93czsKICAgIH0sCiAgICBpbnB1dFZhbDogZnVuY3Rpb24gaW5wdXRWYWwoKSB7CiAgICAgIGlmICghdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlID09ICJ8fFtdIikgewogICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gW107CiAgICAgICAgLy8gdGhpcy5zaG93RGF0YSA9IFtdOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgiLCIpOwogICAgICAgIGlmICh0aGlzLnZhbHVlLmluZGV4T2YoInx8IikgPiAwKSB7CiAgICAgICAgICBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgifHwiKVswXS5zcGxpdCgiLCIpOwogICAgICAgICAgLy8gdGhpcy5zaG93RGF0YT1KU09OLnBhcnNlKHRoaXMudmFsdWUuc3BsaXQoInx8IilbMV0pOwogICAgICAgIH0KICAgICAgICAvLyAgdGhpcy5zaG93RGF0YSA9dGhpcy5zZWxlY3RPcmdzOwogICAgICAgIHZhciBpZEFyeSA9IG51bGw7CiAgICAgICAgdmFyIGFjY291bnRBcnkgPSBudWxsOwogICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICBuYW1lQXJ5LmZvckVhY2goZnVuY3Rpb24gKG0sIGkpIHsKICAgICAgICAgIHZhciBuID0gewogICAgICAgICAgICB2YWx1ZTogbQogICAgICAgICAgfTsKICAgICAgICAgIHJlc3VsdC5wdXNoKG4pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgIH0sCiAgICBpbnB1dFdyaXRlYWJsZTogZnVuY3Rpb24gaW5wdXRXcml0ZWFibGUoKSB7CiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZSA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKSA6IHRoaXMud3JpdGVhYmxlOwogICAgfSwKICAgIGlucHV0VmFsaWRhdGU6IGZ1bmN0aW9uIGlucHV0VmFsaWRhdGUoKSB7CiAgICAgIHZhciB2YWxpZGF0ZU9iaiA9IHRoaXMuJHN0b3JlLnN0YXRlLmluZGV4LnZhbGlkYXRlOwogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCh0aGlzLnBlcm1pc3Npb25fc3ViLCB0aGlzLnZhbGlkYXRlLCB2YWxpZGF0ZU9iaiwgdGhpcyk7CiAgICB9LAogICAgaW5wdXROYW1lOiBmdW5jdGlvbiBpbnB1dE5hbWUoKSB7CiAgICAgIHZhciBsYWJlbGRlc2MgPSAiIjsKICAgICAgaWYgKHRoaXMuJHNsb3RzICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzYyAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW4gJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjWzBdLmNoaWxkcmVuWzBdLnRleHQpIHsKICAgICAgICBsYWJlbGRlc2MgPSB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dDsKICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpICsgIi0iICsgbGFiZWxkZXNjOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0aGlzLm5hbWUgPyB0aGlzLm5hbWUgOiB1dGlscy5nZXROYW1lKCk7CiAgICAgIH0KICAgIH0sCiAgICAvLyDmmK/lkKbmnInlm57loavorr7nva4KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uIGJpbmRTZXQoKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yY29uZmlnID8gdGhpcy5zZWxlY3RvcmNvbmZpZy5iaW5kIDogbnVsbDsKICAgIH0KICB9KSwKICBjcmVhdGVkOiBmdW5jdGlvbiBjcmVhdGVkKCkgewogICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7CiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICLor7fpgInmi6nlhoXlrrkiOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5wbGFjZWhvbGRlckJvID0gdGhpcy5wbGFjZWhvbGRlcjsKICAgIH0KICAgIHRoaXMuJHZhbGlkYXRvciA9IHRoaXMuJHJvb3QuJHZhbGlkYXRvcjsKICB9LAogIG1ldGhvZHM6IHsKICAgIHNlbGVjdEFsbDogZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdGlvbikgewogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IHNlbGVjdGlvbi5sZW5ndGg7IHgrKykgewogICAgICAgICAgaWYgKHRoaXMuaW5kZXhBcnJheSh0aGlzLm9sZHNlbGVjdE9yZ3MsIHNlbGVjdGlvblt4XSkgPT09IC0xKSB7CiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMub2xkc2VsZWN0T3Jncyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gXy5jbG9uZURlZXAoc2VsZWN0aW9uKTsKICAgICAgfQogICAgfSwKICAgIGNoZWNrTm9kZTogZnVuY3Rpb24gY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgewogICAgICBpZiAoZGF0YS5QaWQpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShkYXRhLlBpZCk7CiAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICBpZiAobm9kZS5kYXRhLlBpZCkgewogICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmluZGV0ZXJtaW5hdGUgPSB0cnVlOwogICAgICAgICAgdGhpcy5jaGVja05vZGUodGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpLmRhdGEsIHRoaXNfLCB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAocG5vZGUgJiYgIXBub2RlLmluZGV0ZXJtaW5hdGUpIHsKICAgICAgICBwbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsKICAgICAgfQogICAgfSwKICAgIC8v5Zue6L2m5p+l6K+iCiAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24gc2VhcmNoRW50ZXJGdW4oZSkgewogICAgICB2YXIga2V5Q29kZSA9IHdpbmRvdy5ldmVudCA/IGUua2V5Q29kZSA6IGUud2hpY2g7CiAgICAgIGlmIChrZXlDb2RlID09IDEzKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgfQogICAgfSwKICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uIGhhbmRsZVNpemVDaGFuZ2Uoc2l6ZSkgewogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemU7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24gaGFuZGxlQ3VycmVudENoYW5nZShjdXJyZW50UGFnZSkgewogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCkgewogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmNoZWNrQm94RGF0YUFsbCwgcm93KTsKICAgICAgICAgIGlmIChyZXMgPT0gLTEpIHsKICAgICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgIC8v54K55Ye756ys5Yeg6aG1CiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2U7CiAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICB9LAogICAgY2hlY2tMaXN0OiBmdW5jdGlvbiBjaGVja0xpc3QoKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXNfLmNoZWNrQm94RGF0YUFsbCAhPSB1bmRlZmluZWQgJiYgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgICAgdmFyIHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uZGlhbG9nRGF0YSwgcm93KTsKICAgICAgICAgICAgdGhpc18udW5kZWZpbmVkYSA9IHJlczsKICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgewogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgMzAwKTsKICAgIH0sCiAgICB0b2dnbGVSb3dTZWxlY3Rpb246IGZ1bmN0aW9uIHRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHZhbCkgewogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmRpYWxvZ0RhdGFbcmVzXSwgdmFsKTsKICAgIH0sCiAgICBzaG93RGlhbG9nOiBmdW5jdGlvbiBzaG93RGlhbG9nKGl0ZW0pIHsKICAgICAgdmFyIF90aGlzMiA9IHRoaXM7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIC8v56ys5LqM5qyh54K55Ye75a2Q6KGo5Zue5aGr5a+56K+d5qGGIOesrOS4gOasoemAieS4reeahOaVsOaNruS4jeaYr+mAieS4reeKtuaAgQogICAgICBpZiAodGhpc18uc2VsZWN0T3JncykgewogICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MuZW1wdHkoKTsKICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZW1wdHkoKTsKICAgICAgfQogICAgICB2YXIgYWxpYXMgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5hbGlhczsKICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnlBbGlhcycsIGFsaWFzKS50aGVuKGZ1bmN0aW9uIChjdXN0b21EaWFsb2cpIHsKICAgICAgICBpZiAoIWN1c3RvbURpYWxvZyB8fCAhY3VzdG9tRGlhbG9nLmFsaWFzKSB7CiAgICAgICAgICBNZXNzYWdlLmVycm9yKCflr7nor53moYbliKvlkI3jgJAnICsgYWxpYXMgKyAn44CR5LiN5a2Y5Zyo77yBJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgIHRoaXNfLm5vZGVLZXkgPSBkaXNwbGF5bGlzdC5pZDsKICAgICAgICB9CiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkKICAgICAgICB2YXIgYmluZExpc3QgPSB0aGlzXy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuY29uZGl0aW9uczsKICAgICAgICB0aGlzXy5wYXJhbSA9IFtdOyAvL+e7keWumueahOihqOWNleWtl+autQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgLy/nu5HlrprooajljZXlrZfmrrUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMycgJiYgZWxlLmJpbmQpIHsKICAgICAgICAgICAgICB2YXIgb2JqID0ge307CiAgICAgICAgICAgICAgb2JqLmZpZWxkID0gZWxlLmZpZWxkOwogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQ7CiAgICAgICAgICAgICAgdGhpc18ucGFyYW0ucHVzaChvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy/liKTmlq3lr7nor53moYbmn6Xor6LmmK/lkKbmnInmnaHku7YKICAgICAgICB2YXIgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsKICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICcnOyAvL+Whq+WGmeaPkOekuiBwbGFjZWhvbGRlcgogICAgICAgIHRoaXNfLmNvbmRpdGlvbkJpbmQgPSBbXTsKICAgICAgICB2YXIgcXVlcnlQYXJhbXMgPSBbXTsKICAgICAgICB2YXIgcGxhY2Vob2xkZXJzID0gW107CiAgICAgICAgaWYgKHVzZXJJbnB1dExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKGZ1bmN0aW9uIChlbGUpIHsKICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAvL+adoeS7tuafpeivouWPguaVsO+8iOeUqOaIt+i+k+WFpeeahO+8iSDmlofmnKzmoYbovpPlhaUKICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMScpIHsKICAgICAgICAgICAgICBvYmpbZWxlLmZpZWxkXSA9ICcnOwogICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2gob2JqKTsKICAgICAgICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kLnB1c2goZWxlKTsKICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMucHVzaCgn6K+36L6T5YWlJyArIGVsZS5jb21tZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBfdGhpczIuJHNldChfdGhpczIsICdxdWVyeVBhcmFtcycsIHF1ZXJ5UGFyYW1zKTsKICAgICAgICAgIF90aGlzMi4kc2V0KF90aGlzMiwgJ3BsYWNlaG9sZGVycycsIHBsYWNlaG9sZGVycyk7CiAgICAgICAgfQogICAgICAgIC8v5Yik5pat5piv5ZCm5pi+56S65p2h5Lu25p+l6K+i6L6T5YWl5qGGCiAgICAgICAgaWYgKHRoaXNfLnF1aWNrU2VhcmNoICE9ICcnKSB7CiAgICAgICAgICB0aGlzXy5xdWVyeXNTaG93ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gJ+ivt+i+k+WFpScgKyBfdGhpczIucXVpY2tTZWFyY2ggKyAn5p+l6K+iJzsKICAgICAgICB0aGlzXy5zdHlsZSA9ICdoZWlnaHQ6JyArIGN1c3RvbURpYWxvZy5oZWlnaHQgKyAncHgnOwogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsKICAgICAgICAgIF90aGlzMi5zdHlsZSA9ICdoZWlnaHQ6NDQwcHgnOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLnN0eWxlID09IDAgfHwgY3VzdG9tRGlhbG9nLnN0eWxlID09IDIpIHsKICAgICAgICAgIC8v5YiX6KGoCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgewogICAgICAgICAgLy/moJHlvaIKICAgICAgICAgIHRoaXNfLnBhZ2VQYXJhbSA9IHsKICAgICAgICAgICAgYWxpYXM6IGFsaWFzLAogICAgICAgICAgICBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZwogICAgICAgICAgfTsKICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IGN1c3RvbURpYWxvZzsKICAgICAgICAgIHZhciBwYXJhbSA9IHt9OwogICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gW107CiAgICAgICAgICAvL+WIpOaWreaYr+WQpuWtmOWcqOadoeS7tgogICAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIC8v5Yik5pat5p2h5Lu25a2X5q615piv5ZCm5piv5Yqo5oCB5Lyg5YWl77yIZGVmYXVsdFR5cGXvvJo077ya5Yqo5oCB5Lyg5YWl77yMMu+8muWbuuWumuWAvCDvvIkKICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGUgPT0gIjQiKSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtW3RoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZF0gPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uY29tbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8v5pyJ5Yqo5oCB5Lyg5YWl55qE5a2X5q61CiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICJ7fSIpIHsKICAgICAgICAgICAgdGhpc18uZGlhbG9nVmlzaWJsZSA9IHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvL+aXoOWKqOaAgeS8oOWFpeeahOWtl+autQogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dUcmVlU2hvdyh0aGlzXy5wYWdlUGFyYW0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcKICAgIGluZGV4QXJyYXk6IGZ1bmN0aW9uIGluZGV4QXJyYXkoYXJyYXksIGl0ZW0pIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PSAwKSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXJyYXlbaV0pID09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfSwKICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RCiAgICBvblRhYmxlU2VsZWN0OiBmdW5jdGlvbiBvblRhYmxlU2VsZWN0KHJvd3MsIHJvdykgewogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlOwogICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkKICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5zZWxlY3RPcmdzICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwICYmIHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykgIT09IC0xOwogICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgdmFyIHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdyk7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICB9CiAgICB9LAogICAgLy/ngrnlh7vliJfooajmn5DkuIDmnaHmlbDmja7ml7bop6blj5EKICAgIG9yZ1Jvd0NsaWNrOiBmdW5jdGlvbiBvcmdSb3dDbGljayhyb3csIGNvbHVtbiwgZXZlbnQpIHsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldC5jaGlsZHJlblswXS5jaGlsZHJlblswXS5jaGlsZHJlblswXSkudHJpZ2dlcigiY2xpY2siKTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChyb3cpOwogICAgICB9IGVsc2UgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxKSB7CiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsKICAgICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkKICAgICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTE7CiAgICAgICAgaWYgKHNlbGVjdGVkKSB7CiAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KTsKICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kcmVmcy5vcmdUYWJsZS50b2dnbGVSb3dTZWxlY3Rpb24ocm93KTsKICAgICAgfQogICAgfSwKICAgIC8v5YiX6KGo5aSN6YCJ5qGG5pyJ5pS55Y+Y5pe26Kem5Y+RCiAgICBvcmdUYWJsZVNlbGVjdGlvbjogZnVuY3Rpb24gb3JnVGFibGVTZWxlY3Rpb24oc2VsZWN0aW9uKSB7CiAgICAgIC8v5YWo6YCJ55qE5oOF5Ya154m55q6K5aSE55CGKOS4uuS6huS4juWOn+acrOWKn+iDvemAu+i+keS4jeWGsueqgSzlhYjlpI3liLbkuIDku73ml6fnmoTpgInkuK3mlbDmja4u54S25ZCO5ou/5Yiw5YWo6YCJ5LqL5Lu25Lit5Y676K6h566XKQogICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLnNlbGVjdE9yZ3MpOwogICAgICAvL+WkmumAiQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7CiAgICAgICAgaWYgKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMCkgewogICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSAmJiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbjsKICAgICAgICAgIH0gZWxzZSBpZiAoKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSAmJiBzZWxlY3Rpb24ubGVuZ3RoID4gMSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0T3JncykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBzZWxlY3Rpb24ubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDdXJyZW50Q2hhbmdlICYmIHNlbGVjdGlvbi5sZW5ndGggPj0gMTApIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsKICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmb3IgKHZhciB1ID0gdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCAtIDE7IHUgPj0gMDsgdS0tKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5pbmRleEFycmF5KHNlbGVjdGlvbiwgdGhpcy5zZWxlY3RPcmdzW3VdKTsKICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gLTEpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBfaTIgPSAwOyBfaTIgPCBzZWxlY3Rpb24ubGVuZ3RoOyBfaTIrKykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltfaTJdKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yICh2YXIgX2kzID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IF9pMyA+PSAwOyBfaTMtLSkgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltfaTNdKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGRpYWxvZ0NvbmZpcm06IGZ1bmN0aW9uIGRpYWxvZ0NvbmZpcm0oKSB7CiAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgewogICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoIuivt+mAieaLqeaVsOaNruWbnuWhqyIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSAiIjsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOwogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOwogICAgfSwKICAgIC8v6YeN572uCiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgIHZhciBfdGhpczMgPSB0aGlzOwogICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmZvckVhY2goZnVuY3Rpb24gKHBhcmFtT2JqKSB7CiAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtT2JqKSB7CiAgICAgICAgICBfdGhpczMucXVlcnlQYXJhbXNba2V5XSA9ICIiOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIC8v57uE5ZCI5qCR6YeN572uCiAgICAgIGlmICh0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSkgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlLnN0b3JlLm5vZGVzTWFwOwogICAgICAgIGZvciAodmFyIGtleSBpbiBub2RlcykgewogICAgICAgICAgbm9kZXNba2V5XS5leHBhbmRlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7CiAgICAgIHRoaXMuc2VhcmNoKHRydWUpOwogICAgfSwKICAgIC8v5p+l6K+iCiAgICBzZWFyY2g6IGZ1bmN0aW9uIHNlYXJjaChyZXNldFBhZ2ludGlvbikgewogICAgICB2YXIgX3RoaXM0ID0gdGhpczsKICAgICAgdmFyIHF1ZXJ5cyA9IFtdOyAvL+afpeivouadoeS7tgogICAgICB2YXIgcXVlcnlGaWx0ZXIgPSB7fTsKICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gInt9IikgewogICAgICAgIHRoaXMucGFnaW5hdGlvbiA9IHsKICAgICAgICAgIHBhZ2U6IDEsCiAgICAgICAgICBwYWdlU2l6ZTogMjAsCiAgICAgICAgICBzaG93VG90YWw6ICJ0cnVlIgogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFyIHBhZ2VCZWFuID0gewogICAgICAgIHBhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb24KICAgICAgfTsKICAgICAgaWYgKHJlc2V0UGFnaW50aW9uKSB7CiAgICAgICAgcGFnZUJlYW4ucGFnZUJlYW4gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAidHJ1ZSIKICAgICAgICB9OwogICAgICB9CiAgICAgIC8v55So5oi36L6T5YWl55qECiAgICAgIGlmICh0aGlzLnF1ZXJ5UGFyYW1zLmxlbmd0aCAhPSAwICYmIHRoaXMucXVlcnlQYXJhbXNbMF0gIT0gIiIpIHsKICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHsKICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsKICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsCiAgICAgICAgICAgIHZhbHVlOiBfdGhpczQucXVlcnlQYXJhbXNbaXRlbS5maWVsZF0sCiAgICAgICAgICAgIGdyb3VwOiAibWFpbiIsCiAgICAgICAgICAgIG9wZXJhdGlvbjogIkxJS0UiLAogICAgICAgICAgICByZWxhdGlvbjogIkFORCIKICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lCiAgICAgIGlmICh0aGlzLnBhcmFtKSB7CiAgICAgICAgdmFyIHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICAgIHRoaXMucGFyYW0uZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgcXVlcnlzLnB1c2goewogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwKICAgICAgICAgICAgdmFsdWU6IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBpdGVtLmJpbmQpLAogICAgICAgICAgICBncm91cDogIm1haW4iLAogICAgICAgICAgICBvcGVyYXRpb246ICJMSUtFIiwKICAgICAgICAgICAgcmVsYXRpb246ICJBTkQiCiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfQogICAgICAvL+adpeiHque7hOWQiOWvueivneahhueahAogICAgICBpZiAodGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDApIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBxdWVyeXMucHVzaCh0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5c1tpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgewogICAgICAgIHF1ZXJ5RmlsdGVyID0gewogICAgICAgICAgcGFnZUJlYW46IHBhZ2VCZWFuLnBhZ2VCZWFuLAogICAgICAgICAgcXVlcnlzOiBxdWVyeXMKICAgICAgICB9OwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnBhZ2VCZWFuID0gcXVlcnlGaWx0ZXI7CiAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9nZXRsaXN0SnNvbiIsIHRoaXMuY3VzdG9tRGlhbG9nKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgIF90aGlzNC5jaGVja0xpc3QoKTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHBhZ2VCZWFuOwogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvZ2V0bGlzdEpzb24iLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBfdGhpczQuY2hlY2tMaXN0KCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCiAgICBkb1F1ZXJ5OiBmdW5jdGlvbiBkb1F1ZXJ5KHBhcmFtKSB7CiAgICAgIHZhciBfdGhpczUgPSB0aGlzOwogICAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoLyojX19QVVJFX18qL19yZWdlbmVyYXRvclJ1bnRpbWUoKS5tYXJrKGZ1bmN0aW9uIF9jYWxsZWUoKSB7CiAgICAgICAgdmFyIHBhcmFtTG9hZERhdGEsIHBJbnN0LCBpLCBiaW5kVmFsLCBvYmosIHF1ZXJ5VXJsLCByZXF1ZXN0TWV0aG9kOwogICAgICAgIHJldHVybiBfcmVnZW5lcmF0b3JSdW50aW1lKCkud3JhcChmdW5jdGlvbiBfY2FsbGVlJChfY29udGV4dCkgewogICAgICAgICAgd2hpbGUgKDEpIHN3aXRjaCAoX2NvbnRleHQucHJldiA9IF9jb250ZXh0Lm5leHQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgIHBhcmFtTG9hZERhdGEgPSBbXTsKICAgICAgICAgICAgICBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShfdGhpczUpOyAvL+iOt+WPluWFs+iBlOafpeivoue7keWumueahOihqOWNleWPguaVsAogICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYXJhbS5jb25kaXRpb25maWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCAhPSAiIikgewogICAgICAgICAgICAgICAgICBiaW5kVmFsID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgIG9iaiA9IHsKICAgICAgICAgICAgICAgICAgICBrZXk6IHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBiaW5kVmFsCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBxdWVyeVVybCA9IHBhcmFtLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIgPyAiJHtmb3JtfS9mb3JtL2N1c3RvbVF1ZXJ5L3YxL2RvUXVlcnk/YWxpYXM9IiArIHBhcmFtLmFsaWFzICsgIiZwYWdlPTEiIDogcGFyYW0udXJsOwogICAgICAgICAgICAgIHJlcXVlc3RNZXRob2QgPSAiUE9TVCI7IC8v5aaC5p6c5YWz6IGU5pWw5o2u5YiX6KGo5p+l6K+i5pWw5o2u5LiN5piv5pWw5o2u5rqQ5YiZ6K+35rGC5pa55rOV5Li6cmVzdGZ1bOmFjee9rueahOivt+axguaWueW8jwogICAgICAgICAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgICAgICAgICByZXF1ZXN0TWV0aG9kID0gcGFyYW0ucmVxdWVzdFR5cGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8v5p+l6K+i5pWw5o2uCiAgICAgICAgICAgICAgcmVxLnJlcXVlc3QoewogICAgICAgICAgICAgICAgdXJsOiBxdWVyeVVybCwKICAgICAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdE1ldGhvZCwKICAgICAgICAgICAgICAgIGRhdGE6IHBhcmFtTG9hZERhdGEKICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXMpIHsKICAgICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueCiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93cy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwCiAgICAgICAgICAgICAgICAgIGZvciAodmFyIGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbCA9ICIiOwogICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKyByZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0gKyAiLCI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCIuIik7CiAgICAgICAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAvL+S4u+ihqAogICAgICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwgdmFsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/lrZDooajmsqHmlbDmja7nmoTmg4XlhrUKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgic3ViXyIsICIiKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdWJJbml0RGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy/miormlbDnu4Tph4zpnaLnmoTlgLzkuLogbnVsbCDovazmjaLkuLrnqbrlrZfnrKbkuLIKICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3ViSW5pdERhdGEpLnJlcGxhY2UoL251bGwvZywgJyIiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIF9zdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpOwogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBfc3ViRGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZigic3ViXyIpID09IDAgJiYgX3N1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdWJEYXRhW2tleV0gPSBbXTsgLy/mnInliJnmuIXnqboKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8v54K55re75Yqg5pe25Yik5pat6KaB5paw5aKe5a2Q6KGo6K6w5b2V5Lit55qE5a2X5q615piv5ZCm5pyJ5YC8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3N1YkRhdGFba2V5XSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3ViRGF0YVtrZXldID0gIiI7IC8v5pyJ5YiZ5riF56m6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5paw5aKe5LiA5p2h5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXS5wdXNoKF9zdWJEYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgcCA9IDA7IHAgPCBzdWJEYXRhLmxlbmd0aDsgcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAvL+ayoeaciei/lOWbnueahOWAvOWImea4heepugogICAgICAgICAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsAogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpb3AgPSAwOyBpb3AgPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvcCsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgX3BhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aC5zcGxpdCgiLiIpOwogICAgICAgICAgICAgICAgICAgICAgaWYgKF9wYXRoQXJyLmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8v5Li76KGoCiAgICAgICAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCwgIiIsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChfcGF0aEFyci5sZW5ndGggPT0gNCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL+WtkOihqAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgX3N1YkRhdGEyID0gcEluc3QuZGF0YVtfcGF0aEFyclsxXV1bX3BhdGhBcnJbMl1dOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfcCA9IDA7IF9wIDwgX3N1YkRhdGEyLmxlbmd0aDsgX3ArKykgewogICAgICAgICAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61CiAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAiIiwgX3ApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNhc2UgNzoKICAgICAgICAgICAgY2FzZSAiZW5kIjoKICAgICAgICAgICAgICByZXR1cm4gX2NvbnRleHQuc3RvcCgpOwogICAgICAgICAgfQogICAgICAgIH0sIF9jYWxsZWUpOwogICAgICB9KSkoKTsKICAgIH0sCiAgICAvLyDlkIzmraXpgInmi6nnu5PmnpwKICAgIHN5bmNJbnB1dFZhbHVlOiBmdW5jdGlvbiBzeW5jSW5wdXRWYWx1ZSgpIHsKICAgICAgdmFyIF90aGlzNiA9IHRoaXM7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgdmFyIGlkcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIGZpZWxkW2ldID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/IHJldHVyblN0cltpXS5maWVsZC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmZpZWxkOwogICAgICAgIGNvbW1lbnRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5jb21tZW50OwogICAgICB9CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsIHx8IHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPCAxKSB7CiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwucHVzaChyb3cpOwogICAgICAgIH0gZWxzZSBpZiAoSlNPTi5zdHJpbmdpZnkodGhpc18uaW5kZXhBcnJheSkuaW5kZXhPZihKU09OLnN0cmluZ2lmeShyb3cpKSA9PSAtMSkgewogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICB2YXIgcyA9IHRoaXMuc2VsZWN0T3JnczsKICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbMF1bZmllbGRbaV1dKTsKICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsKICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfZW5jb2RlU3RyICsgJyIsJzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nOwogICAgICAgICAgfQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICAgICAgaWRzLnB1c2goc1tpXS5pZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIC8v5aSE55CG6Ieq5Yqo5Zue5aGr6YWN572uCiAgICAgIHRoaXMuaW5zdElkID0gZm9ybUluc3QuJHBhcmVudC5pbnN0SWQ7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nOwogICAgICB2YXIgZmlsbE9yZyA9IHt9OwogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcgJiYgY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQpIHsKICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOwogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgdmFyIGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgICAgdmFyIGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIHsKICAgICAgICB2YXIgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOwogICAgICAgIHZhciBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsKICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtkOihqAogICAgICAgIGlmIChfdGhpcy5yZWxhdGlvbiAmJiBfdGhpcy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICBpZiAocmV0dXJuU2l6ZSA+IDEpIHsKICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuS4gOWvueS4gOWtkOihqOWPquiDvemAieaLqeS4gOadoeaVsOaNriIpOwogICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKGZ1bmN0aW9uIChyb3cpIHsKICAgICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsKICAgICAgICAgIF90aGlzNi5jdXN0ZGlhbG9nLmN1c3REaWFsb2cubWFwcGluZ0NvbmYuZm9yRWFjaChmdW5jdGlvbiAoY29uKSB7CiAgICAgICAgICAgIGlmIChjb24udGFyZ2V0WzBdKSB7CiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCcuJyk7CiAgICAgICAgICAgICAgdmFyIGZyb20gPSAnJzsKICAgICAgICAgICAgICBpZiAoX3RoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAncmVzdGZ1bCcpIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChyb3dbZnJvbV0gPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gZnJvbS50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSBkZWNvZGVVUklDb21wb25lbnQocm93W2Zyb21dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAodGFyZ2V0QXJyYXkpIHsKICAgICAgICAgICAgdmFyIHN1YkJvID0gZm9ybUluc3RbJ2RhdGEnXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dOwogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtkOihqOaVsOaNruacgOWkp+ihjOaVsAogICAgICAgICAgICBpZiAodGhpc18ubWF4Um93ICE9IDAgJiYgc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSA+IHRoaXNfLm1heFJvdykgewogICAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLlrZDooajmlbDmja7lt7LotoXov4fmnIDlpKfooYzmlbDjgJAiICsgdGhpc18ubWF4Um93ICsgIuOAkSIpOwogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL+WtkOihqOS4reeahOWtmeihqOWunuS9k++8iOWPr+iDveWtmOWcqOWkmuS4qu+8iQogICAgICAgICAgICB2YXIgc3VuQm9zID0gdXRpbHMuZ2V0U29tZUF0dHJpYnV0ZUZyb21QYXJlbnRFbGVtZW50KF90aGlzLiRlbCwgJ3N1bkJvcycpOwogICAgICAgICAgICAvL+WmguaenOWtmOWcqOWtmeihqOWunuS9k+WImeaJi+WKqOa3u+WKoOepuuWtmeihqOaVsOe7hOWvueixoQogICAgICAgICAgICBpZiAoc3VuQm9zKSB7CiAgICAgICAgICAgICAgdmFyIGFycmF5Qm8gPSBzdW5Cb3Muc3BsaXQoJywnKTsKICAgICAgICAgICAgICBmb3IgKHZhciBfaTQgPSAwOyBfaTQgPCBhcnJheUJvLmxlbmd0aDsgX2k0KyspIHsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSAnc3ViXycgKyBhcnJheUJvW19pNF07CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgICAgIHN1YkxpbmVEYXRhW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZDooagKICAgICAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsKICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWxsT3JnICYmIEpTT04uc3RyaW5naWZ5KGZpbGxPcmcpICE9ICd7fScpIHsKICAgICAgICAgICAgICBzdWJMaW5lRGF0YSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc3ViTGluZURhdGEpLCBmaWxsT3JnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUubWVzc2FnZSAhPSAiRW5kSXRlcmF0aXZlIikgdGhyb3cgZTsKICAgICAgfQogICAgICA7CiAgICB9LAogICAgLy/lj5bmtojmjInpkq4KICAgIGRpYWxvZ0NhbmNlbDogZnVuY3Rpb24gZGlhbG9nQ2FuY2VsKCkgewogICAgICB2YXIgX3RoaXM3ID0gdGhpczsKICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgdGhpc18ucXVlcnlQYXJhbSA9ICIiOwogICAgICB0aGlzXy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/ngrnlh7vkuobnoa7orqTlho3ngrnlh7vlj5bmtojnmoQgIGlucHV0VmFs5rKh5pyJ5YC85YiZ6KGo56S655u05o6l54K55Ye755qE5Y+W5raICiAgICAgICAgaWYgKCF0aGlzXy5pbnB1dFZhbCkgewogICAgICAgICAgdGhpc18uc2VsZWN0T3JncyA9IFtdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gX3RvQ29uc3VtYWJsZUFycmF5KHRoaXNfLnNob3dEYXRhKTsKICAgICAgICAgIF90aGlzNy5jaGVja0JveERhdGFBbGwgPSBfdG9Db25zdW1hYmxlQXJyYXkodGhpc18uc2VsZWN0T3Jncyk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0sCiAgICBkaWFsb2dUcmVlQ29uZmlybTogZnVuY3Rpb24gZGlhbG9nVHJlZUNvbmZpcm0oKSB7CiAgICAgIHZhciBfdGhpczggPSB0aGlzOwogICAgICB2YXIgdGhpc18gPSB0aGlzOwogICAgICBpZiAodGhpc18ucHJvcHNEYXRhLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuivt+mAieaLqeaVsOaNruWbnuWhqyIpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSk7CiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSk7CiAgICAgIHZhciBzdHIgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gcmV0dXJuU3RyW2ldLmNvbW1lbnQ7CiAgICAgIH0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhWzBdOwogICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgfQogICAgICAgIGlmICh0ZW1wICE9ICcnKSB7CiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICB9CiAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhOwogICAgICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0sIGspIHsKICAgICAgICAgIHZhciB0ZW1wID0gJyc7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnOwogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2tdW2ZpZWxkW2ldXSArICciLCc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgewogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9JzsKICAgICAgICAgIH0KICAgICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKTsKICAgICAgICB9KTsKICAgICAgfQogICAgICB2YXIgcmV0dXJuRGF0YSA9IHN0cjsKICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB0cnkgewogICAgICAgIHZhciByZXR1cm5TaXplID0gcmV0dXJuRGF0YS5sZW5ndGg7CiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZDooagKICAgICAgICBpZiAodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb24gPT0gJ29uZXRvb25lJykgewogICAgICAgICAgaWYgKHJldHVyblNpemUgPiAxKSB7CiAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLkuIDlr7nkuIDlrZDooajlj6rog73pgInmi6nkuIDmnaHmlbDmja4iKTsKICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSB0cnVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybkRhdGEuZm9yRWFjaChmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsOwogICAgICAgICAgdmFyIHN1YkxpbmVEYXRhID0ge307CiAgICAgICAgICBfdGhpczguY3VzdGRpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgewogICAgICAgICAgICAgIHRhcmdldEFycmF5ID0gY29uLnRhcmdldFswXS5zcGxpdCgnLicpOwogICAgICAgICAgICAgIHZhciBmcm9tID0gJyc7CiAgICAgICAgICAgICAgaWYgKHRoaXNfLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ3Jlc3RmdWwnKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb207CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocm93W2Zyb21dID09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZnJvbSA9IGZyb20udG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3ViTGluZURhdGFbdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV1dID0gZGVjb2RlVVJJQ29tcG9uZW50KHJvd1tmcm9tXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKHRhcmdldEFycmF5KSB7CiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WydkYXRhJ11bdGFyZ2V0QXJyYXlbMF1dW3RhcmdldEFycmF5WzFdXTsKICAgICAgICAgICAgLy/liKTmlq3mmK/lkKblpKfkuo7lrZDooajmlbDmja7mnIDlpKfooYzmlbAKICAgICAgICAgICAgaWYgKHRoaXNfLm1heFJvdyAhPSAwICYmIHN1YkJvLmxlbmd0aCArIHJldHVyblNpemUgPiB0aGlzXy5tYXhSb3cpIHsKICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5a2Q6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQIiArIHRoaXNfLm1heFJvdyArICLjgJEiKTsKICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJFbmRJdGVyYXRpdmUiKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy/lrZDooajkuK3nmoTlrZnooajlrp7kvZPvvIjlj6/og73lrZjlnKjlpJrkuKrvvIkKICAgICAgICAgICAgdmFyIHN1bkJvcyA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzXy4kZWwsICdzdW5Cb3MnKTsKICAgICAgICAgICAgLy/lpoLmnpzlrZjlnKjlrZnooajlrp7kvZPliJnmiYvliqjmt7vliqDnqbrlrZnooajmlbDnu4Tlr7nosaEKICAgICAgICAgICAgaWYgKHN1bkJvcykgewogICAgICAgICAgICAgIHZhciBhcnJheUJvID0gc3VuQm9zLnNwbGl0KCcsJyk7CiAgICAgICAgICAgICAgZm9yICh2YXIgX2k1ID0gMDsgX2k1IDwgYXJyYXlCby5sZW5ndGg7IF9pNSsrKSB7CiAgICAgICAgICAgICAgICB2YXIga2V5ID0gJ3N1Yl8nICsgYXJyYXlCb1tfaTVdOwogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gbmV3IEFycmF5KCk7CiAgICAgICAgICAgICAgICBzdWJMaW5lRGF0YVtrZXldID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Q6KGoCiAgICAgICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7CiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJCby5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgICAgICAgcmV0dXJuU2l6ZS0tOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIGlmIChlLm1lc3NhZ2UgIT0gIkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7CiAgICAgIH0KICAgICAgOwogICAgfSwKICAgIGRpYWxvZ0NhbmNlbFRyZWU6IGZ1bmN0aW9uIGRpYWxvZ0NhbmNlbFRyZWUoKSB7CiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKTsKICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlOwogICAgfSwKICAgIGdldENoZWNrZWQ6IGZ1bmN0aW9uIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMucHJvcHNEYXRhID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWROb2RlcygpOwogICAgICB9CiAgICB9LAogICAgdHJlZUNsaWNrOiBmdW5jdGlvbiB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgewogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSBbXTsKICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOwogICAgICB9CiAgICB9LAogICAgY2xlYXJBbGxTZWxlY3RPcmdzOiBmdW5jdGlvbiBjbGVhckFsbFNlbGVjdE9yZ3MoKSB7CiAgICAgIHRoaXMuc2VsZWN0T3JncyA9IG51bGw7CiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsKICAgIH0sCiAgICByZW1vdmVTZWxlY3RPcmc6IGZ1bmN0aW9uIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7CiAgICAgIHZhciBfdGhpczkgPSB0aGlzOwogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdGhpcy4kZW1pdCgiaW5wdXQiLCAiIik7CiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmlucHV0VmFsLnNwbGljZShpdGVtLCAxKTsKICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOwogICAgICAgIC8v5qCR5b2iCiAgICAgICAgaWYgKHRoaXMucHJvcHNEYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7CiAgICAgICAgfQogICAgICAgIC8v5YiX6KGoCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwuc3BsaWNlKGl0ZW0sIDEpOwogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgICAgICAvLyBpZihpdGVtLmlkID09cmVtb3ZlSWQgKXsKICAgICAgICAgICAgX3RoaXM5LmlzQ3VycmVudENoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIF90aGlzOS50b2dnbGVSb3dTZWxlY3Rpb24ocm93LCBmYWxzZSk7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsKICAgICAgICB2YXIgdmFsdWUgPSAiIjsKICAgICAgICB0aGlzLmlucHV0VmFsLmZvckVhY2goZnVuY3Rpb24gKHZhbCkgewogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgIiwiOwogICAgICAgIH0pOwogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9ICIiKSB7CiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgInx8IiArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpOwogICAgICAgIH0KICAgICAgICB0aGlzLiRlbWl0KCJpbnB1dCIsIHZhbHVlKTsKICAgICAgfQogICAgICB0aGlzLnN5bmNJbnB1dFZhbHVlKCk7CiAgICB9LAogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodDogZnVuY3Rpb24gY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsKICAgICAgdmFyIF90aGlzMTAgPSB0aGlzOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIV90aGlzMTAuJHJlZnMudGFnU3BhbnMpIHJldHVybjsKICAgICAgICBpZiAoX3RoaXMxMC4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsKICAgICAgICAgIF90aGlzMTAuaW5wdXRTdWZmaXhIZWlnaHQgPSBfdGhpczEwLiRyZWZzLnRhZ1NwYW5zLm9mZnNldEhlaWdodCArIDU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzMTAuaW5wdXRTdWZmaXhIZWlnaHQgPSAzMDsKICAgICAgICB9CiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BCiAgICAgICAgX3RoaXMxMC4kdmFsaWRhdG9yLnZhbGlkYXRlKCk7CiAgICAgIH0sIDApOwogICAgfSwKICAgIGN1c3RvbURpYWxvZ1Nob3c6IGZ1bmN0aW9uIGN1c3RvbURpYWxvZ1Nob3cocGFnZVBhcmFtKSB7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOwogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7CiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0gdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPSIgKyB0aGlzLmN1c3RvbURpYWxvZy5hbGlhcyArICImbWFwUGFyYW09IiArICh0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA/IHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtIDogIiIpIDogdGhpcy5jdXN0b21EaWFsb2cudXJsOwogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA8IDEpIHsKICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDIwLAogICAgICAgICAgc2hvd1RvdGFsOiAidHJ1ZSIKICAgICAgICB9OwogICAgICAgIHRoaXMuc2VhcmNoKCk7CiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZCA9IHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAxKSB7CiAgICAgICAgdGhpcy5zZWFyY2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsKICAgICAgICB0aGlzLnNlYXJjaCgpOwogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGN1c3RvbURpYWxvZ1RyZWVTaG93OiBmdW5jdGlvbiBjdXN0b21EaWFsb2dUcmVlU2hvdyhwYWdlUGFyYW0pIHsKICAgICAgdGhpcy5jdXN0b21EaWFsb2cgPSBwYWdlUGFyYW0uY3VzdG9tRGlhbG9nOwogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2c7CiAgICAgIHZhciBtYXBQYXJhbSA9ICIiOwogICAgICBpZiAocGFnZVBhcmFtLnBhcmFtICE9IHVuZGVmaW5lZCkgewogICAgICAgIG1hcFBhcmFtID0gSlNPTi5zdHJpbmdpZnkocGFnZVBhcmFtLnBhcmFtKTsKICAgICAgICBtYXBQYXJhbSA9IG1hcFBhcmFtLnN1YnN0cmluZygxLCBtYXBQYXJhbS5sZW5ndGggLSAxKTsKICAgICAgfQogICAgICB2YXIgcmVxdWVzdFR5cGUgPSBjdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIiA/ICJHRVQiIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlID8gY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlIDogIlBPU1QiOwogICAgICB2YXIgdXJsID0gIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9IiArIHBhZ2VQYXJhbS5hbGlhcyArICImbWFwUGFyYW09IiArIG1hcFBhcmFtOwogICAgICB2YXIgcGFyYW1zT2JqID0ge307CiAgICAgIGlmIChjdXN0b21EaWFsb2cuZHNUeXBlICE9ICJkYXRhU291cmNlIikgewogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmw7CiAgICAgICAgdmFyIHRlbXBsYXRlUGEgPSBjdXN0b21EaWFsb2cuZGF0YVBhcmFtOwogICAgICAgIGlmIChjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpIHsKICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gIlBPU1QiKSB7CiAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFx7IiArIGNvbi5maWVsZCArICJcXH0iLCAiZyIpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgbGpDaGFyID0gdXJsLmluZGV4T2YoIj8iKSA9PSAtMSA/ICI/IiA6ICImIjsKICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAiPSIgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmVxdWVzdFBhcmFtcyA9IHt9OwogICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsOwogICAgICByZXF1ZXN0UGFyYW1zLnBhcmFtc09iaiA9IHBhcmFtc09iajsKICAgICAgdGhpcy5zZWFyY2hUcmVlKHJlcXVlc3RQYXJhbXMpOwogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsKICAgIH0sCiAgICAvL+agkeW9ouafpeivogogICAgc2VhcmNoVHJlZTogZnVuY3Rpb24gc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKSB7CiAgICAgIHZhciB0aGlzXyA9IHRoaXM7CiAgICAgIHZhciBxdWVyeSA9IHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPT0gIlBPU1QiID8gcmVxLnBvc3QocmVxdWVzdFBhcmFtcy51cmwsIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqKSA6IHJlcS5nZXQocmVxdWVzdFBhcmFtcy51cmwpOwogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgewogICAgICAgIC8v5pi+56S65a2X5q616YWN572uCiAgICAgICAgdmFyIGRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7CiAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOwogICAgICAgIC8v5oqK5a+56K+d5qGG6YWN572u55qE5pi+56S65a2X5q615pi+56S65ZCN56ew6LWL5YC857uZ5qCR5b2i55qE5pi+56S65YC8CiAgICAgICAgdGhpc18uZGVmYXVsdFByb3BzLmxhYmVsID0gZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lOwogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YTsKICAgICAgICAvL+W+l+WIsOimgeWKoOi9veagkeeahOS/oeaBrwogICAgICAgIHRoaXNfLnByb3BzMSA9IHRoaXNfLnRvVHJlZURhdGEocmVzcG9uc2UuZGF0YSwgZGlzcGxheWZpZWxkLmlkLCBkaXNwbGF5ZmllbGQucGlkLCBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMCk7CiAgICAgIH0pOwogICAgfSwKICAgIC8v5Yqg6L295qCR55qE5L+h5oGvCiAgICB0b1RyZWVEYXRhOiBmdW5jdGlvbiB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgewogICAgICAvLyDlu7rnq4vkuKrmoJHlvaLnu5PmnoQs6ZyA6KaB5a6a5LmJ5Liq5pyA6aG25bGC55qE54i26IqC54K577yMcHZhbHVl5pivMAogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEsIHBpZCwgaWQsIG5hbWUsIHB2YWx1ZSk7CiAgICB9LAogICAgdHJhbnNsYXRlRGF0YVRvVHJlZTogZnVuY3Rpb24gdHJhbnNsYXRlRGF0YVRvVHJlZShkYXRhLCBwaWQsIGlkLCBuYW1lLCBwdmFsdWUpIHsKICAgICAgLy/miormoJHmlbDmja7mnInlrZDoioLngrnnmoTmlbDmja7lhajpg6jov4fmu6TmjonvvIjlj6rnlZnniLboioLngrnnmoTmlbDmja7vvIkKICAgICAgdmFyIHBhcmVudHMgPSBkYXRhLmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwgdmFsdWVbcGlkXSA9PSBudWxsIHx8IHZhbHVlW3BpZF0gPT0gcHZhbHVlOwogICAgICB9KTsKICAgICAgaWYgKCFwYXJlbnRzKSB7CiAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlW3BpZF0gIT09ICJ1bmRlZmluZWQiICYmIHZhbHVlW3BpZF0gIT0gbnVsbCAmJiB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXTsKICAgICAgICB9KTsKICAgICAgfQogICAgICByZXR1cm4gcGFyZW50czsKICAgIH0sCiAgICBsb2FkVHJlZTogZnVuY3Rpb24gbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgewogICAgICB2YXIgX3RoaXMxMSA9IHRoaXM7CiAgICAgIGlmIChub2RlKSB7CiAgICAgICAgdmFyIHRoaXNfID0gdGhpczsKICAgICAgICB2YXIgZGlzcGxheUZpZWxkID0gdGhpc18uY3VzdG9tRGlhbG9nLnN0eWxlID09IDIgPyB0aGlzXy5jb21iaVRyZWVEaXNwbGF5RmllbGQgOiB0aGlzXy5kaXNwbGF5RmllbGQ7CiAgICAgICAgcmVzb2x2ZSh0aGlzLnRyZWVMaXN0LmZpbHRlcihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZVtkaXNwbGF5RmllbGQucGlkXSA9PT0gbm9kZS5kYXRhW2Rpc3BsYXlGaWVsZC5pZF07CiAgICAgICAgfSkpOwogICAgICAgIGlmICh0aGlzLnNob3dEYXRhICYmIHRoaXMuc2hvd0RhdGEubGVuZ3RoID4gMCkgewogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF90aGlzMTEuc2hvd0RhdGEuZm9yRWFjaChmdW5jdGlvbiAodikgewogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgewogICAgICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKHYsIHRydWUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzXy5jaGVja05vZGUodiwgdGhpc18pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9LCA0MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGFmdGVyT3BlbjogZnVuY3Rpb24gYWZ0ZXJPcGVuKCkgewogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQogICAgICB0aGlzLmxvYWRDb21iaW5hdGlvblRyZWUoKTsKICAgIH0sCiAgICBsb2FkQ29tYmluYXRpb25UcmVlOiBmdW5jdGlvbiBsb2FkQ29tYmluYXRpb25UcmVlKCkgewogICAgICB2YXIgX3RoaXMxMiA9IHRoaXM7CiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zdHlsZSAhPSAyKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb21iaW5hdGlvblJ1bGUgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmNvbWJpbmF0aW9uUnVsZSk7CiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOwogICAgICB2YXIgdHJlZUFsaWFzID0gY29tYmluYXRpb25SdWxlLmxlZnRUcmVlOwogICAgICAvL+iOt+WPluWvueivneahhuaVsOaNrgogICAgICByZXEuZ2V0KCIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9IiArIHRyZWVBbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIHZhciB0cmVlRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICAgIF90aGlzMTIubGVmdFRyZWVUaXRsZSA9IHRyZWVEaWFsb2cubmFtZTsKICAgICAgICB2YXIgcmVxUGFyYW0gPSB7fTsKICAgICAgICB2YXIgcmVxdWVzdFR5cGUgPSB0cmVlRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSIgPyAiR0VUIiA6IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUgPyB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlIDogIlBPU1QiOwogICAgICAgIHZhciB1cmwgPSAiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0iICsgdHJlZUFsaWFzICsgIiZtYXBQYXJhbT0iOwogICAgICAgIHZhciBwYXJhbXNPYmogPSB7fTsKICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7CiAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsKICAgICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gdHJlZURpYWxvZy5kYXRhUGFyYW07CiAgICAgICAgICBpZiAodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkgewogICAgICAgICAgICB2YXIgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldOwogICAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsKICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFx7IiArIGNvbi5maWVsZCArICJcXH0iLCAiZyIpLCBjb24uZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCI/IikgPT0gLTEgPyAiPyIgOiAiJiI7CiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAiPSIgKyBjb24uZGVmYXVsdFZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgewogICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsKICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7CiAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7CiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7CiAgICAgICAgX3RoaXMxMi4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9nZXRUcmVlRGF0YSIsIHJlcXVlc3RQYXJhbXMpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCAmJiB0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKSB7CiAgICAgICAgICAgIHZhciBkaXNwbGF5RmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuZGlzcGxheWZpZWxkKTsKICAgICAgICAgICAgdmFyIHJlc3VsdGZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKTsKICAgICAgICAgICAgX3RoaXMxMi5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7CiAgICAgICAgICAgIF90aGlzMTIudHJlZUxpc3QgPSByZXNwOwogICAgICAgICAgICBfdGhpczEyLmNvbWJpVHJlZURpc3BsYXlGaWVsZCA9IGRpc3BsYXlGaWVsZDsKICAgICAgICAgICAgX3RoaXMxMi5jb21iaW5hdGlvblRyZWVEYXRhID0gX3RoaXMxMi50b1RyZWVEYXRhKHJlc3AsIGRpc3BsYXlGaWVsZC5pZCwgZGlzcGxheUZpZWxkLnBpZCwgZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLCBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICIwIiwgcmVzdWx0ZmllbGQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0sCiAgICBjb21iaVRyZWVDbGljazogZnVuY3Rpb24gY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsKICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJEKICAgICAgLy/muIXnqbrml6fnmoQKICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOwogICAgICB2YXIgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOwogICAgICBpZiAoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsKICAgICAgICB2YXIgcHJvcGVydHkgPSBydWxlc1tpXS5saXN0RmllbGQ7CiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7CiAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHksCiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBncm91cDogInRyZWVHcm91cCIsCiAgICAgICAgICBvcGVyYXRpb246IHRoaXMuZ2V0T3BlcmF0aW9uKHJ1bGVzW2ldLmNvbmRpdGlvbiksCiAgICAgICAgICByZWxhdGlvbjogIkFORCIKICAgICAgICB9KTsKICAgICAgfQogICAgICB0aGlzLnNlYXJjaCgpOwogICAgfSwKICAgIC8v6I635Y+W6L+Q566X56ym5Y+3CiAgICBnZXRPcGVyYXRpb246IGZ1bmN0aW9uIGdldE9wZXJhdGlvbihvbGQpIHsKICAgICAgaWYgKCFvbGQpIHsKICAgICAgICByZXR1cm4gIiI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiRVEiKSB7CiAgICAgICAgcmV0dXJuICJFUVVBTCI7CiAgICAgIH0KICAgICAgaWYgKG9sZCA9PSAiTEsiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJMRksiKSB7CiAgICAgICAgcmV0dXJuICJMSUtFIjsKICAgICAgfQogICAgICBpZiAob2xkID09ICJJTiIpIHsKICAgICAgICByZXR1cm4gIklOIjsKICAgICAgfQogICAgfSwKICAgIHRvZ2dsZVRyZWU6IGZ1bmN0aW9uIHRvZ2dsZVRyZWUoKSB7CiAgICAgIGlmICh0aGlzLnRyZWVTaG93KSB7CiAgICAgICAgdGhpcy50cmVlU2hvdyA9IGZhbHNlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMCUiOwogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctcmlnaHQiOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOwogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMjUlIjsKICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICJlbC1pY29uLWFycm93LWxlZnQiOwogICAgICB9CiAgICB9LAogICAgaW5pdFRlbXBsYXRlRGF0YTogZnVuY3Rpb24gaW5pdFRlbXBsYXRlRGF0YSgpIHsKICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgdmFyIGN1c3RkaWFsb2cgPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZzsKICAgICAgaWYgKCFjdXN0ZGlhbG9nIHx8ICFjdXN0ZGlhbG9nLm1hcHBpbmdDb25mIHx8IGN1c3RkaWFsb2cubWFwcGluZ0NvbmYubGVuZ3RoIDwgMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdGFyZ2V0UGF0aCA9IHRoaXMuZ2V0VGFyZ2V0UGF0aChjdXN0ZGlhbG9nLm1hcHBpbmdDb25mKTsKICAgICAgdmFyIHBhdGhzID0gdGFyZ2V0UGF0aC5zcGxpdCgnLicpOwogICAgICB2YXIgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7CiAgICAgIGlmICghZm9ybUluc3QuaW5pdEZpbGxEYXRhKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIC8v5aaC5p6c5bey5pyJ5pWw5o2u5YiZ5LiN6ZyA6KaB5YaN5qyh5Yid5aeL5YyWCiAgICAgIHZhciBjdXJEYXRhID0gZm9ybUluc3RbJ2RhdGEnXVtwYXRoc1swXV1bcGF0aHNbMV1dOwogICAgICB2YXIgaW5pdFR5cGUgPSB0aGlzLmluaXRGaWxsRGF0YVR5cGU7CiAgICAgIGlmICgoIWluaXRUeXBlIHx8IGluaXRUeXBlID09ICdlbXB0eScpICYmIGN1ckRhdGEubGVuZ3RoID4gMCAmJiAhKGN1ckRhdGEubGVuZ3RoID09IDEgJiYgSlNPTi5zdHJpbmdpZnkoY3VyRGF0YVswXSkgPT0gJ1tdJykpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSBpZiAoaW5pdFR5cGUgPT0gJ2NvdmVyJykgewogICAgICAgIGZvcm1JbnN0WydkYXRhJ11bcGF0aHNbMF1dW3BhdGhzWzFdXSA9IFtdOwogICAgICB9CiAgICAgIHZhciBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7CiAgICAgICAgbG9jazogdHJ1ZSwKICAgICAgICB0ZXh0OiAn5q2j5Zyo5Yid5aeL5YyW5aGr5oql5qih5p2/Li4uJywKICAgICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywKICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJwogICAgICB9KTsKICAgICAgdmFyIG15Q3VzdG9tRGlhbG9nID0gbnVsbDsKICAgICAgdGhpcy4kaHR0cC5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nICsgY3VzdGRpYWxvZy5hbGlhcykudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIG15Q3VzdG9tRGlhbG9nID0gcmVzcC5kYXRhOwogICAgICAgIF90aGlzLmN1c3RvbURpYWxvZyA9IHJlc3AuZGF0YTsKICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgIF90aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5boh6rlrprkuYnlr7nor53moYblpLHotKXvvIEiLAogICAgICAgICAgdHlwZTogImVycm9yIgogICAgICAgIH0pOwogICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY3VycmVudFVzZXIgPSBKU09OLnBhcnNlKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oImN1cnJlbnRVc2VyIikpOwogICAgICAgIGlmICghX3RoaXMuY3VzdGRpYWxvZy5vcmdDb25maWcuY29kZSAmJiAhX3RoaXMuY3VzdGRpYWxvZy5vcmdDb25maWcubmFtZSAmJiAhX3RoaXMuY3VzdGRpYWxvZy5vcmdDb25maWcuaWQpIHsKICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzLCBteUN1c3RvbURpYWxvZy5kc1R5cGUsIGZvcm1JbnN0WydkYXRhJ10pOwogICAgICAgIH0gZWxzZSBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIiArIGN1cnJlbnRVc2VyLmFjY291bnQpKSB7CiAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7CiAgICAgICAgICBfdGhpcy5maWxsT3JnID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCkpOwogICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsIG15Q3VzdG9tRGlhbG9nLmRzVHlwZSwgZm9ybUluc3RbJ2RhdGEnXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF90aGlzLiRodHRwLmdldCgnJHt1Y30vYXBpL29yZy92MS9vcmcvZ2V0RmlsbE9yZycpLnRoZW4oZnVuY3Rpb24gKHJlc3ApIHsKICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOwogICAgICAgICAgICB2YXIgcmVwID0gcmVzcC5kYXRhOwogICAgICAgICAgICBpZiAocmVwLnN0YXRlKSB7CiAgICAgICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IHJlcC52YWx1ZTsKICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY3VyRmlsbE9yZ18iICsgY3VycmVudFVzZXIuYWNjb3VudCwgSlNPTi5zdHJpbmdpZnkocmVwLnZhbHVlKSk7CiAgICAgICAgICAgICAgX3RoaXMudG9GaWxsSW5pdERhdGEoX3RoaXMsIG15Q3VzdG9tRGlhbG9nLmRzVHlwZSwgZm9ybUluc3RbJ2RhdGEnXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgICAgbWVzc2FnZTogcmVwLm1lc3NhZ2UsCiAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyIKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwgZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsKICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2UoewogICAgICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5blvZPliY3nlKjmiLfloavliLbljZXkvY3lpLHotKXvvIEiLAogICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9LAogICAgY2xvc2VMb2FkaW5nOiBmdW5jdGlvbiBjbG9zZUxvYWRpbmcobG9hZGluZykgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBsb2FkaW5nLmNsb3NlKCk7CiAgICAgIH0sIDIwMDApOwogICAgfSwKICAgIGdldFRhcmdldFBhdGg6IGZ1bmN0aW9uIGdldFRhcmdldFBhdGgobWFwcGluZ0NvbmYpIHsKICAgICAgdmFyIHRhcmdldCA9ICcnOwogICAgICBpZiAobWFwcGluZ0NvbmYgJiYgbWFwcGluZ0NvbmYubGVuZ3RoID4gMCkgewogICAgICAgIG1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKG1hcCkgewogICAgICAgICAgaWYgKG1hcFsndGFyZ2V0J10gJiYgbWFwWyd0YXJnZXQnXS5sZW5ndGggPT0gMSAmJiBtYXBbJ3RhcmdldCddWzBdKSB7CiAgICAgICAgICAgIHRhcmdldCA9IG1hcFsndGFyZ2V0J11bMF07CiAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0sCiAgICB0b0ZpbGxJbml0RGF0YTogZnVuY3Rpb24gdG9GaWxsSW5pdERhdGEoX3RoaXMsIGRzVHlwZSwgY3VyRGF0YSkgewogICAgICB2YXIgY3VzdGRpYWxvZyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nOwogICAgICB2YXIgcGFyYW1zID0gW107IC8v57uR5a6a55qE6KGo5Y2V5a2X5q61CiAgICAgIGlmIChjdXN0ZGlhbG9nLmNvbmRpdGlvbnMpIHsKICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQogICAgICAgIHZhciBiaW5kTGlzdCA9IGN1c3RkaWFsb2cuY29uZGl0aW9uczsKICAgICAgICBpZiAoYmluZExpc3QubGVuZ3RoID4gMCkgewogICAgICAgICAgYmluZExpc3QuZm9yRWFjaChmdW5jdGlvbiAoZWxlKSB7CiAgICAgICAgICAgIC8v57uR5a6a6KGo5Y2V5a2X5q61CiAgICAgICAgICAgIGlmIChlbGUuZGVmYXVsdFR5cGUgPT0gIjMiICYmIGVsZS5iaW5kKSB7CiAgICAgICAgICAgICAgdmFyIG9iaiA9IHt9OwogICAgICAgICAgICAgIG9iai5maWVsZCA9IGVsZS5maWVsZDsKICAgICAgICAgICAgICB2YXIgYmluZEFycmF5ID0gZWxlLmJpbmQuc3BsaXQoJy4nKTsKICAgICAgICAgICAgICBpZiAoYmluZEFycmF5Lmxlbmd0aCA9PSAzKSB7CiAgICAgICAgICAgICAgICBvYmouYmluZCA9IGN1ckRhdGFbYmluZEFycmF5WzFdXVtiaW5kQXJyYXlbMl1dOwogICAgICAgICAgICAgICAgcGFyYW1zLnB1c2gob2JqKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JyArIGN1c3RkaWFsb2cuYWxpYXM7CiAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBwYVN0ciA9ICcnOwogICAgICAgIHBhcmFtcy5mb3JFYWNoKGZ1bmN0aW9uIChwYSkgewogICAgICAgICAgaWYgKHBhU3RyKSB7CiAgICAgICAgICAgIHBhU3RyICs9ICcsJzsKICAgICAgICAgIH0KICAgICAgICAgIHBhU3RyID0gcGFTdHIgKyAnIicgKyBwYS5maWVsZCArICciOiInICsgcGEuYmluZCArICciJzsKICAgICAgICB9KTsKICAgICAgICB1cmwgPSB1cmwgKyAnJm1hcFBhcmFtPScgKyBwYVN0cjsKICAgICAgfSBlbHNlIHsKICAgICAgICB1cmwgPSB1cmwgKyAnJm1hcFBhcmFtPSc7CiAgICAgIH0KICAgICAgdmFyIHBhcmFtID0gewogICAgICAgIHBhZ2VCZWFuOiB7CiAgICAgICAgICBwYWdlOiAxLAogICAgICAgICAgcGFnZVNpemU6IDEwMDAsCiAgICAgICAgICBzaG93VG90YWw6IHRydWUKICAgICAgICB9CiAgICAgIH07CiAgICAgIF90aGlzLiRodHRwLnBvc3QodXJsLCBwYXJhbSkudGhlbihmdW5jdGlvbiAocmVzcCkgewogICAgICAgIHZhciByZXNwb25zZSA9IHJlc3AuZGF0YTsKICAgICAgICBpZiAocmVzcG9uc2Uucm93cykgewogICAgICAgICAgX3RoaXMuc3luY0luaXRUYWJsZVZhbHVlKHJlc3BvbnNlLnJvd3MsIGRzVHlwZSk7CiAgICAgICAgfQogICAgICB9LCBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICBfdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICBtZXNzYWdlOiAi6I635Y+W5Yid5aeL5YyW5pWw5o2u5aSx6LSl77yBIiwKICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9LAogICAgc3luY0luaXRUYWJsZVZhbHVlOiBmdW5jdGlvbiBzeW5jSW5pdFRhYmxlVmFsdWUocywgZHNUeXBlKSB7CiAgICAgIHZhciBjdXN0RGlhbG9nID0gdGhpcy5jdXN0ZGlhbG9nOwogICAgICB2YXIgcmV0dXJuU3RyID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5yZXN1bHRmaWVsZCk7CiAgICAgIC8v5ou/5Yiw6L+U5Zue55qE5a2X5q61CiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOwogICAgICB2YXIgc3RyID0gW107CiAgICAgIHZhciBpZHMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICBmaWVsZFtpXSA9IGRzVHlwZSA9PSAiZGF0YVNvdXJjZSIgPyByZXR1cm5TdHJbaV0uZmllbGQudG9Mb3dlckNhc2UoKSA6IHJldHVyblN0cltpXS5maWVsZDsKICAgICAgICBjb21tZW50W2ldID0gZHNUeXBlID09ICJkYXRhU291cmNlIiA/IHJldHVyblN0cltpXS5jb21tZW50LnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uY29tbWVudDsKICAgICAgfQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7CiAgICAgICAgdmFyIHRlbXAgPSAiIjsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB2YSA9IHNbMF1bZmllbGRbaV1dOwogICAgICAgICAgdHlwZW9mIHZhID09ICd1bmRlZmluZWQnID8gJycgOiB2YSwgX3JlYWRPbmx5RXJyb3IoInZhIik7CiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIHZhICsgJyIsJzsKICAgICAgICB9CiAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsKICAgICAgICAgIHRlbXAgPSAieyIgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgIn0iOwogICAgICAgIH0KICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgdGVtcCA9ICIiOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHZhciBfdmEgPSBzW2ldW2ZpZWxkW2pdXTsKICAgICAgICAgICAgdHlwZW9mIF92YSA9PSAndW5kZWZpbmVkJyA/ICcnIDogX3ZhLCBfcmVhZE9ubHlFcnJvcigidmEiKTsKICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBfdmEgKyAnIiwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsKICAgICAgICAgICAgdGVtcCA9ICJ7IiArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAifSI7CiAgICAgICAgICB9CiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSk7CiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOwogICAgICB0aGlzLmluc3RJZCA9IGZvcm1JbnN0LiRwYXJlbnQuaW5zdElkOwogICAgICAvL+WkhOeQhuWhq+WItumDqOmXqAogICAgICB2YXIgZmlsbE9yZyA9IHt9OwogICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcgJiYgY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQpIHsKICAgICAgICB2YXIgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7CiAgICAgICAgdmFyIG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIGZpbGxPcmdbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOwogICAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCkgewogICAgICAgICAgdmFyIGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7CiAgICAgICAgICB2YXIgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICBmaWxsT3JnW29yZ0lkRmllbGRdID0gdGhpcy5maWxsT3JnLmlkOwogICAgICAgIH0KICAgICAgICBpZiAoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSkgewogICAgICAgICAgdmFyIGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOwogICAgICAgICAgdmFyIG9yZ0NvZGVGaWVsZCA9IGNvZGVQYXRoW2NvZGVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgICAgZmlsbE9yZ1tvcmdDb2RlRmllbGRdID0gdGhpcy5maWxsT3JnLmNvZGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIHsKICAgICAgICB2YXIgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOwogICAgICAgIHZhciBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGggLSAxXTsKICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOwogICAgICB9CiAgICAgIHZhciByZXR1cm5EYXRhID0gc3RyOwogICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICByZXR1cm5EYXRhLmZvckVhY2goZnVuY3Rpb24gKHJvdykgewogICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9OwogICAgICAgIHZhciB0YXJnZXRBcnJheSA9IG51bGw7CiAgICAgICAgY3VzdERpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goZnVuY3Rpb24gKGNvbikgewogICAgICAgICAgaWYgKGNvbi50YXJnZXRbMF0pIHsKICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7CiAgICAgICAgICAgIHZhciBmcm9tID0gIiI7CiAgICAgICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJyZXN0ZnVsIikgewogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBmcm9tID0gY29uLmZyb20udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJMaW5lRGF0YVt0YXJnZXRBcnJheVt0YXJnZXRBcnJheS5sZW5ndGggLSAxXV0gPSByb3dbZnJvbV07CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGZpbGxPcmcgJiYgSlNPTi5zdHJpbmdpZnkoZmlsbE9yZykgIT0gJ3t9JykgewogICAgICAgICAgc3ViTGluZURhdGEgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHN1YkxpbmVEYXRhKSwgZmlsbE9yZyk7CiAgICAgICAgfQogICAgICAgIGZvcm1JbnN0WydkYXRhJ11bdGFyZ2V0QXJyYXlbMF1dW3RhcmdldEFycmF5WzFdXS5wdXNoKHN1YkxpbmVEYXRhKTsKICAgICAgfSk7CiAgICB9CiAgfQp9Ow=="},null]}