{"remainingRequest":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1705040076634},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\ljzc-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge0xvYWRpbmd9IGZyb20gJ2VsZW1lbnQtdWknDQppbXBvcnQgSHRDaGVja2JveCBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdENoZWNrYm94LnZ1ZScNCmltcG9ydCBIdERpYWxvZyBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdERpYWxvZy52dWUnDQppbXBvcnQgSHREaWFsb2dCdG4gZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvaHREaWFsb2dCdG4udnVlJw0KaW1wb3J0IEVpcFNlbGVjdCBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3QudnVlJw0KaW1wb3J0IFZSdW50aW1lVGVtcGxhdGUgZnJvbSAndi1ydW50aW1lLXRlbXBsYXRlJw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQge0Jhc2U2NH0gZnJvbSAnanMtYmFzZTY0Jw0KaW1wb3J0IFZ1ZSBmcm9tICd2dWUnDQppbXBvcnQgUVJDb2RlIGZyb20gJ3FyY29kZScNCmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJw0KaW1wb3J0IGZvcm0gZnJvbSAnQC9hcGkvZm9ybS5qcycNCmltcG9ydCBkaWFsb2cgZnJvbSAnQC9hcGkvZGlhbG9nQXBpLmpzJw0KY29uc3QgVGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZyA9ICgpID0+DQogIGltcG9ydCgnQC9jb21wb25lbnRzL2RpYWxvZy9UZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nLnZ1ZScpDQpleHBvcnQgZGVmYXVsdCB7DQogIG5hbWU6ICd0ZW1wbGF0ZS1keW5hbWljLXZpZXcnLA0KICBwcm9wczogew0KICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsDQogICAgaHRtbDogU3RyaW5nLA0KICAgIHRlbXBsYXRlSW5mbzogT2JqZWN0LA0KICAgIHBhcmFtZXRlcnFRdWVyeXM6IFN0cmluZywNCiAgICBzaW5nbGU6IHsNCiAgICAgIGRlZmF1bHQ6ICd0cnVlJw0KICAgIH0sDQogICAgZGVmS2V5OiBTdHJpbmcsDQogICAgdGFza1R5cGU6IHsNCiAgICAgIGRlZmF1bHQ6ICcnDQogICAgfSwNCiAgICBkYXRhVmlldzogT2JqZWN0LA0KICAgIGlzSm9pbkZsb3c6IHsNCiAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgfQ0KICB9LA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICByZWZyZXNoVGltZTpuZXcgRGF0ZSgpLmdldFRpbWUoKSwNCiAgICAgIHNob3dEYXRlVmlldzogdHJ1ZQ0KICAgIH0NCiAgfSwNCiAgY3JlYXRlZCgpIHsNCiAgICB0aGlzLmluaXQoKQ0KICB9LA0KICB3YXRjaDogew0KICAgIGh0bWw6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICB0aGlzLmluaXQoKQ0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgbWV0aG9kczogew0KICAgIGluaXQoKSB7DQogICAgICBWdWUuY29tcG9uZW50KCdodC1kYXRhdmlldy1ydW50aW1lLXRlbXBsYXRlJywgew0KICAgICAgICB0ZW1wbGF0ZTogdGhpcy5odG1sLA0KICAgICAgICBwcm9wczogew0KICAgICAgICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsDQogICAgICAgICAgc2luZ2xlOiBTdHJpbmcsDQogICAgICAgICAgZGVmS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGFza1R5cGU6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6ICcnDQogICAgICAgICAgfSwNCiAgICAgICAgICBkYXRhVmlldzogT2JqZWN0LA0KICAgICAgICAgIGlzSm9pbkZsb3c6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgICAgICAgfSwNCiAgICAgICAgICBwYXJhbWV0ZXJxUXVlcnlzOlN0cmluZw0KICAgICAgICB9LA0KICAgICAgICBkYXRhKCkgew0KICAgICAgICAgIHJldHVybiB7DQogICAgICAgICAgICB0cmVlUXVlcnlzOiBbXSwNCiAgICAgICAgICAgIGFsaWFzX25ldzogJ3N0YXRlbWVudCcsDQogICAgICAgICAgICBsb2FkaW5nOiBmYWxzZSwNCiAgICAgICAgICAgIFFSQ29kZXVybDogJycsDQogICAgICAgICAgICBRUkNvZGVEaWFsb2c6IGZhbHNlLA0KICAgICAgICAgICAgaHRtbDogJycsDQogICAgICAgICAgICB0YWJsZURhdGE6IHtzZWxlY3RSb3dzOiBbXSwgcXVlcnlzOiAnJ30sDQogICAgICAgICAgICBkaWFsb2dFeHBvcnRWaXNpYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIGV4cG9ydERhdGE6IHtnZXRUeXBlOiAnYWxsJywgZXhwRmllbGQ6IFtdfSwNCiAgICAgICAgICAgIGRpc3BsYXlGaWVsZHM6IFtdLA0KICAgICAgICAgICAgZXhwb3J0U2VsbGVjdGlvbjogW10sDQogICAgICAgICAgICBzZWFyY2hGb3JtOiB7Rl94YjogJycsIEZfeG06ICcnfSwNCiAgICAgICAgICAgIHF1ZXJ5Rm9ybTogew0KICAgICAgICAgICAgICBxdWVyeURhdGE6ICcnDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZm9ybVR5cGU6IGZhbHNlLA0KICAgICAgICAgICAgbGFiZWxQb3NpdGlvbjogJ2xlZnQnLA0KICAgICAgICAgICAgaW5jb25zOiAnZWwtaWNvbi1hcnJvdy1kb3duJywNCiAgICAgICAgICAgIG9wdGlvbnM6IHsNCiAgICAgICAgICAgICAgZnVsbHNjcmVlbjogdHJ1ZSwNCiAgICAgICAgICAgICAgbG9jazogdHJ1ZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJvd1RlbXBsYXRlSWQ6IG51bGwsDQogICAgICAgICAgICByb3dJZDogbnVsbCwNCiAgICAgICAgICAgIFFSQ29kZVNob3c6IHRydWUsDQogICAgICAgICAgICBRUkNvZGVEZXNjOiBbXSwNCiAgICAgICAgICAgIHRyZWU6IFtdLA0KICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBbXSwNCiAgICAgICAgICAgIHRhYmxlSGVpZ2h0OiAwLjY4NSAqIHdpbmRvdy5pbm5lckhlaWdodCwNCiAgICAgICAgICAgIGRpYWxvZ1N1YlZpc2libGU6IGZhbHNlLA0KICAgICAgICAgICAgdGFiczogW10sDQogICAgICAgICAgICBlbnRzOiBbXSwNCiAgICAgICAgICAgIG1vZGlmeVJlY29yZDogew0KICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgICAgICAgICAgcGFnZUJlYW46IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsDQogICAgICAgICAgICAgICAgICB0b3RhbDogMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHJlY29yZExpc3Q6IFtdLA0KICAgICAgICAgICAgcmVjb3JkUmVmSWQ6ICcnLA0KICAgICAgICAgICAgZGlhbG9nUmVjb3JkVmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICByZWNvcmRUYWJsZUxvYWRpbmc6IGZhbHNlLA0KICAgICAgICAgICAgbW9kaWZ5RGV0YWlsRGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICBjdXJyZW50TW9kaWZ5OiB7fSwNCiAgICAgICAgICAgIHJlZklkOiAnJywNCiAgICAgICAgICAgIHF1ZXJ5U3ViVmFsdWU6ICcnLA0KICAgICAgICAgICAgc3ViVGFibGVMb2FkaW5nOiBmYWxzZSwNCiAgICAgICAgICAgIGN1cnJlbnRUYWJOYW1lOiAnJywNCiAgICAgICAgICAgIGN1cnJlbnRUYWI6IHt9LA0KICAgICAgICAgICAgZXhwb3J0VHlwZTogJ21haW4nLA0KICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkczogW10sDQogICAgICAgICAgICBzdWJEaXNwbGF5RmllbGRzTGlzdDogW10sDQogICAgICAgICAgICBub3RQcmludDogZmFsc2UsDQogICAgICAgICAgICBkaXNwbGF5RmllbGQ6IHt9LA0KICAgICAgICAgICAgdHJlZUxpc3Q6IFtdLA0KICAgICAgICAgICAgcm93czogW10sDQogICAgICAgICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgIHBhZ2VTaXplOiAxMA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHBhZ2luYXRpb25MYXlvdXQ6ICd0b3RhbCwgc2l6ZXMsIHByZXYsIHBhZ2VyLCBuZXh0LCBqdW1wZXInLA0KICAgICAgICAgICAgdG90YWw6IDAsDQogICAgICAgICAgICBwZXJtaXNzaW9uOiB7DQogICAgICAgICAgICAgIHByaW50OiB0cnVlLA0KICAgICAgICAgICAgICBhZGQ6IHRydWUsDQogICAgICAgICAgICAgIGRlbDogdHJ1ZSwNCiAgICAgICAgICAgICAgZXhwb3J0OiB0cnVlLA0KICAgICAgICAgICAgICBlZGl0OiB0cnVlLA0KICAgICAgICAgICAgICBoaWRkZW46IGZhbHNlDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgc2hvd1JpZ2h0TWVudTogdHJ1ZSwNCiAgICAgICAgICAgIGxpc3RTZWxlY3RhYmxlOiB0cnVlLA0KICAgICAgICAgICAgZmlsdGVyczoge30sDQogICAgICAgICAgICBzb3J0ZXI6IG51bGwsDQogICAgICAgICAgICBkaWFsb2dTdW5WaXNpYmxlOiBmYWxzZSwgLy/lrZnooajlr7nor53moYYNCiAgICAgICAgICAgIHN1blRhYnM6IFtdLCAvL+WtmeihqOaVsOaNrg0KICAgICAgICAgICAgcXVlcnlTdW5WYWx1ZTogJycsDQogICAgICAgICAgICBvcGVyYXRlQ29sV2lkdGg6ICcyNDAnLA0KICAgICAgICAgICAgc3VtbWFyeUZpZWxkczogW10sDQogICAgICAgICAgICBkaWFsb2dWaXNpYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIHBhZ2VSZXN1bHQ6IHsNCiAgICAgICAgICAgICAgcGFnZTogMSwNCiAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICAgICAgICB0b3RhbDogMA0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGxvZ0RhdGE6IFtdLA0KICAgICAgICAgICAgbm90U29ydGFibGVGaWVsZHM6IFsNCiAgICAgICAgICAgICAgJ2JwbV9zdGF0dXNfJywNCiAgICAgICAgICAgICAgJ2JwbV9wcm9jX2luc3RfaWRfJywNCiAgICAgICAgICAgICAgJ2JwbV9zdWJqZWN0XycsDQogICAgICAgICAgICAgICdicG1fcHJvY19kZWZfbmFtZV8nLA0KICAgICAgICAgICAgICAnYnBtX2NyZWF0ZV90aW1lXycsDQogICAgICAgICAgICAgICdicG1fZW5kX3RpbWVfJywNCiAgICAgICAgICAgICAgJ2JwbV9pc19mb3JiaWRkZW5fJywNCiAgICAgICAgICAgICAgJ2JwbV9jcmVhdG9yXycNCiAgICAgICAgICAgIF0sDQogICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0OiBbXSwgLy/mibnph4/mm7TmlrDmlbDmja4NCiAgICAgICAgICAgIGlnbm9yZWRBbGlhczogWydhcHBDZW50ZXJGcm9udCddLA0KICAgICAgICAgICAgUVJDb2RlUGF0dGVybjogdHJ1ZSwNCiAgICAgICAgICAgIFFSQ29kZVR5cGU6ICcnLA0KICAgICAgICAgICAgaXNNb2JpbGU6IGZhbHNlLA0KICAgICAgICAgICAgYWN0aXZlTmFtZXM6IFsnMSddLA0KICAgICAgICAgICAgc3dpdGNoTWFwOnt9LA0KICAgICAgICAgICAgZmlsdGVyTWFwOnt9DQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBjb21wb25lbnRzOiB7DQogICAgICAgICAgVlJ1bnRpbWVUZW1wbGF0ZSwNCiAgICAgICAgICBIdENoZWNrYm94LA0KICAgICAgICAgIEh0RGlhbG9nLA0KICAgICAgICAgIEh0RGlhbG9nQnRuLA0KICAgICAgICAgIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2csDQogICAgICAgICAgRWlwU2VsZWN0DQogICAgICAgIH0sDQogICAgICAgIHdhdGNoOiB7DQogICAgICAgICAgZW50czogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWx1ZSkgew0KICAgICAgICAgICAgICBpZiAobmV3VmFsICYmIG5ld1ZhbC5sZW5ndGggPj0gMSAmJiBuZXdWYWwgIT0gb2xkVmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgdGhpcy5yZWZJZCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGRlZXA6IHRydWUsDQogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIHRlbXBsYXRlSW5mbzogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAmJiBuZXdWYWwuaWQgKSB7DQogICAgICAgICAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKQ0KICAgICAgICAgICAgICAgIGxldCBfbWUgPSB0aGlzDQogICAgICAgICAgICAgICAgX21lLnRlbXBsYXRlSW5mbyA9IG5ld1ZhbA0KICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgew0KICAgICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlGaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKA0KICAgICAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZA0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaXNwbGF5RmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZFtpXS50eXBlKSB7DQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLnB1c2goZGlzcGxheUZpZWxkW2ldKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7DQogICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbigNCiAgICAgICAgICAgICAgICAgICAgX21lLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZA0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb25kaXRpb25GaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGROYW1lID0gJ0ZfJyArIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWUNCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgZmllbGROYW1lLCAnJykNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt0ZW1wbGF0ZUlkOiBfbWUudGVtcGxhdGVJbmZvLmlkfQ0KICAgICAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7DQogICAgICAgICAgICAgICAgICAgIHBhZ2U6ICcxJywNCiAgICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IG5ld1ZhbC5wYWdlU2l6ZSwNCiAgICAgICAgICAgICAgICAgICAgc2hvd1RvdGFsOiAndHJ1ZScNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IC8v5Yid5qyh5Yqg6L296buY6K6kcGFnZUJlYW4NCiAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuDQogICAgICAgICAgICAgICAgaWYgKF9tZS5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgICAgICBwYXJhbXMuaXNKb2luRmxvdyA9IHRydWUNCiAgICAgICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IF9tZS50YXNrVHlwZQ0KICAgICAgICAgICAgICAgICAgcGFyYW1zLmRlZktleSA9IF9tZS5kZWZLZXkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKF9tZS5kYXRhVmlldykgew0KICAgICAgICAgICAgICAgICAgX21lLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61DQogICAgICAgICAgICAgICAgICBpZiAoX21lLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgX21lLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4wKSB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gX21lLmRhdGFWaWV3LnNlbGVjdExpc3QNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gX21lLmRhdGFWaWV3LnJlZklkVmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycVF1ZXJ5cykgew0KICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IEpTT04ucGFyc2UoDQogICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyYW1ldGVycVF1ZXJ5cykpDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBxdWVyeXMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRRdWVyeSA9IHRoaXMuYnVpbGREZWZhdWx0UXVlcnlzKCk7DQogICAgICAgICAgICAgICAgaWYoZGVmYXVsdFF1ZXJ5Lmxlbmd0aCA+IDApew0KICAgICAgICAgICAgICAgICAgaWYocGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzKXsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdChkZWZhdWx0UXVlcnkpOw0KICAgICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IGRlZmF1bHRRdWVyeTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPDQogICAgICAgICAgICAgICAgaWYodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKXsNCiAgICAgICAgICAgICAgICAgIGxldCBzb3J0RmllbGQ9SlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5zb3J0RmllbGQpOw0KICAgICAgICAgICAgICAgICAgbGV0IHNvcnRlcj1bXTsNCiAgICAgICAgICAgICAgICAgIGZvcihsZXQgeD0wO3g8c29ydEZpZWxkLmxlbmd0aDt4Kyspew0KICAgICAgICAgICAgICAgICAgICAgIHNvcnRlci5wdXNoKHsncHJvcGVydHknOnNvcnRGaWVsZFt4XS5uYW1lICwnZGlyZWN0aW9uJzpzb3J0RmllbGRbeF0uc29ydH0pOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24uc29ydGVyID1zb3J0ZXI7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICAgICAgICAgICAgaWYgKHBhcmFtcy50ZW1wbGF0ZUlkKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlDQogICAgICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5pbml0U3dpdGNoU3RhdHVzKCkNCiAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpc18uJGVsICYmIHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdG9wQnRuRG9tID0gdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IoDQogICAgICAgICAgICAgICAgICAgICAgICAgICdkaXYudG9wX2J0bl9jb2wnDQogICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICAgICAgICAgICF0b3BCdG5Eb20gfHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLWRlbGV0ZScpICYmDQogICAgICAgICAgICAgICAgICAgICAgICAgICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLWVkaXQnKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1zLWdyaWQnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5saXN0U2VsZWN0YWJsZSA9IGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGREb20gPSB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcigndGQucmlnaHRfbWVudScpDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGREb20gfHwgKCF0ZERvbS5xdWVyeVNlbGVjdG9yKCdidXR0b24nKSAmJiB0ZERvbS5xdWVyeVNlbGVjdG9yKCdzd2l0Y2gnKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5zaG93UmlnaHRNZW51ID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwudHJlZUZpZWxkICYmIG5ld1ZhbC50cmVlRmllbGQgIT09ICd7fScpIHsNCiAgICAgICAgICAgICAgICAgIGxldCB0cmVlRmllbGQgPSBKU09OLnBhcnNlKG5ld1ZhbC50cmVlRmllbGQpDQogICAgICAgICAgICAgICAgICB0aGlzLmluaXRUcmVlKHRyZWVGaWVsZCkNCiAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCByZXNwID0+IHsNCiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkRpc3BsYXlGaWVsZHMgPSBbXQ0KICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHIgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYXR0ci5jb21tZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdHRyLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXR0ci5jb2x1bW5UeXBlDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBzdWJEaXNwbGF5RmllbGRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50DQogICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwuc3VtbWFyeUZpZWxkKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlGaWVsZHMgPSBKU09OLnBhcnNlKG5ld1ZhbC5zdW1tYXJ5RmllbGQpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZGVlcDogdHJ1ZSwNCiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgY3VycmVudFRhYk5hbWU6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U3ViVmFsdWUgPSAnJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgY29tcHV0ZWQ6ew0KICAgICAgICAgIHNob3dEcmFmdExpc3QoKXsvL+WmguaenOW9k+WJjemhtemdouiiq+W1jOWFpWlmcmFtZemHjOmdouS4jeaYvuekuuiNieeovw0KICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wOw0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgbW91bnRlZCgpIHsNCiAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgICAgdGhpcy4kcm9vdC4kb24oJ2Zvcm0tcmVsb2FkLXN1Y2Nlc3MnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXNfLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICB9KQ0KICAgICAgICAgIHRoaXMuJGVtaXQoImFmdGVyTW91bnRlZCIpDQogICAgICAgIH0sDQogICAgICAgIG1ldGhvZHM6IHsNCiAgICAgICAgICBsb2FkRGF0YShwYXJhbSwgY2IpIHsNCiAgICAgICAgICAgIGxldCBxdWVyeXMgPSBwYXJhbS5xdWVyeXMgfHwgW10NCiAgICAgICAgICAgIGxldCBoYXNEZWZhdWx0UXVlcnkgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgICBsZXQgcElEID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlDQogICAgICAgICAgICBxdWVyeXMuZm9yRWFjaChxID0+IHsNCiAgICAgICAgICAgICAgaWYgKHEucHJvcGVydHkgPT0gJ1BJZCcpIHsNCiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UXVlcnkgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRRdWVyeSkgew0KICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsDQogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdQSWQnLA0KICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogcElEDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZhbHV0JywNCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ2JvQWxpYXMnLA0KICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcGFyYW0ucXVlcnlzID0gcXVlcnlzDQogICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgLnBvc3QoDQogICAgICAgICAgICAgICAgd2luZG93LmNvbnRleHQuZm9ybSArICcvZm9ybS9mb3JtRGF0YUltcG9ydExvZy92MS9saXN0SnNvbicsDQogICAgICAgICAgICAgICAgcGFyYW0NCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBkYXRhLmRhdGENCiAgICAgICAgICAgICAgICB0aGlzLmxvZ0RhdGEgPSByZXNwb25zZS5yb3dzDQogICAgICAgICAgICAgICAgdGhpcy5wYWdlUmVzdWx0ID0gew0KICAgICAgICAgICAgICAgICAgcGFnZTogcmVzcG9uc2UucGFnZSwNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwb25zZS5wYWdlU2l6ZSwNCiAgICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwb25zZS50b3RhbA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gY2IoKSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRlbEJpbmRGaWxlZFZhbHVhKCkgew0KICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YNCiAgICAgICAgICAgIGxldCBfbWUgPSB0aGlzDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSgNCiAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQuJHBhcmVudC4kcGFyZW50LiRwYXJlbnQNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICBpZighcEluc3RbdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzXSl7DQogICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzID0gT2JqZWN0LmtleXMocEluc3QuZGF0YSlbMF07DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgbGV0IHJlZklkVmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAnZGF0YS4nICsgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsgJy5pZF8nDQogICAgICAgICAgICAgICkNCg0KICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpICYmDQogICAgICAgICAgICAgICAgIXJlZklkVmFsdWUNCiAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgcmVmSWRWYWx1ZSA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKQ0KICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZWZJZFZhbHVlKSB7DQogICAgICAgICAgICAgICAgLy/lr7zlhaXnmoTml7blgJnmsqHmnInlhbPplK7nmoTlpJbplK7vvIzliJnkuLrlhbboh6rliqjmt7vliqANCiAgICAgICAgICAgICAgICByZWZJZFZhbHVlID0gbmV3IERhdGUoKS5nZXRUaW1lKCkNCiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJywgcmVmSWRWYWx1ZSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBfbWUuZGF0YVZpZXcucmVmSWRWYWx1ZSA9IHJlZklkVmFsdWUNCg0KICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgcEluc3QucGVybWlzc2lvbiAmJg0KICAgICAgICAgICAgICAgIHBJbnN0LnBlcm1pc3Npb24udGFibGUgJiYNCiAgICAgICAgICAgICAgICBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlW3RoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXNdDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHRoaXMucGVybWlzc2lvbiA9DQogICAgICAgICAgICAgICAgICBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlW3RoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXNdDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvbi5oaWRkZW4pIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQuc2hvd0RhdGVWaWV3ID0gZmFsc2UNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAvL+WFs+iBlOafpeivouWtl+autQ0KICAgICAgICAgICAgICBsZXQgc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdDsNCiAgICAgICAgICAgICAgaWYoc2VsZWN0TGlzdCAmJiBzZWxlY3RMaXN0Lmxlbmd0aCA+MCApew0KICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wO2k8c2VsZWN0TGlzdC5sZW5ndGg7aSsrKXsNCiAgICAgICAgICAgICAgICAgIGlmKHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9DQogICAgICAgICAgICAgICAgICAgICAgJ2RhdGEuJyArDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgICAnLicgKw0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGF0aCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdFtpXS5zZWxlY3RWYWx1ZSA9IHZhbHVlOw0KDQogICAgICAgICAgICAgICAgICAgIC8v5re75Yqg55uR5ZCsDQogICAgICAgICAgICAgICAgICAgIHBJbnN0LiR3YXRjaChwYXRoLCBmdW5jdGlvbihuZXdWYWwsIG9sZFZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgIC8vIOebkeWQrOS4reS9v+eUqOmXtOmalOivt+axgu+8jOWHj+Wwkeivt+axguasoeaVsA0KICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fbWUuc2V0RGF0YVZpZXdWYWx1ZShfbWUuZGF0YVZpZXcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICBfbWUuc2VhcmNoKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8v5YWz6IGU5aGr5YWF5a2X5q61DQogICAgICAgICAgICAgIGxldCBiaW5kTGlzdCA9IHRoaXMuZGF0YVZpZXcuYmluZExpc3Q7DQogICAgICAgICAgICAgIGlmKGJpbmRMaXN0ICYmIGJpbmRMaXN0Lmxlbmd0aCA+MCApIHsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDsgaTxiaW5kTGlzdC5sZW5ndGg7aSsrKSB7DQogICAgICAgICAgICAgICAgICBpZihiaW5kTGlzdFtpXS5maWxsRmllbGQpew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0NCiAgICAgICAgICAgICAgICAgICAgICAnZGF0YS4nICsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICcuJyArDQogICAgICAgICAgICAgICAgICAgICAgYmluZExpc3RbaV0uZmlsbEZpZWxkDQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhdGgpDQoNCiAgICAgICAgICAgICAgICAgICAgYmluZExpc3RbaV0uZmlsbFZhbHVlID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgcEluc3QuJHdhdGNoKHBhdGgsIGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5ZCs5Lit5L2/55So6Ze06ZqU6K+35rGC77yM5YeP5bCR6K+35rGC5qyh5pWwDQogICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCkNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL19tZS5zZXREYXRhVmlld1ZhbHVlKF9tZS5kYXRhVmlldyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIF9tZS5zZWFyY2goKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBwcmludExpc3QoKSB7DQogICAgICAgICAgICB0aGlzLm5vdFByaW50ID0gdHJ1ZQ0KICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoDQogICAgICAgICAgICAgICAgJ3ByaW50RGF0YScNCiAgICAgICAgICAgICAgKS5pbm5lckhUTUwNCiAgICAgICAgICAgICAgd2luZG93LnByaW50KCkNCiAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCkNCiAgICAgICAgICAgIH0sIDIwMCkNCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICB0aGlzLm5vdFByaW50ID0gZmFsc2UNCiAgICAgICAgICAgIH0sIDIwMCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIHByaW50RGV0YWlsKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24pIHsNCiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNDQogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIGFjdGlvbiArDQogICAgICAgICAgICAgICcvdHJ1ZScNCiAgICAgICAgICAgIGlmIChpZCkgew0KICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdXJsICs9ICc/Jw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnDQogICAgICAgICAgICBsZXQgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0cg0KICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsNCiAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50JykNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goew0KICAgICAgICAgICAgICBwYXRoOiBwYXRoLA0KICAgICAgICAgICAgICBxdWVyeToge2lzUHJpbnQ6IHRydWV9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgY29tcGxldGUocm93LHRhc2tUeXBlKSB7DQogICAgICAgICAgICBpZiAodGFza1R5cGU9PSd0b2RvJyl7DQogICAgICAgICAgICAgIHZhciB1cmwgPXdpbmRvdy5jb250ZXh0LmJwbVJ1blRpbWUgKyAnL3J1bnRpbWUvdGFzay92MS9nZXRCcG1UYXNrQnlJbnN0SWQ/aW5zdElkPScrcm93LmJwbV9wcm9jX2luc3RfaWRfDQogICAgICAgICAgICAgIHJlcS5nZXQodXJsKS50aGVuKHJlcyA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfmraTku7vliqHlt7LooqvlpITnkIbmiJbkuI3lrZjlnKjvvIEnKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmRhdGEubGVuZ3RoID09IDEpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCIvcmVwb3J0TW9kdWxlSW5zdC8iICsgcmVzLmRhdGFbMF0uaWQgICsgIi8wIisiLyIrdGhpcy5kZWZLZXkrIi90cnVlLyIrdGhpcy50ZW1wbGF0ZUtleSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+aaguS4jeaUr+aMge+8gScpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfWVsc2UgaWYodGFza1R5cGU9PSJkb25lIil7DQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXysgJy9kb25lTGlzdC8nK3RoaXMuZGVmS2V5KycvJyt0aGlzLnRlbXBsYXRlS2V5KTsNCiAgICAgICAgICAgIH1lbHNlIGlmKHRhc2tUeXBlPT0icmVxdWVzdCIpew0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3REb25lLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL3JlcXVlc3QvJyt0aGlzLmRlZktleSsnLycrdGhpcy50ZW1wbGF0ZUtleSkNCiAgICAgICAgICAgIH1lbHNlIGlmKHRhc2tUeXBlPT0idG9kb1JlYWQiKXsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0geyAicGFnZSI6IDEsICJwYWdlU2l6ZSI6IDEwLCAic2hvd1RvdGFsIjogInRydWUifQ0KICAgICAgICAgICAgICBsZXQgc3RhdHVzPXJvdy5icG1fc3RhdHVzXzsNCiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZVRvZG9SZWFkTGlzdCcsIHtwYWdlQmVhbjpwYWdlQmVhbixxdWVyeXM6W3twcm9wZXJ0eToicHJvY19pbnN0X2lkXyIsdmFsdWU6cm93LmJwbV9wcm9jX2luc3RfaWRfLG9wZXJhdGlvbjogJ0VRVUFMJyxyZWxhdGlvbjogJ0FORCd9XX0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyYmcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aD4wKXsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGlkPXJlc3BvbnNlLmRhdGEucm93c1swXS5pZDsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybD0iIjs3DQogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gJ0ZPTExPVycpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVybD0nL3JlcG9ydE1vZHVsZUluc3RUYXNrUmVhZC8nICtpZCArICcvRk9MTE9XLycrdGhpcy5kZWZLZXkrJy8nK3RoaXMudGVtcGxhdGVLZXk7DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09ICdDT01NVScpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9ICcvcmVwb3J0TW9kdWxlSW5zdC8nICsgaWQgKyAnLzAvJyt0aGlzLmRlZktleSsnL3RydWUvJyt0aGlzLnRlbXBsYXRlS2V5Ow0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZWFkLycgKyBpZCsnLycrdGhpcy5kZWZLZXkrIi8iK3RoaXMudGVtcGxhdGVLZXk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2godXJsKTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9ZWxzZSBpZih0YXNrVHlwZT09ImRvbmVSZWFkIil7DQogICAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHsgInBhZ2UiOiAxLCAicGFnZVNpemUiOiAxMCwgInNob3dUb3RhbCI6ICJ0cnVlIn0NCiAgICAgICAgICAgICAgcmVxLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZURvbmVSZWFkTGlzdCcsIHtwYWdlQmVhbjpwYWdlQmVhbixxdWVyeXM6W3twcm9wZXJ0eToicHJvY19pbnN0X2lkXyIsdmFsdWU6cm93LmJwbV9wcm9jX2luc3RfaWRfLG9wZXJhdGlvbjogJ0VRVUFMJyxyZWxhdGlvbjogJ0FORCd9XX0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MmJnJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGg+MCl7DQogICAgICAgICAgICAgICAgICBsZXQgaWQ9cmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOw0KICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVhZC9kb25lLycgK2lkKycvJyt0aGlzLmRlZktleSsiLyIrdGhpcy50ZW1wbGF0ZUtleSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfWVsc2UgaWYodGFza1R5cGU9PSJteVJlYWQiKXsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0geyAicGFnZSI6IDEsICJwYWdlU2l6ZSI6IDEwLCAic2hvd1RvdGFsIjogInRydWUifQ0KICAgICAgICAgICAgICByZXEucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0TXlOb3RpY2VSZWFkTGlzdCcsIHtwYWdlQmVhbjpwYWdlQmVhbixxdWVyeXM6W3twcm9wZXJ0eToicHJvY19pbnN0X2lkXyIsdmFsdWU6cm93LmJwbV9wcm9jX2luc3RfaWRfLG9wZXJhdGlvbjogJ0VRVUFMJyxyZWxhdGlvbjogJ0FORCd9XX0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MmJnJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGg+MCl7DQogICAgICAgICAgICAgICAgICBsZXQgaWQ9cmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkOw0KICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0TXlSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnLycgKyBpZCArICcvbXlSZWFkLycrdGhpcy5kZWZLZXkrIi8iK3RoaXMudGVtcGxhdGVLZXkpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH1lbHNlIGlmKHRhc2tUeXBlPT0ibXlEZWxlZ2F0ZSIpew0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3RSZWFkLycgKyByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKyAnL2RlbGVnYXRlLycrdGhpcy5kZWZLZXkrIi8iK3RoaXMudGVtcGxhdGVLZXkpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+S4i+i9veWFqOmDqOmAieS4reeahOS6jOe7tOeggQ0KICAgICAgICAgIGRvd25sb2FkQWxsUVJDb2RlKA0KICAgICAgICAgICAgdGVtcGxhdGVJZCwNCiAgICAgICAgICAgIG1vYmlsZUZvcm1BbGlhcywNCiAgICAgICAgICAgIGRpc3BsYXksDQogICAgICAgICAgICBwa0ZpZWxkLA0KICAgICAgICAgICAgUVJDb2RlUGF0dGVybg0KICAgICAgICAgICkgew0KICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gUVJDb2RlUGF0dGVybg0KICAgICAgICAgICAgY29uc3QgX3NlbGVjdERhdGEgPSB0aGlzLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS5zZWxlY3Rpb24NCiAgICAgICAgICAgIGlmIChfc2VsZWN0RGF0YS5sZW5ndGggPT09IDApIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign6K+36Iez5bCR6YCJ5Lit5LiA5p2h5pWw5o2uIScpDQogICAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZQ0KICAgICAgICAgICAgbGV0IGFjY291bnQgPSBCYXNlNjQuZW5jb2RlKA0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci5hY2NvdW50DQogICAgICAgICAgICApDQogICAgICAgICAgICBsZXQgdG9rZW4gPSB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbg0KICAgICAgICAgICAgbGV0IG1vYmlsZSA9IHdpbmRvdy5jb250ZXh0Lm1vYmlsZQ0KICAgICAgICAgICAgbGV0IFFSQ29kZXVybCA9ICcnDQogICAgICAgICAgICBsZXQgemlwID0gbmV3IEpTWmlwKCkNCiAgICAgICAgICAgIC8vIOWIm+W7uuS4gOS4quWQjeS4umltYWdlc+eahOaWsOeahOaWh+S7tuebruW9lQ0KICAgICAgICAgICAgbGV0IGltZyA9IHppcC5mb2xkZXIoJ2ltYWdlcycpDQogICAgICAgICAgICBsZXQgcGxpc3QgPSBbXQ0KICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBfc2VsZWN0RGF0YS5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7DQogICAgICAgICAgICAgICAgUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgICAgIG1vYmlsZSArDQogICAgICAgICAgICAgICAgICAnL1FSQ29kZUZvcm0vJyArDQogICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAgICcvZ2V0JyArDQogICAgICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICAgICAgX3NlbGVjdERhdGFbeF1bcGtGaWVsZF0gKw0KICAgICAgICAgICAgICAgICAgJyZ0b2tlbj0nICsNCiAgICAgICAgICAgICAgICAgIHRva2VuDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgICAgIG1vYmlsZSArDQogICAgICAgICAgICAgICAgICAnL1FSQ29kZUZvcm0vJyArDQogICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAgICcvZWRpdCcgKw0KICAgICAgICAgICAgICAgICAgJz9pZD0nICsNCiAgICAgICAgICAgICAgICAgIF9zZWxlY3REYXRhW3hdW3BrRmllbGRdDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgbGV0IG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpDQoNCiAgICAgICAgICAgICAgUVJDb2RlLnRvQ2FudmFzKG1zZywgUVJDb2RldXJsLCBmdW5jdGlvbihlcnJvcikgew0KICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICBsZXQgX2NhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpDQogICAgICAgICAgICAgIF9jYW52YXMuc2V0QXR0cmlidXRlKCdpZCcsICdRUkNvZGVBbmREZXNjQWxsJyArIHgpDQogICAgICAgICAgICAgIF9jYW52YXMuc2V0QXR0cmlidXRlKA0KICAgICAgICAgICAgICAgICdzdHlsZScsDQogICAgICAgICAgICAgICAgJ3RleHQtYWxpZ246Y2VudGVyO3dpZHRoOicgKyBtc2cud2lkdGggKyAncHg7Jw0KICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIF9jYW52YXMuYXBwZW5kQ2hpbGQobXNnKQ0KICAgICAgICAgICAgICAvL+WIm+W7uuW6lemDqOeahOaPj+i/sOS/oeaBrw0KICAgICAgICAgICAgICBmb3IgKGxldCBZID0gMDsgWSA8IGRpc3BsYXkubGVuZ3RoOyBZKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IEpTT04ucGFyc2UoZGlzcGxheVtZXSkNCiAgICAgICAgICAgICAgICBpZiAoX3NlbGVjdERhdGFbeF1baXRlbS5uYW1lXSkgew0KICAgICAgICAgICAgICAgICAgbGV0IGRlc2MgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQ0KICAgICAgICAgICAgICAgICAgZGVzYy5pbm5lckhUTUwgPSBpdGVtLmRlc2MgKyAnOicgKyBfc2VsZWN0RGF0YVt4XVtpdGVtLm5hbWVdDQogICAgICAgICAgICAgICAgICBfY2FudmFzLmFwcGVuZENoaWxkKGRlc2MpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGVBbmREZXNjQWxsJykuYXBwZW5kQ2hpbGQoX2NhbnZhcykNCiAgICAgICAgICAgICAgcGxpc3QucHVzaCgNCiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkUVJDb2RlQW5kRGVzYygnI1FSQ29kZUFuZERlc2NBbGwnICsgeCwgX2NhbnZhcykNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgUHJvbWlzZS5hbGwocGxpc3QpLnRoZW4ocmVzdWx0ID0+IHsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZUFuZERlc2NBbGwnKS5pbm5lckhUTUwgPSAnJw0KICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHJlc3VsdC5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgIGxldCBjYW52YXMgPSByZXN1bHRbeF0NCiAgICAgICAgICAgICAgICBsZXQgaW1hZ2UgPSBjYW52YXMudG9EYXRhVVJMKCkuc3BsaXQoJztiYXNlNjQsJylbMV0NCiAgICAgICAgICAgICAgICAvLyDov5nkuKppbWFnZXPmlofku7bnm67lvZXkuK3liJvlu7rkuIDkuKpiYXNlNjTmlbDmja7kuLppbWdEYXRh55qE5Zu+5YOP77yM5Zu+5YOP5ZCN5pivc21pbGUuZ2lmDQogICAgICAgICAgICAgICAgaW1nLmZpbGUoeCArICcucG5nJywgaW1hZ2UsIHtiYXNlNjQ6IHRydWV9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vIOaKiuaJk+WMheWGheWuueW8guatpei9rOaIkGJsb2Lkuozov5vliLbmoLzlvI8NCiAgICAgICAgICAgICAgemlwLmdlbmVyYXRlQXN5bmMoe3R5cGU6ICdibG9iJ30pLnRoZW4oZnVuY3Rpb24oY29udGVudCkgew0KICAgICAgICAgICAgICAgIGxldCBlbGVMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpDQogICAgICAgICAgICAgICAgZWxlTGluay5kb3dubG9hZCA9ICfkuoznu7TnoIEuemlwJw0KICAgICAgICAgICAgICAgIGVsZUxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJw0KICAgICAgICAgICAgICAgIC8vIOS4i+i9veWGheWuuei9rOWPmOaIkGJsb2LlnLDlnYANCiAgICAgICAgICAgICAgICBlbGVMaW5rLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGNvbnRlbnQpDQogICAgICAgICAgICAgICAgLy8g6Kem5Y+R54K55Ye7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlbGVMaW5rKQ0KICAgICAgICAgICAgICAgIGVsZUxpbmsuY2xpY2soKQ0KICAgICAgICAgICAgICAgIC8vIOeEtuWQjuenu+mZpA0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlTGluaykNCiAgICAgICAgICAgICAgfSkNCg0KICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIG9uQ29weShlKSB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MoJ+WGheWuueW3suWkjeWItuWIsOWJquWIh+adv++8gScpDQogICAgICAgICAgfSwNCiAgICAgICAgICAvLyDlpI3liLblpLHotKXml7bnmoTlm57osIPlh73mlbANCiAgICAgICAgICBvbkVycm9yKGUpIHsNCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+aKseatie+8jOWkjeWItuWksei0pe+8gScpDQogICAgICAgICAgfSwNCiAgICAgICAgICBkb3dubG9hZFFSQ29kZSgpIHsNCiAgICAgICAgICAgIGxldCBwbGlzdCA9IFtdDQogICAgICAgICAgICBsZXQgX2NhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNRUkNvZGVBbmREZXNjJykNCiAgICAgICAgICAgIHBsaXN0LnB1c2godGhpcy5kb3dubG9hZFFSQ29kZUFuZERlc2MoJyNRUkNvZGVBbmREZXNjJywgX2NhbnZhcykpDQogICAgICAgICAgICBQcm9taXNlLmFsbChwbGlzdCkudGhlbihyZXN1bHQgPT4gew0KICAgICAgICAgICAgICBsZXQgY2FudmFzID0gcmVzdWx0WzBdDQogICAgICAgICAgICAgIGxldCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpDQogICAgICAgICAgICAgIGxpbmsuaHJlZiA9IGNhbnZhcy50b0RhdGFVUkwoKSAvL+S4i+i9vemTvuaOpQ0KICAgICAgICAgICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCAn5LqM57u056CBLmpwZycpDQogICAgICAgICAgICAgIGxpbmsuc3R5bGUuZGlzcGxheSA9ICdub25lJyAvL2HmoIfnrb7pmpDol48NCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKQ0KICAgICAgICAgICAgICBsaW5rLmNsaWNrKCkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aKiuS6jOe7tOeggeS4juS6jOe7tOeggeivtOaYjuS4gOi1t+S4i+i9veaIkOWbvueJhw0KICAgICAgICAgIGRvd25sb2FkUVJDb2RlQW5kRGVzYyhjbGFzc3MsIF9jYW52YXMpIHsNCiAgICAgICAgICAgIGxldCBwMiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICAgICAgbGV0IGNhbnZhczIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKQ0KICAgICAgICAgICAgICBsZXQgdyA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKF9jYW52YXMpLndpZHRoKQ0KICAgICAgICAgICAgICBsZXQgaCA9IHBhcnNlSW50KHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKF9jYW52YXMpLmhlaWdodCkNCiAgICAgICAgICAgICAgLy/lsIZjYW52YXPnlLvluIPmlL7lpKfoi6XlubLlgI3vvIznhLblkI7nm5vmlL7lnKjovoPlsI/nmoTlrrnlmajlhoXvvIzlsLHmmL7lvpfkuI3mqKHns4rkuoYNCiAgICAgICAgICAgICAgY2FudmFzMi53aWR0aCA9IHcgKiAyDQogICAgICAgICAgICAgIGNhbnZhczIuaGVpZ2h0ID0gaCAqIDINCiAgICAgICAgICAgICAgY2FudmFzMi5zdHlsZS53aWR0aCA9IHcgKyAncHgnDQogICAgICAgICAgICAgIGNhbnZhczIuc3R5bGUuaGVpZ2h0ID0gaCArICdweCcNCiAgICAgICAgICAgICAgLy/lj6/ku6XmjInnhafoh6rlt7HnmoTpnIDmsYLvvIzlr7ljb250ZXh055qE5Y+C5pWw5L+u5pS5LHRyYW5zbGF0ZeaMh+eahOaYr+WBj+enu+mHjw0KICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IGNhbnZhczIuZ2V0Q29udGV4dCgnMmQnKQ0KICAgICAgICAgICAgICBjb250ZXh0LnNjYWxlKDIsIDIpDQogICAgICAgICAgICAgIHJldHVybiBodG1sMmNhbnZhcyhkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGNsYXNzcyksIHsNCiAgICAgICAgICAgICAgICBjYW52YXM6IGNhbnZhczINCiAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbihjYW52YXMpIHsNCiAgICAgICAgICAgICAgICByZXNvbHZlKGNhbnZhcykNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICByZXR1cm4gcDINCiAgICAgICAgICB9LA0KICAgICAgICAgIFFSQ29kZURpYWxvZ0Nsb3NlKCkgew0KICAgICAgICAgICAgdGhpcy5RUkNvZGVUeXBlID0gJycNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGlhbG9nID0gZmFsc2UNCiAgICAgICAgICB9LA0KICAgICAgICAgIGZvdW5kUVJDb2RlKCkgew0KICAgICAgICAgICAgLyp0aGlzLlFSQ29kZXVybCA9DQogICAgICAgICAgICAgIHdpbmRvdy5jb250ZXh0LmZyb250ICsNCiAgICAgICAgICAgICAgIi9RUkNvZGVGb3JtLyIgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgIi9nZXQiICsNCiAgICAgICAgICAgICAgIj9pZD0iICsNCiAgICAgICAgICAgICAgdGhpcy5yb3dJZCArDQogICAgICAgICAgICAgICImdG9rZW49IiArDQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuOyovDQogICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVUeXBlID09ICdhZGQnKSB7DQogICAgICAgICAgICAgIGxldCBpc1N0YXJ0RmxvdyA9IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkID8gJ3RydWUnIDogJ2ZhbHNlJw0KICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9DQogICAgICAgICAgICAgICAgcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKw0KICAgICAgICAgICAgICAgICcvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAnL2FkZC8/c3RhcnRGbG93PScgKw0KICAgICAgICAgICAgICAgIGlzU3RhcnRGbG93DQogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsNCiAgICAgICAgICAgICAgICBsZXQgdG9rZW4gPSB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbg0KICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsICs9ICcmdG9rZW49JyArIHRva2VuDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIC8v5LiN6K666ZyA5LiN6ZyA6KaB55m75b2V77yM6K6/6Zeu55qE6YO95piv5piO57uG6aG16Z2iDQogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsNCiAgICAgICAgICAgICAgICAvL+WFjeeZu+W9lQ0KICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsNCiAgICAgICAgICAgICAgICAgICcvUVJDb2RlRm9ybS8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICAgJy9nZXQ/aWQ9JyArDQogICAgICAgICAgICAgICAgICB0aGlzLnJvd0lkICsNCiAgICAgICAgICAgICAgICAgICcmdG9rZW49JyArDQogICAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbg0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIC8v6ZyA6KaB55m75b2VDQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICAgICAgcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKw0KICAgICAgICAgICAgICAgICAgJy9RUkNvZGVGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgICAnL2dldD9pZD0nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMucm93SWQNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy8gQmFzZTY0LmVuY29kZSh0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci5hY2NvdW50KTsNCiAgICAgICAgICAgIGxldCBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlJykNCg0KICAgICAgICAgICAgUVJDb2RlLnRvQ2FudmFzKG1zZywgdGhpcy5RUkNvZGV1cmwsIGZ1bmN0aW9uKGVycm9yKSB7DQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldFFSQ29kZSgNCiAgICAgICAgICAgIHRlbXBsYXRlSWQsDQogICAgICAgICAgICBpZCwNCiAgICAgICAgICAgIG1vYmlsZUZvcm1BbGlhcywNCiAgICAgICAgICAgIGRpc3BsYXksDQogICAgICAgICAgICBpbmRleCwNCiAgICAgICAgICAgIFFSQ29kZVBhdHRlcm4NCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IFFSQ29kZVBhdHRlcm4NCiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGVzYyA9IFtdDQogICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRpc3BsYXkubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBKU09OLnBhcnNlKGRpc3BsYXlbeF0pDQogICAgICAgICAgICAgIGlmICh0aGlzLnJvd3NbaW5kZXhdW2l0ZW0ubmFtZV0pIHsNCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MucHVzaCgNCiAgICAgICAgICAgICAgICAgIGl0ZW0uZGVzYyArICc6JyArIHRoaXMucm93c1tpbmRleF1baXRlbS5uYW1lXQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5tb2JpbGVGb3JtQWxpYXMgPSBtb2JpbGVGb3JtQWxpYXMNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlU2hvdyA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IHRydWUNCiAgICAgICAgICAgIHRoaXMucm93VGVtcGxhdGVJZCA9IHRlbXBsYXRlSWQNCiAgICAgICAgICAgIHRoaXMucm93SWQgPSBpZA0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlU2l6ZUNoYW5nZTogZnVuY3Rpb24oc2l6ZSkgew0KICAgICAgICAgICAgLy/mr4/pobXkuIvmi4nmmL7npLrmlbDmja4NCiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHNpemUNCiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZUN1cnJlbnRDaGFuZ2U6IGZ1bmN0aW9uKGN1cnJlbnRQYWdlKSB7DQogICAgICAgICAgICAvL+eCueWHu+esrOWHoOmhtQ0KICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSBjdXJyZW50UGFnZQ0KICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UGFyYW0oKSB7DQogICAgICAgICAgICBsZXQgcGFyYW1zID0ge30NCiAgICAgICAgICAgIGlmIChzdHIgPT0gJ2ZpbmQnKSB7DQogICAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsNCiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8v5Yik5pat5Li65ZCI5bm25p+l6K+i6L+Y5piv5YiG5byA5p+l6K+iDQogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgew0KICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm6YWN572u5LqG5ZCI5bm25p+l6K+iDQogICAgICAgICAgICAgIGlmICgkKCcuc2VhcmNoLXF1ZXJ5JykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0Q29uZGl0aW9uUXVlcnkoKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gJiYNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gJiYNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgbGV0IHRlbXBRdWVyeVMgPSBbXQ0KICAgICAgICAgICAgICBsZXQgYmV0d2VlbkNvbmRpdGlvbnMgPSB7fQ0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuZm9yRWFjaChxID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICBxLnZhbHVlICYmDQogICAgICAgICAgICAgICAgICAocS5vcGVyYXRpb24gIT0gJ0JFVFdFRU4nIHx8IHEudmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkpDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2gocSkNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEudmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb25zID0gcQ0KICAgICAgICAgICAgICAgICAgaWYgKGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XQ0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlID0gW2NvbmRpdGlvbnMudmFsdWVdDQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUucHVzaChxLnZhbHVlKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0gPSBjb25kaXRpb25zDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBiZXR3ZWVuQ29uZGl0aW9ucykgew0KICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChiZXR3ZWVuQ29uZGl0aW9uc1trZXldKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHRlbXBRdWVyeVMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBwYXJhbXMNCiAgICAgICAgICB9LA0KICAgICAgICAgIHNlYXJjaChzdHIpIHsNCiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucykNCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7fQ0KICAgICAgICAgICAgaWYgKHN0ciA9PSAnZmluZCcpIHsNCiAgICAgICAgICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vc2V0QnBtVGVtcGxhdGVQYWdpbmF0aW9uUGFnZU51bSIsIDEpOw0KICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5Li65ZCI5bm25p+l6K+i6L+Y5piv5YiG5byA5p+l6K+iDQogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgew0KICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm6YWN572u5LqG5ZCI5bm25p+l6K+iDQogICAgICAgICAgICAgIGlmICgkKCcuc2VhcmNoLXF1ZXJ5JykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0Q29uZGl0aW9uUXVlcnkoKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAocGFyYW1zLnBhZ2luYXRpb24gJiYgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzKSB7DQogICAgICAgICAgICAgIGxldCB0ZW1wUXVlcnlTID0gW10NCiAgICAgICAgICAgICAgbGV0IGJldHdlZW5Db25kaXRpb25zID0ge30NCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmZvckVhY2gocSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgICAgcS52YWx1ZSAmJg0KICAgICAgICAgICAgICAgICAgKHEub3BlcmF0aW9uICE9ICdCRVRXRUVOJyB8fCBxLnZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KQ0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKHEpDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLnZhbHVlKSB7DQogICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9ucyA9IHENCiAgICAgICAgICAgICAgICAgIGlmIChiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSkgew0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0NCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZSA9IFtjb25kaXRpb25zLnZhbHVlXQ0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlLnB1c2gocS52YWx1ZSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldID0gY29uZGl0aW9ucw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYmV0d2VlbkNvbmRpdGlvbnMpIHsNCiAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2goYmV0d2VlbkNvbmRpdGlvbnNba2V5XSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSB0ZW1wUXVlcnlTDQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cw0KICAgICAgICAgICAgICAgID8gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdCh0aGlzLnRyZWVRdWVyeXMpDQogICAgICAgICAgICAgICAgOiB0aGlzLnRyZWVRdWVyeXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5oqK6L+H5ruk5qCR55qE5p2h5Lu25Lmf5ou85o6l6L+b5Y67DQogICAgICAgICAgICBpZiAodGhpcy50cmVlUXVlcnlzICYmIHRoaXMudHJlZVF1ZXJ5cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cw0KICAgICAgICAgICAgICAgID8gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdCh0aGlzLnRyZWVRdWVyeXMpDQogICAgICAgICAgICAgICAgOiB0aGlzLnRyZWVRdWVyeXMNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YNCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKQ0KICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZQ0KICAgICAgICAgICAgICAvL+WFs+iBlOafpeivouWtl+autQ0KICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0ICYmIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPjApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZQ0KICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMuc2VhcmNoRm9ybSkpIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UXVlcnlGaWx0ZXIoKSB7DQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0gdGhpcy5nZXRTZWFyY2hJdGVtcygpDQogICAgICAgICAgICBsZXQgZmllbGRUeXBlTWFwID0gdGhpcy5nZXRGaWVsZFR5cGUoKQ0KICAgICAgICAgICAgbGV0IHNwZWNpYWxNYXAgPSB0aGlzLmdldFNwZWNpYWxNYXAoKQ0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdIC8v5p+l6K+i5p2h5Lu2DQogICAgICAgICAgICBsZXQgcXVlcnlGaWx0ZXIgPSB7fQ0KICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb259DQogICAgICAgICAgICBsZXQgcGFyYW1zID0ge3RlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkfQ0KICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBwYWdlQmVhbg0KICAgICAgICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdCh0aGlzLnNlYXJjaEZvcm0pKSB7DQogICAgICAgICAgICAgIHJldHVybiBwYXJhbXMNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnNlYXJjaEZvcm0pIHsNCiAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5zZWFyY2hGb3JtW2tleV0gIT0gJ3VuZGVmaW5lZCcgJiYNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybVtrZXldICE9ICcnICYmDQogICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm1ba2V5XSAhPSBudWxsDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGb3JtW2tleV0gaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoRm9ybVtrZXldLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaEZvcm1ba2V5XVtpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk1hcFtrZXldLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaEZvcm1ba2V5XS5pbmNsdWRlcygnLCcpICYmICFzcGVjaWFsTWFwW2tleV0pIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMuc2VhcmNoRm9ybVtrZXldLnNwbGl0KCcsJykNCiAgICAgICAgICAgICAgICAgICAgYXJyLmZvckVhY2godiA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sDQogICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5zZWFyY2hGb3JtW2tleV0NCiAgICAgICAgICAgICAgICAgICAgLy/mlbTmlbDnsbvlnosNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVHlwZU1hcFtrZXldICYmIGZpZWxkVHlwZU1hcFtrZXldID09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHRoaXMuc2VhcmNoRm9ybVtrZXldKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sDQogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHRoaXMuY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgJ2ZpbHRlcicpDQogICAgICAgICAgICAgIC8vIOWwhui/h+a7pOadoeS7tua3u+WKoOafpeivouWPguaVsOaVsOe7hOS4rQ0KICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSB0aGlzLnRlbXBsYXRlSW5mby5pc0V4dGVybmFsPT09MT8iIjoiRl8iDQogICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4gew0KICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSB7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBrLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsDQogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnRVFVQUwnDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnSU4nDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwgcXVlcnlzfQ0KICAgICAgICAgICAgICAvL+WmguaenOacieiuvue9rum7mOiupOaOkuW6jyzkvJjlhYjkvb/nlKjpu5jorqTmjpLluo8NCiAgICAgICAgICAgICAgaWYodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKXsNCiAgICAgICAgICAgICAgICBsZXQgc29ydEZpZWxkPUpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKTsNCiAgICAgICAgICAgICAgICBsZXQgc29ydGVyPVtdOw0KICAgICAgICAgICAgICAgIGZvcihsZXQgeD0wO3g8c29ydEZpZWxkLmxlbmd0aDt4Kyspew0KICAgICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7J3Byb3BlcnR5Jzpzb3J0RmllbGRbeF0ubmFtZSAsJ2RpcmVjdGlvbic6c29ydEZpZWxkW3hdLnNvcnR9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIuc29ydGVyID1zb3J0ZXI7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVyICYmIHRoaXMuc29ydGVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSB0aGlzLnNvcnRlcg0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcXVlcnlGaWx0ZXINCiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy8g6YCa6L+H5YiG57uE5ZCN56ew5riF6Zmk5a+55bqU5p+l6K+i5p2h5Lu2DQogICAgICAgICAgY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgZ3JvdXBOYW1lKSB7DQogICAgICAgICAgICAvLyDlvoXliKDpmaTnmoTmn6Xor6LmnaHku7YNCiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IFtdDQogICAgICAgICAgICBxdWVyeXMgJiYNCiAgICAgICAgICAgICAgcXVlcnlzLmZvckVhY2gocXVlcnkgPT4gew0KICAgICAgICAgICAgICAgIGlmIChxdWVyeS5ncm91cCA9PSBncm91cE5hbWUpIHsNCiAgICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2gocXVlcnkpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdG9EZWxldGUuZm9yRWFjaChkID0+IHsNCiAgICAgICAgICAgICAgcXVlcnlzLnJlbW92ZShkKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVNvcnRDaGFuZ2UoY29sdW1uKSB7DQogICAgICAgICAgICBpZiAoIWNvbHVtbi5vcmRlcikgew0KICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IG51bGwNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHRoaXMuc29ydGVyID0gWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBjb2x1bW4ucHJvcCwNCiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogY29sdW1uLm9yZGVyID09ICdhc2NlbmRpbmcnID8gJ0FTQycgOiAnREVTQycNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShtKSB7DQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7Li4udGhpcy5maWx0ZXJzLCAuLi5tfQ0KICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4gew0KICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyc1trXSB8fCB0aGlzLmZpbHRlcnNba10ubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRTZWFyY2hJdGVtcygpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0ge30NCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25UeXBlID0gew0KICAgICAgICAgICAgICBsaWtlOiAnTElLRScsDQogICAgICAgICAgICAgIGVxdWFsOiAnRVFVQUwnLA0KICAgICAgICAgICAgICBiZXR3ZWVuOiAnQkVUV0VFTicsDQogICAgICAgICAgICAgIGxlZnRfbGlrZTogJ0xFRlRfTElLRScsDQogICAgICAgICAgICAgIHJpZ2h0X2xpa2U6ICdSSUdIVF9MSUtFJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgb3BlcmF0aW9uID0gJz0nDQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdvcGVyYXRpb24nKQ0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgICAgICAgdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKQ0KICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAuYXR0cignb3BlcmF0aW9uJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFsNCiAgICAgICAgICAgICAgICAgICAgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpDQogICAgICAgICAgICAgICAgICBdID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXANCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEZpZWxkVHlwZSgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0ge30NCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25UeXBlID0gew0KICAgICAgICAgICAgICBudW1iZXI6ICdudW1iZXInLA0KICAgICAgICAgICAgICB0ZXh0OiAndGV4dCcNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9ICc9Jw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cigndHlwZScpDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0NCiAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhdGlvbg0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFsNCiAgICAgICAgICAgICAgICAgICAgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpDQogICAgICAgICAgICAgICAgICBdID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXANCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v6I635Y+W54m55q6K5p+l6K+i5oOF5Ya177yI6Ieq5a6a5LmJ5a+56K+d5qGG77yJDQogICAgICAgICAgZ2V0U3BlY2lhbE1hcCgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoIi5zZWFyY2gtaXRlbSIpOw0KICAgICAgICAgICAgbGV0IGZpZWxkUXVlcnlNYXAgPSB7fTsvL+afpeivouadoeS7tuWtl+autQ0KDQogICAgICAgICAgICBpZiAoc2VhcmNoSXRlbXMpIHsNCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cigiaHQtcXVlcnkiKSAhPSAidW5kZWZpbmVkIikgew0KICAgICAgICAgICAgICAgICAgLy/mn6Xor6LmnaHku7blrZfmrrUNCiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cigiaHQtcXVlcnkiKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cigic3BlY2lhbC1xdWVyeSIpICE9ICJ1bmRlZmluZWQiDQogICAgICAgICAgICAgICAgICAgICAgPyB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgICAgICAgdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJodC1xdWVyeSIpICE9ICJ1bmRlZmluZWQiDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQ0KICAgICAgICAgICAgICAgICAgZmllbGRRdWVyeU1hcFskKHNlYXJjaEl0ZW1zW2ldKS5jaGlsZHJlbigpLmF0dHIoImh0LXF1ZXJ5IildID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cigic3BlY2lhbC1xdWVyeSIpICE9ICJ1bmRlZmluZWQiDQogICAgICAgICAgICAgICAgICAgICAgPyB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmaWVsZFF1ZXJ5TWFwOw0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0Q29uZGl0aW9uUXVlcnkoKSB7DQogICAgICAgICAgICBsZXQgc2VhcmNoQWxsID0gJCgnLnNlYXJjaC1xdWVyeScpDQogICAgICAgICAgICBsZXQgdmFsdWVzID0gJycNCiAgICAgICAgICAgIGxldCBxdWVyeXMgPSBbXSAvL+afpeivouadoeS7tg0KICAgICAgICAgICAgbGV0IHF1ZXJ5RmlsdGVyID0ge30NCiAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9ufQ0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZH0NCiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW4NCg0KICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitDQogICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbD09PTE/IiI6IkZfIg0KICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goayA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssDQogICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdmaWx0ZXInLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09IDEpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdFUVVBTCcNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTicNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyDQogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPT0gJycpIHsNCiAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwgcXVlcnlzfTsNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcjsNCiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHR5cGVvZiAkKCQoc2VhcmNoQWxsWzBdKS5jaGlsZHJlbigpWzBdKS5hdHRyKA0KICAgICAgICAgICAgICAgICAgJ2h0LXF1aWNrLXNlYXJjaCcNCiAgICAgICAgICAgICAgICApICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQoJChzZWFyY2hBbGxbMF0pLmNoaWxkcmVuKClbMF0pLmF0dHIoDQogICAgICAgICAgICAgICAgICAnaHQtcXVpY2stc2VhcmNoJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdmFsdWVzLnNwbGl0KCcsJykNCiAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBhcnIpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBxdWVyeUZpbHRlciA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLCBxdWVyeXN9DQogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgICAgICByZXR1cm4gcGFyYW1zDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aJk+W8gOmrmOe6p+ajgOe0og0KICAgICAgICAgIGFkdmFuY2VkKCkgew0KICAgICAgICAgICAgdGhpcy5mb3JtVHlwZSA9ICF0aGlzLmZvcm1UeXBlDQogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgew0KICAgICAgICAgICAgICB0aGlzLmluY29ucyA9ICdlbC1pY29uLWFycm93LXVwJw0KICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPSAnJw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy1kb3duJw0KICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0gPSB7fQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lm57ovabmn6Xor6INCiAgICAgICAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgbGV0IGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoDQogICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSAxMykgew0KICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgnZmluZCcpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgcmVzZXQoZmxhZykgew0KICAgICAgICAgICAgdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhID0gJycNCiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCkgew0KICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbigNCiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZA0KICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9uRmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgZmllbGROYW1lID0gJ0ZfJyArIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWUNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBmaWVsZE5hbWUsICcnKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWUsICcnKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7fQ0KICAgICAgICAgICAgdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuY2xlYXJGaWx0ZXIoKQ0KICAgICAgICAgICAgaWYgKCFmbGFnKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCdmaW5kJykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSh2YWwpIHsNCiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPSB2YWwNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRlbGV0ZWQoKSB7DQogICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fA0KICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlofku7bliKDpmaQhJykNCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbliKDpmaTor6Xmlofku7YsIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6Jywgew0KICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgcyA9IFtdDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICBzLnB1c2goDQogICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3NbaV1bdGhpcy50ZW1wbGF0ZUluZm8ucGtGaWVsZF0NCiAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgICAgICAgICAgICBpZHM6IHMuam9pbignLCcpLA0KICAgICAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRlbChpZCkgew0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsNCiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7aWRzOiBpZCwgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc30NCiAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIG9wZXJhdGluZyh0ZW1wbGF0ZUlkLCBpZCwgYWN0aW9uLCBkZWZJZCwgaXNTdGFydEZsb3csIG9wZW5UeXBlKSB7DQogICAgICAgICAgICAvL2lzU3RhcnRGbG93IO+8iGZhbHNl77ya5Y+v5Lul5Y+R6LW35rWB56iL77yMdHJ1Ze+8muS4jeWPr+S7peWPkei1t+a1geeoi++8iQ0KICAgICAgICAgICAgaWYodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQgJiYgIWlzU3RhcnRGbG93KXsNCiAgICAgICAgICAgICAgLy/lhYjphY3nva7kuI3og73lj5HotbfmtYHnqIsNCiAgICAgICAgICAgICAgaWYoYWN0aW9uID09ICJhZGQiICYmIGlzU3RhcnRGbG93PT0iIil7DQogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmKGFjdGlvbiA9PSAiZWRpdCIgJiYgaXNTdGFydEZsb3c9PT1mYWxzZSl7DQogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8v5YaN5Yik5pat5piv5ZCm5Y+v5Lul5Y+R6LW35rWB56iLDQogICAgICAgICAgICAgIGxldCBtYW5hZ2VGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpOw0KICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWPkei1t+a1geeoi+aMiemSrg0KICAgICAgICAgICAgICBmb3IobGV0IGsgPTA7azxtYW5hZ2VGaWVsZC5sZW5ndGg7aysrKXsNCiAgICAgICAgICAgICAgICBpZihhY3Rpb24gPT0gImFkZCIgJiYgbWFuYWdlRmllbGRba10ubmFtZT09InN0YXJ0RmxvdyIpew0KICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKGFjdGlvbiA9PSAiZWRpdCIgJiYgbWFuYWdlRmllbGRba10ubmFtZT09InN0YXJ0RmxvdyIpew0KICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUlkKSB7DQogICAgICAgICAgICAgIHRlbXBsYXRlSWQgPSB0aGlzLnRlbXBsYXRlSW5mby5pZA0KICAgICAgICAgICAgICBhY3Rpb24gPSBhY3Rpb24gPT0gJ3NlbGVjdCcgPyAnZ2V0JyA6ICdhZGQnDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzICYmDQogICAgICAgICAgICAgICF0aGlzLmRhdGFWaWV3ICYmDQogICAgICAgICAgICAgICF0aGlzLmlnbm9yZWRBbGlhcy5pbmNsdWRlcyhzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKQ0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHVybCA9DQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgYWN0aW9uDQogICAgICAgICAgICBpZih0aGlzLmlzSm9pbkZsb3cpew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldz0ic3RhdGVtZW50Ig0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHRoaXMuc2luZ2xlID09ICd0cnVlJykgew0KICAgICAgICAgICAgICB1cmwgPQ0KICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgKw0KICAgICAgICAgICAgICAgICcvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICAgIGFjdGlvbiArDQogICAgICAgICAgICAgICAgJy90cnVlJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/liKTmlq3mlbDmja7op4blm77mjqfku7YNCiAgICAgICAgICAgIGxldCBpc0RhdGFWaWV3ID0gZmFsc2U7DQogICAgICAgICAgICBpZih0aGlzLmRhdGFWaWV3KXsNCiAgICAgICAgICAgICAgaWYodGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICYmIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAhPSAiIil7DQogICAgICAgICAgICAgICAgaXNEYXRhVmlldyA9IHRydWU7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYob3BlblR5cGUgPT0gIm5ldyIgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcgKXsNCiAgICAgICAgICAgICAgdXJsICs9ICIvbmV3IjsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGlkKSB7DQogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB1cmwgKz0gJz8nDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz1mYWxzZScNCiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgZGVmSWQgJiYgaXNTdGFydEZsb3c9PT1mYWxzZSkgew0KICAgICAgICAgICAgICBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PXRydWUnDQogICAgICAgICAgICB9IGVsc2UgaWYgKGlkICYmIGlzU3RhcnRGbG93PT09ZmFsc2UgJiYgZGVmSWQpIHsNCiAgICAgICAgICAgICAgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz10cnVlJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGRhdGFVcmwgPSAnJzsNCiAgICAgICAgICAgIGlmKHRoaXMuZGF0YVZpZXcpew0KICAgICAgICAgICAgICBpZih0aGlzLmRhdGFWaWV3LmJpbmRMaXN0ICYmIHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoID4wKXsNCiAgICAgICAgICAgICAgICBsZXQgYmluZExpc3QgPSBbXTsNCiAgICAgICAgICAgICAgICBmb3IodmFyIGk9MDsgaTx0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aDtpKyspew0KICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB7a2V5OiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0W2ldLmJpbmRGaWxsZCwgdmFsdWU6IHRoaXMuZGF0YVZpZXcuYmluZExpc3RbaV0uZmlsbFZhbHVlfTsNCiAgICAgICAgICAgICAgICAgIGJpbmRMaXN0LnB1c2goaXRlbSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRhdGFVcmwgPSAnJmJpbmRMaXN0PScgKyBlbmNvZGVVUklDb21wb25lbnQoQmFzZTY0LmVuY29kZShKU09OLnN0cmluZ2lmeShiaW5kTGlzdCkpKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHINCiAgICAgICAgICAgIGlmIChkYXRhVXJsICE9ICcnKSB7DQogICAgICAgICAgICAgIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHIgKyBkYXRhVXJsDQogICAgICAgICAgICB9DQogICAgICAgICAgICBkZWJ1Z2dlcjsNCiAgICAgICAgICAgIC8vVE9ETyDlpoLmnpzmmK/mqKHlnZflvIDlj5Eg5YWo6YOo5bey5paw56qX5Y+j5omT5byADQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcgKSB7DQogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKA0KICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5yZXNvbHZlKHBhdGgucmVwbGFjZSh0aGlzLmFsaWFzX25ldywic3RhdGVtZW50IikgKyAnJmlzTmV3UGFnZT10cnVlJykuaHJlZiwNCiAgICAgICAgICAgICAgICAnX2JsYW5rJw0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgew0KICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy9vdGhlcm1lbnUnLCAnL3N0YXRlbWVudCcpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2gocGF0aCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIG9wZW5VcmwodXJsLCB0eXBlLCByb3csIGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgaWYgKHJvdyAmJiBmaWVsZE5hbWUpIHsNCiAgICAgICAgICAgICAgdXJsID0gdGhpcy5oYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodHlwZSA9PSAnbmV3Jykgew0KICAgICAgICAgICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmwNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZWRVcmxQYXJhbXModXJsLCByb3csIGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgew0KICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKQ0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZGlzcGxheSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkubmFtZSA9PSBmaWVsZE5hbWUpIHsNCiAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LnVybFBhcmFtcyAmJiBkaXNwbGF5LnVybFBhcmFtcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBkaXNwbGF5LnVybFBhcmFtcw0KICAgICAgICAgICAgICAgICAgICBsZXQgc3VmZml4ID0gJycNCiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zLmZvckVhY2gocGFyYW0gPT4gew0KICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCArPSAnJicNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4ICsgcGFyYW0ubmFtZSArICc9JyArIHJvd1twYXJhbS5maWVsZF0NCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgew0KICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnJicgKyBzdWZmaXgNCiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz8nICsgc3VmZml4DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB1cmwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHZpZXdSZXBvcnQoZGF0YSwganNvblN0ciwgb3BlblR5cGUpIHsNCiAgICAgICAgICAgIGxldCBpdGVtID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGpzb25TdHIpKQ0KICAgICAgICAgICAgbGV0IGNvbmRpdGlvbkZpZWxkID0gaXRlbS5jb25kaXRpb25GaWVsZA0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdDQogICAgICAgICAgICBpZiAoY29uZGl0aW9uRmllbGQgJiYgY29uZGl0aW9uRmllbGQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBjb25kaXRpb25GaWVsZC5mb3JFYWNoKG9iaiA9PiB7DQogICAgICAgICAgICAgICAgaWYgKG9iai5wYXJhbWV0ZXIpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IG9iai5rZXksDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW29iai5wYXJhbWV0ZXJdLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9iai5xdCwNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNDQogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvdGVtcGxhdGUvcHJldmlldy8nICsNCiAgICAgICAgICAgICAgaXRlbS5hbGlhcyArDQogICAgICAgICAgICAgICcvZmFsc2UvJyArDQogICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHF1ZXJ5cykpKQ0KICAgICAgICAgICAgLy91cmwg6L2s56CB6Ziy5q2i5pyJ5pac5p2gIOWvvOiHtOi3r+eUsei3s+i9rOS4jeWvuQ0KICAgICAgICAgICAgaWYgKG9wZW5UeXBlID09ICduZXcnKSB7DQogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh1cmwpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBzdGFydEZsb3coaWQpIHsNCiAgICAgICAgICAgIGxldCBkYXRhID0gew0KICAgICAgICAgICAgICBkZWZLZXk6IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkLA0KICAgICAgICAgICAgICBidXNpbmVzc0tleTogaWQsDQogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KSAvL+W8gOWniw0KICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgLmRpc3BhdGNoKCdzdG9yZVByb2Nlc3Mvc3RhcnRGb3JtJywgZGF0YSkNCiAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHsNCiAgICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MocmVzdWx0Lm1lc3NhZ2UpDQogICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXN1bHQubWVzc2FnZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+eCueWHu+WvvOWHuuaMiemSrg0KICAgICAgICAgIGV4cG9ydHMoZXhwb3J0U2V0dGluZ0ZpZWxkcykgew0KICAgICAgICAgICAgbGV0IGRpc3BsYXlGaWVsZHM9W10NCiAgICAgICAgICAgIGlmIChleHBvcnRTZXR0aW5nRmllbGRzKXsNCiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcz0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGV4cG9ydFNldHRpbmdGaWVsZHMpKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZHMubGVuZ3RoPT0wICYmIHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCl7DQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZXhwb3J0VHlwZSA9ICdtYWluJw0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzID0gW10NCiAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5wdXNoKGl0ZW0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBpbXBvcnRDb21tYW5kKHBhcmFtcykgew0KICAgICAgICAgICAgc3dpdGNoIChwYXJhbXMuY29tbWFuZCkgew0KICAgICAgICAgICAgICBjYXNlICdkb3dubG9hZFRlbXBGaWxlJzoNCiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkTWFpblRlbXBGaWxlKCkNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICBjYXNlICdpbXBvcnRNYWluJzoNCiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydE1haW4oKQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgIGNhc2UgJ2xvZyc6DQogICAgICAgICAgICAgICAgdGhpcy5vcGVuTG9nKCkNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBvcGVuTG9nKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZG93bmxvYWRNYWluVGVtcEZpbGUoKSB7DQogICAgICAgICAgICBsZXQgY3VzdG9tVGVtcGxhdGVJZCA9ICcnDQogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8gJiYgdGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpIHsNCiAgICAgICAgICAgICAgbGV0IG1hbmFnZUZpZWxkTGlzdCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpDQogICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYW5hZ2VGaWVsZExpc3QubGVuZ3RoOyBpbmRleCsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG1hbmFnZSA9IG1hbmFnZUZpZWxkTGlzdFtpbmRleF0NCiAgICAgICAgICAgICAgICBpZiAobWFuYWdlLm5hbWUgPT0gJ2ltcG9ydCcpIHsNCiAgICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmltcG9ydFRlbXBsYXRlICYmDQogICAgICAgICAgICAgICAgICAgIG1hbmFnZS5pbXBvcnRUZW1wbGF0ZS5sZW5ndGggPiAwDQogICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgY3VzdG9tVGVtcGxhdGVJZCA9IG1hbmFnZS5pbXBvcnRUZW1wbGF0ZVswXS5pZA0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGN1c3RvbVRlbXBsYXRlSWQpIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ21lbnUvZG93bmxvYWRGaWxlJywgY3VzdG9tVGVtcGxhdGVJZCkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KSAvL+W8gOWniw0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9kb3dubG9hZE1haW5UZW1wRmlsZScsIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzKQ0KICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpIC8vIOe7k+adnw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLmNhdGNoKGMgPT4gew0KICAgICAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQoNCiAgICAgICAgICBpbXBvcnRNYWluKHBhcmFtKSB7DQogICAgICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKQ0KICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgcGFyYW0uZmlsZSkNCg0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHsNCiAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsDQogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICAgICAgcGFyYW1zLmJpbmRGaWxsZCA9IHRoaXMuZGF0YVZpZXcuYmluZEZpbGxkIHx8ICcnDQogICAgICAgICAgICAgIHBhcmFtcy5maWxsVmFsdWUgPSB0aGlzLmRhdGFWaWV3LmZpbGxWYWx1ZSB8fCAnJw0KICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZXQgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHtmdWxsc2NyZWVuOiB0cnVlfSkgLy/lvIDlp4sNCiAgICAgICAgICAgIGZvcm0ubWFpbkltcG9ydChwYXJhbXMsIGRhdGEgPT4gew0KICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICAvL+WvvOWFpeaIkOWKn+S5i+WQjumHjeaWsOa4suafk+W9k+WJjee7hOS7tg0KICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5yZWZyZXNoVGltZT1uZXcgRGF0ZSgpLmdldFRpbWUoKTsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnc3VjY2VzcycsIG1lc3NhZ2U6IGRhdGEubWVzc2FnZX0pDQogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCkNCiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpKSB7DQogICAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoZGF0YS52YWx1ZSkNCiAgICAgICAgICAgICAgICAgIGpzb24uYm9BbGlhcyA9IHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcw0KICAgICAgICAgICAgICAgICAgbGV0IG9sZENvbmYgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcEpzb24nKQ0KICAgICAgICAgICAgICAgICAgaWYgKCFvbGRDb25mKSB7DQogICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oDQogICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1JbXBvcnRUZW1wSnNvbicsDQogICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoW2pzb25dKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBsZXQgb2xkSm9zbiA9IEpTT04ucGFyc2Uob2xkQ29uZikNCiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5PbGRKb3NuID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9sZEpvc24ubGVuZ3RoOyBpbmRleCsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkID0gb2xkSm9zbltpbmRleF0NCiAgICAgICAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICAgICAgICBvbGQudGFiTmFtZSA9PSBqc29uLnRhYk5hbWUgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgIG9sZC5iaW5kRmlsbGQgPT0ganNvbi5iaW5kRmlsbGQNCiAgICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PbGRKb3NuID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0luT2xkSm9zbikgew0KICAgICAgICAgICAgICAgICAgICAgIG9sZEpvc24ucHVzaChqc29uKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oDQogICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1JbXBvcnRUZW1wSnNvbicsDQogICAgICAgICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob2xkSm9zbikNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGFyYW0ub25FcnJvcigpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aYvuekuuWtkOihqOWvueivneahhg0KICAgICAgICAgIHNob3dTdWJMaXN0KHJlZklkKSB7DQogICAgICAgICAgICB0aGlzLnJlZklkID0gcmVmSWQNCiAgICAgICAgICAgIHRoaXMuZ2V0U3ViRW50c0J5Rm9ybUtleShyZWZJZCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5pi+56S65L+u5pS56K6w5b2VDQogICAgICAgICAgb3BlblJlY29yZExpc3QocmVmSWQpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVjb3JkVmlzaWJsZSA9IHRydWUNCiAgICAgICAgICAgIHRoaXMucmVjb3JkUmVmSWQgPSByZWZJZA0KICAgICAgICAgICAgbGV0IHBhcmFtID0gew0KICAgICAgICAgICAgICBwYWdlQmVhbjoge3BhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiB0cnVlfSwNCiAgICAgICAgICAgICAgc29ydGVyOiBbe2RpcmVjdGlvbjogJ0FTQycsIHByb3BlcnR5OiAnbW9kaWZ5VGltZSd9XSwNCiAgICAgICAgICAgICAgcXVlcnlzOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywNCiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSB0cnVlDQogICAgICAgICAgICBsZXQgdXJsID0gJyR7YnBtUnVuVGltZX0vYnBtL2JvRGF0YU1vZGlmeVJlY29yZC92MS9saXN0SnNvbicNCiAgICAgICAgICAgIHJlcS5wb3N0KHVybCwgcGFyYW0pLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgICAgdGhpcy5yZWNvcmRMaXN0ID0gcmVzcC5kYXRhLnJvd3MNCiAgICAgICAgICAgICAgdGhpcy5tb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcC5kYXRhLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLA0KICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVJlY29yZEN1cnJlbnRDaGFuZ2UoaW5kZXgsIG1vZGlmeVJlY29yZCkgew0KICAgICAgICAgICAgbW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4DQogICAgICAgICAgICBsZXQgcGFyYW0gPSB7DQogICAgICAgICAgICAgIHBhZ2VCZWFuOiBtb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiwNCiAgICAgICAgICAgICAgc29ydGVyOiBbe2RpcmVjdGlvbjogJ0FTQycsIHByb3BlcnR5OiAnbW9kaWZ5VGltZSd9XSwNCiAgICAgICAgICAgICAgcXVlcnlzOiBbDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdyZWZfaWRfJywNCiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnJlY29yZFJlZklkLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSB0cnVlDQogICAgICAgICAgICBsZXQgdXJsID0gJyR7YnBtUnVuVGltZX0vYnBtL2JvRGF0YU1vZGlmeVJlY29yZC92MS9saXN0SnNvbicNCiAgICAgICAgICAgIHJlcS5wb3N0KHVybCwgcGFyYW0pLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgICAgdGhpcy5yZWNvcmRMaXN0ID0gcmVzcC5kYXRhLnJvd3MNCiAgICAgICAgICAgICAgdGhpcy5tb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcC5kYXRhLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3AuZGF0YS5wYWdlLA0KICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Y+W5raI5L+u5pS56K6w5b2V5a+56K+d5qGGDQogICAgICAgICAgcmVjb3JkQ2FuY2VsKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMucmVjb3JkTGlzdCA9IFtdDQogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gJycNCiAgICAgICAgICAgIHRoaXMubW9kaWZ5UmVjb3JkID0gew0KICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgICAgICAgICAgcGFnZUJlYW46IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsDQogICAgICAgICAgICAgICAgICB0b3RhbDogMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy8NCiAgICAgICAgICBvcGVuTW9kaWZ5RGV0YWlsKHJvdykgew0KICAgICAgICAgICAgdGhpcy5jdXJyZW50TW9kaWZ5ID0gcm93DQogICAgICAgICAgICB0aGlzLm1vZGlmeURldGFpbERpYWxvZ1Zpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+afpeeci+S/ruaUueiusOW9leivpuaDhQ0KICAgICAgICAgIHNob3dNb2RpZnlSZWNvcmQoaWQsIHJlZklkKSB7DQogICAgICAgICAgICB2YXIgdXJsID0NCiAgICAgICAgICAgICAgJy9zdGF0ZW1lbnQvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICcvZ2V0L3RydWUnICsNCiAgICAgICAgICAgICAgJz9pZD0nICsNCiAgICAgICAgICAgICAgcmVmSWQgKw0KICAgICAgICAgICAgICAnJnN0YXJ0Rmxvdz1mYWxzZSZyZWNvcmRJZD0nICsNCiAgICAgICAgICAgICAgaWQgKw0KICAgICAgICAgICAgICAnJmlzTmV3UGFnZT10cnVlJw0KICAgICAgICAgICAgd2luZG93Lm9wZW4odGhpcy4kcm91dGVyLnJlc29sdmUodXJsKS5ocmVmLCAnX2JsYW5rJykNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v56Gu5a6a5a+85Ye6DQogICAgICAgICAgc3VibWl0RXhwb3J0KCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLmV4cG9ydERhdGEgfHwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLA0KICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfor7fpgInmi6nopoHlr7zlh7rnmoTlrZfmrrXvvIEnDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIHJldHVybg0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5leHBvcnRUeXBlID09PSAnbWFpbicpIHRoaXMuZXhwb3J0TWFpbigpDQogICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3ViRGF0YSgNCiAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQsDQogICAgICAgICAgICAgICAgdGhpcy5yZWZJZCwNCiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIuZW50TmFtZQ0KICAgICAgICAgICAgICApDQogICAgICAgICAgfSwNCiAgICAgICAgICBleHBvcnRNYWluKCkgew0KICAgICAgICAgICAgbGV0IGV4cEZpZWxkID0gJycNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGlmIChpID4gMCkgew0KICAgICAgICAgICAgICAgIGV4cEZpZWxkICs9ICcsJw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGV4cEZpZWxkICs9IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZFtpXS5uYW1lDQogICAgICAgICAgICB9DQogICAgICAgICAgICBleHBGaWVsZCA9IEJhc2U2NC5lbmNvZGUoZXhwRmllbGQpDQoNCiAgICAgICAgICAgIGxldCBkYXRhID0gew0KICAgICAgICAgICAgICBib0FsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcywNCiAgICAgICAgICAgICAgZ2V0VHlwZTogdGhpcy5leHBvcnREYXRhLmdldFR5cGUsDQogICAgICAgICAgICAgIGV4cEZpZWxkOiBleHBGaWVsZCwNCiAgICAgICAgICAgICAgZmlsdGVyS2V5OiAnJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZGF0YS5xdWVyeSA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKS5wYWdpbmF0aW9uDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldyAmJiB0aGlzLmRhdGFWaWV3LmJpbmRTZWxlY3RkKSB7DQogICAgICAgICAgICAgIGRhdGEucXVlcnkucXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmRhdGFWaWV3LnNlbGVjdFZhbHVlLA0KICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ0ZfJyArIHRoaXMuZGF0YVZpZXcuYmluZFNlbGVjdGQNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KSAvL+W8gOWniw0KICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2Zvcm0vdGVtcGxhdGVFeHBvcnQnLCBkYXRhKS50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCkgLy8g57uT5p2fDQogICAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIHRoaXMuZXhwb3J0U3ViRGF0YSgNCiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW2ldLnNlbGVjdGlvbiwNCiAgICAgICAgICAgICAgICAnJywNCiAgICAgICAgICAgICAgICB0aGlzLnN1YkRpc3BsYXlGaWVsZHNMaXN0W2ldLm5hbWUNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy4kcmVmc1snc3ViRXhwb3J0VGFibGUnXVtpXSwgJ3NlbGVjdGlvbicsIFtdKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZXhwb3J0U3ViRGF0YShleHBGaWVsZHMsIHJlZklkLCBhbGlhcykgew0KICAgICAgICAgICAgbGV0IGV4cEZpZWxkID0gW10NCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwRmllbGRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGV4cEZpZWxkLnB1c2goew0KICAgICAgICAgICAgICAgIGtleTogZXhwRmllbGRzW2ldLm5hbWUsDQogICAgICAgICAgICAgICAgdmFsdWU6IGV4cEZpZWxkc1tpXS5kZXNjDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgYWxpYXM6IGFsaWFzLA0KICAgICAgICAgICAgICByZWZJZDogcmVmSWQsDQogICAgICAgICAgICAgIHR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLA0KICAgICAgICAgICAgICBleHBGaWVsZDogSlNPTi5zdHJpbmdpZnkoZXhwRmllbGQpLA0KICAgICAgICAgICAgICBmaWx0ZXJLZXk6ICcnDQogICAgICAgICAgICB9DQogICAgICAgICAgICBkYXRhLnF1ZXJ5RmlsdGVyID0gdGhpcy5jdXJyZW50VGFiLnBhZ2luYXRpb24NCiAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KQ0KICAgICAgICAgICAgZm9ybS5zdWJFeHBvcnQoZGF0YSwgcmVzcCA9PiB7DQogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpDQogICAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lj5bmtojlr7zlh7oNCiAgICAgICAgICBleHBvcnRDYW5jZWwoKSB7DQogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gW10NCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Y+W5raI5a2Q6KGo5a+56K+d5qGGDQogICAgICAgICAgc3ViQ2FuY2VsKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dTdWJWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMudGFicyA9IFtdDQogICAgICAgICAgICB0aGlzLmVudHMgPSBbXQ0KICAgICAgICAgIH0sDQogICAgICAgICAgc3VuQ2FuY2VsKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dTdW5WaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuc3VuVGFicyA9IFtdDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3Rpb25DaGFuZ2UodmFsKSB7DQogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXQ0KICAgICAgICAgICAgaWYgKHZhbCkgew0KICAgICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSB2YWwNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5YWo6YCJDQogICAgICAgICAgaGFuZGxlRXhwb3J0U2VsZWN0QWxsKCkgew0KICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gdGhpcy5kaXNwbGF5RmllbGRzDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aOkuW6jw0KICAgICAgICAgIHNvcnQoaW5kZXgsIHR5cGUpIHsNCiAgICAgICAgICAgIGlmICgndXAnID09IHR5cGUpIHsNCiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAwKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit56ys5LiA5L2NJywNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgbGV0IHRlbXAgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggLSAxXQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCgNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcywNCiAgICAgICAgICAgICAgICAgIGluZGV4IC0gMSwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0NCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIHRlbXApDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5kaXNwbGF5RmllbGRzLmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Lnu4/mmK/liJfooajkuK3mnIDlkI7kuIDkvY0nLA0KICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmlzVHJhbnNpdGlvbiA9IHRydWUNCiAgICAgICAgICAgICAgICBsZXQgaSA9IHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleCArIDFdDQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLA0KICAgICAgICAgICAgICAgICAgaW5kZXggKyAxLA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgaSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgYXN5bmMgZ2V0U3VuRGF0YSh0YWIsIHJvdykgew0KICAgICAgICAgICAgbGV0IGVudHMgPSB0YWIuY2hpbGRFbnRzDQogICAgICAgICAgICBsZXQgcGsgPSB0YWIucGtLZXkNCiAgICAgICAgICAgIGxldCByZWZJZCA9ICcnDQogICAgICAgICAgICBpZiAocm93W3BrLnRvTG9jYWxlTG93ZXJDYXNlKCldKSB7DQogICAgICAgICAgICAgIHJlZklkID0gcm93W3BrLnRvTG9jYWxlTG93ZXJDYXNlKCldDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICByZWZJZCA9IHJvd1tway50b1VwcGVyQ2FzZSgpXQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5zdWJUYWJsZUxvYWRpbmcgPSB0cnVlDQogICAgICAgICAgICBpZiAoZW50cyAmJiBlbnRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IHRhYiA9IGF3YWl0IHRoaXMuZ2V0Qm9EYXRhKGVudHNbaV0sIHJlZklkKQ0KICAgICAgICAgICAgICAgIHRoaXMuc3VuVGFicy5wdXNoKHRhYikNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5zdWJUYWJsZUxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5kaWFsb2dTdW5WaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0Qm9EYXRhKGVudCwgcmVmSWQpIHsNCiAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVMaXN0ID0gZW50LmF0dHJpYnV0ZUxpc3QNCiAgICAgICAgICAgIGxldCB0YWIgPSB7DQogICAgICAgICAgICAgIHJlZklkOiByZWZJZCwNCiAgICAgICAgICAgICAgcGtLZXk6IGVudC5wa0tleSwNCiAgICAgICAgICAgICAgbmFtZTogZW50LnRhYmxlTmFtZSwNCiAgICAgICAgICAgICAgZW50TmFtZTogZW50Lm5hbWUsDQogICAgICAgICAgICAgIHRpdGxlOiBlbnQuY29tbWVudCwNCiAgICAgICAgICAgICAgYXR0cmlidXRlTGlzdDogYXR0cmlidXRlTGlzdCwNCiAgICAgICAgICAgICAgY29tbWVudDogZW50LmNvbW1lbnQsDQogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsNCiAgICAgICAgICAgICAgICBwYWdlQmVhbjogew0KICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICAgICAgICAgICAgcGFnZTogMSwNCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0YWIuY2hpbGRFbnRzID0gW10NCiAgICAgICAgICAgIGlmIChlbnQuY2hpbGRFbnRzICYmIGVudC5jaGlsZEVudHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICB0YWIuY2hpbGRFbnRzID0gZW50LmNoaWxkRW50cw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0U3ViRGF0YVBhZ2luYXRpb24nLCB7DQogICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB0YWIucGFnaW5hdGlvbiwNCiAgICAgICAgICAgICAgICAgIG5hbWU6IGVudC5uYW1lLA0KICAgICAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhICYmIGRhdGEucm93cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIHRhYi5kYXRhTGlzdCA9IGRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlU2l6ZSA9IGRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGRhdGEucGFnZQ0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi50b3RhbCA9IGRhdGEudG90YWwNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHRhYi5kYXRhTGlzdCA9IFtdDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gMQ0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gMQ0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi50b3RhbCA9IDANCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHJlc29sdmUodGFiKQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0U3ViRW50c0J5Rm9ybUtleShyZWZJZCkgew0KICAgICAgICAgICAgLyppZiAoIXRoaXMuZW50cyB8fCB0aGlzLmVudHMubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgICBmb3JtLmdldFN1YkVudHNCeUZvcm1LZXkodGhpcy50ZW1wbGF0ZUluZm8uZm9ybUtleSwgKHJlc3ApID0+IHsNCiAgICAgICAgICAgICAgICAvLyDlrZDooajkuI7lrZnooajlrZfmrrXlkI3orr7nva7lsI/lhpkNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3AuZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhW2ldLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyaWJ1dGUgPT4gew0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YVtpXS5jaGlsZEVudHMuZm9yRWFjaChzaG93Q2hpbGRFbnQgPT4gew0KICAgICAgICAgICAgICAgICAgICBzaG93Q2hpbGRFbnQuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuZW50cyA9IHJlc3AuZGF0YTsNCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9IGVsc2UgeyovDQogICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgcmVmSWQpDQogICAgICAgICAgICAvKiB9Ki8NCiAgICAgICAgICB9LA0KICAgICAgICAgIGFzeW5jIGdldFN1YkRhdGEoX21lLCByZWZJZCkgew0KICAgICAgICAgICAgLy9sZXQgZW50cyA9IHRoaXMuZW50czsNCiAgICAgICAgICAgIGxldCBlbnRzID0gSlNPTi5wYXJzZShfbWUudGVtcGxhdGVJbmZvLnN1YkZpZWxkKQ0KDQogICAgICAgICAgICBpZiAoZW50cyAmJiBlbnRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgZW50c1tpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0ciA9PiB7DQogICAgICAgICAgICAgICAgICBhdHRyLmZpZWxkTmFtZSA9IGF0dHIuZmllbGROYW1lLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIGVudHNbaV0uY2hpbGRFbnRzLmZvckVhY2goc2hvd0NoaWxkRW50ID0+IHsNCiAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIGxldCB0YWIgPSBhd2FpdCB0aGlzLmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCkNCiAgICAgICAgICAgICAgICB0aGlzLnRhYnMucHVzaCh0YWIpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3ViVmlzaWJsZSA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIG5vZGVDbGljayhub2RlKSB7DQogICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpDQogICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7DQogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgIC8v5q+P5qyh54K55Ye76L+H5ruk5qCRLOW6lOivpeaKiuWPs+i+ueeahHRhYmxlIOS4juWIhumhteWFqOmDqOmHjee9ruS4uuWIneWniw0KDQogICAgICAgICAgICBsZXQgcGFnZUJlYW4gPSB7DQogICAgICAgICAgICAgIHBhZ2VCZWFuOiB7cGFnZTogMSwgcGFnZVNpemU6IHRoaXMucGFnaW5hdGlvbi5wYWdlU2l6ZX0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cyA9IFtdDQogICAgICAgICAgICBpZiAoIW5vZGUuaWQgfHwgbm9kZS5pZCAhPSAtMSkgew0KICAgICAgICAgICAgICBsZXQgdHJlZUZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby50cmVlRmllbGQpDQogICAgICAgICAgICAgIHRyZWVGaWVsZC5xdWVyeXMuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoaXRlbS5rZXlfICYmIGl0ZW0udmFsdWVfKSB7DQogICAgICAgICAgICAgICAgICBwYWdlQmVhbi5xdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnJFRSRUUkJyArIGl0ZW0ua2V5XywNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG5vZGVbaXRlbS52YWx1ZV9dLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+aKiui/h+a7pOagkeeahOafpeivouadoeS7tuWtmOS4gOS7vei1t+adpSzlj7PovrnnmoTmkJzntKLkuI7liIbpobXmiY3og73lkIzml7bkvb/nlKgNCiAgICAgICAgICAgIHRoaXMudHJlZVF1ZXJ5cyA9IHBhZ2VCZWFuLnF1ZXJ5cw0KDQogICAgICAgICAgICBsZXQgcGFyYW1zID0gew0KICAgICAgICAgICAgICB0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZCwNCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogcGFnZUJlYW4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucmVzZXQodHJ1ZSkNCiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2DQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0ICYmIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPjApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZQ0KICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlDQogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Yqg6L295qCR55qE5L+h5oGvDQogICAgICAgICAgdG9UcmVlRGF0YShkYXRhLCBpZCwgcGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgICAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wDQogICAgICAgICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAgICAgICB2YWx1ZSA9Pg0KICAgICAgICAgICAgICAgIHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8DQogICAgICAgICAgICAgICAgdmFsdWVbcGlkXSA9PSBudWxsIHx8DQogICAgICAgICAgICAgICAgdmFsdWVbcGlkXSA9PSBwdmFsdWUNCiAgICAgICAgICAgICkNCiAgICAgICAgICAgIGlmICghcGFyZW50cykgew0KICAgICAgICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoDQogICAgICAgICAgICAgICAgdmFsdWUgPT4NCiAgICAgICAgICAgICAgICAgIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmDQogICAgICAgICAgICAgICAgICB2YWx1ZVtwaWRdICE9IG51bGwgJiYNCiAgICAgICAgICAgICAgICAgIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBwYXJlbnRzDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WIneWni+WMluagkQ0KICAgICAgICAgIGluaXRUcmVlKHRyZWVGaWVsZCkgew0KICAgICAgICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICAgICAgICBmb3JtLmdldEJ5QWxpYXModHJlZUZpZWxkLmFsaWFzLCByZXMgPT4gew0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSByZXMNCiAgICAgICAgICAgICAgZGlhbG9nLmdldFRyZWVEYXRhKA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiAnR0VUJywNCiAgICAgICAgICAgICAgICAgIHVybDoNCiAgICAgICAgICAgICAgICAgICAgJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArDQogICAgICAgICAgICAgICAgICAgIHRyZWVGaWVsZC5hbGlhcyArDQogICAgICAgICAgICAgICAgICAgICcmbWFwUGFyYW09Jw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVzcCA9PiB7DQogICAgICAgICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSgNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkDQogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcC5kYXRhDQogICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0ge30NCiAgICAgICAgICAgICAgICAgICAgaGVhZFtkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWVdID0gJ+WFqOmDqCcNCiAgICAgICAgICAgICAgICAgICAgaGVhZC5pZCA9IC0xDQogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWUucHVzaChoZWFkKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGxvYWRUcmVlKG5vZGUsIHJlc29sdmUpIHsNCiAgICAgICAgICAgIGlmIChub2RlKSB7DQogICAgICAgICAgICAgIGlmIChub2RlLmRhdGEuaWQgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgbGV0IHRyZWUgPSB0aGlzLnRvVHJlZURhdGEoDQogICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0LA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGQuaWQsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA/IHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICByZXNvbHZlKHRyZWUpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmVzb2x2ZSgNCiAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUxpc3QuZmlsdGVyKA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9Pg0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW3RoaXMuZGlzcGxheUZpZWxkLnBpZF0gPT09DQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhW3RoaXMuZGlzcGxheUZpZWxkLmlkXQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgcmVzb2x2ZShbXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoaW5kZXgsIHRhYikgew0KICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4DQogICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRTdWJEYXRhUGFnaW5hdGlvbicsIHsNCiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB0YWIucGFnaW5hdGlvbiwNCiAgICAgICAgICAgICAgICBuYW1lOiB0YWIuZW50TmFtZSwNCiAgICAgICAgICAgICAgICByZWZJZDogdGFiLnJlZklkID8gdGFiLnJlZklkIDogdGhpcy5yZWZJZA0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgICAgcGFnZTogcmVzcC5wYWdlLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IHJlc3AudG90YWwNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gcmVzcC5yb3dzDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBxdWVyeVN1YlRhYmxlKHRhYikgew0KICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzID0gW10NCiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5U3ViVmFsdWUpIHsNCiAgICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICAvL3BnU3Fs5L2/55So5qih57OK5p+l6K+i77yM57G75Z6L5LiN5Yy56YWN5pe25Lya5oql6ZSZ77yM5q2k5aSE5Y+q5L+d55WZdmFyY2hhcuexu+Weiw0KICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgew0KICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5U3ViVmFsdWUsDQogICAgICAgICAgICAgICAgICBncm91cDogJ290aGVyJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5xdWVyeVN1blZhbHVlKSB7DQogICAgICAgICAgICAgIHRhYi5hdHRyaWJ1dGVMaXN0LmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgLy8gaWYgKGl0ZW0uZGF0YVR5cGUgPT0gJ3ZhcmNoYXInKSB7DQogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGROYW1lLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnlTdW5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLA0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJDdXJyZW50Q2hhbmdlKDEsIHRhYikNCiAgICAgICAgICB9LA0KICAgICAgICAgIGltcG9ydFN1YihwYXJhbSkgew0KICAgICAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCkNCiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpDQogICAgICAgICAgICBsZXQgcGFyYW1zID0gew0KICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSwNCiAgICAgICAgICAgICAgYWxpYXM6IHRoaXMuY3VycmVudFRhYi5lbnROYW1lLA0KICAgICAgICAgICAgICByZWZJZDogdGhpcy5yZWZJZA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9ybS5zdWJJbXBvcnQocGFyYW1zLCBkYXRhID0+IHsNCiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnc3VjY2VzcycsIG1lc3NhZ2U6IGRhdGEubWVzc2FnZX0pDQogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCkNCiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoMSwgdGhpcy5jdXJyZW50VGFiKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZGF0YS5tZXNzYWdlKQ0KICAgICAgICAgICAgICAgIHBhcmFtLm9uRXJyb3IoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZXhwb3J0U3ViKHRhYikgew0KICAgICAgICAgICAgdGhpcy5leHBvcnRUeXBlID0gJ3N1YicNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYg0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzID0gW10NCiAgICAgICAgICAgIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QgPSBbXQ0KICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLnB1c2goew0KICAgICAgICAgICAgICAgIGRlc2M6IGl0ZW0uY29tbWVudCwNCiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtLmNvbHVtblR5cGUNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBpbXBvcnRCdXR0b24odGFiKSB7DQogICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSB0YWINCiAgICAgICAgICB9LA0KICAgICAgICAgIG15RHJhZnRMaXN0KCkgew0KICAgICAgICAgICAgLy/mlbDmja7op4blm77pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0gIOW5tuS4lOW9k+WJjeaVsOaNruinhuWbvuS4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbviAgZGF0YVZpZXcNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJg0KICAgICAgICAgICAgICAhdGhpcy5kYXRhVmlldyAmJg0KICAgICAgICAgICAgICAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykNCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBkYXRhVmlld0ZsYWcgPSBmYWxzZTsNCiAgICAgICAgICAgIC8v5Yik5pat5b2T5YmN5pWw5o2u6KeG5Zu+5piv5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+DQogICAgICAgICAgICBpZih0aGlzLmRhdGFWaWV3KXsNCiAgICAgICAgICAgICAgaWYodGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICYmIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAhPSAiIil7DQogICAgICAgICAgICAgICAgZGF0YVZpZXdGbGFnID0gdHJ1ZTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IHBhdGggPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvZHJhZnRMaXN0LycgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcyArDQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIGRhdGFWaWV3RmxhZzsNCiAgICAgICAgICAgICAgaWYodGhpcy5vcGVuVHlwZSA9PSAibmV3IiB8fCBkYXRhVmlld0ZsYWcpew0KICAgICAgICAgICAgICAgIHBhdGggKz0gIj9pc05ldz10cnVlIjsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZihkYXRhVmlld0ZsYWcpIHsNCiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihwYXRoLCAnX2JsYW5rJyk7DQogICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHBhdGgpOw0KICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8vIGxldCB1cmwgPQ0KICAgICAgICAgICAgLy8gICAiL3N0YXRlbWVudC9kcmFmdExpc3Q/dGVtcEFsaWFzPSIgKyA7DQogICAgICAgICAgICAvLyBjb25zdCB7IGhyZWYgfSA9IHRoaXMuJHJvdXRlci5wdXNoKHsNCiAgICAgICAgICAgIC8vICAgcGF0aDogdXJsLA0KICAgICAgICAgICAgLy8gfSk7DQogICAgICAgICAgICAvLyB3aW5kb3cub3BlbihocmVmLCAiX2JsYW5rIik7DQogICAgICAgICAgfSwNCiAgICAgICAgICBpbml0U3dpdGNoU3RhdHVzKCkgew0KICAgICAgICAgICAgLy/liJ3lp4vljJblvIDlhbPnirbmgIENCiAgICAgICAgICAgIGxldCBtYW5hZ2VzID0gdXRpbHMucGFyc2VUb0pzb24odGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpDQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hbmFnZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgaWYgKG1hbmFnZXNbaV0ubmFtZSA9PT0gJ3N3aXRjaCcpIHsNCiAgICAgICAgICAgICAgICBsZXQgZmllbGROYW1lID0gbWFuYWdlc1tpXS5iaW5kOw0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnN3aXRjaE1hcCxmaWVsZE5hbWUse30pOw0KICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub24gPSBtYW5hZ2VzW2ldLnN3aXRjaE9uOw0KICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub2ZmID0gbWFuYWdlc1tpXS5zd2l0Y2hPZmY7DQogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPbkxhYmVsOw0KICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub2ZmTGFiZWwgPSBtYW5hZ2VzW2ldLnN3aXRjaE9mZkxhYmVsOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBzd2l0Y2hDaGFuZ2UocGtWYWwsIG9uLCBvZmYsIGZpZWxkTmFtZSwgcm93LCBkZWZhdWx0VHJ1ZSkgew0KICAgICAgICAgICAgbGV0IHRoaXNfID0gdGhpcw0KICAgICAgICAgICAgbGV0IHZhbCA9IHJvd1tmaWVsZE5hbWVdOw0KICAgICAgICAgICAgaWYodmFsICE9IG9uICYmIHZhbCAhPSBvZmYpew0KICAgICAgICAgICAgICBpZihkZWZhdWx0VHJ1ZSA9PSAidHJ1ZSIpew0KICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csZmllbGROYW1lLG9mZik7DQogICAgICAgICAgICAgICAgdmFsID0gb2ZmOw0KICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQocm93LGZpZWxkTmFtZSxvbik7DQogICAgICAgICAgICAgICAgdmFsID0gb247DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXNfDQogICAgICAgICAgICAgIC4kY29uZmlybSgn5bCG5Lya5L+u5pS56K+l5pWw5o2u77yM5piv5ZCm57un57utPycsIHsNCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm0NCiAgICAgICAgICAgICAgICBsZXQgZm9ybUFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmZvcm1LZXkgLy/ooajljZXliKvlkI0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMgLy/mlbDmja7lu7rmqKHliKvlkI0NCiAgICAgICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgICAgIC5nZXQoDQogICAgICAgICAgICAgICAgICAgIGZvcm0gKw0KICAgICAgICAgICAgICAgICAgICAgICcvZm9ybS9kYXRhVGVtcGxhdGUvdjEvZ2V0Rm9ybS8nICsNCiAgICAgICAgICAgICAgICAgICAgICBmb3JtQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgZGF0YURlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICAgICAgICAgIHBrVmFsICsNCiAgICAgICAgICAgICAgICAgICAgICAnJmFjdGlvbj1nZXQmcmVjb3JkSWQ9Jw0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgICAgICAgIGxldCBib0RhdGEgPSByZXNwLmRhdGEuZGF0YQ0KICAgICAgICAgICAgICAgICAgICBib0RhdGFbZGF0YURlZkFsaWFzXVtmaWVsZE5hbWVdID0gdmFsOw0KICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZURhdGEgPSB7DQogICAgICAgICAgICAgICAgICAgICAgYm9BbGlhczogdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMsDQogICAgICAgICAgICAgICAgICAgICAgYm9EYXRhOiByZXNwLmRhdGEuZGF0YQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9ib1NhdmUnLCBzYXZlRGF0YSkNCiAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjmiJDlip8nDQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5L+d5a2Y5aSx6LSlJw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIGxldCBmb3JtID0gd2luZG93LmNvbnRleHQuZm9ybQ0KICAgICAgICAgICAgICAgIGxldCBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleSAvL+ihqOWNleWIq+WQjQ0KICAgICAgICAgICAgICAgIGxldCBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcyAvL+aVsOaNruW7uuaooeWIq+WQjQ0KICAgICAgICAgICAgICAgIHJlcQ0KICAgICAgICAgICAgICAgIC5nZXQoDQogICAgICAgICAgICAgICAgICBmb3JtICsNCiAgICAgICAgICAgICAgICAgICAgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgICBmb3JtQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICAgICAgICBkYXRhRGVmQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICAgICAgICBwa1ZhbCArDQogICAgICAgICAgICAgICAgICAgICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nDQogICAgICAgICAgICAgICAgKS50aGVuKHJlc3A9PnsNCiAgICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQocm93LGZpZWxkTmFtZSxyZXNwLmRhdGEuZGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0pOw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBkaXNwbGF5KG1wRGlzcGxheSkgew0KICAgICAgICAgICAgLy9wY+err+eahOaVsOaNruaKpeihqOS4jemcgOimgeWBmuacrOaWueazleeahOWkhOeQhu+8jOebtOaOpei/lOWbnnRydWXljbPlj6/jgIINCiAgICAgICAgICAgIHJldHVybiB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRGaXhlZChmaXhlZCkgew0KICAgICAgICAgICAgcmV0dXJuIGZpeGVkDQogICAgICAgICAgfSwNCiAgICAgICAgICBzdW1tYXJ5KG1ldGhvZCwgZmllbGQsIGRlY2ltYWwpIHsNCiAgICAgICAgICAgIGxldCBsaXN0ID0gdGhpcy5yb3dzDQogICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpZWxkXSAhPT0gdW5kZWZpbmVkICYmIGl0ZW1bZmllbGRdICE9PSAnJykNCiAgICAgICAgICAgICAgLm1hcChpdGVtID0+IG5ldyBOdW1iZXIoaXRlbVtmaWVsZF0pKQ0KICAgICAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobWV0aG9kID09PSAnY291bnQnKSB7DQogICAgICAgICAgICAgIHJldHVybiBsaXN0Lmxlbmd0aA0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdzdW0nKSB7DQogICAgICAgICAgICAgIHJldHVybiBsaXN0LnJlZHVjZSgoYSwgYikgPT4gYSArIGIpLnRvRml4ZWQoZGVjaW1hbCkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWluJykgew0KICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oLi4ubGlzdCkudG9GaXhlZChkZWNpbWFsKQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdtYXgnKSB7DQogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCguLi5saXN0KS50b0ZpeGVkKGRlY2ltYWwpDQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2F2ZycpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LnJlZHVjZSgoYSwgYikgPT4gYSArIGIpIC8gbGlzdC5sZW5ndGgpLnRvRml4ZWQoDQogICAgICAgICAgICAgICAgZGVjaW1hbA0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRDb2xvcihkYXRhLCByb3cpIHsNCiAgICAgICAgICAgIGxldCByZXN1Q29sb3IgPSAnY29sb3I6YmxhY2snDQogICAgICAgICAgICBsZXQgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKQ0KICAgICAgICAgICAgbGV0IGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKQ0KICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChydWxlID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSkNCiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgew0KICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gJ2NvbG9yOicgKyBydWxlLnByb0NvbG9yDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VDb2xvcg0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UHJvVmFsdWUodmFsdWUsIHJ1bGUpIHsNCiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSAvIHJ1bGUpICogMTAwMDApIC8gMTAwIC8vIOWwj+aVsOeCueWQjuS4pOS9jeeZvuWIhuavlA0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UHJvQ29sb3IoZGF0YSwgcm93KSB7DQogICAgICAgICAgICBsZXQgcmVzdUNvbG9yID0gJyM0MDllZmYnDQogICAgICAgICAgICBsZXQgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKQ0KICAgICAgICAgICAgLypkZWNvZGU9ZGVjb2RlLnJlcGxhY2UoL1xzKiEvZywiIik7Ki8NCiAgICAgICAgICAgIGxldCBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSkNCiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsNCiAgICAgICAgICAgICAgY29sb3JSdWxlLmZvckVhY2gocnVsZSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpDQogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsNCiAgICAgICAgICAgICAgICAgIHJlc3VDb2xvciA9IHJ1bGUucHJvQ29sb3INCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdUNvbG9yDQogICAgICAgICAgfSwNCiAgICAgICAgICBpc1NvcnRhYmxlKGZpZWxkKSB7DQogICAgICAgICAgICBsZXQgaXNDbG9iID0gZmFsc2U7DQogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgaWYgKGl0ZW0ubmFtZSA9PT0gZmllbGQgJiYgaXRlbS50eXBlPT09J2Nsb2InKSB7DQogICAgICAgICAgICAgICAgaXNDbG9iID0gdHJ1ZTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gIXRoaXMubm90U29ydGFibGVGaWVsZHMuaW5jbHVkZXMoZmllbGQpICYmICFpc0Nsb2I7DQogICAgICAgICAgfSwNCiAgICAgICAgICBjdXN0b21FdmlsSlMocm93LCBodFNjcmlwdCkgew0KICAgICAgICAgICAgbGV0IEZuID0gRnVuY3Rpb24oJ19yZXEnLCAncm93JywgJ190aGlzJywgQmFzZTY0LmRlY29kZShodFNjcmlwdCkpIC8v5LiA5Liq5Y+Y6YeP5oyH5ZCRRnVuY3Rpb27vvIzpmLLmraLmnInkupvliY3nq6/nvJbor5Hlt6XlhbfmiqXplJkNCiAgICAgICAgICAgIGxldCByZXN1bHQgPSBGbihyZXEsIHJvdywgdGhpcykNCiAgICAgICAgICB9LA0KICAgICAgICAgIGJhdGNoVXBkYXRlKHRpdGxlLGJhc2U2NEpzb24sIGJhc2U2NEZpbGVkcykgew0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzID09IG51bGwgfHwNCiAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cy5sZW5ndGggPT0gMA0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uud2FybmluZygn6K+36YCJ5oup5pWw5o2uJykNCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlTGlzdCA9IFtdDQogICAgICAgICAgICBsZXQgb3V0Rm9ybSA9IFtdDQogICAgICAgICAgICBpZiAoYmFzZTY0SnNvbikgew0KICAgICAgICAgICAgICAvL+aYr+WQpuacieeUqOaIt+iHquW3sei+k+WFpeeahOWtl+autQ0KICAgICAgICAgICAgICBsZXQgcmVzID0gdHJ1ZQ0KICAgICAgICAgICAgICBsZXQgYmF0Y2hVcGRhdGVEYXRhID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGJhc2U2NEpzb24pKQ0KICAgICAgICAgICAgICBsZXQgZmlsZWRzT2JqID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGJhc2U2NEZpbGVkcykpDQogICAgICAgICAgICAgIGJhdGNoVXBkYXRlRGF0YS5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgICAgICAgIGlmIChpdGVtLnZhbHVlVHlwZSA9PSAxKSB7DQogICAgICAgICAgICAgICAgICB2YXIgaXNSZXF1aXJlZD1mYWxzZTsNCiAgICAgICAgICAgICAgICAgIGlmKGl0ZW0uaXNSZXF1aXJlZCl7aXNSZXF1aXJlZD10cnVlO30NCiAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgZGVzYzogZmlsZWRzT2JqW2l0ZW0ubmFtZV0sDQogICAgICAgICAgICAgICAgICAgIG91dFR5cGU6IGl0ZW0ub3V0VmFsdWVUeXBlLA0KICAgICAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RDdXJyZW50OiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgaXNSZXF1aXJlZDppc1JlcXVpcmVkDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBpZiAoaXRlbS5vdXRWYWx1ZVR5cGUgPT0gJ3NlbGVjdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpDQogICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQ9e2FsaWFzOicnLHZhbHVlQmluZDonJyxub0luaXQ6JycsbGFiZWxCaW5kOicnLGJpbmQ6e319Ow0KICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0Q29uZmlnLmN1c3RvbVF1ZXJ5KXsNCiAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2FuZ2VkPXthbGlhczpzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkuYWxpYXMsdmFsdWVCaW5kOnNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS52YWx1ZUJpbmQsbm9Jbml0OicnLGxhYmVsQmluZDpzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkubGFiZWxCaW5kLGJpbmQ6e319Ow0KICAgICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQ9Z2FuZ2VkOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3REYXRhID0gc2VsZWN0Q29uZmlnLnNlbGVjdERhdGENCiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnZGlhbG9nJyl7DQogICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RDb25maWcgPSBKU09OLnBhcnNlKGl0ZW0ub3V0Q29uZmlnKQ0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlhbG9nQ29uZmlnPSBzZWxlY3RDb25maWcuZGlhbG9nQ29uZmlnOw0KICAgICAgICAgICAgICAgICAgICBsZXQgbWFwcGluZ0NvbmY9W107DQogICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXI9IHNlbGVjdENvbmZpZy5wYXJhbWV0ZXI7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlPSBwYXJhbWV0ZXJba2V5XSB8fCAiIjsNCiAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ0NvbmYucHVzaCh7ZnJvbTprZXksdGFyZ2V0Olt2YWx1ZV0sdGFyZ2V0U3ViOlt2YWx1ZV19KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGxldCBjdXN0ZGlhbG9nPXtzZWxlY3ROdW06ZGlhbG9nQ29uZmlnLnNlbGVjdE51bSxjb25kaXRpb25zOltdLG1hcHBpbmdDb25mOm1hcHBpbmdDb25mLGN1c3RRdWVyeUpzb246W10sYWxpYXM6ZGlhbG9nQ29uZmlnLmFsaWFzLHR5cGU6ZGlhbG9nQ29uZmlnLmN1c3REaWFsb2d9Ow0KICAgICAgICAgICAgICAgICAgICBvYmouY3VzdGRpYWxvZz17bmFtZTon6K+36YCJ5oupJyxjdXN0RGlhbG9nOmN1c3RkaWFsb2cscmVzdWx0RmllbGQ6ZGlhbG9nQ29uZmlnLnJlc3VsdEZpZWxkfTsNCiAgICAgICAgICAgICAgICAgIH1lbHNlIGlmICgNCiAgICAgICAgICAgICAgICAgICAgaXRlbS5vdXRDb25maWcgJiYNCiAgICAgICAgICAgICAgICAgICAgKGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdpbnB1dCcgfHwNCiAgICAgICAgICAgICAgICAgICAgICBpdGVtLm91dFZhbHVlVHlwZSAhPSAnZGF0YScgfHwNCiAgICAgICAgICAgICAgICAgICAgICBpdGVtLm91dFZhbHVlVHlwZSAhPSAnbnVtYmVyJykNCiAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgb3V0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZykNCiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlciA9IG91dENvbmZpZy5wYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtZXRlcikgew0KICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1ldGVyW2tleV0pIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwYXJhbWV0ZXJba2V5XQ0KICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJba2V5XSA9ICdkYXRhLicgKyBwYXJhbWV0ZXJba2V5XQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q29uZmlnLnNlbGVjdEN1cnJlbnQpIHsNCiAgICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0Q3VycmVudCA9IG91dENvbmZpZy5zZWxlY3RDdXJyZW50DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5pc1NpbmdsZSkgew0KICAgICAgICAgICAgICAgICAgICAgIG9iai5zaW5nbGUgPSBvdXRDb25maWcuaXNTaW5nbGUNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvYmouYmluZENvbmZpZyA9IHBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgb3V0Rm9ybS5wdXNoKG9iaikNCiAgICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIGtleTogaXRlbS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaXRlbS5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICBpZiAocmVzKSB7DQogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlTGlzdCA9IGRlZmF1bHRWYWx1ZUxpc3QNCiAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cuc2hvd0RpYWxvZyh0aXRsZSxvdXRGb3JtKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnaW5mbycsIG1lc3NhZ2U6ICfmnKrorr7nva7mm7TmlrDlhoXlrrknfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIG9uQ29uZmlybShkYXRhKSB7DQogICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlTGlzdCA9IFtdDQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgew0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0LnB1c2goe2tleToga2V5LCB2YWx1ZTogZGF0YVtrZXldfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBib0RhdGEgPSB0aGlzLmRlZmF1bHRWYWx1ZUxpc3Q/dGhpcy5kZWZhdWx0VmFsdWVMaXN0LmNvbmNhdChkZWZhdWx0VmFsdWVMaXN0KTp0aGlzLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQm8oYm9EYXRhKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgdXBkYXRlQm8oZGVmYXVsdFZhbHVlTGlzdCkgew0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5om56YeP5pu05paw5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsNCiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0Um93cyA9IHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIHNlbGVjdFJvd3NbaV0uZm9ybUtleSA9IHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXkNCiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGVmYXVsdFZhbHVlTGlzdC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3dzW2ldW2RlZmF1bHRWYWx1ZUxpc3Rbal0ua2V5XSA9DQogICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdFtqXS52YWx1ZQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgICAgIGJvRGF0YTogc2VsZWN0Um93cywNCiAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9iYXRjaFVwZGF0ZVRlbXBsYXRlRGF0YScsIGRhdGEpDQogICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICAgICAgaWYoZGF0YS5zdGF0ZSl7DQogICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7dHlwZTogJ3N1Y2Nlc3MnLCBtZXNzYWdlOiBkYXRhLm1lc3NhZ2V9KQ0KICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnaW5mbycsIG1lc3NhZ2U6ICflt7Llj5bmtojmm7TmlrAnfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGFkZENvbW1hbmQoY29tbWFuZCkgew0KICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ25vdExvZ2luJyB8fCBjb21tYW5kID09ICdsb2dpbicpIHsNCiAgICAgICAgICAgICAgdGhpcy5nZXRBZGRRUkNvZGUoY29tbWFuZCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEFkZFFSQ29kZShjb21tYW5kKSB7DQogICAgICAgICAgICB0aGlzLlFSQ29kZVBhdHRlcm4gPSBjb21tYW5kID09ICdub3RMb2dpbicgPyB0cnVlIDogZmFsc2UNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGVzYyA9IFtdDQogICAgICAgICAgICB0aGlzLlFSQ29kZVR5cGUgPSAnYWRkJw0KICAgICAgICAgICAgdGhpcy5RUkNvZGVTaG93ID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGlhbG9nID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgc2hvd1NlYXJjaFBhbmUoKSB7DQogICAgICAgICAgICByZXR1cm4gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgYnVpbGREZWZhdWx0UXVlcnlzKCl7DQogICAgICAgICAgICBsZXQgdGhpc18gPSB0aGlzOw0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdOw0KICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKHRoaXNfLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCk7DQogICAgICAgICAgICBsZXQgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PSAxID8gIiIgOiAiRl8iDQogICAgICAgICAgICAvL+adoeS7tuWtl+autem7mOiupOWAvOWIpOaWrQ0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGNvbmRpdGlvbj0+ew0KICAgICAgICAgICAgICBpZihjb25kaXRpb24uZGVmYXVsdFZhbHVlKXsNCiAgICAgICAgICAgICAgICBsZXQgZmllbGQgPSBjb25kaXRpb24uY29sUHJlZml4ICsgY29uZGl0aW9uLm5hOw0KICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSxmaWVsZCxjb25kaXRpb24uZGVmYXVsdFZhbHVlKQ0KICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNvbmRpdGlvbi5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgaWYoY29uZGl0aW9uLnR5ID09ICdudW1iZXInKXsNCiAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OmZpZWxkLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6dmFsdWUsDQogICAgICAgICAgICAgICAgICBncm91cDoibWFpbiIsDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb246Y29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjonQU5EJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAvL+etm+mAieWtl+autem7mOiupOWAvOWIpOaWrQ0KDQogICAgICAgICAgICBsZXQgZmlsdGVycyA9IEpTT04ucGFyc2UodGhpc18udGVtcGxhdGVJbmZvLmZpbHRlcmluZ0ZpZWxkKQ0KICAgICAgICAgICAgZmlsdGVycy5mb3JFYWNoKGZpbHRlcj0+ew0KICAgICAgICAgICAgICBpZihmaWx0ZXIuZGVmYXVsdFZhbHVlICYmIGZpbHRlci5kZWZhdWx0VmFsdWUubGVuZ3RoID4gMCl7DQogICAgICAgICAgICAgICAgdGhpc18uZmlsdGVyTWFwW2ZpbHRlci5uYW1lXSA9IGZpbHRlci5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgZmlsdGVyLmRlZmF1bHRWYWx1ZS5mb3JFYWNoKHZhbD0+ew0KICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTpwcmVmaXgrZmlsdGVyLm5hbWUsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOnZhbCwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ImRlZlZhbF8iK2ZpbHRlci5uYW1lLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IkVRVUFMIiwNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246Ik9SIg0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpc18uJG9uKCJhZnRlck1vdW50ZWQiLCgpPT57DQogICAgICAgICAgICAgIGxldCBoZWFkZXJDb2x1bW5zID0gdGhpc18uJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLiRyZWZzLnRhYmxlSGVhZGVyLmNvbHVtbnM7DQogICAgICAgICAgICAgIGhlYWRlckNvbHVtbnMuZm9yRWFjaChjb2x1bW49PnsNCiAgICAgICAgICAgICAgICBpZih0aGlzXy5maWx0ZXJNYXAuaGFzT3duUHJvcGVydHkoY29sdW1uLnByb3BlcnR5KSl7DQogICAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbY29sdW1uLnByb3BlcnR5XS5mb3JFYWNoKHZhbD0+ew0KICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZmlsdGVyZWRWYWx1ZS5wdXNoKHZhbCk7DQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICByZXR1cm4gcXVlcnlzOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9DQogIH0NCn0NCg=="},null]}