obsidian-dev-utils 83.2.0 → 84.0.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 (63) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/dev/main.js +2463 -1744
  3. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  4. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +139 -8
  5. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +94 -0
  6. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +10 -10
  7. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +3 -3
  8. package/dist/lib/cjs/obsidian/css-class.cjs +2 -1
  9. package/dist/lib/cjs/obsidian/css-class.d.cts +5 -0
  10. package/dist/lib/cjs/obsidian/editor.cjs +1 -1
  11. package/dist/lib/cjs/obsidian/editor.d.cts +2 -2
  12. package/dist/lib/cjs/obsidian/file-manager.cjs +9 -9
  13. package/dist/lib/cjs/obsidian/file-manager.d.cts +9 -9
  14. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +8 -8
  15. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +7 -7
  16. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +7 -7
  17. package/dist/lib/cjs/obsidian/index.cjs +7 -4
  18. package/dist/lib/cjs/obsidian/index.d.cts +2 -1
  19. package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +7 -7
  20. package/dist/lib/cjs/obsidian/markdown-code-block-processor.d.cts +9 -9
  21. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +21 -21
  22. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +15 -15
  23. package/dist/lib/cjs/obsidian/resource-lock.cjs +899 -0
  24. package/dist/lib/cjs/obsidian/resource-lock.d.cts +227 -0
  25. package/dist/lib/cjs/obsidian/vault-transaction.cjs +371 -0
  26. package/dist/lib/cjs/obsidian/vault-transaction.d.cts +146 -0
  27. package/dist/lib/cjs/obsidian/vault.cjs +4 -4
  28. package/dist/lib/cjs/obsidian/vault.d.cts +3 -3
  29. package/dist/lib/esm/generated-during-build.mjs +2 -2
  30. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +94 -0
  31. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +143 -9
  32. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -3
  33. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +10 -10
  34. package/dist/lib/esm/obsidian/css-class.d.mts +5 -0
  35. package/dist/lib/esm/obsidian/css-class.mjs +2 -1
  36. package/dist/lib/esm/obsidian/editor.d.mts +2 -2
  37. package/dist/lib/esm/obsidian/editor.mjs +1 -1
  38. package/dist/lib/esm/obsidian/file-manager.d.mts +9 -9
  39. package/dist/lib/esm/obsidian/file-manager.mjs +9 -9
  40. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +7 -7
  41. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +8 -8
  42. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +7 -7
  43. package/dist/lib/esm/obsidian/index.d.mts +2 -1
  44. package/dist/lib/esm/obsidian/index.mjs +5 -3
  45. package/dist/lib/esm/obsidian/markdown-code-block-processor.d.mts +9 -9
  46. package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +7 -7
  47. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +15 -15
  48. package/dist/lib/esm/obsidian/plugin/plugin.mjs +21 -21
  49. package/dist/lib/esm/obsidian/resource-lock.d.mts +227 -0
  50. package/dist/lib/esm/obsidian/resource-lock.mjs +799 -0
  51. package/dist/lib/esm/obsidian/vault-transaction.d.mts +146 -0
  52. package/dist/lib/esm/obsidian/vault-transaction.mjs +271 -0
  53. package/dist/lib/esm/obsidian/vault.d.mts +3 -3
  54. package/dist/lib/esm/obsidian/vault.mjs +4 -4
  55. package/dist/styles.css +8 -1
  56. package/obsidian/resource-lock/package.json +6 -0
  57. package/obsidian/vault-transaction/package.json +6 -0
  58. package/package.json +2 -2
  59. package/dist/lib/cjs/obsidian/editor-lock.cjs +0 -545
  60. package/dist/lib/cjs/obsidian/editor-lock.d.cts +0 -142
  61. package/dist/lib/esm/obsidian/editor-lock.d.mts +0 -142
  62. package/dist/lib/esm/obsidian/editor-lock.mjs +0 -442
  63. package/obsidian/editor-lock/package.json +0 -6
@@ -5,7 +5,50 @@
5
5
  * Component that manages displaying notices to the user.
6
6
  */
7
7
  import { Notice } from 'obsidian';
8
+ import type { ValueProvider } from '../../value-provider.mjs';
8
9
  import { ComponentEx } from './component-ex.mjs';
10
+ /**
11
+ * A handle to a delayed notice created by {@link PluginNoticeComponent.showNoticeAfterDelay}. It is a
12
+ * {@link Disposable} (so it can be used with `using`) that also lets the content be updated while the
13
+ * notice is shown.
14
+ */
15
+ export interface PluginNoticeComponentDelayedNotice extends Disposable {
16
+ /**
17
+ * Replaces the notice content, re-applying the plugin-name prefix, the interactive-click guard, and
18
+ * the Cancel button. Useful for reporting progress. If the delay has not elapsed yet, the new content
19
+ * becomes what is shown once it does.
20
+ *
21
+ * @param content - The new notice content.
22
+ */
23
+ setContent(content: DocumentFragment | string): void;
24
+ }
25
+ /**
26
+ * Parameters for {@link PluginNoticeComponent.showNoticeAfterDelay}.
27
+ */
28
+ export interface PluginNoticeComponentShowNoticeAfterDelayParams {
29
+ /**
30
+ * When provided, a Cancel button is appended to the notice; clicking it aborts this controller. When
31
+ * omitted, no Cancel button is shown.
32
+ */
33
+ readonly abortController?: AbortController;
34
+ /**
35
+ * The text of the Cancel button shown when {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController}
36
+ * is provided. When omitted, the localized `Cancel` label is used.
37
+ */
38
+ readonly cancelButtonText?: string;
39
+ /**
40
+ * The notice content, resolved lazily only if the delay elapses — so an operation that finishes
41
+ * sooner never builds it.
42
+ */
43
+ readonly content: ValueProvider<DocumentFragment | string>;
44
+ /**
45
+ * How long the operation must run before the notice is shown. Operations that finish sooner never
46
+ * show a notice, avoiding a distracting flash.
47
+ *
48
+ * @default `500`
49
+ */
50
+ readonly delayInMilliseconds?: number;
51
+ }
9
52
  /**
10
53
  * Options for {@link PluginNoticeComponent.showNotice}.
11
54
  */
