obsidian-dev-utils 22.1.1-beta.2 → 22.1.1-beta.21

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 (135) hide show
  1. package/CHANGELOG.md +113 -0
  2. package/dist/dprint.json +1 -0
  3. package/dist/lib/cjs/Async.cjs +1 -1
  4. package/dist/lib/cjs/Async.d.cts +17 -17
  5. package/dist/lib/cjs/Library.cjs +1 -1
  6. package/dist/lib/cjs/Object.cjs +38 -3
  7. package/dist/lib/cjs/Object.d.cts +16 -6
  8. package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +7 -8
  9. package/dist/lib/cjs/ScriptUtils/CliUtils.d.cts +11 -10
  10. package/dist/lib/cjs/ScriptUtils/Exec.cjs +1 -1
  11. package/dist/lib/cjs/ScriptUtils/Exec.d.cts +2 -2
  12. package/dist/lib/cjs/ScriptUtils/Root.cjs +1 -1
  13. package/dist/lib/cjs/ScriptUtils/Root.d.cts +2 -2
  14. package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
  15. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.cjs +1 -1
  16. package/dist/lib/cjs/ScriptUtils/esbuild/Dependency.d.cts +2 -2
  17. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.cjs +1 -1
  18. package/dist/lib/cjs/ScriptUtils/esbuild/ObsidianPluginBuilder.d.cts +2 -2
  19. package/dist/lib/cjs/ScriptUtils/spellcheck.cjs +1 -1
  20. package/dist/lib/cjs/ScriptUtils/spellcheck.d.cts +2 -2
  21. package/dist/lib/cjs/ScriptUtils/version.cjs +1 -1
  22. package/dist/lib/cjs/ScriptUtils/version.d.cts +2 -2
  23. package/dist/lib/cjs/String.cjs +1 -1
  24. package/dist/lib/cjs/String.d.cts +2 -1
  25. package/dist/lib/cjs/Transformers/Transformer.cjs +9 -2
  26. package/dist/lib/cjs/Type.cjs +24 -0
  27. package/dist/lib/cjs/Type.d.cts +12 -0
  28. package/dist/lib/cjs/index.cjs +4 -1
  29. package/dist/lib/cjs/index.d.cts +1 -0
  30. package/dist/lib/cjs/obsidian/Backlink.cjs +1 -1
  31. package/dist/lib/cjs/obsidian/Backlink.d.cts +1 -1
  32. package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
  33. package/dist/lib/cjs/obsidian/Callout.d.cts +2 -1
  34. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.cjs +29 -2
  35. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.d.cts +20 -1
  36. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.cjs +60 -0
  37. package/dist/lib/cjs/obsidian/Components/TextBasedComponent.d.cts +30 -0
  38. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.cjs +27 -3
  39. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.d.cts +19 -1
  40. package/dist/lib/cjs/obsidian/Components/index.cjs +4 -1
  41. package/dist/lib/cjs/obsidian/Components/index.d.cts +1 -0
  42. package/dist/lib/cjs/obsidian/Dataview.cjs +1 -1
  43. package/dist/lib/cjs/obsidian/Dataview.d.cts +3 -3
  44. package/dist/lib/cjs/obsidian/DataviewLink.cjs +1 -1
  45. package/dist/lib/cjs/obsidian/DataviewLink.d.cts +2 -2
  46. package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
  47. package/dist/lib/cjs/obsidian/FileManager.d.cts +2 -1
  48. package/dist/lib/cjs/obsidian/Link.cjs +1 -1
  49. package/dist/lib/cjs/obsidian/Link.d.cts +4 -3
  50. package/dist/lib/cjs/obsidian/Markdown.cjs +5 -8
  51. package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +1 -1
  52. package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +2 -1
  53. package/dist/lib/cjs/obsidian/MonkeyAround.cjs +1 -1
  54. package/dist/lib/cjs/obsidian/MonkeyAround.d.cts +2 -2
  55. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +42 -4
  56. package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +24 -5
  57. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +203 -62
  58. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +55 -21
  59. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +33 -20
  60. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +20 -17
  61. package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +75 -75
  62. package/dist/lib/cjs/obsidian/ValidationMessage.cjs +38 -0
  63. package/dist/lib/cjs/obsidian/ValidationMessage.d.cts +16 -0
  64. package/dist/lib/cjs/obsidian/Vault.cjs +1 -1
  65. package/dist/lib/cjs/obsidian/Vault.d.cts +1 -1
  66. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  67. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  68. package/dist/lib/esm/Async.d.mts +17 -17
  69. package/dist/lib/esm/Async.mjs +1 -1
  70. package/dist/lib/esm/Library.mjs +1 -1
  71. package/dist/lib/esm/Object.d.mts +16 -6
  72. package/dist/lib/esm/Object.mjs +36 -3
  73. package/dist/lib/esm/ScriptUtils/CliUtils.d.mts +11 -10
  74. package/dist/lib/esm/ScriptUtils/CliUtils.mjs +7 -8
  75. package/dist/lib/esm/ScriptUtils/Exec.d.mts +2 -2
  76. package/dist/lib/esm/ScriptUtils/Exec.mjs +1 -1
  77. package/dist/lib/esm/ScriptUtils/Root.d.mts +2 -2
  78. package/dist/lib/esm/ScriptUtils/Root.mjs +1 -1
  79. package/dist/lib/esm/ScriptUtils/cli.mjs +1 -1
  80. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.d.mts +2 -2
  81. package/dist/lib/esm/ScriptUtils/esbuild/Dependency.mjs +1 -1
  82. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.d.mts +2 -2
  83. package/dist/lib/esm/ScriptUtils/esbuild/ObsidianPluginBuilder.mjs +1 -1
  84. package/dist/lib/esm/ScriptUtils/spellcheck.d.mts +2 -2
  85. package/dist/lib/esm/ScriptUtils/spellcheck.mjs +1 -1
  86. package/dist/lib/esm/ScriptUtils/version.d.mts +2 -2
  87. package/dist/lib/esm/ScriptUtils/version.mjs +1 -1
  88. package/dist/lib/esm/String.d.mts +2 -1
  89. package/dist/lib/esm/String.mjs +1 -1
  90. package/dist/lib/esm/Transformers/Transformer.mjs +9 -2
  91. package/dist/lib/esm/Type.d.mts +12 -0
  92. package/dist/lib/esm/Type.mjs +8 -0
  93. package/dist/lib/esm/index.d.mts +1 -0
  94. package/dist/lib/esm/index.mjs +3 -1
  95. package/dist/lib/esm/obsidian/Backlink.d.mts +1 -1
  96. package/dist/lib/esm/obsidian/Backlink.mjs +1 -1
  97. package/dist/lib/esm/obsidian/Callout.d.mts +2 -1
  98. package/dist/lib/esm/obsidian/Callout.mjs +1 -1
  99. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.d.mts +20 -1
  100. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.mjs +29 -2
  101. package/dist/lib/esm/obsidian/Components/TextBasedComponent.d.mts +30 -0
  102. package/dist/lib/esm/obsidian/Components/TextBasedComponent.mjs +36 -0
  103. package/dist/lib/esm/obsidian/Components/TypedTextComponent.d.mts +19 -1
  104. package/dist/lib/esm/obsidian/Components/TypedTextComponent.mjs +27 -3
  105. package/dist/lib/esm/obsidian/Components/index.d.mts +1 -0
  106. package/dist/lib/esm/obsidian/Components/index.mjs +3 -1
  107. package/dist/lib/esm/obsidian/Dataview.d.mts +3 -3
  108. package/dist/lib/esm/obsidian/Dataview.mjs +1 -1
  109. package/dist/lib/esm/obsidian/DataviewLink.d.mts +2 -2
  110. package/dist/lib/esm/obsidian/DataviewLink.mjs +1 -1
  111. package/dist/lib/esm/obsidian/FileManager.d.mts +2 -1
  112. package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
  113. package/dist/lib/esm/obsidian/Link.d.mts +4 -3
  114. package/dist/lib/esm/obsidian/Link.mjs +1 -1
  115. package/dist/lib/esm/obsidian/Markdown.mjs +5 -8
  116. package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +2 -1
  117. package/dist/lib/esm/obsidian/Modals/Prompt.mjs +1 -1
  118. package/dist/lib/esm/obsidian/MonkeyAround.d.mts +2 -2
  119. package/dist/lib/esm/obsidian/MonkeyAround.mjs +1 -1
  120. package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +24 -5
  121. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +42 -4
  122. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +55 -21
  123. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +203 -63
  124. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +20 -17
  125. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +36 -20
  126. package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +75 -75
  127. package/dist/lib/esm/obsidian/ValidationMessage.d.mts +16 -0
  128. package/dist/lib/esm/obsidian/ValidationMessage.mjs +14 -0
  129. package/dist/lib/esm/obsidian/Vault.d.mts +1 -1
  130. package/dist/lib/esm/obsidian/Vault.mjs +1 -1
  131. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  132. package/dist/lib/esm/obsidian/index.mjs +3 -1
  133. package/obsidian/Components/TextBasedComponent/package.json +6 -0
  134. package/obsidian/ValidationMessage/package.json +6 -0
  135. package/package.json +4 -4
@@ -52,10 +52,13 @@ class PluginBase extends import_obsidian.Plugin {
52
52
  return this.settingsManager.safeSettings;
53
53
  }
54
54
  get settingsManager() {
55
+ if (!this._settingsManager) {
56
+ throw new Error("Settings manager not defined");
57
+ }
55
58
  return this._settingsManager;
56
59
  }
57
60
  _abortSignal;
58
- _settingsManager;
61
+ _settingsManager = null;
59
62
  notice;
