@mnaoumov/obsidian-lib 10.10.0 → 10.12.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 (133) hide show
  1. package/README.md +26 -0
  2. package/components/all-windows-status-bar-item-component/package.json +6 -0
  3. package/components/shared-component-pool-component/package.json +6 -0
  4. package/components/workspace-layout-state-component/package.json +6 -0
  5. package/dist/lib/cjs/__merged.cjs +90 -1
  6. package/dist/lib/cjs/__merged.d.cts +13 -4
  7. package/dist/lib/cjs/bug-report-diagnostics.cjs +222 -0
  8. package/dist/lib/cjs/bug-report-diagnostics.d.cts +186 -0
  9. package/dist/lib/cjs/bug-report.cjs +36 -10
  10. package/dist/lib/cjs/bug-report.d.cts +65 -0
  11. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.cjs +93 -2
  12. package/dist/lib/cjs/command-handlers/open-bug-report-command-handler.d.cts +34 -2
  13. package/dist/lib/cjs/components/all-windows-status-bar-item-component.cjs +245 -0
  14. package/dist/lib/cjs/components/all-windows-status-bar-item-component.d.cts +146 -0
  15. package/dist/lib/cjs/components/embed-extensions-component.cjs +20 -3
  16. package/dist/lib/cjs/components/embed-extensions-component.d.cts +8 -0
  17. package/dist/lib/cjs/components/embeddable-markdown-editor-component.cjs +16 -2
  18. package/dist/lib/cjs/components/embeddable-markdown-editor-component.d.cts +9 -0
  19. package/dist/lib/cjs/components/index.cjs +12 -3
  20. package/dist/lib/cjs/components/index.d.cts +3 -0
  21. package/dist/lib/cjs/components/plugin-gate-component.cjs +2 -9
  22. package/dist/lib/cjs/components/plugin-settings-component.cjs +7 -2
  23. package/dist/lib/cjs/components/shared-component-pool-component.cjs +368 -0
  24. package/dist/lib/cjs/components/shared-component-pool-component.d.cts +129 -0
  25. package/dist/lib/cjs/components/workspace-layout-state-component.cjs +495 -0
  26. package/dist/lib/cjs/components/workspace-layout-state-component.d.cts +239 -0
  27. package/dist/lib/cjs/css-class.cjs +5 -1
  28. package/dist/lib/cjs/css-class.d.cts +16 -0
  29. package/dist/lib/cjs/data-handler.cjs +156 -5
  30. package/dist/lib/cjs/data-handler.d.cts +128 -2
  31. package/dist/lib/cjs/desktop-git-runner.cjs +4 -14
  32. package/dist/lib/cjs/desktop-git-runner.d.cts +8 -2
  33. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  34. package/dist/lib/cjs/git-rename-history.cjs +1 -1
  35. package/dist/lib/cjs/git-rename-history.d.cts +2 -2
  36. package/dist/lib/cjs/i18n/locales/en.cjs +29 -1
  37. package/dist/lib/cjs/i18n/locales/en.d.cts +28 -0
  38. package/dist/lib/cjs/i18n/locales/translations-map.d.cts +28 -0
  39. package/dist/lib/cjs/index.cjs +10 -1
  40. package/dist/lib/cjs/index.d.cts +3 -0
  41. package/dist/lib/cjs/link.cjs +40 -1
  42. package/dist/lib/cjs/link.d.cts +37 -1
  43. package/dist/lib/cjs/markdown-view.cjs +191 -3
  44. package/dist/lib/cjs/markdown-view.d.cts +48 -1
  45. package/dist/lib/cjs/modals/copy-text-manually.cjs +181 -0
  46. package/dist/lib/cjs/modals/copy-text-manually.d.cts +38 -0
  47. package/dist/lib/cjs/modals/index.cjs +7 -1
  48. package/dist/lib/cjs/modals/index.d.cts +2 -0
  49. package/dist/lib/cjs/modals/review-bug-report-diagnostics.cjs +202 -0
  50. package/dist/lib/cjs/modals/review-bug-report-diagnostics.d.cts +30 -0
  51. package/dist/lib/cjs/plugin/index.cjs +4 -1
  52. package/dist/lib/cjs/plugin/index.d.cts +1 -0
  53. package/dist/lib/cjs/plugin/plugin-api.cjs +13 -4
  54. package/dist/lib/cjs/plugin/plugin-api.d.cts +5 -1
  55. package/dist/lib/cjs/plugin/plugin-install-state.cjs +46 -1
  56. package/dist/lib/cjs/plugin/plugin-install-state.d.cts +30 -0
  57. package/dist/lib/cjs/plugin/plugin-instance.cjs +448 -0
  58. package/dist/lib/cjs/plugin/plugin-instance.d.cts +251 -0
  59. package/dist/lib/cjs/plugin/plugin.cjs +16 -1
  60. package/dist/lib/cjs/plugin/plugin.d.cts +7 -0
  61. package/dist/lib/cjs/reference-definition.cjs +234 -0
  62. package/dist/lib/cjs/reference-definition.d.cts +47 -0
  63. package/dist/lib/cjs/release-asset.cjs +279 -0
  64. package/dist/lib/cjs/release-asset.d.cts +190 -0
  65. package/dist/lib/cjs/workspace.cjs +3 -2
  66. package/dist/lib/cjs/workspace.d.cts +6 -0
  67. package/dist/lib/esm/__merged.d.mts +13 -4
  68. package/dist/lib/esm/__merged.mjs +97 -3
  69. package/dist/lib/esm/bug-report-diagnostics.d.mts +186 -0
  70. package/dist/lib/esm/bug-report-diagnostics.mjs +127 -0
  71. package/dist/lib/esm/bug-report.d.mts +65 -0
  72. package/dist/lib/esm/bug-report.mjs +33 -10
  73. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.d.mts +34 -2
  74. package/dist/lib/esm/command-handlers/open-bug-report-command-handler.mjs +99 -3
  75. package/dist/lib/esm/components/all-windows-status-bar-item-component.d.mts +146 -0
  76. package/dist/lib/esm/components/all-windows-status-bar-item-component.mjs +154 -0
  77. package/dist/lib/esm/components/embed-extensions-component.d.mts +8 -0
  78. package/dist/lib/esm/components/embed-extensions-component.mjs +20 -3
  79. package/dist/lib/esm/components/embeddable-markdown-editor-component.d.mts +9 -0
  80. package/dist/lib/esm/components/embeddable-markdown-editor-component.mjs +16 -2
  81. package/dist/lib/esm/components/index.d.mts +3 -0
  82. package/dist/lib/esm/components/index.mjs +8 -2
  83. package/dist/lib/esm/components/plugin-gate-component.mjs +5 -13
  84. package/dist/lib/esm/components/plugin-settings-component.mjs +7 -2
  85. package/dist/lib/esm/components/shared-component-pool-component.d.mts +129 -0
  86. package/dist/lib/esm/components/shared-component-pool-component.mjs +280 -0
  87. package/dist/lib/esm/components/workspace-layout-state-component.d.mts +239 -0
  88. package/dist/lib/esm/components/workspace-layout-state-component.mjs +404 -0
  89. package/dist/lib/esm/css-class.d.mts +16 -0
  90. package/dist/lib/esm/css-class.mjs +5 -1
  91. package/dist/lib/esm/data-handler.d.mts +128 -2
  92. package/dist/lib/esm/data-handler.mjs +152 -4
  93. package/dist/lib/esm/desktop-git-runner.d.mts +8 -2
  94. package/dist/lib/esm/desktop-git-runner.mjs +3 -3
  95. package/dist/lib/esm/generated-during-build.mjs +2 -2
  96. package/dist/lib/esm/git-rename-history.d.mts +2 -2
  97. package/dist/lib/esm/git-rename-history.mjs +1 -1
  98. package/dist/lib/esm/i18n/locales/en.d.mts +28 -0
  99. package/dist/lib/esm/i18n/locales/en.mjs +29 -1
  100. package/dist/lib/esm/i18n/locales/translations-map.d.mts +28 -0
  101. package/dist/lib/esm/index.d.mts +3 -0
  102. package/dist/lib/esm/index.mjs +7 -1
  103. package/dist/lib/esm/link.d.mts +37 -1
  104. package/dist/lib/esm/link.mjs +40 -1
  105. package/dist/lib/esm/markdown-view.d.mts +48 -1
  106. package/dist/lib/esm/markdown-view.mjs +192 -2
  107. package/dist/lib/esm/modals/copy-text-manually.d.mts +38 -0
  108. package/dist/lib/esm/modals/copy-text-manually.mjs +99 -0
  109. package/dist/lib/esm/modals/index.d.mts +2 -0
  110. package/dist/lib/esm/modals/index.mjs +5 -1
  111. package/dist/lib/esm/modals/review-bug-report-diagnostics.d.mts +30 -0
  112. package/dist/lib/esm/modals/review-bug-report-diagnostics.mjs +120 -0
  113. package/dist/lib/esm/plugin/index.d.mts +1 -0
  114. package/dist/lib/esm/plugin/index.mjs +3 -1
  115. package/dist/lib/esm/plugin/plugin-api.d.mts +5 -1
  116. package/dist/lib/esm/plugin/plugin-api.mjs +13 -4
  117. package/dist/lib/esm/plugin/plugin-install-state.d.mts +30 -0
  118. package/dist/lib/esm/plugin/plugin-install-state.mjs +44 -1
  119. package/dist/lib/esm/plugin/plugin-instance.d.mts +251 -0
  120. package/dist/lib/esm/plugin/plugin-instance.mjs +366 -0
  121. package/dist/lib/esm/plugin/plugin.d.mts +7 -0
  122. package/dist/lib/esm/plugin/plugin.mjs +16 -1
  123. package/dist/lib/esm/reference-definition.d.mts +47 -0
  124. package/dist/lib/esm/reference-definition.mjs +146 -0
  125. package/dist/lib/esm/release-asset.d.mts +190 -0
  126. package/dist/lib/esm/release-asset.mjs +187 -0
  127. package/dist/lib/esm/workspace.d.mts +6 -0
  128. package/dist/lib/esm/workspace.mjs +3 -2
  129. package/dist/styles.css +16 -1
  130. package/modals/copy-text-manually/package.json +6 -0
  131. package/modals/review-bug-report-diagnostics/package.json +6 -0
  132. package/package.json +2 -1
  133. package/plugin/plugin-instance/package.json +6 -0
