@mnaoumov/obsidian-lib 10.4.1 → 10.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/codemirror/incremental-parse-state-field/package.json +6 -0
  2. package/codemirror/markdown-editor-views/package.json +6 -0
  3. package/codemirror/range-set/package.json +6 -0
  4. package/command-handlers/open-bug-report-command-handler/package.json +6 -0
  5. package/components/embeddable-markdown-editor-component/package.json +6 -0
  6. package/components/reconfigurable-editor-extension-component/package.json +6 -0
  7. package/dist/lib/cjs/__merged.cjs +46 -1
  8. package/dist/lib/cjs/__merged.d.cts +11 -0
  9. package/dist/lib/cjs/attachment-path.cjs +3 -2
  10. package/dist/lib/cjs/bug-report.cjs +241 -0
  11. package/dist/lib/cjs/bug-report.d.cts +161 -0
  12. package/dist/lib/cjs/codemirror/incremental-parse-state-field.cjs +162 -0
  13. package/dist/lib/cjs/codemirror/incremental-parse-state-field.d.cts +37 -0
  14. package/dist/lib/cjs/codemirror/index.cjs +10 -1
  15. package/dist/lib/cjs/codemirror/index.d.cts +3 -0
  16. package/dist/lib/cjs/codemirror/markdown-editor-views.cjs +142 -0
  17. package/dist/lib/cjs/codemirror/markdown-editor-views.d.cts +34 -0
  18. package/dist/lib/cjs/codemirror/range-set.cjs +106 -0
  19. package/dist/lib/cjs/codemirror/range-set.d.cts +35 -0
  20. package/dist/lib/cjs/command-handlers/index.cjs +4 -1
  21. package/dist/lib/cjs/command-handlers/index.d.cts +1 -0
  22. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +139 -0
  23. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +53 -0
  24. package/dist/lib/cjs/command-handlers/open-settings-command-handler.cjs +6 -3
  25. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +374 -0
  26. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +221 -0
  27. package/dist/lib/cjs/components/index.cjs +7 -1
  28. package/dist/lib/cjs/components/index.d.cts +2 -0
  29. package/dist/lib/cjs/components/plugin-gate-component.cjs +6 -3
  30. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.cjs +200 -0
  31. package/dist/lib/cjs/components/reconfigurable-editor-extension-component.d.cts +96 -0
  32. package/dist/lib/cjs/desktop-operating-system.cjs +101 -0
  33. package/dist/lib/cjs/desktop-operating-system.d.cts +15 -0
  34. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  35. package/dist/lib/cjs/index.cjs +16 -1
  36. package/dist/lib/cjs/index.d.cts +5 -0
  37. package/dist/lib/cjs/menu.cjs +118 -0
  38. package/dist/lib/cjs/menu.d.cts +65 -0
  39. package/dist/lib/cjs/mobile-app-info.cjs +167 -0
  40. package/dist/lib/cjs/mobile-app-info.d.cts +32 -0
  41. package/dist/lib/cjs/obsidian-settings.cjs +2 -2
  42. package/dist/lib/cjs/settings-modal.cjs +103 -0
  43. package/dist/lib/cjs/settings-modal.d.cts +33 -0
  44. package/dist/lib/esm/__merged.d.mts +11 -0
  45. package/dist/lib/esm/__merged.mjs +39 -1
  46. package/dist/lib/esm/attachment-path.mjs +3 -2
  47. package/dist/lib/esm/bug-report.d.mts +161 -0
  48. package/dist/lib/esm/bug-report.mjs +141 -0
  49. package/dist/lib/esm/codemirror/incremental-parse-state-field.d.mts +37 -0
  50. package/dist/lib/esm/codemirror/incremental-parse-state-field.mjs +74 -0
  51. package/dist/lib/esm/codemirror/index.d.mts +3 -0
  52. package/dist/lib/esm/codemirror/index.mjs +7 -1
  53. package/dist/lib/esm/codemirror/markdown-editor-views.d.mts +34 -0
  54. package/dist/lib/esm/codemirror/markdown-editor-views.mjs +53 -0
  55. package/dist/lib/esm/codemirror/range-set.d.mts +35 -0
  56. package/dist/lib/esm/codemirror/range-set.mjs +18 -0
  57. package/dist/lib/esm/command-handlers/index.d.mts +1 -0
  58. package/dist/lib/esm/command-handlers/index.mjs +3 -1
  59. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +53 -0
  60. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +51 -0
  61. package/dist/lib/esm/command-handlers/open-settings-command-handler.mjs +6 -3
  62. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +221 -0
  63. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +293 -0
  64. package/dist/lib/esm/components/index.d.mts +2 -0
  65. package/dist/lib/esm/components/index.mjs +5 -1
  66. package/dist/lib/esm/components/plugin-gate-component.mjs +6 -3
  67. package/dist/lib/esm/components/reconfigurable-editor-extension-component.d.mts +96 -0
  68. package/dist/lib/esm/components/reconfigurable-editor-extension-component.mjs +112 -0
  69. package/dist/lib/esm/desktop-operating-system.d.mts +15 -0
  70. package/dist/lib/esm/desktop-operating-system.mjs +16 -0
  71. package/dist/lib/esm/generated-during-build.mjs +1 -1
  72. package/dist/lib/esm/index.d.mts +5 -0
  73. package/dist/lib/esm/index.mjs +11 -1
  74. package/dist/lib/esm/menu.d.mts +65 -0
  75. package/dist/lib/esm/menu.mjs +30 -0
  76. package/dist/lib/esm/mobile-app-info.d.mts +32 -0
  77. package/dist/lib/esm/mobile-app-info.mjs +84 -0
  78. package/dist/lib/esm/obsidian-settings.mjs +6 -3
  79. package/dist/lib/esm/settings-modal.d.mts +33 -0
  80. package/dist/lib/esm/settings-modal.mjs +15 -0
  81. package/package.json +7 -6