60
63
  /**
61
64
  * Logs a message to the console.
@@ -104,11 +107,46 @@ class PluginBase extends import_obsidian.Plugin {
104
107
  this.app.workspace.onLayoutReady(this.onLayoutReady.bind(this));
105
108
  }, 0);
106
109
  }
110
+ /**
111
+ * Called when the plugin settings are loaded or reloaded.
112
+ *
113
+ * @param _settings - The settings.
114
+ * @returns A promise or `void` indicating the completion of the save process
115
+ */
116
+ onLoadSettings(_settings) {
117
+ (0, import_Function.noop)();
118
+ }
119
+ /**
120
+ * Called when the plugin settings are saved.
121
+ *
122
+ * @param _newSettings - The new settings.
123
+ * @param _oldSettings - The old settings.
124
+ * @returns A promise or `void` indicating the completion of the save process
125
+ */
126
+ onSaveSettings(_newSettings, _oldSettings) {
127
+ (0, import_Function.noop)();
128
+ }
129
+ /**
130
+ * Creates a plugin settings tab.
131
+ *
132
+ * @returns The settings tab or null if not applicable.
133
+ */
134
+ createPluginSettingsTab() {
135
+ return null;
136
+ }
137
+ /**
138
+ * Creates the plugin settings manager. This method must be implemented by subclasses.
139
+ *
140
+ * @returns The plugin settings manager.
141
+ */
142
+ createSettingsManager() {
143
+ return null;
144
+ }
107
145
  /**
108
146
  * Called when the layout is ready. This method can be overridden by subclasses to perform actions once
109
147
  * the layout is ready.
110
148
  *
111
- * @returns A promise or void indicating the completion of the layout setup.
149
+ * @returns A promise or `void` indicating the completion of the layout setup.
112
150
  */