@@ -28,6 +71,7 @@ export interface PluginNoticeComponentShowNoticeOptions {
28
71
  export declare class PluginNoticeComponent extends ComponentEx {
29
72
  private readonly pluginName;
30
73
  private notice;
74
+ private readonly pendingTimerCancellations;
31
75
  /**
32
76
  * Creates a new plugin notice component.
33
77
  *
@@ -50,6 +94,46 @@ export declare class PluginNoticeComponent extends ComponentEx {
50
94
  * @returns The notice object.
51
95
  */
52
96
  showNotice(message: DocumentFragment | string, options?: PluginNoticeComponentShowNoticeOptions): Notice;
97
+ /**
98
+ * Shows a notice describing a long-running operation, but only once the operation has run for longer
99
+ * than {@link PluginNoticeComponentShowNoticeAfterDelayParams.delayInMilliseconds} — so operations
100
+ * that finish sooner never flash a notice. The notice stays until the returned {@link Disposable} is
101
+ * disposed (which also cancels the pending timer if it has not fired yet), so it can be used with
102
+ * `using`. When an {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController} is given, a
103
+ * Cancel button that aborts it is appended (and, being interactive, does not dismiss the notice).
104
+ *
105
+ * @example
106
+ * ```ts
107
+ * using _notice = pluginNoticeComponent.showNoticeAfterDelay({
108
+ * abortController,
109
+ * content: () => buildProgressFragment()
110
+ * });
111
+ * await runOperation(abortController.signal);
112
+ * ```
113
+ *
114
+ * @param params - The parameters.
115
+ * @returns A {@link PluginNoticeComponentDelayedNotice} that hides the notice (or cancels the pending
116
+ * timer) when disposed and lets the content be updated while it is shown.
117
+ */
118
+ showNoticeAfterDelay(params: PluginNoticeComponentShowNoticeAfterDelayParams): PluginNoticeComponentDelayedNotice;
119
+ /**
120
+ * Builds the message for a delayed notice: the resolved content, optionally followed by a Cancel
121
+ * button that aborts the provided controller when clicked.
122
+ *
123
+ * @param params - The parameters.
124
+ * @returns A {@link DocumentFragment} holding the content and, if requested, a Cancel button.
125
+ */
126
+ private buildDelayedNoticeMessage;
127
+ /**
128
+ * Builds the notice content wrapped in a container that keeps the notice open when an interactive
129
+ * element inside it is clicked. Obsidian dismisses a notice on any click that bubbles up to its
130
+ * element; the container intercepts clicks originating on an interactive element (a link, button,
131
+ * input, etc.) and stops them there, so the element's own handler still runs but the notice stays.
132
+ *
133
+ * @param message - The message to display after the plugin name prefix.
134
+ * @returns A {@link DocumentFragment} holding the wrapped, prefixed notice content.
135
+ */
136
+ private buildNoticeContent;
53
137
  /**
54
138
  * Builds the notice content, prefixing the message with the plugin name in a styled element so it is
55
139
  * visually distinguished from the message body.
@@ -61,4 +145,14 @@ export declare class PluginNoticeComponent extends ComponentEx {
61
145
  private getPermanentNotice;
62
146
  private getPermanentNotices;
63
147
  private setPermanentNotice;
148
+ /**
149
+ * Shows a notice with the given duration, replacing the current notice, and optionally registers it
150
+ * as this plugin's permanent notice.
151
+ *
152
+ * @param message - The message to display.
153
+ * @param durationInMilliseconds - The notice duration; `0` keeps it until it is hidden explicitly.
154
+ * @param shouldRegisterAsPermanent - Whether to track the notice as this plugin's permanent notice.
155
+ * @returns The created notice.
156
+ */
157
+ private showNoticeWithDuration;
64
158
  }
@@ -21,13 +21,22 @@ if you want to view the source, please visit the github repository of this plugi
21
21
  globalThis.process = browserProcess;
22
22
  })();
23
23
 
24
- import { Notice } from "obsidian";
24
+ import {
25
+ ButtonComponent,
26
+ Notice
27
+ } from "obsidian";
28
+ import { invokeAsyncSafely } from "../../async.mjs";
29
+ import { normalizeOptionalProperties } from "../../object-utils.mjs";
25
30
  import { getObsidianDevUtilsState } from "../../obsidian-dev-utils-state.mjs";
31
+ import { resolveValue } from "../../value-provider.mjs";
26
32
  import { CssClass } from "../css-class.mjs";
33
+ import { t } from "../i18n/i18n.mjs";
27
34
  import { addPluginCssClasses } from "../plugin/plugin-context.mjs";
28
35
  import { ComponentEx } from "./component-ex.mjs";
29
36
  const PERMANENT_NOTICES_STATE_KEY = "plugin-notice-component:permanent-notices";
30
37
  const PERMANENT_NOTICE_DURATION_IN_MILLISECONDS = 0;
