{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1733309211704},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge0xvYWRpbmd9IGZyb20gJ2VsZW1lbnQtdWknDQppbXBvcnQgSHRDaGVja2JveCBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdENoZWNrYm94LnZ1ZScNCmltcG9ydCBIdERpYWxvZyBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdERpYWxvZy52dWUnDQppbXBvcnQgSHREaWFsb2dCdG4gZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvaHREaWFsb2dCdG4udnVlJw0KaW1wb3J0IEVpcFNlbGVjdCBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3QudnVlJw0KaW1wb3J0IFZSdW50aW1lVGVtcGxhdGUgZnJvbSAndi1ydW50aW1lLXRlbXBsYXRlJw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQge0Jhc2U2NH0gZnJvbSAnanMtYmFzZTY0Jw0KaW1wb3J0IFZ1ZSBmcm9tICd2dWUnDQppbXBvcnQgUVJDb2RlIGZyb20gJ3FyY29kZScNCmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJw0KaW1wb3J0IGZvcm0gZnJvbSAnQC9hcGkvZm9ybS5qcycNCmltcG9ydCBkaWFsb2cgZnJvbSAnQC9hcGkvZGlhbG9nQXBpLmpzJw0KDQpjb25zdCBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nID0gKCkgPT4NCiAgaW1wb3J0KCdAL2NvbXBvbmVudHMvZGlhbG9nL1RlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cudnVlJykNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ3RlbXBsYXRlLWR5bmFtaWMtdmlldycsDQogIHByb3BzOiB7DQogICAgdGVtcGxhdGVLZXk6IFN0cmluZywNCiAgICBodG1sOiBTdHJpbmcsDQogICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsDQogICAgcGFyYW1ldGVycVF1ZXJ5czogU3RyaW5nLA0KICAgIHNpbmdsZTogew0KICAgICAgZGVmYXVsdDogJ3RydWUnDQogICAgfSwNCiAgICBkZWZLZXk6IFN0cmluZywNCiAgICB0YXNrVHlwZTogew0KICAgICAgZGVmYXVsdDogJycNCiAgICB9LA0KICAgIGRhdGFWaWV3OiBPYmplY3QsDQogICAgaXNKb2luRmxvdzogew0KICAgICAgZGVmYXVsdDogZmFsc2UNCiAgICB9DQogIH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIHJlZnJlc2hUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwNCiAgICAgIHNob3dEYXRlVmlldzogdHJ1ZQ0KICAgIH0NCiAgfSwNCiAgY3JlYXRlZCgpIHsNCiAgICB0aGlzLmluaXQoKQ0KICB9LA0KICB3YXRjaDogew0KICAgIGh0bWw6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICB0aGlzLmluaXQoKQ0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgbWV0aG9kczogew0KICAgIGluaXQoKSB7DQogICAgICBWdWUuY29tcG9uZW50KCdodC1kYXRhdmlldy1ydW50aW1lLXRlbXBsYXRlJywgew0KICAgICAgICB0ZW1wbGF0ZTogdGhpcy5odG1sLA0KICAgICAgICBwcm9wczogew0KICAgICAgICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsDQogICAgICAgICAgc2luZ2xlOiBTdHJpbmcsDQogICAgICAgICAgZGVmS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGFza1R5cGU6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6ICcnDQogICAgICAgICAgfSwNCiAgICAgICAgICBkYXRhVmlldzogT2JqZWN0LA0KICAgICAgICAgIGlzSm9pbkZsb3c6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgICAgICAgfSwNCiAgICAgICAgICBwYXJhbWV0ZXJxUXVlcnlzOiBTdHJpbmcNCiAgICAgICAgfSwNCiAgICAgICAgZGF0YSgpIHsNCiAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdHJlZVF1ZXJ5czogW10sDQogICAgICAgICAgICBhbGlhc19uZXc6ICdzdGF0ZW1lbnQnLA0KICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsDQogICAgICAgICAgICBRUkNvZGV1cmw6ICcnLA0KICAgICAgICAgICAgUVJDb2RlRGlhbG9nOiBmYWxzZSwNCiAgICAgICAgICAgIGh0bWw6ICcnLA0KICAgICAgICAgICAgdGFibGVEYXRhOiB7c2VsZWN0Um93czogW10sIHF1ZXJ5czogJyd9LA0KICAgICAgICAgICAgZGlhbG9nRXhwb3J0VmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICBleHBvcnREYXRhOiB7Z2V0VHlwZTogJ2FsbCcsIGV4cEZpZWxkOiBbXX0sDQogICAgICAgICAgICBkaXNwbGF5RmllbGRzOiBbXSwNCiAgICAgICAgICAgIGV4cG9ydFNlbGxlY3Rpb246IFtdLA0KICAgICAgICAgICAgc2VhcmNoRm9ybToge0ZfeGI6ICcnLCBGX3htOiAnJ30sDQogICAgICAgICAgICBxdWVyeUZvcm06IHsNCiAgICAgICAgICAgICAgcXVlcnlEYXRhOiAnJw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGZvcm1UeXBlOiBmYWxzZSwNCiAgICAgICAgICAgIGxhYmVsUG9zaXRpb246ICdsZWZ0JywNCiAgICAgICAgICAgIGluY29uczogJ2VsLWljb24tYXJyb3ctZG93bicsDQogICAgICAgICAgICBvcHRpb25zOiB7DQogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUsDQogICAgICAgICAgICAgIGxvY2s6IHRydWUNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByb3dUZW1wbGF0ZUlkOiBudWxsLA0KICAgICAgICAgICAgcm93SWQ6IG51bGwsDQogICAgICAgICAgICBRUkNvZGVTaG93OiB0cnVlLA0KICAgICAgICAgICAgUVJDb2RlRGVzYzogW10sDQogICAgICAgICAgICB0cmVlOiBbXSwNCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogW10sDQogICAgICAgICAgICB0YWJsZUhlaWdodDogMC42ODUgKiB3aW5kb3cuaW5uZXJIZWlnaHQsDQogICAgICAgICAgICBkaWFsb2dTdWJWaXNpYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIHRhYnM6IFtdLA0KICAgICAgICAgICAgZW50czogW10sDQogICAgICAgICAgICBtb2RpZnlSZWNvcmQ6IHsNCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7DQogICAgICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWNvcmRMaXN0OiBbXSwNCiAgICAgICAgICAgIHJlY29yZFJlZklkOiAnJywNCiAgICAgICAgICAgIGRpYWxvZ1JlY29yZFZpc2libGU6IGZhbHNlLA0KICAgICAgICAgICAgcmVjb3JkVGFibGVMb2FkaW5nOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZGlmeURldGFpbERpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgICAgICAgY3VycmVudE1vZGlmeToge30sDQogICAgICAgICAgICByZWZJZDogJycsDQogICAgICAgICAgICBxdWVyeVN1YlZhbHVlOiAnJywNCiAgICAgICAgICAgIHN1YlRhYmxlTG9hZGluZzogZmFsc2UsDQogICAgICAgICAgICBjdXJyZW50VGFiTmFtZTogJycsDQogICAgICAgICAgICBjdXJyZW50VGFiOiB7fSwNCiAgICAgICAgICAgIGV4cG9ydFR5cGU6ICdtYWluJywNCiAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHM6IFtdLA0KICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkc0xpc3Q6IFtdLA0KICAgICAgICAgICAgbm90UHJpbnQ6IGZhbHNlLA0KICAgICAgICAgICAgZGlzcGxheUZpZWxkOiB7fSwNCiAgICAgICAgICAgIHRyZWVMaXN0OiBbXSwNCiAgICAgICAgICAgIHJvd3M6IFtdLA0KICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICBwYWdlU2l6ZTogMTANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBwYWdpbmF0aW9uTGF5b3V0OiAndG90YWwsIHNpemVzLCBwcmV2LCBwYWdlciwgbmV4dCwganVtcGVyJywNCiAgICAgICAgICAgIHRvdGFsOiAwLA0KICAgICAgICAgICAgcGVybWlzc2lvbjogew0KICAgICAgICAgICAgICBwcmludDogdHJ1ZSwNCiAgICAgICAgICAgICAgYWRkOiB0cnVlLA0KICAgICAgICAgICAgICBkZWw6IHRydWUsDQogICAgICAgICAgICAgIGV4cG9ydDogdHJ1ZSwNCiAgICAgICAgICAgICAgZWRpdDogdHJ1ZSwNCiAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNob3dSaWdodE1lbnU6IHRydWUsDQogICAgICAgICAgICBsaXN0U2VsZWN0YWJsZTogdHJ1ZSwNCiAgICAgICAgICAgIGZpbHRlcnM6IHt9LA0KICAgICAgICAgICAgc29ydGVyOiBudWxsLA0KICAgICAgICAgICAgZGlhbG9nU3VuVmlzaWJsZTogZmFsc2UsIC8v5a2Z6KGo5a+56K+d5qGGDQogICAgICAgICAgICBzdW5UYWJzOiBbXSwgLy/lrZnooajmlbDmja4NCiAgICAgICAgICAgIHF1ZXJ5U3VuVmFsdWU6ICcnLA0KICAgICAgICAgICAgb3BlcmF0ZUNvbFdpZHRoOiAnMjQwJywNCiAgICAgICAgICAgIHN1bW1hcnlGaWVsZHM6IFtdLA0KICAgICAgICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICBwYWdlUmVzdWx0OiB7DQogICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBsb2dEYXRhOiBbXSwNCiAgICAgICAgICAgIG5vdFNvcnRhYmxlRmllbGRzOiBbDQogICAgICAgICAgICAgICdicG1fc3RhdHVzXycsDQogICAgICAgICAgICAgICdicG1fcHJvY19pbnN0X2lkXycsDQogICAgICAgICAgICAgICdicG1fc3ViamVjdF8nLA0KICAgICAgICAgICAgICAnYnBtX3Byb2NfZGVmX25hbWVfJywNCiAgICAgICAgICAgICAgJ2JwbV9jcmVhdGVfdGltZV8nLA0KICAgICAgICAgICAgICAnYnBtX2VuZF90aW1lXycsDQogICAgICAgICAgICAgICdicG1faXNfZm9yYmlkZGVuXycsDQogICAgICAgICAgICAgICdicG1fY3JlYXRvcl8nDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdDogW10sIC8v5om56YeP5pu05paw5pWw5o2uDQogICAgICAgICAgICBpZ25vcmVkQWxpYXM6IFsnYXBwQ2VudGVyRnJvbnQnXSwNCiAgICAgICAgICAgIFFSQ29kZVBhdHRlcm46IHRydWUsDQogICAgICAgICAgICBRUkNvZGVUeXBlOiAnJywNCiAgICAgICAgICAgIGlzTW9iaWxlOiBmYWxzZSwNCiAgICAgICAgICAgIGFjdGl2ZU5hbWVzOiBbJzEnXSwNCiAgICAgICAgICAgIHN3aXRjaE1hcDoge30sDQogICAgICAgICAgICBmaWx0ZXJNYXA6IHt9DQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBjb21wb25lbnRzOiB7DQogICAgICAgICAgVlJ1bnRpbWVUZW1wbGF0ZSwNCiAgICAgICAgICBIdENoZWNrYm94LA0KICAgICAgICAgIEh0RGlhbG9nLA0KICAgICAgICAgIEh0RGlhbG9nQnRuLA0KICAgICAgICAgIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2csDQogICAgICAgICAgRWlwU2VsZWN0DQogICAgICAgIH0sDQogICAgICAgIHdhdGNoOiB7DQogICAgICAgICAgZW50czogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWx1ZSkgew0KICAgICAgICAgICAgICBpZiAobmV3VmFsICYmIG5ld1ZhbC5sZW5ndGggPj0gMSAmJiBuZXdWYWwgIT0gb2xkVmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgdGhpcy5yZWZJZCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGRlZXA6IHRydWUsDQogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIHRlbXBsYXRlSW5mbzogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAmJiBuZXdWYWwuaWQpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpDQogICAgICAgICAgICAgICAgbGV0IF9tZSA9IHRoaXMNCiAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvID0gbmV3VmFsDQogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7DQogICAgICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24oDQogICAgICAgICAgICAgICAgICAgIF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXlGaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheUZpZWxkW2ldLnR5cGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMucHVzaChkaXNwbGF5RmllbGRbaV0pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpIHsNCiAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb25GaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKA0KICAgICAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbkZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBmaWVsZE5hbWUsICcnKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0ge3RlbXBsYXRlSWQ6IF9tZS50ZW1wbGF0ZUluZm8uaWR9DQogICAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICAgICAgcGFnZUJlYW46IHsNCiAgICAgICAgICAgICAgICAgICAgcGFnZTogJzEnLA0KICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogbmV3VmFsLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gLy/liJ3mrKHliqDovb3pu5jorqRwYWdlQmVhbg0KICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW4NCiAgICAgICAgICAgICAgICBpZiAoX21lLmlzSm9pbkZsb3cpIHsNCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnRhc2tUeXBlID0gX21lLnRhc2tUeXBlDQogICAgICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gX21lLmRlZktleQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoX21lLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgICAgICBfbWUuaGFuZGVsQmluZEZpbGVkVmFsdWEoKQ0KICAgICAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUNCiAgICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgX21lLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYNCiAgICAgICAgICAgICAgICAgICAgX21lLmRhdGFWaWV3LnNlbGVjdExpc3QubGVuZ3RoID4gMA0KICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gX21lLmRhdGFWaWV3LnNlbGVjdExpc3QNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gX21lLmRhdGFWaWV3LnJlZklkVmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycVF1ZXJ5cykgew0KICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IEpTT04ucGFyc2UoDQogICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyYW1ldGVycVF1ZXJ5cykpDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBxdWVyeXMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRRdWVyeSA9IHRoaXMuYnVpbGREZWZhdWx0UXVlcnlzKCkNCiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFF1ZXJ5Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdChkZWZhdWx0UXVlcnkpDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBkZWZhdWx0UXVlcnkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPDQogICAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgew0KICAgICAgICAgICAgICAgICAgbGV0IHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKQ0KICAgICAgICAgICAgICAgICAgbGV0IHNvcnRlciA9IFtdDQogICAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNvcnRGaWVsZC5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHNvcnRGaWVsZFt4XS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogc29ydEZpZWxkW3hdLnNvcnQNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnNvcnRlciA9IHNvcnRlcg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgICAgICAgICAgIGlmIChwYXJhbXMudGVtcGxhdGVJZCkgew0KICAgICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2dldEJwbVRlbXBsYXRlQnlQYWdpbmF0aW9uJywgcGFyYW1zKQ0KICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLnRvdGFsID0gcmVzcG9uc2UuZGF0YS50b3RhbA0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZQ0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpDQogICAgICAgICAgICAgICAgICAgICAgdGhpc18uaW5pdFN3aXRjaFN0YXR1cygpDQogICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNfLiRlbCAmJiB0aGlzXy4kZWwucXVlcnlTZWxlY3Rvcikgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRvcEJ0bkRvbSA9IHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAnZGl2LnRvcF9idG5fY29sJw0KICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAhdG9wQnRuRG9tIHx8DQogICAgICAgICAgICAgICAgICAgICAgICAgICghdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1kZWxldGUnKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLWVkaXQnKSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0b3BCdG5Eb20ucXVlcnlTZWxlY3RvcignaS5lbC1pY29uLXMtZ3JpZCcpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLmxpc3RTZWxlY3RhYmxlID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZERvbSA9IHRoaXNfLiRlbC5xdWVyeVNlbGVjdG9yKCd0ZC5yaWdodF9tZW51JykNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0ZERvbSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICghdGREb20ucXVlcnlTZWxlY3RvcignYnV0dG9uJykgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkRG9tLnF1ZXJ5U2VsZWN0b3IoJ3N3aXRjaCcpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5zaG93UmlnaHRNZW51ID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwudHJlZUZpZWxkICYmIG5ld1ZhbC50cmVlRmllbGQgIT09ICd7fScpIHsNCiAgICAgICAgICAgICAgICAgIGxldCB0cmVlRmllbGQgPSBKU09OLnBhcnNlKG5ld1ZhbC50cmVlRmllbGQpDQogICAgICAgICAgICAgICAgICB0aGlzLmluaXRUcmVlKHRyZWVGaWVsZCkNCiAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCByZXNwID0+IHsNCiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkRpc3BsYXlGaWVsZHMgPSBbXQ0KICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHIgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYXR0ci5jb21tZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdHRyLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXR0ci5jb2x1bW5UeXBlDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBzdWJEaXNwbGF5RmllbGRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50DQogICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwuc3VtbWFyeUZpZWxkKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlGaWVsZHMgPSBKU09OLnBhcnNlKG5ld1ZhbC5zdW1tYXJ5RmllbGQpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZGVlcDogdHJ1ZSwNCiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgY3VycmVudFRhYk5hbWU6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U3ViVmFsdWUgPSAnJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgY29tcHV0ZWQ6IHsNCiAgICAgICAgICBzaG93RHJhZnRMaXN0KCkgew0KICAgICAgICAgICAgLy/lpoLmnpzlvZPliY3pobXpnaLooqvltYzlhaVpZnJhbWXph4zpnaLkuI3mmL7npLrojYnnqL8NCiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcA0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgbW91bnRlZCgpIHsNCiAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgICAgdGhpcy4kcm9vdC4kb24oJ2Zvcm0tcmVsb2FkLXN1Y2Nlc3MnLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIHRoaXNfLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICB9KQ0KICAgICAgICAgIHRoaXMuJGVtaXQoJ2FmdGVyTW91bnRlZCcpDQogICAgICAgIH0sDQogICAgICAgIG1ldGhvZHM6IHsNCiAgICAgICAgICBsb2FkRGF0YShwYXJhbSwgY2IpIHsNCiAgICAgICAgICAgIGxldCBxdWVyeXMgPSBwYXJhbS5xdWVyeXMgfHwgW10NCiAgICAgICAgICAgIGxldCBoYXNEZWZhdWx0UXVlcnkgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgICBsZXQgcElEID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlDQogICAgICAgICAgICBxdWVyeXMuZm9yRWFjaChxID0+IHsNCiAgICAgICAgICAgICAgaWYgKHEucHJvcGVydHkgPT0gJ1BJZCcpIHsNCiAgICAgICAgICAgICAgICBoYXNEZWZhdWx0UXVlcnkgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICBpZiAoIWhhc0RlZmF1bHRRdWVyeSkgew0KICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsDQogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdQSWQnLA0KICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogcElEDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgZ3JvdXA6ICdkZWZhbHV0JywNCiAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ2JvQWxpYXMnLA0KICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJywNCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcGFyYW0ucXVlcnlzID0gcXVlcnlzDQogICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgLnBvc3QoDQogICAgICAgICAgICAgICAgd2luZG93LmNvbnRleHQuZm9ybSArICcvZm9ybS9mb3JtRGF0YUltcG9ydExvZy92MS9saXN0SnNvbicsDQogICAgICAgICAgICAgICAgcGFyYW0NCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2UgPSBkYXRhLmRhdGENCiAgICAgICAgICAgICAgICB0aGlzLmxvZ0RhdGEgPSByZXNwb25zZS5yb3dzDQogICAgICAgICAgICAgICAgdGhpcy5wYWdlUmVzdWx0ID0gew0KICAgICAgICAgICAgICAgICAgcGFnZTogcmVzcG9uc2UucGFnZSwNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwb25zZS5wYWdlU2l6ZSwNCiAgICAgICAgICAgICAgICAgIHRvdGFsOiByZXNwb25zZS50b3RhbA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gY2IoKSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRlbEJpbmRGaWxlZFZhbHVhKCkgew0KICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YNCiAgICAgICAgICAgIGxldCBfbWUgPSB0aGlzDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSgNCiAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQuJHBhcmVudC4kcGFyZW50LiRwYXJlbnQNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICBpZiAoIXBJbnN0W3RoaXMuZGF0YVZpZXcuYm9EZWZBbGlhc10pIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgPSBPYmplY3Qua2V5cyhwSW5zdC5kYXRhKVswXQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGxldCByZWZJZFZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgoDQogICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgJ2RhdGEuJyArIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyArICcuaWRfJw0KICAgICAgICAgICAgICApDQoNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKSAmJg0KICAgICAgICAgICAgICAgICFyZWZJZFZhbHVlDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHJlZklkVmFsdWUgPSBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJykNCiAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVmSWRWYWx1ZSkgew0KICAgICAgICAgICAgICAgIC8v5a+85YWl55qE5pe25YCZ5rKh5pyJ5YWz6ZSu55qE5aSW6ZSu77yM5YiZ5Li65YW26Ieq5Yqo5re75YqgDQogICAgICAgICAgICAgICAgcmVmSWRWYWx1ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpDQogICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcsIHJlZklkVmFsdWUpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgX21lLmRhdGFWaWV3LnJlZklkVmFsdWUgPSByZWZJZFZhbHVlDQoNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHBJbnN0LnBlcm1pc3Npb24gJiYNCiAgICAgICAgICAgICAgICBwSW5zdC5wZXJtaXNzaW9uLnRhYmxlICYmDQogICAgICAgICAgICAgICAgcEluc3QucGVybWlzc2lvbi50YWJsZVt0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzXQ0KICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICB0aGlzLnBlcm1pc3Npb24gPQ0KICAgICAgICAgICAgICAgICAgcEluc3QucGVybWlzc2lvbi50YWJsZVt0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzXQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb24uaGlkZGVuKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LnNob3dEYXRlVmlldyA9IGZhbHNlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUNCiAgICAgICAgICAgICAgbGV0IHNlbGVjdExpc3QgPSB0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QNCiAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3QgJiYgc2VsZWN0TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RMaXN0Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0TGlzdFtpXS5zZWxlY3RGaWVsZCkgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0NCiAgICAgICAgICAgICAgICAgICAgICAnZGF0YS4nICsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICcuJyArDQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdFtpXS5zZWxlY3RGaWVsZA0KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXRoKQ0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RMaXN0W2ldLnNlbGVjdFZhbHVlID0gdmFsdWUNCg0KICAgICAgICAgICAgICAgICAgICAvL+a3u+WKoOebkeWQrA0KICAgICAgICAgICAgICAgICAgICBwSW5zdC4kd2F0Y2gocGF0aCwgZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAvLyDnm5HlkKzkuK3kvb/nlKjpl7TpmpTor7fmsYLvvIzlh4/lsJHor7fmsYLmrKHmlbANCiAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KQ0KICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAhPT0gb2xkVmFsKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIC8vX21lLnNldERhdGFWaWV3VmFsdWUoX21lLmRhdGFWaWV3KTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgX21lLnNlYXJjaCgpDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgfSwgNTAwKQ0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAvL+WFs+iBlOWhq+WFheWtl+autQ0KICAgICAgICAgICAgICBsZXQgYmluZExpc3QgPSB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0DQogICAgICAgICAgICAgIGlmIChiaW5kTGlzdCAmJiBiaW5kTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgaWYgKGJpbmRMaXN0W2ldLmZpbGxGaWVsZCkgew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0NCiAgICAgICAgICAgICAgICAgICAgICAnZGF0YS4nICsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICcuJyArDQogICAgICAgICAgICAgICAgICAgICAgYmluZExpc3RbaV0uZmlsbEZpZWxkDQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhdGgpDQoNCiAgICAgICAgICAgICAgICAgICAgYmluZExpc3RbaV0uZmlsbFZhbHVlID0gdmFsdWUNCiAgICAgICAgICAgICAgICAgICAgcEluc3QuJHdhdGNoKHBhdGgsIGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5ZCs5Lit5L2/55So6Ze06ZqU6K+35rGC77yM5YeP5bCR6K+35rGC5qyh5pWwDQogICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCkNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL19tZS5zZXREYXRhVmlld1ZhbHVlKF9tZS5kYXRhVmlldyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIF9tZS5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCkNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIHByaW50TGlzdCgpIHsNCiAgICAgICAgICAgIHRoaXMubm90UHJpbnQgPSB0cnVlDQogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgNCiAgICAgICAgICAgICAgICAncHJpbnREYXRhJw0KICAgICAgICAgICAgICApLmlubmVySFRNTA0KICAgICAgICAgICAgICB3aW5kb3cucHJpbnQoKQ0KICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKQ0KICAgICAgICAgICAgfSwgMjAwKQ0KICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgIHRoaXMubm90UHJpbnQgPSBmYWxzZQ0KICAgICAgICAgICAgfSwgMjAwKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgcHJpbnREZXRhaWwodGVtcGxhdGVJZCwgaWQsIGFjdGlvbikgew0KICAgICAgICAgICAgLy/mlbDmja7pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0NCiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHVybCA9DQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgYWN0aW9uICsNCiAgICAgICAgICAgICAgJy90cnVlJw0KICAgICAgICAgICAgaWYgKGlkKSB7DQogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB1cmwgKz0gJz8nDQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz1mYWxzZScNCiAgICAgICAgICAgIGxldCBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyDQogICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgew0KICAgICAgICAgICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCcvb3RoZXJtZW51JywgJy9zdGF0ZW1lbnQnKQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh7DQogICAgICAgICAgICAgIHBhdGg6IHBhdGgsDQogICAgICAgICAgICAgIHF1ZXJ5OiB7aXNQcmludDogdHJ1ZX0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBjb21wbGV0ZShyb3csIHRhc2tUeXBlKSB7DQogICAgICAgICAgICBpZiAodGFza1R5cGUgPT0gJ3RvZG8nKSB7DQogICAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb250ZXh0LmJwbVJ1blRpbWUgKw0KICAgICAgICAgICAgICAgICcvcnVudGltZS90YXNrL3YxL2dldEJwbVRhc2tCeUluc3RJZD9pbnN0SWQ9JyArDQogICAgICAgICAgICAgICAgcm93LmJwbV9wcm9jX2luc3RfaWRfDQogICAgICAgICAgICAgIHJlcS5nZXQodXJsKS50aGVuKHJlcyA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHJlcy5kYXRhLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfmraTku7vliqHlt7LooqvlpITnkIbmiJbkuI3lrZjlnKjvvIEnKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmRhdGEubGVuZ3RoID09IDEpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKA0KICAgICAgICAgICAgICAgICAgICAnL3JlcG9ydE1vZHVsZUluc3QvJyArDQogICAgICAgICAgICAgICAgICAgICAgcmVzLmRhdGFbMF0uaWQgKw0KICAgICAgICAgICAgICAgICAgICAgICcvMCcgKw0KICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZLZXkgKw0KICAgICAgICAgICAgICAgICAgICAgICcvdHJ1ZS8nICsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5DQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+aaguS4jeaUr+aMge+8gScpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnZG9uZScpIHsNCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goDQogICAgICAgICAgICAgICAgJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsNCiAgICAgICAgICAgICAgICAgIHJvdy5icG1fcHJvY19pbnN0X2lkXyArDQogICAgICAgICAgICAgICAgICAnL2RvbmVMaXN0LycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy5kZWZLZXkgKw0KICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAncmVxdWVzdCcpIHsNCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goDQogICAgICAgICAgICAgICAgJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsNCiAgICAgICAgICAgICAgICAgIHJvdy5icG1fcHJvY19pbnN0X2lkXyArDQogICAgICAgICAgICAgICAgICAnL3JlcXVlc3QvJyArDQogICAgICAgICAgICAgICAgICB0aGlzLmRlZktleSArDQogICAgICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleQ0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICd0b2RvUmVhZCcpIHsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2U6IDEsIHBhZ2VTaXplOiAxMCwgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICAgICAgICAgIGxldCBzdGF0dXMgPSByb3cuYnBtX3N0YXR1c18NCiAgICAgICAgICAgICAgcmVxDQogICAgICAgICAgICAgICAgLnBvc3QoJyR7YnBtUnVuVGltZX0vcnVudGltZS90YXNrL3YxL2dldE5vdGljZVRvZG9SZWFkTGlzdCcsIHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbiwNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5czogWw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLA0KICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICcnDQogICAgICAgICAgICAgICAgICAgIDcNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAnRk9MTE9XJykgew0KICAgICAgICAgICAgICAgICAgICAgIHVybCA9DQogICAgICAgICAgICAgICAgICAgICAgICAnL3JlcG9ydE1vZHVsZUluc3RUYXNrUmVhZC8nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlkICsNCiAgICAgICAgICAgICAgICAgICAgICAgICcvRk9MTE9XLycgKw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZLZXkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gJ0NPTU1VJykgew0KICAgICAgICAgICAgICAgICAgICAgIHVybCA9DQogICAgICAgICAgICAgICAgICAgICAgICAnL3JlcG9ydE1vZHVsZUluc3QvJyArDQogICAgICAgICAgICAgICAgICAgICAgICBpZCArDQogICAgICAgICAgICAgICAgICAgICAgICAnLzAvJyArDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZktleSArDQogICAgICAgICAgICAgICAgICAgICAgICAnL3RydWUvJyArDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5DQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgdXJsID0NCiAgICAgICAgICAgICAgICAgICAgICAgICcvcmVwb3J0TW9kdWxlSW5zdFJlYWQvJyArDQogICAgICAgICAgICAgICAgICAgICAgICByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKw0KICAgICAgICAgICAgICAgICAgICAgICAgJy9yZWFkLycgKw0KICAgICAgICAgICAgICAgICAgICAgICAgaWQgKw0KICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmS2V5ICsNCiAgICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2godXJsKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdkb25lUmVhZCcpIHsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2U6IDEsIHBhZ2VTaXplOiAxMCwgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICAgICAgICAgIHJlcQ0KICAgICAgICAgICAgICAgIC5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXROb3RpY2VEb25lUmVhZExpc3QnLCB7DQogICAgICAgICAgICAgICAgICBwYWdlQmVhbjogcGFnZUJlYW4sDQogICAgICAgICAgICAgICAgICBxdWVyeXM6IFsNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncHJvY19pbnN0X2lkXycsDQogICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywNCiAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGlkID0gcmVzcG9uc2UuZGF0YS5yb3dzWzBdLmlkDQogICAgICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKA0KICAgICAgICAgICAgICAgICAgICAgICcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArDQogICAgICAgICAgICAgICAgICAgICAgICByb3cuYnBtX3Byb2NfaW5zdF9pZF8gKw0KICAgICAgICAgICAgICAgICAgICAgICAgJy9yZWFkL2RvbmUvJyArDQogICAgICAgICAgICAgICAgICAgICAgICBpZCArDQogICAgICAgICAgICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZLZXkgKw0KICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdteVJlYWQnKSB7DQogICAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHtwYWdlOiAxLCBwYWdlU2l6ZTogMTAsIHNob3dUb3RhbDogJ3RydWUnfQ0KICAgICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgICAucG9zdCgnJHticG1SdW5UaW1lfS9ydW50aW1lL3Rhc2svdjEvZ2V0TXlOb3RpY2VSZWFkTGlzdCcsIHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbiwNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5czogWw0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLA0KICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucm93cyAmJiByZXNwb25zZS5kYXRhLnJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQNCiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goDQogICAgICAgICAgICAgICAgICAgICAgJy9yZXBvcnRNb2R1bGVJbnN0TXlSZWFkLycgKw0KICAgICAgICAgICAgICAgICAgICAgICAgcm93LmJwbV9wcm9jX2luc3RfaWRfICsNCiAgICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgICBpZCArDQogICAgICAgICAgICAgICAgICAgICAgICAnL215UmVhZC8nICsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmS2V5ICsNCiAgICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5DQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAnbXlEZWxlZ2F0ZScpIHsNCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goDQogICAgICAgICAgICAgICAgJy9yZXBvcnRNb2R1bGVJbnN0UmVhZC8nICsNCiAgICAgICAgICAgICAgICAgIHJvdy5icG1fcHJvY19pbnN0X2lkXyArDQogICAgICAgICAgICAgICAgICAnL2RlbGVnYXRlLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy5kZWZLZXkgKw0KICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/kuIvovb3lhajpg6jpgInkuK3nmoTkuoznu7TnoIENCiAgICAgICAgICBkb3dubG9hZEFsbFFSQ29kZSgNCiAgICAgICAgICAgIHRlbXBsYXRlSWQsDQogICAgICAgICAgICBtb2JpbGVGb3JtQWxpYXMsDQogICAgICAgICAgICBkaXNwbGF5LA0KICAgICAgICAgICAgcGtGaWVsZCwNCiAgICAgICAgICAgIFFSQ29kZVBhdHRlcm4NCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IFFSQ29kZVBhdHRlcm4NCiAgICAgICAgICAgIGNvbnN0IF9zZWxlY3REYXRhID0gdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuc2VsZWN0aW9uDQogICAgICAgICAgICBpZiAoX3NlbGVjdERhdGEubGVuZ3RoID09PSAwKSB7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoJ+ivt+iHs+WwkemAieS4reS4gOadoeaVsOaNriEnKQ0KICAgICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIGxldCBhY2NvdW50ID0gQmFzZTY0LmVuY29kZSgNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIuYWNjb3VudA0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgbGV0IHRva2VuID0gdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW4NCiAgICAgICAgICAgIGxldCBtb2JpbGUgPSB3aW5kb3cuY29udGV4dC5tb2JpbGUNCiAgICAgICAgICAgIGxldCBRUkNvZGV1cmwgPSAnJw0KICAgICAgICAgICAgbGV0IHppcCA9IG5ldyBKU1ppcCgpDQogICAgICAgICAgICAvLyDliJvlu7rkuIDkuKrlkI3kuLppbWFnZXPnmoTmlrDnmoTmlofku7bnm67lvZUNCiAgICAgICAgICAgIGxldCBpbWcgPSB6aXAuZm9sZGVyKCdpbWFnZXMnKQ0KICAgICAgICAgICAgbGV0IHBsaXN0ID0gW10NCiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgX3NlbGVjdERhdGEubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgew0KICAgICAgICAgICAgICAgIFFSQ29kZXVybCA9DQogICAgICAgICAgICAgICAgICBtb2JpbGUgKw0KICAgICAgICAgICAgICAgICAgJy9RUkNvZGVGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgICAnL2dldCcgKw0KICAgICAgICAgICAgICAgICAgJz9pZD0nICsNCiAgICAgICAgICAgICAgICAgIF9zZWxlY3REYXRhW3hdW3BrRmllbGRdICsNCiAgICAgICAgICAgICAgICAgICcmdG9rZW49JyArDQogICAgICAgICAgICAgICAgICB0b2tlbg0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIFFSQ29kZXVybCA9DQogICAgICAgICAgICAgICAgICBtb2JpbGUgKw0KICAgICAgICAgICAgICAgICAgJy9RUkNvZGVGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgICAnL2VkaXQnICsNCiAgICAgICAgICAgICAgICAgICc/aWQ9JyArDQogICAgICAgICAgICAgICAgICBfc2VsZWN0RGF0YVt4XVtwa0ZpZWxkXQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIGxldCBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKQ0KDQogICAgICAgICAgICAgIFFSQ29kZS50b0NhbnZhcyhtc2csIFFSQ29kZXVybCwgZnVuY3Rpb24oZXJyb3IpIHsNCiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcikNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgbGV0IF9jYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQ0KICAgICAgICAgICAgICBfY2FudmFzLnNldEF0dHJpYnV0ZSgnaWQnLCAnUVJDb2RlQW5kRGVzY0FsbCcgKyB4KQ0KICAgICAgICAgICAgICBfY2FudmFzLnNldEF0dHJpYnV0ZSgNCiAgICAgICAgICAgICAgICAnc3R5bGUnLA0KICAgICAgICAgICAgICAgICd0ZXh0LWFsaWduOmNlbnRlcjt3aWR0aDonICsgbXNnLndpZHRoICsgJ3B4OycNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICBfY2FudmFzLmFwcGVuZENoaWxkKG1zZykNCiAgICAgICAgICAgICAgLy/liJvlu7rlupXpg6jnmoTmj4/ov7Dkv6Hmga8NCiAgICAgICAgICAgICAgZm9yIChsZXQgWSA9IDA7IFkgPCBkaXNwbGF5Lmxlbmd0aDsgWSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBKU09OLnBhcnNlKGRpc3BsYXlbWV0pDQogICAgICAgICAgICAgICAgaWYgKF9zZWxlY3REYXRhW3hdW2l0ZW0ubmFtZV0pIHsNCiAgICAgICAgICAgICAgICAgIGxldCBkZXNjID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykNCiAgICAgICAgICAgICAgICAgIGRlc2MuaW5uZXJIVE1MID0gaXRlbS5kZXNjICsgJzonICsgX3NlbGVjdERhdGFbeF1baXRlbS5uYW1lXQ0KICAgICAgICAgICAgICAgICAgX2NhbnZhcy5hcHBlbmRDaGlsZChkZXNjKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlQW5kRGVzY0FsbCcpLmFwcGVuZENoaWxkKF9jYW52YXMpDQogICAgICAgICAgICAgIHBsaXN0LnB1c2goDQogICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZFFSQ29kZUFuZERlc2MoJyNRUkNvZGVBbmREZXNjQWxsJyArIHgsIF9jYW52YXMpDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIFByb21pc2UuYWxsKHBsaXN0KS50aGVuKHJlc3VsdCA9PiB7DQogICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGVBbmREZXNjQWxsJykuaW5uZXJIVE1MID0gJycNCiAgICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCByZXN1bHQubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICAgICAgICBsZXQgY2FudmFzID0gcmVzdWx0W3hdDQogICAgICAgICAgICAgICAgbGV0IGltYWdlID0gY2FudmFzLnRvRGF0YVVSTCgpLnNwbGl0KCc7YmFzZTY0LCcpWzFdDQogICAgICAgICAgICAgICAgLy8g6L+Z5LiqaW1hZ2Vz5paH5Lu255uu5b2V5Lit5Yib5bu65LiA5LiqYmFzZTY05pWw5o2u5Li6aW1nRGF0YeeahOWbvuWDj++8jOWbvuWDj+WQjeaYr3NtaWxlLmdpZg0KICAgICAgICAgICAgICAgIGltZy5maWxlKHggKyAnLnBuZycsIGltYWdlLCB7YmFzZTY0OiB0cnVlfSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAvLyDmiormiZPljIXlhoXlrrnlvILmraXovazmiJBibG9i5LqM6L+b5Yi25qC85byPDQogICAgICAgICAgICAgIHppcC5nZW5lcmF0ZUFzeW5jKHt0eXBlOiAnYmxvYid9KS50aGVuKGZ1bmN0aW9uKGNvbnRlbnQpIHsNCiAgICAgICAgICAgICAgICBsZXQgZWxlTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKQ0KICAgICAgICAgICAgICAgIGVsZUxpbmsuZG93bmxvYWQgPSAn5LqM57u056CBLnppcCcNCiAgICAgICAgICAgICAgICBlbGVMaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScNCiAgICAgICAgICAgICAgICAvLyDkuIvovb3lhoXlrrnovazlj5jmiJBibG9i5Zyw5Z2ADQogICAgICAgICAgICAgICAgZWxlTGluay5ocmVmID0gVVJMLmNyZWF0ZU9iamVjdFVSTChjb250ZW50KQ0KICAgICAgICAgICAgICAgIC8vIOinpuWPkeeCueWHuw0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlTGluaykNCiAgICAgICAgICAgICAgICBlbGVMaW5rLmNsaWNrKCkNCiAgICAgICAgICAgICAgICAvLyDnhLblkI7np7vpmaQNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsZUxpbmspDQogICAgICAgICAgICAgIH0pDQoNCiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBvbkNvcHkoZSkgew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5zdWNjZXNzKCflhoXlrrnlt7LlpI3liLbliLDliarliIfmnb/vvIEnKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy8g5aSN5Yi25aSx6LSl5pe255qE5Zue6LCD5Ye95pWwDQogICAgICAgICAgb25FcnJvcihlKSB7DQogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfmirHmrYnvvIzlpI3liLblpLHotKXvvIEnKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZG93bmxvYWRRUkNvZGUoKSB7DQogICAgICAgICAgICBsZXQgcGxpc3QgPSBbXQ0KICAgICAgICAgICAgbGV0IF9jYW52YXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjUVJDb2RlQW5kRGVzYycpDQogICAgICAgICAgICBwbGlzdC5wdXNoKHRoaXMuZG93bmxvYWRRUkNvZGVBbmREZXNjKCcjUVJDb2RlQW5kRGVzYycsIF9jYW52YXMpKQ0KICAgICAgICAgICAgUHJvbWlzZS5hbGwocGxpc3QpLnRoZW4ocmVzdWx0ID0+IHsNCiAgICAgICAgICAgICAgbGV0IGNhbnZhcyA9IHJlc3VsdFswXQ0KICAgICAgICAgICAgICBsZXQgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKQ0KICAgICAgICAgICAgICBsaW5rLmhyZWYgPSBjYW52YXMudG9EYXRhVVJMKCkgLy/kuIvovb3pk77mjqUNCiAgICAgICAgICAgICAgbGluay5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgJ+S6jOe7tOeggS5qcGcnKQ0KICAgICAgICAgICAgICBsaW5rLnN0eWxlLmRpc3BsYXkgPSAnbm9uZScgLy9h5qCH562+6ZqQ6JePDQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluaykNCiAgICAgICAgICAgICAgbGluay5jbGljaygpDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/miorkuoznu7TnoIHkuI7kuoznu7TnoIHor7TmmI7kuIDotbfkuIvovb3miJDlm77niYcNCiAgICAgICAgICBkb3dubG9hZFFSQ29kZUFuZERlc2MoY2xhc3NzLCBfY2FudmFzKSB7DQogICAgICAgICAgICBsZXQgcDIgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICAgICAgICAgIGxldCBjYW52YXMyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykNCiAgICAgICAgICAgICAgbGV0IHcgPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfY2FudmFzKS53aWR0aCkNCiAgICAgICAgICAgICAgbGV0IGggPSBwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShfY2FudmFzKS5oZWlnaHQpDQogICAgICAgICAgICAgIC8v5bCGY2FudmFz55S75biD5pS+5aSn6Iul5bmy5YCN77yM54S25ZCO55ub5pS+5Zyo6L6D5bCP55qE5a655Zmo5YaF77yM5bCx5pi+5b6X5LiN5qih57OK5LqGDQogICAgICAgICAgICAgIGNhbnZhczIud2lkdGggPSB3ICogMg0KICAgICAgICAgICAgICBjYW52YXMyLmhlaWdodCA9IGggKiAyDQogICAgICAgICAgICAgIGNhbnZhczIuc3R5bGUud2lkdGggPSB3ICsgJ3B4Jw0KICAgICAgICAgICAgICBjYW52YXMyLnN0eWxlLmhlaWdodCA9IGggKyAncHgnDQogICAgICAgICAgICAgIC8v5Y+v5Lul5oyJ54Wn6Ieq5bex55qE6ZyA5rGC77yM5a+5Y29udGV4dOeahOWPguaVsOS/ruaUuSx0cmFuc2xhdGXmjIfnmoTmmK/lgY/np7vph48NCiAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSBjYW52YXMyLmdldENvbnRleHQoJzJkJykNCiAgICAgICAgICAgICAgY29udGV4dC5zY2FsZSgyLCAyKQ0KICAgICAgICAgICAgICByZXR1cm4gaHRtbDJjYW52YXMoZG9jdW1lbnQucXVlcnlTZWxlY3RvcihjbGFzc3MpLCB7DQogICAgICAgICAgICAgICAgY2FudmFzOiBjYW52YXMyDQogICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24oY2FudmFzKSB7DQogICAgICAgICAgICAgICAgcmVzb2x2ZShjYW52YXMpDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgcmV0dXJuIHAyDQogICAgICAgICAgfSwNCiAgICAgICAgICBRUkNvZGVEaWFsb2dDbG9zZSgpIHsNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlVHlwZSA9ICcnDQogICAgICAgICAgICB0aGlzLlFSQ29kZURpYWxvZyA9IGZhbHNlDQogICAgICAgICAgfSwNCiAgICAgICAgICBmb3VuZFFSQ29kZSgpIHsNCiAgICAgICAgICAgIC8qdGhpcy5RUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICB3aW5kb3cuY29udGV4dC5mcm9udCArDQogICAgICAgICAgICAgICIvUVJDb2RlRm9ybS8iICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICIvZ2V0IiArDQogICAgICAgICAgICAgICI/aWQ9IiArDQogICAgICAgICAgICAgIHRoaXMucm93SWQgKw0KICAgICAgICAgICAgICAiJnRva2VuPSIgKw0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZS5zdGF0ZS5sb2dpbi5jdXJyZW50VXNlci50b2tlbjsqLw0KICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlVHlwZSA9PSAnYWRkJykgew0KICAgICAgICAgICAgICBsZXQgaXNTdGFydEZsb3cgPSB0aGlzLnRlbXBsYXRlSW5mby5kZWZJZCA/ICd0cnVlJyA6ICdmYWxzZScNCiAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsNCiAgICAgICAgICAgICAgICAnL3RlbXBsYXRlL2Zvcm0vJyArDQogICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgJy9hZGQvP3N0YXJ0Rmxvdz0nICsNCiAgICAgICAgICAgICAgICBpc1N0YXJ0Rmxvdw0KICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7DQogICAgICAgICAgICAgICAgbGV0IHRva2VuID0gdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW4NCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCArPSAnJnRva2VuPScgKyB0b2tlbg0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAvL+S4jeiuuumcgOS4jemcgOimgeeZu+W9le+8jOiuv+mXrueahOmDveaYr+aYjue7humhtemdog0KICAgICAgICAgICAgICBpZiAodGhpcy5RUkNvZGVQYXR0ZXJuKSB7DQogICAgICAgICAgICAgICAgLy/lhY3nmbvlvZUNCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9DQogICAgICAgICAgICAgICAgICByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArDQogICAgICAgICAgICAgICAgICAnL1FSQ29kZUZvcm0vJyArDQogICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAgICcvZ2V0P2lkPScgKw0KICAgICAgICAgICAgICAgICAgdGhpcy5yb3dJZCArDQogICAgICAgICAgICAgICAgICAnJnRva2VuPScgKw0KICAgICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW4NCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAvL+mcgOimgeeZu+W9lQ0KICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgICAgIHJlcS5nZXRDb250ZXh0KCkubW9iaWxlICsNCiAgICAgICAgICAgICAgICAgICcvUVJDb2RlRm9ybS8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICAgJy9nZXQ/aWQ9JyArDQogICAgICAgICAgICAgICAgICB0aGlzLnJvd0lkDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8vIEJhc2U2NC5lbmNvZGUodGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIuYWNjb3VudCk7DQogICAgICAgICAgICBsZXQgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZScpDQoNCiAgICAgICAgICAgIFFSQ29kZS50b0NhbnZhcyhtc2csIHRoaXMuUVJDb2RldXJsLCBmdW5jdGlvbihlcnJvcikgew0KICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcikNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRRUkNvZGUoDQogICAgICAgICAgICB0ZW1wbGF0ZUlkLA0KICAgICAgICAgICAgaWQsDQogICAgICAgICAgICBtb2JpbGVGb3JtQWxpYXMsDQogICAgICAgICAgICBkaXNwbGF5LA0KICAgICAgICAgICAgaW5kZXgsDQogICAgICAgICAgICBRUkNvZGVQYXR0ZXJuDQogICAgICAgICAgKSB7DQogICAgICAgICAgICB0aGlzLlFSQ29kZVBhdHRlcm4gPSBRUkNvZGVQYXR0ZXJuDQogICAgICAgICAgICB0aGlzLlFSQ29kZURlc2MgPSBbXQ0KICAgICAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBkaXNwbGF5Lmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgIGxldCBpdGVtID0gSlNPTi5wYXJzZShkaXNwbGF5W3hdKQ0KICAgICAgICAgICAgICBpZiAodGhpcy5yb3dzW2luZGV4XVtpdGVtLm5hbWVdKSB7DQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjLnB1c2goDQogICAgICAgICAgICAgICAgICBpdGVtLmRlc2MgKyAnOicgKyB0aGlzLnJvd3NbaW5kZXhdW2l0ZW0ubmFtZV0NCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMubW9iaWxlRm9ybUFsaWFzID0gbW9iaWxlRm9ybUFsaWFzDQogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSB0cnVlDQogICAgICAgICAgICB0aGlzLnJvd1RlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkDQogICAgICAgICAgICB0aGlzLnJvd0lkID0gaWQNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uKHNpemUpIHsNCiAgICAgICAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uDQogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplDQogICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbihjdXJyZW50UGFnZSkgew0KICAgICAgICAgICAgLy/ngrnlh7vnrKzlh6DpobUNCiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2UNCiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldFBhcmFtKCkgew0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt9DQogICAgICAgICAgICBpZiAoc3RyID09ICdmaW5kJykgew0KICAgICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7DQogICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL+WIpOaWreS4uuWQiOW5tuafpeivoui/mOaYr+WIhuW8gOafpeivog0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVR5cGUpIHsNCiAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWQiOW5tuafpeivog0KICAgICAgICAgICAgICBpZiAoJCgnLnNlYXJjaC1xdWVyeScpLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldENvbmRpdGlvblF1ZXJ5KCkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uICYmDQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uICYmDQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cw0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIGxldCB0ZW1wUXVlcnlTID0gW10NCiAgICAgICAgICAgICAgbGV0IGJldHdlZW5Db25kaXRpb25zID0ge30NCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmZvckVhY2gocSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgICAgcS52YWx1ZSAmJg0KICAgICAgICAgICAgICAgICAgKHEub3BlcmF0aW9uICE9ICdCRVRXRUVOJyB8fCBxLnZhbHVlLmNvbnN0cnVjdG9yID09IEFycmF5KQ0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKHEpDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxLnZhbHVlKSB7DQogICAgICAgICAgICAgICAgICBsZXQgY29uZGl0aW9ucyA9IHENCiAgICAgICAgICAgICAgICAgIGlmIChiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSkgew0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zID0gYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0NCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZSA9IFtjb25kaXRpb25zLnZhbHVlXQ0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlLnB1c2gocS52YWx1ZSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldID0gY29uZGl0aW9ucw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYmV0d2VlbkNvbmRpdGlvbnMpIHsNCiAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2goYmV0d2VlbkNvbmRpdGlvbnNba2V5XSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSB0ZW1wUXVlcnlTDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcGFyYW1zDQogICAgICAgICAgfSwNCiAgICAgICAgICBzZWFyY2goc3RyKSB7DQogICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpDQogICAgICAgICAgICBsZXQgcGFyYW1zID0ge30NCiAgICAgICAgICAgIGlmIChzdHIgPT0gJ2ZpbmQnKSB7DQogICAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsNCiAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+WIpOaWreS4uuWQiOW5tuafpeivoui/mOaYr+WIhuW8gOafpeivog0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVR5cGUpIHsNCiAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWQiOW5tuafpeivog0KICAgICAgICAgICAgICBpZiAoJCgnLnNlYXJjaC1xdWVyeScpLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldENvbmRpdGlvblF1ZXJ5KCkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHBhcmFtcy5wYWdpbmF0aW9uICYmIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cykgew0KICAgICAgICAgICAgICBsZXQgdGVtcFF1ZXJ5UyA9IFtdDQogICAgICAgICAgICAgIGxldCBiZXR3ZWVuQ29uZGl0aW9ucyA9IHt9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5mb3JFYWNoKHEgPT4gew0KICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgIHEudmFsdWUgJiYNCiAgICAgICAgICAgICAgICAgIChxLm9wZXJhdGlvbiAhPSAnQkVUV0VFTicgfHwgcS52YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSkNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChxKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS52YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBxDQogICAgICAgICAgICAgICAgICBpZiAoYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0pIHsNCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucyA9IGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldDQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUgPSBbY29uZGl0aW9ucy52YWx1ZV0NCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZS5wdXNoKHEudmFsdWUpDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSA9IGNvbmRpdGlvbnMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGJldHdlZW5Db25kaXRpb25zKSB7DQogICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKGJldHdlZW5Db25kaXRpb25zW2tleV0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gdGVtcFF1ZXJ5Uw0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMNCiAgICAgICAgICAgICAgICA/IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQodGhpcy50cmVlUXVlcnlzKQ0KICAgICAgICAgICAgICAgIDogdGhpcy50cmVlUXVlcnlzDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+aKiui/h+a7pOagkeeahOadoeS7tuS5n+aLvOaOpei/m+WOuw0KICAgICAgICAgICAgaWYgKHRoaXMudHJlZVF1ZXJ5cyAmJiB0aGlzLnRyZWVRdWVyeXMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMNCiAgICAgICAgICAgICAgICA/IHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5jb25jYXQodGhpcy50cmVlUXVlcnlzKQ0KICAgICAgICAgICAgICAgIDogdGhpcy50cmVlUXVlcnlzDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2DQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICAgICAgcGFyYW1zLnJlZklkVmFsdWUgPSB0aGlzLmRhdGFWaWV3LnJlZklkVmFsdWUNCiAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJg0KICAgICAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPiAwDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgICAgICAgaWYgKHRoaXNfLmlzSm9pbkZsb3cpIHsNCiAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlDQogICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IHRoaXNfLnRhc2tUeXBlDQogICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSB0aGlzXy5kZWZLZXkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICgkLmlzRW1wdHlPYmplY3QodGhpcy5zZWFyY2hGb3JtKSkgew0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykNCiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZQ0KICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykNCiAgICAgICAgICAgICAgICAudGhlbihyZXNwb25zZSA9PiB7DQogICAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZSA9IHJlc3BvbnNlLmRhdGEucGFnZQ0KICAgICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRRdWVyeUZpbHRlcigpIHsNCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25NYXAgPSB0aGlzLmdldFNlYXJjaEl0ZW1zKCkNCiAgICAgICAgICAgIGxldCBmaWVsZFR5cGVNYXAgPSB0aGlzLmdldEZpZWxkVHlwZSgpDQogICAgICAgICAgICBsZXQgc3BlY2lhbE1hcCA9IHRoaXMuZ2V0U3BlY2lhbE1hcCgpDQogICAgICAgICAgICBsZXQgcXVlcnlzID0gW10gLy/mn6Xor6LmnaHku7YNCiAgICAgICAgICAgIGxldCBxdWVyeUZpbHRlciA9IHt9DQogICAgICAgICAgICBsZXQgcGFnZUJlYW4gPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbn0NCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7dGVtcGxhdGVJZDogdGhpcy50ZW1wbGF0ZUluZm8uaWR9DQogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHBhZ2VCZWFuDQogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMuc2VhcmNoRm9ybSkpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2VhcmNoRm9ybSkgew0KICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNlYXJjaEZvcm1ba2V5XSAhPSAndW5kZWZpbmVkJyAmJg0KICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtW2tleV0gIT0gJycgJiYNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybVtrZXldICE9IG51bGwNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlYXJjaEZvcm1ba2V5XSBpbnN0YW5jZW9mIEFycmF5KSB7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zZWFyY2hGb3JtW2tleV0ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2VhcmNoRm9ybVtrZXldW2ldLA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sDQogICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm1ba2V5XS5pbmNsdWRlcygnLCcpICYmDQogICAgICAgICAgICAgICAgICAgICFzcGVjaWFsTWFwW2tleV0NCiAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgYXJyID0gdGhpcy5zZWFyY2hGb3JtW2tleV0uc3BsaXQoJywnKQ0KICAgICAgICAgICAgICAgICAgICBhcnIuZm9yRWFjaCh2ID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHYsDQogICAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25NYXBba2V5XSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnNlYXJjaEZvcm1ba2V5XQ0KICAgICAgICAgICAgICAgICAgICAvL+aVtOaVsOexu+Weiw0KICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRUeXBlTWFwW2tleV0gJiYgZmllbGRUeXBlTWFwW2tleV0gPT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHBhcnNlRmxvYXQodGhpcy5zZWFyY2hGb3JtW2tleV0pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBrZXksDQogICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiBvcGVyYXRpb25NYXBba2V5XSwNCiAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgdGhpcy5jbGVhclF1ZXJ5QnlHcm91cE5hbWUocXVlcnlzLCAnZmlsdGVyJykNCiAgICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitDQogICAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgbGV0IHByZWZpeCA9IHRoaXMudGVtcGxhdGVJbmZvLmlzRXh0ZXJuYWwgPT09IDEgPyAnJyA6ICdGXycNCiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goayA9PiB7DQogICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcnNba10NCiAgICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9IHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJbMF0sDQogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZmlsdGVyJywNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmxlbmd0aCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdFUVVBTCcNCiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpDQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpbHRlci5sZW5ndGggPiAxKSB7DQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTicNCiAgICAgICAgICAgICAgICAgICAgcXVlcnkudmFsdWUgPSBmaWx0ZXINCiAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLCBxdWVyeXN9DQogICAgICAgICAgICAgIC8v5aaC5p6c5pyJ6K6+572u6buY6K6k5o6S5bqPLOS8mOWFiOS9v+eUqOm7mOiupOaOkuW6jw0KICAgICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKSB7DQogICAgICAgICAgICAgICAgbGV0IHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKQ0KICAgICAgICAgICAgICAgIGxldCBzb3J0ZXIgPSBbXQ0KICAgICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgc29ydEZpZWxkLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBzb3J0RmllbGRbeF0ubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBzb3J0RmllbGRbeF0uc29ydA0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIuc29ydGVyID0gc29ydGVyDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKHRoaXMuc29ydGVyICYmIHRoaXMuc29ydGVyLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSB0aGlzLnNvcnRlcg0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcXVlcnlGaWx0ZXINCiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy8g6YCa6L+H5YiG57uE5ZCN56ew5riF6Zmk5a+55bqU5p+l6K+i5p2h5Lu2DQogICAgICAgICAgY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgZ3JvdXBOYW1lKSB7DQogICAgICAgICAgICAvLyDlvoXliKDpmaTnmoTmn6Xor6LmnaHku7YNCiAgICAgICAgICAgIGxldCB0b0RlbGV0ZSA9IFtdDQogICAgICAgICAgICBxdWVyeXMgJiYNCiAgICAgICAgICAgICAgcXVlcnlzLmZvckVhY2gocXVlcnkgPT4gew0KICAgICAgICAgICAgICAgIGlmIChxdWVyeS5ncm91cCA9PSBncm91cE5hbWUpIHsNCiAgICAgICAgICAgICAgICAgIHRvRGVsZXRlLnB1c2gocXVlcnkpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdG9EZWxldGUuZm9yRWFjaChkID0+IHsNCiAgICAgICAgICAgICAgcXVlcnlzLnJlbW92ZShkKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVNvcnRDaGFuZ2UoY29sdW1uKSB7DQogICAgICAgICAgICBpZiAoIWNvbHVtbi5vcmRlcikgew0KICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IG51bGwNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHRoaXMuc29ydGVyID0gWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBjb2x1bW4ucHJvcCwNCiAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogY29sdW1uLm9yZGVyID09ICdhc2NlbmRpbmcnID8gJ0FTQycgOiAnREVTQycNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZUZpbHRlckNoYW5nZShtKSB7DQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7Li4udGhpcy5maWx0ZXJzLCAuLi5tfQ0KICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4gew0KICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyc1trXSB8fCB0aGlzLmZpbHRlcnNba10ubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRTZWFyY2hJdGVtcygpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0ge30NCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25UeXBlID0gew0KICAgICAgICAgICAgICBsaWtlOiAnTElLRScsDQogICAgICAgICAgICAgIGVxdWFsOiAnRVFVQUwnLA0KICAgICAgICAgICAgICBiZXR3ZWVuOiAnQkVUV0VFTicsDQogICAgICAgICAgICAgIGxlZnRfbGlrZTogJ0xFRlRfTElLRScsDQogICAgICAgICAgICAgIHJpZ2h0X2xpa2U6ICdSSUdIVF9MSUtFJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKHNlYXJjaEl0ZW1zKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoSXRlbXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgb3BlcmF0aW9uID0gJz0nDQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdvcGVyYXRpb24nKQ0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uTWFwWyQoc2VhcmNoSXRlbXNbaV0pLmF0dHIoJ2h0LXF1ZXJ5JyldID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgICAgICAgdHlwZW9mICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSAkKHNlYXJjaEl0ZW1zW2ldKQ0KICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAuYXR0cignb3BlcmF0aW9uJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFsNCiAgICAgICAgICAgICAgICAgICAgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpDQogICAgICAgICAgICAgICAgICBdID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXANCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEZpZWxkVHlwZSgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0ge30NCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25UeXBlID0gew0KICAgICAgICAgICAgICBudW1iZXI6ICdudW1iZXInLA0KICAgICAgICAgICAgICB0ZXh0OiAndGV4dCcNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9ICc9Jw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cigndHlwZScpDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0NCiAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhdGlvbg0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFsNCiAgICAgICAgICAgICAgICAgICAgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpDQogICAgICAgICAgICAgICAgICBdID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXANCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v6I635Y+W54m55q6K5p+l6K+i5oOF5Ya177yI6Ieq5a6a5LmJ5a+56K+d5qGG77yJDQogICAgICAgICAgZ2V0U3BlY2lhbE1hcCgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgZmllbGRRdWVyeU1hcCA9IHt9IC8v5p+l6K+i5p2h5Lu25a2X5q61DQoNCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgew0KICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpICE9ICd1bmRlZmluZWQnKSB7DQogICAgICAgICAgICAgICAgICAvL+afpeivouadoeS7tuWtl+autQ0KICAgICAgICAgICAgICAgICAgZmllbGRRdWVyeU1hcFskKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpXSA9DQogICAgICAgICAgICAgICAgICAgIHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdzcGVjaWFsLXF1ZXJ5JykgIT0NCiAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICAgICAgICA/IHRydWUNCiAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgNCiAgICAgICAgICAgICAgICAgIHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKQ0KICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgLy/mn6Xor6LmnaHku7blrZfmrrUNCiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbDQogICAgICAgICAgICAgICAgICAgICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgICAuYXR0cignaHQtcXVlcnknKQ0KICAgICAgICAgICAgICAgICAgXSA9DQogICAgICAgICAgICAgICAgICAgIHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKQ0KICAgICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3NwZWNpYWwtcXVlcnknKSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2UNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBmaWVsZFF1ZXJ5TWFwDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRDb25kaXRpb25RdWVyeSgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hBbGwgPSAkKCcuc2VhcmNoLXF1ZXJ5JykNCiAgICAgICAgICAgIGxldCB2YWx1ZXMgPSAnJw0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdIC8v5p+l6K+i5p2h5Lu2DQogICAgICAgICAgICBsZXQgcXVlcnlGaWx0ZXIgPSB7fQ0KICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb259DQogICAgICAgICAgICBsZXQgcGFyYW1zID0ge3RlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkfQ0KICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBwYWdlQmVhbg0KDQogICAgICAgICAgICAvLyDlsIbov4fmu6TmnaHku7bmt7vliqDmn6Xor6Llj4LmlbDmlbDnu4TkuK0NCiAgICAgICAgICAgIGlmICh0aGlzLmZpbHRlcnMgJiYgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGxldCBwcmVmaXggPSB0aGlzLnRlbXBsYXRlSW5mby5pc0V4dGVybmFsID09PSAxID8gJycgOiAnRl8nDQogICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykuZm9yRWFjaChrID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcnNba10NCiAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSB7DQogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJlZml4ICsgaywNCiAgICAgICAgICAgICAgICAgIHZhbHVlOiBmaWx0ZXJbMF0sDQogICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0VRVUFMJw0KICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2gocXVlcnkpDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgcXVlcnkub3BlcmF0aW9uID0gJ0lOJw0KICAgICAgICAgICAgICAgICAgcXVlcnkudmFsdWUgPSBmaWx0ZXINCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSA9PSAnJykgew0KICAgICAgICAgICAgICBxdWVyeUZpbHRlciA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLCBxdWVyeXN9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcXVlcnlGaWx0ZXINCiAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHR5cGVvZiAkKCQoc2VhcmNoQWxsWzBdKS5jaGlsZHJlbigpWzBdKS5hdHRyKA0KICAgICAgICAgICAgICAgICAgJ2h0LXF1aWNrLXNlYXJjaCcNCiAgICAgICAgICAgICAgICApICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHZhbHVlcyA9ICQoJChzZWFyY2hBbGxbMF0pLmNoaWxkcmVuKClbMF0pLmF0dHIoDQogICAgICAgICAgICAgICAgICAnaHQtcXVpY2stc2VhcmNoJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICBsZXQgYXJyID0gdmFsdWVzLnNwbGl0KCcsJykNCiAgICAgICAgICAgICAgICBmb3IgKGxldCB2YWx1ZSBvZiBhcnIpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBxdWVyeUZpbHRlciA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9uLCBxdWVyeXN9DQogICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgICAgICByZXR1cm4gcGFyYW1zDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aJk+W8gOmrmOe6p+ajgOe0og0KICAgICAgICAgIGFkdmFuY2VkKCkgew0KICAgICAgICAgICAgdGhpcy5mb3JtVHlwZSA9ICF0aGlzLmZvcm1UeXBlDQogICAgICAgICAgICBpZiAodGhpcy5mb3JtVHlwZSkgew0KICAgICAgICAgICAgICB0aGlzLmluY29ucyA9ICdlbC1pY29uLWFycm93LXVwJw0KICAgICAgICAgICAgICB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPSAnJw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy1kb3duJw0KICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm0gPSB7fQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lm57ovabmn6Xor6INCiAgICAgICAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24oZSkgew0KICAgICAgICAgICAgbGV0IGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoDQogICAgICAgICAgICBpZiAoa2V5Q29kZSA9PSAxMykgew0KICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgnZmluZCcpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICByZXNldChmbGFnKSB7DQogICAgICAgICAgICB0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPSAnJw0KICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkKSB7DQogICAgICAgICAgICAgIGxldCBjb25kaXRpb25GaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKA0KICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25kaXRpb25GaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGZpZWxkTmFtZSwgJycpDQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuc2VhcmNoRm9ybSwgY29uZGl0aW9uRmllbGRbaV0ubmFtZSwgJycpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IHt9DQogICAgICAgICAgICB0aGlzLiRyZWZzLm11bHRpcGxlVGVtcGxhdGVUYWJsZS5jbGVhckZpbHRlcigpDQogICAgICAgICAgICBpZiAoIWZsYWcpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlU2VsZWN0aW9uQ2hhbmdlKHZhbCkgew0KICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cyA9IHZhbA0KICAgICAgICAgIH0sDQogICAgICAgICAgZGVsZXRlZCgpIHsNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cyA9PSBudWxsIHx8DQogICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoID09IDANCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+mAieaLqeaWh+S7tuWIoOmZpCEnKQ0KICAgICAgICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuJGNvbmZpcm0oJ+atpOaTjeS9nOWwhuWIoOmZpOivpeaWh+S7tiwg5piv5ZCm57un57utPycsICfmj5DnpLonLCB7DQogICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgIGxldCBzID0gW10NCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIHMucHVzaCgNCiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93c1tpXVt0aGlzLnRlbXBsYXRlSW5mby5wa0ZpZWxkXQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgICAgIGlkczogcy5qb2luKCcsJyksDQogICAgICAgICAgICAgICAgICBib0FsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZGVsZXRlVGVtcGxhdGVEYXRhQnlJZCcsIGRhdGEpDQogICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLA0KICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3suWPlua2iOWIoOmZpCcNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZGVsKGlkKSB7DQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbliKDpmaTor6XmlbDmja4sIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6Jywgew0KICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHtpZHM6IGlkLCBib0FsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzfQ0KICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZGVsZXRlVGVtcGxhdGVEYXRhQnlJZCcsIGRhdGEpDQogICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgdHlwZTogJ2luZm8nLA0KICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3suWPlua2iOWIoOmZpCcNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgb3BlcmF0aW5nKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24sIGRlZklkLCBpc1N0YXJ0Rmxvdywgb3BlblR5cGUpIHsNCiAgICAgICAgICAgIC8vaXNTdGFydEZsb3cg77yIZmFsc2XvvJrlj6/ku6Xlj5HotbfmtYHnqIvvvIx0cnVl77ya5LiN5Y+v5Lul5Y+R6LW35rWB56iL77yJDQogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQgJiYgIWlzU3RhcnRGbG93KSB7DQogICAgICAgICAgICAgIC8v5YWI6YWN572u5LiN6IO95Y+R6LW35rWB56iLDQogICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgaXNTdGFydEZsb3cgPT0gJycpIHsNCiAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IHRydWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdlZGl0JyAmJiBpc1N0YXJ0RmxvdyA9PT0gZmFsc2UpIHsNCiAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IHRydWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAvL+WGjeWIpOaWreaYr+WQpuWPr+S7peWPkei1t+a1geeoiw0KICAgICAgICAgICAgICBsZXQgbWFuYWdlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKQ0KICAgICAgICAgICAgICAvL+WIpOaWreaYr+WQpumFjee9ruS6huWPkei1t+a1geeoi+aMiemSrg0KICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1hbmFnZUZpZWxkLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnYWRkJyAmJiBtYW5hZ2VGaWVsZFtrXS5uYW1lID09ICdzdGFydEZsb3cnKSB7DQogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlDQogICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICBhY3Rpb24gPT0gJ2VkaXQnICYmDQogICAgICAgICAgICAgICAgICBtYW5hZ2VGaWVsZFtrXS5uYW1lID09ICdzdGFydEZsb3cnDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICBpc1N0YXJ0RmxvdyA9IGZhbHNlDQogICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF0ZW1wbGF0ZUlkKSB7DQogICAgICAgICAgICAgIHRlbXBsYXRlSWQgPSB0aGlzLnRlbXBsYXRlSW5mby5pZA0KICAgICAgICAgICAgICBhY3Rpb24gPSBhY3Rpb24gPT0gJ3NlbGVjdCcgPyAnZ2V0JyA6ICdhZGQnDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzICYmDQogICAgICAgICAgICAgICF0aGlzLmRhdGFWaWV3ICYmDQogICAgICAgICAgICAgICF0aGlzLmlnbm9yZWRBbGlhcy5pbmNsdWRlcyhzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKQ0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHVybCA9DQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgYWN0aW9uDQogICAgICAgICAgICBpZiAodGhpcy5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gJ3N0YXRlbWVudCcNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0aGlzLnNpbmdsZSA9PSAndHJ1ZScpIHsNCiAgICAgICAgICAgICAgdXJsID0NCiAgICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgICAnL3RlbXBsYXRlL2Zvcm0vJyArDQogICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICBhY3Rpb24gKw0KICAgICAgICAgICAgICAgICcvdHJ1ZScNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5Yik5pat5pWw5o2u6KeG5Zu+5o6n5Lu2DQogICAgICAgICAgICBsZXQgaXNEYXRhVmlldyA9IGZhbHNlDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICYmIHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAhPSAnJykgew0KICAgICAgICAgICAgICAgIGlzRGF0YVZpZXcgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKG9wZW5UeXBlID09ICduZXcnIHx8IHRoaXMuaXNKb2luRmxvdyB8fCBpc0RhdGFWaWV3KSB7DQogICAgICAgICAgICAgIHVybCArPSAnL25ldycNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGlkKSB7DQogICAgICAgICAgICAgIHVybCA9IHVybCArICc/aWQ9JyArIGlkICsgJyYnDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB1cmwgKz0gJz8nDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgc3RhcnRGbG93U3RyID0gJ3N0YXJ0Rmxvdz1mYWxzZScNCiAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgZGVmSWQgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZScNCiAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlICYmIGRlZklkKSB7DQogICAgICAgICAgICAgIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9dHJ1ZScNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBkYXRhVXJsID0gJycNCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJpbmRMaXN0ICYmIHRoaXMuZGF0YVZpZXcuYmluZExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGxldCBiaW5kTGlzdCA9IFtdDQogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHsNCiAgICAgICAgICAgICAgICAgICAga2V5OiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0W2ldLmJpbmRGaWxsZCwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuYmluZExpc3RbaV0uZmlsbFZhbHVlDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBiaW5kTGlzdC5wdXNoKGl0ZW0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGRhdGFVcmwgPQ0KICAgICAgICAgICAgICAgICAgJyZiaW5kTGlzdD0nICsNCiAgICAgICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KGJpbmRMaXN0KSkpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyDQogICAgICAgICAgICBpZiAoZGF0YVVybCAhPSAnJykgew0KICAgICAgICAgICAgICBwYXRoID0gdXJsICsgc3RhcnRGbG93U3RyICsgZGF0YVVybA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZGVidWdnZXINCiAgICAgICAgICAgIC8vVE9ETyDlpoLmnpzmmK/mqKHlnZflvIDlj5Eg5YWo6YOo5bey5paw56qX5Y+j5omT5byADQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgd2luZG93Lm9wZW4oDQogICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnJlc29sdmUoDQogICAgICAgICAgICAgICAgICBwYXRoLnJlcGxhY2UodGhpcy5hbGlhc19uZXcsICdzdGF0ZW1lbnQnKSArICcmaXNOZXdQYWdlPXRydWUnDQogICAgICAgICAgICAgICAgKS5ocmVmLA0KICAgICAgICAgICAgICAgICdfYmxhbmsnDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YoJ290aGVybWVudScpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50JykNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChwYXRoKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgb3BlblVybCh1cmwsIHR5cGUsIHJvdywgZmllbGROYW1lKSB7DQogICAgICAgICAgICBpZiAocm93ICYmIGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgICB1cmwgPSB0aGlzLmhhbmRsZWRVcmxQYXJhbXModXJsLCByb3csIGZpZWxkTmFtZSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICh0eXBlID09ICduZXcnKSB7DQogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHVybA0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlZFVybFBhcmFtcyh1cmwsIHJvdywgZmllbGROYW1lKSB7DQogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7DQogICAgICAgICAgICAgIGxldCBkaXNwbGF5RmllbGRzID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpDQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMuZm9yRWFjaChkaXNwbGF5ID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoZGlzcGxheS5uYW1lID09IGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkudXJsUGFyYW1zICYmIGRpc3BsYXkudXJsUGFyYW1zLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHVybFBhcmFtcyA9IGRpc3BsYXkudXJsUGFyYW1zDQogICAgICAgICAgICAgICAgICAgIGxldCBzdWZmaXggPSAnJw0KICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4ICs9ICcmJw0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBzdWZmaXggKyBwYXJhbS5uYW1lICsgJz0nICsgcm93W3BhcmFtLmZpZWxkXQ0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICBpZiAoc3VmZml4KSB7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKHVybC5pbmRleE9mKCc/JykgIT0gLTEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCA9IHVybCArICcmJyArIHN1ZmZpeA0KICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnPycgKyBzdWZmaXgNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXR1cm4gdXJsDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHVybA0KICAgICAgICAgIH0sDQogICAgICAgICAgdmlld1JlcG9ydChkYXRhLCBqc29uU3RyLCBvcGVuVHlwZSkgew0KICAgICAgICAgICAgbGV0IGl0ZW0gPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoanNvblN0cikpDQogICAgICAgICAgICBsZXQgY29uZGl0aW9uRmllbGQgPSBpdGVtLmNvbmRpdGlvbkZpZWxkDQogICAgICAgICAgICBsZXQgcXVlcnlzID0gW10NCiAgICAgICAgICAgIGlmIChjb25kaXRpb25GaWVsZCAmJiBjb25kaXRpb25GaWVsZC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGNvbmRpdGlvbkZpZWxkLmZvckVhY2gob2JqID0+IHsNCiAgICAgICAgICAgICAgICBpZiAob2JqLnBhcmFtZXRlcikgew0KICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogb2JqLmtleSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbb2JqLnBhcmFtZXRlcl0sDQogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb2JqLnF0LA0KICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/mlbDmja7pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0NCiAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHVybCA9DQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9wcmV2aWV3LycgKw0KICAgICAgICAgICAgICBpdGVtLmFsaWFzICsNCiAgICAgICAgICAgICAgJy9mYWxzZS8nICsNCiAgICAgICAgICAgICAgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkocXVlcnlzKSkpDQogICAgICAgICAgICAvL3VybCDovaznoIHpmLLmraLmnInmlpzmnaAg5a+86Ie06Lev55Sx6Lez6L2s5LiN5a+5DQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycpIHsNCiAgICAgICAgICAgICAgd2luZG93Lm9wZW4odGhpcy4kcm91dGVyLnJlc29sdmUodXJsKS5ocmVmLCAnX2JsYW5rJykNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHVybCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIHN0YXJ0RmxvdyhpZCkgew0KICAgICAgICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgICAgICAgIGRlZktleTogdGhpcy50ZW1wbGF0ZUluZm8uZGVmSWQsDQogICAgICAgICAgICAgIGJ1c2luZXNzS2V5OiBpZCwNCiAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7ZnVsbHNjcmVlbjogdHJ1ZX0pIC8v5byA5aeLDQogICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAuZGlzcGF0Y2goJ3N0b3JlUHJvY2Vzcy9zdGFydEZvcm0nLCBkYXRhKQ0KICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gew0KICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpIC8vIOe7k+adnw0KICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2VzcyhyZXN1bHQubWVzc2FnZSkNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlDQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKHJlc3VsdC5tZXNzYWdlKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v54K55Ye75a+85Ye65oyJ6ZKuDQogICAgICAgICAgZXhwb3J0cyhleHBvcnRTZXR0aW5nRmllbGRzKSB7DQogICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkcyA9IFtdDQogICAgICAgICAgICBpZiAoZXhwb3J0U2V0dGluZ0ZpZWxkcykgew0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGV4cG9ydFNldHRpbmdGaWVsZHMpKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKGRpc3BsYXlGaWVsZHMubGVuZ3RoID09IDAgJiYgdGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7DQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuZXhwb3J0VHlwZSA9ICdtYWluJw0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzID0gW10NCiAgICAgICAgICAgIGRpc3BsYXlGaWVsZHMuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSkgew0KICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5wdXNoKGl0ZW0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBpbXBvcnRDb21tYW5kKHBhcmFtcykgew0KICAgICAgICAgICAgc3dpdGNoIChwYXJhbXMuY29tbWFuZCkgew0KICAgICAgICAgICAgICBjYXNlICdkb3dubG9hZFRlbXBGaWxlJzoNCiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkTWFpblRlbXBGaWxlKCkNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICBjYXNlICdpbXBvcnRNYWluJzoNCiAgICAgICAgICAgICAgICB0aGlzLmltcG9ydE1haW4oKQ0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgIGNhc2UgJ2xvZyc6DQogICAgICAgICAgICAgICAgdGhpcy5vcGVuTG9nKCkNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBvcGVuTG9nKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZG93bmxvYWRNYWluVGVtcEZpbGUoKSB7DQogICAgICAgICAgICBsZXQgY3VzdG9tVGVtcGxhdGVJZCA9ICcnDQogICAgICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZUluZm8gJiYgdGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpIHsNCiAgICAgICAgICAgICAgbGV0IG1hbmFnZUZpZWxkTGlzdCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8ubWFuYWdlRmllbGQpDQogICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBtYW5hZ2VGaWVsZExpc3QubGVuZ3RoOyBpbmRleCsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG1hbmFnZSA9IG1hbmFnZUZpZWxkTGlzdFtpbmRleF0NCiAgICAgICAgICAgICAgICBpZiAobWFuYWdlLm5hbWUgPT0gJ2ltcG9ydCcpIHsNCiAgICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmltcG9ydFRlbXBsYXRlICYmDQogICAgICAgICAgICAgICAgICAgIG1hbmFnZS5pbXBvcnRUZW1wbGF0ZS5sZW5ndGggPiAwDQogICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgY3VzdG9tVGVtcGxhdGVJZCA9IG1hbmFnZS5pbXBvcnRUZW1wbGF0ZVswXS5pZA0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKGN1c3RvbVRlbXBsYXRlSWQpIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ21lbnUvZG93bmxvYWRGaWxlJywgY3VzdG9tVGVtcGxhdGVJZCkNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KSAvL+W8gOWniw0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9kb3dubG9hZE1haW5UZW1wRmlsZScsIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzKQ0KICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpIC8vIOe7k+adnw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLmNhdGNoKGMgPT4gew0KICAgICAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQoNCiAgICAgICAgICBpbXBvcnRNYWluKHBhcmFtKSB7DQogICAgICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKQ0KICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgcGFyYW0uZmlsZSkNCg0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHsNCiAgICAgICAgICAgICAgZGF0YTogZm9ybURhdGEsDQogICAgICAgICAgICAgIGFsaWFzOiB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICB0aGlzLmhhbmRlbEJpbmRGaWxlZFZhbHVhKCkNCiAgICAgICAgICAgICAgcGFyYW1zLmJpbmRGaWxsZCA9IHRoaXMuZGF0YVZpZXcuYmluZEZpbGxkIHx8ICcnDQogICAgICAgICAgICAgIHBhcmFtcy5maWxsVmFsdWUgPSB0aGlzLmRhdGFWaWV3LmZpbGxWYWx1ZSB8fCAnJw0KICAgICAgICAgICAgICBwYXJhbXMucmVmSWRWYWx1ZSA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBsZXQgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHtmdWxsc2NyZWVuOiB0cnVlfSkgLy/lvIDlp4sNCiAgICAgICAgICAgIGZvcm0ubWFpbkltcG9ydChwYXJhbXMsIGRhdGEgPT4gew0KICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICAvL+WvvOWFpeaIkOWKn+S5i+WQjumHjeaWsOa4suafk+W9k+WJjee7hOS7tg0KICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5yZWZyZXNoVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpDQogICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7dHlwZTogJ3N1Y2Nlc3MnLCBtZXNzYWdlOiBkYXRhLm1lc3NhZ2V9KQ0KICAgICAgICAgICAgICAgIHBhcmFtLm9uU3VjY2VzcygpDQogICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnKSkgew0KICAgICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGRhdGEudmFsdWUpDQogICAgICAgICAgICAgICAgICBqc29uLmJvQWxpYXMgPSB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMNCiAgICAgICAgICAgICAgICAgIGxldCBvbGRDb25mID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBKc29uJykNCiAgICAgICAgICAgICAgICAgIGlmICghb2xkQ29uZikgew0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKA0KICAgICAgICAgICAgICAgICAgICAgICdmb3JtSW1wb3J0VGVtcEpzb24nLA0KICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KFtqc29uXSkNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IG9sZEpvc24gPSBKU09OLnBhcnNlKG9sZENvbmYpDQogICAgICAgICAgICAgICAgICAgIGxldCBpc0luT2xkSm9zbiA9IGZhbHNlDQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvbGRKb3NuLmxlbmd0aDsgaW5kZXgrKykgew0KICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZCA9IG9sZEpvc25baW5kZXhdDQogICAgICAgICAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgICAgICAgICAgb2xkLnRhYk5hbWUgPT0ganNvbi50YWJOYW1lICYmDQogICAgICAgICAgICAgICAgICAgICAgICBvbGQuYmluZEZpbGxkID09IGpzb24uYmluZEZpbGxkDQogICAgICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBpc0luT2xkSm9zbiA9IHRydWUNCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmICghaXNJbk9sZEpvc24pIHsNCiAgICAgICAgICAgICAgICAgICAgICBvbGRKb3NuLnB1c2goanNvbikNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5zZXRJdGVtKA0KICAgICAgICAgICAgICAgICAgICAgICdmb3JtSW1wb3J0VGVtcEpzb24nLA0KICAgICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9sZEpvc24pDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHBhcmFtLm9uRXJyb3IoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/mmL7npLrlrZDooajlr7nor53moYYNCiAgICAgICAgICBzaG93U3ViTGlzdChyZWZJZCkgew0KICAgICAgICAgICAgdGhpcy5yZWZJZCA9IHJlZklkDQogICAgICAgICAgICB0aGlzLmdldFN1YkVudHNCeUZvcm1LZXkocmVmSWQpDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+aYvuekuuS/ruaUueiusOW9lQ0KICAgICAgICAgIG9wZW5SZWNvcmRMaXN0KHJlZklkKSB7DQogICAgICAgICAgICB0aGlzLmRpYWxvZ1JlY29yZFZpc2libGUgPSB0cnVlDQogICAgICAgICAgICB0aGlzLnJlY29yZFJlZklkID0gcmVmSWQNCiAgICAgICAgICAgIGxldCBwYXJhbSA9IHsNCiAgICAgICAgICAgICAgcGFnZUJlYW46IHtwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogdHJ1ZX0sDQogICAgICAgICAgICAgIHNvcnRlcjogW3tkaXJlY3Rpb246ICdBU0MnLCBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnfV0sDQogICAgICAgICAgICAgIHF1ZXJ5czogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncmVmX2lkXycsDQogICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5yZWNvcmRSZWZJZCwNCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZQ0KICAgICAgICAgICAgbGV0IHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nDQogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICAgIHRoaXMucmVjb3JkTGlzdCA9IHJlc3AuZGF0YS5yb3dzDQogICAgICAgICAgICAgIHRoaXMubW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4gPSB7DQogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwNCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLmRhdGEucGFnZSwNCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC5kYXRhLnRvdGFsDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVSZWNvcmRDdXJyZW50Q2hhbmdlKGluZGV4LCBtb2RpZnlSZWNvcmQpIHsNCiAgICAgICAgICAgIG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSBpbmRleA0KICAgICAgICAgICAgbGV0IHBhcmFtID0gew0KICAgICAgICAgICAgICBwYWdlQmVhbjogbW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4sDQogICAgICAgICAgICAgIHNvcnRlcjogW3tkaXJlY3Rpb246ICdBU0MnLCBwcm9wZXJ0eTogJ21vZGlmeVRpbWUnfV0sDQogICAgICAgICAgICAgIHF1ZXJ5czogWw0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiAncmVmX2lkXycsDQogICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5yZWNvcmRSZWZJZCwNCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIF0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMucmVjb3JkVGFibGVMb2FkaW5nID0gdHJ1ZQ0KICAgICAgICAgICAgbGV0IHVybCA9ICcke2JwbVJ1blRpbWV9L2JwbS9ib0RhdGFNb2RpZnlSZWNvcmQvdjEvbGlzdEpzb24nDQogICAgICAgICAgICByZXEucG9zdCh1cmwsIHBhcmFtKS50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICAgIHRoaXMucmVjb3JkTGlzdCA9IHJlc3AuZGF0YS5yb3dzDQogICAgICAgICAgICAgIHRoaXMubW9kaWZ5UmVjb3JkLnBhZ2luYXRpb24ucGFnZUJlYW4gPSB7DQogICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AuZGF0YS5wYWdlU2l6ZSwNCiAgICAgICAgICAgICAgICBwYWdlOiByZXNwLmRhdGEucGFnZSwNCiAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC5kYXRhLnRvdGFsDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WPlua2iOS/ruaUueiusOW9leWvueivneahhg0KICAgICAgICAgIHJlY29yZENhbmNlbCgpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVjb3JkVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSBbXQ0KICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9ICcnDQogICAgICAgICAgICB0aGlzLm1vZGlmeVJlY29yZCA9IHsNCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7DQogICAgICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIC8vDQogICAgICAgICAgb3Blbk1vZGlmeURldGFpbChyb3cpIHsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudE1vZGlmeSA9IHJvdw0KICAgICAgICAgICAgdGhpcy5tb2RpZnlEZXRhaWxEaWFsb2dWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/mn6XnnIvkv67mlLnorrDlvZXor6bmg4UNCiAgICAgICAgICBzaG93TW9kaWZ5UmVjb3JkKGlkLCByZWZJZCkgew0KICAgICAgICAgICAgdmFyIHVybCA9DQogICAgICAgICAgICAgICcvc3RhdGVtZW50L3RlbXBsYXRlL2Zvcm0vJyArDQogICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAnL2dldC90cnVlJyArDQogICAgICAgICAgICAgICc/aWQ9JyArDQogICAgICAgICAgICAgIHJlZklkICsNCiAgICAgICAgICAgICAgJyZzdGFydEZsb3c9ZmFsc2UmcmVjb3JkSWQ9JyArDQogICAgICAgICAgICAgIGlkICsNCiAgICAgICAgICAgICAgJyZpc05ld1BhZ2U9dHJ1ZScNCiAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+ehruWumuWvvOWHug0KICAgICAgICAgIHN1Ym1pdEV4cG9ydCgpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5leHBvcnREYXRhIHx8IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZC5sZW5ndGggPCAxKSB7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICBtZXNzYWdlOiAn6K+36YCJ5oup6KaB5a+85Ye655qE5a2X5q6177yBJw0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuZXhwb3J0VHlwZSA9PT0gJ21haW4nKSB0aGlzLmV4cG9ydE1haW4oKQ0KICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICB0aGlzLmV4cG9ydFN1YkRhdGEoDQogICAgICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkLA0KICAgICAgICAgICAgICAgIHRoaXMucmVmSWQsDQogICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiLmVudE5hbWUNCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZXhwb3J0TWFpbigpIHsNCiAgICAgICAgICAgIGxldCBleHBGaWVsZCA9ICcnDQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICBpZiAoaSA+IDApIHsNCiAgICAgICAgICAgICAgICBleHBGaWVsZCArPSAnLCcNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBleHBGaWVsZCArPSB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGRbaV0ubmFtZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZXhwRmllbGQgPSBCYXNlNjQuZW5jb2RlKGV4cEZpZWxkKQ0KDQogICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMsDQogICAgICAgICAgICAgIGdldFR5cGU6IHRoaXMuZXhwb3J0RGF0YS5nZXRUeXBlLA0KICAgICAgICAgICAgICBleHBGaWVsZDogZXhwRmllbGQsDQogICAgICAgICAgICAgIGZpbHRlcktleTogJycNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRhdGEucXVlcnkgPSB0aGlzLmdldFF1ZXJ5RmlsdGVyKCkucGFnaW5hdGlvbg0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcgJiYgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZCkgew0KICAgICAgICAgICAgICBkYXRhLnF1ZXJ5LnF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5kYXRhVmlldy5zZWxlY3RWYWx1ZSwNCiAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdFUVVBTCcsDQogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdGXycgKyB0aGlzLmRhdGFWaWV3LmJpbmRTZWxlY3RkDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHtmdWxsc2NyZWVuOiB0cnVlfSkgLy/lvIDlp4sNCiAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL3RlbXBsYXRlRXhwb3J0JywgZGF0YSkudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpIC8vIOe7k+adnw0KICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdWJEaXNwbGF5RmllbGRzTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICB0aGlzLmV4cG9ydFN1YkRhdGEoDQogICAgICAgICAgICAgICAgdGhpcy4kcmVmc1snc3ViRXhwb3J0VGFibGUnXVtpXS5zZWxlY3Rpb24sDQogICAgICAgICAgICAgICAgJycsDQogICAgICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzTGlzdFtpXS5uYW1lDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuJHJlZnNbJ3N1YkV4cG9ydFRhYmxlJ11baV0sICdzZWxlY3Rpb24nLCBbXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGV4cG9ydFN1YkRhdGEoZXhwRmllbGRzLCByZWZJZCwgYWxpYXMpIHsNCiAgICAgICAgICAgIGxldCBleHBGaWVsZCA9IFtdDQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cEZpZWxkcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICBleHBGaWVsZC5wdXNoKHsNCiAgICAgICAgICAgICAgICBrZXk6IGV4cEZpZWxkc1tpXS5uYW1lLA0KICAgICAgICAgICAgICAgIHZhbHVlOiBleHBGaWVsZHNbaV0uZGVzYw0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgICAgICAgIGFsaWFzOiBhbGlhcywNCiAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkLA0KICAgICAgICAgICAgICB0eXBlOiB0aGlzLmV4cG9ydERhdGEuZ2V0VHlwZSwNCiAgICAgICAgICAgICAgZXhwRmllbGQ6IEpTT04uc3RyaW5naWZ5KGV4cEZpZWxkKSwNCiAgICAgICAgICAgICAgZmlsdGVyS2V5OiAnJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZGF0YS5xdWVyeUZpbHRlciA9IHRoaXMuY3VycmVudFRhYi5wYWdpbmF0aW9uDQogICAgICAgICAgICBsZXQgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHtmdWxsc2NyZWVuOiB0cnVlfSkNCiAgICAgICAgICAgIGZvcm0uc3ViRXhwb3J0KGRhdGEsIHJlc3AgPT4gew0KICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKQ0KICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Y+W5raI5a+85Ye6DQogICAgICAgICAgZXhwb3J0Q2FuY2VsKCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IFtdDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WPlua2iOWtkOihqOWvueivneahhg0KICAgICAgICAgIHN1YkNhbmNlbCgpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3ViVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLnRhYnMgPSBbXQ0KICAgICAgICAgICAgdGhpcy5lbnRzID0gW10NCiAgICAgICAgICB9LA0KICAgICAgICAgIHN1bkNhbmNlbCgpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3VuVmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLnN1blRhYnMgPSBbXQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlRXhwb3J0U2VsZWN0aW9uQ2hhbmdlKHZhbCkgew0KICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gW10NCiAgICAgICAgICAgIGlmICh2YWwpIHsNCiAgICAgICAgICAgICAgdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkID0gdmFsDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WFqOmAiQ0KICAgICAgICAgIGhhbmRsZUV4cG9ydFNlbGVjdEFsbCgpIHsNCiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHRoaXMuZGlzcGxheUZpZWxkcw0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/mjpLluo8NCiAgICAgICAgICBzb3J0KGluZGV4LCB0eXBlKSB7DQogICAgICAgICAgICBpZiAoJ3VwJyA9PSB0eXBlKSB7DQogICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCkgew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reesrOS4gOS9jScsDQogICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGxldCB0ZW1wID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4IC0gMV0NCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQoDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMsDQogICAgICAgICAgICAgICAgICBpbmRleCAtIDEsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXhdDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4LCB0ZW1wKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuZGlzcGxheUZpZWxkcy5sZW5ndGggLSAxKSB7DQogICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5bey57uP5piv5YiX6KGo5Lit5pyA5ZCO5LiA5L2NJywNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5pc1RyYW5zaXRpb24gPSB0cnVlDQogICAgICAgICAgICAgICAgbGV0IGkgPSB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXggKyAxXQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCgNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcywNCiAgICAgICAgICAgICAgICAgIGluZGV4ICsgMSwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleF0NCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KHRoaXMuZGlzcGxheUZpZWxkcywgaW5kZXgsIGkpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGFzeW5jIGdldFN1bkRhdGEodGFiLCByb3cpIHsNCiAgICAgICAgICAgIGxldCBlbnRzID0gdGFiLmNoaWxkRW50cw0KICAgICAgICAgICAgbGV0IHBrID0gdGFiLnBrS2V5DQogICAgICAgICAgICBsZXQgcmVmSWQgPSAnJw0KICAgICAgICAgICAgaWYgKHJvd1tway50b0xvY2FsZUxvd2VyQ2FzZSgpXSkgew0KICAgICAgICAgICAgICByZWZJZCA9IHJvd1tway50b0xvY2FsZUxvd2VyQ2FzZSgpXQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgcmVmSWQgPSByb3dbcGsudG9VcHBlckNhc2UoKV0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gdHJ1ZQ0KICAgICAgICAgICAgaWYgKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCB0YWIgPSBhd2FpdCB0aGlzLmdldEJvRGF0YShlbnRzW2ldLCByZWZJZCkNCiAgICAgICAgICAgICAgICB0aGlzLnN1blRhYnMucHVzaCh0YWIpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nU3VuVmlzaWJsZSA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEJvRGF0YShlbnQsIHJlZklkKSB7DQogICAgICAgICAgICBsZXQgYXR0cmlidXRlTGlzdCA9IGVudC5hdHRyaWJ1dGVMaXN0DQogICAgICAgICAgICBsZXQgdGFiID0gew0KICAgICAgICAgICAgICByZWZJZDogcmVmSWQsDQogICAgICAgICAgICAgIHBrS2V5OiBlbnQucGtLZXksDQogICAgICAgICAgICAgIG5hbWU6IGVudC50YWJsZU5hbWUsDQogICAgICAgICAgICAgIGVudE5hbWU6IGVudC5uYW1lLA0KICAgICAgICAgICAgICB0aXRsZTogZW50LmNvbW1lbnQsDQogICAgICAgICAgICAgIGF0dHJpYnV0ZUxpc3Q6IGF0dHJpYnV0ZUxpc3QsDQogICAgICAgICAgICAgIGNvbW1lbnQ6IGVudC5jb21tZW50LA0KICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgICAgICAgICAgcGFnZUJlYW46IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgICAgICB0b3RhbDogMA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGFiLmNoaWxkRW50cyA9IFtdDQogICAgICAgICAgICBpZiAoZW50LmNoaWxkRW50cyAmJiBlbnQuY2hpbGRFbnRzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgdGFiLmNoaWxkRW50cyA9IGVudC5jaGlsZEVudHMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7DQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2dldFN1YkRhdGFQYWdpbmF0aW9uJywgew0KICAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbjogdGFiLnBhZ2luYXRpb24sDQogICAgICAgICAgICAgICAgICBuYW1lOiBlbnQubmFtZSwNCiAgICAgICAgICAgICAgICAgIHJlZklkOiByZWZJZA0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7DQogICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSBkYXRhLnJvd3MNCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZVNpemUgPSBkYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSBkYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4udG90YWwgPSBkYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSBbXQ0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlU2l6ZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4udG90YWwgPSAwDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICByZXNvbHZlKHRhYikNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldFN1YkVudHNCeUZvcm1LZXkocmVmSWQpIHsNCiAgICAgICAgICAgIC8qaWYgKCF0aGlzLmVudHMgfHwgdGhpcy5lbnRzLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgZm9ybS5nZXRTdWJFbnRzQnlGb3JtS2V5KHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXksIChyZXNwKSA9PiB7DQogICAgICAgICAgICAgICAgLy8g5a2Q6KGo5LiO5a2Z6KGo5a2X5q615ZCN6K6+572u5bCP5YaZDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXNwLmRhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIHJlc3AuZGF0YVtpXS5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlLmZpZWxkTmFtZSA9IGF0dHJpYnV0ZS5maWVsZE5hbWUudG9Mb3dlckNhc2UoKTsNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICByZXNwLmRhdGFbaV0uY2hpbGRFbnRzLmZvckVhY2goc2hvd0NoaWxkRW50ID0+IHsNCiAgICAgICAgICAgICAgICAgICAgc2hvd0NoaWxkRW50LmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyaWJ1dGUgPT4gew0KICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLmVudHMgPSByZXNwLmRhdGE7DQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSBlbHNlIHsqLw0KICAgICAgICAgICAgdGhpcy5nZXRTdWJEYXRhKHRoaXMsIHJlZklkKQ0KICAgICAgICAgICAgLyogfSovDQogICAgICAgICAgfSwNCiAgICAgICAgICBhc3luYyBnZXRTdWJEYXRhKF9tZSwgcmVmSWQpIHsNCiAgICAgICAgICAgIC8vbGV0IGVudHMgPSB0aGlzLmVudHM7DQogICAgICAgICAgICBsZXQgZW50cyA9IEpTT04ucGFyc2UoX21lLnRlbXBsYXRlSW5mby5zdWJGaWVsZCkNCg0KICAgICAgICAgICAgaWYgKGVudHMgJiYgZW50cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW50cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGVudHNbaV0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHIgPT4gew0KICAgICAgICAgICAgICAgICAgYXR0ci5maWVsZE5hbWUgPSBhdHRyLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICBlbnRzW2ldLmNoaWxkRW50cy5mb3JFYWNoKHNob3dDaGlsZEVudCA9PiB7DQogICAgICAgICAgICAgICAgICBzaG93Q2hpbGRFbnQuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICBsZXQgdGFiID0gYXdhaXQgdGhpcy5nZXRCb0RhdGEoZW50c1tpXSwgcmVmSWQpDQogICAgICAgICAgICAgICAgdGhpcy50YWJzLnB1c2godGFiKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmRpYWxvZ1N1YlZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBub2RlQ2xpY2sobm9kZSkgew0KICAgICAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKQ0KICAgICAgICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vc2V0QnBtVGVtcGxhdGVQYWdpbmF0aW9uUGFnZU51bSIsIDEpOw0KICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2UgPSAxDQogICAgICAgICAgICAvL+avj+asoeeCueWHu+i/h+a7pOagkSzlupTor6Xmiorlj7PovrnnmoR0YWJsZSDkuI7liIbpobXlhajpg6jph43nva7kuLrliJ3lp4sNCg0KICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICBwYWdlQmVhbjoge3BhZ2U6IDEsIHBhZ2VTaXplOiB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemV9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBwYWdlQmVhbi5xdWVyeXMgPSBbXQ0KICAgICAgICAgICAgaWYgKCFub2RlLmlkIHx8IG5vZGUuaWQgIT0gLTEpIHsNCiAgICAgICAgICAgICAgbGV0IHRyZWVGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8udHJlZUZpZWxkKQ0KICAgICAgICAgICAgICB0cmVlRmllbGQucXVlcnlzLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGl0ZW0ua2V5XyAmJiBpdGVtLnZhbHVlXykgew0KICAgICAgICAgICAgICAgICAgcGFnZUJlYW4ucXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJyRUUkVFJCcgKyBpdGVtLmtleV8sDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBub2RlW2l0ZW0udmFsdWVfXSwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/miorov4fmu6TmoJHnmoTmn6Xor6LmnaHku7blrZjkuIDku73otbfmnaUs5Y+z6L6555qE5pCc57Si5LiO5YiG6aG15omN6IO95ZCM5pe25L2/55SoDQogICAgICAgICAgICB0aGlzLnRyZWVRdWVyeXMgPSBwYWdlQmVhbi5xdWVyeXMNCg0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHsNCiAgICAgICAgICAgICAgdGVtcGxhdGVJZDogdGhpcy50ZW1wbGF0ZUluZm8uaWQsDQogICAgICAgICAgICAgIHBhZ2luYXRpb246IHBhZ2VCZWFuDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnJlc2V0KHRydWUpDQogICAgICAgICAgICAvL+aVsOaNruinhuWbvuaOp+S7tg0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJg0KICAgICAgICAgICAgICAgIHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPiAwDQogICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgICAgICAgaWYgKHRoaXNfLmlzSm9pbkZsb3cpIHsNCiAgICAgICAgICAgICAgcGFyYW1zLmlzSm9pbkZsb3cgPSB0cnVlDQogICAgICAgICAgICAgIHBhcmFtcy50YXNrVHlwZSA9IHRoaXNfLnRhc2tUeXBlDQogICAgICAgICAgICAgIHBhcmFtcy5kZWZLZXkgPSB0aGlzXy5kZWZLZXkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykNCiAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3MNCiAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZQ0KICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/liqDovb3moJHnmoTkv6Hmga8NCiAgICAgICAgICB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgew0KICAgICAgICAgICAgLy8g5bu656uL5Liq5qCR5b2i57uT5p6ELOmcgOimgeWumuS5ieS4quacgOmhtuWxgueahOeItuiKgueCue+8jHB2YWx1ZeaYrzANCiAgICAgICAgICAgIGxldCBwYXJlbnRzID0gZGF0YS5maWx0ZXIoDQogICAgICAgICAgICAgIHZhbHVlID0+DQogICAgICAgICAgICAgICAgdmFsdWVbaWRdID09IHZhbHVlW3BpZF0gfHwNCiAgICAgICAgICAgICAgICB2YWx1ZVtwaWRdID09IG51bGwgfHwNCiAgICAgICAgICAgICAgICB2YWx1ZVtwaWRdID09IHB2YWx1ZQ0KICAgICAgICAgICAgKQ0KICAgICAgICAgICAgaWYgKCFwYXJlbnRzKSB7DQogICAgICAgICAgICAgIHBhcmVudHMgPSBkYXRhLmZpbHRlcigNCiAgICAgICAgICAgICAgICB2YWx1ZSA9Pg0KICAgICAgICAgICAgICAgICAgdmFsdWVbcGlkXSAhPT0gJ3VuZGVmaW5lZCcgJiYNCiAgICAgICAgICAgICAgICAgIHZhbHVlW3BpZF0gIT0gbnVsbCAmJg0KICAgICAgICAgICAgICAgICAgdmFsdWVbaWRdICE9IHZhbHVlW3BpZF0NCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHBhcmVudHMNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Yid5aeL5YyW5qCRDQogICAgICAgICAgaW5pdFRyZWUodHJlZUZpZWxkKSB7DQogICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGZvcm0uZ2V0QnlBbGlhcyh0cmVlRmllbGQuYWxpYXMsIHJlcyA9PiB7DQogICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZyA9IHJlcw0KICAgICAgICAgICAgICBkaWFsb2cuZ2V0VHJlZURhdGEoDQogICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgcmVxdWVzdFR5cGU6ICdHRVQnLA0KICAgICAgICAgICAgICAgICAgdXJsOg0KICAgICAgICAgICAgICAgICAgICAnJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRUcmVlRGF0YT9hbGlhcz0nICsNCiAgICAgICAgICAgICAgICAgICAgdHJlZUZpZWxkLmFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgJyZtYXBQYXJhbT0nDQogICAgICAgICAgICAgICAgfSwNCiAgICAgICAgICAgICAgICByZXNwID0+IHsNCiAgICAgICAgICAgICAgICAgIGlmICh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBkaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKA0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQNCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgICB0aGlzXy5kaXNwbGF5RmllbGQgPSBkaXNwbGF5ZmllbGQNCiAgICAgICAgICAgICAgICAgICAgdGhpc18udHJlZUxpc3QgPSByZXNwLmRhdGENCiAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWQgPSB7fQ0KICAgICAgICAgICAgICAgICAgICBoZWFkW2Rpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZV0gPSAn5YWo6YOoJw0KICAgICAgICAgICAgICAgICAgICBoZWFkLmlkID0gLTENCiAgICAgICAgICAgICAgICAgICAgdGhpc18udHJlZS5wdXNoKGhlYWQpDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgew0KICAgICAgICAgICAgaWYgKG5vZGUpIHsNCiAgICAgICAgICAgICAgaWYgKG5vZGUuZGF0YS5pZCA9PT0gLTEpIHsNCiAgICAgICAgICAgICAgICBsZXQgdHJlZSA9IHRoaXMudG9UcmVlRGF0YSgNCiAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUxpc3QsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZC5pZCwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkLnBpZCwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkLmRpc3BsYXlOYW1lLA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGQucHZhbHVlID8gdGhpcy5kaXNwbGF5RmllbGQucHZhbHVlIDogJzAnDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHJlc29sdmUodHJlZSkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICByZXNvbHZlKA0KICAgICAgICAgICAgICAgICAgdGhpcy50cmVlTGlzdC5maWx0ZXIoDQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0+DQogICAgICAgICAgICAgICAgICAgICAgdmFsdWVbdGhpcy5kaXNwbGF5RmllbGQucGlkXSA9PT0NCiAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGFbdGhpcy5kaXNwbGF5RmllbGQuaWRdDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICByZXNvbHZlKFtdKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlU3ViQ3VycmVudENoYW5nZShpbmRleCwgdGFiKSB7DQogICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gaW5kZXgNCiAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2dldFN1YkRhdGFQYWdpbmF0aW9uJywgew0KICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHRhYi5wYWdpbmF0aW9uLA0KICAgICAgICAgICAgICAgIG5hbWU6IHRhYi5lbnROYW1lLA0KICAgICAgICAgICAgICAgIHJlZklkOiB0YWIucmVmSWQgPyB0YWIucmVmSWQgOiB0aGlzLnJlZklkDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IHJlc3AucGFnZVNpemUsDQogICAgICAgICAgICAgICAgICBwYWdlOiByZXNwLnBhZ2UsDQogICAgICAgICAgICAgICAgICB0b3RhbDogcmVzcC50b3RhbA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0YWIuZGF0YUxpc3QgPSByZXNwLnJvd3MNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmZpbmFsbHkoKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuc3ViVGFibGVMb2FkaW5nID0gZmFsc2UNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIHF1ZXJ5U3ViVGFibGUodGFiKSB7DQogICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5xdWVyeXMgPSBbXQ0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTdWJWYWx1ZSkgew0KICAgICAgICAgICAgICB0YWIuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgICAgICAgIC8vcGdTcWzkvb/nlKjmqKHns4rmn6Xor6LvvIznsbvlnovkuI3ljLnphY3ml7bkvJrmiqXplJnvvIzmraTlpITlj6rkv53nlZl2YXJjaGFy57G75Z6LDQogICAgICAgICAgICAgICAgLy8gaWYgKGl0ZW0uZGF0YVR5cGUgPT0gJ3ZhcmNoYXInKSB7DQogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGROYW1lLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnlTdWJWYWx1ZSwNCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLA0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnF1ZXJ5U3VuVmFsdWUpIHsNCiAgICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICAvLyBpZiAoaXRlbS5kYXRhVHlwZSA9PSAndmFyY2hhcicpIHsNCiAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5xdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZE5hbWUsDQogICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5xdWVyeVN1blZhbHVlLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdvdGhlcicsDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnT1InDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAvLyB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoMSwgdGFiKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaW1wb3J0U3ViKHBhcmFtKSB7DQogICAgICAgICAgICBsZXQgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKQ0KICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdmaWxlJywgcGFyYW0uZmlsZSkNCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7DQogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLA0KICAgICAgICAgICAgICBhbGlhczogdGhpcy5jdXJyZW50VGFiLmVudE5hbWUsDQogICAgICAgICAgICAgIHJlZklkOiB0aGlzLnJlZklkDQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3JtLnN1YkltcG9ydChwYXJhbXMsIGRhdGEgPT4gew0KICAgICAgICAgICAgICBpZiAoZGF0YS5zdGF0ZSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdzdWNjZXNzJywgbWVzc2FnZTogZGF0YS5tZXNzYWdlfSkNCiAgICAgICAgICAgICAgICBwYXJhbS5vblN1Y2Nlc3MoKQ0KICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3ViQ3VycmVudENoYW5nZSgxLCB0aGlzLmN1cnJlbnRUYWIpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihkYXRhLm1lc3NhZ2UpDQogICAgICAgICAgICAgICAgcGFyYW0ub25FcnJvcigpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBleHBvcnRTdWIodGFiKSB7DQogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnc3ViJw0KICAgICAgICAgICAgdGhpcy5jdXJyZW50VGFiID0gdGFiDQogICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMgPSBbXQ0KICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzTGlzdCA9IFtdDQogICAgICAgICAgICB0YWIuYXR0cmlidXRlTGlzdC5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMucHVzaCh7DQogICAgICAgICAgICAgICAgZGVzYzogaXRlbS5jb21tZW50LA0KICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0uZmllbGROYW1lLA0KICAgICAgICAgICAgICAgIHR5cGU6IGl0ZW0uY29sdW1uVHlwZQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIGltcG9ydEJ1dHRvbih0YWIpIHsNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYg0KICAgICAgICAgIH0sDQogICAgICAgICAgbXlEcmFmdExpc3QoKSB7DQogICAgICAgICAgICAvL+aVsOaNruinhuWbvumaj+acuua3u+WKoOWIsOWFtuS7luiPnOWNleS4i+mdouaXtuiOt+WPluW9k+WJjeiPnOWNleeahOWIq+WQjSAg5bm25LiU5b2T5YmN5pWw5o2u6KeG5Zu+5LiN5piv6KGo5Y2V6YeM55qE5pWw5o2u6KeG5Zu+ICBkYXRhVmlldw0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzICYmDQogICAgICAgICAgICAgICF0aGlzLmRhdGFWaWV3ICYmDQogICAgICAgICAgICAgICF0aGlzLmlnbm9yZWRBbGlhcy5pbmNsdWRlcyhzZXNzaW9uU3RvcmFnZS5tZW51X2FsaWFzKQ0KICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ID0gc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGRhdGFWaWV3RmxhZyA9IGZhbHNlDQogICAgICAgICAgICAvL+WIpOaWreW9k+WJjeaVsOaNruinhuWbvuaYr+S4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbvg0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsNCiAgICAgICAgICAgICAgICBkYXRhVmlld0ZsYWcgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBwYXRoID0NCiAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgdGhpcy5hbGlhc19uZXcgKw0KICAgICAgICAgICAgICAnL2RyYWZ0TGlzdC8nICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMgKw0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICBkYXRhVmlld0ZsYWcNCiAgICAgICAgICAgIGlmICh0aGlzLm9wZW5UeXBlID09ICduZXcnIHx8IGRhdGFWaWV3RmxhZykgew0KICAgICAgICAgICAgICBwYXRoICs9ICc/aXNOZXc9dHJ1ZScNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChkYXRhVmlld0ZsYWcpIHsNCiAgICAgICAgICAgICAgd2luZG93Lm9wZW4ocGF0aCwgJ19ibGFuaycpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaChwYXRoKQ0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBsZXQgdXJsID0NCiAgICAgICAgICAgIC8vICAgIi9zdGF0ZW1lbnQvZHJhZnRMaXN0P3RlbXBBbGlhcz0iICsgOw0KICAgICAgICAgICAgLy8gY29uc3QgeyBocmVmIH0gPSB0aGlzLiRyb3V0ZXIucHVzaCh7DQogICAgICAgICAgICAvLyAgIHBhdGg6IHVybCwNCiAgICAgICAgICAgIC8vIH0pOw0KICAgICAgICAgICAgLy8gd2luZG93Lm9wZW4oaHJlZiwgIl9ibGFuayIpOw0KICAgICAgICAgIH0sDQogICAgICAgICAgaW5pdFN3aXRjaFN0YXR1cygpIHsNCiAgICAgICAgICAgIC8v5Yid5aeL5YyW5byA5YWz54q25oCBDQogICAgICAgICAgICBsZXQgbWFuYWdlcyA9IHV0aWxzLnBhcnNlVG9Kc29uKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYW5hZ2VzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIGlmIChtYW5hZ2VzW2ldLm5hbWUgPT09ICdzd2l0Y2gnKSB7DQogICAgICAgICAgICAgICAgbGV0IGZpZWxkTmFtZSA9IG1hbmFnZXNbaV0uYmluZA0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnN3aXRjaE1hcCwgZmllbGROYW1lLCB7fSkNCiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9uID0gbWFuYWdlc1tpXS5zd2l0Y2hPbg0KICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoTWFwW2ZpZWxkTmFtZV0ub2ZmID0gbWFuYWdlc1tpXS5zd2l0Y2hPZmYNCiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9uTGFiZWwgPSBtYW5hZ2VzW2ldLnN3aXRjaE9uTGFiZWwNCiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9mZkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPZmZMYWJlbA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBzd2l0Y2hDaGFuZ2UocGtWYWwsIG9uLCBvZmYsIGZpZWxkTmFtZSwgcm93LCBkZWZhdWx0VHJ1ZSkgew0KICAgICAgICAgICAgbGV0IHRoaXNfID0gdGhpcw0KICAgICAgICAgICAgbGV0IHZhbCA9IHJvd1tmaWVsZE5hbWVdDQogICAgICAgICAgICBpZiAodmFsICE9IG9uICYmIHZhbCAhPSBvZmYpIHsNCiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRUcnVlID09ICd0cnVlJykgew0KICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb2ZmKQ0KICAgICAgICAgICAgICAgIHZhbCA9IG9mZg0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMuJHNldChyb3csIGZpZWxkTmFtZSwgb24pDQogICAgICAgICAgICAgICAgdmFsID0gb24NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpc18NCiAgICAgICAgICAgICAgLiRjb25maXJtKCflsIbkvJrkv67mlLnor6XmlbDmja7vvIzmmK/lkKbnu6fnu60/Jywgew0KICAgICAgICAgICAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiAn56Gu5a6aJywNCiAgICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgIGxldCBmb3JtID0gd2luZG93LmNvbnRleHQuZm9ybQ0KICAgICAgICAgICAgICAgIGxldCBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleSAvL+ihqOWNleWIq+WQjQ0KICAgICAgICAgICAgICAgIGxldCBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcyAvL+aVsOaNruW7uuaooeWIq+WQjQ0KICAgICAgICAgICAgICAgIHJlcQ0KICAgICAgICAgICAgICAgICAgLmdldCgNCiAgICAgICAgICAgICAgICAgICAgZm9ybSArDQogICAgICAgICAgICAgICAgICAgICAgJy9mb3JtL2RhdGFUZW1wbGF0ZS92MS9nZXRGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgICAgIGZvcm1BbGlhcyArDQogICAgICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgICAgICBkYXRhRGVmQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICc/aWQ9JyArDQogICAgICAgICAgICAgICAgICAgICAgcGtWYWwgKw0KICAgICAgICAgICAgICAgICAgICAgICcmYWN0aW9uPWdldCZyZWNvcmRJZD0nDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGJvRGF0YSA9IHJlc3AuZGF0YS5kYXRhDQogICAgICAgICAgICAgICAgICAgIGJvRGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0gPSB2YWwNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVEYXRhID0gew0KICAgICAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXNfLnRlbXBsYXRlSW5mby5ib0RlZkFsaWFzLA0KICAgICAgICAgICAgICAgICAgICAgIGJvRGF0YTogcmVzcC5kYXRhLmRhdGENCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB0aGlzXy4kc3RvcmUNCiAgICAgICAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vYm9TYXZlJywgc2F2ZURhdGEpDQogICAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdzdWNjZXNzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5L+d5a2Y5oiQ5YqfJw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+S/neWtmOWksei0pScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm0NCiAgICAgICAgICAgICAgICBsZXQgZm9ybUFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmZvcm1LZXkgLy/ooajljZXliKvlkI0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMgLy/mlbDmja7lu7rmqKHliKvlkI0NCiAgICAgICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgICAgIC5nZXQoDQogICAgICAgICAgICAgICAgICAgIGZvcm0gKw0KICAgICAgICAgICAgICAgICAgICAgICcvZm9ybS9kYXRhVGVtcGxhdGUvdjEvZ2V0Rm9ybS8nICsNCiAgICAgICAgICAgICAgICAgICAgICBmb3JtQWxpYXMgKw0KICAgICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgICAgZGF0YURlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICAgICAgICAgIHBrVmFsICsNCiAgICAgICAgICAgICAgICAgICAgICAnJmFjdGlvbj1nZXQmcmVjb3JkSWQ9Jw0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQoDQogICAgICAgICAgICAgICAgICAgICAgcm93LA0KICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICByZXNwLmRhdGEuZGF0YVtkYXRhRGVmQWxpYXNdW2ZpZWxkTmFtZV0NCiAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRpc3BsYXkobXBEaXNwbGF5KSB7DQogICAgICAgICAgICAvL3Bj56uv55qE5pWw5o2u5oql6KGo5LiN6ZyA6KaB5YGa5pys5pa55rOV55qE5aSE55CG77yM55u05o6l6L+U5ZuedHJ1ZeWNs+WPr+OAgg0KICAgICAgICAgICAgcmV0dXJuIHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEZpeGVkKGZpeGVkKSB7DQogICAgICAgICAgICByZXR1cm4gZml4ZWQNCiAgICAgICAgICB9LA0KICAgICAgICAgIHN1bW1hcnkobWV0aG9kLCBmaWVsZCwgZGVjaW1hbCkgew0KICAgICAgICAgICAgbGV0IGxpc3QgPSB0aGlzLnJvd3MNCiAgICAgICAgICAgICAgLmZpbHRlcihpdGVtID0+IGl0ZW1bZmllbGRdICE9PSB1bmRlZmluZWQgJiYgaXRlbVtmaWVsZF0gIT09ICcnKQ0KICAgICAgICAgICAgICAubWFwKGl0ZW0gPT4gbmV3IE51bWJlcihpdGVtW2ZpZWxkXSkpDQogICAgICAgICAgICBpZiAoIWxpc3QgfHwgbGlzdC5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICByZXR1cm4NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChtZXRob2QgPT09ICdjb3VudCcpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGxpc3QubGVuZ3RoDQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ3N1bScpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGxpc3QucmVkdWNlKChhLCBiKSA9PiBhICsgYikudG9GaXhlZChkZWNpbWFsKQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdtaW4nKSB7DQogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbiguLi5saXN0KS50b0ZpeGVkKGRlY2ltYWwpDQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ21heCcpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KC4uLmxpc3QpLnRvRml4ZWQoZGVjaW1hbCkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnYXZnJykgew0KICAgICAgICAgICAgICByZXR1cm4gKGxpc3QucmVkdWNlKChhLCBiKSA9PiBhICsgYikgLyBsaXN0Lmxlbmd0aCkudG9GaXhlZCgNCiAgICAgICAgICAgICAgICBkZWNpbWFsDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldENvbG9yKGRhdGEsIHJvdykgew0KICAgICAgICAgICAgbGV0IHJlc3VDb2xvciA9ICdjb2xvcjpibGFjaycNCiAgICAgICAgICAgIGxldCBkZWNvZGUgPSBCYXNlNjQuZGVjb2RlKGRhdGEpDQogICAgICAgICAgICBsZXQgY29sb3JSdWxlID0gSlNPTi5wYXJzZShkZWNvZGUpDQogICAgICAgICAgICBpZiAoY29sb3JSdWxlICYmIGNvbG9yUnVsZSBpbnN0YW5jZW9mIEFycmF5KSB7DQogICAgICAgICAgICAgIGNvbG9yUnVsZS5mb3JFYWNoKHJ1bGUgPT4gew0KICAgICAgICAgICAgICAgIGxldCBGbiA9IEZ1bmN0aW9uKCdkYXRhJywgcnVsZS5wcm9SdWxlKQ0KICAgICAgICAgICAgICAgIGlmIChGbihyb3cpKSB7DQogICAgICAgICAgICAgICAgICByZXN1Q29sb3IgPSAnY29sb3I6JyArIHJ1bGUucHJvQ29sb3INCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdUNvbG9yDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRQcm9WYWx1ZSh2YWx1ZSwgcnVsZSkgew0KICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKHZhbHVlIC8gcnVsZSkgKiAxMDAwMCkgLyAxMDAgLy8g5bCP5pWw54K55ZCO5Lik5L2N55m+5YiG5q+UDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRQcm9Db2xvcihkYXRhLCByb3cpIHsNCiAgICAgICAgICAgIGxldCByZXN1Q29sb3IgPSAnIzQwOWVmZicNCiAgICAgICAgICAgIGxldCBkZWNvZGUgPSBCYXNlNjQuZGVjb2RlKGRhdGEpDQogICAgICAgICAgICAvKmRlY29kZT1kZWNvZGUucmVwbGFjZSgvXHMqIS9nLCIiKTsqLw0KICAgICAgICAgICAgbGV0IGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKQ0KICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChydWxlID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSkNCiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgew0KICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gcnVsZS5wcm9Db2xvcg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiByZXN1Q29sb3INCiAgICAgICAgICB9LA0KICAgICAgICAgIGlzU29ydGFibGUoZmllbGQpIHsNCiAgICAgICAgICAgIGxldCBpc0Nsb2IgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgIGlmIChpdGVtLm5hbWUgPT09IGZpZWxkICYmIGl0ZW0udHlwZSA9PT0gJ2Nsb2InKSB7DQogICAgICAgICAgICAgICAgaXNDbG9iID0gdHJ1ZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgcmV0dXJuICF0aGlzLm5vdFNvcnRhYmxlRmllbGRzLmluY2x1ZGVzKGZpZWxkKSAmJiAhaXNDbG9iDQogICAgICAgICAgfSwNCiAgICAgICAgICBjdXN0b21FdmlsSlMocm93LCBodFNjcmlwdCkgew0KICAgICAgICAgICAgbGV0IEZuID0gRnVuY3Rpb24oJ19yZXEnLCAncm93JywgJ190aGlzJywgQmFzZTY0LmRlY29kZShodFNjcmlwdCkpIC8v5LiA5Liq5Y+Y6YeP5oyH5ZCRRnVuY3Rpb27vvIzpmLLmraLmnInkupvliY3nq6/nvJbor5Hlt6XlhbfmiqXplJkNCiAgICAgICAgICAgIGxldCByZXN1bHQgPSBGbihyZXEsIHJvdywgdGhpcykNCiAgICAgICAgICB9LA0KICAgICAgICAgIGJhdGNoVXBkYXRlKHRpdGxlLCBiYXNlNjRKc29uLCBiYXNlNjRGaWxlZHMpIHsNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgdGhpcy50YWJsZURhdGEuc2VsZWN0Um93cyA9PSBudWxsIHx8DQogICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MubGVuZ3RoID09IDANCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoJ+ivt+mAieaLqeaVsOaNricpDQogICAgICAgICAgICAgIHJldHVybiBmYWxzZQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGRlZmF1bHRWYWx1ZUxpc3QgPSBbXQ0KICAgICAgICAgICAgbGV0IG91dEZvcm0gPSBbXQ0KICAgICAgICAgICAgaWYgKGJhc2U2NEpzb24pIHsNCiAgICAgICAgICAgICAgLy/mmK/lkKbmnInnlKjmiLfoh6rlt7HovpPlhaXnmoTlrZfmrrUNCiAgICAgICAgICAgICAgbGV0IHJlcyA9IHRydWUNCiAgICAgICAgICAgICAgbGV0IGJhdGNoVXBkYXRlRGF0YSA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShiYXNlNjRKc29uKSkNCiAgICAgICAgICAgICAgbGV0IGZpbGVkc09iaiA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShiYXNlNjRGaWxlZHMpKQ0KICAgICAgICAgICAgICBiYXRjaFVwZGF0ZURhdGEuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZVR5cGUgPT0gMSkgew0KICAgICAgICAgICAgICAgICAgdmFyIGlzUmVxdWlyZWQgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uaXNSZXF1aXJlZCkgew0KICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHsNCiAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICBkZXNjOiBmaWxlZHNPYmpbaXRlbS5uYW1lXSwNCiAgICAgICAgICAgICAgICAgICAgb3V0VHlwZTogaXRlbS5vdXRWYWx1ZVR5cGUsDQogICAgICAgICAgICAgICAgICAgIHNpbmdsZTogZmFsc2UsDQogICAgICAgICAgICAgICAgICAgIHNlbGVjdEN1cnJlbnQ6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICBpc1JlcXVpcmVkOiBpc1JlcXVpcmVkDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBpZiAoaXRlbS5vdXRWYWx1ZVR5cGUgPT0gJ3NlbGVjdCcpIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpDQogICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgYWxpYXM6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmluZDogJycsDQogICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6ICcnLA0KICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IHt9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgIGxldCBnYW5nZWQgPSB7DQogICAgICAgICAgICAgICAgICAgICAgICBhbGlhczogc2VsZWN0Q29uZmlnLmN1c3RvbVF1ZXJ5LmFsaWFzLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVCaW5kOiBzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkudmFsdWVCaW5kLA0KICAgICAgICAgICAgICAgICAgICAgICAgbm9Jbml0OiAnJywNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsQmluZDogc2VsZWN0Q29uZmlnLmN1c3RvbVF1ZXJ5LmxhYmVsQmluZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQ6IHt9DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIG9iai5nYW5nZWQgPSBnYW5nZWQNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBvYmouc2VsZWN0RGF0YSA9IHNlbGVjdENvbmZpZy5zZWxlY3REYXRhDQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW0ub3V0VmFsdWVUeXBlID09ICdkaWFsb2cnKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RDb25maWcgPSBKU09OLnBhcnNlKGl0ZW0ub3V0Q29uZmlnKQ0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlhbG9nQ29uZmlnID0gc2VsZWN0Q29uZmlnLmRpYWxvZ0NvbmZpZw0KICAgICAgICAgICAgICAgICAgICBsZXQgbWFwcGluZ0NvbmYgPSBbXQ0KICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gc2VsZWN0Q29uZmlnLnBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1ldGVyW2tleV0gfHwgJycNCiAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nQ29uZi5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogW3ZhbHVlXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFN1YjogW3ZhbHVlXQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RkaWFsb2cgPSB7DQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TnVtOiBkaWFsb2dDb25maWcuc2VsZWN0TnVtLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLA0KICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mOiBtYXBwaW5nQ29uZiwNCiAgICAgICAgICAgICAgICAgICAgICBjdXN0UXVlcnlKc29uOiBbXSwNCiAgICAgICAgICAgICAgICAgICAgICBhbGlhczogZGlhbG9nQ29uZmlnLmFsaWFzLA0KICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRpYWxvZ0NvbmZpZy5jdXN0RGlhbG9nDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLmN1c3RkaWFsb2cgPSB7DQogICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ+ivt+mAieaLqScsDQogICAgICAgICAgICAgICAgICAgICAgY3VzdERpYWxvZzogY3VzdGRpYWxvZywNCiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRGaWVsZDogZGlhbG9nQ29uZmlnLnJlc3VsdEZpZWxkDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICAgIGl0ZW0ub3V0Q29uZmlnICYmDQogICAgICAgICAgICAgICAgICAgIChpdGVtLm91dFZhbHVlVHlwZSAhPSAnaW5wdXQnIHx8DQogICAgICAgICAgICAgICAgICAgICAgaXRlbS5vdXRWYWx1ZVR5cGUgIT0gJ2RhdGEnIHx8DQogICAgICAgICAgICAgICAgICAgICAgaXRlbS5vdXRWYWx1ZVR5cGUgIT0gJ251bWJlcicpDQogICAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IG91dENvbmZpZyA9IEpTT04ucGFyc2UoaXRlbS5vdXRDb25maWcpDQogICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSBvdXRDb25maWcucGFyYW1ldGVyDQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwYXJhbWV0ZXIpIHsNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcltrZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcGFyYW1ldGVyW2tleV0NCiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyW2tleV0gPSAnZGF0YS4nICsgcGFyYW1ldGVyW2tleV0NCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKG91dENvbmZpZy5zZWxlY3RDdXJyZW50KSB7DQogICAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdEN1cnJlbnQgPSBvdXRDb25maWcuc2VsZWN0Q3VycmVudA0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChvdXRDb25maWcuaXNTaW5nbGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICBvYmouc2luZ2xlID0gb3V0Q29uZmlnLmlzU2luZ2xlDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLmJpbmRDb25maWcgPSBwYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIG91dEZvcm0ucHVzaChvYmopDQogICAgICAgICAgICAgICAgICByZXMgPSBmYWxzZQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0LnB1c2goew0KICAgICAgICAgICAgICAgICAgICBrZXk6IGl0ZW0ubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGl0ZW0uZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgaWYgKHJlcykgew0KICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQm8oZGVmYXVsdFZhbHVlTGlzdCkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZUxpc3QgPSBkZWZhdWx0VmFsdWVMaXN0DQogICAgICAgICAgICAgICAgdGhpcy4kcmVmcy50ZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nLnNob3dEaWFsb2codGl0bGUsIG91dEZvcm0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdpbmZvJywgbWVzc2FnZTogJ+acquiuvue9ruabtOaWsOWGheWuuSd9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgb25Db25maXJtKGRhdGEpIHsNCiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWVMaXN0ID0gW10NCiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBkYXRhKSB7DQogICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZUxpc3QucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBkYXRhW2tleV19KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGJvRGF0YSA9IHRoaXMuZGVmYXVsdFZhbHVlTGlzdA0KICAgICAgICAgICAgICA/IHRoaXMuZGVmYXVsdFZhbHVlTGlzdC5jb25jYXQoZGVmYXVsdFZhbHVlTGlzdCkNCiAgICAgICAgICAgICAgOiB0aGlzLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgdGhpcy51cGRhdGVCbyhib0RhdGEpDQogICAgICAgICAgfSwNCiAgICAgICAgICB1cGRhdGVCbyhkZWZhdWx0VmFsdWVMaXN0KSB7DQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbmibnph4/mm7TmlrDmlbDmja4sIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6Jywgew0KICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0Um93cyA9IHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdFJvd3MubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIHNlbGVjdFJvd3NbaV0uZm9ybUtleSA9IHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXkNCiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZGVmYXVsdFZhbHVlTGlzdC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3dzW2ldW2RlZmF1bHRWYWx1ZUxpc3Rbal0ua2V5XSA9DQogICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdFtqXS52YWx1ZQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgICAgIGJvRGF0YTogc2VsZWN0Um93cywNCiAgICAgICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9iYXRjaFVwZGF0ZVRlbXBsYXRlRGF0YScsIGRhdGEpDQogICAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnc3VjY2VzcycsIG1lc3NhZ2U6IGRhdGEubWVzc2FnZX0pDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdpbmZvJywgbWVzc2FnZTogJ+W3suWPlua2iOabtOaWsCd9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgYWRkQ29tbWFuZChjb21tYW5kKSB7DQogICAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnbm90TG9naW4nIHx8IGNvbW1hbmQgPT0gJ2xvZ2luJykgew0KICAgICAgICAgICAgICB0aGlzLmdldEFkZFFSQ29kZShjb21tYW5kKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0QWRkUVJDb2RlKGNvbW1hbmQpIHsNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IGNvbW1hbmQgPT0gJ25vdExvZ2luJyA/IHRydWUgOiBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjID0gW10NCiAgICAgICAgICAgIHRoaXMuUVJDb2RlVHlwZSA9ICdhZGQnDQogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBzaG93U2VhcmNoUGFuZSgpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBidWlsZERlZmF1bHRRdWVyeXMoKSB7DQogICAgICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgICAgICBsZXQgcXVlcnlzID0gW10NCiAgICAgICAgICAgIGxldCBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0aGlzXy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpDQogICAgICAgICAgICBsZXQgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PSAxID8gJycgOiAnRl8nDQogICAgICAgICAgICAvL+adoeS7tuWtl+autem7mOiupOWAvOWIpOaWrQ0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGNvbmRpdGlvbiA9PiB7DQogICAgICAgICAgICAgIGlmIChjb25kaXRpb24uZGVmYXVsdFZhbHVlKSB7DQogICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gY29uZGl0aW9uLmNvbFByZWZpeCArIGNvbmRpdGlvbi5uYQ0KICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSwgZmllbGQsIGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpDQogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24udHkgPT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogY29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLy/nrZvpgInlrZfmrrXpu5jorqTlgLzliKTmlq0NCg0KICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBKU09OLnBhcnNlKHRoaXNfLnRlbXBsYXRlSW5mby5maWx0ZXJpbmdGaWVsZCkNCiAgICAgICAgICAgIGZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4gew0KICAgICAgICAgICAgICBpZiAoZmlsdGVyLmRlZmF1bHRWYWx1ZSAmJiBmaWx0ZXIuZGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbZmlsdGVyLm5hbWVdID0gZmlsdGVyLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGZpbHRlci5kZWZhdWx0VmFsdWUuZm9yRWFjaCh2YWwgPT4gew0KICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJlZml4ICsgZmlsdGVyLm5hbWUsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsDQogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmVmFsXycgKyBmaWx0ZXIubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJw0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpc18uJG9uKCdhZnRlck1vdW50ZWQnLCAoKSA9PiB7DQogICAgICAgICAgICAgIGxldCBoZWFkZXJDb2x1bW5zID0NCiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuJHJlZnMudGFibGVIZWFkZXIuY29sdW1ucw0KICAgICAgICAgICAgICBoZWFkZXJDb2x1bW5zLmZvckVhY2goY29sdW1uID0+IHsNCiAgICAgICAgICAgICAgICBpZiAodGhpc18uZmlsdGVyTWFwLmhhc093blByb3BlcnR5KGNvbHVtbi5wcm9wZXJ0eSkpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXNfLmZpbHRlck1hcFtjb2x1bW4ucHJvcGVydHldLmZvckVhY2godmFsID0+IHsNCiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZpbHRlcmVkVmFsdWUucHVzaCh2YWwpDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICByZXR1cm4gcXVlcnlzDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0NCiAgfQ0KfQ0K"},null]}