@@ -108,6 +108,7 @@ __export(components_exports, {
108
108
  "core-plugin-toggle-component": () => core_plugin_toggle_component,
109
109
  "disposable-component": () => disposable_component,
110
110
  "embed-extensions-component": () => embed_extensions_component,
111
+ "embeddable-markdown-editor-component": () => embeddable_markdown_editor_component,
111
112
  "file-explorer-root-menu-component": () => file_explorer_root_menu_component,
112
113
  "generate-markdown-link-default-params-component": () => generate_markdown_link_default_params_component,
113
114
  "incremental-file-index-component": () => incremental_file_index_component,
@@ -122,6 +123,7 @@ __export(components_exports, {
122
123
  "plugin-settings-tab-component": () => plugin_settings_tab_component,
123
124
  "plugin-suggestion-component": () => plugin_suggestion_component,
124
125
  "pointer-position-component": () => pointer_position_component,
126
+ "reconfigurable-editor-extension-component": () => reconfigurable_editor_extension_component,
125
127
  "registry-component": () => registry_component,
126
128
  "release-notes-component": () => release_notes_component,
127
129
  "rename-delete-handler-component": () => rename_delete_handler_component,
@@ -142,6 +144,7 @@ var console_debug_component = __toESM(((module) => module && module.__esModule &
142
144
  var core_plugin_toggle_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./core-plugin-toggle-component.cjs')), 1);
143
145
  var disposable_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./disposable-component.cjs')), 1);
144
146
  var embed_extensions_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./embed-extensions-component.cjs')), 1);
147
+ var embeddable_markdown_editor_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./embeddable-markdown-editor-component.cjs')), 1);
145
148
  var file_explorer_root_menu_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./file-explorer-root-menu-component.cjs')), 1);
146
149
  var generate_markdown_link_default_params_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./generate-markdown-link-default-params-component.cjs')), 1);
147
150
  var incremental_file_index_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./incremental-file-index-component.cjs')), 1);
@@ -156,6 +159,7 @@ var plugin_settings_component = __toESM(((module) => module && module.__esModule
156
159
  var plugin_settings_tab_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-settings-tab-component.cjs')), 1);
157
160
  var plugin_suggestion_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./plugin-suggestion-component.cjs')), 1);
158
161
  var pointer_position_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./pointer-position-component.cjs')), 1);
162
+ var reconfigurable_editor_extension_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./reconfigurable-editor-extension-component.cjs')), 1);
159
163
  var registry_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./registry-component.cjs')), 1);
160
164
  var release_notes_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./release-notes-component.cjs')), 1);
161
165
  var rename_delete_handler_component = __toESM(((module) => module && module.__esModule && 'default' in module ? module.default : module)(require('./rename-delete-handler-component.cjs')), 1);
@@ -176,6 +180,7 @@ var templates_language_component = __toESM(((module) => module && module.__esMod
176
180
  "core-plugin-toggle-component": null,
177
181
  "disposable-component": null,
178
182
  "embed-extensions-component": null,
183
+ "embeddable-markdown-editor-component": null,
179
184
  "file-explorer-root-menu-component": null,
180
185
  "generate-markdown-link-default-params-component": null,
181
186
  "incremental-file-index-component": null,
@@ -190,6 +195,7 @@ var templates_language_component = __toESM(((module) => module && module.__esMod
190
195
  "plugin-settings-tab-component": null,
191
196
  "plugin-suggestion-component": null,
192
197
  "pointer-position-component": null,
198
+ "reconfigurable-editor-extension-component": null,
193
199
  "registry-component": null,
194
200
  "release-notes-component": null,
195
201
  "rename-delete-handler-component": null,
@@ -198,4 +204,4 @@ var templates_language_component = __toESM(((module) => module && module.__esMod
198
204
  "syntax-highlighting-component": null,
199
205
  "templates-language-component": null
200
206
  });
201
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdidWxrLW9wZXJhdGlvbi1jb21taXQtY29tcG9uZW50JyBmcm9tICcuL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tcG9uZW50LWV4JyBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5leHBvcnQgKiBhcyAnY29uc29sZS1kZWJ1Zy1jb21wb25lbnQnIGZyb20gJy4vY29uc29sZS1kZWJ1Zy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQnIGZyb20gJy4vY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZS1jb21wb25lbnQnIGZyb20gJy4vZGlzcG9zYWJsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50JyBmcm9tICcuL2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQnIGZyb20gJy4vZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCcgZnJvbSAnLi9nZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWdpc3RyeS1jb21wb25lbnQnIGZyb20gJy4vcmVnaXN0cnktY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWxlYXNlLW5vdGVzLWNvbXBvbmVudCcgZnJvbSAnLi9yZWxlYXNlLW5vdGVzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9yZW5hbWUtZGVsZXRlLWhhbmRsZXItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdybWRpci1ndWFyZC1jb21wb25lbnQnIGZyb20gJy4vcm1kaXItZ3VhcmQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50JyBmcm9tICcuL3NldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50JyBmcm9tICcuL3N5bnRheC1oaWdobGlnaHRpbmctY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICd0ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50JyBmcm9tICcuL3RlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQudHMnO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBLGtDQUFBQTtBQUFBLEVBQUEscUNBQUFDO0FBQUEsRUFBQSx1Q0FBQUM7QUFBQSxFQUFBLGdDQUFBQztBQUFBLEVBQUEseUNBQUFDO0FBQUEsRUFBQSwrQ0FBQUM7QUFBQSxFQUFBLHNCQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSxzQ0FBQUM7QUFBQSxFQUFBLDhCQUFBQztBQUFBLEVBQUEsb0NBQUFDO0FBQUEsRUFBQSwyQ0FBQUM7QUFBQSxFQUFBLHlEQUFBQztBQUFBLEVBQUEsMENBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLHdDQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSwyREFBQUM7QUFBQSxFQUFBLGtDQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLG1DQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxxQ0FBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEsNEJBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLHlDQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSxzQ0FBQUM7QUFBQSxFQUFBLHVDQUFBQztBQUFBLEVBQUEsc0NBQUFDO0FBQUE7QUFBQTtBQUVBLElBQUEvQix5QkFBMEM7QUFDMUMsSUFBQUMsOEJBQStDO0FBQy9DLElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQyx5QkFBMEM7QUFDMUMsSUFBQUMsa0NBQW1EO0FBQ25ELElBQUFDLHdDQUF5RDtBQUN6RCxJQUFBQyxlQUFnQztBQUNoQyxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLHVCQUF3QztBQUN4QyxJQUFBQyw2QkFBOEM7QUFDOUMsSUFBQUMsb0NBQXFEO0FBQ3JELElBQUFDLGtEQUFtRTtBQUNuRSxJQUFBQyxtQ0FBb0Q7QUFDcEQsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGlDQUFrRDtBQUNsRCxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsb0RBQXFFO0FBQ3JFLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQyx3QkFBeUM7QUFDekMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDRCQUE2QztBQUM3QyxJQUFBQyxnQ0FBaUQ7QUFDakQsSUFBQUMsOEJBQStDO0FBQy9DLElBQUFDLDZCQUE4QztBQUM5QyxJQUFBQyxxQkFBc0M7QUFDdEMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLGtDQUFtRDtBQUNuRCxJQUFBQyx3QkFBeUM7QUFDekMsSUFBQUMsK0JBQWdEO0FBQ2hELElBQUFDLGdDQUFpRDtBQUNqRCxJQUFBQywrQkFBZ0Q7IiwibmFtZXMiOlsiYWJvcnQtc2lnbmFsLWNvbXBvbmVudCIsImFsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudCIsImFzeW5jLWVycm9yLWhhbmRsZXItY29tcG9uZW50IiwiYXN5bmMtZXZlbnRzLWNvbXBvbmVudCIsImJ1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQiLCJjYXNlLWluc2Vuc2l0aXZlLWZpbGUtaW5kZXgtY29tcG9uZW50IiwiY29tcG9uZW50LWV4IiwiY29uc29sZS1kZWJ1Zy1jb21wb25lbnQiLCJjb3JlLXBsdWdpbi10b2dnbGUtY29tcG9uZW50IiwiZGlzcG9zYWJsZS1jb21wb25lbnQiLCJlbWJlZC1leHRlbnNpb25zLWNvbXBvbmVudCIsImZpbGUtZXhwbG9yZXItcm9vdC1tZW51LWNvbXBvbmVudCIsImdlbmVyYXRlLW1hcmtkb3duLWxpbmstZGVmYXVsdC1wYXJhbXMtY29tcG9uZW50IiwiaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQiLCJsYXlvdXQtcmVhZHktY29tcG9uZW50IiwibWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwibW9ua2V5LWFyb3VuZC1jb21wb25lbnQiLCJub3RlYm9vay1uYXZpZ2F0b3ItbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50IiwicGx1Z2luLWNvbnRleHQtY29tcG9uZW50IiwicGx1Z2luLWdhdGUtY29tcG9uZW50IiwicGx1Z2luLW5vdGljZS1jb21wb25lbnQiLCJwbHVnaW4tc2V0dGluZ3MtY29tcG9uZW50IiwicGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQiLCJwbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQiLCJwb2ludGVyLXBvc2l0aW9uLWNvbXBvbmVudCIsInJlZ2lzdHJ5LWNvbXBvbmVudCIsInJlbGVhc2Utbm90ZXMtY29tcG9uZW50IiwicmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCIsInJtZGlyLWd1YXJkLWNvbXBvbmVudCIsInNldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQiLCJzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCIsInRlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQiXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIFRISVMgSVMgQSBHRU5FUkFURUQvQlVORExFRCBGSUxFIEJZIEJVSUxEIFNDUklQVCAqL1xuXG5leHBvcnQgKiBhcyAnYWJvcnQtc2lnbmFsLWNvbXBvbmVudCcgZnJvbSAnLi9hYm9ydC1zaWduYWwtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQnIGZyb20gJy4vYWxsLXdpbmRvd3MtZXZlbnQtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnYXN5bmMtZXZlbnRzLWNvbXBvbmVudCcgZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdidWxrLW9wZXJhdGlvbi1jb21taXQtY29tcG9uZW50JyBmcm9tICcuL2J1bGstb3BlcmF0aW9uLWNvbW1pdC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2Nhc2UtaW5zZW5zaXRpdmUtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnY29tcG9uZW50LWV4JyBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5leHBvcnQgKiBhcyAnY29uc29sZS1kZWJ1Zy1jb21wb25lbnQnIGZyb20gJy4vY29uc29sZS1kZWJ1Zy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2NvcmUtcGx1Z2luLXRvZ2dsZS1jb21wb25lbnQnIGZyb20gJy4vY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnZGlzcG9zYWJsZS1jb21wb25lbnQnIGZyb20gJy4vZGlzcG9zYWJsZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50JyBmcm9tICcuL2VtYmVkLWV4dGVuc2lvbnMtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdlbWJlZGRhYmxlLW1hcmtkb3duLWVkaXRvci1jb21wb25lbnQnIGZyb20gJy4vZW1iZWRkYWJsZS1tYXJrZG93bi1lZGl0b3ItY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQnIGZyb20gJy4vZmlsZS1leHBsb3Jlci1yb290LW1lbnUtY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCcgZnJvbSAnLi9nZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQnIGZyb20gJy4vaW5jcmVtZW50YWwtZmlsZS1pbmRleC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ2xheW91dC1yZWFkeS1jb21wb25lbnQnIGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbWVudS1ldmVudC1yZWdpc3RyYXItY29tcG9uZW50JyBmcm9tICcuL21lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnbW9ua2V5LWFyb3VuZC1jb21wb25lbnQnIGZyb20gJy4vbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ25vdGVib29rLW5hdmlnYXRvci1tZW51LWV2ZW50LXJlZ2lzdHJhci1jb21wb25lbnQnIGZyb20gJy4vbm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWNvbnRleHQtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1jb250ZXh0LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLWdhdGUtY29tcG9uZW50JyBmcm9tICcuL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLW5vdGljZS1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zZXR0aW5ncy1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQnIGZyb20gJy4vcGx1Z2luLXNldHRpbmdzLXRhYi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BsdWdpbi1zdWdnZXN0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9wbHVnaW4tc3VnZ2VzdGlvbi1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50JyBmcm9tICcuL3BvaW50ZXItcG9zaXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdyZWNvbmZpZ3VyYWJsZS1lZGl0b3ItZXh0ZW5zaW9uLWNvbXBvbmVudCcgZnJvbSAnLi9yZWNvbmZpZ3VyYWJsZS1lZGl0b3ItZXh0ZW5zaW9uLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVnaXN0cnktY29tcG9uZW50JyBmcm9tICcuL3JlZ2lzdHJ5LWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncmVsZWFzZS1ub3Rlcy1jb21wb25lbnQnIGZyb20gJy4vcmVsZWFzZS1ub3Rlcy1jb21wb25lbnQudHMnO1xuZXhwb3J0ICogYXMgJ3JlbmFtZS1kZWxldGUtaGFuZGxlci1jb21wb25lbnQnIGZyb20gJy4vcmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAncm1kaXItZ3VhcmQtY29tcG9uZW50JyBmcm9tICcuL3JtZGlyLWd1YXJkLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAnc2V0dGluZ3MtbWlncmF0aW9uLWNvbXBvbmVudCcgZnJvbSAnLi9zZXR0aW5ncy1taWdyYXRpb24tY29tcG9uZW50LnRzJztcbmV4cG9ydCAqIGFzICdzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCcgZnJvbSAnLi9zeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudC50cyc7XG5leHBvcnQgKiBhcyAndGVtcGxhdGVzLWxhbmd1YWdlLWNvbXBvbmVudCcgZnJvbSAnLi90ZW1wbGF0ZXMtbGFuZ3VhZ2UtY29tcG9uZW50LnRzJztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQSxrQ0FBQUE7QUFBQSxFQUFBLHFDQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLHlDQUFBQztBQUFBLEVBQUEsK0NBQUFDO0FBQUEsRUFBQSxzQkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEsc0NBQUFDO0FBQUEsRUFBQSw4QkFBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEsOENBQUFDO0FBQUEsRUFBQSwyQ0FBQUM7QUFBQSxFQUFBLHlEQUFBQztBQUFBLEVBQUEsMENBQUFDO0FBQUEsRUFBQSxnQ0FBQUM7QUFBQSxFQUFBLHdDQUFBQztBQUFBLEVBQUEsaUNBQUFDO0FBQUEsRUFBQSwyREFBQUM7QUFBQSxFQUFBLGtDQUFBQztBQUFBLEVBQUEsK0JBQUFDO0FBQUEsRUFBQSxpQ0FBQUM7QUFBQSxFQUFBLG1DQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxxQ0FBQUM7QUFBQSxFQUFBLG9DQUFBQztBQUFBLEVBQUEsbURBQUFDO0FBQUEsRUFBQSw0QkFBQUM7QUFBQSxFQUFBLGlDQUFBQztBQUFBLEVBQUEseUNBQUFDO0FBQUEsRUFBQSwrQkFBQUM7QUFBQSxFQUFBLHNDQUFBQztBQUFBLEVBQUEsdUNBQUFDO0FBQUEsRUFBQSxzQ0FBQUM7QUFBQTtBQUFBO0FBRUEsSUFBQWpDLHlCQUEwQztBQUMxQyxJQUFBQyw4QkFBK0M7QUFDL0MsSUFBQUMsZ0NBQWlEO0FBQ2pELElBQUFDLHlCQUEwQztBQUMxQyxJQUFBQyxrQ0FBbUQ7QUFDbkQsSUFBQUMsd0NBQXlEO0FBQ3pELElBQUFDLGVBQWdDO0FBQ2hDLElBQUFDLDBCQUEyQztBQUMzQyxJQUFBQywrQkFBZ0Q7QUFDaEQsSUFBQUMsdUJBQXdDO0FBQ3hDLElBQUFDLDZCQUE4QztBQUM5QyxJQUFBQyx1Q0FBd0Q7QUFDeEQsSUFBQUMsb0NBQXFEO0FBQ3JELElBQUFDLGtEQUFtRTtBQUNuRSxJQUFBQyxtQ0FBb0Q7QUFDcEQsSUFBQUMseUJBQTBDO0FBQzFDLElBQUFDLGlDQUFrRDtBQUNsRCxJQUFBQywwQkFBMkM7QUFDM0MsSUFBQUMsb0RBQXFFO0FBQ3JFLElBQUFDLDJCQUE0QztBQUM1QyxJQUFBQyx3QkFBeUM7QUFDekMsSUFBQUMsMEJBQTJDO0FBQzNDLElBQUFDLDRCQUE2QztBQUM3QyxJQUFBQyxnQ0FBaUQ7QUFDakQsSUFBQUMsOEJBQStDO0FBQy9DLElBQUFDLDZCQUE4QztBQUM5QyxJQUFBQyw0Q0FBNkQ7QUFDN0QsSUFBQUMscUJBQXNDO0FBQ3RDLElBQUFDLDBCQUEyQztBQUMzQyxJQUFBQyxrQ0FBbUQ7QUFDbkQsSUFBQUMsd0JBQXlDO0FBQ3pDLElBQUFDLCtCQUFnRDtBQUNoRCxJQUFBQyxnQ0FBaUQ7QUFDakQsSUFBQUMsK0JBQWdEOyIsIm5hbWVzIjpbImFib3J0LXNpZ25hbC1jb21wb25lbnQiLCJhbGwtd2luZG93cy1ldmVudC1jb21wb25lbnQiLCJhc3luYy1lcnJvci1oYW5kbGVyLWNvbXBvbmVudCIsImFzeW5jLWV2ZW50cy1jb21wb25lbnQiLCJidWxrLW9wZXJhdGlvbi1jb21taXQtY29tcG9uZW50IiwiY2FzZS1pbnNlbnNpdGl2ZS1maWxlLWluZGV4LWNvbXBvbmVudCIsImNvbXBvbmVudC1leCIsImNvbnNvbGUtZGVidWctY29tcG9uZW50IiwiY29yZS1wbHVnaW4tdG9nZ2xlLWNvbXBvbmVudCIsImRpc3Bvc2FibGUtY29tcG9uZW50IiwiZW1iZWQtZXh0ZW5zaW9ucy1jb21wb25lbnQiLCJlbWJlZGRhYmxlLW1hcmtkb3duLWVkaXRvci1jb21wb25lbnQiLCJmaWxlLWV4cGxvcmVyLXJvb3QtbWVudS1jb21wb25lbnQiLCJnZW5lcmF0ZS1tYXJrZG93bi1saW5rLWRlZmF1bHQtcGFyYW1zLWNvbXBvbmVudCIsImluY3JlbWVudGFsLWZpbGUtaW5kZXgtY29tcG9uZW50IiwibGF5b3V0LXJlYWR5LWNvbXBvbmVudCIsIm1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsIm1vbmtleS1hcm91bmQtY29tcG9uZW50Iiwibm90ZWJvb2stbmF2aWdhdG9yLW1lbnUtZXZlbnQtcmVnaXN0cmFyLWNvbXBvbmVudCIsInBsdWdpbi1jb250ZXh0LWNvbXBvbmVudCIsInBsdWdpbi1nYXRlLWNvbXBvbmVudCIsInBsdWdpbi1ub3RpY2UtY29tcG9uZW50IiwicGx1Z2luLXNldHRpbmdzLWNvbXBvbmVudCIsInBsdWdpbi1zZXR0aW5ncy10YWItY29tcG9uZW50IiwicGx1Z2luLXN1Z2dlc3Rpb24tY29tcG9uZW50IiwicG9pbnRlci1wb3NpdGlvbi1jb21wb25lbnQiLCJyZWNvbmZpZ3VyYWJsZS1lZGl0b3ItZXh0ZW5zaW9uLWNvbXBvbmVudCIsInJlZ2lzdHJ5LWNvbXBvbmVudCIsInJlbGVhc2Utbm90ZXMtY29tcG9uZW50IiwicmVuYW1lLWRlbGV0ZS1oYW5kbGVyLWNvbXBvbmVudCIsInJtZGlyLWd1YXJkLWNvbXBvbmVudCIsInNldHRpbmdzLW1pZ3JhdGlvbi1jb21wb25lbnQiLCJzeW50YXgtaGlnaGxpZ2h0aW5nLWNvbXBvbmVudCIsInRlbXBsYXRlcy1sYW5ndWFnZS1jb21wb25lbnQiXX0=
@@ -10,6 +10,7 @@ export * as 'console-debug-component' from './console-debug-component.cjs';
10
10
  export * as 'core-plugin-toggle-component' from './core-plugin-toggle-component.cjs';
11
11
  export * as 'disposable-component' from './disposable-component.cjs';
12
12
  export * as 'embed-extensions-component' from './embed-extensions-component.cjs';
13
+ export * as 'embeddable-markdown-editor-component' from './embeddable-markdown-editor-component.cjs';
13
14
  export * as 'file-explorer-root-menu-component' from './file-explorer-root-menu-component.cjs';
14
15
  export * as 'generate-markdown-link-default-params-component' from './generate-markdown-link-default-params-component.cjs';
15
16
  export * as 'incremental-file-index-component' from './incremental-file-index-component.cjs';
@@ -24,6 +25,7 @@ export * as 'plugin-settings-component' from './plugin-settings-component.cjs';
24
25
  export * as 'plugin-settings-tab-component' from './plugin-settings-tab-component.cjs';
25
26
  export * as 'plugin-suggestion-component' from './plugin-suggestion-component.cjs';
26
27
  export * as 'pointer-position-component' from './pointer-position-component.cjs';
28
+ export * as 'reconfigurable-editor-extension-component' from './reconfigurable-editor-extension-component.cjs';
27
29
  export * as 'registry-component' from './registry-component.cjs';
28
30
  export * as 'release-notes-component' from './release-notes-component.cjs';
29
31
  export * as 'rename-delete-handler-component' from './rename-delete-handler-component.cjs';
@@ -128,6 +128,7 @@ var import_i18n = require('../i18n/i18n.cjs');
128
128
  var import_plugin_api = require('../plugin/plugin-api.cjs');
129
129
  var import_plugin_install_state = require('../plugin/plugin-install-state.cjs');
130
130
  var import_plugin_lifecycle_events = require('../plugin/plugin-lifecycle-events.cjs');
131
+ var import_settings_modal = require('../settings-modal.cjs');
131
132
  var import_async_events_component = require('./async-events-component.cjs');
132
133
  var import_component_ex = require('./component-ex.cjs');
133
134
  var import_layout_ready_component = require('./layout-ready-component.cjs');
@@ -596,8 +597,10 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
596
597
  new import_obsidian.ButtonComponent(bannerEl).setButtonText((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.openDependencySettings, {
597
598
  dependencyPluginName: pluginName
598
599
  })).onClick(() => {
599
- this.app.setting.open();
600
- this.app.setting.openTabById(pluginId);
600
+ (0, import_settings_modal.openSettingTab)({
601
+ app: this.app,
602
+ tabId: pluginId
603
+ });
601
604
  });
602
605
  }
603
606
  showBlockedSettingTab(unsatisfiedDependencies, blockingConflicts) {
@@ -619,4 +622,4 @@ class PluginGateComponent extends import_component_ex.ComponentEx {
619
622
  PluginConflictSeverity,
620
623
  PluginGateComponent
621
624
  });
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0V2ZW50IH0gZnJvbSAnLi9hc3luYy1ldmVudHMtY29tcG9uZW50LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LXJlYWR5LWNvbXBvbmVudC50cyc7XG5cbi8qKlxuICogSG93IGxvbmcgYSBnYXRlIHRoYXQgY2xvc2VkIHdoaWxlIHRoZSBwbHVnaW4gd2FzIHJ1bm5pbmcgd2FpdHMgYmVmb3JlIHNheWluZyBzby5cbiAqXG4gKiBMb25nIGVub3VnaCB0byBjb3ZlciBPYnNpZGlhbiByZWxvYWRpbmcgYSBwbHVnaW4gdG8gYXBwbHkgaXRzIHVwZGF0ZSwgc2hvcnQgZW5vdWdoIHRoYXQgYSB1c2VyIHdob1xuICogZGlzYWJsZWQgdGhlIGRlcGVuZGVuY3kgYnkgaGFuZCBzdGlsbCBjb25uZWN0cyB0aGUgbm90aWNlIHRvIHdoYXQgdGhleSBqdXN0IGRpZC5cbiAqL1xuY29uc3QgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGJhZGx5IHR3byBwbHVnaW5zIHJ1bm5pbmcgc2lkZSBieSBzaWRlIGdvZXMgd3JvbmcsIGFuZCB0aGVyZWZvcmUgd2hhdCB0aGlzIG9uZSBkb2VzIGFib3V0IGl0LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5Db25mbGljdFNldmVyaXR5IHtcbiAgLyoqXG4gICAqIFRoZSBob3N0IHJlZnVzZXMgdG8gcnVuIGF0IGFsbCB3aGlsZSB0aGUgY29uZmxpY3QgaG9sZHM6IGBvbmxvYWRJbXBsYCBuZXZlciBydW5zLCBub3RoaW5nIGlzXG4gICAqIHJlZ2lzdGVyZWQsIGFuZCB0aGUgcGx1Z2luIGV4cGxhaW5zIGl0c2VsZiB0aGUgd2F5IGEgbWlzc2luZyBkZXBlbmRlbmN5IGRvZXMuXG4gICAqXG4gICAqIEZvciBhbiBvdmVybGFwIHdoZXJlIGJvdGggcGx1Z2lucyBhY3Rpbmcgb24gdGhlIHNhbWUgb3BlcmF0aW9uIGRhbWFnZXMgdGhlIHZhdWx0LlxuICAgKi9cbiAgQmxvY2sgPSAnYmxvY2snLFxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBydW5zIGFueXdheSBhbmQgc2F5cyB0aGUgb3ZlcmxhcCBpcyB0aGVyZS5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgdGhhdCBpcyBhbm5veWluZyByYXRoZXIgdGhhbiBkZXN0cnVjdGl2ZSDigJQgZHVwbGljYXRlIGNvbW1hbmRzLCB3b3JrIGRvbmUgdHdpY2Ug4oCUIHdoZXJlXG4gICAqIHJlZnVzaW5nIHRvIGxvYWQgd291bGQgY29zdCB0aGUgdXNlciBtb3JlIHRoYW4gdGhlIG92ZXJsYXAgZG9lcy5cbiAgICovXG4gIFdhcm4gPSAnd2Fybidcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUsIG9yIHdhcm5zIGFib3V0IHJ1bm5pbmcgYmVzaWRlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkNvbmZsaWN0IHtcbiAgLyoqXG4gICAqIFRoZSBzZW12ZXIgcmFuZ2Ugb2YgdGhlIE9USEVSIHBsdWdpbidzIHZlcnNpb25zIHRoYXQgY29uZmxpY3QsIGUuZy4gYCc8MTIuMC4wJ2AgZm9yIFwiZXZlcnkgdmVyc2lvblxuICAgKiBiZWZvcmUgdGhlIG9uZSB0aGF0IGdhdmUgdGhpcyBiZWhhdmlvciB1cFwiLlxuICAgKlxuICAgKiBBIHJhbmdlIHJhdGhlciB0aGFuIGEgbWluaW11bSwgc28gYW4gb3ZlcmxhcCBjb25maW5lZCB0byBvbmUgbWFqb3IgKGAnPj0zIDw0J2ApIGlzIGV4cHJlc3NpYmxlLCBhbmQgc29cbiAgICogaXMgYSBwbHVnaW4gdGhhdCBjb25mbGljdHMgYXQgZXZlcnkgdmVyc2lvbiDigJQgc3BlbGwgdGhhdCBgJz49MC4wLjAnYCwgc2luY2UgYGNvbXBhcmUtdmVyc2lvbnNgIHJlamVjdHNcbiAgICogYSBiYXJlIGAqYC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhc1xuICAgKiBjb25mbGljdGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0aW5nVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSBjb25mbGljdGluZyBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCBnb2VzIHdyb25nIHdoZW4gYm90aCBydW4sIHNob3duIGluIHRoZSBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZWNsYXJpbmcgcGx1Z2luIG93bnMgdGhpcyBzdHJpbmcgYmVjYXVzZSBvbmx5IGl0IGtub3dzIHdoYXQgdGhlIHR3byBvZiB0aGVtIGNvbGxpZGUgb3ZlciwgYW5kIGFcbiAgICogdXNlciBiZWluZyBhc2tlZCB0byBkaXNhYmxlIHNvbWV0aGluZyBkZXNlcnZlcyB0byBiZSB0b2xkIHdoeS5cbiAgICpcbiAgICogUGFzcyBhIHtAbGluayBEb2N1bWVudEZyYWdtZW50fSB0byBtYXJrIHVwIHBhcnQgb2YgdGhlIHNlbnRlbmNlLCBzdWNoIGFzIGEgcGx1Z2luIG5hbWUgcmVuZGVyZWQgYXNcbiAgICogY29kZS4gRWFjaCByZW5kZXIgYXBwZW5kcyBhIGZyZXNoIGNsb25lIG9mIGl0LCBzaW5jZSB0aGUgYmFubmVyIGlzIHJlbmRlcmVkIGFnYWluIG9uIGV2ZXJ5IHJlZnJlc2guXG4gICAqL1xuICByZWFkb25seSByZWFzb246IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhpcyBwbHVnaW4gZG9lcyBhYm91dCB0aGUgY29uZmxpY3QuXG4gICAqL1xuICByZWFkb25seSBzZXZlcml0eTogUGx1Z2luQ29uZmxpY3RTZXZlcml0eTtcbn1cblxuLyoqXG4gKiBBIHBsdWdpbiBhbm90aGVyIHBsdWdpbiBjYW5ub3Qgd29yayB3aXRob3V0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkRlcGVuZGVuY3kge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiBBUEkgY29udHJhY3QgdmVyc2lvbnMgdGhlIGRlcGVuZGVudCBjb21waWxlZCBhZ2FpbnN0LCBlLmcuIGAnXjInYC5cbiAgICpcbiAgICogQSBkZXBlbmRlbmN5IHdob3NlIHB1Ymxpc2hlZCBBUEkgZmFsbHMgb3V0c2lkZSB0aGUgcmFuZ2UgY291bnRzIGFzIFVOU0FUSVNGSUVELCB3aGljaCBpcyB3aGF0IHR1cm5zIGFcbiAgICogc2lsZW50IGJlaGF2aW9yYWwgbWlzbWF0Y2ggYmV0d2VlbiB0d28gaW5kZXBlbmRlbnRseSByZWxlYXNlZCBwbHVnaW5zIGludG8gYSB2aXNpYmxlIFwidXBkYXRlIHRoaXNcbiAgICogb25lXCIgbWVzc2FnZS4gU3BlbGwgXCJhbnkgdmVyc2lvblwiIGFzIGAnPj0wLjAuMCdgIOKAlCBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0cyBhIGJhcmUgYCpgLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpVmVyc2lvblJhbmdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvbGRlc3QgcmVsZWFzZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luIHRoZSBkZXBlbmRlbnQgd29ya3Mgd2l0aCwgZS5nLiBgJzIuMi4wJ2AuXG4gICAqXG4gICAqIEZvciBhIHByb3ZpZGVyIHdob3NlIEJFSEFWSU9SIGNoYW5nZWQgd2hpbGUgaXRzIEFQSSBjb250cmFjdCBzdGF5ZWQgdGhlIHNhbWUsIHdoaWNoXG4gICAqIHtAbGluayBhcGlWZXJzaW9uUmFuZ2V9IGNhbm5vdCBzZWUuIEEgZGVwZW5kZW5jeSBlbmFibGVkIGJlbG93IGl0IGNvdW50cyBhcyBVTlNBVElTRklFRCBhbmQgYXNrcyB0aGVcbiAgICogdXNlciB0byB1cGRhdGUgaXQuIEV2YWx1YXRlZCBhZ2FpbnN0IGBtYW5pZmVzdC52ZXJzaW9uYDsgYSB2ZXJzaW9uIHRoYXQgY2Fubm90IGJlIHBhcnNlZCBjb3VudHMgYXMgdG9vXG4gICAqIG9sZC4gQSBtaW5pbXVtIHJhdGhlciB0aGFuIGEgcmFuZ2UsIGJlY2F1c2UgdGhlIG9ubHkgYWR2aWNlIHRoZSBnYXRlIGNhbiBnaXZlIGlzIFwidXBkYXRlIGl0XCIsIGFuZCBhblxuICAgKiB1cHBlciBib3VuZCBpcyBhIHZlcnNpb24gbm8gdXBkYXRlIHJlYWNoZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5QbHVnaW5WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBhcyBsaXN0ZWQgaW4gT2JzaWRpYW4ncyBjb21tdW5pdHkgcGx1Z2luIHJlZ2lzdHJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGUgcmVxdWlyZWQgcGx1Z2luLCBzaG93biB0byB0aGUgdXNlci5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQSBsb2NhbGl6ZWQgc2VudGVuY2Ugc2F5aW5nIHdoYXQgdGhlIGRlcGVuZGVudCBkb2VzIHdpdGggdGhpcyBwbHVnaW4sIHNob3duIGluIHRoZSBzZXR0aW5ncyBiYW5uZXIuXG4gICAqXG4gICAqIFRoZSBkZXBlbmRlbnQgb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCBpdCB1c2VzIHRoZSBvdGhlciBwbHVnaW4gZm9yLCBhbmQgYSB1c2VyXG4gICAqIGJlaW5nIGFza2VkIHRvIGluc3RhbGwgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIFBsdWdpbkdhdGVDb21wb25lbnR9IGNvbnN0cnVjdG9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmxpY3RzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiByZWZ1c2VzIHRvIHJ1biBiZXNpZGUgbm90aGluZy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcblxuICAvKipcbiAgICogVGhlIGRlcGVuZGVuY2llcyB0byBlbmZvcmNlLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoZSBwbHVnaW4gZGVwZW5kcyBvbiBub3RoaW5nLCBhbmQgaXRzIGZlYXR1cmVcbiAgICogc3VyZmFjZSBsb2FkcyBpbW1lZGlhdGVseS5cbiAgICovXG4gIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCBvbmNlIGV2ZXJ5IGRlcGVuZGVuY3kgaXMgc2F0aXNmaWVkIGFuZCBubyBibG9ja2luZ1xuICAgKiBjb25mbGljdCBob2xkcywgYW5kIGFnYWluIGFmdGVyIGEgZ2F0ZSB0aGF0IGhhZCBjbG9zZWQgb3BlbnMgYmFjayB1cC5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBzdXJmYWNlIGlzIGxvYWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luIOKAlCB0aGUgb25lIGRlY2xhcmluZyB0aGUgZGVwZW5kZW5jaWVzIGFuZCBjb25mbGljdHMuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW46IFBsdWdpbjtcblxuICAvKipcbiAgICogVGhlIGhvc3QgcGx1Z2luJ3Mgbm90aWNlIGNvbXBvbmVudCwgdXNlZCB0byBzYXkgd2hhdCBpcyBtaXNzaW5nLCB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCB3aGF0IGNoYW5nZWQuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IFBsdWdpbk5vdGljZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogVW5sb2FkcyB0aGUgaG9zdCBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2UuIENhbGxlZCB3aGVuIGEgZ2F0ZSB0aGF0IGhhZCBiZWVuIG9wZW4gY2xvc2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3IgdGhlIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0gY29uc3RydWN0b3IuXG4gKi9cbmludGVyZmFjZSBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYkNvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBibG9ja2VkIHBsdWdpbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBibG9ja2VkIGV4cGxhbmF0aW9uIGludG8gdGhlIHRhYidzIGNvbnRhaW5lci5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIHRhYidzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBzZXR0aW5ncyB0YWIgYSBibG9ja2VkIHBsdWdpbiBzaG93cyBpbiBwbGFjZSBvZiB0aGUgb25lIGl0IG5ldmVyIGdvdCB0byByZWdpc3Rlci5cbiAqXG4gKiBBIGJsb2NrZWQgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIG5ldmVyIHJhbiwgc28gaXRzIHJlYWwgc2V0dGluZ3MgdGFiIGRvZXMgbm90IGV4aXN0IOKAlCBhbmQgYSB1c2VyIHdobyBnb2VzXG4gKiBsb29raW5nIGZvciB0aGUgcGx1Z2luJ3Mgc2V0dGluZ3MgaXMgcHJlY2lzZWx5IHRoZSB1c2VyIGFza2luZyBcIndoeSBpc24ndCB0aGlzIGRvaW5nIGFueXRoaW5nP1wiLiBBblxuICogZW1wdHkgc3BhY2UgaXMgdGhlIHdvcnN0IHBvc3NpYmxlIGFuc3dlciB0byB0aGF0IHF1ZXN0aW9uLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW5tZC9zZXR0aW5ncy10YWIvcHJlZmVyLXNldHRpbmctZGVmaW5pdGlvbnMgLS0gVGhpcyB0YWIgaGFzIG5vIHNldHRpbmdzIHRvIGRlY2xhcmUuIEl0IHN0YW5kcyBpbiBmb3IgYSBzZXR0aW5ncyB0YWIgdGhhdCBkb2VzIG5vdCBleGlzdCB5ZXQsIGNhcnJ5aW5nIGFuIGV4cGxhbmF0aW9uIGFuZCBhIHJlcGFpciBidXR0b24sIGFuZCB0aGUgcGx1Z2luJ3MgcmVhbCBzZXR0aW5ncyBhcHBlYXIgdGhlIG1vbWVudCB0aGUgZ2F0ZSBvcGVucy5cbmNsYXNzIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcihwYXJhbXMucGx1Z2luLmFwcCwgcGFyYW1zLnBsdWdpbik7XG4gICAgdGhpcy5yZW5kZXJCYW5uZXIgPSBwYXJhbXMucmVuZGVyQmFubmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIHRhYi5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBkaXNwbGF5KCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyRWwuZW1wdHkoKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lcih0aGlzLmNvbnRhaW5lckVsKTtcbiAgfVxufVxuXG4vKipcbiAqIEVuZm9yY2VzIGEgcGx1Z2luJ3MgbWFuZGF0b3J5IGRlcGVuZGVuY2llcyBhbmQgZGVjbGFyZWQgY29uZmxpY3RzLCBnYXRpbmcgaXRzIGZlYXR1cmUgc3VyZmFjZSBvbiBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luR2F0ZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpUmVmcyA9IG5ldyBNYXA8c3RyaW5nLCBQbHVnaW5BcGlSZWY8b2JqZWN0Pj4oKTtcbiAgcHJpdmF0ZSBibG9ja2VkU2V0dGluZ1RhYjogbnVsbCB8IFBsdWdpblNldHRpbmdUYWIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXTtcbiAgcHJpdmF0ZSBoYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICBwcml2YXRlIGlzTGF5b3V0UmVhZHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgbG9zc0Fubm91bmNlbWVudFRpbWVySWQ6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuICBwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHVubG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiB2b2lkO1xuXG4gIHByaXZhdGUgZ2V0IGFwcCgpOiBBcHAge1xuICAgIHJldHVybiB0aGlzLnBsdWdpbi5hcHA7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkdhdGVDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5jb25mbGljdHMgPSBwYXJhbXMuY29uZmxpY3RzO1xuICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gcGFyYW1zLmRlcGVuZGVuY2llcztcbiAgICB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSA9IHBhcmFtcy5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gICAgdGhpcy5wbHVnaW4gPSBwYXJhbXMucGx1Z2luO1xuICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50ID0gcGFyYW1zLnBsdWdpbk5vdGljZUNvbXBvbmVudDtcbiAgICB0aGlzLnVubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLnVubG9hZEZlYXR1cmVTdXJmYWNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hldGhlciBhbnkgd2FybmluZyBjb25mbGljdCBpcyBpbiBmb3JjZSByaWdodCBub3cuXG4gICAqXG4gICAqIFRoZSBwcmVkaWNhdGUgYSBkZWNsYXJhdGl2ZSBzZXR0aW5ncyB0YWIgbmVlZHMsIGFuZCB0aGUgY291bnRlcnBhcnQgdG9cbiAgICogYFBsdWdpblN1Z2dlc3Rpb25Db21wb25lbnQuZ2V0U3VnZ2VzdGVkUGx1Z2luU3RhdGVgLiBTdWNoIGEgdGFiIGRlY2lkZXMgd2hldGhlciBhIHJvdyBleGlzdHNcbiAgICogQkVGT1JFIGl0IHJlbmRlcnMgYW55dGhpbmcgaW50byBpdCwgc28ge0BsaW5rIHJlbmRlckNvbmZsaWN0V2FybmluZ0Jhbm5lcn0gd3JpdGluZyBub3RoaW5nIGNhbm5vdFxuICAgKiBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGZvciBpdCDigJQgYSByb3cgdGhhdCByZW5kZXJzIGVtcHR5IGlzIHN0aWxsIGEgcm93LCB3aXRoIHRoZSBkaXZpZGVyIGFuZCBwYWRkaW5nXG4gICAqIGV2ZXJ5IG90aGVyIHNldHRpbmcgaGFzLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGF0IGxlYXN0IG9uZSBkZWNsYXJlZCB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKi9cbiAgcHVibGljIGhhc0FjdGl2ZVdhcm5pbmdDb25mbGljdHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgd2F0Y2hpbmcgZXZlcnkgZGVjbGFyZWQgZGVwZW5kZW5jeSBhbmQgY29uZmxpY3QuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB0aGlzLmRlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYXBpUmVmID0gd2F0Y2hQbHVnaW5BcGk8b2JqZWN0Pih7XG4gICAgICAgIGFwaVZlcnNpb25SYW5nZTogZGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2UsXG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuICAgICAgcmVnaXN0ZXJBc3luY0V2ZW50KFxuICAgICAgICB0aGlzLFxuICAgICAgICBhcGlSZWYub24oJ2NoYW5nZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLmFwaVJlZnMuc2V0KGRlcGVuZGVuY3kucGx1Z2luSWQsIGFwaVJlZik7XG4gICAgfVxuXG4gICAgLy8gQSBjb25mbGljdCBoYXMgbm8gQVBJIHRvIHdhdGNoIOKAlCBpdCBpcyByZWFkIG91dCBvZiB0aGUgbWFuaWZlc3RzIOKAlCBzbyB0aGUgdHJpZ2dlciB0byByZS1yZWFkIGlzIHRoZVxuICAgIC8vIGxpYnJhcnkncyBvd24gbGlmZWN5Y2xlIGJyb2FkY2FzdC4gSXQgY292ZXJzIGV2ZXJ5IGNvbmZsaWN0aW5nIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnk7IG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGlzIGNhdWdodCBhdCB0aGUgbmV4dCBsb2FkLCBhcyB0aGUgZmlsZSBoZWFkZXIgc2F5cy5cbiAgICBjb25zdCBsaWZlY3ljbGVFdmVudE5hbWVzOiBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWVbXSA9IFtQTFVHSU5fTE9BREVEX0VWRU5UX05BTUUsIFBMVUdJTl9VTkxPQURFRF9FVkVOVF9OQU1FXTtcbiAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBvZiBsaWZlY3ljbGVFdmVudE5hbWVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFxuICAgICAgICBldmVudE5hbWUsXG4gICAgICAgIGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAocGF5bG9hZDogUGx1Z2luTGlmZWN5Y2xlRXZlbnRQYXlsb2FkKSA9PiB7XG4gICAgICAgICAgaWYgKHBheWxvYWQucGx1Z2luSWQgPT09IHRoaXMucGx1Z2luLm1hbmlmZXN0LmlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICAgIH0pXG4gICAgICApKTtcbiAgICB9XG5cbiAgICAvLyBOb3RoaW5nIGlzIFNBSUQgYWJvdXQgYSBtaXNzaW5nIGRlcGVuZGVuY3kgdW50aWwgdGhlIGxheW91dCBpcyByZWFkeS4gUGx1Z2lucyBsb2FkIGluIGFuIHVuc3BlY2lmaWVkXG4gICAgLy8gb3JkZXIsIHNvIGEgZGVwZW5kZW5jeSB0aGF0IHNpbXBseSBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgYXQgdGhpcyBwb2ludCBmcm9tIG9uZVxuICAgIC8vIHRoYXQgaXMgbm90IGluc3RhbGxlZCDigJQgYW5ub3VuY2luZyBoZXJlIHdvdWxkIHB1dCBhIFwibWlzc2luZyBwbHVnaW5cIiBub3RpY2Ugb24gc2NyZWVuIGF0IGV2ZXJ5XG4gICAgLy8gc3RhcnR1cCBhbmQgdGFrZSBpdCBhd2F5IGEgbW9tZW50IGxhdGVyLiBUaGUgZ2F0ZSBpdHNlbGYgZG9lcyBub3Qgd2FpdDogdGhlIHN1cmZhY2UgbG9hZHMgdGhlXG4gICAgLy8gaW5zdGFudCB0aGUgZGVwZW5kZW5jeSBpcyB0aGVyZSwgd2hlbmV2ZXIgdGhhdCBpcy5cbiAgICB0aGlzLmFkZENoaWxkKFxuICAgICAgbmV3IENhbGxiYWNrTGF5b3V0UmVhZHlDb21wb25lbnQodGhpcy5hcHAsICgpID0+IHtcbiAgICAgICAgdGhpcy5pc0xheW91dFJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5wcmVzZW50VW5zYXRpc2ZpZWQodGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpLCB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSk7XG4gICAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlcigoKSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbExvc3NBbm5vdW5jZW1lbnQoKTtcbiAgICAgIHRoaXMuaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIHRoZSBnYXRlIG9uY2UgdGhlIHdhdGNoZXMgYXJlIGluIHBsYWNlLCBsb2FkaW5nIHRoZSBmZWF0dXJlIHN1cmZhY2UgaWYgaXQgaXMgYWxyZWFkeSBvcGVuLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGZpcnN0IGV2YWx1YXRpb24gaXMgY29tcGxldGUuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgb25sb2FkQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBhIGJhbm5lciBmb3IgZXZlcnkgY29uZmxpY3QgdGhlIGhvc3QgaXMgcnVubmluZyBhbG9uZ3NpZGUsIHNvIGEgcGx1Z2luIGNhbiBwdXQgdGhlIG92ZXJsYXAgaW5cbiAgICogaXRzIG93biBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIENvbnN1bWVyLWludm9rZWQsIGV4YWN0bHkgbGlrZSBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5yZW5kZXJCYW5uZXJgOiB0aGUgbGlicmFyeSByZWdpc3RlcnMgdGhlXG4gICAqIHNldHRpbmdzIHRhYiBhIEJMT0NLRUQgcGx1Z2luIG5lZWRzLCBiZWNhdXNlIHRoYXQgcGx1Z2luIG5ldmVyIGdvdCB0byByZWdpc3RlciBvbmUgb2YgaXRzIG93biwgYnV0IGl0XG4gICAqIGhhcyBubyBob29rIGludG8gdGhlIHRhYiBhIHJ1bm5pbmcgcGx1Z2luIGJ1aWxkcy4gUmVuZGVycyBub3RoaW5nIHdoZW4gbm8gd2FybmluZyBjb25mbGljdCBob2xkcy5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqL1xuICBwdWJsaWMgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyKGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgdGhpcy5yZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsLCBjb25mbGljdCwgdGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgd2hhdCB3ZW50IGF3YXkgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZywgbm93IHRoYXQgdGhlIGdyYWNlIHBlcmlvZCBpcyBvdmVyLlxuICAgKlxuICAgKiBSZS1yZWFkcyB0aGUgZ2F0ZSByYXRoZXIgdGhhbiB0cnVzdGluZyB3aGF0IGNsb3NlZCBpdCwgc28gYSBkZXBlbmRlbmN5IHRoYXQgd2VudCBhd2F5IGR1cmluZyB0aGVcbiAgICogd2luZG93IGlzIGFubm91bmNlZCB3aXRoIHRoZSByZXN0LiBPbmUgdGhhdCBjYW1lIGJhY2sgaW4gdGltZSBuZXZlciBnZXRzIGhlcmU6IHRoZSBnYXRlIHJlb3BlbmluZ1xuICAgKiBjYW5jZWxzIHRoZSB0aW1lci5cbiAgICovXG4gIHByaXZhdGUgYW5ub3VuY2VMb3NzKCk6IHZvaWQge1xuICAgIHRoaXMubG9zc0Fubm91bmNlbWVudFRpbWVySWQgPSBudWxsO1xuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZURlcGVuZGVuY3lMb3N0TWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5LkJsb2NrKSkge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhbm5vdW5jZVdhcm5pbmdzKCk6IHZvaWQge1xuICAgIC8vIEEgd2FybmluZyBkZXNjcmliZXMgdHdvIHBsdWdpbnMgdGhhdCBhcmUgYm90aCBSVU5OSU5HLCBzbyBpdCBpcyBwb2ludGxlc3Mgd2hpbGUgdGhpcyBvbmUgaXMgYmxvY2tlZFxuICAgIC8vIOKAlCBhbmQgaXQgd2FpdHMgZm9yIGxheW91dC1yZWFkeSBmb3IgdGhlIHNhbWUgcmVhc29uIHRoZSBibG9ja2VkIG5vdGljZSBkb2VzLlxuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICF0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuV2FybikpIHtcbiAgICAgIGlmICh0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuaGFzKGNvbmZsaWN0LnBsdWdpbklkKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5hbm5vdW5jZWRXYXJuaW5nUGx1Z2luSWRzLmFkZChjb25mbGljdC5wbHVnaW5JZCk7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCk7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ibG9ja2VkTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEFwcGVhcmVkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmNvbmZsaWN0QXBwZWFyZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQ29uZmxpY3RXYXJuaW5nTWVzc2FnZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0Lndhcm5pbmdOb3RpY2UsIHtcbiAgICAgIGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogYXNDb2RlQmxvY2soY29uZmxpY3QucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBpZiAodGhpcy5pc1Rvb09sZChkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlVmVyc2lvbk1pc21hdGNoTWVzc2FnZShkZXBlbmRlbmN5KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1J1bm5pbmcoZGVwZW5kZW5jeSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZU5vUmVhZGFibGVBcGlNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5kZXBlbmRlbmN5TG9zdE5vdGljZSwge1xuICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKGRlcGVuZGVuY3kucGx1Z2luTmFtZSksXG4gICAgICBwbHVnaW5OYW1lOiBhc0NvZGVCbG9jayh0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lKVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5ub1JlYWRhYmxlQXBpTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kudmVyc2lvbk1pc21hdGNoTm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHRoZSBkZWNsYXJlZCBjb25mbGljdHMgb2Ygb25lIHNldmVyaXR5IHRoYXQgYXJlIGN1cnJlbnRseSBpbiBmb3JjZS5cbiAgICpcbiAgICogQHBhcmFtIHNldmVyaXR5IC0gVGhlIHNldmVyaXR5IHRvIHNlbGVjdC5cbiAgICogQHJldHVybnMgVGhlIGNvbmZsaWN0cyBob2xkaW5nIHJpZ2h0IG5vdywgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWNsYXJlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QWN0aXZlQ29uZmxpY3RzKHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5KTogUGx1Z2luQ29uZmxpY3RbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmxpY3RzLmZpbHRlcigoY29uZmxpY3QpID0+IGNvbmZsaWN0LnNldmVyaXR5ID09PSBzZXZlcml0eSAmJiB0aGlzLmlzQ29uZmxpY3RBY3RpdmUoY29uZmxpY3QpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTogUGx1Z2luRGVwZW5kZW5jeVtdIHtcbiAgICByZXR1cm4gdGhpcy5kZXBlbmRlbmNpZXMuZmlsdGVyKChkZXBlbmRlbmN5KSA9PiAhdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udmFsdWUgfHwgdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KSk7XG4gIH1cblxuICBwcml2YXRlIGhpZGVCbG9ja2VkU2V0dGluZ1RhYigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmFwcC5zZXR0aW5nLnJlbW92ZVNldHRpbmdUYWIodGhpcy5ibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGF0IGEgcmVsZWFzZSBvbGRlciB0aGFuIGl0IGRlY2xhcmVkIGl0IG5lZWRzLlxuICAgKlxuICAgKiBSZWFkIGZyb20gdGhlIG1hbmlmZXN0LCBsaWtlIGEgY29uZmxpY3QsIGFuZCByZS1yZWFkIG9uIGV2ZXJ5IGV2YWx1YXRpb246IE9ic2lkaWFuIGFwcGxpZXMgYW4gdXBkYXRlIGJ5XG4gICAqIHJlbG9hZGluZyB0aGUgcHJvdmlkZXIsIHdoaWNoIGZpcmVzIHRoZSBBUEkgd2F0Y2gncyBgY2hhbmdlYCwgc28gdGhlIGdhdGUgb3BlbnMgd2l0aG91dCBhIHJlc3RhcnQuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBiZWxvdyBpdHMge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbn07IGBmYWxzZWBcbiAgICogd2hlbiBpdCBkZWNsYXJlcyBub25lIG9yIGlzIG5vdCBlbmFibGVkLCBzaW5jZSBpdHMgQVBJIGlzIHRoZW4gYWJzZW50IGFueXdheS5cbiAgICovXG4gIHByaXZhdGUgaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIGlmIChkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgIH0pO1xuXG4gICAgaWYgKGluc3RhbGxlZFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjb21wYXJlVmVyc2lvbnMoaW5zdGFsbGVkVmVyc2lvbiwgZGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9uLCAnPj0nKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgb25lIGRlY2xhcmVkIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogT25seSBhbiBFTkFCTEVEIHBsdWdpbiBjb3VudHMuIE9uZSB0aGF0IGlzIGluc3RhbGxlZCBidXQgc3dpdGNoZWQgb2ZmIHJlZ2lzdGVycyBub3RoaW5nLCBzbyBpdCBjYW5ub3RcbiAgICogY29sbGlkZSwgYW5kIGFjdGluZyBvbiBpdCB3b3VsZCBiZSBhbiBhbGFybSB0aGUgdXNlciBjYW4gb25seSBhbnN3ZXIgYnkgdW5pbnN0YWxsaW5nIHNvbWV0aGluZyB0aGV5XG4gICAqIGhhdmUgYWxyZWFkeSB0dXJuZWQgb2ZmLlxuICAgKlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgZGVjbGFyZWQgY29uZmxpY3QuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiBpcyBlbmFibGVkIGF0IGEgY29uZmxpY3RpbmcgdmVyc2lvbi5cbiAgICovXG4gIHByaXZhdGUgaXNDb25mbGljdEFjdGl2ZShjb25mbGljdDogUGx1Z2luQ29uZmxpY3QpOiBib29sZWFuIHtcbiAgICBjb25zdCBpbnN0YWxsZWRWZXJzaW9uID0gZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbih7XG4gICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgcGx1Z2luSWQ6IGNvbmZsaWN0LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc2F0aXNmaWVzVmVyc2lvbihpbnN0YWxsZWRWZXJzaW9uLCBjb25mbGljdC5jb25mbGljdGluZ1ZlcnNpb25SYW5nZSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGFuIHVuc2F0aXNmaWVkIGRlcGVuZGVuY3kgaXMgbm9uZXRoZWxlc3MgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKlxuICAgKiBTdWNoIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCBwdWJsaXNoZXMgbm8gQVBJIHRoaXMgcGx1Z2luIGNhbiByZWFkIOKAlCBub25lIGF0IGFsbCwgb3Igb25lIHdob3NlIHNoYXBlXG4gICAqIGZhaWxzIHRoZSBjb250cmFjdC4gVGhlIHVzdWFsIGNhdXNlIGlzIGEgcmVsZWFzZSBidWlsdCBvbiBhIGNvcHkgb2YgdGhpcyBsaWJyYXJ5IHRoYXQgcHVibGlzaGVzXG4gICAqIHNvbWV3aGVyZSB0aGlzIG9uZSBkb2VzIG5vdCBsb29rLCBzbyBcImluc3RhbGwgYW5kIGVuYWJsZSBpdFwiIHdvdWxkIGJlIGZhbHNlIGFuZCBcInVwZGF0ZSBpdFwiIGlzIHRoZSBmaXguXG4gICAqXG4gICAqIEJlaW5nIGluIGBlbmFibGVkUGx1Z2luc2AgaXMgbm90IGVub3VnaDogT2JzaWRpYW4ncyBwbGFpbiBgZGlzYWJsZVBsdWdpbmAgdW5sb2FkcyBhIHBsdWdpbiBhbmQgbGVhdmVzIGl0XG4gICAqIHRoZXJlIChvbmx5IGBkaXNhYmxlUGx1Z2luQW5kU2F2ZWAgcmVtb3ZlcyBpdCksIHNvIGEgcHJvdmlkZXIgdGhhdCB3ZW50IGF3YXkgd291bGQgb3RoZXJ3aXNlIHJlYWQgYXNcbiAgICogcnVubmluZyB3aXRoIGFuIHVucmVhZGFibGUgQVBJLlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBkZXBlbmRlbmN5IGlzIGVuYWJsZWQgYW5kIGxvYWRlZC5cbiAgICovXG4gIHByaXZhdGUgaXNSdW5uaW5nKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0SW5zdGFsbGVkUGx1Z2luU3RhdGUoe1xuICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgICAgfSkgPT09IEluc3RhbGxlZFBsdWdpblN0YXRlLkVuYWJsZWQgJiYgdGhpcy5hcHAucGx1Z2lucy5nZXRQbHVnaW4oZGVwZW5kZW5jeS5wbHVnaW5JZCkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgZGVwZW5kZW5jeSBpcyBydW5uaW5nIGJ1dCB0b28gb2xkIGZvciB0aGlzIHBsdWdpbiwgc28gdGhlIGFkdmljZSBpcyBcInVwZGF0ZSBpdFwiLlxuICAgKlxuICAgKiBUd28gaW5kZXBlbmRlbnQgc2lnbmFscyBzYXkgc286IGEgcmVsZWFzZSBiZWxvdyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufSwgYW5kIGEgcHVibGlzaGVkXG4gICAqIEFQSSB3aG9zZSBjb250cmFjdCB2ZXJzaW9uIGlzIG91dHNpZGUge0BsaW5rIFBsdWdpbkRlcGVuZGVuY3kuYXBpVmVyc2lvblJhbmdlfS5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB1cGRhdGluZyB0aGUgZGVwZW5kZW5jeSBpcyB3aGF0IGl0IG5lZWRzLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1Rvb09sZChkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNCZWxvd01pblBsdWdpblZlcnNpb24oZGVwZW5kZW5jeSlcbiAgICAgIHx8IHRoaXMuYXBpUmVmcy5nZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCk/LnVuYXZhaWxhYmlsaXR5UmVhc29uID09PSBQbHVnaW5BcGlVbmF2YWlsYWJpbGl0eVJlYXNvbi5WZXJzaW9uTWlzbWF0Y2g7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IGlzIGluIHRoZSB3YXksIGFuZCBwdXRzIHRoZSBzYW1lIGV4cGxhbmF0aW9uIHdoZXJlIHRoZSB1c2VyIHdpbGwgbG9vayBmb3IgdGhlIHBsdWdpbidzXG4gICAqIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMgLSBUaGUgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIG5vdCBjdXJyZW50bHkgc2F0aXNmaWVkLlxuICAgKiBAcGFyYW0gYmxvY2tpbmdDb25mbGljdHMgLSBUaGUgY29uZmxpY3RzIGN1cnJlbnRseSByZWZ1c2luZyB0aGUgcGx1Z2luIHRoZSByaWdodCB0byBydW4uXG4gICAqL1xuICBwcml2YXRlIHByZXNlbnRVbnNhdGlzZmllZChcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc0xheW91dFJlYWR5IHx8ICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPT09IDAgJiYgYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG5cbiAgICBpZiAodGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVCbG9ja2VkTWVzc2FnZShkZXBlbmRlbmN5KSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiBibG9ja2luZ0NvbmZsaWN0cykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmUtZXZhbHVhdGVzIHRoZSBnYXRlIGFuZCBtb3ZlcyB0aGUgZmVhdHVyZSBzdXJmYWNlIHRvIG1hdGNoLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgbWF0Y2hlcyB0aGUgZ2F0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVmcmVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB1bnNhdGlzZmllZERlcGVuZGVuY2llcyA9IHRoaXMuZ2V0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBibG9ja2luZ0NvbmZsaWN0cyA9IHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spO1xuXG4gICAgaWYgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAoIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSB0cnVlO1xuICAgICAgICBhd2FpdCB0aGlzLmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlV2FybmluZ3MoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICB0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UoKTtcblxuICAgICAgLy8gQSBnYXRlIHRoYXQgY2xvc2VzIHdoaWxlIHRoZSBwbHVnaW4gaXMgUlVOTklORyBpcyB0aGUgY2FzZSB3b3J0aCBiZWluZyBsb3VkIGFib3V0OiB0aGUgdXNlciBqdXN0XG4gICAgICAvLyBkaWQgc29tZXRoaW5nLCBhbmQgdGhlIGNvbnNlcXVlbmNlIGlzIGltbWVkaWF0ZSBhbmQgaW52aXNpYmxlIHdpdGhvdXQgdGhpcy4gQW5ub3VuY2VkIHJlZ2FyZGxlc3NcbiAgICAgIC8vIG9mIGxheW91dCByZWFkaW5lc3MsIGJlY2F1c2UgYSBydW5uaW5nIHBsdWdpbiBtZWFucyB0aGUgbGF5b3V0IGlzIGxvbmcgc2luY2UgcmVhZHkg4oCUIGJ1dCBvbmx5XG4gICAgICAvLyBvbmNlIHRoZSBncmFjZSBwZXJpb2QgaGFzIHNob3duIHRoZSBsb3NzIGlzIG5vdCBhbiB1cGRhdGUgcmVsb2FkaW5nIHRoZSBwcm92aWRlciAoc2VlIHRoZSBmaWxlXG4gICAgICAvLyBoZWFkZXIpLlxuICAgICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5hbm5vdW5jZUxvc3MoKTtcbiAgICAgIH0sIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byBhIHNldHRpbmdzLXRhYiBjb250YWluZXI6IHdoYXQgaXMgbWlzc2luZyBvciBpbiB0aGUgd2F5LCB3aHkgaXRcbiAgICogbWF0dGVycywgYW5kIHRoZSBidXR0b24gdGhhdCBmaXhlcyBpdC5cbiAgICpcbiAgICogQHBhcmFtIGNvbnRhaW5lckVsIC0gVGhlIGVsZW1lbnQgdG8gcmVuZGVyIGludG8uXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQmxvY2tlZEJhbm5lcihcbiAgICBjb250YWluZXJFbDogSFRNTEVsZW1lbnQsXG4gICAgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXM6IHJlYWRvbmx5IFBsdWdpbkRlcGVuZGVuY3lbXSxcbiAgICBibG9ja2luZ0NvbmZsaWN0czogcmVhZG9ubHkgUGx1Z2luQ29uZmxpY3RbXVxuICApOiB2b2lkIHtcbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkRlcGVuZGVuY3kuc2V0dGluZ3NIZWFkaW5nKSB9KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMpIHtcbiAgICAgIGNvbnN0IGJhbm5lckVsID0gY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkRlcGVuZGVuY3lCYW5uZXJdXG4gICAgICB9KTtcbiAgICAgIGJhbm5lckVsLmFwcGVuZCh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGRlcGVuZGVuY3kucmVhc29uKTtcblxuICAgICAgY29uc3Qgc3RhdGUgPSBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgICB9KTtcblxuICAgICAgLy8gQW4gZW5hYmxlZCBkZXBlbmRlbmN5IHRoYXQgaXMgc3RpbGwgdW5zYXRpc2ZpZWQgaXMgdG9vIG9sZCwgYW5kIGluc3RhbGxpbmcgb3IgZW5hYmxpbmcgaXQgYWdhaW4gZG9lc1xuICAgICAgLy8gbm90aGluZywgc28gaXQgaXMgb2ZmZXJlZCBhbiB1cGRhdGUgaW5zdGVhZC5cbiAgICAgIGlmIChzdGF0ZSAhPT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCkge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+XG4gICAgICAgICAgICBzdGF0ZSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuSW5zdGFsbGVkQnV0RGlzYWJsZWRcbiAgICAgICAgICAgICAgPyAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uZW5hYmxlXG4gICAgICAgICAgICAgIDogJC5vYnNpZGlhbkxpYi5wbHVnaW5TdWdnZXN0aW9uLmluc3RhbGxcbiAgICAgICAgICApKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luKHtcbiAgICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWQsXG4gICAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gT2JzaWRpYW4gYXBwbGllcyB0aGUgdXBkYXRlIGJ5IHJlbG9hZGluZyB0aGUgZGVwZW5kZW5jeSwgd2hpY2ggcmVwdWJsaXNoZXMgaXRzIEFQSSwgc28gdGhlIHdhdGNoJ3NcbiAgICAgIC8vIGBjaGFuZ2VgIHJlb3BlbnMgdGhlIGdhdGUgd2l0aCBubyBmdXJ0aGVyIHN0ZXAgaGVyZS5cbiAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS51cGRhdGUsIHsgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSB9KSlcbiAgICAgICAgLnNldEN0YSgpXG4gICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgIHBsdWdpbk5hbWU6IGRlcGVuZGVuY3kucGx1Z2luTmFtZSxcbiAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudDogdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICByZXF1ZXN0aW5nUGx1Z2luTmFtZTogdGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSk7XG5cbiAgICAgIC8vIFRoZSBsaW5rIE9VVCB0byB0aGUgZGVwZW5kZW5jeSdzIG93biBzZXR0aW5ncywgc2hvd24gb25seSBvbmNlIGl0IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZCDigJQgdGhlXG4gICAgICAvLyBvdGhlciBoYWxmIG9mIHRoZSByZWxhdGlvbnNoaXAgYmVpbmcgdmlzaWJsZSBmcm9tIGJvdGggZW5kcy4gSXQgaXMgd2hhdCBzdG9wcyBcImNvbmZpZ3VyZSBvbmVcbiAgICAgIC8vIG9wZXJhdGlvbiBhY3Jvc3MgdHdvIHBsdWdpbnNcIiBmcm9tIG1lYW5pbmcgXCJnbyBhbmQgZmluZCB0aGUgb3RoZXIgcGx1Z2luIHlvdXJzZWxmXCIuXG4gICAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgZGVwZW5kZW5jeS5wbHVnaW5JZCwgZGVwZW5kZW5jeS5wbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoYmxvY2tpbmdDb25mbGljdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGFpbmVyRWwuY3JlYXRlRWwoJ2gyJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LnNldHRpbmdzSGVhZGluZykgfSk7XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0QmxvY2tlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBvbmUgY29uZmxpY3Q6IHdoYXQgaXQgaXMsIHdoeSBpdCBtYXR0ZXJzLCBhbmQgdGhlIHR3byB3YXlzIG91dCBvZiBpdC5cbiAgICpcbiAgICogVGhlIHJlcGFpciBpcyBvZmZlcmVkIG9uIHRoZSBPVEhFUiBwbHVnaW4g4oCUIGRpc2FibGluZyBpdCBpcyB0aGUgb25lIHRoaW5nIHRoaXMgcGx1Z2luIGNhbiBkbyBpbiBhXG4gICAqIGNsaWNrLCBzaW5jZSBpdCBjYW5ub3QgdXBkYXRlIHNvbWVvbmUgZWxzZSdzIHBsdWdpbiDigJQgYW5kIGl0IGlzIHRoZSBwZXJzaXN0ZWQgYGRpc2FibGVQbHVnaW5BbmRTYXZlYFxuICAgKiByYXRoZXIgdGhhbiB0aGUgdHJhbnNpZW50IGRpc2FibGUsIGJlY2F1c2UgdGhlIHVzZXIgYXNrZWQgZm9yIGl0IGJ5IGNsaWNraW5nLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIGNvbmZsaWN0IC0gVGhlIGNvbmZsaWN0IHRvIHJlbmRlci5cbiAgICogQHBhcmFtIG1lc3NhZ2VGcmFnbWVudCAtIFRoZSBzZW50ZW5jZSBleHBsYWluaW5nIHRoZSBjb25mbGljdC5cbiAgICovXG4gIHByaXZhdGUgcmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbDogSFRNTEVsZW1lbnQsIGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCwgbWVzc2FnZUZyYWdtZW50OiBEb2N1bWVudEZyYWdtZW50KTogdm9pZCB7XG4gICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgY2xzOiBbQ3NzQ2xhc3MuTGlicmFyeU5hbWUsIENzc0NsYXNzLlBsdWdpbkNvbmZsaWN0QmFubmVyXVxuICAgIH0pO1xuICAgIGJhbm5lckVsLmFwcGVuZChtZXNzYWdlRnJhZ21lbnQpO1xuICAgIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUoYmFubmVyRWwuY3JlYXRlRGl2KCksIGNvbmZsaWN0LnJlYXNvbik7XG5cbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5Db25mbGljdC5kaXNhYmxlLCB7IGNvbmZsaWN0aW5nUGx1Z2luTmFtZTogY29uZmxpY3QucGx1Z2luTmFtZSB9KSlcbiAgICAgIC5zZXRDdGEoKVxuICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgZGlzYWJsZUNvbW11bml0eVBsdWdpbih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5yZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWwsIGNvbmZsaWN0LnBsdWdpbklkLCBjb25mbGljdC5wbHVnaW5OYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsOiBIVE1MRWxlbWVudCwgcGx1Z2luSWQ6IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgIC5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5vcGVuRGVwZW5kZW5jeVNldHRpbmdzLCB7XG4gICAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBwbHVnaW5OYW1lXG4gICAgICB9KSlcbiAgICAgIC5vbkNsaWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5hcHAuc2V0dGluZy5vcGVuKCk7XG4gICAgICAgIHRoaXMuYXBwLnNldHRpbmcub3BlblRhYkJ5SWQocGx1Z2luSWQpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNob3dCbG9ja2VkU2V0dGluZ1RhYihcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQWRkZWQgdGhyb3VnaCBgYXBwLnNldHRpbmdgIHJhdGhlciB0aGFuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmAsIGJlY2F1c2UgdGhpcyB0YWIgaGFzIHRvIGNvbWUgYmFja1xuICAgIC8vIE9GRiBhZ2FpbiB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zIOKAlCBvdGhlcndpc2UgdGhlIHBsdWdpbidzIG93biBzZXR0aW5ncyB0YWIsIHJlZ2lzdGVyZWQgYnlcbiAgICAvLyBgb25sb2FkSW1wbGAsIHdvdWxkIGFwcGVhciBiZXNpZGUgYSBzdGFsZSBcInJlcXVpcmVkIHBsdWdpbiBtaXNzaW5nXCIgb25lLiBgcGx1Z2luLmFkZFNldHRpbmdUYWJgXG4gICAgLy8gb25seSBldmVyIHJlbW92ZXMgYXQgcGx1Z2luIHVubG9hZC5cbiAgICBjb25zdCBibG9ja2VkU2V0dGluZ1RhYiA9IG5ldyBCbG9ja2VkUGx1Z2luU2V0dGluZ1RhYih7XG4gICAgICBwbHVnaW46IHRoaXMucGx1Z2luLFxuICAgICAgcmVuZGVyQmFubmVyOiAoY29udGFpbmVyRWwpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5yZW5kZXJCbG9ja2VkQmFubmVyKGNvbnRhaW5lckVsLCB1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuYXBwLnNldHRpbmcuYWRkU2V0dGluZ1RhYihibG9ja2VkU2V0dGluZ1RhYik7XG4gICAgdGhpcy5ibG9ja2VkU2V0dGluZ1RhYiA9IGJsb2NrZWRTZXR0aW5nVGFiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQTBGQSxtQkFBbUM7QUFDbkMsOEJBR087QUFDUCxzQkFHTztBQVNQLCtCQUF1QztBQUN2Qyx1QkFBeUI7QUFDekIsMEJBSU87QUFDUCxrQkFBa0I7QUFDbEIsd0JBR087QUFDUCxrQ0FNTztBQUNQLHFDQUdPO0FBQ1Asb0NBQW1DO0FBQ25DLDBCQUE0QjtBQUM1QixvQ0FBNkM7QUFRN0MsTUFBTSxpREFBaUQ7QUFLaEQsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFPTCxFQUFBQSx3QkFBQSxXQUFRO0FBUVIsRUFBQUEsd0JBQUEsVUFBTztBQWZHLFNBQUFBO0FBQUEsR0FBQTtBQTBLWixNQUFNLGdDQUFnQyxpQ0FBaUI7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsVUFBTSxPQUFPLE9BQU8sS0FBSyxPQUFPLE1BQU07QUFDdEMsU0FBSyxlQUFlLE9BQU87QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS2dCLFVBQWdCO0FBQzlCLFNBQUssWUFBWSxNQUFNO0FBQ3ZCLFNBQUssYUFBYSxLQUFLLFdBQVc7QUFBQSxFQUNwQztBQUNGO0FBS08sTUFBTSw0QkFBNEIsZ0NBQVk7QUFBQSxFQUNsQyw0QkFBNEIsb0JBQUksSUFBWTtBQUFBLEVBQzVDLFVBQVUsb0JBQUksSUFBa0M7QUFBQSxFQUN6RCxvQkFBNkM7QUFBQSxFQUNwQztBQUFBLEVBQ0E7QUFBQSxFQUNULHNCQUFzQjtBQUFBLEVBQ3RCLHlCQUF5QjtBQUFBLEVBQ3pCLGdCQUFnQjtBQUFBLEVBQ1A7QUFBQSxFQUNULDBCQUF5QztBQUFBLEVBQ2hDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVqQixJQUFZLE1BQVc7QUFDckIsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksUUFBOEM7QUFDL0QsVUFBTTtBQUNOLFNBQUssWUFBWSxPQUFPO0FBQ3hCLFNBQUssZUFBZSxPQUFPO0FBQzNCLFNBQUsscUJBQXFCLE9BQU87QUFDakMsU0FBSyxTQUFTLE9BQU87QUFDckIsU0FBSyx3QkFBd0IsT0FBTztBQUNwQyxTQUFLLHVCQUF1QixPQUFPO0FBQUEsRUFDckM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFhTyw0QkFBcUM7QUFDMUMsV0FBTyxLQUFLLG1CQUFtQixpQkFBMkIsRUFBRSxTQUFTO0FBQUEsRUFDdkU7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLGVBQVcsY0FBYyxLQUFLLGNBQWM7QUFDMUMsWUFBTSxhQUFTLGtDQUF1QjtBQUFBLFFBQ3BDLGlCQUFpQixXQUFXO0FBQUEsUUFDNUIsS0FBSyxLQUFLO0FBQUEsUUFDVixXQUFXO0FBQUEsUUFDWCxVQUFVLFdBQVc7QUFBQSxNQUN2QixDQUFDO0FBQ0Q7QUFBQSxRQUNFO0FBQUEsUUFDQSxPQUFPLEdBQUcsVUFBVSxZQUFZO0FBQzlCLGdCQUFNLEtBQUssUUFBUTtBQUFBLFFBQ3JCLENBQUM7QUFBQSxNQUNIO0FBQ0EsV0FBSyxRQUFRLElBQUksV0FBVyxVQUFVLE1BQU07QUFBQSxJQUM5QztBQUtBLFVBQU0sc0JBQWtELENBQUMseURBQTBCLHlEQUEwQjtBQUM3RyxlQUFXLGFBQWEscUJBQXFCO0FBQzNDLFdBQUssY0FBYyxLQUFLLElBQUksVUFBVTtBQUFBLFFBQ3BDO0FBQUEsWUFDQSxpQ0FBbUIsT0FBTyxZQUF5QztBQUNqRSxjQUFJLFFBQVEsYUFBYSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQ2hEO0FBQUEsVUFDRjtBQUVBLGdCQUFNLEtBQUssUUFBUTtBQUFBLFFBQ3JCLENBQUM7QUFBQSxNQUNILENBQUM7QUFBQSxJQUNIO0FBT0EsU0FBSztBQUFBLE1BQ0gsSUFBSSwyREFBNkIsS0FBSyxLQUFLLE1BQU07QUFDL0MsYUFBSyxnQkFBZ0I7QUFDckIsYUFBSyxtQkFBbUIsS0FBSywyQkFBMkIsR0FBRyxLQUFLLG1CQUFtQixtQkFBNEIsQ0FBQztBQUNoSCxhQUFLLGlCQUFpQjtBQUFBLE1BQ3hCLENBQUM7QUFBQSxJQUNIO0FBRUEsU0FBSyxTQUFTLE1BQU07QUFDbEIsV0FBSyx1QkFBdUI7QUFDNUIsV0FBSyxzQkFBc0I7QUFBQSxJQUM3QixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9BLE1BQXNCLGNBQTZCO0FBQ2pELFVBQU0sS0FBSyxRQUFRO0FBQUEsRUFDckI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWU8sNEJBQTRCLGFBQWdDO0FBQ2pFLGVBQVcsWUFBWSxLQUFLLG1CQUFtQixpQkFBMkIsR0FBRztBQUMzRSxXQUFLLG9CQUFvQixhQUFhLFVBQVUsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDN0Y7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNRLGVBQXFCO0FBQzNCLFNBQUssMEJBQTBCO0FBRS9CLGVBQVcsY0FBYyxLQUFLLDJCQUEyQixHQUFHO0FBQzFELFdBQUssc0JBQXNCLFdBQVcsS0FBSyw0QkFBNEIsVUFBVSxDQUFDO0FBQUEsSUFDcEY7QUFFQSxlQUFXLFlBQVksS0FBSyxtQkFBbUIsbUJBQTRCLEdBQUc7QUFDNUUsV0FBSyxzQkFBc0IsV0FBVyxLQUFLLDhCQUE4QixRQUFRLENBQUM7QUFBQSxJQUNwRjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLG1CQUF5QjtBQUcvQixRQUFJLENBQUMsS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLHdCQUF3QjtBQUN2RDtBQUFBLElBQ0Y7QUFFQSxlQUFXLFlBQVksS0FBSyxtQkFBbUIsaUJBQTJCLEdBQUc7QUFDM0UsVUFBSSxLQUFLLDBCQUEwQixJQUFJLFNBQVMsUUFBUSxHQUFHO0FBQ3pEO0FBQUEsTUFDRjtBQUVBLFdBQUssMEJBQTBCLElBQUksU0FBUyxRQUFRO0FBQ3BELFdBQUssc0JBQXNCLFdBQVcsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDbkY7QUFBQSxFQUNGO0FBQUEsRUFFUSx5QkFBK0I7QUFDckMsUUFBSSxLQUFLLDRCQUE0QixNQUFNO0FBQ3pDO0FBQUEsSUFDRjtBQUVBLFdBQU8sYUFBYSxLQUFLLHVCQUF1QjtBQUNoRCxTQUFLLDBCQUEwQjtBQUFBLEVBQ2pDO0FBQUEsRUFFUSxxQkFBcUIsWUFBZ0Q7QUFDM0UsUUFBSSxLQUFLLFNBQVMsVUFBVSxHQUFHO0FBQzdCLGFBQU8sS0FBSyw2QkFBNkIsVUFBVTtBQUFBLElBQ3JEO0FBRUEsUUFBSSxLQUFLLFVBQVUsVUFBVSxHQUFHO0FBQzlCLGFBQU8sS0FBSywyQkFBMkIsVUFBVTtBQUFBLElBQ25EO0FBRUEsZUFBTyxzREFBNkIsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQixlQUFlO0FBQUEsTUFDekYsMEJBQXNCLGlDQUFZLFdBQVcsVUFBVTtBQUFBLE1BQ3ZELGdCQUFZLGlDQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw4QkFBOEIsVUFBNEM7QUFDaEYsZUFBTyxzREFBNkIsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsd0JBQXdCO0FBQUEsTUFDaEcsMkJBQXVCLGlDQUFZLFNBQVMsVUFBVTtBQUFBLE1BQ3RELGdCQUFZLGlDQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw2QkFBNkIsVUFBNEM7QUFDL0UsZUFBTyxzREFBNkIsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsZUFBZTtBQUFBLE1BQ3ZGLDJCQUF1QixpQ0FBWSxTQUFTLFVBQVU7QUFBQSxNQUN0RCxnQkFBWSxpQ0FBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsNkJBQTZCLFVBQTRDO0FBQy9FLGVBQU8sc0RBQTZCLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWU7QUFBQSxNQUN2RiwyQkFBdUIsaUNBQVksU0FBUyxVQUFVO0FBQUEsTUFDdEQsZ0JBQVksaUNBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQSxFQUVRLDRCQUE0QixZQUFnRDtBQUNsRixRQUFJLEtBQUssU0FBUyxVQUFVLEdBQUc7QUFDN0IsYUFBTyxLQUFLLDZCQUE2QixVQUFVO0FBQUEsSUFDckQ7QUFFQSxRQUFJLEtBQUssVUFBVSxVQUFVLEdBQUc7QUFDOUIsYUFBTyxLQUFLLDJCQUEyQixVQUFVO0FBQUEsSUFDbkQ7QUFFQSxlQUFPLHNEQUE2QixlQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLHNCQUFzQjtBQUFBLE1BQ2hHLDBCQUFzQixpQ0FBWSxXQUFXLFVBQVU7QUFBQSxNQUN2RCxnQkFBWSxpQ0FBWSxLQUFLLE9BQU8sU0FBUyxJQUFJO0FBQUEsSUFDbkQsQ0FBQyxDQUFDO0FBQUEsRUFDSjtBQUFBLEVBRVEsMkJBQTJCLFlBQWdEO0FBQ2pGLGVBQU8sc0RBQTZCLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIscUJBQXFCO0FBQUEsTUFDL0YsMEJBQXNCLGlDQUFZLFdBQVcsVUFBVTtBQUFBLE1BQ3ZELGdCQUFZLGlDQUFZLEtBQUssT0FBTyxTQUFTLElBQUk7QUFBQSxJQUNuRCxDQUFDLENBQUM7QUFBQSxFQUNKO0FBQUEsRUFFUSw2QkFBNkIsWUFBZ0Q7QUFDbkYsZUFBTyxzREFBNkIsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQix1QkFBdUI7QUFBQSxNQUNqRywwQkFBc0IsaUNBQVksV0FBVyxVQUFVO0FBQUEsTUFDdkQsZ0JBQVksaUNBQVksS0FBSyxPQUFPLFNBQVMsSUFBSTtBQUFBLElBQ25ELENBQUMsQ0FBQztBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFRLG1CQUFtQixVQUFvRDtBQUM3RSxXQUFPLEtBQUssVUFBVSxPQUFPLENBQUMsYUFBYSxTQUFTLGFBQWEsWUFBWSxLQUFLLGlCQUFpQixRQUFRLENBQUM7QUFBQSxFQUM5RztBQUFBLEVBRVEsNkJBQWlEO0FBQ3ZELFdBQU8sS0FBSyxhQUFhLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxRQUFRLElBQUksV0FBVyxRQUFRLEdBQUcsU0FBUyxLQUFLLHdCQUF3QixVQUFVLENBQUM7QUFBQSxFQUMzSTtBQUFBLEVBRVEsd0JBQThCO0FBQ3BDLFFBQUksQ0FBQyxLQUFLLG1CQUFtQjtBQUMzQjtBQUFBLElBQ0Y7QUFFQSxTQUFLLElBQUksUUFBUSxpQkFBaUIsS0FBSyxpQkFBaUI7QUFDeEQsU0FBSyxvQkFBb0I7QUFBQSxFQUMzQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSx3QkFBd0IsWUFBdUM7QUFDckUsUUFBSSxXQUFXLHFCQUFxQixRQUFXO0FBQzdDLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSx1QkFBbUIsdURBQTBCO0FBQUEsTUFDakQsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFdBQVc7QUFBQSxJQUN2QixDQUFDO0FBRUQsUUFBSSxxQkFBcUIsTUFBTTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixhQUFPLEtBQUMsd0JBQUFDLFNBQWdCLGtCQUFrQixXQUFXLGtCQUFrQixJQUFJO0FBQUEsSUFDN0UsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZUSxpQkFBaUIsVUFBbUM7QUFDMUQsVUFBTSx1QkFBbUIsdURBQTBCO0FBQUEsTUFDakQsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFNBQVM7QUFBQSxJQUNyQixDQUFDO0FBRUQsUUFBSSxxQkFBcUIsTUFBTTtBQUM3QixhQUFPO0FBQUEsSUFDVDtBQUVBLFFBQUk7QUFDRixpQkFBTyx3QkFBQUMsV0FBaUIsa0JBQWtCLFNBQVMsdUJBQXVCO0FBQUEsSUFDNUUsUUFBUTtBQUNOLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCUSxVQUFVLFlBQXVDO0FBQ3ZELGVBQU8scURBQXdCO0FBQUEsTUFDekIsS0FBSyxLQUFLO0FBQUEsTUFDVixVQUFVLFdBQVc7QUFBQSxJQUN2QixDQUFDLE1BQU0saURBQXFCLFdBQVcsS0FBSyxJQUFJLFFBQVEsVUFBVSxXQUFXLFFBQVEsTUFBTTtBQUFBLEVBQ2pHO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFXUSxTQUFTLFlBQXVDO0FBQ3RELFdBQU8sS0FBSyx3QkFBd0IsVUFBVSxLQUN6QyxLQUFLLFFBQVEsSUFBSSxXQUFXLFFBQVEsR0FBRyx5QkFBeUIsZ0RBQThCO0FBQUEsRUFDckc7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU1EsbUJBQ04seUJBQ0EsbUJBQ007QUFDTixRQUFJLENBQUMsS0FBSyxpQkFBa0Isd0JBQXdCLFdBQVcsS0FBSyxrQkFBa0IsV0FBVyxHQUFJO0FBQ25HO0FBQUEsSUFDRjtBQUVBLFNBQUssc0JBQXNCLHlCQUF5QixpQkFBaUI7QUFFckUsUUFBSSxLQUFLLHFCQUFxQjtBQUM1QjtBQUFBLElBQ0Y7QUFFQSxTQUFLLHNCQUFzQjtBQUMzQixlQUFXLGNBQWMseUJBQXlCO0FBQ2hELFdBQUssc0JBQXNCLFdBQVcsS0FBSyxxQkFBcUIsVUFBVSxDQUFDO0FBQUEsSUFDN0U7QUFFQSxlQUFXLFlBQVksbUJBQW1CO0FBQ3hDLFdBQUssc0JBQXNCLFdBQVcsS0FBSyw2QkFBNkIsUUFBUSxDQUFDO0FBQUEsSUFDbkY7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT0EsTUFBYyxVQUF5QjtBQUNyQyxVQUFNLDBCQUEwQixLQUFLLDJCQUEyQjtBQUNoRSxVQUFNLG9CQUFvQixLQUFLLG1CQUFtQixtQkFBNEI7QUFFOUUsUUFBSSx3QkFBd0IsV0FBVyxLQUFLLGtCQUFrQixXQUFXLEdBQUc7QUFDMUUsV0FBSyx1QkFBdUI7QUFDNUIsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0I7QUFFM0IsVUFBSSxDQUFDLEtBQUssd0JBQXdCO0FBQ2hDLGFBQUsseUJBQXlCO0FBQzlCLGNBQU0sS0FBSyxtQkFBbUI7QUFBQSxNQUNoQztBQUVBLFdBQUssaUJBQWlCO0FBQ3RCO0FBQUEsSUFDRjtBQUVBLFFBQUksS0FBSyx3QkFBd0I7QUFDL0IsV0FBSyx5QkFBeUI7QUFDOUIsV0FBSyxxQkFBcUI7QUFPMUIsV0FBSywwQkFBMEIsT0FBTyxXQUFXLE1BQU07QUFDckQsYUFBSyxhQUFhO0FBQUEsTUFDcEIsR0FBRyw4Q0FBOEM7QUFFakQsV0FBSyxzQkFBc0I7QUFDM0IsV0FBSyxzQkFBc0IseUJBQXlCLGlCQUFpQjtBQUNyRTtBQUFBLElBQ0Y7QUFFQSxTQUFLLG1CQUFtQix5QkFBeUIsaUJBQWlCO0FBQUEsRUFDcEU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFVUSxvQkFDTixhQUNBLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSx3QkFBd0IsU0FBUyxHQUFHO0FBQ3RDLGtCQUFZLFNBQVMsTUFBTSxFQUFFLFVBQU0sZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGlCQUFpQixlQUFlLEVBQUUsQ0FBQztBQUFBLElBQy9GO0FBRUEsZUFBVyxjQUFjLHlCQUF5QjtBQUNoRCxZQUFNLFdBQVcsWUFBWSxVQUFVO0FBQUEsUUFDckMsS0FBSyxDQUFDLDBCQUFTLGFBQWEsMEJBQVMsc0JBQXNCO0FBQUEsTUFDN0QsQ0FBQztBQUNELGVBQVMsT0FBTyxLQUFLLHFCQUFxQixVQUFVLENBQUM7QUFDckQseURBQTBCLFNBQVMsVUFBVSxHQUFHLFdBQVcsTUFBTTtBQUVqRSxZQUFNLFlBQVEscURBQXdCO0FBQUEsUUFDcEMsS0FBSyxLQUFLO0FBQUEsUUFDVixVQUFVLFdBQVc7QUFBQSxNQUN2QixDQUFDO0FBSUQsVUFBSSxVQUFVLGlEQUFxQixTQUFTO0FBQzFDLFlBQUksZ0NBQWdCLFFBQVEsRUFDekIsa0JBQWM7QUFBQSxVQUFFLENBQUMsTUFDaEIsVUFBVSxpREFBcUIsdUJBQzNCLEVBQUUsWUFBWSxpQkFBaUIsU0FDL0IsRUFBRSxZQUFZLGlCQUFpQjtBQUFBLFFBQ3JDLENBQUMsRUFDQSxPQUFPLEVBQ1AsWUFBUSxpQ0FBbUIsWUFBWTtBQUN0QyxvQkFBTSxvREFBdUI7QUFBQSxZQUMzQixLQUFLLEtBQUs7QUFBQSxZQUNWLFVBQVUsV0FBVztBQUFBLFlBQ3JCLFlBQVksV0FBVztBQUFBLFlBQ3ZCLHVCQUF1QixLQUFLO0FBQUEsVUFDOUIsQ0FBQztBQUFBLFFBQ0gsQ0FBQyxDQUFDO0FBQ0o7QUFBQSxNQUNGO0FBSUEsVUFBSSxnQ0FBZ0IsUUFBUSxFQUN6QixrQkFBYyxlQUFFLENBQUMsTUFBTSxFQUFFLFlBQVksaUJBQWlCLFFBQVEsRUFBRSxzQkFBc0IsV0FBVyxXQUFXLENBQUMsQ0FBQyxFQUM5RyxPQUFPLEVBQ1AsWUFBUSxpQ0FBbUIsWUFBWTtBQUN0QyxrQkFBTSwwQ0FBYTtBQUFBLFVBQ2pCLEtBQUssS0FBSztBQUFBLFVBQ1YsVUFBVSxXQUFXO0FBQUEsVUFDckIsWUFBWSxXQUFXO0FBQUEsVUFDdkIsdUJBQXVCLEtBQUs7QUFBQSxVQUM1QixzQkFBc0IsS0FBSyxPQUFPLFNBQVM7QUFBQSxRQUM3QyxDQUFDO0FBQUEsTUFDSCxDQUFDLENBQUM7QUFLSixXQUFLLHlCQUF5QixVQUFVLFdBQVcsVUFBVSxXQUFXLFVBQVU7QUFBQSxJQUNwRjtBQUVBLFFBQUksa0JBQWtCLFdBQVcsR0FBRztBQUNsQztBQUFBLElBQ0Y7QUFFQSxnQkFBWSxTQUFTLE1BQU0sRUFBRSxVQUFNLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxlQUFlLGVBQWUsRUFBRSxDQUFDO0FBRTNGLGVBQVcsWUFBWSxtQkFBbUI7QUFDeEMsV0FBSyxvQkFBb0IsYUFBYSxVQUFVLEtBQUssNkJBQTZCLFFBQVEsQ0FBQztBQUFBLElBQzdGO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFRLG9CQUFvQixhQUEwQixVQUEwQixpQkFBeUM7QUFDdkgsVUFBTSxXQUFXLFlBQVksVUFBVTtBQUFBLE1BQ3JDLEtBQUssQ0FBQywwQkFBUyxhQUFhLDBCQUFTLG9CQUFvQjtBQUFBLElBQzNELENBQUM7QUFDRCxhQUFTLE9BQU8sZUFBZTtBQUMvQix1REFBMEIsU0FBUyxVQUFVLEdBQUcsU0FBUyxNQUFNO0FBRS9ELFFBQUksZ0NBQWdCLFFBQVEsRUFDekIsa0JBQWMsZUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQzVHLE9BQU8sRUFDUCxZQUFRLGlDQUFtQixZQUFZO0FBQ3RDLGdCQUFNLGlEQUF1QjtBQUFBLFFBQzNCLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUNELFlBQU0sS0FBSyxRQUFRO0FBQUEsSUFDckIsQ0FBQyxDQUFDO0FBRUosU0FBSyx5QkFBeUIsVUFBVSxTQUFTLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDaEY7QUFBQSxFQUVRLHlCQUF5QixVQUF1QixVQUFrQixZQUEwQjtBQUNsRyxRQUFJLGdDQUFnQixRQUFRLEVBQ3pCLGtCQUFjLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsd0JBQXdCO0FBQUEsTUFDN0Usc0JBQXNCO0FBQUEsSUFDeEIsQ0FBQyxDQUFDLEVBQ0QsUUFBUSxNQUFNO0FBQ2IsV0FBSyxJQUFJLFFBQVEsS0FBSztBQUN0QixXQUFLLElBQUksUUFBUSxZQUFZLFFBQVE7QUFBQSxJQUN2QyxDQUFDO0FBQUEsRUFDTDtBQUFBLEVBRVEsc0JBQ04seUJBQ0EsbUJBQ007QUFDTixRQUFJLEtBQUssbUJBQW1CO0FBQzFCO0FBQUEsSUFDRjtBQU1BLFVBQU0sb0JBQW9CLElBQUksd0JBQXdCO0FBQUEsTUFDcEQsUUFBUSxLQUFLO0FBQUEsTUFDYixjQUFjLENBQUMsZ0JBQXNCO0FBQ25DLGFBQUssb0JBQW9CLGFBQWEseUJBQXlCLGlCQUFpQjtBQUFBLE1BQ2xGO0FBQUEsSUFDRixDQUFDO0FBQ0QsU0FBSyxJQUFJLFFBQVEsY0FBYyxpQkFBaUI7QUFDaEQsU0FBSyxvQkFBb0I7QUFBQSxFQUMzQjtBQUNGOyIsIm5hbWVzIjpbIlBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkiLCJjb21wYXJlVmVyc2lvbnMiLCJzYXRpc2ZpZXNWZXJzaW9uIl19
625
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3BsdWdpbi1nYXRlLWNvbXBvbmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGdhdGUgb24gYSBwbHVnaW4ncyBmZWF0dXJlIHN1cmZhY2U6IHdoYXQgbXVzdCBiZSBQUkVTRU5UIGZvciBpdCB0byBydW4sIGFuZCB3aGF0IG11c3QgTk9UIGJlLlxuICpcbiAqIEJvdGggaGFsdmVzIGFuc3dlciB0aGUgc2FtZSBxdWVzdGlvbiDigJQgbWF5IHRoaXMgcGx1Z2luJ3MgYG9ubG9hZEltcGxgIHJ1biByaWdodCBub3c/IOKAlCBzbyB0aGV5IGFyZSBvbmVcbiAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiB0d28uIEEgc2Vjb25kLCBpbmRlcGVuZGVudCBnYXRlIHdvdWxkIGRvdWJsZS1sb2FkIHRoZSBzdXJmYWNlIGFuZCBzdGFjayBhIHNlY29uZFxuICogXCJibG9ja2VkXCIgc2V0dGluZ3MgdGFiIG9udG8gdGhlIHNhbWUgcGx1Z2luLCBhbmQgbmVpdGhlciBjb3VsZCBzZWUgdGhlIG90aGVyJ3MgcmVhc29uIGZvciByZWZ1c2luZy5cbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IGNhbm5vdCB3b3JrIHdpdGhvdXRcbiAqXG4gKiBUaGlzIGlzIHRoZSBzdHJpY3Qgc2libGluZyBvZiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQuIEFcbiAqIFNVR0dFU1RJT04gaXMgYW4gb2ZmZXIg4oCUIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgd2l0aG91dCBpdCBhbmQgc2ltcGx5IGNhbm5vdCBkbyBvbmUgdGhpbmcuIEEgREVQRU5ERU5DWVxuICogaXMgYSByZXF1aXJlbWVudDogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vIGNvbW1hbmQgaXMgcmVnaXN0ZXJlZCwgbm8gaGFuZGxlciBpcyBpbnN0YWxsZWQsIG5vdGhpbmcgaXNcbiAqIHBhdGNoZWQuIFJlYWNoIGZvciBhIHN1Z2dlc3Rpb24gd2hlbiB0aGUgb3RoZXIgcGx1Z2luIGFkZHMgc29tZXRoaW5nOyByZWFjaCBmb3IgYSBkZXBlbmRlbmN5IHdoZW4gdGhlXG4gKiBob3N0J3MgYWR2ZXJ0aXNlZCBiZWhhdmlvciBpcyBub3QgdGhlcmUgd2l0aG91dCBpdC5cbiAqXG4gKiBPYnNpZGlhbiBoYXMgbm8gZGVwZW5kZW5jeSBmaWVsZCBpbiBhIG1hbmlmZXN0LCB3aGljaCBpcyBleGFjdGx5IHRoZSBwcm9ibGVtIHRoaXMgY2xvc2VzLiBXaXRob3V0IG9uZSxcbiAqIGEgdXNlciBtZWV0aW5nIGFuIHVuZmFtaWxpYXIgcGx1Z2luIGluIHRoZWlyIGxpc3QgbW9udGhzIGxhdGVyIGhhcyBub3RoaW5nIHRlbGxpbmcgdGhlbSBpdCBpc1xuICogbG9hZC1iZWFyaW5nIOKAlCB0aGV5IHJlbW92ZSBpdCwgYW5kIHRoZSBicmVha2FnZSBzdXJmYWNlcyB3ZWVrcyBhZnRlciB0aGF0IGFzIGRhbWFnZSB0aGV5IGNhbm5vdCBjb25uZWN0XG4gKiB0byBhbnl0aGluZyB0aGV5IGRpZC4gU28gdGhlIHJlbGF0aW9uc2hpcCBpcyBtYWRlIHZpc2libGUgZnJvbSBib3RoIGVuZHMgYW5kIGVuZm9yY2VkIHdoaWxlIGl0IGhvbGRzOlxuICogdGhlIGRlcGVuZGVudCBleHBsYWlucyBpdHNlbGYgd2hlcmUgdGhlIHVzZXIgaXMgbG9va2luZywgcmVwYWlycyBpdHNlbGYgaW4gb25lIGNsaWNrLCBhbmQgcmVhY3RzIHRoZVxuICogSU5TVEFOVCB0aGUgZGVwZW5kZW5jeSBnb2VzIGF3YXkgcmF0aGVyIHRoYW4gZGVncmFkaW5nIHF1aWV0bHkuXG4gKlxuICogVGhyZWUgY2hvaWNlcyBhcmUgZGVsaWJlcmF0ZSBhbmQgd29ydGggc3RhdGluZywgYmVjYXVzZSBlYWNoIGhhcyBhbiBvYnZpb3VzLWxvb2tpbmcgYWx0ZXJuYXRpdmU6XG4gKlxuICogLSAqKkJsb2NrZWQgbWVhbnMgZW5hYmxlZC1idXQtaW5lcnQsIG5ldmVyIHNlbGYtZGlzYWJsZWQuKiogQ2FsbGluZyBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgIG9uIGl0c2VsZlxuICogICB3b3VsZCBiZSB0aGUgbGl0ZXJhbCByZWFkaW5nIG9mIFwicmVmdXNlcyB0byBsb2FkXCIsIGFuZCBpdCByZXdyaXRlcyBhIGNvbmZpZyB0aGF0IGJlbG9uZ3MgdG8gdGhlIHVzZXIg4oCUXG4gKiAgIHdobyB3b3VsZCB0aGVuIGhhdmUgdG8gcmVtZW1iZXIgdG8gcmUtZW5hYmxlIGl0IGFmdGVyIGZpeGluZyB0aGUgZGVwZW5kZW5jeS4gU3RheWluZyBlbmFibGVkIGFuZCBpbmVydFxuICogICBzYXlzIHRoZSBzYW1lIHRoaW5nIHRvIHRoZSB1c2VyLCBjaGFuZ2VzIG5vdGhpbmcgdGhleSBvd24sIGFuZCBjYW4gdW5kbyBpdHNlbGYuXG4gKiAtICoqQmxvY2tlZCBpcyBub3QgYW4gZXJyb3IuKiogVGhyb3dpbmcgZnJvbSBgb25sb2FkYCBtYXJrcyB0aGUgcGx1Z2luIGZhaWxlZCBpbiBPYnNpZGlhbiBhbmQgaGFuZHMgdGhlXG4gKiAgIHVzZXIgYSBzdGFjayB0cmFjZSBpbnN0ZWFkIG9mIGEgc2VudGVuY2UgYW5kIGEgYnV0dG9uLlxuICogLSAqKkEgZGVwZW5kZW5jeSBtdXN0IHB1Ymxpc2ggYW4gQVBJLioqIFRoYXQgaXMgd2hhdCBtYWtlcyBwcmVzZW5jZSwgYWJzZW5jZSwgdmVyc2lvbiBhbmQgZGVwYXJ0dXJlIGFsbFxuICogICBvYnNlcnZhYmxlIHRocm91Z2ggb25lIG1lY2hhbmlzbSDigJQgYHdhdGNoUGx1Z2luQXBpYCdzIHJlZmVyZW5jZSBpcyBsaXZlLCBpcyByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyXG4gKiAgIHVubG9hZHMsIGFuZCBhbHJlYWR5IGNsYXNzaWZpZXMgbm90LWluc3RhbGxlZCBhZ2FpbnN0IG5vdC1lbmFibGVkIGFnYWluc3QgdG9vLW9sZC4gQSBwcm92aWRlciB3aXRoXG4gKiAgIG5vdGhpbmcgdG8gZXhwb3NlIGNhbiBwdWJsaXNoIGFuIGVtcHR5IEFQSSBwdXJlbHkgc28gaXQgY2FuIGJlIGRlcGVuZGVkIHVwb247IHRoZSBhbHRlcm5hdGl2ZSB3b3VsZCBiZVxuICogICBhIHNlY29uZCwgd2Vha2VyIGRldGVjdGlvbiBwYXRoIHRvIG1haW50YWluIGJlc2lkZSBpdC5cbiAqXG4gKiAjIyBDb25mbGljdHM6IGEgcGx1Z2luIGRlY2xhcmluZyB3aGF0IGl0IHJlZnVzZXMgdG8gcnVuIGJlc2lkZVxuICpcbiAqIFRoZSBpbnZlcnNlIHJlbGF0aW9uc2hpcCwgYW5kIGl0IG5lZWRzIGl0cyBvd24gZGV0ZWN0aW9uIHBhdGggYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSBvbmUgZG9lcyBub3QgZml0LlxuICogQSBjb25mbGljdGluZyBwbHVnaW4gaXMgdHlwaWNhbGx5IGFuIE9MRCB2ZXJzaW9uIG9mIHNvbWUgb3RoZXIgcGx1Z2luIHRoYXQgc3RpbGwgb3ducyBiZWhhdmlvciB0aGlzIG9uZVxuICogaGFzIHRha2VuIG92ZXIg4oCUIGl0IHB1Ymxpc2hlcyBubyBBUEkgYXQgYWxsLCBzbyB0aGVyZSBpcyBubyBgYXBpVmVyc2lvblJhbmdlYCB0byBjb21wYXJlIGFnYWluc3QuXG4gKlxuICogVGhlIGFyZ3VtZW50IGZvciByZWZ1c2luZyByYXRoZXIgdGhhbiBjb21wZXRpbmcgY29tZXMgZnJvbSB0aGUgY2FzZSB0aGlzIGdlbmVyYWxpemVzOiB0d28gcmVuYW1lL2RlbGV0ZVxuICogaGFuZGxlcnMgYWN0aW5nIG9uIG9uZSByZW5hbWUgY29ycnVwdCBsaW5rcyBhbmQgbW92ZSBhdHRhY2htZW50cyB0d2ljZSwgYW5kIHRoZXJlIGlzIG5vIHJlbGlhYmxlIHdheSB0b1xuICogd2luIHRoYXQgcmFjZSDigJQgYSBoYW5kbGVyIGlzIGVsZWN0ZWQgYnkgcmVnaXN0cnkgb3JkZXIsIGJ1dCB0aGUgcGF0Y2hlcyB0aGF0IGRvIHRoZSB3b3JrIHNpdCBvdXRzaWRlXG4gKiB0aGF0IGVsZWN0aW9uLCBzbyB3aGljaGV2ZXIgcGx1Z2luIGxvYWRlZCBmaXJzdCBrZWVwcyBhIGhhbmQgb24gdGhlIHdoZWVsLiBFdmVyeSBzY2hlbWUgZm9yIHNlaXppbmdcbiAqIGNvbnRyb2wgZnJvbSBpbnNpZGUgaXMgbG9hZC1vcmRlciBkZXBlbmRlbnQuIFJlZnVzaW5nIGlzIGRldGVybWluaXN0aWMgd2hlcmUgY29tcGV0aW5nIGlzIG5vdCwgYW5kIGFcbiAqIHZhdWx0IHRoYXQgYnJpZWZseSBoYXMgbm8gaGFuZGxlciBpcyBhIGZhciBiZXR0ZXIgb3V0Y29tZSB0aGFuIG9uZSB3aXRoIHR3by5cbiAqXG4gKiBUd28gZGV0YWlscyBvZiB0aGF0IGRldGVjdGlvbiBjYXJyeSBvdmVyIHZlcmJhdGltLCBiZWNhdXNlIGJvdGggYXJlIGxvYWQtYmVhcmluZzpcbiAqXG4gKiAtICoqVmVyc2lvbnMgYXJlIHJlYWQsIG5ldmVyIHRoZSByZWdpc3RyeS4qKiBBIHBsdWdpbiB0aGF0IGhhcyBub3QgbG9hZGVkIHlldCBoYXMgcmVnaXN0ZXJlZCBub3RoaW5nLCBzb1xuICogICBhc2tpbmcgdGhlIHJlZ2lzdHJ5IGdpdmVzIGEgZGlmZmVyZW50IGFuc3dlciBkZXBlbmRpbmcgb24gd2hlbiBpdCBpcyBhc2tlZC4gYGFwcC5wbHVnaW5zLm1hbmlmZXN0c2AgaXNcbiAqICAgcG9wdWxhdGVkIGZvciBldmVyeSBpbnN0YWxsZWQgcGx1Z2luIGF0IHN0YXJ0dXAsIHdoYXRldmVyIHRoZSBsb2FkIG9yZGVyIHR1cm5zIG91dCB0byBiZS5cbiAqIC0gKipBbiB1bnBhcnNlYWJsZSB2ZXJzaW9uIGNvdW50cyBhcyBjb25mbGljdGluZy4qKiBGYWlsaW5nIGNsb3NlZCBpcyB0aGUgc2FmZSBkaXJlY3Rpb246IGEgZmFsc2UgYWxhcm1cbiAqICAgY29zdHMgYSBub3RpY2UsIGEgZmFsc2UgYWxsLWNsZWFyIGNvc3RzIGEgdmF1bHQuXG4gKlxuICogTm90IGV2ZXJ5IG92ZXJsYXAgaXMgdGhhdCBzZXZlcmUsIHdoaWNoIGlzIHdoeSBhIGNvbmZsaWN0IGRlY2xhcmVzIGEge0BsaW5rIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHl9LlxuICogVHdvIHBsdWdpbnMgc2hpcHBpbmcgdGhlIHNhbWUgY29tbWFuZCBkdXBsaWNhdGUgYSBwYWxldHRlIGVudHJ5IGFuZCBkbyB0aGUgd29yayB0d2ljZSDigJQgYW5ub3lpbmcsIG5vdFxuICogY29ycnVwdGluZyDigJQgYW5kIHJlZnVzaW5nIHRvIGxvYWQgb3ZlciB0aGF0IHdvdWxkIGJlIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHRoZSBvdmVybGFwLiBUaG9zZSBkZWNsYXJlXG4gKiB7QGxpbmsgUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJufSBhbmQgYm90aCBrZWVwIHJ1bm5pbmcuXG4gKlxuICogIyMgV2hhdCB0aGlzIGNhbiBhbmQgY2Fubm90IHNlZVxuICpcbiAqIE9ic2lkaWFuIHJhaXNlcyBubyBldmVudCB3aGVuIEFOT1RIRVIgcGx1Z2luIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQgKHNlZSBgcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHNgKSxcbiAqIHNvIGxpdmUgY29uZmxpY3QgZGV0ZWN0aW9uIGhhcyBhIHJlYWwgY2VpbGluZyBhbmQgaXQgaXMgc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gaW1wbGllZCBhd2F5LiBBXG4gKiBjb25mbGljdGluZyBwbHVnaW4gYnVpbHQgb24gdGhpcyBsaWJyYXJ5IGFubm91bmNlcyBpdHNlbGYgdGhyb3VnaCB0aGUgbGlmZWN5Y2xlIGJyb2FkY2FzdCwgYW5kIGlzXG4gKiB0aGVyZWZvcmUgY2F1Z2h0IHRoZSBtb21lbnQgaXQgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gT25lIHRoYXQgaXMgbm90IOKAlCBhbiBvbGQgcmVsZWFzZSBwcmVkYXRpbmcgdGhlXG4gKiBicm9hZGNhc3QsIG9yIGEgcGx1Z2luIGJ5IGFub3RoZXIgYXV0aG9yIGVudGlyZWx5IOKAlCBpcyBjYXVnaHQgYXQgdGhlIG5leHQgbG9hZCwgd2hpY2ggaXMgd2hlbiBpdHNcbiAqIG1hbmlmZXN0IGlzIHJlYWQuXG4gKlxuICogIyMgV2h5IGEgbG9zcyBpcyBhbm5vdW5jZWQgbGF0ZVxuICpcbiAqIE9ic2lkaWFuIHVwZGF0ZXMgYW4gZW5hYmxlZCBwbHVnaW4gYnkgcmVsb2FkaW5nIGl0OiB0aGUgb2xkIGNvcHkgdW5sb2FkcywgdGhlIG5ldyBvbmUgbG9hZHMuIEZvciB0aGVcbiAqIG1vbWVudCBpbiBiZXR3ZWVuIHRoZSBwcm92aWRlcidzIEFQSSBpcyByZXZva2VkLCBzbyBldmVyeSBkZXBlbmRlbnQgc2VlcyBpdHMgZGVwZW5kZW5jeSBnbyBhd2F5IGFuZFxuICogY29tZSBiYWNrLiBUaGUgZmVhdHVyZSBzdXJmYWNlIHN0aWxsIGNvbWVzIGRvd24gYXQgb25jZSDigJQgdGhlIGRlcGVuZGVuY3kgcmVhbGx5IGlzIGdvbmUgZm9yIHRoYXRcbiAqIG1vbWVudCDigJQgYnV0IHRoZSBub3RpY2Ugd2FpdHMge0BsaW5rIExPU1NfQU5OT1VOQ0VNRU5UX0dSQUNFX1BFUklPRF9JTl9NSUxMSVNFQ09ORFN9LCBhbmQgYSBsb3NzIHRoYXRcbiAqIGhlYWxlZCBpbiB0aGUgbWVhbnRpbWUgaXMgbmV2ZXIgYW5ub3VuY2VkLiBXaXRob3V0IHRoYXQsIHVwZGF0aW5nIG9uZSBwbHVnaW4gcHV0IGEgXCJubyBsb25nZXJcbiAqIGF2YWlsYWJsZVwiIG5vdGljZSBvbiBzY3JlZW4gaW4gZXZlcnkgcGx1Z2luIGRlcGVuZGluZyBvbiBpdCwgZGVzY3JpYmluZyBhIHN0YXRlIHRoYXQgbm8gbG9uZ2VyIGhlbGQgYnlcbiAqIHRoZSB0aW1lIHRoZSB1c2VyIHJlYWQgaXQuIEEgbG9zcyB0aGUgdXNlciBjYXVzZWQgb24gcHVycG9zZSDigJQgZGlzYWJsaW5nIG9yIHVuaW5zdGFsbGluZyB0aGVcbiAqIGRlcGVuZGVuY3kg4oCUIG91dGxhc3RzIHRoZSB3aW5kb3cgYW5kIGlzIGFubm91bmNlZCBhcyBiZWZvcmUsIG9ubHkgYSBmZXcgc2Vjb25kcyBsYXRlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgUGx1Z2luXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgY29udmVydEFzeW5jVG9TeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7XG4gIGNvbXBhcmUgYXMgY29tcGFyZVZlcnNpb25zLFxuICBzYXRpc2ZpZXMgYXMgc2F0aXNmaWVzVmVyc2lvblxufSBmcm9tICdjb21wYXJlLXZlcnNpb25zJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgUGx1Z2luU2V0dGluZ1RhYlxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luQXBpUmVmIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1hcGkudHMnO1xuaW1wb3J0IHR5cGUge1xuICBQbHVnaW5MaWZlY3ljbGVFdmVudE5hbWUsXG4gIFBsdWdpbkxpZmVjeWNsZUV2ZW50UGF5bG9hZFxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgZGlzYWJsZUNvbW11bml0eVBsdWdpbiB9IGZyb20gJy4uL2NvbW11bml0eS1wbHVnaW5zLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7XG4gIGFwcGVuZFRleHRPckZyYWdtZW50Q2xvbmUsXG4gIGFzQ29kZUJsb2NrLFxuICBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzXG59IGZyb20gJy4uL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi4vaTE4bi9pMThuLnRzJztcbmltcG9ydCB7XG4gIFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLFxuICB3YXRjaFBsdWdpbkFwaVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWFwaS50cyc7XG5pbXBvcnQge1xuICBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSxcbiAgZ2V0SW5zdGFsbGVkUGx1Z2luVmVyc2lvbixcbiAgaW5zdGFsbEFuZEVuYWJsZVBsdWdpbixcbiAgSW5zdGFsbGVkUGx1Z2luU3RhdGUsXG4gIHVwZGF0ZVBsdWdpblxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHtcbiAgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FLFxuICBQTFVHSU5fVU5MT0FERURfRVZFTlRfTkFNRVxufSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWxpZmVjeWNsZS1ldmVudHMudHMnO1xuaW1wb3J0IHsgb3BlblNldHRpbmdUYWIgfSBmcm9tICcuLi9zZXR0aW5ncy1tb2RhbC50cyc7XG5pbXBvcnQgeyByZWdpc3RlckFzeW5jRXZlbnQgfSBmcm9tICcuL2FzeW5jLWV2ZW50cy1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50RXggfSBmcm9tICcuL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBDYWxsYmFja0xheW91dFJlYWR5Q29tcG9uZW50IH0gZnJvbSAnLi9sYXlvdXQtcmVhZHktY29tcG9uZW50LnRzJztcblxuLyoqXG4gKiBIb3cgbG9uZyBhIGdhdGUgdGhhdCBjbG9zZWQgd2hpbGUgdGhlIHBsdWdpbiB3YXMgcnVubmluZyB3YWl0cyBiZWZvcmUgc2F5aW5nIHNvLlxuICpcbiAqIExvbmcgZW5vdWdoIHRvIGNvdmVyIE9ic2lkaWFuIHJlbG9hZGluZyBhIHBsdWdpbiB0byBhcHBseSBpdHMgdXBkYXRlLCBzaG9ydCBlbm91Z2ggdGhhdCBhIHVzZXIgd2hvXG4gKiBkaXNhYmxlZCB0aGUgZGVwZW5kZW5jeSBieSBoYW5kIHN0aWxsIGNvbm5lY3RzIHRoZSBub3RpY2UgdG8gd2hhdCB0aGV5IGp1c3QgZGlkLlxuICovXG5jb25zdCBMT1NTX0FOTk9VTkNFTUVOVF9HUkFDRV9QRVJJT0RfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuLyoqXG4gKiBIb3cgYmFkbHkgdHdvIHBsdWdpbnMgcnVubmluZyBzaWRlIGJ5IHNpZGUgZ29lcyB3cm9uZywgYW5kIHRoZXJlZm9yZSB3aGF0IHRoaXMgb25lIGRvZXMgYWJvdXQgaXQuXG4gKi9cbmV4cG9ydCBlbnVtIFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkge1xuICAvKipcbiAgICogVGhlIGhvc3QgcmVmdXNlcyB0byBydW4gYXQgYWxsIHdoaWxlIHRoZSBjb25mbGljdCBob2xkczogYG9ubG9hZEltcGxgIG5ldmVyIHJ1bnMsIG5vdGhpbmcgaXNcbiAgICogcmVnaXN0ZXJlZCwgYW5kIHRoZSBwbHVnaW4gZXhwbGFpbnMgaXRzZWxmIHRoZSB3YXkgYSBtaXNzaW5nIGRlcGVuZGVuY3kgZG9lcy5cbiAgICpcbiAgICogRm9yIGFuIG92ZXJsYXAgd2hlcmUgYm90aCBwbHVnaW5zIGFjdGluZyBvbiB0aGUgc2FtZSBvcGVyYXRpb24gZGFtYWdlcyB0aGUgdmF1bHQuXG4gICAqL1xuICBCbG9jayA9ICdibG9jaycsXG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IHJ1bnMgYW55d2F5IGFuZCBzYXlzIHRoZSBvdmVybGFwIGlzIHRoZXJlLlxuICAgKlxuICAgKiBGb3IgYW4gb3ZlcmxhcCB0aGF0IGlzIGFubm95aW5nIHJhdGhlciB0aGFuIGRlc3RydWN0aXZlIOKAlCBkdXBsaWNhdGUgY29tbWFuZHMsIHdvcmsgZG9uZSB0d2ljZSDigJQgd2hlcmVcbiAgICogcmVmdXNpbmcgdG8gbG9hZCB3b3VsZCBjb3N0IHRoZSB1c2VyIG1vcmUgdGhhbiB0aGUgb3ZlcmxhcCBkb2VzLlxuICAgKi9cbiAgV2FybiA9ICd3YXJuJ1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSwgb3Igd2FybnMgYWJvdXQgcnVubmluZyBiZXNpZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luQ29uZmxpY3Qge1xuICAvKipcbiAgICogVGhlIHNlbXZlciByYW5nZSBvZiB0aGUgT1RIRVIgcGx1Z2luJ3MgdmVyc2lvbnMgdGhhdCBjb25mbGljdCwgZS5nLiBgJzwxMi4wLjAnYCBmb3IgXCJldmVyeSB2ZXJzaW9uXG4gICAqIGJlZm9yZSB0aGUgb25lIHRoYXQgZ2F2ZSB0aGlzIGJlaGF2aW9yIHVwXCIuXG4gICAqXG4gICAqIEEgcmFuZ2UgcmF0aGVyIHRoYW4gYSBtaW5pbXVtLCBzbyBhbiBvdmVybGFwIGNvbmZpbmVkIHRvIG9uZSBtYWpvciAoYCc+PTMgPDQnYCkgaXMgZXhwcmVzc2libGUsIGFuZCBzb1xuICAgKiBpcyBhIHBsdWdpbiB0aGF0IGNvbmZsaWN0cyBhdCBldmVyeSB2ZXJzaW9uIOKAlCBzcGVsbCB0aGF0IGAnPj0wLjAuMCdgLCBzaW5jZSBgY29tcGFyZS12ZXJzaW9uc2AgcmVqZWN0c1xuICAgKiBhIGJhcmUgYCpgLiBFdmFsdWF0ZWQgYWdhaW5zdCBgbWFuaWZlc3QudmVyc2lvbmA7IGEgdmVyc2lvbiB0aGF0IGNhbm5vdCBiZSBwYXJzZWQgY291bnRzIGFzXG4gICAqIGNvbmZsaWN0aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RpbmdWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGBtYW5pZmVzdC5pZGAgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgYXMgbGlzdGVkIGluIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbiByZWdpc3RyeS5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGNvbmZsaWN0aW5nIHBsdWdpbiwgc2hvd24gdG8gdGhlIHVzZXIuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgbG9jYWxpemVkIHNlbnRlbmNlIHNheWluZyB3aGF0IGdvZXMgd3Jvbmcgd2hlbiBib3RoIHJ1biwgc2hvd24gaW4gdGhlIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlY2xhcmluZyBwbHVnaW4gb3ducyB0aGlzIHN0cmluZyBiZWNhdXNlIG9ubHkgaXQga25vd3Mgd2hhdCB0aGUgdHdvIG9mIHRoZW0gY29sbGlkZSBvdmVyLCBhbmQgYVxuICAgKiB1c2VyIGJlaW5nIGFza2VkIHRvIGRpc2FibGUgc29tZXRoaW5nIGRlc2VydmVzIHRvIGJlIHRvbGQgd2h5LlxuICAgKlxuICAgKiBQYXNzIGEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHRvIG1hcmsgdXAgcGFydCBvZiB0aGUgc2VudGVuY2UsIHN1Y2ggYXMgYSBwbHVnaW4gbmFtZSByZW5kZXJlZCBhc1xuICAgKiBjb2RlLiBFYWNoIHJlbmRlciBhcHBlbmRzIGEgZnJlc2ggY2xvbmUgb2YgaXQsIHNpbmNlIHRoZSBiYW5uZXIgaXMgcmVuZGVyZWQgYWdhaW4gb24gZXZlcnkgcmVmcmVzaC5cbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCB0aGlzIHBsdWdpbiBkb2VzIGFib3V0IHRoZSBjb25mbGljdC5cbiAgICovXG4gIHJlYWRvbmx5IHNldmVyaXR5OiBQbHVnaW5Db25mbGljdFNldmVyaXR5O1xufVxuXG4vKipcbiAqIEEgcGx1Z2luIGFub3RoZXIgcGx1Z2luIGNhbm5vdCB3b3JrIHdpdGhvdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luRGVwZW5kZW5jeSB7XG4gIC8qKlxuICAgKiBUaGUgc2VtdmVyIHJhbmdlIG9mIEFQSSBjb250cmFjdCB2ZXJzaW9ucyB0aGUgZGVwZW5kZW50IGNvbXBpbGVkIGFnYWluc3QsIGUuZy4gYCdeMidgLlxuICAgKlxuICAgKiBBIGRlcGVuZGVuY3kgd2hvc2UgcHVibGlzaGVkIEFQSSBmYWxscyBvdXRzaWRlIHRoZSByYW5nZSBjb3VudHMgYXMgVU5TQVRJU0ZJRUQsIHdoaWNoIGlzIHdoYXQgdHVybnMgYVxuICAgKiBzaWxlbnQgYmVoYXZpb3JhbCBtaXNtYXRjaCBiZXR3ZWVuIHR3byBpbmRlcGVuZGVudGx5IHJlbGVhc2VkIHBsdWdpbnMgaW50byBhIHZpc2libGUgXCJ1cGRhdGUgdGhpc1xuICAgKiBvbmVcIiBtZXNzYWdlLiBTcGVsbCBcImFueSB2ZXJzaW9uXCIgYXMgYCc+PTAuMC4wJ2Ag4oCUIGBjb21wYXJlLXZlcnNpb25zYCByZWplY3RzIGEgYmFyZSBgKmAuXG4gICAqL1xuICByZWFkb25seSBhcGlWZXJzaW9uUmFuZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9sZGVzdCByZWxlYXNlIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4gdGhlIGRlcGVuZGVudCB3b3JrcyB3aXRoLCBlLmcuIGAnMi4yLjAnYC5cbiAgICpcbiAgICogRm9yIGEgcHJvdmlkZXIgd2hvc2UgQkVIQVZJT1IgY2hhbmdlZCB3aGlsZSBpdHMgQVBJIGNvbnRyYWN0IHN0YXllZCB0aGUgc2FtZSwgd2hpY2hcbiAgICoge0BsaW5rIGFwaVZlcnNpb25SYW5nZX0gY2Fubm90IHNlZS4gQSBkZXBlbmRlbmN5IGVuYWJsZWQgYmVsb3cgaXQgY291bnRzIGFzIFVOU0FUSVNGSUVEIGFuZCBhc2tzIHRoZVxuICAgKiB1c2VyIHRvIHVwZGF0ZSBpdC4gRXZhbHVhdGVkIGFnYWluc3QgYG1hbmlmZXN0LnZlcnNpb25gOyBhIHZlcnNpb24gdGhhdCBjYW5ub3QgYmUgcGFyc2VkIGNvdW50cyBhcyB0b29cbiAgICogb2xkLiBBIG1pbmltdW0gcmF0aGVyIHRoYW4gYSByYW5nZSwgYmVjYXVzZSB0aGUgb25seSBhZHZpY2UgdGhlIGdhdGUgY2FuIGdpdmUgaXMgXCJ1cGRhdGUgaXRcIiwgYW5kIGFuXG4gICAqIHVwcGVyIGJvdW5kIGlzIGEgdmVyc2lvbiBubyB1cGRhdGUgcmVhY2hlcy5cbiAgICovXG4gIHJlYWRvbmx5IG1pblBsdWdpblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIGFzIGxpc3RlZCBpbiBPYnNpZGlhbidzIGNvbW11bml0eSBwbHVnaW4gcmVnaXN0cnkuXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGxvY2FsaXplZCBzZW50ZW5jZSBzYXlpbmcgd2hhdCB0aGUgZGVwZW5kZW50IGRvZXMgd2l0aCB0aGlzIHBsdWdpbiwgc2hvd24gaW4gdGhlIHNldHRpbmdzIGJhbm5lci5cbiAgICpcbiAgICogVGhlIGRlcGVuZGVudCBvd25zIHRoaXMgc3RyaW5nIGJlY2F1c2Ugb25seSBpdCBrbm93cyB3aGF0IGl0IHVzZXMgdGhlIG90aGVyIHBsdWdpbiBmb3IsIGFuZCBhIHVzZXJcbiAgICogYmVpbmcgYXNrZWQgdG8gaW5zdGFsbCBzb21ldGhpbmcgZGVzZXJ2ZXMgdG8gYmUgdG9sZCB3aHkuXG4gICAqXG4gICAqIFBhc3MgYSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gdG8gbWFyayB1cCBwYXJ0IG9mIHRoZSBzZW50ZW5jZSwgc3VjaCBhcyBhIHBsdWdpbiBuYW1lIHJlbmRlcmVkIGFzXG4gICAqIGNvZGUuIEVhY2ggcmVuZGVyIGFwcGVuZHMgYSBmcmVzaCBjbG9uZSBvZiBpdCwgc2luY2UgdGhlIGJhbm5lciBpcyByZW5kZXJlZCBhZ2FpbiBvbiBldmVyeSByZWZyZXNoLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVhc29uOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luR2F0ZUNvbXBvbmVudH0gY29uc3RydWN0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBjb25mbGljdHMgdG8gZW5mb3JjZS4gQW4gZW1wdHkgbGlzdCBtZWFucyB0aGUgcGx1Z2luIHJlZnVzZXMgdG8gcnVuIGJlc2lkZSBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuXG4gIC8qKlxuICAgKiBUaGUgZGVwZW5kZW5jaWVzIHRvIGVuZm9yY2UuIEFuIGVtcHR5IGxpc3QgbWVhbnMgdGhlIHBsdWdpbiBkZXBlbmRzIG9uIG5vdGhpbmcsIGFuZCBpdHMgZmVhdHVyZVxuICAgKiBzdXJmYWNlIGxvYWRzIGltbWVkaWF0ZWx5LlxuICAgKi9cbiAgcmVhZG9ubHkgZGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W107XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIG9uY2UgZXZlcnkgZGVwZW5kZW5jeSBpcyBzYXRpc2ZpZWQgYW5kIG5vIGJsb2NraW5nXG4gICAqIGNvbmZsaWN0IGhvbGRzLCBhbmQgYWdhaW4gYWZ0ZXIgYSBnYXRlIHRoYXQgaGFkIGNsb3NlZCBvcGVucyBiYWNrIHVwLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHN1cmZhY2UgaXMgbG9hZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9hZEZlYXR1cmVTdXJmYWNlOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4g4oCUIHRoZSBvbmUgZGVjbGFyaW5nIHRoZSBkZXBlbmRlbmNpZXMgYW5kIGNvbmZsaWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbjogUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBwbHVnaW4ncyBub3RpY2UgY29tcG9uZW50LCB1c2VkIHRvIHNheSB3aGF0IGlzIG1pc3NpbmcsIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHdoYXQgY2hhbmdlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbk5vdGljZUNvbXBvbmVudDogUGx1Z2luTm90aWNlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBVbmxvYWRzIHRoZSBob3N0IHBsdWdpbidzIGZlYXR1cmUgc3VyZmFjZS4gQ2FsbGVkIHdoZW4gYSBnYXRlIHRoYXQgaGFkIGJlZW4gb3BlbiBjbG9zZXMuXG4gICAqL1xuICByZWFkb25seSB1bmxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifSBjb25zdHJ1Y3Rvci5cbiAqL1xuaW50ZXJmYWNlIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJsb2NrZWQgcGx1Z2luLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG5cbiAgLyoqXG4gICAqIFJlbmRlcnMgdGhlIGJsb2NrZWQgZXhwbGFuYXRpb24gaW50byB0aGUgdGFiJ3MgY29udGFpbmVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgdGFiJ3MgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqL1xuICByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogVGhlIHNldHRpbmdzIHRhYiBhIGJsb2NrZWQgcGx1Z2luIHNob3dzIGluIHBsYWNlIG9mIHRoZSBvbmUgaXQgbmV2ZXIgZ290IHRvIHJlZ2lzdGVyLlxuICpcbiAqIEEgYmxvY2tlZCBwbHVnaW4ncyBgb25sb2FkSW1wbGAgbmV2ZXIgcmFuLCBzbyBpdHMgcmVhbCBzZXR0aW5ncyB0YWIgZG9lcyBub3QgZXhpc3Qg4oCUIGFuZCBhIHVzZXIgd2hvIGdvZXNcbiAqIGxvb2tpbmcgZm9yIHRoZSBwbHVnaW4ncyBzZXR0aW5ncyBpcyBwcmVjaXNlbHkgdGhlIHVzZXIgYXNraW5nIFwid2h5IGlzbid0IHRoaXMgZG9pbmcgYW55dGhpbmc/XCIuIEFuXG4gKiBlbXB0eSBzcGFjZSBpcyB0aGUgd29yc3QgcG9zc2libGUgYW5zd2VyIHRvIHRoYXQgcXVlc3Rpb24uXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbm1kL3NldHRpbmdzLXRhYi9wcmVmZXItc2V0dGluZy1kZWZpbml0aW9ucyAtLSBUaGlzIHRhYiBoYXMgbm8gc2V0dGluZ3MgdG8gZGVjbGFyZS4gSXQgc3RhbmRzIGluIGZvciBhIHNldHRpbmdzIHRhYiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCwgY2FycnlpbmcgYW4gZXhwbGFuYXRpb24gYW5kIGEgcmVwYWlyIGJ1dHRvbiwgYW5kIHRoZSBwbHVnaW4ncyByZWFsIHNldHRpbmdzIGFwcGVhciB0aGUgbW9tZW50IHRoZSBnYXRlIG9wZW5zLlxuY2xhc3MgQmxvY2tlZFBsdWdpblNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSByZWFkb25seSByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbDogSFRNTEVsZW1lbnQpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFifS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQmxvY2tlZFBsdWdpblNldHRpbmdUYWJDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcy5wbHVnaW4uYXBwLCBwYXJhbXMucGx1Z2luKTtcbiAgICB0aGlzLnJlbmRlckJhbm5lciA9IHBhcmFtcy5yZW5kZXJCYW5uZXI7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgdGFiLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGRpc3BsYXkoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuICAgIHRoaXMucmVuZGVyQmFubmVyKHRoaXMuY29udGFpbmVyRWwpO1xuICB9XG59XG5cbi8qKlxuICogRW5mb3JjZXMgYSBwbHVnaW4ncyBtYW5kYXRvcnkgZGVwZW5kZW5jaWVzIGFuZCBkZWNsYXJlZCBjb25mbGljdHMsIGdhdGluZyBpdHMgZmVhdHVyZSBzdXJmYWNlIG9uIGJvdGguXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5HYXRlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlSZWZzID0gbmV3IE1hcDxzdHJpbmcsIFBsdWdpbkFwaVJlZjxvYmplY3Q+PigpO1xuICBwcml2YXRlIGJsb2NrZWRTZXR0aW5nVGFiOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYiA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdO1xuICBwcml2YXRlIGhhc0Fubm91bmNlZEJsb2NrZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBpc0ZlYXR1cmVTdXJmYWNlTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaXNMYXlvdXRSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvYWRGZWF0dXJlU3VyZmFjZTogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBsb3NzQW5ub3VuY2VtZW50VGltZXJJZDogbnVsbCB8IG51bWJlciA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luOiBQbHVnaW47XG4gIHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgdW5sb2FkRmVhdHVyZVN1cmZhY2U6ICgpID0+IHZvaWQ7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IEFwcCB7XG4gICAgcmV0dXJuIHRoaXMucGx1Z2luLmFwcDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHtAbGluayBQbHVnaW5HYXRlQ29tcG9uZW50fS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luR2F0ZUNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbmZsaWN0cyA9IHBhcmFtcy5jb25mbGljdHM7XG4gICAgdGhpcy5kZXBlbmRlbmNpZXMgPSBwYXJhbXMuZGVwZW5kZW5jaWVzO1xuICAgIHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlID0gcGFyYW1zLmxvYWRGZWF0dXJlU3VyZmFjZTtcbiAgICB0aGlzLnBsdWdpbiA9IHBhcmFtcy5wbHVnaW47XG4gICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQgPSBwYXJhbXMucGx1Z2luTm90aWNlQ29tcG9uZW50O1xuICAgIHRoaXMudW5sb2FkRmVhdHVyZVN1cmZhY2UgPSBwYXJhbXMudW5sb2FkRmVhdHVyZVN1cmZhY2U7XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGV0aGVyIGFueSB3YXJuaW5nIGNvbmZsaWN0IGlzIGluIGZvcmNlIHJpZ2h0IG5vdy5cbiAgICpcbiAgICogVGhlIHByZWRpY2F0ZSBhIGRlY2xhcmF0aXZlIHNldHRpbmdzIHRhYiBuZWVkcywgYW5kIHRoZSBjb3VudGVycGFydCB0b1xuICAgKiBgUGx1Z2luU3VnZ2VzdGlvbkNvbXBvbmVudC5nZXRTdWdnZXN0ZWRQbHVnaW5TdGF0ZWAuIFN1Y2ggYSB0YWIgZGVjaWRlcyB3aGV0aGVyIGEgcm93IGV4aXN0c1xuICAgKiBCRUZPUkUgaXQgcmVuZGVycyBhbnl0aGluZyBpbnRvIGl0LCBzbyB7QGxpbmsgcmVuZGVyQ29uZmxpY3RXYXJuaW5nQmFubmVyfSB3cml0aW5nIG5vdGhpbmcgY2Fubm90XG4gICAqIGFuc3dlciB0aGUgcXVlc3Rpb24gZm9yIGl0IOKAlCBhIHJvdyB0aGF0IHJlbmRlcnMgZW1wdHkgaXMgc3RpbGwgYSByb3csIHdpdGggdGhlIGRpdmlkZXIgYW5kIHBhZGRpbmdcbiAgICogZXZlcnkgb3RoZXIgc2V0dGluZyBoYXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGRlY2xhcmVkIHdhcm5pbmcgY29uZmxpY3QgaG9sZHMuXG4gICAqL1xuICBwdWJsaWMgaGFzQWN0aXZlV2FybmluZ0NvbmZsaWN0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKS5sZW5ndGggPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB3YXRjaGluZyBldmVyeSBkZWNsYXJlZCBkZXBlbmRlbmN5IGFuZCBjb25mbGljdC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHRoaXMuZGVwZW5kZW5jaWVzKSB7XG4gICAgICBjb25zdCBhcGlSZWYgPSB3YXRjaFBsdWdpbkFwaTxvYmplY3Q+KHtcbiAgICAgICAgYXBpVmVyc2lvblJhbmdlOiBkZXBlbmRlbmN5LmFwaVZlcnNpb25SYW5nZSxcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgfSk7XG4gICAgICByZWdpc3RlckFzeW5jRXZlbnQoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIGFwaVJlZi5vbignY2hhbmdlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaCgpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICAgIHRoaXMuYXBpUmVmcy5zZXQoZGVwZW5kZW5jeS5wbHVnaW5JZCwgYXBpUmVmKTtcbiAgICB9XG5cbiAgICAvLyBBIGNvbmZsaWN0IGhhcyBubyBBUEkgdG8gd2F0Y2gg4oCUIGl0IGlzIHJlYWQgb3V0IG9mIHRoZSBtYW5pZmVzdHMg4oCUIHNvIHRoZSB0cmlnZ2VyIHRvIHJlLXJlYWQgaXMgdGhlXG4gICAgLy8gbGlicmFyeSdzIG93biBsaWZlY3ljbGUgYnJvYWRjYXN0LiBJdCBjb3ZlcnMgZXZlcnkgY29uZmxpY3RpbmcgcGx1Z2luIGJ1aWx0IG9uIHRoaXMgbGlicmFyeTsgb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaXMgY2F1Z2h0IGF0IHRoZSBuZXh0IGxvYWQsIGFzIHRoZSBmaWxlIGhlYWRlciBzYXlzLlxuICAgIGNvbnN0IGxpZmVjeWNsZUV2ZW50TmFtZXM6IFBsdWdpbkxpZmVjeWNsZUV2ZW50TmFtZVtdID0gW1BMVUdJTl9MT0FERURfRVZFTlRfTkFNRSwgUExVR0lOX1VOTE9BREVEX0VWRU5UX05BTUVdO1xuICAgIGZvciAoY29uc3QgZXZlbnROYW1lIG9mIGxpZmVjeWNsZUV2ZW50TmFtZXMpIHtcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oXG4gICAgICAgIGV2ZW50TmFtZSxcbiAgICAgICAgY29udmVydEFzeW5jVG9TeW5jKGFzeW5jIChwYXlsb2FkOiBQbHVnaW5MaWZlY3ljbGVFdmVudFBheWxvYWQpID0+IHtcbiAgICAgICAgICBpZiAocGF5bG9hZC5wbHVnaW5JZCA9PT0gdGhpcy5wbHVnaW4ubWFuaWZlc3QuaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgICAgICAgfSlcbiAgICAgICkpO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgaXMgU0FJRCBhYm91dCBhIG1pc3NpbmcgZGVwZW5kZW5jeSB1bnRpbCB0aGUgbGF5b3V0IGlzIHJlYWR5LiBQbHVnaW5zIGxvYWQgaW4gYW4gdW5zcGVjaWZpZWRcbiAgICAvLyBvcmRlciwgc28gYSBkZXBlbmRlbmN5IHRoYXQgc2ltcGx5IGhhcyBub3QgbG9hZGVkIHlldCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBhdCB0aGlzIHBvaW50IGZyb20gb25lXG4gICAgLy8gdGhhdCBpcyBub3QgaW5zdGFsbGVkIOKAlCBhbm5vdW5jaW5nIGhlcmUgd291bGQgcHV0IGEgXCJtaXNzaW5nIHBsdWdpblwiIG5vdGljZSBvbiBzY3JlZW4gYXQgZXZlcnlcbiAgICAvLyBzdGFydHVwIGFuZCB0YWtlIGl0IGF3YXkgYSBtb21lbnQgbGF0ZXIuIFRoZSBnYXRlIGl0c2VsZiBkb2VzIG5vdCB3YWl0OiB0aGUgc3VyZmFjZSBsb2FkcyB0aGVcbiAgICAvLyBpbnN0YW50IHRoZSBkZXBlbmRlbmN5IGlzIHRoZXJlLCB3aGVuZXZlciB0aGF0IGlzLlxuICAgIHRoaXMuYWRkQ2hpbGQoXG4gICAgICBuZXcgQ2FsbGJhY2tMYXlvdXRSZWFkeUNvbXBvbmVudCh0aGlzLmFwcCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmlzTGF5b3V0UmVhZHkgPSB0cnVlO1xuICAgICAgICB0aGlzLnByZXNlbnRVbnNhdGlzZmllZCh0aGlzLmdldFVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzKCksIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKTtcbiAgICAgICAgdGhpcy5hbm5vdW5jZVdhcm5pbmdzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsTG9zc0Fubm91bmNlbWVudCgpO1xuICAgICAgdGhpcy5oaWRlQmxvY2tlZFNldHRpbmdUYWIoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZXMgdGhlIGdhdGUgb25jZSB0aGUgd2F0Y2hlcyBhcmUgaW4gcGxhY2UsIGxvYWRpbmcgdGhlIGZlYXR1cmUgc3VyZmFjZSBpZiBpdCBpcyBhbHJlYWR5IG9wZW4uXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZmlyc3QgZXZhbHVhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlZnJlc2goKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIGEgYmFubmVyIGZvciBldmVyeSBjb25mbGljdCB0aGUgaG9zdCBpcyBydW5uaW5nIGFsb25nc2lkZSwgc28gYSBwbHVnaW4gY2FuIHB1dCB0aGUgb3ZlcmxhcCBpblxuICAgKiBpdHMgb3duIHNldHRpbmdzIHRhYi5cbiAgICpcbiAgICogQ29uc3VtZXItaW52b2tlZCwgZXhhY3RseSBsaWtlIGBQbHVnaW5TdWdnZXN0aW9uQ29tcG9uZW50LnJlbmRlckJhbm5lcmA6IHRoZSBsaWJyYXJ5IHJlZ2lzdGVycyB0aGVcbiAgICogc2V0dGluZ3MgdGFiIGEgQkxPQ0tFRCBwbHVnaW4gbmVlZHMsIGJlY2F1c2UgdGhhdCBwbHVnaW4gbmV2ZXIgZ290IHRvIHJlZ2lzdGVyIG9uZSBvZiBpdHMgb3duLCBidXQgaXRcbiAgICogaGFzIG5vIGhvb2sgaW50byB0aGUgdGFiIGEgcnVubmluZyBwbHVnaW4gYnVpbGRzLiBSZW5kZXJzIG5vdGhpbmcgd2hlbiBubyB3YXJuaW5nIGNvbmZsaWN0IGhvbGRzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICovXG4gIHB1YmxpYyByZW5kZXJDb25mbGljdFdhcm5pbmdCYW5uZXIoY29udGFpbmVyRWw6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb25mbGljdCBvZiB0aGlzLmdldEFjdGl2ZUNvbmZsaWN0cyhQbHVnaW5Db25mbGljdFNldmVyaXR5Lldhcm4pKSB7XG4gICAgICB0aGlzLnJlbmRlckNvbmZsaWN0RW50cnkoY29udGFpbmVyRWwsIGNvbmZsaWN0LCB0aGlzLmNyZWF0ZUNvbmZsaWN0V2FybmluZ01lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F5cyB3aGF0IHdlbnQgYXdheSB3aGlsZSB0aGUgcGx1Z2luIHdhcyBydW5uaW5nLCBub3cgdGhhdCB0aGUgZ3JhY2UgcGVyaW9kIGlzIG92ZXIuXG4gICAqXG4gICAqIFJlLXJlYWRzIHRoZSBnYXRlIHJhdGhlciB0aGFuIHRydXN0aW5nIHdoYXQgY2xvc2VkIGl0LCBzbyBhIGRlcGVuZGVuY3kgdGhhdCB3ZW50IGF3YXkgZHVyaW5nIHRoZVxuICAgKiB3aW5kb3cgaXMgYW5ub3VuY2VkIHdpdGggdGhlIHJlc3QuIE9uZSB0aGF0IGNhbWUgYmFjayBpbiB0aW1lIG5ldmVyIGdldHMgaGVyZTogdGhlIGdhdGUgcmVvcGVuaW5nXG4gICAqIGNhbmNlbHMgdGhlIHRpbWVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdW5jZUxvc3MoKTogdm9pZCB7XG4gICAgdGhpcy5sb3NzQW5ub3VuY2VtZW50VGltZXJJZCA9IG51bGw7XG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlRGVwZW5kZW5jeUxvc3RNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIHRoaXMuZ2V0QWN0aXZlQ29uZmxpY3RzKFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkuQmxvY2spKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RBcHBlYXJlZE1lc3NhZ2UoY29uZmxpY3QpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFubm91bmNlV2FybmluZ3MoKTogdm9pZCB7XG4gICAgLy8gQSB3YXJuaW5nIGRlc2NyaWJlcyB0d28gcGx1Z2lucyB0aGF0IGFyZSBib3RoIFJVTk5JTkcsIHNvIGl0IGlzIHBvaW50bGVzcyB3aGlsZSB0aGlzIG9uZSBpcyBibG9ja2VkXG4gICAgLy8g4oCUIGFuZCBpdCB3YWl0cyBmb3IgbGF5b3V0LXJlYWR5IGZvciB0aGUgc2FtZSByZWFzb24gdGhlIGJsb2NrZWQgbm90aWNlIGRvZXMuXG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgIXRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5XYXJuKSkge1xuICAgICAgaWYgKHRoaXMuYW5ub3VuY2VkV2FybmluZ1BsdWdpbklkcy5oYXMoY29uZmxpY3QucGx1Z2luSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmFubm91bmNlZFdhcm5pbmdQbHVnaW5JZHMuYWRkKGNvbmZsaWN0LnBsdWdpbklkKTtcbiAgICAgIHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UodGhpcy5jcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0KSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd2luZG93LmNsZWFyVGltZW91dCh0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkKTtcbiAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzVG9vT2xkKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUnVubmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmJsb2NrZWROb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUNvbmZsaWN0QXBwZWFyZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuY29uZmxpY3RBcHBlYXJlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdEJsb2NrZWRNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3QuYmxvY2tlZE5vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb25mbGljdFdhcm5pbmdNZXNzYWdlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Qud2FybmluZ05vdGljZSwge1xuICAgICAgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhjb25mbGljdC5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEZXBlbmRlbmN5TG9zdE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGlmICh0aGlzLmlzVG9vT2xkKGRlcGVuZGVuY3kpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVWZXJzaW9uTWlzbWF0Y2hNZXNzYWdlKGRlcGVuZGVuY3kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzUnVubmluZyhkZXBlbmRlbmN5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlTm9SZWFkYWJsZUFwaU1lc3NhZ2UoZGVwZW5kZW5jeSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LmRlcGVuZGVuY3lMb3N0Tm90aWNlLCB7XG4gICAgICBkZXBlbmRlbmN5UGx1Z2luTmFtZTogYXNDb2RlQmxvY2soZGVwZW5kZW5jeS5wbHVnaW5OYW1lKSxcbiAgICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHRoaXMucGx1Z2luLm1hbmlmZXN0Lm5hbWUpXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOb1JlYWRhYmxlQXBpTWVzc2FnZShkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5Lm5vUmVhZGFibGVBcGlOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVZlcnNpb25NaXNtYXRjaE1lc3NhZ2UoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIHJldHVybiBjcmVhdGVGcmFnbWVudFdpdGhDb2RlQmxvY2tzKHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS52ZXJzaW9uTWlzbWF0Y2hOb3RpY2UsIHtcbiAgICAgIGRlcGVuZGVuY3lQbHVnaW5OYW1lOiBhc0NvZGVCbG9jayhkZXBlbmRlbmN5LnBsdWdpbk5hbWUpLFxuICAgICAgcGx1Z2luTmFtZTogYXNDb2RlQmxvY2sodGhpcy5wbHVnaW4ubWFuaWZlc3QubmFtZSlcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGRlY2xhcmVkIGNvbmZsaWN0cyBvZiBvbmUgc2V2ZXJpdHkgdGhhdCBhcmUgY3VycmVudGx5IGluIGZvcmNlLlxuICAgKlxuICAgKiBAcGFyYW0gc2V2ZXJpdHkgLSBUaGUgc2V2ZXJpdHkgdG8gc2VsZWN0LlxuICAgKiBAcmV0dXJucyBUaGUgY29uZmxpY3RzIGhvbGRpbmcgcmlnaHQgbm93LCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlY2xhcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBY3RpdmVDb25mbGljdHMoc2V2ZXJpdHk6IFBsdWdpbkNvbmZsaWN0U2V2ZXJpdHkpOiBQbHVnaW5Db25mbGljdFtdIHtcbiAgICByZXR1cm4gdGhpcy5jb25mbGljdHMuZmlsdGVyKChjb25mbGljdCkgPT4gY29uZmxpY3Quc2V2ZXJpdHkgPT09IHNldmVyaXR5ICYmIHRoaXMuaXNDb25mbGljdEFjdGl2ZShjb25mbGljdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpOiBQbHVnaW5EZXBlbmRlbmN5W10ge1xuICAgIHJldHVybiB0aGlzLmRlcGVuZGVuY2llcy5maWx0ZXIoKGRlcGVuZGVuY3kpID0+ICF0aGlzLmFwaVJlZnMuZ2V0KGRlcGVuZGVuY3kucGx1Z2luSWQpPy52YWx1ZSB8fCB0aGlzLmlzQmVsb3dNaW5QbHVnaW5WZXJzaW9uKGRlcGVuZGVuY3kpKTtcbiAgfVxuXG4gIHByaXZhdGUgaGlkZUJsb2NrZWRTZXR0aW5nVGFiKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ibG9ja2VkU2V0dGluZ1RhYikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYXBwLnNldHRpbmcucmVtb3ZlU2V0dGluZ1RhYih0aGlzLmJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYXQgYSByZWxlYXNlIG9sZGVyIHRoYW4gaXQgZGVjbGFyZWQgaXQgbmVlZHMuXG4gICAqXG4gICAqIFJlYWQgZnJvbSB0aGUgbWFuaWZlc3QsIGxpa2UgYSBjb25mbGljdCwgYW5kIHJlLXJlYWQgb24gZXZlcnkgZXZhbHVhdGlvbjogT2JzaWRpYW4gYXBwbGllcyBhbiB1cGRhdGUgYnlcbiAgICogcmVsb2FkaW5nIHRoZSBwcm92aWRlciwgd2hpY2ggZmlyZXMgdGhlIEFQSSB3YXRjaCdzIGBjaGFuZ2VgLCBzbyB0aGUgZ2F0ZSBvcGVucyB3aXRob3V0IGEgcmVzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIGRlcGVuZGVuY3kgLSBUaGUgZGVjbGFyZWQgZGVwZW5kZW5jeS5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgZGVwZW5kZW5jeSBpcyBlbmFibGVkIGJlbG93IGl0cyB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5taW5QbHVnaW5WZXJzaW9ufTsgYGZhbHNlYFxuICAgKiB3aGVuIGl0IGRlY2xhcmVzIG5vbmUgb3IgaXMgbm90IGVuYWJsZWQsIHNpbmNlIGl0cyBBUEkgaXMgdGhlbiBhYnNlbnQgYW55d2F5LlxuICAgKi9cbiAgcHJpdmF0ZSBpc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5OiBQbHVnaW5EZXBlbmRlbmN5KTogYm9vbGVhbiB7XG4gICAgaWYgKGRlcGVuZGVuY3kubWluUGx1Z2luVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW5zdGFsbGVkVmVyc2lvbiA9IGdldEluc3RhbGxlZFBsdWdpblZlcnNpb24oe1xuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkXG4gICAgfSk7XG5cbiAgICBpZiAoaW5zdGFsbGVkVmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gIWNvbXBhcmVWZXJzaW9ucyhpbnN0YWxsZWRWZXJzaW9uLCBkZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb24sICc+PScpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciBvbmUgZGVjbGFyZWQgY29uZmxpY3QgaXMgaW4gZm9yY2UgcmlnaHQgbm93LlxuICAgKlxuICAgKiBPbmx5IGFuIEVOQUJMRUQgcGx1Z2luIGNvdW50cy4gT25lIHRoYXQgaXMgaW5zdGFsbGVkIGJ1dCBzd2l0Y2hlZCBvZmYgcmVnaXN0ZXJzIG5vdGhpbmcsIHNvIGl0IGNhbm5vdFxuICAgKiBjb2xsaWRlLCBhbmQgYWN0aW5nIG9uIGl0IHdvdWxkIGJlIGFuIGFsYXJtIHRoZSB1c2VyIGNhbiBvbmx5IGFuc3dlciBieSB1bmluc3RhbGxpbmcgc29tZXRoaW5nIHRoZXlcbiAgICogaGF2ZSBhbHJlYWR5IHR1cm5lZCBvZmYuXG4gICAqXG4gICAqIEBwYXJhbSBjb25mbGljdCAtIFRoZSBkZWNsYXJlZCBjb25mbGljdC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29uZmxpY3RpbmcgcGx1Z2luIGlzIGVuYWJsZWQgYXQgYSBjb25mbGljdGluZyB2ZXJzaW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NvbmZsaWN0QWN0aXZlKGNvbmZsaWN0OiBQbHVnaW5Db25mbGljdCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGluc3RhbGxlZFZlcnNpb24gPSBnZXRJbnN0YWxsZWRQbHVnaW5WZXJzaW9uKHtcbiAgICAgIGFwcDogdGhpcy5hcHAsXG4gICAgICBwbHVnaW5JZDogY29uZmxpY3QucGx1Z2luSWRcbiAgICB9KTtcblxuICAgIGlmIChpbnN0YWxsZWRWZXJzaW9uID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzYXRpc2ZpZXNWZXJzaW9uKGluc3RhbGxlZFZlcnNpb24sIGNvbmZsaWN0LmNvbmZsaWN0aW5nVmVyc2lvblJhbmdlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYW4gdW5zYXRpc2ZpZWQgZGVwZW5kZW5jeSBpcyBub25ldGhlbGVzcyBlbmFibGVkIGFuZCBsb2FkZWQuXG4gICAqXG4gICAqIFN1Y2ggYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYnV0IHB1Ymxpc2hlcyBubyBBUEkgdGhpcyBwbHVnaW4gY2FuIHJlYWQg4oCUIG5vbmUgYXQgYWxsLCBvciBvbmUgd2hvc2Ugc2hhcGVcbiAgICogZmFpbHMgdGhlIGNvbnRyYWN0LiBUaGUgdXN1YWwgY2F1c2UgaXMgYSByZWxlYXNlIGJ1aWx0IG9uIGEgY29weSBvZiB0aGlzIGxpYnJhcnkgdGhhdCBwdWJsaXNoZXNcbiAgICogc29tZXdoZXJlIHRoaXMgb25lIGRvZXMgbm90IGxvb2ssIHNvIFwiaW5zdGFsbCBhbmQgZW5hYmxlIGl0XCIgd291bGQgYmUgZmFsc2UgYW5kIFwidXBkYXRlIGl0XCIgaXMgdGhlIGZpeC5cbiAgICpcbiAgICogQmVpbmcgaW4gYGVuYWJsZWRQbHVnaW5zYCBpcyBub3QgZW5vdWdoOiBPYnNpZGlhbidzIHBsYWluIGBkaXNhYmxlUGx1Z2luYCB1bmxvYWRzIGEgcGx1Z2luIGFuZCBsZWF2ZXMgaXRcbiAgICogdGhlcmUgKG9ubHkgYGRpc2FibGVQbHVnaW5BbmRTYXZlYCByZW1vdmVzIGl0KSwgc28gYSBwcm92aWRlciB0aGF0IHdlbnQgYXdheSB3b3VsZCBvdGhlcndpc2UgcmVhZCBhc1xuICAgKiBydW5uaW5nIHdpdGggYW4gdW5yZWFkYWJsZSBBUEkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXBlbmRlbmN5IC0gVGhlIGRlY2xhcmVkIGRlcGVuZGVuY3kuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGRlcGVuZGVuY3kgaXMgZW5hYmxlZCBhbmQgbG9hZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1J1bm5pbmcoZGVwZW5kZW5jeTogUGx1Z2luRGVwZW5kZW5jeSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBnZXRJbnN0YWxsZWRQbHVnaW5TdGF0ZSh7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZFxuICAgICAgICB9KSA9PT0gSW5zdGFsbGVkUGx1Z2luU3RhdGUuRW5hYmxlZCAmJiB0aGlzLmFwcC5wbHVnaW5zLmdldFBsdWdpbihkZXBlbmRlbmN5LnBsdWdpbklkKSAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgYSBkZXBlbmRlbmN5IGlzIHJ1bm5pbmcgYnV0IHRvbyBvbGQgZm9yIHRoaXMgcGx1Z2luLCBzbyB0aGUgYWR2aWNlIGlzIFwidXBkYXRlIGl0XCIuXG4gICAqXG4gICAqIFR3byBpbmRlcGVuZGVudCBzaWduYWxzIHNheSBzbzogYSByZWxlYXNlIGJlbG93IHtAbGluayBQbHVnaW5EZXBlbmRlbmN5Lm1pblBsdWdpblZlcnNpb259LCBhbmQgYSBwdWJsaXNoZWRcbiAgICogQVBJIHdob3NlIGNvbnRyYWN0IHZlcnNpb24gaXMgb3V0c2lkZSB7QGxpbmsgUGx1Z2luRGVwZW5kZW5jeS5hcGlWZXJzaW9uUmFuZ2V9LlxuICAgKlxuICAgKiBAcGFyYW0gZGVwZW5kZW5jeSAtIFRoZSBkZWNsYXJlZCBkZXBlbmRlbmN5LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHVwZGF0aW5nIHRoZSBkZXBlbmRlbmN5IGlzIHdoYXQgaXQgbmVlZHMuXG4gICAqL1xuICBwcml2YXRlIGlzVG9vT2xkKGRlcGVuZGVuY3k6IFBsdWdpbkRlcGVuZGVuY3kpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0JlbG93TWluUGx1Z2luVmVyc2lvbihkZXBlbmRlbmN5KVxuICAgICAgfHwgdGhpcy5hcGlSZWZzLmdldChkZXBlbmRlbmN5LnBsdWdpbklkKT8udW5hdmFpbGFiaWxpdHlSZWFzb24gPT09IFBsdWdpbkFwaVVuYXZhaWxhYmlsaXR5UmVhc29uLlZlcnNpb25NaXNtYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXlzIHdoYXQgaXMgaW4gdGhlIHdheSwgYW5kIHB1dHMgdGhlIHNhbWUgZXhwbGFuYXRpb24gd2hlcmUgdGhlIHVzZXIgd2lsbCBsb29rIGZvciB0aGUgcGx1Z2luJ3NcbiAgICogc2V0dGluZ3MuXG4gICAqXG4gICAqIEBwYXJhbSB1bnNhdGlzZmllZERlcGVuZGVuY2llcyAtIFRoZSBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBzYXRpc2ZpZWQuXG4gICAqIEBwYXJhbSBibG9ja2luZ0NvbmZsaWN0cyAtIFRoZSBjb25mbGljdHMgY3VycmVudGx5IHJlZnVzaW5nIHRoZSBwbHVnaW4gdGhlIHJpZ2h0IHRvIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgcHJlc2VudFVuc2F0aXNmaWVkKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF5b3V0UmVhZHkgfHwgKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCAmJiBibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5zaG93QmxvY2tlZFNldHRpbmdUYWIodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMsIGJsb2NraW5nQ29uZmxpY3RzKTtcblxuICAgIGlmICh0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmhhc0Fubm91bmNlZEJsb2NrZWQgPSB0cnVlO1xuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgdGhpcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZSh0aGlzLmNyZWF0ZUJsb2NrZWRNZXNzYWdlKGRlcGVuZGVuY3kpKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNvbmZsaWN0IG9mIGJsb2NraW5nQ29uZmxpY3RzKSB7XG4gICAgICB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlKHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1ldmFsdWF0ZXMgdGhlIGdhdGUgYW5kIG1vdmVzIHRoZSBmZWF0dXJlIHN1cmZhY2UgdG8gbWF0Y2guXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc3VyZmFjZSBtYXRjaGVzIHRoZSBnYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzID0gdGhpcy5nZXRVbnNhdGlzZmllZERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IGJsb2NraW5nQ29uZmxpY3RzID0gdGhpcy5nZXRBY3RpdmVDb25mbGljdHMoUGx1Z2luQ29uZmxpY3RTZXZlcml0eS5CbG9jayk7XG5cbiAgICBpZiAodW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMubGVuZ3RoID09PSAwICYmIGJsb2NraW5nQ29uZmxpY3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jYW5jZWxMb3NzQW5ub3VuY2VtZW50KCk7XG4gICAgICB0aGlzLmhpZGVCbG9ja2VkU2V0dGluZ1RhYigpO1xuICAgICAgdGhpcy5oYXNBbm5vdW5jZWRCbG9ja2VkID0gZmFsc2U7XG5cbiAgICAgIGlmICghdGhpcy5pc0ZlYXR1cmVTdXJmYWNlTG9hZGVkKSB7XG4gICAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IHRydWU7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZEZlYXR1cmVTdXJmYWNlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuYW5ub3VuY2VXYXJuaW5ncygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzRmVhdHVyZVN1cmZhY2VMb2FkZWQpIHtcbiAgICAgIHRoaXMuaXNGZWF0dXJlU3VyZmFjZUxvYWRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51bmxvYWRGZWF0dXJlU3VyZmFjZSgpO1xuXG4gICAgICAvLyBBIGdhdGUgdGhhdCBjbG9zZXMgd2hpbGUgdGhlIHBsdWdpbiBpcyBSVU5OSU5HIGlzIHRoZSBjYXNlIHdvcnRoIGJlaW5nIGxvdWQgYWJvdXQ6IHRoZSB1c2VyIGp1c3RcbiAgICAgIC8vIGRpZCBzb21ldGhpbmcsIGFuZCB0aGUgY29uc2VxdWVuY2UgaXMgaW1tZWRpYXRlIGFuZCBpbnZpc2libGUgd2l0aG91dCB0aGlzLiBBbm5vdW5jZWQgcmVnYXJkbGVzc1xuICAgICAgLy8gb2YgbGF5b3V0IHJlYWRpbmVzcywgYmVjYXVzZSBhIHJ1bm5pbmcgcGx1Z2luIG1lYW5zIHRoZSBsYXlvdXQgaXMgbG9uZyBzaW5jZSByZWFkeSDigJQgYnV0IG9ubHlcbiAgICAgIC8vIG9uY2UgdGhlIGdyYWNlIHBlcmlvZCBoYXMgc2hvd24gdGhlIGxvc3MgaXMgbm90IGFuIHVwZGF0ZSByZWxvYWRpbmcgdGhlIHByb3ZpZGVyIChzZWUgdGhlIGZpbGVcbiAgICAgIC8vIGhlYWRlcikuXG4gICAgICB0aGlzLmxvc3NBbm5vdW5jZW1lbnRUaW1lcklkID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmFubm91bmNlTG9zcygpO1xuICAgICAgfSwgTE9TU19BTk5PVU5DRU1FTlRfR1JBQ0VfUEVSSU9EX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAgIHRoaXMuaGFzQW5ub3VuY2VkQmxvY2tlZCA9IHRydWU7XG4gICAgICB0aGlzLnNob3dCbG9ja2VkU2V0dGluZ1RhYih1bnNhdGlzZmllZERlcGVuZGVuY2llcywgYmxvY2tpbmdDb25mbGljdHMpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucHJlc2VudFVuc2F0aXNmaWVkKHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgYmxvY2tlZCBleHBsYW5hdGlvbiBpbnRvIGEgc2V0dGluZ3MtdGFiIGNvbnRhaW5lcjogd2hhdCBpcyBtaXNzaW5nIG9yIGluIHRoZSB3YXksIHdoeSBpdFxuICAgKiBtYXR0ZXJzLCBhbmQgdGhlIGJ1dHRvbiB0aGF0IGZpeGVzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gY29udGFpbmVyRWwgLSBUaGUgZWxlbWVudCB0byByZW5kZXIgaW50by5cbiAgICogQHBhcmFtIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzIC0gVGhlIGRlcGVuZGVuY2llcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IHNhdGlzZmllZC5cbiAgICogQHBhcmFtIGJsb2NraW5nQ29uZmxpY3RzIC0gVGhlIGNvbmZsaWN0cyBjdXJyZW50bHkgcmVmdXNpbmcgdGhlIHBsdWdpbiB0aGUgcmlnaHQgdG8gcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJCbG9ja2VkQmFubmVyKFxuICAgIGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCxcbiAgICB1bnNhdGlzZmllZERlcGVuZGVuY2llczogcmVhZG9ubHkgUGx1Z2luRGVwZW5kZW5jeVtdLFxuICAgIGJsb2NraW5nQ29uZmxpY3RzOiByZWFkb25seSBQbHVnaW5Db25mbGljdFtdXG4gICk6IHZvaWQge1xuICAgIGlmICh1bnNhdGlzZmllZERlcGVuZGVuY2llcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luRGVwZW5kZW5jeS5zZXR0aW5nc0hlYWRpbmcpIH0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiB1bnNhdGlzZmllZERlcGVuZGVuY2llcykge1xuICAgICAgY29uc3QgYmFubmVyRWwgPSBjb250YWluZXJFbC5jcmVhdGVEaXYoe1xuICAgICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luRGVwZW5kZW5jeUJhbm5lcl1cbiAgICAgIH0pO1xuICAgICAgYmFubmVyRWwuYXBwZW5kKHRoaXMuY3JlYXRlQmxvY2tlZE1lc3NhZ2UoZGVwZW5kZW5jeSkpO1xuICAgICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgZGVwZW5kZW5jeS5yZWFzb24pO1xuXG4gICAgICBjb25zdCBzdGF0ZSA9IGdldEluc3RhbGxlZFBsdWdpblN0YXRlKHtcbiAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgcGx1Z2luSWQ6IGRlcGVuZGVuY3kucGx1Z2luSWRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBbiBlbmFibGVkIGRlcGVuZGVuY3kgdGhhdCBpcyBzdGlsbCB1bnNhdGlzZmllZCBpcyB0b28gb2xkLCBhbmQgaW5zdGFsbGluZyBvciBlbmFibGluZyBpdCBhZ2FpbiBkb2VzXG4gICAgICAvLyBub3RoaW5nLCBzbyBpdCBpcyBvZmZlcmVkIGFuIHVwZGF0ZSBpbnN0ZWFkLlxuICAgICAgaWYgKHN0YXRlICE9PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5FbmFibGVkKSB7XG4gICAgICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT5cbiAgICAgICAgICAgIHN0YXRlID09PSBJbnN0YWxsZWRQbHVnaW5TdGF0ZS5JbnN0YWxsZWRCdXREaXNhYmxlZFxuICAgICAgICAgICAgICA/ICQub2JzaWRpYW5MaWIucGx1Z2luU3VnZ2VzdGlvbi5lbmFibGVcbiAgICAgICAgICAgICAgOiAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uaW5zdGFsbFxuICAgICAgICAgICkpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgICAgICBwbHVnaW5JZDogZGVwZW5kZW5jeS5wbHVnaW5JZCxcbiAgICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQ6IHRoaXMucGx1Z2luTm90aWNlQ29tcG9uZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBPYnNpZGlhbiBhcHBsaWVzIHRoZSB1cGRhdGUgYnkgcmVsb2FkaW5nIHRoZSBkZXBlbmRlbmN5LCB3aGljaCByZXB1Ymxpc2hlcyBpdHMgQVBJLCBzbyB0aGUgd2F0Y2gnc1xuICAgICAgLy8gYGNoYW5nZWAgcmVvcGVucyB0aGUgZ2F0ZSB3aXRoIG5vIGZ1cnRoZXIgc3RlcCBoZXJlLlxuICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChiYW5uZXJFbClcbiAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LnVwZGF0ZSwgeyBkZXBlbmRlbmN5UGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lIH0pKVxuICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBhd2FpdCB1cGRhdGVQbHVnaW4oe1xuICAgICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICAgIHBsdWdpbklkOiBkZXBlbmRlbmN5LnBsdWdpbklkLFxuICAgICAgICAgICAgcGx1Z2luTmFtZTogZGVwZW5kZW5jeS5wbHVnaW5OYW1lLFxuICAgICAgICAgICAgcGx1Z2luTm90aWNlQ29tcG9uZW50OiB0aGlzLnBsdWdpbk5vdGljZUNvbXBvbmVudCxcbiAgICAgICAgICAgIHJlcXVlc3RpbmdQbHVnaW5OYW1lOiB0aGlzLnBsdWdpbi5tYW5pZmVzdC5uYW1lXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKTtcblxuICAgICAgLy8gVGhlIGxpbmsgT1VUIHRvIHRoZSBkZXBlbmRlbmN5J3Mgb3duIHNldHRpbmdzLCBzaG93biBvbmx5IG9uY2UgaXQgaXMgaW5zdGFsbGVkIGFuZCBlbmFibGVkIOKAlCB0aGVcbiAgICAgIC8vIG90aGVyIGhhbGYgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZWluZyB2aXNpYmxlIGZyb20gYm90aCBlbmRzLiBJdCBpcyB3aGF0IHN0b3BzIFwiY29uZmlndXJlIG9uZVxuICAgICAgLy8gb3BlcmF0aW9uIGFjcm9zcyB0d28gcGx1Z2luc1wiIGZyb20gbWVhbmluZyBcImdvIGFuZCBmaW5kIHRoZSBvdGhlciBwbHVnaW4geW91cnNlbGZcIi5cbiAgICAgIHRoaXMucmVuZGVyT3BlblNldHRpbmdzQnV0dG9uKGJhbm5lckVsLCBkZXBlbmRlbmN5LnBsdWdpbklkLCBkZXBlbmRlbmN5LnBsdWdpbk5hbWUpO1xuICAgIH1cblxuICAgIGlmIChibG9ja2luZ0NvbmZsaWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luQ29uZmxpY3Quc2V0dGluZ3NIZWFkaW5nKSB9KTtcblxuICAgIGZvciAoY29uc3QgY29uZmxpY3Qgb2YgYmxvY2tpbmdDb25mbGljdHMpIHtcbiAgICAgIHRoaXMucmVuZGVyQ29uZmxpY3RFbnRyeShjb250YWluZXJFbCwgY29uZmxpY3QsIHRoaXMuY3JlYXRlQ29uZmxpY3RCbG9ja2VkTWVzc2FnZShjb25mbGljdCkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIG9uZSBjb25mbGljdDogd2hhdCBpdCBpcywgd2h5IGl0IG1hdHRlcnMsIGFuZCB0aGUgdHdvIHdheXMgb3V0IG9mIGl0LlxuICAgKlxuICAgKiBUaGUgcmVwYWlyIGlzIG9mZmVyZWQgb24gdGhlIE9USEVSIHBsdWdpbiDigJQgZGlzYWJsaW5nIGl0IGlzIHRoZSBvbmUgdGhpbmcgdGhpcyBwbHVnaW4gY2FuIGRvIGluIGFcbiAgICogY2xpY2ssIHNpbmNlIGl0IGNhbm5vdCB1cGRhdGUgc29tZW9uZSBlbHNlJ3MgcGx1Z2luIOKAlCBhbmQgaXQgaXMgdGhlIHBlcnNpc3RlZCBgZGlzYWJsZVBsdWdpbkFuZFNhdmVgXG4gICAqIHJhdGhlciB0aGFuIHRoZSB0cmFuc2llbnQgZGlzYWJsZSwgYmVjYXVzZSB0aGUgdXNlciBhc2tlZCBmb3IgaXQgYnkgY2xpY2tpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBjb250YWluZXJFbCAtIFRoZSBlbGVtZW50IHRvIHJlbmRlciBpbnRvLlxuICAgKiBAcGFyYW0gY29uZmxpY3QgLSBUaGUgY29uZmxpY3QgdG8gcmVuZGVyLlxuICAgKiBAcGFyYW0gbWVzc2FnZUZyYWdtZW50IC0gVGhlIHNlbnRlbmNlIGV4cGxhaW5pbmcgdGhlIGNvbmZsaWN0LlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDb25mbGljdEVudHJ5KGNvbnRhaW5lckVsOiBIVE1MRWxlbWVudCwgY29uZmxpY3Q6IFBsdWdpbkNvbmZsaWN0LCBtZXNzYWdlRnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBjb25zdCBiYW5uZXJFbCA9IGNvbnRhaW5lckVsLmNyZWF0ZURpdih7XG4gICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luQ29uZmxpY3RCYW5uZXJdXG4gICAgfSk7XG4gICAgYmFubmVyRWwuYXBwZW5kKG1lc3NhZ2VGcmFnbWVudCk7XG4gICAgYXBwZW5kVGV4dE9yRnJhZ21lbnRDbG9uZShiYW5uZXJFbC5jcmVhdGVEaXYoKSwgY29uZmxpY3QucmVhc29uKTtcblxuICAgIG5ldyBCdXR0b25Db21wb25lbnQoYmFubmVyRWwpXG4gICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLnBsdWdpbkNvbmZsaWN0LmRpc2FibGUsIHsgY29uZmxpY3RpbmdQbHVnaW5OYW1lOiBjb25mbGljdC5wbHVnaW5OYW1lIH0pKVxuICAgICAgLnNldEN0YSgpXG4gICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBkaXNhYmxlQ29tbXVuaXR5UGx1Z2luKHtcbiAgICAgICAgICBhcHA6IHRoaXMuYXBwLFxuICAgICAgICAgIHBsdWdpbklkOiBjb25mbGljdC5wbHVnaW5JZFxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoKCk7XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLnJlbmRlck9wZW5TZXR0aW5nc0J1dHRvbihiYW5uZXJFbCwgY29uZmxpY3QucGx1Z2luSWQsIGNvbmZsaWN0LnBsdWdpbk5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJPcGVuU2V0dGluZ3NCdXR0b24oYmFubmVyRWw6IEhUTUxFbGVtZW50LCBwbHVnaW5JZDogc3RyaW5nLCBwbHVnaW5OYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJhbm5lckVsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5Lm9wZW5EZXBlbmRlbmN5U2V0dGluZ3MsIHtcbiAgICAgICAgZGVwZW5kZW5jeVBsdWdpbk5hbWU6IHBsdWdpbk5hbWVcbiAgICAgIH0pKVxuICAgICAgLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgICBvcGVuU2V0dGluZ1RhYih7XG4gICAgICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgICAgICB0YWJJZDogcGx1Z2luSWRcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd0Jsb2NrZWRTZXR0aW5nVGFiKFxuICAgIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzOiByZWFkb25seSBQbHVnaW5EZXBlbmRlbmN5W10sXG4gICAgYmxvY2tpbmdDb25mbGljdHM6IHJlYWRvbmx5IFBsdWdpbkNvbmZsaWN0W11cbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYmxvY2tlZFNldHRpbmdUYWIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBBZGRlZCB0aHJvdWdoIGBhcHAuc2V0dGluZ2AgcmF0aGVyIHRoYW4gYHBsdWdpbi5hZGRTZXR0aW5nVGFiYCwgYmVjYXVzZSB0aGlzIHRhYiBoYXMgdG8gY29tZSBiYWNrXG4gICAgLy8gT0ZGIGFnYWluIHRoZSBtb21lbnQgdGhlIGdhdGUgb3BlbnMg4oCUIG90aGVyd2lzZSB0aGUgcGx1Z2luJ3Mgb3duIHNldHRpbmdzIHRhYiwgcmVnaXN0ZXJlZCBieVxuICAgIC8vIGBvbmxvYWRJbXBsYCwgd291bGQgYXBwZWFyIGJlc2lkZSBhIHN0YWxlIFwicmVxdWlyZWQgcGx1Z2luIG1pc3NpbmdcIiBvbmUuIGBwbHVnaW4uYWRkU2V0dGluZ1RhYmBcbiAgICAvLyBvbmx5IGV2ZXIgcmVtb3ZlcyBhdCBwbHVnaW4gdW5sb2FkLlxuICAgIGNvbnN0IGJsb2NrZWRTZXR0aW5nVGFiID0gbmV3IEJsb2NrZWRQbHVnaW5TZXR0aW5nVGFiKHtcbiAgICAgIHBsdWdpbjogdGhpcy5wbHVnaW4sXG4gICAgICByZW5kZXJCYW5uZXI6IChjb250YWluZXJFbCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlckJsb2NrZWRCYW5uZXIoY29udGFpbmVyRWwsIHVuc2F0aXNmaWVkRGVwZW5kZW5jaWVzLCBibG9ja2luZ0NvbmZsaWN0cyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5hcHAuc2V0dGluZy5hZGRTZXR0aW5nVGFiKGJsb2NrZWRTZXR0aW5nVGFiKTtcbiAgICB0aGlzLmJsb2NrZWRTZXR0aW5nVGFiID0gYmxvY2tlZFNldHRpbmdUYWI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMEZBLG1CQUFtQztBQUNuQyw4QkFHTztBQUNQLHNCQUdPO0FBU1AsK0JBQXVDO0FBQ3ZDLHVCQUF5QjtBQUN6QiwwQkFJTztBQUNQLGtCQUFrQjtBQUNsQix3QkFHTztBQUNQLGtDQU1PO0FBQ1AscUNBR087QUFDUCw0QkFBK0I7QUFDL0Isb0NBQW1DO0FBQ25DLDBCQUE0QjtBQUM1QixvQ0FBNkM7QUFRN0MsTUFBTSxpREFBaUQ7QUFLaEQsSUFBSyx5QkFBTCxrQkFBS0EsNEJBQUw7QUFPTCxFQUFBQSx3QkFBQSxXQUFRO0FBUVIsRUFBQUEsd0JBQUEsVUFBTztBQWZHLFNBQUFBO0FBQUEsR0FBQTtBQTBLWixNQUFNLGdDQUFnQyxpQ0FBaUI7QUFBQSxFQUNwQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsVUFBTSxP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QUFDLE1BQU0sRUFBRSxZQUFZLGVBQWUsU0FBUyxFQUFFLHVCQUF1QixTQUFTLFdBQVcsQ0FBQyxDQUFDLEVBQzVHLE9BQU8sRUFDUCxZQUFRLGlDQUFtQixZQUFZO0FBQ3RDLGdCQUFNLGlEQUF1QjtBQUFBLFFBQzNCLEtBQUssS0FBSztBQUFBLFFBQ1YsVUFBVSxTQUFTO0FBQUEsTUFDckIsQ0FBQztBQUNELFlBQU0sS0FBSyxRQUFRO0FBQUEsSUFDckIsQ0FBQyxDQUFDO0FBRUosU0FBSyx5QkFBeUIsVUFBVSxTQUFTLFVBQVUsU0FBUyxVQUFVO0FBQUEsRUFDaEY7QUFBQSxFQUVRLHlCQUF5QixVQUF1QixVQUFrQixZQUEwQjtBQUNsRyxRQUFJLGdDQUFnQixRQUFRLEVBQ3pCLGtCQUFjLGVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxpQkFBaUIsd0JBQXdCO0FBQUEsTUFDN0Usc0JBQXNCO0FBQUEsSUFDeEIsQ0FBQyxDQUFDLEVBQ0QsUUFBUSxNQUFNO0FBQ2IsZ0RBQWU7QUFBQSxRQUNiLEtBQUssS0FBSztBQUFBLFFBQ1YsT0FBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0w7QUFBQSxFQUVRLHNCQUNOLHlCQUNBLG1CQUNNO0FBQ04sUUFBSSxLQUFLLG1CQUFtQjtBQUMxQjtBQUFBLElBQ0Y7QUFNQSxVQUFNLG9CQUFvQixJQUFJLHdCQUF3QjtBQUFBLE1BQ3BELFFBQVEsS0FBSztBQUFBLE1BQ2IsY0FBYyxDQUFDLGdCQUFzQjtBQUNuQyxhQUFLLG9CQUFvQixhQUFhLHlCQUF5QixpQkFBaUI7QUFBQSxNQUNsRjtBQUFBLElBQ0YsQ0FBQztBQUNELFNBQUssSUFBSSxRQUFRLGNBQWMsaUJBQWlCO0FBQ2hELFNBQUssb0JBQW9CO0FBQUEsRUFDM0I7QUFDRjsiLCJuYW1lcyI6WyJQbHVnaW5Db25mbGljdFNldmVyaXR5IiwiY29tcGFyZVZlcnNpb25zIiwic2F0aXNmaWVzVmVyc2lvbiJdfQ==