113
151
  onLayoutReady() {
114
152
  (0, import_Function.noop)();
@@ -117,7 +155,7 @@ class PluginBase extends import_obsidian.Plugin {
117
155
  * Called when the plugin loading is complete. This method must be implemented by subclasses to perform
118
156
  * any additional setup required after loading is complete.
119
157
  *
120
- * @returns A promise or void indicating the completion of the load process.
158
+ * @returns A promise or `void` indicating the completion of the load process.
121
159
  */
122
160
  onloadComplete() {
123
161
  (0, import_Function.noop)();
@@ -139,4 +177,4 @@ ${message}`);
139
177
  0 && (module.exports = {
140
178
  PluginBase
141
179
  });
142
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5CYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBQbHVnaW5CYXNlXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHByb3ZpZGluZyB1dGlsaXR5IG1ldGhvZHMgZm9yIHNldHRpbmdzIG1hbmFnZW1lbnQsIGVycm9yIGhhbmRsaW5nLCBhbmQgbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBUaGlzIGNsYXNzIHNpbXBsaWZpZXMgdGhlIHByb2Nlc3Mgb2YgbWFuYWdpbmcgcGx1Z2luIHNldHRpbmdzLCBkaXNwbGF5aW5nIG5vdGlmaWNhdGlvbnMsIGFuZCBoYW5kbGluZyBlcnJvcnMuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgbWV0aG9kcyB0byBjcmVhdGUgZGVmYXVsdCBzZXR0aW5ncyBhbmQgc2V0dGluZ3MgdGFicywgYW5kIGNvbXBsZXRlIHBsdWdpbi1zcGVjaWZpY1xuICogbG9hZGluZyB0YXNrcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBOb3RpY2UsXG4gIFBsdWdpblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldERlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vRGVidWcudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0Vycm9yRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vRXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGluaXRQbHVnaW5Db250ZXh0IH0gZnJvbSAnLi9QbHVnaW5Db250ZXh0LnRzJztcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2UgfSBmcm9tICcuL1BsdWdpblNldHRpbmdzTWFuYWdlckJhc2UudHMnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIE9ic2lkaWFuIHBsdWdpbnMgd2l0aCBidWlsdC1pbiBzdXBwb3J0IGZvciBzZXR0aW5ncyBtYW5hZ2VtZW50LCBlcnJvciBoYW5kbGluZywgYW5kIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IGV4dGVuZHMgUGx1Z2luIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIEFib3J0U2lnbmFsIHVzZWQgZm9yIGFib3J0aW5nIGxvbmctcnVubmluZyBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgYWJvcnQgc2lnbmFsLlxuICAgKi9cbiAgcHVibGljIGdldCBhYm9ydFNpZ25hbCgpOiBBYm9ydFNpZ25hbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Fib3J0U2lnbmFsO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJlYWRvbmx5IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJlYWRvbmx5IHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3MoKTogUmVhZG9ubHlEZWVwPFBsdWdpblNldHRpbmdzPiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3NNYW5hZ2VyLnNhZmVTZXR0aW5ncztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2V0dGluZ3NNYW5hZ2VyKCk6IFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWJvcnRTaWduYWwhOiBBYm9ydFNpZ25hbDtcblxuICBwcml2YXRlIF9zZXR0aW5nc01hbmFnZXIhOiBQbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlPFBsdWdpblNldHRpbmdzPjtcblxuICBwcml2YXRlIG5vdGljZT86IE5vdGljZTtcblxuICAvKipcbiAgICogTG9ncyBhIG1lc3NhZ2UgdG8gdGhlIGNvbnNvbGUuXG4gICAqXG4gICAqIFVzZSBpbnN0ZWFkIG9mIGBjb25zb2xlLmRlYnVnKClgLlxuICAgKlxuICAgKiBUaG9zZSBtZXNzYWdlcyBhcmUgbm90IHNob3duIGJ5IGRlZmF1bHQsIGJ1dCB0aGV5IGNhbiBiZSBzaG93biBieSBlbmFibGluZyBgeW91ci1wbHVnaW4taWRgIGRlYnVnZ2VyIG5hbWVzcGFjZS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21uYW91bW92L29ic2lkaWFuLWRldi11dGlscy8/dGFiPXJlYWRtZS1vdi1maWxlI2RlYnVnZ2luZ30gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gbG9nLlxuICAgKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gbG9nLlxuICAgKi9cbiAgcHVibGljIGNvbnNvbGVEZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuICAgIC8vIFNraXAgdGhlIGBjb25zb2xlRGVidWcoKWAgY2FsbCBpdHNlbGZcbiAgICBjb25zdCBGUkFNRVNfVE9fU0tJUCA9IDE7XG4gICAgY29uc3QgX2RlYnVnZ2VyID0gZ2V0RGVidWdnZXIodGhpcy5tYW5pZmVzdC5pZCwgRlJBTUVTX1RPX1NLSVApO1xuICAgIF9kZWJ1Z2dlcihtZXNzYWdlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgY2hhbmdlLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnNldHRpbmdzTWFuYWdlci5sb2FkRnJvbUZpbGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIGlzIGxvYWRlZFxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpbml0UGx1Z2luQ29udGV4dCh0aGlzLmFwcCwgdGhpcy5tYW5pZmVzdC5pZCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyKHJlZ2lzdGVyQXN5bmNFcnJvckV2ZW50SGFuZGxlcigoKSA9PiB7XG4gICAgICB0aGlzLnNob3dOb3RpY2UoJ0FuIHVuaGFuZGxlZCBlcnJvciBvY2N1cnJlZC4gUGxlYXNlIGNoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuX3NldHRpbmdzTWFuYWdlciA9IHRoaXMuY3JlYXRlU2V0dGluZ3NNYW5hZ2VyKCk7XG5cbiAgICBhd2FpdCB0aGlzLm9uRXh0ZXJuYWxTZXR0aW5nc0NoYW5nZSgpO1xuICAgIGNvbnN0IHBsdWdpblNldHRpbmdzVGFiID0gdGhpcy5jcmVhdGVQbHVnaW5TZXR0aW5nc1RhYigpO1xuICAgIGlmIChwbHVnaW5TZXR0aW5nc1RhYikge1xuICAgICAgdGhpcy5hZGRTZXR0aW5nVGFiKHBsdWdpblNldHRpbmdzVGFiKTtcbiAgICB9XG5cbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgdGhpcy5fYWJvcnRTaWduYWwgPSBhYm9ydENvbnRyb2xsZXIuc2lnbmFsO1xuICAgIHRoaXMucmVnaXN0ZXIoKCkgPT4ge1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5vbmxvYWRDb21wbGV0ZSgpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkodGhpcy5vbkxheW91dFJlYWR5LmJpbmQodGhpcykpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBwbHVnaW4gc2V0dGluZ3MgdGFiLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5ncyB0YWIgb3IgbnVsbCBpZiBub3QgYXBwbGljYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVQbHVnaW5TZXR0aW5nc1RhYigpOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYjtcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcGx1Z2luIHNldHRpbmdzIG1hbmFnZXIuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZVNldHRpbmdzTWFuYWdlcigpOiBQbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlPFBsdWdpblNldHRpbmdzPjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGxheW91dCBpcyByZWFkeS4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBwZXJmb3JtIGFjdGlvbnMgb25jZVxuICAgKiB0aGUgbGF5b3V0IGlzIHJlYWR5LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb3Igdm9pZCBpbmRpY2F0aW5nIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBsYXlvdXQgc2V0dXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25MYXlvdXRSZWFkeSgpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBsb2FkaW5nIGlzIGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybVxuICAgKiBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBhZnRlciBsb2FkaW5nIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb3Igdm9pZCBpbmRpY2F0aW5nIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBsb2FkIHByb2Nlc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25sb2FkQ29tcGxldGUoKTogUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICovXG4gIHByb3RlY3RlZCBzaG93Tm90aWNlKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2UuaGlkZSgpO1xuICAgIH1cblxuICAgIHRoaXMubm90aWNlID0gbmV3IE5vdGljZShgJHt0aGlzLm1hbmlmZXN0Lm5hbWV9XFxuJHttZXNzYWdlfWApO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLHNCQUdPO0FBRVAsbUJBQTRCO0FBQzVCLG1CQUErQztBQUMvQyxzQkFBcUI7QUFDckIsMkJBQWtDO0FBQ2xDLHVDQUEwQztBQU9uQyxNQUFlLG1CQUEyRCx1QkFBTztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU10RixJQUFXLGNBQTJCO0FBQ3BDLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPQSxJQUFXLFdBQXlDO0FBQ2xELFdBQU8sS0FBSyxnQkFBZ0I7QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBVyxrQkFBNkQ7QUFDdEUsV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUFBLEVBRVE7QUFBQSxFQUVBO0FBQUEsRUFFQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBY0QsYUFBYSxZQUFvQixNQUF1QjtBQUU3RCxVQUFNLGlCQUFpQjtBQUN2QixVQUFNLGdCQUFZLDBCQUFZLEtBQUssU0FBUyxJQUFJLGNBQWM7QUFDOUQsY0FBVSxTQUFTLEdBQUcsSUFBSTtBQUFBLEVBQzVCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxNQUFzQiwyQkFBMEM7QUFDOUQsVUFBTSxLQUFLLGdCQUFnQixhQUFhO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLE1BQXNCLFNBQXdCO0FBQzVDLGdEQUFrQixLQUFLLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFFNUMsU0FBSyxhQUFTLDZDQUErQixNQUFNO0FBQ2pELFdBQUssV0FBVyw2RUFBNkU7QUFBQSxJQUMvRixDQUFDLENBQUM7QUFFRixTQUFLLG1CQUFtQixLQUFLLHNCQUFzQjtBQUVuRCxVQUFNLEtBQUsseUJBQXlCO0FBQ3BDLFVBQU0sb0JBQW9CLEtBQUssd0JBQXdCO0FBQ3ZELFFBQUksbUJBQW1CO0FBQ3JCLFdBQUssY0FBYyxpQkFBaUI7QUFBQSxJQUN0QztBQUVBLFVBQU0sa0JBQWtCLElBQUksZ0JBQWdCO0FBQzVDLFNBQUssZUFBZSxnQkFBZ0I7QUFDcEMsU0FBSyxTQUFTLE1BQU07QUFDbEIsc0JBQWdCLE1BQU07QUFBQSxJQUN4QixDQUFDO0FBQ0QsVUFBTSxLQUFLLGVBQWU7QUFDMUIsZUFBVyxNQUFNO0FBQ2YsV0FBSyxJQUFJLFVBQVUsY0FBYyxLQUFLLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFBQSxJQUNoRSxHQUFHLENBQUM7QUFBQSxFQUNOO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFzQlUsZ0JBQWtDO0FBQzFDLDhCQUFLO0FBQUEsRUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUVUsaUJBQW1DO0FBQzNDLDhCQUFLO0FBQUEsRUFDUDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9VLFdBQVcsU0FBdUI7QUFDMUMsUUFBSSxLQUFLLFFBQVE7QUFDZixXQUFLLE9BQU8sS0FBSztBQUFBLElBQ25CO0FBRUEsU0FBSyxTQUFTLElBQUksdUJBQU8sR0FBRyxLQUFLLFNBQVMsSUFBSTtBQUFBLEVBQUssT0FBTyxFQUFFO0FBQUEsRUFDOUQ7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
180
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5CYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBQbHVnaW5CYXNlXG4gKiBCYXNlIGNsYXNzIGZvciBPYnNpZGlhbiBwbHVnaW5zIHByb3ZpZGluZyB1dGlsaXR5IG1ldGhvZHMgZm9yIHNldHRpbmdzIG1hbmFnZW1lbnQsIGVycm9yIGhhbmRsaW5nLCBhbmQgbm90aWZpY2F0aW9ucy5cbiAqXG4gKiBUaGlzIGNsYXNzIHNpbXBsaWZpZXMgdGhlIHByb2Nlc3Mgb2YgbWFuYWdpbmcgcGx1Z2luIHNldHRpbmdzLCBkaXNwbGF5aW5nIG5vdGlmaWNhdGlvbnMsIGFuZCBoYW5kbGluZyBlcnJvcnMuXG4gKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgbWV0aG9kcyB0byBjcmVhdGUgZGVmYXVsdCBzZXR0aW5ncyBhbmQgc2V0dGluZ3MgdGFicywgYW5kIGNvbXBsZXRlIHBsdWdpbi1zcGVjaWZpY1xuICogbG9hZGluZyB0YXNrcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7XG4gIFByb21pc2FibGUsXG4gIFJlYWRvbmx5RGVlcFxufSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBOb3RpY2UsXG4gIFBsdWdpblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldERlYnVnZ2VyIH0gZnJvbSAnLi4vLi4vRGVidWcudHMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBc3luY0Vycm9yRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi4vLi4vRXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGluaXRQbHVnaW5Db250ZXh0IH0gZnJvbSAnLi9QbHVnaW5Db250ZXh0LnRzJztcbmltcG9ydCB7IFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2UgfSBmcm9tICcuL1BsdWdpblNldHRpbmdzTWFuYWdlckJhc2UudHMnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIE9ic2lkaWFuIHBsdWdpbnMgd2l0aCBidWlsdC1pbiBzdXBwb3J0IGZvciBzZXR0aW5ncyBtYW5hZ2VtZW50LCBlcnJvciBoYW5kbGluZywgYW5kIG5vdGlmaWNhdGlvbnMuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3QgPSBvYmplY3Q+IGV4dGVuZHMgUGx1Z2luIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIFVzZWQgb25seSBmb3IgdHlwZSBpbmZlcmVuY2UuIERvbid0IHVzZSBpdCBkaXJlY3RseS5cbiAgICovXG4gIGRlY2xhcmUgcHVibGljIF9fcGx1Z2luU2V0dGluZ3NUeXBlOiBQbHVnaW5TZXR0aW5ncztcblxuICAvKipcbiAgICogR2V0cyB0aGUgQWJvcnRTaWduYWwgdXNlZCBmb3IgYWJvcnRpbmcgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBhYm9ydCBzaWduYWwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGFib3J0U2lnbmFsKCk6IEFib3J0U2lnbmFsIHtcbiAgICByZXR1cm4gdGhpcy5fYWJvcnRTaWduYWw7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcmVhZG9ubHkgcGx1Z2luIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmVhZG9ubHkgcGx1Z2luIHNldHRpbmdzLlxuICAgKi9cbiAgcHVibGljIGdldCBzZXR0aW5ncygpOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZXR0aW5nc01hbmFnZXIuc2FmZVNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXR0aW5nc01hbmFnZXIoKTogUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIGlmICghdGhpcy5fc2V0dGluZ3NNYW5hZ2VyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NldHRpbmdzIG1hbmFnZXIgbm90IGRlZmluZWQnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfYWJvcnRTaWduYWwhOiBBYm9ydFNpZ25hbDtcblxuICBwcml2YXRlIF9zZXR0aW5nc01hbmFnZXI6IG51bGwgfCBQbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlPFBsdWdpblNldHRpbmdzPiA9IG51bGw7XG5cbiAgcHJpdmF0ZSBub3RpY2U/OiBOb3RpY2U7XG5cbiAgLyoqXG4gICAqIExvZ3MgYSBtZXNzYWdlIHRvIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBVc2UgaW5zdGVhZCBvZiBgY29uc29sZS5kZWJ1ZygpYC5cbiAgICpcbiAgICogVGhvc2UgbWVzc2FnZXMgYXJlIG5vdCBzaG93biBieSBkZWZhdWx0LCBidXQgdGhleSBjYW4gYmUgc2hvd24gYnkgZW5hYmxpbmcgYHlvdXItcGx1Z2luLWlkYCBkZWJ1Z2dlciBuYW1lc3BhY2UuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvP3RhYj1yZWFkbWUtb3YtZmlsZSNkZWJ1Z2dpbmd9IGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGxvZy5cbiAgICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIGxvZy5cbiAgICovXG4gIHB1YmxpYyBjb25zb2xlRGVidWcobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICAvLyBTa2lwIHRoZSBgY29uc29sZURlYnVnKClgIGNhbGwgaXRzZWxmXG4gICAgY29uc3QgRlJBTUVTX1RPX1NLSVAgPSAxO1xuICAgIGNvbnN0IF9kZWJ1Z2dlciA9IGdldERlYnVnZ2VyKHRoaXMubWFuaWZlc3QuaWQsIEZSQU1FU19UT19TS0lQKTtcbiAgICBfZGVidWdnZXIobWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGV4dGVybmFsIHNldHRpbmdzIGNoYW5nZS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zZXR0aW5nc01hbmFnZXIubG9hZEZyb21GaWxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBpcyBsb2FkZWRcbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaW5pdFBsdWdpbkNvbnRleHQodGhpcy5hcHAsIHRoaXMubWFuaWZlc3QuaWQpO1xuXG4gICAgdGhpcy5yZWdpc3RlcihyZWdpc3RlckFzeW5jRXJyb3JFdmVudEhhbmRsZXIoKCkgPT4ge1xuICAgICAgdGhpcy5zaG93Tm90aWNlKCdBbiB1bmhhbmRsZWQgZXJyb3Igb2NjdXJyZWQuIFBsZWFzZSBjaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLl9zZXR0aW5nc01hbmFnZXIgPSB0aGlzLmNyZWF0ZVNldHRpbmdzTWFuYWdlcigpO1xuXG4gICAgYXdhaXQgdGhpcy5vbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UoKTtcbiAgICBjb25zdCBwbHVnaW5TZXR0aW5nc1RhYiA9IHRoaXMuY3JlYXRlUGx1Z2luU2V0dGluZ3NUYWIoKTtcbiAgICBpZiAocGx1Z2luU2V0dGluZ3NUYWIpIHtcbiAgICAgIHRoaXMuYWRkU2V0dGluZ1RhYihwbHVnaW5TZXR0aW5nc1RhYik7XG4gICAgfVxuXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHRoaXMuX2Fib3J0U2lnbmFsID0gYWJvcnRDb250cm9sbGVyLnNpZ25hbDtcbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgIH0pO1xuICAgIGF3YWl0IHRoaXMub25sb2FkQ29tcGxldGUoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vbkxheW91dFJlYWR5KHRoaXMub25MYXlvdXRSZWFkeS5iaW5kKHRoaXMpKTtcbiAgICB9LCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBsb2FkZWQgb3IgcmVsb2FkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBfc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvciBgdm9pZGAgaW5kaWNhdGluZyB0aGUgY29tcGxldGlvbiBvZiB0aGUgc2F2ZSBwcm9jZXNzXG4gICAqL1xuICBwdWJsaWMgb25Mb2FkU2V0dGluZ3MoX3NldHRpbmdzOiBQbHVnaW5TZXR0aW5ncyk6IFByb21pc2FibGU8dm9pZD4ge1xuICAgIG5vb3AoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgcGx1Z2luIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICpcbiAgICogQHBhcmFtIF9uZXdTZXR0aW5ncyAtIFRoZSBuZXcgc2V0dGluZ3MuXG4gICAqIEBwYXJhbSBfb2xkU2V0dGluZ3MgLSBUaGUgb2xkIHNldHRpbmdzLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb3IgYHZvaWRgIGluZGljYXRpbmcgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHNhdmUgcHJvY2Vzc1xuICAgKi9cbiAgcHVibGljIG9uU2F2ZVNldHRpbmdzKF9uZXdTZXR0aW5nczogUGx1Z2luU2V0dGluZ3MsIF9vbGRTZXR0aW5nczogUGx1Z2luU2V0dGluZ3MpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHBsdWdpbiBzZXR0aW5ncyB0YWIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBzZXR0aW5ncyB0YWIgb3IgbnVsbCBpZiBub3QgYXBwbGljYWJsZS5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVQbHVnaW5TZXR0aW5nc1RhYigpOiBudWxsIHwgUGx1Z2luU2V0dGluZ1RhYiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcGx1Z2luIHNldHRpbmdzIG1hbmFnZXIuIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHBsdWdpbiBzZXR0aW5ncyBtYW5hZ2VyLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVNldHRpbmdzTWFuYWdlcigpOiBudWxsIHwgUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBsYXlvdXQgaXMgcmVhZHkuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybSBhY3Rpb25zIG9uY2VcbiAgICogdGhlIGxheW91dCBpcyByZWFkeS5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIG9yIGB2b2lkYCBpbmRpY2F0aW5nIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBsYXlvdXQgc2V0dXAuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25MYXlvdXRSZWFkeSgpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBsb2FkaW5nIGlzIGNvbXBsZXRlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGVyZm9ybVxuICAgKiBhbnkgYWRkaXRpb25hbCBzZXR1cCByZXF1aXJlZCBhZnRlciBsb2FkaW5nIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb3IgYHZvaWRgIGluZGljYXRpbmcgdGhlIGNvbXBsZXRpb24gb2YgdGhlIGxvYWQgcHJvY2Vzcy5cbiAgICovXG4gIHByb3RlY3RlZCBvbmxvYWRDb21wbGV0ZSgpOiBQcm9taXNhYmxlPHZvaWQ+IHtcbiAgICBub29wKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKi9cbiAgcHJvdGVjdGVkIHNob3dOb3RpY2UobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubm90aWNlKSB7XG4gICAgICB0aGlzLm5vdGljZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpY2UgPSBuZXcgTm90aWNlKGAke3RoaXMubWFuaWZlc3QubmFtZX1cXG4ke21lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZUEsc0JBR087QUFFUCxtQkFBNEI7QUFDNUIsbUJBQStDO0FBQy9DLHNCQUFxQjtBQUNyQiwyQkFBa0M7QUFDbEMsdUNBQTBDO0FBT25DLE1BQWUsbUJBQTJELHVCQUFPO0FBQUE7QUFBQTtBQUFBO0FBQUE7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
@@ -16,6 +16,10 @@ import { PluginSettingsManagerBase } from './PluginSettingsManagerBase.cjs';
16
16
  * @typeParam PluginSettings - The type representing the plugin settings object.
17
17
  */
18
18
  export declare abstract class PluginBase<PluginSettings extends object = object> extends Plugin {
19
+ /**
20
+ * @deprecated Used only for type inference. Don't use it directly.
21
+ */
22
+ __pluginSettingsType: PluginSettings;
19
23
  /**
20
24
  * Gets the AbortSignal used for aborting long-running operations.
21
25
  *
@@ -54,29 +58,44 @@ export declare abstract class PluginBase<PluginSettings extends object = object>
54
58
  */
55
59
  onload(): Promise<void>;
56
60
  /**
57
- * Creates a plugin settings tab. This method must be implemented by subclasses.
61
+ * Called when the plugin settings are loaded or reloaded.
62
+ *
63
+ * @param _settings - The settings.
64
+ * @returns A promise or `void` indicating the completion of the save process
65
+ */
66
+ onLoadSettings(_settings: PluginSettings): Promisable<void>;
67
+ /**
68
+ * Called when the plugin settings are saved.
69
+ *
70
+ * @param _newSettings - The new settings.
71
+ * @param _oldSettings - The old settings.
72
+ * @returns A promise or `void` indicating the completion of the save process
73
+ */
74
+ onSaveSettings(_newSettings: PluginSettings, _oldSettings: PluginSettings): Promisable<void>;
75
+ /**
76
+ * Creates a plugin settings tab.
58
77
  *
59
78
  * @returns The settings tab or null if not applicable.
60
79
  */
61
- protected abstract createPluginSettingsTab(): null | PluginSettingTab;
80
+ protected createPluginSettingsTab(): null | PluginSettingTab;
62
81
  /**
63
82
  * Creates the plugin settings manager. This method must be implemented by subclasses.
64
83
  *
65
84
  * @returns The plugin settings manager.
66
85
  */
67
- protected abstract createSettingsManager(): PluginSettingsManagerBase<PluginSettings>;
86
+ protected createSettingsManager(): null | PluginSettingsManagerBase<PluginSettings>;
68
87
  /**
69
88
  * Called when the layout is ready. This method can be overridden by subclasses to perform actions once
70
89
  * the layout is ready.
71
90
  *
72
- * @returns A promise or void indicating the completion of the layout setup.
91
+ * @returns A promise or `void` indicating the completion of the layout setup.
73
92
  */
74
93
  protected onLayoutReady(): Promisable<void>;
75
94
  /**
76
95
  * Called when the plugin loading is complete. This method must be implemented by subclasses to perform
77
96
  * any additional setup required after loading is complete.
78
97
  *
79
- * @returns A promise or void indicating the completion of the load process.
98
+ * @returns A promise or `void` indicating the completion of the load process.
80
99
  */
81
100
  protected onloadComplete(): Promisable<void>;
82
101
  /**
@@ -25,11 +25,13 @@ var __copyProps = (to, from, except, desc) => {
25
25
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
26
26
  var PluginSettingsManagerBase_exports = {};
27
27
  __export(PluginSettingsManagerBase_exports, {
28
- PluginSettingsManagerBase: () => PluginSettingsManagerBase
28
+ PluginSettingsManagerBase: () => PluginSettingsManagerBase,
29
+ PluginSettingsProperty: () => PluginSettingsProperty
29
30
  });
30
31
  module.exports = __toCommonJS(PluginSettingsManagerBase_exports);
31
32
  var import_obsidian = require('obsidian');
32
33
  var import_Function = require('../../Function.cjs');
34
+ var import_Object = require('../../Object.cjs');
33
35
  var import_DateTransformer = require('../../Transformers/DateTransformer.cjs');
34
36
  var import_DurationTransformer = require('../../Transformers/DurationTransformer.cjs');
35
37
  var import_GroupTransformer = require('../../Transformers/GroupTransformer.cjs');
@@ -39,68 +41,94 @@ const defaultTransformer = new import_GroupTransformer.GroupTransformer([
39
41
  new import_DateTransformer.DateTransformer(),
40
42
  new import_DurationTransformer.DurationTransformer()
41
43
  ]);
42
- class PluginSettingsProperty {
43
- constructor(manager, property, defaultValue) {
44
- this.manager = manager;
45
- this.property = property;
46
- this.defaultValue = defaultValue;
47
- }
48
- validationMessage = "";
49
- value;
50
- clear() {
51
- this.value = void 0;
52
- this.validationMessage = "";
53
- }
54
- get() {
55
- return this.value ?? this.defaultValue;
44
+ class ProxyHandlerBase {
45
+ constructor(properties) {
46
+ this.properties = properties;
56
47
  }
57
- getSafe() {
58
- return this.validationMessage ? this.defaultValue : this.get();
48
+ get(target, prop) {
49
+ const record = target;
50
+ if (typeof prop !== "string") {
51
+ return record[prop];
52
+ }
53
+ const property = this.properties.get(prop);
54
+ if (!property) {
55
+ return record[prop];
56
+ }
57
+ return this.getPropertyValue(property);
59
58
  }
60
- async set(value) {
61
- this.value = value;
62
- if (this.value !== void 0) {
63
- this.validationMessage = await this.manager.validate(this.property, this.value) ?? "";
59
+ }
60
+ class EditableSettingsProxyHandler extends ProxyHandlerBase {
61
+ validationPromise = Promise.resolve();
62
+ set(target, prop, value) {
63
+ const record = target;
64
+ if (typeof prop !== "string") {
65
+ record[prop] = value;
66
+ return true;
67
+ }
68
+ const property = this.properties.get(prop);
69
+ if (!property) {
70
+ record[prop] = value;
71
+ return true;
64
72
  }
73
+ property.setValue(value);
74
+ this.validationPromise = this.validationPromise.then(() => property.setValueAndValidate(value));
75
+ return true;
76
+ }
77
+ getPropertyValue(property) {
78
+ return property.currentValue;
65
79
  }
66
80
  }
67
81
  class PropertiesMap extends Map {
68
- getTyped(key) {
69
- const property = super.get(key);
82
+ getTyped(propertyName) {
83
+ const property = super.get(propertyName);
70
84
  if (!property) {
71
- throw new Error(`Property ${String(key)} not found`);
85
+ throw new Error(`Property ${String(propertyName)} not found`);
72
86
  }
73
87
  return property;
74
88
  }
75
- setTyped(key, value) {
76
- return super.set(key, value);
89
+ setTyped(propertyName, value) {
90
+ return super.set(propertyName, value);
91
+ }
92
+ }
93
+ class SafeSettingsProxyHandler extends ProxyHandlerBase {
94
+ getPropertyValue(property) {
95
+ return property.safeValue;
77
96
  }
78
97
  }
79
98
  class PluginSettingsManagerBase {
80
99
  constructor(plugin) {
81
100
  this.plugin = plugin;
82
- const defaultSettings = this.createDefaultSettings();
101
+ this.app = plugin.app;
102
+ this.defaultSettings = this.createDefaultSettings();
103
+ this.addValidators();
83
104
  this.properties = new PropertiesMap();
84
- for (const key of Object.keys(defaultSettings)) {
85
- this.properties.set(key, new PluginSettingsProperty(this, key, defaultSettings[key]));
86
- }
87
- this.safeSettings = new Proxy(defaultSettings, {
88
- get: (_target, prop) => {
89
- if (typeof prop !== "string") {
90
- return void 0;
91
- }
92
- return this.properties.get(prop);
93
- }
94
- });
105
+ for (const propertyName of (0, import_Object.getAllKeys)(this.defaultSettings)) {
106
+ this.properties.set(
107
+ propertyName,
108
+ new PluginSettingsProperty(propertyName, this.defaultSettings[propertyName], this.validators.get(propertyName) ?? import_Function.noop)
109
+ );
110
+ }
111
+ this.validators.clear();
112
+ this.safeSettings = new Proxy(this.defaultSettings, new SafeSettingsProxyHandler(this.properties));
95
113
  }
114
+ app;
96
115
  safeSettings;
116
+ defaultSettings;
97
117
  properties;
98
- getProperty(property) {
99
- return this.properties.getTyped(property);
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ validators = /* @__PURE__ */ new Map();
120
+ async editAndSave(editor) {
121
+ const editableSettings = new Proxy(this.defaultSettings, new EditableSettingsProxyHandler(this.properties));
122
+ await editor(editableSettings);
123
+ await editableSettings.validationPromise;
124
+ await this.saveToFile();
125
+ }
126
+ getProperty(propertyName) {
127
+ return this.properties.getTyped(propertyName);
100
128
  }
101
129
  async loadFromFile() {
102
130
  for (const property of this.properties.values()) {
103
- property.clear();
131
+ property.reset();
104
132
  }
105
133
  const data = await this.plugin.loadData();
106
134
  if (data === void 0 || data === null) {
@@ -112,20 +140,31 @@ class PluginSettingsManagerBase {
112
140
  return;
113
141
  }
114
142
  let record = data;
143
+ const originalJson = JSON.stringify(record);
115
144
  record = this.getTransformer().transformObjectRecursively(record);
116
- await this.prepareRecord(record);
117
- for (const [key, value] of Object.entries(record)) {
118
- const propertyObj = this.properties.get(key);
119
- if (!propertyObj) {
120
- console.warn(`Unknown property: ${key}`);
145
+ await this.onLoadRecord(record);
146
+ for (const [propertyName, value] of Object.entries(record)) {
147
+ const property = this.properties.get(propertyName);
148
+ if (!property) {
149
+ console.warn(`Unknown property: ${propertyName}`);
121
150
  continue;
122
151
  }
123
- if (typeof value !== typeof propertyObj.defaultValue) {
124
- console.warn(`Invalid value type. Expected ${typeof propertyObj.defaultValue}, got: ${typeof value}`);
152
+ if (typeof value !== typeof property.defaultValue) {
153
+ console.warn("Invalid value type", {
154
+ propertyName,
155
+ propertyType: typeof property.defaultValue,
156
+ value
157
+ });
125
158
  continue;
126
159
  }
127
- await propertyObj.set(value);
160
+ await property.setValueAndValidate(value);
161
+ property.save();
162
+ }
163
+ const newJson = JSON.stringify(await this.prepareRecordToSave());
164
+ if (newJson !== originalJson) {
165
+ await this.saveToFileImpl();
128
166
  }
167
+ await this.plugin.onLoadSettings(this.getSavedSettings());
129
168
  }
130
169
  /**
131
170
  * Saves the new plugin settings.
@@ -133,29 +172,131 @@ class PluginSettingsManagerBase {
133
172
  * @returns A promise that resolves when the settings are saved.
134
173
  */
135
174
  async saveToFile() {
136
- const record = this.getTransformer().transformObjectRecursively(this.getSettings());
137
- await this.plugin.saveData(record);
175
+ const oldSettings = this.getSavedSettings();
176
+ let hasChanges = false;
177
+ for (const property of this.properties.values()) {
178
+ hasChanges ||= property.save();
179
+ }
180
+ if (!hasChanges) {
181
+ return;
182
+ }
183
+ await this.saveToFileImpl();
184
+ await this.plugin.onSaveSettings(this.getSavedSettings(), oldSettings);
185
+ }
186
+ addValidator(propertyName, validator) {
187
+ this.validators.set(propertyName, validator);
138
188
  }
139
- // eslint-disable-next-line @typescript-eslint/no-invalid-void-type
140
- async validate(_property, _value) {
141
- await (0, import_Function.noopAsync)();
189
+ addValidators() {
190
+ (0, import_Function.noop)();
142
191
  }
143
192
  getTransformer() {
144
193
  return defaultTransformer;
145
194
  }
146
- async prepareRecord(_record) {
147
- await (0, import_Function.noopAsync)();
195
+ /**
196
+ * Called when the plugin settings are loaded.
197
+ *
198
+ * @param _record - The record.
199
+ * @returns A promise or `void` indicating the completion of the load process
200
+ */
201
+ onLoadRecord(_record) {
202
+ (0, import_Function.noop)();
148
203
  }
149
- getSettings() {
204
+ /**
205
+ * Called when the plugin settings are saving.
206
+ *
207
+ * @param _record - The record.
208
+ * @returns A promise or `void` indicating the completion of the save process
209
+ */
210
+ onSavingRecord(_record) {
211
+ (0, import_Function.noop)();
212
+ }
213
+ getSavedSettings() {
214
+ const savedSettings = {};
215
+ for (const [propertyName, property] of this.properties.entries()) {
216
+ savedSettings[propertyName] = property.lastSavedValue;
217
+ }
218
+ const proto = Object.getPrototypeOf(this.defaultSettings);
219
+ Object.setPrototypeOf(savedSettings, proto);
220
+ return savedSettings;
221
+ }
222
+ async prepareRecordToSave() {
150
223
  const settings = {};
151
- for (const [key, property] of this.properties.entries()) {
152
- settings[key] = property.get();
224
+ for (const [propertyName, property] of this.properties.entries()) {
225
+ settings[propertyName] = property.currentValue;
226
+ }
227
+ await this.onSavingRecord(settings);
228
+ return this.getTransformer().transformObjectRecursively(settings);
229
+ }
230
+ async saveToFileImpl() {
231
+ await this.plugin.saveData(await this.prepareRecordToSave());
232
+ }
233
+ }
234
+ class PluginSettingsProperty {
235
+ constructor(propertyName, defaultValue, validator) {
236
+ this.propertyName = propertyName;
237
+ this.defaultValue = defaultValue;
238
+ this.validator = validator;
239
+ this._lastSavedValue = defaultValue;
240
+ this._currentValue = defaultValue;
241
+ }
242
+ get currentValue() {
243
+ return this._currentValue;
244
+ }
245
+ get lastSavedValue() {
246
+ return this._lastSavedValue;
247
+ }
248
+ get safeValue() {
249
+ return this._validationMessage ? this.defaultValue : this._currentValue;
250
+ }
251
+ get validationMessage() {
252
+ return this._validationMessage;
253
+ }
254
+ _currentValue;
255
+ _lastSavedValue;
256
+ _validationMessage = "";
257
+ reset() {
258
+ this._currentValue = this.defaultValue;
259
+ this._validationMessage = "";
260
+ }
261
+ save() {
262
+ if (this._lastSavedValue === this._currentValue) {
263
+ return false;
153
264
  }
154
- return settings;
265
+ this._lastSavedValue = this._currentValue;
266
+ return true;
267
+ }
268
+ setValidationMessage(validationMessage) {
269
+ this._validationMessage = validationMessage;
270
+ this.showWarning();
271
+ }
272
+ setValue(value) {
273
+ this._currentValue = value;
274
+ }
275
+ async setValueAndValidate(value) {
276
+ this.setValue(value);
277
+ if (this._currentValue === void 0) {
278
+ return;
279
+ }
280
+ this._validationMessage = await this.validator(this._currentValue) ?? "";
281
+ this.showWarning(value);
282
+ }
283
+ showWarning(value) {
284
+ if (!this._validationMessage) {
285
+ return;
286
+ }
287
+ const warningMessage = `Could not set plugin setting: ${this.propertyName}. Using default value instead.`;
288
+ new import_obsidian.Notice(warningMessage);
289
+ console.warn(warningMessage, {
290
+ defaultValue: this.defaultValue,
291
+ propertyName: this.propertyName,
292
+ validationMessage: this._validationMessage,
293
+ value
294
+ });
155
295
  }
156
296
  }
157
297
  // Annotate the CommonJS export names for ESM import in node:
158
298
  0 && (module.exports = {
159
- PluginSettingsManagerBase
299
+ PluginSettingsManagerBase,
300
+ PluginSettingsProperty
160
301
  });
161
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IFJlYWRvbmx5RGVlcCB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IFBsdWdpbiB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi4vLi4vT2JqZWN0LnRzJztcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvVHJhbnNmb3JtZXIudHMnO1xuXG5pbXBvcnQgeyBub29wQXN5bmMgfSBmcm9tICcuLi8uLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBEYXRlVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRGF0ZVRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IER1cmF0aW9uVHJhbnNmb3JtZXIgfSBmcm9tICcuLi8uLi9UcmFuc2Zvcm1lcnMvRHVyYXRpb25UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBHcm91cFRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0dyb3VwVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgU2tpcFByaXZhdGVQcm9wZXJ0eVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL1NraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lci50cyc7XG5cbmNvbnN0IGRlZmF1bHRUcmFuc2Zvcm1lciA9IG5ldyBHcm91cFRyYW5zZm9ybWVyKFtcbiAgbmV3IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lcigpLFxuICBuZXcgRGF0ZVRyYW5zZm9ybWVyKCksXG4gIG5ldyBEdXJhdGlvblRyYW5zZm9ybWVyKClcbl0pO1xuXG5jbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LCBQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PiB7XG4gIHB1YmxpYyB2YWxpZGF0aW9uTWVzc2FnZSA9ICcnO1xuICBwcml2YXRlIHZhbHVlOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0gfCB1bmRlZmluZWQ7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWFuYWdlcjogUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncz4sXG4gICAgcHJpdmF0ZSByZWFkb25seSBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgcHVibGljIHJlYWRvbmx5IGRlZmF1bHRWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldXG4gICkge31cblxuICBwdWJsaWMgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG4gIH1cblxuICBwdWJsaWMgZ2V0KCk6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgPz8gdGhpcy5kZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2FmZSgpOiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV0ge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLmdldCgpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldCh2YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldIHwgdW5kZWZpbmVkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2UgPSAoYXdhaXQgdGhpcy5tYW5hZ2VyLnZhbGlkYXRlKHRoaXMucHJvcGVydHksIHRoaXMudmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZCkgPz8gJyc7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgTWFwPHN0cmluZywgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+PiB7XG4gIHB1YmxpYyBnZXRUeXBlZDxQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXk6IFByb3BlcnR5KTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+IHtcbiAgICBjb25zdCBwcm9wZXJ0eSA9IHN1cGVyLmdldChrZXkpO1xuICAgIGlmICghcHJvcGVydHkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgJHtTdHJpbmcoa2V5KX0gbm90IGZvdW5kYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5IGFzIFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3MsIFByb3BlcnR5PjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+PihrZXk6IFByb3BlcnR5LCB2YWx1ZTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+KTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIG1hbmFnaW5nIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFBsdWdpblNldHRpbmdzIC0gVGhlIHR5cGUgcmVwcmVzZW50aW5nIHRoZSBwbHVnaW4gc2V0dGluZ3Mgb2JqZWN0LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZTxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4ge1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIHByaXZhdGUgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcGx1Z2luOiBQbHVnaW4pIHtcbiAgICBjb25zdCBkZWZhdWx0U2V0dGluZ3MgPSB0aGlzLmNyZWF0ZURlZmF1bHRTZXR0aW5ncygpO1xuICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzPigpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoZGVmYXVsdFNldHRpbmdzKSBhcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPltdKSB7XG4gICAgICB0aGlzLnByb3BlcnRpZXMuc2V0KGtleSwgbmV3IFBsdWdpblNldHRpbmdzUHJvcGVydHkodGhpcywga2V5LCBkZWZhdWx0U2V0dGluZ3Nba2V5XSkpO1xuICAgIH1cblxuICAgIHRoaXMuc2FmZVNldHRpbmdzID0gbmV3IFByb3h5KGRlZmF1bHRTZXR0aW5ncywge1xuICAgICAgZ2V0OiAoX3RhcmdldCwgcHJvcCk6IHVua25vd24gPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHByb3AgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXMuZ2V0KHByb3ApO1xuICAgICAgfVxuICAgIH0pIGFzIFJlYWRvbmx5RGVlcDxQbHVnaW5TZXR0aW5ncz47XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvcGVydHk8UHJvcGVydHkgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4ocHJvcGVydHk6IFByb3BlcnR5KTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5ncywgUHJvcGVydHk+IHtcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzLmdldFR5cGVkKHByb3BlcnR5KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBsb2FkRnJvbUZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIHByb3BlcnR5LmNsZWFyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IGF3YWl0IHRoaXMucGx1Z2luLmxvYWREYXRhKCkgYXMgdW5rbm93bjtcblxuICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQgfHwgZGF0YSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgY29uc3QgdHlwZSA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyAnQXJyYXknIDogdHlwZW9mIGRhdGE7XG4gICAgICBjb25zb2xlLmVycm9yKGBJbnZhbGlkIGRhdGEgdHlwZS4gRXhwZWN0ZWQgT2JqZWN0LCBnb3Q6ICR7dHlwZX1gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcmVjb3JkID0gZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZWNvcmQgPSB0aGlzLmdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtT2JqZWN0UmVjdXJzaXZlbHkocmVjb3JkKTtcbiAgICBhd2FpdCB0aGlzLnByZXBhcmVSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5T2JqID0gdGhpcy5wcm9wZXJ0aWVzLmdldChrZXkpO1xuICAgICAgaWYgKCFwcm9wZXJ0eU9iaikge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7a2V5fWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5T2JqLmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYEludmFsaWQgdmFsdWUgdHlwZS4gRXhwZWN0ZWQgJHt0eXBlb2YgcHJvcGVydHlPYmouZGVmYXVsdFZhbHVlfSwgZ290OiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHByb3BlcnR5T2JqLnNldCh2YWx1ZSBhcyBQbHVnaW5TZXR0aW5nc1tTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPl0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgbmV3IHBsdWdpbiBzZXR0aW5ncy5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIHNhdmVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNhdmVUb0ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHRoaXMuZ2V0U2V0dGluZ3MoKSk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEocmVjb3JkKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8taW52YWxpZC12b2lkLXR5cGVcbiAgcHVibGljIGFzeW5jIHZhbGlkYXRlPFByb3BlcnR5IGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KF9wcm9wZXJ0eTogUHJvcGVydHksIF92YWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHldKTogUHJvbWlzZTxzdHJpbmcgfCB2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY3JlYXRlRGVmYXVsdFNldHRpbmdzKCk6IFBsdWdpblNldHRpbmdzO1xuXG4gIHByb3RlY3RlZCBnZXRUcmFuc2Zvcm1lcigpOiBUcmFuc2Zvcm1lciB7XG4gICAgcmV0dXJuIGRlZmF1bHRUcmFuc2Zvcm1lcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBwcmVwYXJlUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbm9vcEFzeW5jKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNldHRpbmdzKCk6IFJlY29yZDxTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPiwgdW5rbm93bj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+ID0ge30gYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1trZXkgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuZ2V0KCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUVBLHNCQUF1QjtBQUt2QixzQkFBMEI7QUFDMUIsNkJBQWdDO0FBQ2hDLGlDQUFvQztBQUNwQyw4QkFBaUM7QUFDakMsNENBQStDO0FBRS9DLE1BQU0scUJBQXFCLElBQUkseUNBQWlCO0FBQUEsRUFDOUMsSUFBSSxxRUFBK0I7QUFBQSxF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
302
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc01hbmFnZXJCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwcCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHtcbiAgUHJvbWlzYWJsZSxcbiAgUmVhZG9ubHlEZWVwXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IE5vdGljZSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9UcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIE1heWJlUmV0dXJuLFxuICBTdHJpbmdLZXlzXG59IGZyb20gJy4uLy4uL1R5cGUudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5CYXNlIH0gZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcblxuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uLy4uL0Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldEFsbEtleXMgfSBmcm9tICcuLi8uLi9PYmplY3QudHMnO1xuaW1wb3J0IHsgRGF0ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0RhdGVUcmFuc2Zvcm1lci50cyc7XG5pbXBvcnQgeyBEdXJhdGlvblRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vLi4vVHJhbnNmb3JtZXJzL0R1cmF0aW9uVHJhbnNmb3JtZXIudHMnO1xuaW1wb3J0IHsgR3JvdXBUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Hcm91cFRyYW5zZm9ybWVyLnRzJztcbmltcG9ydCB7IFNraXBQcml2YXRlUHJvcGVydHlUcmFuc2Zvcm1lciB9IGZyb20gJy4uLy4uL1RyYW5zZm9ybWVycy9Ta2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIudHMnO1xuXG5jb25zdCBkZWZhdWx0VHJhbnNmb3JtZXIgPSBuZXcgR3JvdXBUcmFuc2Zvcm1lcihbXG4gIG5ldyBTa2lwUHJpdmF0ZVByb3BlcnR5VHJhbnNmb3JtZXIoKSxcbiAgbmV3IERhdGVUcmFuc2Zvcm1lcigpLFxuICBuZXcgRHVyYXRpb25UcmFuc2Zvcm1lcigpXG5dKTtcblxudHlwZSBWYWxpZGF0b3I8VD4gPSAodmFsdWU6IFQpID0+IFByb21pc2FibGU8TWF5YmVSZXR1cm48c3RyaW5nPj47XG5cbmFic3RyYWN0IGNsYXNzIFByb3h5SGFuZGxlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGltcGxlbWVudHMgUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvcGVydGllczogUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncz4pIHt9XG5cbiAgcHVibGljIGdldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wpOiB1bmtub3duIHtcbiAgICBjb25zdCByZWNvcmQgPSB0YXJnZXQgYXMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj47XG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmV0dXJuIHJlY29yZFtwcm9wXTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93bjtcbn1cblxuY2xhc3MgRWRpdGFibGVTZXR0aW5nc1Byb3h5SGFuZGxlcjxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBQcm94eUhhbmRsZXJCYXNlPFBsdWdpblNldHRpbmdzPiB7XG4gIHByaXZhdGUgdmFsaWRhdGlvblByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcHVibGljIHNldCh0YXJnZXQ6IFBsdWdpblNldHRpbmdzLCBwcm9wOiBzdHJpbmcgfCBzeW1ib2wsIHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgY29uc3QgcmVjb3JkID0gdGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnc3RyaW5nJykge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydGllcy5nZXQocHJvcCk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgcmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm9wZXJ0eS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy52YWxpZGF0aW9uUHJvbWlzZSA9IHRoaXMudmFsaWRhdGlvblByb21pc2UudGhlbigoKSA9PiBwcm9wZXJ0eS5zZXRWYWx1ZUFuZFZhbGlkYXRlKHZhbHVlKSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBnZXRQcm9wZXJ0eVZhbHVlKHByb3BlcnR5OiBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PHVua25vd24+KTogdW5rbm93biB7XG4gICAgcmV0dXJuIHByb3BlcnR5LmN1cnJlbnRWYWx1ZTtcbiAgfVxufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuY2xhc3MgUHJvcGVydGllc01hcDxQbHVnaW5TZXR0aW5ncyBleHRlbmRzIG9iamVjdD4gZXh0ZW5kcyBNYXA8c3RyaW5nLCBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PGFueT4+IHtcbiAgcHVibGljIGdldFR5cGVkPFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+Pihwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSk6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT4ge1xuICAgIGNvbnN0IHByb3BlcnR5ID0gc3VwZXIuZ2V0KHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSAke1N0cmluZyhwcm9wZXJ0eU5hbWUpfSBub3QgZm91bmRgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvcGVydHkgYXMgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRUeXBlZDxQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPj4oXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgdmFsdWU6IFBsdWdpblNldHRpbmdzUHJvcGVydHk8UGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXT5cbiAgKTogdGhpcyB7XG4gICAgcmV0dXJuIHN1cGVyLnNldChwcm9wZXJ0eU5hbWUsIHZhbHVlKTtcbiAgfVxufVxuXG5jbGFzcyBTYWZlU2V0dGluZ3NQcm94eUhhbmRsZXI8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgUHJveHlIYW5kbGVyQmFzZTxQbHVnaW5TZXR0aW5ncz4ge1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTx1bmtub3duPik6IHVua25vd24ge1xuICAgIHJldHVybiBwcm9wZXJ0eS5zYWZlVmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBtYW5hZ2luZyBwbHVnaW4gc2V0dGluZ3MuXG4gKlxuICogQHR5cGVQYXJhbSBQbHVnaW5TZXR0aW5ncyAtIFRoZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzTWFuYWdlckJhc2U8UGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgcHVibGljIHJlYWRvbmx5IGFwcDogQXBwO1xuICBwdWJsaWMgcmVhZG9ubHkgc2FmZVNldHRpbmdzOiBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuXG4gIHByaXZhdGUgZGVmYXVsdFNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncztcbiAgcHJpdmF0ZSBwcm9wZXJ0aWVzOiBQcm9wZXJ0aWVzTWFwPFBsdWdpblNldHRpbmdzPjtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzOiBNYXA8c3RyaW5nLCBWYWxpZGF0b3I8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgVmFsaWRhdG9yPGFueT4+KCk7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBwbHVnaW46IFBsdWdpbkJhc2U8UGx1Z2luU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5hcHAgPSBwbHVnaW4uYXBwO1xuICAgIHRoaXMuZGVmYXVsdFNldHRpbmdzID0gdGhpcy5jcmVhdGVEZWZhdWx0U2V0dGluZ3MoKTtcblxuICAgIHRoaXMuYWRkVmFsaWRhdG9ycygpO1xuXG4gICAgdGhpcy5wcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXNNYXA8UGx1Z2luU2V0dGluZ3M+KCk7XG5cbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5TmFtZSBvZiBnZXRBbGxLZXlzKHRoaXMuZGVmYXVsdFNldHRpbmdzKSkge1xuICAgICAgdGhpcy5wcm9wZXJ0aWVzLnNldChcbiAgICAgICAgcHJvcGVydHlOYW1lLFxuICAgICAgICBuZXcgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIHRoaXMuZGVmYXVsdFNldHRpbmdzW3Byb3BlcnR5TmFtZV0sIHRoaXMudmFsaWRhdG9ycy5nZXQocHJvcGVydHlOYW1lKSA/PyBub29wKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbGlkYXRvcnMuY2xlYXIoKTtcblxuICAgIHRoaXMuc2FmZVNldHRpbmdzID0gbmV3IFByb3h5KHRoaXMuZGVmYXVsdFNldHRpbmdzLCBuZXcgU2FmZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPih0aGlzLnByb3BlcnRpZXMpKSBhcyBSZWFkb25seURlZXA8UGx1Z2luU2V0dGluZ3M+O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGVkaXRBbmRTYXZlKGVkaXRvcjogKHNldHRpbmdzOiBQbHVnaW5TZXR0aW5ncykgPT4gUHJvbWlzYWJsZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVkaXRhYmxlU2V0dGluZ3MgPSBuZXcgUHJveHkodGhpcy5kZWZhdWx0U2V0dGluZ3MsIG5ldyBFZGl0YWJsZVNldHRpbmdzUHJveHlIYW5kbGVyPFBsdWdpblNldHRpbmdzPih0aGlzLnByb3BlcnRpZXMpKSBhcyB7XG4gICAgICB2YWxpZGF0aW9uUHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgICB9ICYgUGx1Z2luU2V0dGluZ3M7XG4gICAgYXdhaXQgZWRpdG9yKGVkaXRhYmxlU2V0dGluZ3MpO1xuICAgIGF3YWl0IGVkaXRhYmxlU2V0dGluZ3MudmFsaWRhdGlvblByb21pc2U7XG4gICAgYXdhaXQgdGhpcy5zYXZlVG9GaWxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UHJvcGVydHk8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lKTogUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eTxQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdPiB7XG4gICAgcmV0dXJuIHRoaXMucHJvcGVydGllcy5nZXRUeXBlZChwcm9wZXJ0eU5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGxvYWRGcm9tRmlsZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIHRoaXMucHJvcGVydGllcy52YWx1ZXMoKSkge1xuICAgICAgcHJvcGVydHkucmVzZXQoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5wbHVnaW4ubG9hZERhdGEoKSBhcyB1bmtub3duO1xuXG4gICAgaWYgKGRhdGEgPT09IHVuZGVmaW5lZCB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICBjb25zdCB0eXBlID0gQXJyYXkuaXNBcnJheShkYXRhKSA/ICdBcnJheScgOiB0eXBlb2YgZGF0YTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEludmFsaWQgZGF0YSB0eXBlLiBFeHBlY3RlZCBPYmplY3QsIGdvdDogJHt0eXBlfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByZWNvcmQgPSBkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG9yaWdpbmFsSnNvbiA9IEpTT04uc3RyaW5naWZ5KHJlY29yZCk7XG4gICAgcmVjb3JkID0gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHJlY29yZCk7XG4gICAgYXdhaXQgdGhpcy5vbkxvYWRSZWNvcmQocmVjb3JkKTtcblxuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlY29yZCkpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpO1xuICAgICAgaWYgKCFwcm9wZXJ0eSkge1xuICAgICAgICBjb25zb2xlLndhcm4oYFVua25vd24gcHJvcGVydHk6ICR7cHJvcGVydHlOYW1lfWApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gdHlwZW9mIHByb3BlcnR5LmRlZmF1bHRWYWx1ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgdmFsdWUgdHlwZScsIHtcbiAgICAgICAgICBwcm9wZXJ0eU5hbWUsXG4gICAgICAgICAgcHJvcGVydHlUeXBlOiB0eXBlb2YgcHJvcGVydHkuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgIHZhbHVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZSk7XG4gICAgICBwcm9wZXJ0eS5zYXZlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3SnNvbiA9IEpTT04uc3RyaW5naWZ5KGF3YWl0IHRoaXMucHJlcGFyZVJlY29yZFRvU2F2ZSgpKTtcblxuICAgIGlmIChuZXdKc29uICE9PSBvcmlnaW5hbEpzb24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc2F2ZVRvRmlsZUltcGwoKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnBsdWdpbi5vbkxvYWRTZXR0aW5ncyh0aGlzLmdldFNhdmVkU2V0dGluZ3MoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZXMgdGhlIG5ldyBwbHVnaW4gc2V0dGluZ3MuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIHNldHRpbmdzIGFyZSBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzYXZlVG9GaWxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZFNldHRpbmdzID0gdGhpcy5nZXRTYXZlZFNldHRpbmdzKCk7XG5cbiAgICBsZXQgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiB0aGlzLnByb3BlcnRpZXMudmFsdWVzKCkpIHtcbiAgICAgIGhhc0NoYW5nZXMgfHw9IHByb3BlcnR5LnNhdmUoKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NoYW5nZXMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVUb0ZpbGVJbXBsKCk7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4ub25TYXZlU2V0dGluZ3ModGhpcy5nZXRTYXZlZFNldHRpbmdzKCksIG9sZFNldHRpbmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRWYWxpZGF0b3I8UHJvcGVydHlOYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4+KFxuICAgIHByb3BlcnR5TmFtZTogUHJvcGVydHlOYW1lLFxuICAgIHZhbGlkYXRvcjogVmFsaWRhdG9yPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+XG4gICk6IHZvaWQge1xuICAgIHRoaXMudmFsaWRhdG9ycy5zZXQocHJvcGVydHlOYW1lLCB2YWxpZGF0b3IpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFkZFZhbGlkYXRvcnMoKTogdm9pZCB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNyZWF0ZURlZmF1bHRTZXR0aW5ncygpOiBQbHVnaW5TZXR0aW5ncztcblxuICBwcm90ZWN0ZWQgZ2V0VHJhbnNmb3JtZXIoKTogVHJhbnNmb3JtZXIge1xuICAgIHJldHVybiBkZWZhdWx0VHJhbnNmb3JtZXI7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIHBsdWdpbiBzZXR0aW5ncyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gX3JlY29yZCAtIFRoZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSBvciBgdm9pZGAgaW5kaWNhdGluZyB0aGUgY29tcGxldGlvbiBvZiB0aGUgbG9hZCBwcm9jZXNzXG4gICAqL1xuICBwcm90ZWN0ZWQgb25Mb2FkUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBwbHVnaW4gc2V0dGluZ3MgYXJlIHNhdmluZy5cbiAgICpcbiAgICogQHBhcmFtIF9yZWNvcmQgLSBUaGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2Ugb3IgYHZvaWRgIGluZGljYXRpbmcgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHNhdmUgcHJvY2Vzc1xuICAgKi9cbiAgcHJvdGVjdGVkIG9uU2F2aW5nUmVjb3JkKF9yZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgbm9vcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTYXZlZFNldHRpbmdzKCk6IFBsdWdpblNldHRpbmdzIHtcbiAgICBjb25zdCBzYXZlZFNldHRpbmdzOiBQYXJ0aWFsPFBsdWdpblNldHRpbmdzPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW3Byb3BlcnR5TmFtZSwgcHJvcGVydHldIG9mIHRoaXMucHJvcGVydGllcy5lbnRyaWVzKCkpIHtcbiAgICAgIHNhdmVkU2V0dGluZ3NbcHJvcGVydHlOYW1lIGFzIFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XSA9IHByb3BlcnR5Lmxhc3RTYXZlZFZhbHVlIGFzIFBsdWdpblNldHRpbmdzW1N0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+XSB8IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcy5kZWZhdWx0U2V0dGluZ3MpIGFzIG9iamVjdDtcbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2Yoc2F2ZWRTZXR0aW5ncywgcHJvdG8pO1xuICAgIHJldHVybiBzYXZlZFNldHRpbmdzIGFzIFBsdWdpblNldHRpbmdzO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwcmVwYXJlUmVjb3JkVG9TYXZlKCk6IFByb21pc2U8UmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPj4ge1xuICAgIGNvbnN0IHNldHRpbmdzOiBSZWNvcmQ8U3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz4sIHVua25vd24+ID0ge30gYXMgUmVjb3JkPFN0cmluZ0tleXM8UGx1Z2luU2V0dGluZ3M+LCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IFtwcm9wZXJ0eU5hbWUsIHByb3BlcnR5XSBvZiB0aGlzLnByb3BlcnRpZXMuZW50cmllcygpKSB7XG4gICAgICBzZXR0aW5nc1twcm9wZXJ0eU5hbWUgYXMgU3RyaW5nS2V5czxQbHVnaW5TZXR0aW5ncz5dID0gcHJvcGVydHkuY3VycmVudFZhbHVlIGFzIHVua25vd247XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5vblNhdmluZ1JlY29yZChzZXR0aW5ncyk7XG5cbiAgICByZXR1cm4gdGhpcy5nZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybU9iamVjdFJlY3Vyc2l2ZWx5KHNldHRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2F2ZVRvRmlsZUltcGwoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZURhdGEoYXdhaXQgdGhpcy5wcmVwYXJlUmVjb3JkVG9TYXZlKCkpO1xuICB9XG59XG5cbi8qKlxuICogQSBwcm9wZXJ0eSBvZiBhIHBsdWdpbiBzZXR0aW5ncy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFQ+IHtcbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFzdFNhdmVkVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX2xhc3RTYXZlZFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBzYWZlVmFsdWUoKTogVCB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID8gdGhpcy5kZWZhdWx0VmFsdWUgOiB0aGlzLl9jdXJyZW50VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpb25NZXNzYWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX2xhc3RTYXZlZFZhbHVlOiBUO1xuXG4gIHByaXZhdGUgX3ZhbGlkYXRpb25NZXNzYWdlID0gJyc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHB1YmxpYyByZWFkb25seSBkZWZhdWx0VmFsdWU6IFQsIHByaXZhdGUgcmVhZG9ubHkgdmFsaWRhdG9yOiBWYWxpZGF0b3I8VD4pIHtcbiAgICB0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTtcbiAgICB0aGlzLl9jdXJyZW50VmFsdWUgPSBkZWZhdWx0VmFsdWU7XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgdGhpcy5fdmFsaWRhdGlvbk1lc3NhZ2UgPSAnJztcbiAgfVxuXG4gIHB1YmxpYyBzYXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9sYXN0U2F2ZWRWYWx1ZSA9PT0gdGhpcy5fY3VycmVudFZhbHVlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy5fbGFzdFNhdmVkVmFsdWUgPSB0aGlzLl9jdXJyZW50VmFsdWU7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwdWJsaWMgc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdGlvbk1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gdmFsaWRhdGlvbk1lc3NhZ2U7XG4gICAgdGhpcy5zaG93V2FybmluZygpO1xuICB9XG5cbiAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5fY3VycmVudFZhbHVlID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc2V0VmFsdWVBbmRWYWxpZGF0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMuc2V0VmFsdWUodmFsdWUpO1xuICAgIGlmICh0aGlzLl9jdXJyZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlID0gKGF3YWl0IHRoaXMudmFsaWRhdG9yKHRoaXMuX2N1cnJlbnRWYWx1ZSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKSA/PyAnJztcbiAgICB0aGlzLnNob3dXYXJuaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvd1dhcm5pbmcodmFsdWU/OiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92YWxpZGF0aW9uTWVzc2FnZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gYENvdWxkIG5vdCBzZXQgcGx1Z2luIHNldHRpbmc6ICR7dGhpcy5wcm9wZXJ0eU5hbWV9LiBVc2luZyBkZWZhdWx0IHZhbHVlIGluc3RlYWQuYDtcbiAgICBuZXcgTm90aWNlKHdhcm5pbmdNZXNzYWdlKTtcbiAgICBjb25zb2xlLndhcm4od2FybmluZ01lc3NhZ2UsIHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogdGhpcy5kZWZhdWx0VmFsdWUsXG4gICAgICBwcm9wZXJ0eU5hbWU6IHRoaXMucHJvcGVydHlOYW1lLFxuICAgICAgdmFsaWRhdGlvbk1lc3NhZ2U6IHRoaXMuX3ZhbGlkYXRpb25NZXNzYWdlLFxuICAgICAgdmFsdWVcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQU1BLHNCQUF1QjtBQVN2QixzQkFBcUI7QUFDckIsb0JBQTJCO0FBQzNCLDZCQUFnQztBQUNoQyxpQ0FBb0M7QUFDcEMsOEJBQWlDO0FBQ2pDLDRDQUErQztBQUUvQyxNQUFNLHFCQUFxQixJQUFJLHlDQUFpQjtBQUFBLEVBQzlDLElBQUkscUVBQStCO0FBQUEsRUFDbkMsSUFBSSx1Q0FBZ0I7QUFBQSxFQUNwQixJQUFJLCtDQUFvQjtBQUMxQixDQUFDO0FBSUQsTUFBZSxpQkFBd0Y7QUFBQSxFQUM5RixZQUErQixZQUEyQztBQUEzQztBQUFBLEVBQTRDO0FBQUEsRUFFM0UsSUFBSSxRQUF3QixNQUFnQztBQUNqRSxVQUFNLFNBQVM7QUFDZixRQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzVCLGFBQU8sT0FBTyxJQUFJO0FBQUEsSUFDcEI7QUFFQSxVQUFNLFdBQVcsS0FBSyxXQUFXLElBQUksSUFBSTtBQUN6QyxRQUFJLENBQUMsVUFBVTtBQUNiLGFBQU8sT0FBTyxJQUFJO0FBQUEsSUFDcEI7QUFFQSxXQUFPLEtBQUssaUJBQWlCLFFBQVE7QUFBQSxFQUN2QztBQUdGO0FBRUEsTUFBTSxxQ0FBb0UsaUJBQWlDO0FBQUEsRUFDakcsb0JBQW9CLFFBQVEsUUFBUTtBQUFBLEVBQ3JDLElBQUksUUFBd0IsTUFBdUIsT0FBeUI7QUFDakYsVUFBTSxTQUFTO0FBRWYsUUFBSSxPQUFPLFNBQVMsVUFBVTtBQUM1QixhQUFPLElBQUksSUFBSTtBQUNmLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxXQUFXLEtBQUssV0FBVyxJ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