38
+ const DEFAULT_DELAY_BEFORE_SHOW_IN_MILLISECONDS = 500;
39
+ const INTERACTIVE_ELEMENT_SELECTOR = 'a, button, input, select, textarea, label, [contenteditable="true"], [role="button"], [role="link"], [role="checkbox"], [role="tab"], [role="menuitem"]';
31
40
  class PluginNoticeComponent extends ComponentEx {
32
41
  /**
33
42
  * Creates a new plugin notice component.
@@ -40,6 +49,7 @@ class PluginNoticeComponent extends ComponentEx {
40
49
  }
41
50
  pluginName;
42
51
  notice = null;
52
+ pendingTimerCancellations = /* @__PURE__ */ new Set();
43
53
  /**
44
54
  * Dismisses the permanent notice left over from a previous load (e.g. a previous plugin session) on load.
45
55
  */
@@ -53,6 +63,9 @@ class PluginNoticeComponent extends ComponentEx {
53
63
  * Hides the current notice on unload, unless it is the permanent notice (which is meant to outlive the plugin).
54
64
  */
55
65
  onunload() {
66
+ for (const cancelPendingTimer of [...this.pendingTimerCancellations]) {
67
+ cancelPendingTimer();
68
+ }
56
69
  if (this.getPermanentNotice() !== this.notice) {
57
70
  this.notice?.hide();
58
71
  }
@@ -65,15 +78,116 @@ class PluginNoticeComponent extends ComponentEx {
65
78
  * @returns The notice object.
66
79
  */
67
80
  showNotice(message, options) {
68
- this.notice?.hide();
69
- const prefixedMessage = this.buildPrefixedMessage(message);
70
- this.notice = new Notice(prefixedMessage, options?.isPermanent ? PERMANENT_NOTICE_DURATION_IN_MILLISECONDS : void 0);
71
- if (options?.isPermanent) {
72
- this.setPermanentNotice(this.notice);
81
+ const isPermanent = options?.isPermanent ?? false;
82
+ return this.showNoticeWithDuration(message, isPermanent ? PERMANENT_NOTICE_DURATION_IN_MILLISECONDS : void 0, isPermanent);
83
+ }
84
+ /**
85
+ * Shows a notice describing a long-running operation, but only once the operation has run for longer
86
+ * than {@link PluginNoticeComponentShowNoticeAfterDelayParams.delayInMilliseconds} — so operations
87
+ * that finish sooner never flash a notice. The notice stays until the returned {@link Disposable} is
88
+ * disposed (which also cancels the pending timer if it has not fired yet), so it can be used with
89
+ * `using`. When an {@link PluginNoticeComponentShowNoticeAfterDelayParams.abortController} is given, a
90
+ * Cancel button that aborts it is appended (and, being interactive, does not dismiss the notice).
91
+ *
92
+ * @example
93
+ * ```ts
94
+ * using _notice = pluginNoticeComponent.showNoticeAfterDelay({
95
+ * abortController,
96
+ * content: () => buildProgressFragment()
97
+ * });
98
+ * await runOperation(abortController.signal);
99
+ * ```
100
+ *
101
+ * @param params - The parameters.
102
+ * @returns A {@link PluginNoticeComponentDelayedNotice} that hides the notice (or cancels the pending
103
+ * timer) when disposed and lets the content be updated while it is shown.
104
+ */
105
+ showNoticeAfterDelay(params) {
106
+ let shownNotice = null;
107
+ let isDisposed = false;
108
+ let timerId = 0;
109
+ let currentContent = params.content;
110
+ const cancelPendingTimer = () => {
111
+ window.clearTimeout(timerId);
112
+ this.pendingTimerCancellations.delete(cancelPendingTimer);
113
+ };
114
+ const buildDelayedMessage = (content) => this.buildDelayedNoticeMessage(normalizeOptionalProperties({
115
+ abortController: params.abortController,
116
+ cancelButtonText: params.cancelButtonText,
117
+ content
118
+ }));
119
+ timerId = window.setTimeout(() => {
120
+ cancelPendingTimer();
121
+ invokeAsyncSafely(async () => {
122
+ const resolvedContent = await resolveValue(currentContent, {});
123
+ if (isDisposed) {
124
+ return;
125
+ }
126
+ shownNotice = this.showNoticeWithDuration(buildDelayedMessage(resolvedContent), PERMANENT_NOTICE_DURATION_IN_MILLISECONDS, false);
127
+ });
128
+ }, params.delayInMilliseconds ?? DEFAULT_DELAY_BEFORE_SHOW_IN_MILLISECONDS);
129
+ this.pendingTimerCancellations.add(cancelPendingTimer);
130
+ return {
131
+ setContent: (content) => {
132
+ currentContent = content;
133
+ shownNotice?.setMessage(this.buildNoticeContent(buildDelayedMessage(content)));
134
+ },
135
+ [Symbol.dispose]: () => {
136
+ isDisposed = true;
137
+ cancelPendingTimer();
138
+ shownNotice?.hide();
139
+ if (this.notice === shownNotice) {
140
+ this.notice = null;
141
+ }
142
+ }
143
+ };
144
+ }
145
+ /**
146
+ * Builds the message for a delayed notice: the resolved content, optionally followed by a Cancel
147
+ * button that aborts the provided controller when clicked.
148
+ *
149
+ * @param params - The parameters.
150
+ * @returns A {@link DocumentFragment} holding the content and, if requested, a Cancel button.
151
+ */
152
+ buildDelayedNoticeMessage(params) {
153
+ const { abortController, cancelButtonText, content } = params;
154
+ const fragment = createFragment();
155
+ if (typeof content === "string") {
156
+ fragment.appendText(content);
73
157
  } else {
74
- this.setPermanentNotice(null);
158
+ fragment.appendChild(content);
75
159
  }
76
- return this.notice;
160
+ if (abortController) {
161
+ const cancelButton = new ButtonComponent(createDiv());
162
+ cancelButton.setButtonText(cancelButtonText ?? t(($) => $.obsidianDevUtils.buttons.cancel));
163
+ addPluginCssClasses(cancelButton.buttonEl, CssClass.CancelButton);
164
+ cancelButton.buttonEl.addEventListener("click", () => {
165
+ abortController.abort();
166
+ });
167
+ fragment.appendChild(cancelButton.buttonEl);
168
+ }
169
+ return fragment;
170
+ }
171
+ /**
172
+ * Builds the notice content wrapped in a container that keeps the notice open when an interactive
173
+ * element inside it is clicked. Obsidian dismisses a notice on any click that bubbles up to its
174
+ * element; the container intercepts clicks originating on an interactive element (a link, button,
175
+ * input, etc.) and stops them there, so the element's own handler still runs but the notice stays.
176
+ *
177
+ * @param message - The message to display after the plugin name prefix.
178
+ * @returns A {@link DocumentFragment} holding the wrapped, prefixed notice content.
179
+ */
180
+ buildNoticeContent(message) {
181
+ const fragment = createFragment();
182
+ const contentEl = fragment.createDiv();
183
+ addPluginCssClasses(contentEl, CssClass.PluginNoticeContent);
184
+ contentEl.appendChild(this.buildPrefixedMessage(message));
185
+ contentEl.addEventListener("click", (evt) => {
186
+ if (evt.target instanceof Element && evt.target.closest(INTERACTIVE_ELEMENT_SELECTOR)) {
187
+ evt.stopPropagation();
188
+ }
189
+ });
190
+ return fragment;
77
191
  }
78
192
  /**
79
193
  * Builds the notice content, prefixing the message with the plugin name in a styled element so it is
@@ -112,8 +226,28 @@ class PluginNoticeComponent extends ComponentEx {
112
226
  map.delete(this.pluginName);
113
227
  }
114
228
  }
229
+ /**
230
+ * Shows a notice with the given duration, replacing the current notice, and optionally registers it
231
+ * as this plugin's permanent notice.
232
+ *
233
+ * @param message - The message to display.
234
+ * @param durationInMilliseconds - The notice duration; `0` keeps it until it is hidden explicitly.
235
+ * @param shouldRegisterAsPermanent - Whether to track the notice as this plugin's permanent notice.
236
+ * @returns The created notice.
237
+ */
238
+ showNoticeWithDuration(message, durationInMilliseconds, shouldRegisterAsPermanent) {
239
+ this.notice?.hide();
240
+ const content = this.buildNoticeContent(message);
241
+ this.notice = new Notice(content, durationInMilliseconds);
242
+ if (shouldRegisterAsPermanent) {
243
+ this.setPermanentNotice(this.notice);
244
+ } else {
245
+ this.setPermanentNotice(null);
246
+ }
247
+ return this.notice;
248
+ }
115
249
  }
116
250
  export {
117
251
  PluginNoticeComponent
118
252
  };
119
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uL2Nzcy1jbGFzcy50cyc7XG5pbXBvcnQgeyBhZGRQbHVnaW5Dc3NDbGFzc2VzIH0gZnJvbSAnLi4vcGx1Z2luL3BsdWdpbi1jb250ZXh0LnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG5jb25zdCBQRVJNQU5FTlRfTk9USUNFU19TVEFURV9LRVkgPSAncGx1Z2luLW5vdGljZS1jb21wb25lbnQ6cGVybWFuZW50LW5vdGljZXMnO1xuY29uc3QgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgPSAwO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogTWFuYWdlcyBzaG93aW5nIHBsdWdpbiBub3RpY2VzLiBBdXRvbWF0aWNhbGx5IGhpZGVzIHRoZSBwcmV2aW91cyBub3RpY2Ugd2hlbiBhIG5ldyBvbmUgaXMgc2hvd24uXG4gKi9cbmV4cG9ydCBjbGFzcyBQbHVnaW5Ob3RpY2VDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIHByaXZhdGUgbm90aWNlOiBOb3RpY2UgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbk5hbWUgLSBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBwZXJtYW5lbnQgbm90aWNlIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgbG9hZCAoZS5nLiBhIHByZXZpb3VzIHBsdWdpbiBzZXNzaW9uKSBvbiBsb2FkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICBjb25zdCBwZXJtYW5lbnROb3RpY2UgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpO1xuICAgIHBlcm1hbmVudE5vdGljZT8uaGlkZSgpO1xuICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBvbiB1bmxvYWQsIHVubGVzcyBpdCBpcyB0aGUgcGVybWFuZW50IG5vdGljZSAod2hpY2ggaXMgbWVhbnQgdG8gb3V0bGl2ZSB0aGUgcGx1Z2luKS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5nZXRQZXJtYW5lbnROb3RpY2UoKSAhPT0gdGhpcy5ub3RpY2UpIHtcbiAgICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3BsYXlzIGEgbm90aWNlIG1lc3NhZ2UgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIG1lc3NhZ2UgdG8gZGlzcGxheS5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgZGlzcGxheWluZyB0aGUgbm90aWNlLlxuICAgKiBAcmV0dXJucyBUaGUgbm90aWNlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyBzaG93Tm90aWNlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcsIG9wdGlvbnM/OiBQbHVnaW5Ob3RpY2VDb21wb25lbnRTaG93Tm90aWNlT3B0aW9ucyk6IE5vdGljZSB7XG4gICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcblxuICAgIGNvbnN0IHByZWZpeGVkTWVzc2FnZSA9IHRoaXMuYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgdGhpcy5ub3RpY2UgPSBuZXcgTm90aWNlKHByZWZpeGVkTWVzc2FnZSwgb3B0aW9ucz8uaXNQZXJtYW5lbnQgPyBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA6IHVuZGVmaW5lZCk7XG5cbiAgICBpZiAob3B0aW9ucz8uaXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKHRoaXMubm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGljZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3Bhbih7IHRleHQ6IHRoaXMucGx1Z2luTmFtZSB9KTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5hbWVFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlTmFtZSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMsY0FBYztBQUV2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLGdCQUFnQjtBQUN6QixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLG1CQUFtQjtBQUU1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQXNCM0MsTUFBTSw4QkFBOEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE5QyxZQUE2QixZQUFvQjtBQUN0RCxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBLEVBUDVCLFNBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjaEIsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFDYixVQUFNLGtCQUFrQixLQUFLLG1CQUFtQjtBQUNoRCxxQkFBaUIsS0FBSztBQUN0QixTQUFLLG1CQUFtQixJQUFJO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixXQUFpQjtBQUMvQixRQUFJLEtBQUssbUJBQW1CLE1BQU0sS0FBSyxRQUFRO0FBQzdDLFdBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNPLFdBQVcsU0FBb0MsU0FBMEQ7QUFDOUcsU0FBSyxRQUFRLEtBQUs7QUFFbEIsVUFBTSxrQkFBa0IsS0FBSyxxQkFBcUIsT0FBTztBQUN6RCxTQUFLLFNBQVMsSUFBSSxPQUFPLGlCQUFpQixTQUFTLGNBQWMsNENBQTRDLE1BQVM7QUFFdEgsUUFBSSxTQUFTLGFBQWE7QUFDeEIsV0FBSyxtQkFBbUIsS0FBSyxNQUFNO0FBQUEsSUFDckMsT0FBTztBQUNMLFdBQUssbUJBQW1CLElBQUk7QUFBQSxJQUM5QjtBQUNBLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU1EscUJBQXFCLFNBQXNEO0FBQ2pGLFVBQU0sV0FBVyxlQUFlO0FBQ2hDLFVBQU0sU0FBUyxXQUFXLEVBQUUsTUFBTSxLQUFLLFdBQVcsQ0FBQztBQUNuRCx3QkFBb0IsUUFBUSxTQUFTLGdCQUFnQjtBQUNyRCxhQUFTLFlBQVksTUFBTTtBQUMzQixRQUFJLENBQUMsS0FBSyxTQUFTO0FBQ2pCLGVBQVMsV0FBVyxhQUFhO0FBQUEsSUFDbkM7QUFDQSxhQUFTLFdBQVcsSUFBSTtBQUN4QixRQUFJLE9BQU8sWUFBWSxVQUFVO0FBQy9CLGVBQVMsV0FBVyxPQUFPO0FBQUEsSUFDN0IsT0FBTztBQUNMLGVBQVMsWUFBWSxPQUFPO0FBQUEsSUFDOUI7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUFBLEVBRVEscUJBQW9DO0FBQzFDLFdBQU8sS0FBSyxvQkFBb0IsRUFBRSxJQUFJLEtBQUssVUFBVSxLQUFLO0FBQUEsRUFDNUQ7QUFBQSxFQUVRLHNCQUEyQztBQUNqRCxXQUFPLHlCQUE4Qyw2QkFBNkIsb0JBQUksSUFBb0IsQ0FBQyxFQUFFO0FBQUEsRUFDL0c7QUFBQSxFQUVRLG1CQUFtQixRQUE2QjtBQUN0RCxVQUFNLE1BQU0sS0FBSyxvQkFBb0I7QUFDckMsUUFBSSxRQUFRO0FBQ1YsVUFBSSxJQUFJLEtBQUssWUFBWSxNQUFNO0FBQUEsSUFDakMsT0FBTztBQUNMLFVBQUksT0FBTyxLQUFLLFVBQVU7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
253
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQge1xuICBCdXR0b25Db21wb25lbnQsXG4gIE5vdGljZVxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgVmFsdWVQcm92aWRlciB9IGZyb20gJy4uLy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcblxuaW1wb3J0IHsgaW52b2tlQXN5bmNTYWZlbHkgfSBmcm9tICcuLi8uLi9hc3luYy50cyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9vYmplY3QtdXRpbHMudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IHJlc29sdmVWYWx1ZSB9IGZyb20gJy4uLy4uL3ZhbHVlLXByb3ZpZGVyLnRzJztcbmltcG9ydCB7IENzc0NsYXNzIH0gZnJvbSAnLi4vY3NzLWNsYXNzLnRzJztcbmltcG9ydCB7IHQgfSBmcm9tICcuLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgYWRkUGx1Z2luQ3NzQ2xhc3NlcyB9IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZID0gJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50OnBlcm1hbmVudC1ub3RpY2VzJztcbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcbmNvbnN0IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuXG4vLyBFbGVtZW50cyBhIHVzZXIgY2xpY2tzIHRvIGFjdCBvbiB0aGVtIHJhdGhlciB0aGFuIHRvIGRpc21pc3MgdGhlIG5vdGljZS4gQSBjbGljayBsYW5kaW5nIG9uIChvclxuLy8gSW5zaWRlKSBvbmUgb2YgdGhlc2UgaXMga2VwdCBmcm9tIGJ1YmJsaW5nIHRvIHRoZSBub3RpY2UsIHNvIHRoZSBub3RpY2Ugc3RheXMgb3Blbi5cbmNvbnN0IElOVEVSQUNUSVZFX0VMRU1FTlRfU0VMRUNUT1IgPSAnYSwgYnV0dG9uLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgbGFiZWwsIFtjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdLCBbcm9sZT1cImJ1dHRvblwiXSwgW3JvbGU9XCJsaW5rXCJdLCBbcm9sZT1cImNoZWNrYm94XCJdLCBbcm9sZT1cInRhYlwiXSwgW3JvbGU9XCJtZW51aXRlbVwiXSc7XG5cbi8qKlxuICogQSBoYW5kbGUgdG8gYSBkZWxheWVkIG5vdGljZSBjcmVhdGVkIGJ5IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LiBJdCBpcyBhXG4gKiB7QGxpbmsgRGlzcG9zYWJsZX0gKHNvIGl0IGNhbiBiZSB1c2VkIHdpdGggYHVzaW5nYCkgdGhhdCBhbHNvIGxldHMgdGhlIGNvbnRlbnQgYmUgdXBkYXRlZCB3aGlsZSB0aGVcbiAqIG5vdGljZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBSZXBsYWNlcyB0aGUgbm90aWNlIGNvbnRlbnQsIHJlLWFwcGx5aW5nIHRoZSBwbHVnaW4tbmFtZSBwcmVmaXgsIHRoZSBpbnRlcmFjdGl2ZS1jbGljayBndWFyZCwgYW5kXG4gICAqIHRoZSBDYW5jZWwgYnV0dG9uLiBVc2VmdWwgZm9yIHJlcG9ydGluZyBwcm9ncmVzcy4gSWYgdGhlIGRlbGF5IGhhcyBub3QgZWxhcHNlZCB5ZXQsIHRoZSBuZXcgY29udGVudFxuICAgKiBiZWNvbWVzIHdoYXQgaXMgc2hvd24gb25jZSBpdCBkb2VzLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBuZXcgbm90aWNlIGNvbnRlbnQuXG4gICAqL1xuICBzZXRDb250ZW50KGNvbnRlbnQ6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZUFmdGVyRGVsYXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFdoZW4gcHJvdmlkZWQsIGEgQ2FuY2VsIGJ1dHRvbiBpcyBhcHBlbmRlZCB0byB0aGUgbm90aWNlOyBjbGlja2luZyBpdCBhYm9ydHMgdGhpcyBjb250cm9sbGVyLiBXaGVuXG4gICAqIG9taXR0ZWQsIG5vIENhbmNlbCBidXR0b24gaXMgc2hvd24uXG4gICAqL1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI/OiBBYm9ydENvbnRyb2xsZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IG9mIHRoZSBDYW5jZWwgYnV0dG9uIHNob3duIHdoZW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogaXMgcHJvdmlkZWQuIFdoZW4gb21pdHRlZCwgdGhlIGxvY2FsaXplZCBgQ2FuY2VsYCBsYWJlbCBpcyB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FuY2VsQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5vdGljZSBjb250ZW50LCByZXNvbHZlZCBsYXppbHkgb25seSBpZiB0aGUgZGVsYXkgZWxhcHNlcyBcdTIwMTQgc28gYW4gb3BlcmF0aW9uIHRoYXQgZmluaXNoZXNcbiAgICogc29vbmVyIG5ldmVyIGJ1aWxkcyBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IFZhbHVlUHJvdmlkZXI8RG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBvcGVyYXRpb24gbXVzdCBydW4gYmVmb3JlIHRoZSBub3RpY2UgaXMgc2hvd24uIE9wZXJhdGlvbnMgdGhhdCBmaW5pc2ggc29vbmVyIG5ldmVyXG4gICAqIHNob3cgYSBub3RpY2UsIGF2b2lkaW5nIGEgZGlzdHJhY3RpbmcgZmxhc2guXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDBgXG4gICAqL1xuICByZWFkb25seSBkZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbm90aWNlIHNob3VsZCBzdGF5IHVudGlsIGl0IGlzIHJlcGxhY2VkLCB0aGUgcGx1Z2luIGlzIHJlbG9hZGVkLCBvciB0aGUgdXNlciBkaXNtaXNzZXMgaXQuXG4gICAqXG4gICAqIEEgcGVybWFuZW50IG5vdGljZSBpcyBzaG93biB3aXRoIGFuIGluZmluaXRlIGR1cmF0aW9uIGFuZCBpcyBub3QgaGlkZGVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bmxvYWRzLCBzbyBpdCBjYW5cbiAgICogY29tbXVuaWNhdGUgc3RhdGUgdGhhdCBvdXRsaXZlcyB0aGUgcGx1Z2luIChlLmcuIGEgY2xlYW51cCB0aGF0IHJlcXVpcmVzIGEgcmVsb2FkKS4gVGhlcmUgaXMgYXQgbW9zdCBvbmUgcGVybWFuZW50XG4gICAqIG5vdGljZSBwZXIgcGx1Z2luOiBpdCBpcyBoaWRkZW4gYnkgdGhlIG5leHQge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlfSBjYWxsIGFuZCBkaXNtaXNzZWRcbiAgICogYXV0b21hdGljYWxseSB0aGUgbmV4dCB0aW1lIHRoZSBjb21wb25lbnQgbG9hZHMgKGkuZS4gd2hlbiB0aGUgcGx1Z2luIGlzIHJlLWVuYWJsZWQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgZmFsc2VgXG4gICAqL1xuICByZWFkb25seSBpc1Blcm1hbmVudD86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zIHtcbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuICByZWFkb25seSBjYW5jZWxCdXR0b25UZXh0Pzogc3RyaW5nO1xuICByZWFkb25seSBjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIE1hbmFnZXMgc2hvd2luZyBwbHVnaW4gbm90aWNlcy4gQXV0b21hdGljYWxseSBoaWRlcyB0aGUgcHJldmlvdXMgbm90aWNlIHdoZW4gYSBuZXcgb25lIGlzIHNob3duLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luTm90aWNlQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50RXgge1xuICBwcml2YXRlIG5vdGljZTogTm90aWNlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBwbHVnaW4gbm90aWNlIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbk5hbWUgLSBUaGUgcGx1Z2luIG5hbWUgKHNob3duIGFzIHByZWZpeCBpbiBub3RpY2VzKS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHBsdWdpbk5hbWU6IHN0cmluZykge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogRGlzbWlzc2VzIHRoZSBwZXJtYW5lbnQgbm90aWNlIGxlZnQgb3ZlciBmcm9tIGEgcHJldmlvdXMgbG9hZCAoZS5nLiBhIHByZXZpb3VzIHBsdWdpbiBzZXNzaW9uKSBvbiBsb2FkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcbiAgICBjb25zdCBwZXJtYW5lbnROb3RpY2UgPSB0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpO1xuICAgIHBlcm1hbmVudE5vdGljZT8uaGlkZSgpO1xuICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIHRoZSBjdXJyZW50IG5vdGljZSBvbiB1bmxvYWQsIHVubGVzcyBpdCBpcyB0aGUgcGVybWFuZW50IG5vdGljZSAod2hpY2ggaXMgbWVhbnQgdG8gb3V0bGl2ZSB0aGUgcGx1Z2luKS5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBvbnVubG9hZCgpOiB2b2lkIHtcbiAgICAvLyBDYW5jZWwgYW55IGRlbGF5ZWQgbm90aWNlIHdob3NlIHRpbWVyIGhhcyBub3QgZmlyZWQgeWV0LCBzbyBpdCBuZXZlciBhcHBlYXJzIGFmdGVyIHVubG9hZC5cbiAgICBmb3IgKGNvbnN0IGNhbmNlbFBlbmRpbmdUaW1lciBvZiBbLi4udGhpcy5wZW5kaW5nVGltZXJDYW5jZWxsYXRpb25zXSkge1xuICAgICAgY2FuY2VsUGVuZGluZ1RpbWVyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBub3RpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBub3RpY2Ugb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2UobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZywgb3B0aW9ucz86IFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zKTogTm90aWNlIHtcbiAgICBjb25zdCBpc1Blcm1hbmVudCA9IG9wdGlvbnM/LmlzUGVybWFuZW50ID8/IGZhbHNlO1xuICAgIHJldHVybiB0aGlzLnNob3dOb3RpY2VXaXRoRHVyYXRpb24obWVzc2FnZSwgaXNQZXJtYW5lbnQgPyBQRVJNQU5FTlRfTk9USUNFX0RVUkFUSU9OX0lOX01JTExJU0VDT05EUyA6IHVuZGVmaW5lZCwgaXNQZXJtYW5lbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIGRlc2NyaWJpbmcgYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLCBidXQgb25seSBvbmNlIHRoZSBvcGVyYXRpb24gaGFzIHJ1biBmb3IgbG9uZ2VyXG4gICAqIHRoYW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmRlbGF5SW5NaWxsaXNlY29uZHN9IFx1MjAxNCBzbyBvcGVyYXRpb25zXG4gICAqIHRoYXQgZmluaXNoIHNvb25lciBuZXZlciBmbGFzaCBhIG5vdGljZS4gVGhlIG5vdGljZSBzdGF5cyB1bnRpbCB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzXG4gICAqIGRpc3Bvc2VkICh3aGljaCBhbHNvIGNhbmNlbHMgdGhlIHBlbmRpbmcgdGltZXIgaWYgaXQgaGFzIG5vdCBmaXJlZCB5ZXQpLCBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoXG4gICAqIGB1c2luZ2AuIFdoZW4gYW4ge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VBZnRlckRlbGF5UGFyYW1zLmFib3J0Q29udHJvbGxlcn0gaXMgZ2l2ZW4sIGFcbiAgICogQ2FuY2VsIGJ1dHRvbiB0aGF0IGFib3J0cyBpdCBpcyBhcHBlbmRlZCAoYW5kLCBiZWluZyBpbnRlcmFjdGl2ZSwgZG9lcyBub3QgZGlzbWlzcyB0aGUgbm90aWNlKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdXNpbmcgX25vdGljZSA9IHBsdWdpbk5vdGljZUNvbXBvbmVudC5zaG93Tm90aWNlQWZ0ZXJEZWxheSh7XG4gICAqICAgYWJvcnRDb250cm9sbGVyLFxuICAgKiAgIGNvbnRlbnQ6ICgpID0+IGJ1aWxkUHJvZ3Jlc3NGcmFnbWVudCgpXG4gICAqIH0pO1xuICAgKiBhd2FpdCBydW5PcGVyYXRpb24oYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFBsdWdpbk5vdGljZUNvbXBvbmVudERlbGF5ZWROb3RpY2V9IHRoYXQgaGlkZXMgdGhlIG5vdGljZSAob3IgY2FuY2VscyB0aGUgcGVuZGluZ1xuICAgKiB0aW1lcikgd2hlbiBkaXNwb3NlZCBhbmQgbGV0cyB0aGUgY29udGVudCBiZSB1cGRhdGVkIHdoaWxlIGl0IGlzIHNob3duLlxuICAgKi9cbiAgcHVibGljIHNob3dOb3RpY2VBZnRlckRlbGF5KHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZUFmdGVyRGVsYXlQYXJhbXMpOiBQbHVnaW5Ob3RpY2VDb21wb25lbnREZWxheWVkTm90aWNlIHtcbiAgICBsZXQgc2hvd25Ob3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gICAgbGV0IHRpbWVySWQgPSAwO1xuICAgIGxldCBjdXJyZW50Q29udGVudDogVmFsdWVQcm92aWRlcjxEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nPiA9IHBhcmFtcy5jb250ZW50O1xuXG4gICAgY29uc3QgY2FuY2VsUGVuZGluZ1RpbWVyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgd2luZG93LmNsZWFyVGltZW91dCh0aW1lcklkKTtcbiAgICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5kZWxldGUoY2FuY2VsUGVuZGluZ1RpbWVyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgYnVpbGREZWxheWVkTWVzc2FnZSA9IChjb250ZW50OiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nKTogRG9jdW1lbnRGcmFnbWVudCA9PlxuICAgICAgdGhpcy5idWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllczxQbHVnaW5Ob3RpY2VDb21wb25lbnRCdWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlUGFyYW1zPih7XG4gICAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlcixcbiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogcGFyYW1zLmNhbmNlbEJ1dHRvblRleHQsXG4gICAgICAgIGNvbnRlbnRcbiAgICAgIH0pKTtcblxuICAgIHRpbWVySWQgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjYW5jZWxQZW5kaW5nVGltZXIoKTtcbiAgICAgIGludm9rZUFzeW5jU2FmZWx5KGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRDb250ZW50ID0gYXdhaXQgcmVzb2x2ZVZhbHVlKGN1cnJlbnRDb250ZW50LCB7fSk7XG4gICAgICAgIC8vIFRoZSBoYW5kbGUgbWF5IGhhdmUgYmVlbiBkaXNwb3NlZCB3aGlsZSB0aGUgY29udGVudCB3YXMgYmVpbmcgcmVzb2x2ZWQ7IGRvbid0IHNob3cgYSBzdGFsZSBub3RpY2UuXG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNob3duTm90aWNlID0gdGhpcy5zaG93Tm90aWNlV2l0aER1cmF0aW9uKGJ1aWxkRGVsYXllZE1lc3NhZ2UocmVzb2x2ZWRDb250ZW50KSwgUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMsIGZhbHNlKTtcbiAgICAgIH0pO1xuICAgIH0sIHBhcmFtcy5kZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfREVMQVlfQkVGT1JFX1NIT1dfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIHRoaXMucGVuZGluZ1RpbWVyQ2FuY2VsbGF0aW9ucy5hZGQoY2FuY2VsUGVuZGluZ1RpbWVyKTtcblxuICAgIHJldHVybiB7XG4gICAgICBzZXRDb250ZW50OiAoY29udGVudDogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgICAgICBjdXJyZW50Q29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIC8vIFJlLXdyYXAgc28gdGhlIHByZWZpeCwgaW50ZXJhY3RpdmUgZ3VhcmQsIGFuZCBDYW5jZWwgYnV0dG9uIHN1cnZpdmUgdGhlIGNvbnRlbnQgc3dhcC5cbiAgICAgICAgc2hvd25Ob3RpY2U/LnNldE1lc3NhZ2UodGhpcy5idWlsZE5vdGljZUNvbnRlbnQoYnVpbGREZWxheWVkTWVzc2FnZShjb250ZW50KSkpO1xuICAgICAgfSxcbiAgICAgIFtTeW1ib2wuZGlzcG9zZV06ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgICAgIGNhbmNlbFBlbmRpbmdUaW1lcigpO1xuICAgICAgICBzaG93bk5vdGljZT8uaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy5ub3RpY2UgPT09IHNob3duTm90aWNlKSB7XG4gICAgICAgICAgdGhpcy5ub3RpY2UgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG1lc3NhZ2UgZm9yIGEgZGVsYXllZCBub3RpY2U6IHRoZSByZXNvbHZlZCBjb250ZW50LCBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgQ2FuY2VsXG4gICAqIGJ1dHRvbiB0aGF0IGFib3J0cyB0aGUgcHJvdmlkZWQgY29udHJvbGxlciB3aGVuIGNsaWNrZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRG9jdW1lbnRGcmFnbWVudH0gaG9sZGluZyB0aGUgY29udGVudCBhbmQsIGlmIHJlcXVlc3RlZCwgYSBDYW5jZWwgYnV0dG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZERlbGF5ZWROb3RpY2VNZXNzYWdlKHBhcmFtczogUGx1Z2luTm90aWNlQ29tcG9uZW50QnVpbGREZWxheWVkTm90aWNlTWVzc2FnZVBhcmFtcyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IHsgYWJvcnRDb250cm9sbGVyLCBjYW5jZWxCdXR0b25UZXh0LCBjb250ZW50IH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudCgpO1xuICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoY29udGVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuICAgIH1cblxuICAgIGlmIChhYm9ydENvbnRyb2xsZXIpIHtcbiAgICAgIC8vIGBCdXR0b25Db21wb25lbnRgIHJlcXVpcmVzIGFuIGBIVE1MRWxlbWVudGAgcGFyZW50LCBzbyBidWlsZCBpdCBvbiBhIHRocm93YXdheVxuICAgICAgLy8gRGV0YWNoZWQgZWxlbWVudCBhbmQgbW92ZSBpdHMgYGJ1dHRvbkVsYCBpbnRvIHRoZSBmcmFnbWVudC5cbiAgICAgIGNvbnN0IGNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoY3JlYXRlRGl2KCkpO1xuICAgICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQoY2FuY2VsQnV0dG9uVGV4dCA/PyB0KCgkKSA9PiAkLm9ic2lkaWFuRGV2VXRpbHMuYnV0dG9ucy5jYW5jZWwpKTtcbiAgICAgIGFkZFBsdWdpbkNzc0NsYXNzZXMoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLCBDc3NDbGFzcy5DYW5jZWxCdXR0b24pO1xuICAgICAgLy8gVGhlIGNsaWNrIGlzIHdpcmVkIHZpYSBgYWRkRXZlbnRMaXN0ZW5lcmAgcmF0aGVyIHRoYW4gYEJ1dHRvbkNvbXBvbmVudC5vbkNsaWNrYCBzbyBpdFxuICAgICAgLy8gQnViYmxlcyB0aHJvdWdoIHRoZSBpbnRlcmFjdGl2ZS1lbGVtZW50IGd1YXJkIChrZWVwaW5nIHRoZSBub3RpY2Ugb3BlbikgYW5kIHN0YXlzXG4gICAgICAvLyBEaXJlY3RseSBleGVyY2lzYWJsZSB2aWEgYSBkaXNwYXRjaGVkIERPTSBldmVudCBpbiB1bml0IHRlc3RzLlxuICAgICAgY2FuY2VsQnV0dG9uLmJ1dHRvbkVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIH0pO1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoY2FuY2VsQnV0dG9uLmJ1dHRvbkVsKTtcbiAgICB9XG4gICAgcmV0dXJuIGZyYWdtZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgbm90aWNlIGNvbnRlbnQgd3JhcHBlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGtlZXBzIHRoZSBub3RpY2Ugb3BlbiB3aGVuIGFuIGludGVyYWN0aXZlXG4gICAqIGVsZW1lbnQgaW5zaWRlIGl0IGlzIGNsaWNrZWQuIE9ic2lkaWFuIGRpc21pc3NlcyBhIG5vdGljZSBvbiBhbnkgY2xpY2sgdGhhdCBidWJibGVzIHVwIHRvIGl0c1xuICAgKiBlbGVtZW50OyB0aGUgY29udGFpbmVyIGludGVyY2VwdHMgY2xpY2tzIG9yaWdpbmF0aW5nIG9uIGFuIGludGVyYWN0aXZlIGVsZW1lbnQgKGEgbGluaywgYnV0dG9uLFxuICAgKiBpbnB1dCwgZXRjLikgYW5kIHN0b3BzIHRoZW0gdGhlcmUsIHNvIHRoZSBlbGVtZW50J3Mgb3duIGhhbmRsZXIgc3RpbGwgcnVucyBidXQgdGhlIG5vdGljZSBzdGF5cy5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IGhvbGRpbmcgdGhlIHdyYXBwZWQsIHByZWZpeGVkIG5vdGljZSBjb250ZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5vdGljZUNvbnRlbnQobWVzc2FnZTogRG9jdW1lbnRGcmFnbWVudCB8IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBjb25zdCBjb250ZW50RWwgPSBmcmFnbWVudC5jcmVhdGVEaXYoKTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKGNvbnRlbnRFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlQ29udGVudCk7XG4gICAgY29udGVudEVsLmFwcGVuZENoaWxkKHRoaXMuYnVpbGRQcmVmaXhlZE1lc3NhZ2UobWVzc2FnZSkpO1xuICAgIGNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldnQpID0+IHtcbiAgICAgIGlmIChldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJiBldnQudGFyZ2V0LmNsb3Nlc3QoSU5URVJBQ1RJVkVfRUxFTUVOVF9TRUxFQ1RPUikpIHtcbiAgICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIG5vdGljZSBjb250ZW50LCBwcmVmaXhpbmcgdGhlIG1lc3NhZ2Ugd2l0aCB0aGUgcGx1Z2luIG5hbWUgaW4gYSBzdHlsZWQgZWxlbWVudCBzbyBpdCBpc1xuICAgKiB2aXN1YWxseSBkaXN0aW5ndWlzaGVkIGZyb20gdGhlIG1lc3NhZ2UgYm9keS5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5IGFmdGVyIHRoZSBwbHVnaW4gbmFtZSBwcmVmaXguXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERvY3VtZW50RnJhZ21lbnR9IHdpdGggdGhlIHN0eWxlZCBwbHVnaW4gbmFtZSBwcmVmaXggZm9sbG93ZWQgYnkgdGhlIG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUHJlZml4ZWRNZXNzYWdlKG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICBjb25zdCBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50KCk7XG4gICAgY29uc3QgbmFtZUVsID0gY3JlYXRlU3Bhbih7IHRleHQ6IHRoaXMucGx1Z2luTmFtZSB9KTtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKG5hbWVFbCwgQ3NzQ2xhc3MuUGx1Z2luTm90aWNlTmFtZSk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobmFtZUVsKTtcbiAgICBpZiAoIXRoaXMuX2xvYWRlZCkge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnICh1bmxvYWRlZCknKTtcbiAgICB9XG4gICAgZnJhZ21lbnQuYXBwZW5kVGV4dCgnXFxuJyk7XG4gICAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kVGV4dChtZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQobWVzc2FnZSk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNob3dzIGEgbm90aWNlIHdpdGggdGhlIGdpdmVuIGR1cmF0aW9uLCByZXBsYWNpbmcgdGhlIGN1cnJlbnQgbm90aWNlLCBhbmQgb3B0aW9uYWxseSByZWdpc3RlcnMgaXRcbiAgICogYXMgdGhpcyBwbHVnaW4ncyBwZXJtYW5lbnQgbm90aWNlLlxuICAgKlxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBtZXNzYWdlIHRvIGRpc3BsYXkuXG4gICAqIEBwYXJhbSBkdXJhdGlvbkluTWlsbGlzZWNvbmRzIC0gVGhlIG5vdGljZSBkdXJhdGlvbjsgYDBgIGtlZXBzIGl0IHVudGlsIGl0IGlzIGhpZGRlbiBleHBsaWNpdGx5LlxuICAgKiBAcGFyYW0gc2hvdWxkUmVnaXN0ZXJBc1Blcm1hbmVudCAtIFdoZXRoZXIgdG8gdHJhY2sgdGhlIG5vdGljZSBhcyB0aGlzIHBsdWdpbidzIHBlcm1hbmVudCBub3RpY2UuXG4gICAqIEByZXR1cm5zIFRoZSBjcmVhdGVkIG5vdGljZS5cbiAgICovXG4gIHByaXZhdGUgc2hvd05vdGljZVdpdGhEdXJhdGlvbihtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nLCBkdXJhdGlvbkluTWlsbGlzZWNvbmRzOiBudW1iZXIgfCB1bmRlZmluZWQsIHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQ6IGJvb2xlYW4pOiBOb3RpY2Uge1xuICAgIHRoaXMubm90aWNlPy5oaWRlKCk7XG5cbiAgICBjb25zdCBjb250ZW50ID0gdGhpcy5idWlsZE5vdGljZUNvbnRlbnQobWVzc2FnZSk7XG4gICAgdGhpcy5ub3RpY2UgPSBuZXcgTm90aWNlKGNvbnRlbnQsIGR1cmF0aW9uSW5NaWxsaXNlY29uZHMpO1xuXG4gICAgaWYgKHNob3VsZFJlZ2lzdGVyQXNQZXJtYW5lbnQpIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKHRoaXMubm90aWNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vdGljZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsbUNBQW1DO0FBQzVDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsU0FBUztBQUNsQixTQUFTLDJCQUEyQjtBQUNwQyxTQUFTLG1CQUFtQjtBQUU1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQUNsRCxNQUFNLDRDQUE0QztBQUlsRCxNQUFNLCtC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
@@ -5,7 +5,7 @@
5
5
  * Contains utility functions for handling rename and delete events in Obsidian.
6
6
  */
7
7
  import type { App } from 'obsidian';
8
- import type { EditorLockComponent } from '../editor-lock.mjs';
8
+ import type { ResourceLockComponent } from '../resource-lock.mjs';
9
9
  import type { AbortSignalComponent } from './abort-signal-component.mjs';
10
10
  import type { PluginNoticeComponent } from './plugin-notice-component.mjs';
11
11
  import { ComponentEx } from './component-ex.mjs';
@@ -70,9 +70,9 @@ export interface RenameDeleteHandlerSettings {
70
70
  interface RenameDeleteHandlerComponentConstructorParams {
71
71
  readonly abortSignalComponent: AbortSignalComponent;
72
72
  readonly app: App;
73
- readonly editorLockComponent: EditorLockComponent | null;
74
73
  readonly pluginId: string;
75
74
  readonly pluginNoticeComponent: PluginNoticeComponent;
75
+ readonly resourceLockComponent: null | ResourceLockComponent;
76
76
  settingsBuilder(this: void): Partial<RenameDeleteHandlerSettings>;
77
77
  }
78
78
  /**
@@ -84,11 +84,11 @@ export declare class RenameDeleteHandlerComponent extends ComponentEx {
84
84
  private readonly abortSignalComponent;
85
85
  private readonly app;
86
86
  private readonly deletedMetadataCacheMap;
87
- private readonly editorLockComponent;
88
87
  private readonly handledRenames;
89
88
  private readonly interruptedRenamesMap;
90
89
  private readonly pluginId;
91
90
  private readonly pluginNoticeComponent;
91
+ private readonly resourceLockComponent;
92
92
  private readonly settingsBuilder;
93
93
  private readonly settingsManager;
94
94
  /**