@@ -0,0 +1,448 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+ require = Object.assign(
38
+ (id) => requirePatched(id),
39
+ originalRequire,
40
+ {
41
+ __isPatched: true
42
+ }
43
+ );
44
+ function extractDefault($module) {
45
+ return $module && $module.__esModule && "default" in $module ? $module.default : $module;
46
+ }
47
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
48
+ "@codemirror/autocomplete",
49
+ "@codemirror/collab",
50
+ "@codemirror/commands",
51
+ "@codemirror/language",
52
+ "@codemirror/lint",
53
+ "@codemirror/search",
54
+ "@codemirror/state",
55
+ "@codemirror/text",
56
+ "@codemirror/view",
57
+ "@lezer/common",
58
+ "@lezer/highlight",
59
+ "@lezer/lr",
60
+ "obsidian"
61
+ ]);
62
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = /* @__PURE__ */ new Set([
63
+ "@codemirror/closebrackets",
64
+ "@codemirror/comment",
65
+ "@codemirror/fold",
66
+ "@codemirror/gutter",
67
+ "@codemirror/highlight",
68
+ "@codemirror/history",
69
+ "@codemirror/matchbrackets",
70
+ "@codemirror/panel",
71
+ "@codemirror/rangeset",
72
+ "@codemirror/rectangular-selection",
73
+ "@codemirror/stream-parser",
74
+ "@codemirror/tooltip"
75
+ ]);
76
+ function requirePatched(id) {
77
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
78
+ return originalRequire?.(id);
79
+ }
80
+ const app = globalThis.app;
81
+ if (app?.isMobile) {
82
+ if (id === "process" || id === "node:process") {
83
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
84
+ return process;
85
+ }
86
+ } else {
87
+ const $module = originalRequire?.(id);
88
+ if ($module) {
89
+ return extractDefault($module);
90
+ }
91
+ }
92
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
93
+ return {};
94
+ }
95
+ })();
96
+
97
+ "use strict";
98
+ var __defProp = Object.defineProperty;
99
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
100
+ var __getOwnPropNames = Object.getOwnPropertyNames;
101
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
102
+ var __export = (target, all) => {
103
+ for (var name in all)
104
+ __defProp(target, name, { get: all[name], enumerable: true });
105
+ };
106
+ var __copyProps = (to, from, except, desc) => {
107
+ if (from && typeof from === "object" || typeof from === "function") {
108
+ for (let key of __getOwnPropNames(from))
109
+ if (!__hasOwnProp.call(to, key) && key !== except)
110
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
111
+ }
112
+ return to;
113
+ };
114
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
115
+ var plugin_instance_exports = {};
116
+ __export(plugin_instance_exports, {
117
+ PluginAvailability: () => PluginAvailability,
118
+ PluginInstanceUnavailableError: () => PluginInstanceUnavailableError,
119
+ getLoadedPlugin: () => getLoadedPlugin,
120
+ getPluginAvailability: () => getPluginAvailability,
121
+ requirePlugin: () => requirePlugin,
122
+ waitForPlugin: () => waitForPlugin
123
+ });
124
+ module.exports = __toCommonJS(plugin_instance_exports);
125
+ var import_async = require('@mnaoumov/typescript-lib/async');
126
+ var import_object_utils = require('@mnaoumov/typescript-lib/object-utils');
127
+ var import_obsidian = require('obsidian');
128
+ var import_community_plugins = require('../community-plugins.cjs');
129
+ var import_plugin_notice_component = require('../components/plugin-notice-component.cjs');
130
+ var import_css_class = require('../css-class.cjs');
131
+ var import_html_element = require('../html-element.cjs');
132
+ var import_i18n = require('../i18n/i18n.cjs');
133
+ var import_settings_modal = require('../settings-modal.cjs');
134
+ var import_plugin_install_state = require('./plugin-install-state.cjs');
135
+ var import_plugin_lifecycle_events = require('./plugin-lifecycle-events.cjs');
136
+ const DEFAULT_WAIT_FOR_PLUGIN_TIMEOUT_IN_MILLISECONDS = 1e4;
137
+ const PLUGINS_CHANGED_EVENT_NAME = "changed";
138
+ const COMMUNITY_PLUGINS_SETTING_TAB_ID = "community-plugins";
139
+ var PluginAvailability = /* @__PURE__ */ ((PluginAvailability2) => {
140
+ PluginAvailability2["Available"] = "available";
141
+ PluginAvailability2["InvalidVersion"] = "invalidVersion";
142
+ PluginAvailability2["Loading"] = "loading";
143
+ PluginAvailability2["NotEnabled"] = "notEnabled";
144
+ PluginAvailability2["NotInstalled"] = "notInstalled";
145
+ PluginAvailability2["NotLoaded"] = "notLoaded";
146
+ PluginAvailability2["Outdated"] = "outdated";
147
+ PluginAvailability2["ShapeMismatch"] = "shapeMismatch";
148
+ return PluginAvailability2;
149
+ })(PluginAvailability || {});
150
+ class PluginInstanceUnavailableError extends Error {
151
+ /**
152
+ * Why the plugin was unavailable when the wait gave up.
153
+ */
154
+ availability;
155
+ /**
156
+ * The `manifest.id` of the plugin.
157
+ */
158
+ pluginId;
159
+ /**
160
+ * Creates an instance of {@link PluginInstanceUnavailableError}.
161
+ *
162
+ * @param params - The constructor parameters.
163
+ */
164
+ constructor(params) {
165
+ super(`Plugin "${params.pluginId}" is not available: ${params.availability}.`);
166
+ this.name = "PluginInstanceUnavailableError";
167
+ this.availability = params.availability;
168
+ this.pluginId = params.pluginId;
169
+ }
170
+ }
171
+ function getLoadedPlugin(params) {
172
+ return getPluginAvailability(params) === "available" /* Available */ ? params.app.plugins.getPlugin(params.pluginId) : null;
173
+ }
174
+ function getPluginAvailability(params) {
175
+ const {
176
+ app,
177
+ isPlugin,
178
+ minPluginVersion,
179
+ pluginId
180
+ } = params;
181
+ const plugin = app.plugins.getPlugin(pluginId);
182
+ if (plugin === null) {
183
+ if (!Object.hasOwn(app.plugins.manifests, pluginId)) {
184
+ return "notInstalled" /* NotInstalled */;
185
+ }
186
+ return app.plugins.enabledPlugins.has(pluginId) ? "notLoaded" /* NotLoaded */ : "notEnabled" /* NotEnabled */;
187
+ }
188
+ if (app.plugins.loadingPluginId === pluginId) {
189
+ return "loading" /* Loading */;
190
+ }
191
+ if (minPluginVersion !== void 0) {
192
+ const comparison = (0, import_plugin_install_state.comparePluginVersionWithMinimum)(plugin.manifest.version, minPluginVersion);
193
+ if (comparison === import_plugin_install_state.PluginVersionComparison.BelowMinimum) {
194
+ return "outdated" /* Outdated */;
195
+ }
196
+ if (comparison === import_plugin_install_state.PluginVersionComparison.Invalid) {
197
+ return "invalidVersion" /* InvalidVersion */;
198
+ }
199
+ }
200
+ return isPlugin && !isPlugin(plugin) ? "shapeMismatch" /* ShapeMismatch */ : "available" /* Available */;
201
+ }
202
+ async function requirePlugin(params) {
203
+ const { app } = params;
204
+ let shownAvailability = null;
205
+ let latestAvailability = "loading" /* Loading */;
206
+ let hideNotice = null;
207
+ let isSettled = false;
208
+ function show(availability) {
209
+ if (isSettled || !app.workspace.layoutReady || availability === shownAvailability || availability === "loading" /* Loading */) {
210
+ return;
211
+ }
212
+ hideNotice?.();
213
+ shownAvailability = availability;
214
+ const notice = params.pluginNoticeComponent.showNotice(createRequirementFragment(params, availability), {
215
+ mode: import_plugin_notice_component.PluginNoticeMode.Separate,
216
+ shouldHideOnClick: false
217
+ });
218
+ hideNotice = () => {
219
+ notice.hide();
220
+ };
221
+ }
222
+ if (!app.workspace.layoutReady) {
223
+ app.workspace.onLayoutReady(() => {
224
+ show(latestAvailability);
225
+ });
226
+ }
227
+ return await waitForAvailability({
228
+ ...params,
229
+ onSettled: () => {
230
+ isSettled = true;
231
+ hideNotice?.();
232
+ },
233
+ onUnavailable: (availability) => {
234
+ latestAvailability = availability;
235
+ show(availability);
236
+ },
237
+ resolvedTimeoutInMilliseconds: params.timeoutInMilliseconds ?? null
238
+ });
239
+ }
240
+ async function waitForPlugin(params) {
241
+ return await waitForAvailability({
242
+ ...params,
243
+ resolvedTimeoutInMilliseconds: params.timeoutInMilliseconds ?? DEFAULT_WAIT_FOR_PLUGIN_TIMEOUT_IN_MILLISECONDS
244
+ });
245
+ }
246
+ function createRequirementFragment(params, availability) {
247
+ const {
248
+ app,
249
+ minPluginVersion = "",
250
+ pluginId,
251
+ pluginName,
252
+ pluginNoticeComponent,
253
+ requestingPluginName
254
+ } = params;
255
+ const interpolation = {
256
+ minPluginVersion,
257
+ pluginName: (0, import_html_element.asCodeBlock)(requestingPluginName),
258
+ requiredPluginName: (0, import_html_element.asCodeBlock)(pluginName)
259
+ };
260
+ return createFragment((fragmentEl) => {
261
+ fragmentEl.append((0, import_html_element.createFragmentWithCodeBlocks)((0, import_i18n.t)(($) => {
262
+ switch (availability) {
263
+ case "invalidVersion" /* InvalidVersion */: {
264
+ return $.obsidianLib.pluginRequirement.invalidVersionNotice;
265
+ }
266
+ case "notEnabled" /* NotEnabled */: {
267
+ return $.obsidianLib.pluginRequirement.notEnabledNotice;
268
+ }
269
+ case "notInstalled" /* NotInstalled */: {
270
+ return $.obsidianLib.pluginRequirement.notInstalledNotice;
271
+ }
272
+ case "notLoaded" /* NotLoaded */: {
273
+ return $.obsidianLib.pluginRequirement.notLoadedNotice;
274
+ }
275
+ case "outdated" /* Outdated */: {
276
+ return $.obsidianLib.pluginRequirement.outdatedNotice;
277
+ }
278
+ default: {
279
+ return $.obsidianLib.pluginRequirement.shapeMismatchNotice;
280
+ }
281
+ }
282
+ }, interpolation)));
283
+ const buttonsEl = fragmentEl.createDiv({
284
+ cls: [import_css_class.CssClass.LibraryName, import_css_class.CssClass.PluginSuggestionNoticeButtons]
285
+ });
286
+ switch (availability) {
287
+ case "notEnabled" /* NotEnabled */:
288
+ case "notInstalled" /* NotInstalled */: {
289
+ new import_obsidian.ButtonComponent(buttonsEl).setButtonText((0, import_i18n.t)(
290
+ ($) => availability === "notEnabled" /* NotEnabled */ ? $.obsidianLib.pluginSuggestion.enable : $.obsidianLib.pluginSuggestion.install
291
+ )).setCta().onClick((0, import_async.convertAsyncToSync)(async () => {
292
+ await runRepair(async () => {
293
+ await (0, import_plugin_install_state.installAndEnablePlugin)({
294
+ app,
295
+ pluginId,
296
+ pluginName,
297
+ pluginNoticeComponent
298
+ });
299
+ });
300
+ }));
301
+ break;
302
+ }
303
+ case "notLoaded" /* NotLoaded */: {
304
+ new import_obsidian.ButtonComponent(buttonsEl).setButtonText((0, import_i18n.t)(($) => $.obsidianLib.pluginRequirement.enable, { requiredPluginName: pluginName })).setCta().onClick((0, import_async.convertAsyncToSync)(async () => {
305
+ await runRepair(async () => {
306
+ await loadEnabledPlugin(params);
307
+ });
308
+ }));
309
+ break;
310
+ }
311
+ default: {
312
+ new import_obsidian.ButtonComponent(buttonsEl).setButtonText((0, import_i18n.t)(($) => $.obsidianLib.pluginDependency.update, { dependencyPluginName: pluginName })).setCta().onClick((0, import_async.convertAsyncToSync)(async () => {
313
+ await runRepair(async () => {
314
+ await (0, import_plugin_install_state.updatePlugin)({
315
+ app,
316
+ pluginId,
317
+ pluginName,
318
+ pluginNoticeComponent,
319
+ requestingPluginName
320
+ });
321
+ });
322
+ }));
323
+ break;
324
+ }
325
+ }
326
+ new import_obsidian.ButtonComponent(buttonsEl).setButtonText((0, import_i18n.t)(($) => $.obsidianLib.pluginRequirement.openCommunityPlugins)).onClick(() => {
327
+ (0, import_settings_modal.openSettingTab)({
328
+ app,
329
+ tabId: COMMUNITY_PLUGINS_SETTING_TAB_ID
330
+ });
331
+ });
332
+ });
333
+ }
334
+ async function loadEnabledPlugin(params) {
335
+ const {
336
+ app,
337
+ pluginId,
338
+ pluginName,
339
+ pluginNoticeComponent
340
+ } = params;
341
+ try {
342
+ if (!await app.plugins.enablePluginAndSave(pluginId)) {
343
+ throw new import_community_plugins.PluginEnableRefusedError(pluginId);
344
+ }
345
+ } catch (error) {
346
+ pluginNoticeComponent.showNotice((0, import_html_element.createFragmentWithCodeBlocks)(
347
+ (0, import_i18n.t)(($) => $.obsidianLib.pluginRequirement.enableFailed, { requiredPluginName: (0, import_html_element.asCodeBlock)(pluginName) })
348
+ ));
349
+ throw error;
350
+ }
351
+ }
352
+ async function runRepair(repair) {
353
+ try {
354
+ await repair();
355
+ } catch (error) {
356
+ console.error(error);
357
+ }
358
+ }
359
+ async function waitForAvailability(params) {
360
+ const {
361
+ abortSignal,
362
+ app,
363
+ component,
364
+ onSettled,
365
+ onUnavailable,
366
+ pluginId,
367
+ resolvedTimeoutInMilliseconds
368
+ } = params;
369
+ abortSignal?.throwIfAborted();
370
+ return await new Promise((resolve, reject) => {
371
+ let isSettled = false;
372
+ let timeoutId = null;
373
+ let removeWaitComponent = null;
374
+ const eventRefs = [];
375
+ function cleanUp() {
376
+ isSettled = true;
377
+ removeWaitComponent?.();
378
+ removeWaitComponent = null;
379
+ for (const [source, eventRef] of eventRefs) {
380
+ source.offref(eventRef);
381
+ }
382
+ eventRefs.length = 0;
383
+ abortSignal?.removeEventListener("abort", handleAbort);
384
+ if (timeoutId !== null) {
385
+ window.clearTimeout(timeoutId);
386
+ timeoutId = null;
387
+ }
388
+ onSettled?.();
389
+ }
390
+ function fail(error) {
391
+ if (isSettled) {
392
+ return;
393
+ }
394
+ cleanUp();
395
+ reject(error);
396
+ }
397
+ function handleAbort($event) {
398
+ const reason = (0, import_object_utils.castTo)($event.target).reason;
399
+ fail(reason instanceof Error ? reason : new Error(String(reason), { cause: reason }));
400
+ }
401
+ function check() {
402
+ const availability = getPluginAvailability(params);
403
+ if (availability === "available" /* Available */) {
404
+ const plugin = app.plugins.getPlugin(pluginId);
405
+ cleanUp();
406
+ resolve(plugin);
407
+ return;
408
+ }
409
+ onUnavailable?.(availability);
410
+ }
411
+ eventRefs.push(
412
+ [app.plugins, app.plugins.on(PLUGINS_CHANGED_EVENT_NAME, check)],
413
+ [app.workspace, app.workspace.on(import_plugin_lifecycle_events.PLUGIN_LOADED_EVENT_NAME, check)]
414
+ );
415
+ abortSignal?.addEventListener("abort", handleAbort);
416
+ if (component) {
417
+ const waitComponent = new import_obsidian.Component();
418
+ waitComponent.register(() => {
419
+ fail(new Error(`The wait for plugin "${pluginId}" ended because its component unloaded.`));
420
+ });
421
+ component.addChild(waitComponent);
422
+ removeWaitComponent = () => {
423
+ component.removeChild(waitComponent);
424
+ };
425
+ }
426
+ if (resolvedTimeoutInMilliseconds !== null) {
427
+ timeoutId = window.setTimeout(() => {
428
+ fail(
429
+ new PluginInstanceUnavailableError({
430
+ availability: getPluginAvailability(params),
431
+ pluginId
432
+ })
433
+ );
434
+ }, resolvedTimeoutInMilliseconds);
435
+ }
436
+ check();
437
+ });
438
+ }
439
+ // Annotate the CommonJS export names for ESM import in node:
440
+ 0 && (module.exports = {
441
+ PluginAvailability,
442
+ PluginInstanceUnavailableError,
443
+ getLoadedPlugin,
444
+ getPluginAvailability,
445
+ requirePlugin,
446
+ waitForPlugin
447
+ });
448
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wbHVnaW4vcGx1Z2luLWluc3RhbmNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBbm90aGVyIHBsdWdpbidzIElOU1RBTkNFOiB3aGV0aGVyIGl0IGlzIHRoZXJlLCB3YWl0aW5nIGZvciBpdCwgYW5kIGFza2luZyB0aGUgdXNlciB0byBicmluZyBpdCBpbi5cbiAqXG4gKiBUaGlzIGlzIHRoZSBwYXRoIGZvciBhIHBsdWdpbiB0aGF0IHB1Ymxpc2hlcyBub3RoaW5nIHRocm91Z2ggdGhlIGxpYnJhcnkncyByZWdpc3RyeSwgd2hpY2ggaXMgbW9zdCBvZlxuICogdGhlbS4gQSBwcm92aWRlciB0aGF0IGRvZXMgcHVibGlzaCBpcyBiZXR0ZXIgcmVhY2hlZCB0aHJvdWdoIGB3YXRjaFBsdWdpbkFwaWAgKGAuL3BsdWdpbi1hcGkudHNgKTogaXRzXG4gKiByZWZlcmVuY2UgaXMgbGl2ZSwgdmVyc2lvbi1uZWdvdGlhdGVkIGFuZCByZXZva2VkIHdoZW4gdGhlIHByb3ZpZGVyIGdvZXMgYXdheSwgbm9uZSBvZiB3aGljaCBhIGJhcmVcbiAqIGluc3RhbmNlIG9mZmVycy4gQW5kIGEgcGx1Z2luIHRoYXQgbXVzdCBTVE9QIHJ1bm5pbmcgd2hlbiBhbm90aGVyIG9uZSBnb2VzIGF3YXkgZGVjbGFyZXMgaXQgdGhyb3VnaFxuICogYFBsdWdpbkJhc2UuZ2V0UGx1Z2luRGVwZW5kZW5jaWVzKClgLCB3aG9zZSBnYXRlIG93bnMgdGhhdCB0ZWFyZG93biDigJQge0BsaW5rIHJlcXVpcmVQbHVnaW59IGlzIGEgb25lLXNob3RcbiAqIHdhaXQsIG5vdCBhIHNlY29uZCBkZXBlbmRlbmN5IHN5c3RlbS5cbiAqXG4gKiBXaGF0IFwibG9hZGVkXCIgY2FuIGFuZCBjYW5ub3QgbWVhbiwgcmVhZCBmcm9tIE9ic2lkaWFuIGAxLjE1LjFgOlxuICpcbiAqIC0gYFBsdWdpbnMubG9hZFBsdWdpbmAgc3RvcmVzIHRoZSBpbnN0YW5jZSBpbiBgYXBwLnBsdWdpbnMucGx1Z2luc2AgQkVGT1JFIGl0IGF3YWl0cyBgcGx1Z2luLmxvYWQoKWAsIGFuZFxuICogICBgUGx1Z2luLmxvYWRgIHNldHMgYF9sb2FkZWRgIGJlZm9yZSBpdCBhd2FpdHMgYG9ubG9hZCgpYC4gU28gYGFwcC5wbHVnaW5zLmdldFBsdWdpbihpZClgIGNhbiByZXR1cm4gYVxuICogICBwbHVnaW4gd2hvc2UgYG9ubG9hZGAgaXMgc3RpbGwgcnVubmluZywgYW5kIGBfbG9hZGVkYCBjYW5ub3QgdGVsbCB0aGUgdHdvIGFwYXJ0LlxuICogICBgUGx1Z2lucy5lbmFibGVQbHVnaW5gIGJyYWNrZXRzIHRoZSBsb2FkIHdpdGggYGxvYWRpbmdQbHVnaW5JZGAsIHdoaWNoIGlzIHRoZSBvbmUgc2lnbmFsIHRoYXQgZG9lcywgc29cbiAqICAgYW4gaW5zdGFuY2Ugd2hvc2UgaWQgaXMgYGxvYWRpbmdQbHVnaW5JZGAgcmVhZHMgYXMge0BsaW5rIFBsdWdpbkF2YWlsYWJpbGl0eS5Mb2FkaW5nfS5cbiAqIC0gYG9ubG9hZGAgaGF2aW5nIHNldHRsZWQgaXMgdGhlIG1vc3QgYW55dGhpbmcgY2FuIHByb21pc2UuIEEgcGx1Z2luIHRoYXQgc3RhcnRzIGZ1cnRoZXIgd29yayBmcm9tXG4gKiAgIGBvbmxvYWRgIHdpdGhvdXQgYXdhaXRpbmcgaXQsIG9yIHdhaXRzIGZvciBsYXlvdXQtcmVhZHksIGlzIFwibG9hZGVkXCIgYmVmb3JlIHRoYXQgd29yayBpcyBkb25lLCBhbmRcbiAqICAgT2JzaWRpYW4gaGFzIG5vIGhvb2sgc2F5aW5nIGV2ZXJ5IHBsdWdpbiBoYXMgZmluaXNoZWQgaW5pdGlhbGl6aW5nLiBBIHBsdWdpbiBidWlsdCBvbiB0aGlzIGxpYnJhcnlcbiAqICAgc2F5cyBtb3JlIHRocm91Z2ggdGhlIGBvYnNpZGlhbi1saWI6cGx1Z2luLWxvYWRlZGAgYnJvYWRjYXN0LCB3aGljaCBmb2xsb3dzIGl0cyBwdWJsaXNoZWQgQVBJcy5cbiAqIC0gYGFwcC5wbHVnaW5zYCBpcyBhbiBgRXZlbnRzYCBzb3VyY2UgdGhhdCB0cmlnZ2VycyBgY2hhbmdlZGAsIGRlYm91bmNlZCBieSBvbmUgbWFjcm90YXNrLCBhZnRlciBldmVyeVxuICogICBlbmFibGUsIGRpc2FibGUsIGluc3RhbGwsIHVuaW5zdGFsbCBhbmQgbWFuaWZlc3QgcmVsb2FkLiBUaGF0IGlzIHdoYXQgYSB3YWl0IHN1YnNjcmliZXMgdG8sIHNvIG5vdGhpbmdcbiAqICAgaGVyZSBwb2xscy4gSXQgZmlyZXMgYWZ0ZXIgYGVuYWJsZVBsdWdpbmAgcmV0dXJuZWQsIHdoZW4gYGxvYWRpbmdQbHVnaW5JZGAgaXMgYG51bGxgIGFnYWluLlxuICpcbiAqIEEgdHlwZSBhcmd1bWVudCBhbG9uZSBpcyBhIGNhbGxlcidzIEFTU0VSVElPTiBhYm91dCB0aGUgaW5zdGFuY2UsIG5vdCBhIGNoZWNrOiBub3RoaW5nIGF0IHJ1bnRpbWUga25vd3NcbiAqIHdoYXQgYFRQbHVnaW5gIGlzLiBQYXNzIGBpc1BsdWdpbmAgdG8gaGF2ZSB0aGUgc2hhcGUgdmVyaWZpZWQ7IGFuIGluc3RhbmNlIGZhaWxpbmcgaXQgcmVhZHMgYXNcbiAqIHtAbGluayBQbHVnaW5BdmFpbGFiaWxpdHkuU2hhcGVNaXNtYXRjaH0sIHRoZSB1c3VhbCBzaWduIG9mIGEgcmVsZWFzZSB0aGF0IHJlbmFtZWQgd2hhdCB0aGUgY2FsbGVyIHVzZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEV2ZW50UmVmLFxuICBFdmVudHMsXG4gIFBsdWdpblxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9hc3luYyc7XG5pbXBvcnQgeyBjYXN0VG8gfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvb2JqZWN0LXV0aWxzJztcbmltcG9ydCB7XG4gIEJ1dHRvbkNvbXBvbmVudCxcbiAgQ29tcG9uZW50XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21wb25lbnRzL3BsdWdpbi1ub3RpY2UtY29tcG9uZW50LnRzJztcblxuaW1wb3J0IHsgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yIH0gZnJvbSAnLi4vY29tbXVuaXR5LXBsdWdpbnMudHMnO1xuaW1wb3J0IHsgUGx1Z2luTm90aWNlTW9kZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHtcbiAgYXNDb2RlQmxvY2ssXG4gIGNyZWF0ZUZyYWdtZW50V2l0aENvZGVCbG9ja3Ncbn0gZnJvbSAnLi4vaHRtbC1lbGVtZW50LnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgb3BlblNldHRpbmdUYWIgfSBmcm9tICcuLi9zZXR0aW5ncy1tb2RhbC50cyc7XG5pbXBvcnQge1xuICBjb21wYXJlUGx1Z2luVmVyc2lvbldpdGhNaW5pbXVtLFxuICBpbnN0YWxsQW5kRW5hYmxlUGx1Z2luLFxuICBQbHVnaW5WZXJzaW9uQ29tcGFyaXNvbixcbiAgdXBkYXRlUGx1Z2luXG59IGZyb20gJy4vcGx1Z2luLWluc3RhbGwtc3RhdGUudHMnO1xuaW1wb3J0IHsgUExVR0lOX0xPQURFRF9FVkVOVF9OQU1FIH0gZnJvbSAnLi9wbHVnaW4tbGlmZWN5Y2xlLWV2ZW50cy50cyc7XG5cbi8qKlxuICogSG93IGxvbmcge0BsaW5rIHdhaXRGb3JQbHVnaW59IHdhaXRzIGJ5IGRlZmF1bHQgYmVmb3JlIGdpdmluZyB1cC5cbiAqL1xuY29uc3QgREVGQVVMVF9XQUlUX0ZPUl9QTFVHSU5fVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMF8wMDA7XG5cbi8qKlxuICogVGhlIGV2ZW50IGBhcHAucGx1Z2luc2AgdHJpZ2dlcnMgYWZ0ZXIgZXZlcnkgZW5hYmxlLCBkaXNhYmxlLCBpbnN0YWxsLCB1bmluc3RhbGwgYW5kIG1hbmlmZXN0IHJlbG9hZC5cbiAqL1xuY29uc3QgUExVR0lOU19DSEFOR0VEX0VWRU5UX05BTUUgPSAnY2hhbmdlZCc7XG5cbi8qKlxuICogVGhlIGlkIG9mIE9ic2lkaWFuJ3MgY29tbXVuaXR5IHBsdWdpbnMgc2V0dGluZ3MgdGFiLlxuICovXG5jb25zdCBDT01NVU5JVFlfUExVR0lOU19TRVRUSU5HX1RBQl9JRCA9ICdjb21tdW5pdHktcGx1Z2lucyc7XG5cbi8qKlxuICogV2hldGhlciBhbm90aGVyIHBsdWdpbidzIGluc3RhbmNlIGNhbiBiZSB1c2VkIHJpZ2h0IG5vdywgYW5kIGlmIG5vdCwgd2h5LlxuICovXG5leHBvcnQgZW51bSBQbHVnaW5BdmFpbGFiaWxpdHkge1xuICAvKipcbiAgICogTG9hZGVkLCBgb25sb2FkYCBzZXR0bGVkLCBhbmQgZXZlcnkgZGVjbGFyZWQgcmVxdWlyZW1lbnQgbWV0LlxuICAgKi9cbiAgQXZhaWxhYmxlID0gJ2F2YWlsYWJsZScsXG5cbiAgLyoqXG4gICAqIFJ1bm5pbmcgYXQgYSByZWxlYXNlIHdob3NlIGBtYW5pZmVzdC52ZXJzaW9uYCBjYW5ub3QgYmUgcGFyc2VkLCB3aGlsZSB0aGUgY2FsbGVyIGRlY2xhcmVkIGFcbiAgICoge0BsaW5rIEdldFBsdWdpbkF2YWlsYWJpbGl0eVBhcmFtcy5taW5QbHVnaW5WZXJzaW9ufS4gQ291bnRzIGFzIHVuYXZhaWxhYmxlLCBiZWNhdXNlIGZhaWxpbmcgY2xvc2VkIGlzIHRoZVxuICAgKiBzYWZlIGRpcmVjdGlvbi5cbiAgICovXG4gIEludmFsaWRWZXJzaW9uID0gJ2ludmFsaWRWZXJzaW9uJyxcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIGV4aXN0cyBidXQgaXRzIGBvbmxvYWRgIGhhcyBub3Qgc2V0dGxlZCB5ZXQuXG4gICAqL1xuICBMb2FkaW5nID0gJ2xvYWRpbmcnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYnV0IG5laXRoZXIgZW5hYmxlZCBub3IgcnVubmluZy5cbiAgICovXG4gIE5vdEVuYWJsZWQgPSAnbm90RW5hYmxlZCcsXG5cbiAgLyoqXG4gICAqIE5vdCBpbnN0YWxsZWQgaW4gdGhpcyB2YXVsdC5cbiAgICovXG4gIE5vdEluc3RhbGxlZCA9ICdub3RJbnN0YWxsZWQnLFxuXG4gIC8qKlxuICAgKiBJbnN0YWxsZWQgYW5kIGVuYWJsZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24sIGJ1dCBubyBpbnN0YW5jZSBpcyBydW5uaW5nLiBBdCBzdGFydHVwIHRoYXQgaXMgYSBwbHVnaW5cbiAgICogT2JzaWRpYW4gaGFzIG5vdCByZWFjaGVkIHlldDsgbGF0ZXIgaXQgaXMgb25lIHRoYXQgZmFpbGVkIHRvIGxvYWQsIG9yIG9uZSBzd2l0Y2hlZCBvZmYgYnkgYSBkaXNhYmxlIHRoYXRcbiAgICogZG9lcyBub3QgdG91Y2ggdGhlIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBOb3RMb2FkZWQgPSAnbm90TG9hZGVkJyxcblxuICAvKipcbiAgICogUnVubmluZyBhdCBhIHJlbGVhc2Ugb2xkZXIgdGhhbiB0aGUgY2FsbGVyJ3Mge0BsaW5rIEdldFBsdWdpbkF2YWlsYWJpbGl0eVBhcmFtcy5taW5QbHVnaW5WZXJzaW9ufS5cbiAgICovXG4gIE91dGRhdGVkID0gJ291dGRhdGVkJyxcblxuICAvKipcbiAgICogUnVubmluZywgYnV0IHRoZSBjYWxsZXIncyB7QGxpbmsgR2V0UGx1Z2luQXZhaWxhYmlsaXR5UGFyYW1zLmlzUGx1Z2lufSByZWplY3RlZCB0aGUgaW5zdGFuY2UuXG4gICAqL1xuICBTaGFwZU1pc21hdGNoID0gJ3NoYXBlTWlzbWF0Y2gnXG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGdldExvYWRlZFBsdWdpbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHBsdWdpbiB0eXBlIHRoZSBjYWxsZXIgZXhwZWN0cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2V0TG9hZGVkUGx1Z2luUGFyYW1zPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gPSBQbHVnaW4+ID0gR2V0UGx1Z2luQXZhaWxhYmlsaXR5UGFyYW1zPFRQbHVnaW4+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRQbHVnaW5BdmFpbGFiaWxpdHl9LlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSBwbHVnaW4gdHlwZSB0aGUgY2FsbGVyIGV4cGVjdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UGx1Z2luQXZhaWxhYmlsaXR5UGFyYW1zPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gPSBQbHVnaW4+IHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICByZWFkb25seSBhcHA6IEFwcDtcblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgcnVubmluZyBpbnN0YW5jZSBpcyB0aGUgc2hhcGUgdGhlIGNhbGxlciB1c2VzLiBXaXRob3V0IGl0LCBgVFBsdWdpbmAgaXMgYW5cbiAgICogYXNzZXJ0aW9uIG5vdGhpbmcgY2hlY2tzLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHJ1bm5pbmcgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGluc3RhbmNlIGlzIGEgYFRQbHVnaW5gLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQbHVnaW4/OiAocGx1Z2luOiBQbHVnaW4pID0+IHBsdWdpbiBpcyBUUGx1Z2luO1xuXG4gIC8qKlxuICAgKiBUaGUgb2xkZXN0IHJlbGVhc2Ugb2YgdGhlIHBsdWdpbiB0aGUgY2FsbGVyIHdvcmtzIHdpdGgsIGNvbXBhcmVkIHdpdGggaXRzIGBtYW5pZmVzdC52ZXJzaW9uYC4gVGhpcyBpc1xuICAgKiBhIHBsdWdpbiBSRUxFQVNFLCBuZXZlciBhbiBBUEkgY29udHJhY3QgdmVyc2lvbjogYSBwcm92aWRlciBwdWJsaXNoaW5nIGEgdmVyc2lvbmVkIGNvbnRyYWN0IGlzIHJlYWNoZWRcbiAgICogdGhyb3VnaCBgd2F0Y2hQbHVnaW5BcGlgJ3MgYGFwaVZlcnNpb25SYW5nZWAgaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IG1pblBsdWdpblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHRoZSB7QGxpbmsgUGx1Z2luSW5zdGFuY2VVbmF2YWlsYWJsZUVycm9yfSBjb25zdHJ1Y3Rvci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5JbnN0YW5jZVVuYXZhaWxhYmxlRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBXaHkgdGhlIHBsdWdpbiB3YXMgdW5hdmFpbGFibGUgd2hlbiB0aGUgd2FpdCBnYXZlIHVwLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5OiBQbHVnaW5BdmFpbGFiaWxpdHk7XG5cbiAgLyoqXG4gICAqIFRoZSBgbWFuaWZlc3QuaWRgIG9mIHRoZSBwbHVnaW4uXG4gICAqL1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXF1aXJlUGx1Z2lufS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVQbHVnaW5QYXJhbXM8VFBsdWdpbiBleHRlbmRzIFBsdWdpbiA9IFBsdWdpbj4gZXh0ZW5kcyBHZXRQbHVnaW5BdmFpbGFiaWxpdHlQYXJhbXM8VFBsdWdpbj4ge1xuICAvKipcbiAgICogRW5kcyB0aGUgd2FpdCBlYXJseTsgdGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29tcG9uZW50IG93bmluZyB0aGUgd2FpdCBhbmQgaXRzIG5vdGljZS4gSXRzIHVubG9hZCBlbmRzIGJvdGgsIHJlamVjdGluZyB0aGUgcHJvbWlzZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlzcGxheSBuYW1lIG9mIHRoZSByZXF1aXJlZCBwbHVnaW4sIHNob3duIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgYXNraW5nIHBsdWdpbidzIG5vdGljZSBjb21wb25lbnQsIHdoaWNoIHNob3dzIHdoYXQgaXMgbWlzc2luZyBhbmQgdGhlIGJ1dHRvbiB0aGF0IGZpeGVzIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luTm90aWNlQ29tcG9uZW50OiBQbHVnaW5Ob3RpY2VDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaXNwbGF5IG5hbWUgb2YgdGhlIGFza2luZyBwbHVnaW4sIG5hbWVkIGluIHRoZSBub3RpY2UuXG4gICAqL1xuICByZWFkb25seSByZXF1ZXN0aW5nUGx1Z2luTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0byB3YWl0IGJlZm9yZSBnaXZpbmcgdXAuIEJ5IGRlZmF1bHQgdGhlIHdhaXQgbGFzdHMgdW50aWwgdGhlIHVzZXIgcmVwYWlycyB0aGUgcGx1Z2luLCB0aGVcbiAgICoge0BsaW5rIFJlcXVpcmVQbHVnaW5QYXJhbXMuYWJvcnRTaWduYWx9IGFib3J0cyBvciB0aGUge0BsaW5rIFJlcXVpcmVQbHVnaW5QYXJhbXMuY29tcG9uZW50fSB1bmxvYWRzLlxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayB3YWl0Rm9yUGx1Z2lufS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhaXRGb3JQbHVnaW5QYXJhbXM8VFBsdWdpbiBleHRlbmRzIFBsdWdpbiA9IFBsdWdpbj4gZXh0ZW5kcyBHZXRQbHVnaW5BdmFpbGFiaWxpdHlQYXJhbXM8VFBsdWdpbj4ge1xuICAvKipcbiAgICogRW5kcyB0aGUgd2FpdCBlYXJseTsgdGhlIHByb21pc2UgcmVqZWN0cyB3aXRoIHRoZSBzaWduYWwncyByZWFzb24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBBIGNvbXBvbmVudCB3aG9zZSB1bmxvYWQgZW5kcyB0aGUgd2FpdCwgcmVqZWN0aW5nIHRoZSBwcm9taXNlLiBQYXNzIHRoZSB3YWl0aW5nIHBsdWdpbiwgb3IgdGhlXG4gICAqIGNvbXBvbmVudCB0aGF0IHdpbGwgdXNlIHRoZSBpbnN0YW5jZSwgc28gYSB3YWl0IG5ldmVyIG91dGxpdmVzIGl0cyBjb25zdW1lci5cbiAgICovXG4gIHJlYWRvbmx5IGNvbXBvbmVudD86IENvbXBvbmVudDtcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgcmVqZWN0aW5nIHdpdGggYSB7QGxpbmsgUGx1Z2luSW5zdGFuY2VVbmF2YWlsYWJsZUVycm9yfS5cbiAgICpcbiAgICogQGRlZmF1bHQgMTAwMDBcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUgaW50ZXJuYWwgd2FpdCBib3RoIHB1YmxpYyB3YWl0cyBzaGFyZS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzLlxuICovXG5pbnRlcmZhY2UgV2FpdEZvckF2YWlsYWJpbGl0eVBhcmFtczxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIFdhaXRGb3JQbHVnaW5QYXJhbXM8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2Ugd2hlbiB0aGUgd2FpdCBzZXR0bGVzLCBlaXRoZXIgd2F5LCBhZnRlciBldmVyeSBsaXN0ZW5lciBoYXMgYmVlbiByZW1vdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgb25TZXR0bGVkPzogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2FsbGVkIG9uIGV2ZXJ5IHJlLWV2YWx1YXRpb24gd2hpbGUgdGhlIHBsdWdpbiBpcyBzdGlsbCB1bmF2YWlsYWJsZSwgaW5jbHVkaW5nIHRoZSBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIGF2YWlsYWJpbGl0eSAtIFRoZSBhdmFpbGFiaWxpdHkganVzdCByZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgb25VbmF2YWlsYWJsZT86IChhdmFpbGFiaWxpdHk6IFBsdWdpbkF2YWlsYWJpbGl0eSkgPT4gdm9pZDtcblxuICAvKipcbiAgICogVGhlIHRpbWVvdXQsIG9yIGBudWxsYCBmb3Igbm9uZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkVGltZW91dEluTWlsbGlzZWNvbmRzOiBudWxsIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgcGx1Z2luIGRpZCBub3QgYmVjb21lIGF2YWlsYWJsZSBiZWZvcmUgYSB3YWl0IGdhdmUgdXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5JbnN0YW5jZVVuYXZhaWxhYmxlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBXaHkgdGhlIHBsdWdpbiB3YXMgdW5hdmFpbGFibGUgd2hlbiB0aGUgd2FpdCBnYXZlIHVwLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGF2YWlsYWJpbGl0eTogUGx1Z2luQXZhaWxhYmlsaXR5O1xuXG4gIC8qKlxuICAgKiBUaGUgYG1hbmlmZXN0LmlkYCBvZiB0aGUgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBsdWdpbkluc3RhbmNlVW5hdmFpbGFibGVFcnJvcn0uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFBsdWdpbkluc3RhbmNlVW5hdmFpbGFibGVFcnJvckNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoYFBsdWdpbiBcIiR7cGFyYW1zLnBsdWdpbklkfVwiIGlzIG5vdCBhdmFpbGFibGU6ICR7cGFyYW1zLmF2YWlsYWJpbGl0eX0uYCk7XG4gICAgdGhpcy5uYW1lID0gJ1BsdWdpbkluc3RhbmNlVW5hdmFpbGFibGVFcnJvcic7XG4gICAgdGhpcy5hdmFpbGFiaWxpdHkgPSBwYXJhbXMuYXZhaWxhYmlsaXR5O1xuICAgIHRoaXMucGx1Z2luSWQgPSBwYXJhbXMucGx1Z2luSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFub3RoZXIgcGx1Z2luJ3MgaW5zdGFuY2Ugd2hlbiBpdCBpcyB7QGxpbmsgUGx1Z2luQXZhaWxhYmlsaXR5LkF2YWlsYWJsZX0sIGFuZCBgbnVsbGAgb3RoZXJ3aXNlLlxuICpcbiAqIFVubGlrZSBgYXBwLnBsdWdpbnMuZ2V0UGx1Z2luYCwgaXQgbmV2ZXIgcmV0dXJucyBhbiBpbnN0YW5jZSB3aG9zZSBgb25sb2FkYCBpcyBzdGlsbCBydW5uaW5nLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSBwbHVnaW4gdHlwZSB0aGUgY2FsbGVyIGV4cGVjdHM7IGNoZWNrZWQgb25seSB0aHJvdWdoIGBpc1BsdWdpbmAuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBHZXRQbHVnaW5BdmFpbGFiaWxpdHlQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGluc3RhbmNlLCBvciBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2FkZWRQbHVnaW48VFBsdWdpbiBleHRlbmRzIFBsdWdpbiA9IFBsdWdpbj4ocGFyYW1zOiBHZXRMb2FkZWRQbHVnaW5QYXJhbXM8Tm9JbmZlcjxUUGx1Z2luPj4pOiBudWxsIHwgVFBsdWdpbiB7XG4gIHJldHVybiBnZXRQbHVnaW5BdmFpbGFiaWxpdHkocGFyYW1zKSA9PT0gUGx1Z2luQXZhaWxhYmlsaXR5LkF2YWlsYWJsZSA/IChwYXJhbXMuYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKHBhcmFtcy5wbHVnaW5JZCkgYXMgVFBsdWdpbikgOiBudWxsO1xufVxuXG4vKipcbiAqIFJlYWRzIHdoZXRoZXIgYW5vdGhlciBwbHVnaW4ncyBpbnN0YW5jZSBjYW4gYmUgdXNlZCByaWdodCBub3csIGFuZCBpZiBub3QsIHdoeS5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0UGx1Z2luQXZhaWxhYmlsaXR5UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSB7QGxpbmsgUGx1Z2luQXZhaWxhYmlsaXR5fS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBsdWdpbkF2YWlsYWJpbGl0eTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luID0gUGx1Z2luPihwYXJhbXM6IEdldFBsdWdpbkF2YWlsYWJpbGl0eVBhcmFtczxOb0luZmVyPFRQbHVnaW4+Pik6IFBsdWdpbkF2YWlsYWJpbGl0eSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgaXNQbHVnaW4sXG4gICAgbWluUGx1Z2luVmVyc2lvbixcbiAgICBwbHVnaW5JZFxuICB9ID0gcGFyYW1zO1xuICBjb25zdCBwbHVnaW4gPSBhcHAucGx1Z2lucy5nZXRQbHVnaW4ocGx1Z2luSWQpO1xuXG4gIGlmIChwbHVnaW4gPT09IG51bGwpIHtcbiAgICBpZiAoIU9iamVjdC5oYXNPd24oYXBwLnBsdWdpbnMubWFuaWZlc3RzLCBwbHVnaW5JZCkpIHtcbiAgICAgIHJldHVybiBQbHVnaW5BdmFpbGFiaWxpdHkuTm90SW5zdGFsbGVkO1xuICAgIH1cblxuICAgIHJldHVybiBhcHAucGx1Z2lucy5lbmFibGVkUGx1Z2lucy5oYXMocGx1Z2luSWQpID8gUGx1Z2luQXZhaWxhYmlsaXR5Lk5vdExvYWRlZCA6IFBsdWdpbkF2YWlsYWJpbGl0eS5Ob3RFbmFibGVkO1xuICB9XG5cbiAgaWYgKGFwcC5wbHVnaW5zLmxvYWRpbmdQbHVnaW5JZCA9PT0gcGx1Z2luSWQpIHtcbiAgICByZXR1cm4gUGx1Z2luQXZhaWxhYmlsaXR5LkxvYWRpbmc7XG4gIH1cblxuICBpZiAobWluUGx1Z2luVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29tcGFyaXNvbiA9IGNvbXBhcmVQbHVnaW5WZXJzaW9uV2l0aE1pbmltdW0ocGx1Z2luLm1hbmlmZXN0LnZlcnNpb24sIG1pblBsdWdpblZlcnNpb24pO1xuICAgIGlmIChjb21wYXJpc29uID09PSBQbHVnaW5WZXJzaW9uQ29tcGFyaXNvbi5CZWxvd01pbmltdW0pIHtcbiAgICAgIHJldHVybiBQbHVnaW5BdmFpbGFiaWxpdHkuT3V0ZGF0ZWQ7XG4gICAgfVxuXG4gICAgaWYgKGNvbXBhcmlzb24gPT09IFBsdWdpblZlcnNpb25Db21wYXJpc29uLkludmFsaWQpIHtcbiAgICAgIHJldHVybiBQbHVnaW5BdmFpbGFiaWxpdHkuSW52YWxpZFZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzUGx1Z2luICYmICFpc1BsdWdpbihwbHVnaW4pID8gUGx1Z2luQXZhaWxhYmlsaXR5LlNoYXBlTWlzbWF0Y2ggOiBQbHVnaW5BdmFpbGFiaWxpdHkuQXZhaWxhYmxlO1xufVxuXG4vKipcbiAqIFdhaXRzIGZvciBhbm90aGVyIHBsdWdpbiB0byBiZWNvbWUge0BsaW5rIFBsdWdpbkF2YWlsYWJpbGl0eS5BdmFpbGFibGV9LCBhc2tpbmcgdGhlIHVzZXIgdG8gcmVwYWlyIGl0XG4gKiB3aGlsZSBpdCBpcyBub3QuXG4gKlxuICogUmVzb2x2ZXMgYXQgb25jZSB3aGVuIGl0IGFscmVhZHkgaXMuIE90aGVyd2lzZSwgb25jZSB0aGUgd29ya3NwYWNlIGxheW91dCBpcyByZWFkeSDigJQgYmVmb3JlIHRoYXQsIGFcbiAqIHBsdWdpbiBPYnNpZGlhbiBoYXMgbm90IGxvYWRlZCB5ZXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIG1pc3Npbmcgb25lIOKAlCBhIG5vdGljZSBzYXlzIHdoYXQgaXMgd3JvbmdcbiAqIGFuZCBvZmZlcnMgdGhlIG1hdGNoaW5nIHJlcGFpcjogaW5zdGFsbCwgZW5hYmxlLCBvciB1cGRhdGUsIHBsdXMgYSB3YXkgdG8gdGhlIGNvbW11bml0eSBwbHVnaW5zIGxpc3QuXG4gKiBUaGUgbm90aWNlIGZvbGxvd3MgdGhlIHN0YXRlIGFzIGl0IGNoYW5nZXMgYW5kIGdvZXMgYXdheSB3aGVuIHRoZSB3YWl0IHNldHRsZXMuIEEgcmVwYWlyIHRoYXQgZmFpbHMgaXNcbiAqIHJlcG9ydGVkIGFuZCBsZWF2ZXMgdGhlIHdhaXQgcnVubmluZywgc28gdGhlIHVzZXIgY2FuIHRyeSBhZ2FpbiBvciBmaXggaXQgYnkgaGFuZC5cbiAqXG4gKiBUaGUgcHJvbWlzZSBzZXR0bGVzIE9OQ0UuIEl0IGRvZXMgbm90IHdhdGNoIHRoZSBwbHVnaW4gYWZ0ZXJ3YXJkczogYSBjb25zdW1lciB0aGF0IG11c3Qgc3RvcCB3aGVuIHRoZVxuICogcGx1Z2luIGdvZXMgYXdheSBkZWNsYXJlcyBhIGRlcGVuZGVuY3kgdGhyb3VnaCBgUGx1Z2luQmFzZS5nZXRQbHVnaW5EZXBlbmRlbmNpZXMoKWAgaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzOyBjaGVja2VkIG9ubHkgdGhyb3VnaCBgaXNQbHVnaW5gLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgUmVxdWlyZVBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgd2l0aCB0aGUgaW5zdGFuY2UuXG4gKiBAdGhyb3dzIFRoZSBhYm9ydCByZWFzb24sIG9yIGFuIGVycm9yIG5hbWluZyB0aGUgdW5sb2FkZWQgY29tcG9uZW50LCB3aGVuIHRoZSB3YWl0IGlzIGVuZGVkIGVhcmx5LlxuICogQHRocm93cyB7QGxpbmsgUGx1Z2luSW5zdGFuY2VVbmF2YWlsYWJsZUVycm9yfSBXaGVuIHtAbGluayBSZXF1aXJlUGx1Z2luUGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kc30gZWxhcHNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVQbHVnaW48VFBsdWdpbiBleHRlbmRzIFBsdWdpbiA9IFBsdWdpbj4ocGFyYW1zOiBSZXF1aXJlUGx1Z2luUGFyYW1zPE5vSW5mZXI8VFBsdWdpbj4+KTogUHJvbWlzZTxUUGx1Z2luPiB7XG4gIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gIGxldCBzaG93bkF2YWlsYWJpbGl0eTogbnVsbCB8IFBsdWdpbkF2YWlsYWJpbGl0eSA9IG51bGw7XG4gIC8vIGBMb2FkaW5nYCBpcyBuZXZlciBzaG93biwgc28gaXQgc3RhbmRzIGluIGZvciBcIm5vdCByZWFkIHlldFwiLlxuICBsZXQgbGF0ZXN0QXZhaWxhYmlsaXR5ID0gUGx1Z2luQXZhaWxhYmlsaXR5LkxvYWRpbmc7XG4gIGxldCBoaWRlTm90aWNlOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgbGV0IGlzU2V0dGxlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIHNob3coYXZhaWxhYmlsaXR5OiBQbHVnaW5BdmFpbGFiaWxpdHkpOiB2b2lkIHtcbiAgICBpZiAoaXNTZXR0bGVkIHx8ICFhcHAud29ya3NwYWNlLmxheW91dFJlYWR5IHx8IGF2YWlsYWJpbGl0eSA9PT0gc2hvd25BdmFpbGFiaWxpdHkgfHwgYXZhaWxhYmlsaXR5ID09PSBQbHVnaW5BdmFpbGFiaWxpdHkuTG9hZGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVOb3RpY2U/LigpO1xuICAgIHNob3duQXZhaWxhYmlsaXR5ID0gYXZhaWxhYmlsaXR5O1xuICAgIGNvbnN0IG5vdGljZSA9IHBhcmFtcy5wbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZShjcmVhdGVSZXF1aXJlbWVudEZyYWdtZW50KHBhcmFtcywgYXZhaWxhYmlsaXR5KSwge1xuICAgICAgbW9kZTogUGx1Z2luTm90aWNlTW9kZS5TZXBhcmF0ZSxcbiAgICAgIHNob3VsZEhpZGVPbkNsaWNrOiBmYWxzZVxuICAgIH0pO1xuICAgIGhpZGVOb3RpY2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICBub3RpY2UuaGlkZSgpO1xuICAgIH07XG4gIH1cblxuICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICBhcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkoKCkgPT4ge1xuICAgICAgc2hvdyhsYXRlc3RBdmFpbGFiaWxpdHkpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IHdhaXRGb3JBdmFpbGFiaWxpdHkoe1xuICAgIC4uLnBhcmFtcyxcbiAgICBvblNldHRsZWQ6ICgpID0+IHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICBoaWRlTm90aWNlPy4oKTtcbiAgICB9LFxuICAgIG9uVW5hdmFpbGFibGU6IChhdmFpbGFiaWxpdHkpID0+IHtcbiAgICAgIGxhdGVzdEF2YWlsYWJpbGl0eSA9IGF2YWlsYWJpbGl0eTtcbiAgICAgIHNob3coYXZhaWxhYmlsaXR5KTtcbiAgICB9LFxuICAgIHJlc29sdmVkVGltZW91dEluTWlsbGlzZWNvbmRzOiBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzID8/IG51bGxcbiAgfSk7XG59XG5cbi8qKlxuICogV2FpdHMgZm9yIGFub3RoZXIgcGx1Z2luIHRvIGJlY29tZSB7QGxpbmsgUGx1Z2luQXZhaWxhYmlsaXR5LkF2YWlsYWJsZX0uXG4gKlxuICogUmVzb2x2ZXMgYXQgb25jZSB3aGVuIGl0IGFscmVhZHkgaXMsIHdoaWNoIGNvdmVycyBhIGNvbnN1bWVyIHJlbG9hZGVkIGFmdGVyIGl0cyBkZXBlbmRlbmN5LiBPdGhlcndpc2UgaXRcbiAqIHJlLXJlYWRzIHRoZSBzdGF0ZSBvbiBldmVyeSBgYXBwLnBsdWdpbnNgIGBjaGFuZ2VkYCBhbmQgZXZlcnkgYG9ic2lkaWFuLWxpYjpwbHVnaW4tbG9hZGVkYCBicm9hZGNhc3QsIHNvIGFcbiAqIHBsdWdpbiBlbmFibGVkLCB1cGRhdGVkIG9yIHJlbG9hZGVkIGxhdGVyIGlzIHBpY2tlZCB1cCB3aXRoIG5vIHBvbGxpbmcuIEl0IHN1YnNjcmliZXMgYmVmb3JlIGl0cyBmaXJzdFxuICogcmVhZCwgc28gYSBjaGFuZ2UgbGFuZGluZyBpbiBiZXR3ZWVuIGNhbm5vdCBiZSBtaXNzZWQuIEV2ZXJ5IGxpc3RlbmVyIGFuZCB0aW1lciBpcyByZW1vdmVkIHdoZW4gaXQgc2V0dGxlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgcGx1Z2luIHR5cGUgdGhlIGNhbGxlciBleHBlY3RzOyBjaGVja2VkIG9ubHkgdGhyb3VnaCBgaXNQbHVnaW5gLlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgV2FpdEZvclBsdWdpblBhcmFtc30uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgd2l0aCB0aGUgaW5zdGFuY2UuXG4gKiBAdGhyb3dzIFRoZSBhYm9ydCByZWFzb24sIG9yIGFuIGVycm9yIG5hbWluZyB0aGUgdW5sb2FkZWQgY29tcG9uZW50LCB3aGVuIHRoZSB3YWl0IGlzIGVuZGVkIGVhcmx5LlxuICogQHRocm93cyB7QGxpbmsgUGx1Z2luSW5zdGFuY2VVbmF2YWlsYWJsZUVycm9yfSBXaGVuIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGNhcnJ5aW5nIHRoZSBhdmFpbGFiaWxpdHkgYXQgdGhhdCBtb21lbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3YWl0Rm9yUGx1Z2luPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gPSBQbHVnaW4+KHBhcmFtczogV2FpdEZvclBsdWdpblBhcmFtczxOb0luZmVyPFRQbHVnaW4+Pik6IFByb21pc2U8VFBsdWdpbj4ge1xuICByZXR1cm4gYXdhaXQgd2FpdEZvckF2YWlsYWJpbGl0eSh7XG4gICAgLi4ucGFyYW1zLFxuICAgIHJlc29sdmVkVGltZW91dEluTWlsbGlzZWNvbmRzOiBwYXJhbXMudGltZW91dEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfV0FJVF9GT1JfUExVR0lOX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXF1aXJlbWVudEZyYWdtZW50PFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4+KHBhcmFtczogUmVxdWlyZVBsdWdpblBhcmFtczxUUGx1Z2luPiwgYXZhaWxhYmlsaXR5OiBQbHVnaW5BdmFpbGFiaWxpdHkpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBtaW5QbHVnaW5WZXJzaW9uID0gJycsXG4gICAgcGx1Z2luSWQsXG4gICAgcGx1Z2luTmFtZSxcbiAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgcmVxdWVzdGluZ1BsdWdpbk5hbWVcbiAgfSA9IHBhcmFtcztcbiAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IHtcbiAgICBtaW5QbHVnaW5WZXJzaW9uLFxuICAgIHBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHJlcXVlc3RpbmdQbHVnaW5OYW1lKSxcbiAgICByZXF1aXJlZFBsdWdpbk5hbWU6IGFzQ29kZUJsb2NrKHBsdWdpbk5hbWUpXG4gIH07XG5cbiAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50KChmcmFnbWVudEVsKSA9PiB7XG4gICAgZnJhZ21lbnRFbC5hcHBlbmQoY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2Nrcyh0KCgkKSA9PiB7XG4gICAgICBzd2l0Y2ggKGF2YWlsYWJpbGl0eSkge1xuICAgICAgICBjYXNlIFBsdWdpbkF2YWlsYWJpbGl0eS5JbnZhbGlkVmVyc2lvbjoge1xuICAgICAgICAgIHJldHVybiAkLm9ic2lkaWFuTGliLnBsdWdpblJlcXVpcmVtZW50LmludmFsaWRWZXJzaW9uTm90aWNlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGx1Z2luQXZhaWxhYmlsaXR5Lk5vdEVuYWJsZWQ6IHtcbiAgICAgICAgICByZXR1cm4gJC5vYnNpZGlhbkxpYi5wbHVnaW5SZXF1aXJlbWVudC5ub3RFbmFibGVkTm90aWNlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgUGx1Z2luQXZhaWxhYmlsaXR5Lk5vdEluc3RhbGxlZDoge1xuICAgICAgICAgIHJldHVybiAkLm9ic2lkaWFuTGliLnBsdWdpblJlcXVpcmVtZW50Lm5vdEluc3RhbGxlZE5vdGljZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlIFBsdWdpbkF2YWlsYWJpbGl0eS5Ob3RMb2FkZWQ6IHtcbiAgICAgICAgICByZXR1cm4gJC5vYnNpZGlhbkxpYi5wbHVnaW5SZXF1aXJlbWVudC5ub3RMb2FkZWROb3RpY2U7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSBQbHVnaW5BdmFpbGFiaWxpdHkuT3V0ZGF0ZWQ6IHtcbiAgICAgICAgICByZXR1cm4gJC5vYnNpZGlhbkxpYi5wbHVnaW5SZXF1aXJlbWVudC5vdXRkYXRlZE5vdGljZTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgcmV0dXJuICQub2JzaWRpYW5MaWIucGx1Z2luUmVxdWlyZW1lbnQuc2hhcGVNaXNtYXRjaE5vdGljZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIGludGVycG9sYXRpb24pKSk7XG5cbiAgICBjb25zdCBidXR0b25zRWwgPSBmcmFnbWVudEVsLmNyZWF0ZURpdih7XG4gICAgICBjbHM6IFtDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgQ3NzQ2xhc3MuUGx1Z2luU3VnZ2VzdGlvbk5vdGljZUJ1dHRvbnNdXG4gICAgfSk7XG5cbiAgICBzd2l0Y2ggKGF2YWlsYWJpbGl0eSkge1xuICAgICAgY2FzZSBQbHVnaW5BdmFpbGFiaWxpdHkuTm90RW5hYmxlZDpcbiAgICAgIGNhc2UgUGx1Z2luQXZhaWxhYmlsaXR5Lk5vdEluc3RhbGxlZDoge1xuICAgICAgICBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbnNFbClcbiAgICAgICAgICAuc2V0QnV0dG9uVGV4dCh0KCgkKSA9PlxuICAgICAgICAgICAgYXZhaWxhYmlsaXR5ID09PSBQbHVnaW5BdmFpbGFiaWxpdHkuTm90RW5hYmxlZFxuICAgICAgICAgICAgICA/ICQub2JzaWRpYW5MaWIucGx1Z2luU3VnZ2VzdGlvbi5lbmFibGVcbiAgICAgICAgICAgICAgOiAkLm9ic2lkaWFuTGliLnBsdWdpblN1Z2dlc3Rpb24uaW5zdGFsbFxuICAgICAgICAgICkpXG4gICAgICAgICAgLnNldEN0YSgpXG4gICAgICAgICAgLm9uQ2xpY2soY29udmVydEFzeW5jVG9TeW5jKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blJlcGFpcihhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgIGF3YWl0IGluc3RhbGxBbmRFbmFibGVQbHVnaW4oe1xuICAgICAgICAgICAgICAgIGFwcCxcbiAgICAgICAgICAgICAgICBwbHVnaW5JZCxcbiAgICAgICAgICAgICAgICBwbHVnaW5OYW1lLFxuICAgICAgICAgICAgICAgIHBsdWdpbk5vdGljZUNvbXBvbmVudFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIFBsdWdpbkF2YWlsYWJpbGl0eS5Ob3RMb2FkZWQ6IHtcbiAgICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChidXR0b25zRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5SZXF1aXJlbWVudC5lbmFibGUsIHsgcmVxdWlyZWRQbHVnaW5OYW1lOiBwbHVnaW5OYW1lIH0pKVxuICAgICAgICAgIC5zZXRDdGEoKVxuICAgICAgICAgIC5vbkNsaWNrKGNvbnZlcnRBc3luY1RvU3luYyhhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBhd2FpdCBydW5SZXBhaXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBsb2FkRW5hYmxlZFBsdWdpbihwYXJhbXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgbmV3IEJ1dHRvbkNvbXBvbmVudChidXR0b25zRWwpXG4gICAgICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5EZXBlbmRlbmN5LnVwZGF0ZSwgeyBkZXBlbmRlbmN5UGx1Z2luTmFtZTogcGx1Z2luTmFtZSB9KSlcbiAgICAgICAgICAuc2V0Q3RhKClcbiAgICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgYXdhaXQgcnVuUmVwYWlyKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlUGx1Z2luKHtcbiAgICAgICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICAgICAgcGx1Z2luSWQsXG4gICAgICAgICAgICAgICAgcGx1Z2luTmFtZSxcbiAgICAgICAgICAgICAgICBwbHVnaW5Ob3RpY2VDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgcmVxdWVzdGluZ1BsdWdpbk5hbWVcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBCdXR0b25Db21wb25lbnQoYnV0dG9uc0VsKVxuICAgICAgLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5wbHVnaW5SZXF1aXJlbWVudC5vcGVuQ29tbXVuaXR5UGx1Z2lucykpXG4gICAgICAub25DbGljaygoKSA9PiB7XG4gICAgICAgIG9wZW5TZXR0aW5nVGFiKHtcbiAgICAgICAgICBhcHAsXG4gICAgICAgICAgdGFiSWQ6IENPTU1VTklUWV9QTFVHSU5TX1NFVFRJTkdfVEFCX0lEXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIExvYWRzIGEgcGx1Z2luIHRoYXQgaXMgZW5hYmxlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBidXQgbm90IHJ1bm5pbmcsIHRoZSBvbmUgY2FzZVxuICogYGluc3RhbGxBbmRFbmFibGVQbHVnaW5gIHRyZWF0cyBhcyBhbHJlYWR5IGRvbmUuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHBsdWdpbiB0eXBlIHRoZSBjYWxsZXIgZXhwZWN0cy5cbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVxdWlyZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBsdWdpbiBpcyBsb2FkZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGxvYWRFbmFibGVkUGx1Z2luPFRQbHVnaW4gZXh0ZW5kcyBQbHVnaW4+KHBhcmFtczogUmVxdWlyZVBsdWdpblBhcmFtczxUUGx1Z2luPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIHBsdWdpbklkLFxuICAgIHBsdWdpbk5hbWUsXG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50XG4gIH0gPSBwYXJhbXM7XG5cbiAgdHJ5IHtcbiAgICBpZiAoIWF3YWl0IGFwcC5wbHVnaW5zLmVuYWJsZVBsdWdpbkFuZFNhdmUocGx1Z2luSWQpKSB7XG4gICAgICB0aHJvdyBuZXcgUGx1Z2luRW5hYmxlUmVmdXNlZEVycm9yKHBsdWdpbklkKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2UoY3JlYXRlRnJhZ21lbnRXaXRoQ29kZUJsb2NrcyhcbiAgICAgIHQoKCQpID0+ICQub2JzaWRpYW5MaWIucGx1Z2luUmVxdWlyZW1lbnQuZW5hYmxlRmFpbGVkLCB7IHJlcXVpcmVkUGx1Z2luTmFtZTogYXNDb2RlQmxvY2socGx1Z2luTmFtZSkgfSlcbiAgICApKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufVxuXG4vKipcbiAqIFJ1bnMgYSByZXBhaXIgdGhlIHVzZXIgY2xpY2tlZC4gSXRzIGZhaWx1cmUgaGFzIGFscmVhZHkgYmVlbiBzaG93biBhcyBhIG5vdGljZSwgYW5kIHRoZSB3YWl0IGl0IGJlbG9uZ3MgdG9cbiAqIGtlZXBzIHJ1bm5pbmcgc28gdGhlIHVzZXIgY2FuIHRyeSBhZ2Fpbiwgc28gaXQgaXMgbG9nZ2VkIHJhdGhlciB0aGFuIHJldGhyb3duIGludG8gdGhlIGNsaWNrIGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHJlcGFpciAtIFRoZSByZXBhaXIuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHJlcGFpciBoYXMgcnVuLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5SZXBhaXIocmVwYWlyOiAoKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gIHRyeSB7XG4gICAgYXdhaXQgcmVwYWlyKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gd2FpdEZvckF2YWlsYWJpbGl0eTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPihwYXJhbXM6IFdhaXRGb3JBdmFpbGFiaWxpdHlQYXJhbXM8VFBsdWdpbj4pOiBQcm9taXNlPFRQbHVnaW4+IHtcbiAgY29uc3Qge1xuICAgIGFib3J0U2lnbmFsLFxuICAgIGFwcCxcbiAgICBjb21wb25lbnQsXG4gICAgb25TZXR0bGVkLFxuICAgIG9uVW5hdmFpbGFibGUsXG4gICAgcGx1Z2luSWQsXG4gICAgcmVzb2x2ZWRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgfSA9IHBhcmFtcztcblxuICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcblxuICByZXR1cm4gYXdhaXQgbmV3IFByb21pc2U8VFBsdWdpbj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBpc1NldHRsZWQgPSBmYWxzZTtcbiAgICBsZXQgdGltZW91dElkOiBudWxsIHwgbnVtYmVyID0gbnVsbDtcbiAgICBsZXQgcmVtb3ZlV2FpdENvbXBvbmVudDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgY29uc3QgZXZlbnRSZWZzOiBbRXZlbnRzLCBFdmVudFJlZl1bXSA9IFtdO1xuXG4gICAgZnVuY3Rpb24gY2xlYW5VcCgpOiB2b2lkIHtcbiAgICAgIGlzU2V0dGxlZCA9IHRydWU7XG4gICAgICByZW1vdmVXYWl0Q29tcG9uZW50Py4oKTtcbiAgICAgIHJlbW92ZVdhaXRDb21wb25lbnQgPSBudWxsO1xuICAgICAgZm9yIChjb25zdCBbc291cmNlLCBldmVudFJlZl0gb2YgZXZlbnRSZWZzKSB7XG4gICAgICAgIHNvdXJjZS5vZmZyZWYoZXZlbnRSZWYpO1xuICAgICAgfVxuICAgICAgZXZlbnRSZWZzLmxlbmd0aCA9IDA7XG4gICAgICBhYm9ydFNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCk7XG4gICAgICBpZiAodGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICAgICAgdGltZW91dElkID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIG9uU2V0dGxlZD8uKCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFpbChlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgICAgIGlmIChpc1NldHRsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjbGVhblVwKCk7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZUFib3J0KCRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHJlYXNvbjogdW5rbm93biA9IGNhc3RUbzxBYm9ydFNpZ25hbD4oJGV2ZW50LnRhcmdldCkucmVhc29uO1xuICAgICAgZmFpbChyZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbiA6IG5ldyBFcnJvcihTdHJpbmcocmVhc29uKSwgeyBjYXVzZTogcmVhc29uIH0pKTtcbiAgICB9XG5cbiAgICAvLyBObyBzZXR0bGVkIGd1YXJkOiBzZXR0bGluZyByZW1vdmVzIGJvdGggbGlzdGVuZXJzLCBhbmQgbm90aGluZyBlbHNlIGNhbGxzIHRoaXMuXG4gICAgZnVuY3Rpb24gY2hlY2soKTogdm9pZCB7XG4gICAgICBjb25zdCBhdmFpbGFiaWxpdHkgPSBnZXRQbHVnaW5BdmFpbGFiaWxpdHkocGFyYW1zKTtcbiAgICAgIGlmIChhdmFpbGFiaWxpdHkgPT09IFBsdWdpbkF2YWlsYWJpbGl0eS5BdmFpbGFibGUpIHtcbiAgICAgICAgY29uc3QgcGx1Z2luID0gYXBwLnBsdWdpbnMuZ2V0UGx1Z2luKHBsdWdpbklkKSBhcyBUUGx1Z2luO1xuICAgICAgICBjbGVhblVwKCk7XG4gICAgICAgIHJlc29sdmUocGx1Z2luKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBvblVuYXZhaWxhYmxlPy4oYXZhaWxhYmlsaXR5KTtcbiAgICB9XG5cbiAgICAvLyBTdWJzY3JpYmUgQkVGT1JFIHRoZSBmaXJzdCByZWFkLCBzbyBhIGNoYW5nZSBsYW5kaW5nIGJldHdlZW4gdGhlIHJlYWQgYW5kIHRoZSBzdWJzY3JpcHRpb24gY2Fubm90IGJlXG4gICAgLy8gbWlzc2VkLlxuICAgIGV2ZW50UmVmcy5wdXNoKFxuICAgICAgW2FwcC5wbHVnaW5zLCBhcHAucGx1Z2lucy5vbihQTFVHSU5TX0NIQU5HRURfRVZFTlRfTkFNRSwgY2hlY2spXSxcbiAgICAgIFthcHAud29ya3NwYWNlLCBhcHAud29ya3NwYWNlLm9uKFBMVUdJTl9MT0FERURfRVZFTlRfTkFNRSwgY2hlY2spXVxuICAgICk7XG4gICAgYWJvcnRTaWduYWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgaGFuZGxlQWJvcnQpO1xuXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgLy8gQSBjaGlsZCByYXRoZXIgdGhhbiBgY29tcG9uZW50LnJlZ2lzdGVyYCwgYmVjYXVzZSBhIGNvbXBvbmVudCBjYW5ub3QgZm9yZ2V0IGEgcmVnaXN0ZXJlZCBjYWxsYmFjazpcbiAgICAgIC8vIHJlbW92aW5nIHRoZSBjaGlsZCBvbiBzZXR0bGUgaXMgd2hhdCBrZWVwcyBhIGxvbmctbGl2ZWQgY29uc3VtZXIgZnJvbSBjb2xsZWN0aW5nIG9uZSBwZXIgd2FpdC5cbiAgICAgIGNvbnN0IHdhaXRDb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7XG4gICAgICB3YWl0Q29tcG9uZW50LnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgICAgZmFpbChuZXcgRXJyb3IoYFRoZSB3YWl0IGZvciBwbHVnaW4gXCIke3BsdWdpbklkfVwiIGVuZGVkIGJlY2F1c2UgaXRzIGNvbXBvbmVudCB1bmxvYWRlZC5gKSk7XG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5hZGRDaGlsZCh3YWl0Q29tcG9uZW50KTtcbiAgICAgIHJlbW92ZVdhaXRDb21wb25lbnQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5yZW1vdmVDaGlsZCh3YWl0Q29tcG9uZW50KTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHJlc29sdmVkVGltZW91dEluTWlsbGlzZWNvbmRzICE9PSBudWxsKSB7XG4gICAgICB0aW1lb3V0SWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGZhaWwoXG4gICAgICAgICAgbmV3IFBsdWdpbkluc3RhbmNlVW5hdmFpbGFibGVFcnJvcih7XG4gICAgICAgICAgICBhdmFpbGFiaWxpdHk6IGdldFBsdWdpbkF2YWlsYWJpbGl0eShwYXJhbXMpLFxuICAgICAgICAgICAgcGx1Z2luSWRcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSwgcmVzb2x2ZWRUaW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cblxuICAgIGNoZWNrKCk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQXVDQSxtQkFBbUM7QUFDbkMsMEJBQXVCO0FBQ3ZCLHNCQUdPO0FBSVAsK0JBQXlDO0FBQ3pDLHFDQUFpQztBQUNqQyx1QkFBeUI7QUFDekIsMEJBR087QUFDUCxrQkFBa0I7QUFDbEIsNEJBQStCO0FBQy9CLGtDQUtPO0FBQ1AscUNBQXlDO0FBS3pDLE1BQU0sa0RBQWtEO0FBS3hELE1BQU0sNkJBQTZCO0FBS25DLE1BQU0sbUNBQW1DO0FBS2xDLElBQUsscUJBQUwsa0JBQUtBLHdCQUFMO0FBSUwsRUFBQUEsb0JBQUEsZUFBWTtBQU9aLEVBQUFBLG9CQUFBLG9CQUFpQjtBQUtqQixFQUFBQSxvQkFBQSxhQUFVO0FBS1YsRUFBQUEsb0JBQUEsZ0JBQWE7QUFLYixFQUFBQSxvQkFBQSxrQkFBZTtBQU9mLEVBQUFBLG9CQUFBLGVBQVk7QUFLWixFQUFBQSxvQkFBQSxjQUFXO0FBS1gsRUFBQUEsb0JBQUEsbUJBQWdCO0FBM0NOLFNBQUFBO0FBQUEsR0FBQTtBQStMTCxNQUFNLHVDQUF1QyxNQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJeEM7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVB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