@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
@@ -1,10 +1,34 @@
1
1
  /// <reference path="./library-references.d.mts" />
2
+ /// <reference lib="dom" />
2
3
  /**
3
4
  * @file
4
5
  *
5
6
  * Utilities for working with MarkdownView
6
7
  */
7
- import type { MarkdownView } from 'obsidian';
8
+ import type { App } from 'obsidian';
9
+ import { MarkdownView } from 'obsidian';
10
+ /**
11
+ * Options for {@link rerenderPreviews}.
12
+ */
13
+ export interface RerenderPreviewsParams {
14
+ /**
15
+ * Stops waiting for the renders when aborted, rejecting with the signal's reason. The renders already requested still
16
+ * happen.
17
+ */
18
+ readonly abortSignal?: AbortSignal;
19
+ /**
20
+ * The Obsidian app.
21
+ */
22
+ readonly app: App;
23
+ /**
24
+ * The code block language whose blocks to render again, matched exactly and case-sensitively, the way Obsidian matches a
25
+ * code block processor's language. Only the sections holding such a block are rendered again, and a view holding none
26
+ * is left alone.
27
+ *
28
+ * @default `null`, which renders every section of every Reading view again
29
+ */
30
+ readonly language?: null | string;
31
+ }
8
32
  /**
9
33
  * Get the full HTML content of the current MarkdownView
10
34
  *
@@ -12,3 +36,26 @@ import type { MarkdownView } from 'obsidian';
12
36
  * @returns The full HTML of the MarkdownView
13
37
  */
14
38
  export declare function getFullContentHtml(view: MarkdownView): string;
39
+ /**
40
+ * Renders the open Reading views again, so a markdown post-processor or code block processor registered or reconfigured
41
+ * since they rendered applies to them.
42
+ *
43
+ * It covers every Markdown view in every window, popouts included. A full refresh is what Obsidian itself does when a
44
+ * post-processor is registered: every section is rendered again, except the header holding the inline title and the
45
+ * properties, and the footer holding the backlinks, which keep their DOM. With a `language`, only the sections holding a
46
+ * code block of that language are rendered again. The note is never written, the view mode never changes, and the
47
+ * scroll position is kept by Obsidian's renderer.
48
+ *
49
+ * The promise settles once every view SHOWN in Reading view has finished rendering, the promises of asynchronous
50
+ * post-processors included. A preview that is not shown (a background tab, a view in editing mode) is marked to render
51
+ * again when it is next shown, and is not waited for, since Obsidian does not render it until then. A view that is closed,
52
+ * hidden or switched out of Reading view while rendering stops being waited for. A post-processor whose promise never
53
+ * settles, or rejects, keeps its view's render open, exactly as it keeps Obsidian's own render open; pass an
54
+ * `abortSignal` to bound the wait.
55
+ *
56
+ * Hover popovers, embeds, canvas cards and Live Preview widgets are not refreshed.
57
+ *
58
+ * @param params - The options.
59
+ * @returns A promise that resolves once the shown Reading views have rendered.
60
+ */
61
+ export declare function rerenderPreviews(params: RerenderPreviewsParams): Promise<void>;
@@ -2,7 +2,91 @@
2
2
  THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
3
  if you want to view the source, please visit the github repository of this plugin
4
4
  */
5
+ (function () {
6
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
7
+ symbolConstructor.asyncDispose ??= symbolConstructor.for("Symbol.asyncDispose");
8
+ symbolConstructor.dispose ??= symbolConstructor.for("Symbol.dispose");
9
+ }
10
+
11
+ function ensureBrowserProcess() {
12
+ const browserProcess = {
13
+ browser: true,
14
+ cwd() {
15
+ return "/";
16
+ },
17
+ env: {},
18
+ platform: "android"
19
+ };
20
+ const existingProcess = globalThis.process;
21
+ if (!existingProcess) {
22
+ globalThis.process = browserProcess;
23
+ return;
24
+ }
25
+ if (existingProcess.versions?.node) {
26
+ return;
27
+ }
28
+ const existingProcessRecord = existingProcess;
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+ existingProcessRecord["browser"] = true;
33
+ }
5
34
 
35
+ ensureDisposeSymbols();
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : /* @__PURE__ */ Symbol.for("Symbol." + name);
40
+ var __typeError = (msg) => {
41
+ throw TypeError(msg);
42
+ };
43
+ var __using = (stack, value, async) => {
44
+ if (value != null) {
45
+ if (typeof value !== "object" && typeof value !== "function") __typeError("Object expected");
46
+ var dispose, inner;
47
+ if (async) dispose = value[__knownSymbol("asyncDispose")];
48
+ if (dispose === void 0) {
49
+ dispose = value[__knownSymbol("dispose")];
50
+ if (async) inner = dispose;
51
+ }
52
+ if (typeof dispose !== "function") __typeError("Object not disposable");
53
+ if (inner) dispose = function() {
54
+ try {
55
+ inner.call(this);
56
+ } catch (e) {
57
+ return Promise.reject(e);
58
+ }
59
+ };
60
+ stack.push([async, dispose, value]);
61
+ } else if (async) {
62
+ stack.push([async]);
63
+ }
64
+ return value;
65
+ };
66
+ var __callDispose = (stack, error, hasError) => {
67
+ var E = typeof SuppressedError === "function" ? SuppressedError : function(e, s, m, _) {
68
+ return _ = Error(m), _.name = "SuppressedError", _.error = e, _.suppressed = s, _;
69
+ };
70
+ var fail = (e) => error = hasError ? new E(e, error, "An error was suppressed during disposal") : (hasError = true, e);
71
+ var next = (it) => {
72
+ while (it = stack.pop()) {
73
+ try {
74
+ var result = it[1] && it[1].call(it[2]);
75
+ if (it[0]) return Promise.resolve(result).then(next, (e) => (fail(e), next()));
76
+ } catch (e) {
77
+ fail(e);
78
+ }
79
+ }
80
+ if (hasError) throw error;
81
+ };
82
+ return next();
83
+ };
84
+ import { onAbort } from "@mnaoumov/typescript-lib/abort-controller";
85
+ import { noop } from "@mnaoumov/typescript-lib/function";
86
+ import {
87
+ Component,
88
+ MarkdownView
89
+ } from "obsidian";
6
90
  function getFullContentHtml(view) {
7
91
  const codeMirror = view.editor.cm;
8
92
  codeMirror.viewState.printing = true;
@@ -12,7 +96,113 @@ function getFullContentHtml(view) {
12
96
  codeMirror.measure();
13
97
  return html;
14
98
  }
99
+ async function rerenderPreviews(params) {
100
+ var _stack = [];
101
+ try {
102
+ const { abortSignal, app, language = null } = params;
103
+ abortSignal?.throwIfAborted();
104
+ const views = [];
105
+ app.workspace.iterateAllLeaves((leaf) => {
106
+ if (leaf.view instanceof MarkdownView) {
107
+ views.push(leaf.view);
108
+ }
109
+ });
110
+ const waits = [];
111
+ for (const view of views) {
112
+ const isShown = isPreviewShown(view);
113
+ const scroll = isShown ? view.previewMode.getScroll() : null;
114
+ if (language === null) {
115
+ view.previewMode.rerender(true);
116
+ } else {
117
+ const sections = getSectionsWithLanguage(view.previewMode, language);
118
+ if (sections.length === 0) {
119
+ continue;
120
+ }
121
+ rerenderSections(view.previewMode, sections);
122
+ }
123
+ if (scroll !== null) {
124
+ waits.push(waitForPreviewRender(app, view, scroll));
125
+ }
126
+ }
127
+ if (waits.length === 0) {
128
+ return;
129
+ }
130
+ const allRendered = Promise.all(waits);
131
+ if (!abortSignal) {
132
+ await allRendered;
133
+ return;
134
+ }
135
+ let resolveAborted = noop;
136
+ const aborted = new Promise((resolve) => {
137
+ resolveAborted = resolve;
138
+ });
139
+ const _abortListener = __using(_stack, onAbort(abortSignal, () => {
140
+ resolveAborted();
141
+ }));
142
+ await Promise.race([allRendered, aborted]);
143
+ abortSignal.throwIfAborted();
144
+ } catch (_) {
145
+ var _error = _, _hasError = true;
146
+ } finally {
147
+ __callDispose(_stack, _error, _hasError);
148
+ }
149
+ }
150
+ function getSectionsWithLanguage(previewMode, language) {
151
+ const { renderer } = previewMode;
152
+ const selector = `code.language-${CSS.escape(language)}`;
153
+ const parser = new DOMParser();
154
+ return renderer.sections.filter(
155
+ (section) => section !== renderer.header && section !== renderer.footer && !!section.html && parser.parseFromString(section.html, "text/html").querySelector(selector) !== null
156
+ );
157
+ }
158
+ function isPreviewShown(view) {
159
+ if (view.getMode() !== "preview") {
160
+ return false;
161
+ }
162
+ const { previewEl } = view.previewMode.renderer;
163
+ return previewEl.isConnected && previewEl.offsetParent !== null && previewEl.offsetWidth > 0;
164
+ }
165
+ function rerenderSections(previewMode, sections) {
166
+ for (const section of sections) {
167
+ section.rendered = false;
168
+ section.el.empty();
169
+ }
170
+ previewMode.renderer.queueRender();
171
+ }
172
+ async function waitForPreviewRender(app, view, scroll) {
173
+ const { previewMode } = view;
174
+ const isRendered = await new Promise((resolve) => {
175
+ let isSettled = false;
176
+ const watcher = new Component();
177
+ function settle(isRenderedNow) {
178
+ if (isSettled) {
179
+ return;
180
+ }
181
+ isSettled = true;
182
+ previewMode.removeChild(watcher);
183
+ resolve(isRenderedNow);
184
+ }
185
+ function settleIfHidden() {
186
+ if (!isPreviewShown(view)) {
187
+ settle(false);
188
+ }
189
+ }
190
+ watcher.register(() => {
191
+ settle(false);
192
+ });
193
+ watcher.registerEvent(app.workspace.on("layout-change", settleIfHidden));
194
+ watcher.registerEvent(app.workspace.on("active-leaf-change", settleIfHidden));
195
+ previewMode.addChild(watcher);
196
+ previewMode.renderer.onRendered(() => {
197
+ settle(true);
198
+ });
199
+ });
200
+ if (isRendered) {
201
+ previewMode.applyScroll(scroll);
202
+ }
203
+ }
15
204
  export {
16
- getFullContentHtml
205
+ getFullContentHtml,
206
+ rerenderPreviews
17
207
  };
18
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21hcmtkb3duLXZpZXcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBNYXJrZG93blZpZXdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1hcmtkb3duVmlldyB9IGZyb20gJ29ic2lkaWFuJztcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgSFRNTCBjb250ZW50IG9mIHRoZSBjdXJyZW50IE1hcmtkb3duVmlld1xuICpcbiAqIEBwYXJhbSB2aWV3IC0gVGhlIE1hcmtkb3duVmlldyB0byBnZXQgdGhlIEhUTUwgZnJvbVxuICogQHJldHVybnMgVGhlIGZ1bGwgSFRNTCBvZiB0aGUgTWFya2Rvd25WaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsQ29udGVudEh0bWwodmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHtcbiAgY29uc3QgY29kZU1pcnJvciA9IHZpZXcuZWRpdG9yLmNtO1xuICBjb2RlTWlycm9yLnZpZXdTdGF0ZS5wcmludGluZyA9IHRydWU7XG4gIGNvZGVNaXJyb3IubWVhc3VyZSgpO1xuICBjb25zdCBodG1sID0gdmlldy5jb250ZW50RWwuaW5uZXJIVE1MO1xuICBjb2RlTWlycm9yLnZpZXdTdGF0ZS5wcmludGluZyA9IGZhbHNlO1xuICBjb2RlTWlycm9yLm1lYXN1cmUoKTtcbiAgcmV0dXJuIGh0bWw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQWNPLFNBQVMsbUJBQW1CLE1BQTRCO0FBQzdELFFBQU0sYUFBYSxLQUFLLE9BQU87QUFDL0IsYUFBVyxVQUFVLFdBQVc7QUFDaEMsYUFBVyxRQUFRO0FBQ25CLFFBQU0sT0FBTyxLQUFLLFVBQVU7QUFDNUIsYUFBVyxVQUFVLFdBQVc7QUFDaEMsYUFBVyxRQUFRO0FBQ25CLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYXJrZG93bi12aWV3LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBVdGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBNYXJrZG93blZpZXdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlbmRlcmVyU2VjdGlvbiB9IGZyb20gJ0BvYnNpZGlhbi10eXBpbmdzL29ic2lkaWFuLXB1YmxpYy1sYXRlc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIE1hcmtkb3duUHJldmlld1ZpZXdcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBvbkFib3J0IH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2Fib3J0LWNvbnRyb2xsZXInO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIE1hcmtkb3duVmlld1xufSBmcm9tICdvYnNpZGlhbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIHJlcmVuZGVyUHJldmlld3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlcmVuZGVyUHJldmlld3NQYXJhbXMge1xuICAvKipcbiAgICogU3RvcHMgd2FpdGluZyBmb3IgdGhlIHJlbmRlcnMgd2hlbiBhYm9ydGVkLCByZWplY3Rpbmcgd2l0aCB0aGUgc2lnbmFsJ3MgcmVhc29uLiBUaGUgcmVuZGVycyBhbHJlYWR5IHJlcXVlc3RlZCBzdGlsbFxuICAgKiBoYXBwZW4uXG4gICAqL1xuICByZWFkb25seSBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIFRoZSBjb2RlIGJsb2NrIGxhbmd1YWdlIHdob3NlIGJsb2NrcyB0byByZW5kZXIgYWdhaW4sIG1hdGNoZWQgZXhhY3RseSBhbmQgY2FzZS1zZW5zaXRpdmVseSwgdGhlIHdheSBPYnNpZGlhbiBtYXRjaGVzIGFcbiAgICogY29kZSBibG9jayBwcm9jZXNzb3IncyBsYW5ndWFnZS4gT25seSB0aGUgc2VjdGlvbnMgaG9sZGluZyBzdWNoIGEgYmxvY2sgYXJlIHJlbmRlcmVkIGFnYWluLCBhbmQgYSB2aWV3IGhvbGRpbmcgbm9uZVxuICAgKiBpcyBsZWZ0IGFsb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgbnVsbGAsIHdoaWNoIHJlbmRlcnMgZXZlcnkgc2VjdGlvbiBvZiBldmVyeSBSZWFkaW5nIHZpZXcgYWdhaW5cbiAgICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlPzogbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgSFRNTCBjb250ZW50IG9mIHRoZSBjdXJyZW50IE1hcmtkb3duVmlld1xuICpcbiAqIEBwYXJhbSB2aWV3IC0gVGhlIE1hcmtkb3duVmlldyB0byBnZXQgdGhlIEhUTUwgZnJvbVxuICogQHJldHVybnMgVGhlIGZ1bGwgSFRNTCBvZiB0aGUgTWFya2Rvd25WaWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdWxsQ29udGVudEh0bWwodmlldzogTWFya2Rvd25WaWV3KTogc3RyaW5nIHtcbiAgY29uc3QgY29kZU1pcnJvciA9IHZpZXcuZWRpdG9yLmNtO1xuICBjb2RlTWlycm9yLnZpZXdTdGF0ZS5wcmludGluZyA9IHRydWU7XG4gIGNvZGVNaXJyb3IubWVhc3VyZSgpO1xuICBjb25zdCBodG1sID0gdmlldy5jb250ZW50RWwuaW5uZXJIVE1MO1xuICBjb2RlTWlycm9yLnZpZXdTdGF0ZS5wcmludGluZyA9IGZhbHNlO1xuICBjb2RlTWlycm9yLm1lYXN1cmUoKTtcbiAgcmV0dXJuIGh0bWw7XG59XG5cbi8qKlxuICogUmVuZGVycyB0aGUgb3BlbiBSZWFkaW5nIHZpZXdzIGFnYWluLCBzbyBhIG1hcmtkb3duIHBvc3QtcHJvY2Vzc29yIG9yIGNvZGUgYmxvY2sgcHJvY2Vzc29yIHJlZ2lzdGVyZWQgb3IgcmVjb25maWd1cmVkXG4gKiBzaW5jZSB0aGV5IHJlbmRlcmVkIGFwcGxpZXMgdG8gdGhlbS5cbiAqXG4gKiBJdCBjb3ZlcnMgZXZlcnkgTWFya2Rvd24gdmlldyBpbiBldmVyeSB3aW5kb3csIHBvcG91dHMgaW5jbHVkZWQuIEEgZnVsbCByZWZyZXNoIGlzIHdoYXQgT2JzaWRpYW4gaXRzZWxmIGRvZXMgd2hlbiBhXG4gKiBwb3N0LXByb2Nlc3NvciBpcyByZWdpc3RlcmVkOiBldmVyeSBzZWN0aW9uIGlzIHJlbmRlcmVkIGFnYWluLCBleGNlcHQgdGhlIGhlYWRlciBob2xkaW5nIHRoZSBpbmxpbmUgdGl0bGUgYW5kIHRoZVxuICogcHJvcGVydGllcywgYW5kIHRoZSBmb290ZXIgaG9sZGluZyB0aGUgYmFja2xpbmtzLCB3aGljaCBrZWVwIHRoZWlyIERPTS4gV2l0aCBhIGBsYW5ndWFnZWAsIG9ubHkgdGhlIHNlY3Rpb25zIGhvbGRpbmcgYVxuICogY29kZSBibG9jayBvZiB0aGF0IGxhbmd1YWdlIGFyZSByZW5kZXJlZCBhZ2Fpbi4gVGhlIG5vdGUgaXMgbmV2ZXIgd3JpdHRlbiwgdGhlIHZpZXcgbW9kZSBuZXZlciBjaGFuZ2VzLCBhbmQgdGhlXG4gKiBzY3JvbGwgcG9zaXRpb24gaXMga2VwdCBieSBPYnNpZGlhbidzIHJlbmRlcmVyLlxuICpcbiAqIFRoZSBwcm9taXNlIHNldHRsZXMgb25jZSBldmVyeSB2aWV3IFNIT1dOIGluIFJlYWRpbmcgdmlldyBoYXMgZmluaXNoZWQgcmVuZGVyaW5nLCB0aGUgcHJvbWlzZXMgb2YgYXN5bmNocm9ub3VzXG4gKiBwb3N0LXByb2Nlc3NvcnMgaW5jbHVkZWQuIEEgcHJldmlldyB0aGF0IGlzIG5vdCBzaG93biAoYSBiYWNrZ3JvdW5kIHRhYiwgYSB2aWV3IGluIGVkaXRpbmcgbW9kZSkgaXMgbWFya2VkIHRvIHJlbmRlclxuICogYWdhaW4gd2hlbiBpdCBpcyBuZXh0IHNob3duLCBhbmQgaXMgbm90IHdhaXRlZCBmb3IsIHNpbmNlIE9ic2lkaWFuIGRvZXMgbm90IHJlbmRlciBpdCB1bnRpbCB0aGVuLiBBIHZpZXcgdGhhdCBpcyBjbG9zZWQsXG4gKiBoaWRkZW4gb3Igc3dpdGNoZWQgb3V0IG9mIFJlYWRpbmcgdmlldyB3aGlsZSByZW5kZXJpbmcgc3RvcHMgYmVpbmcgd2FpdGVkIGZvci4gQSBwb3N0LXByb2Nlc3NvciB3aG9zZSBwcm9taXNlIG5ldmVyXG4gKiBzZXR0bGVzLCBvciByZWplY3RzLCBrZWVwcyBpdHMgdmlldydzIHJlbmRlciBvcGVuLCBleGFjdGx5IGFzIGl0IGtlZXBzIE9ic2lkaWFuJ3Mgb3duIHJlbmRlciBvcGVuOyBwYXNzIGFuXG4gKiBgYWJvcnRTaWduYWxgIHRvIGJvdW5kIHRoZSB3YWl0LlxuICpcbiAqIEhvdmVyIHBvcG92ZXJzLCBlbWJlZHMsIGNhbnZhcyBjYXJkcyBhbmQgTGl2ZSBQcmV2aWV3IHdpZGdldHMgYXJlIG5vdCByZWZyZXNoZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBvcHRpb25zLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc2hvd24gUmVhZGluZyB2aWV3cyBoYXZlIHJlbmRlcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVyZW5kZXJQcmV2aWV3cyhwYXJhbXM6IFJlcmVuZGVyUHJldmlld3NQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBhYm9ydFNpZ25hbCwgYXBwLCBsYW5ndWFnZSA9IG51bGwgfSA9IHBhcmFtcztcbiAgYWJvcnRTaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG5cbiAgY29uc3Qgdmlld3M6IE1hcmtkb3duVmlld1tdID0gW107XG4gIGFwcC53b3Jrc3BhY2UuaXRlcmF0ZUFsbExlYXZlcygobGVhZikgPT4ge1xuICAgIGlmIChsZWFmLnZpZXcgaW5zdGFuY2VvZiBNYXJrZG93blZpZXcpIHtcbiAgICAgIHZpZXdzLnB1c2gobGVhZi52aWV3KTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHdhaXRzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcbiAgZm9yIChjb25zdCB2aWV3IG9mIHZpZXdzKSB7XG4gICAgY29uc3QgaXNTaG93biA9IGlzUHJldmlld1Nob3duKHZpZXcpO1xuICAgIC8vIEVtcHR5aW5nIHRoZSBzZWN0aW9ucyBzaHJpbmtzIHRoZSBjb250ZW50IGJlZm9yZSB0aGUgbmV4dCBmcmFtZSByZW5kZXJzIGl0IGFnYWluLCB3aGljaCBjYW4gY2xhbXAgdGhlIHNjcm9sbC5cbiAgICBjb25zdCBzY3JvbGwgPSBpc1Nob3duID8gdmlldy5wcmV2aWV3TW9kZS5nZXRTY3JvbGwoKSA6IG51bGw7XG4gICAgaWYgKGxhbmd1YWdlID09PSBudWxsKSB7XG4gICAgICB2aWV3LnByZXZpZXdNb2RlLnJlcmVuZGVyKHRydWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IGdldFNlY3Rpb25zV2l0aExhbmd1YWdlKHZpZXcucHJldmlld01vZGUsIGxhbmd1YWdlKTtcbiAgICAgIGlmIChzZWN0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXJlbmRlclNlY3Rpb25zKHZpZXcucHJldmlld01vZGUsIHNlY3Rpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoc2Nyb2xsICE9PSBudWxsKSB7XG4gICAgICB3YWl0cy5wdXNoKHdhaXRGb3JQcmV2aWV3UmVuZGVyKGFwcCwgdmlldywgc2Nyb2xsKSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHdhaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFsbFJlbmRlcmVkID0gUHJvbWlzZS5hbGwod2FpdHMpO1xuICBpZiAoIWFib3J0U2lnbmFsKSB7XG4gICAgYXdhaXQgYWxsUmVuZGVyZWQ7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHJlc29sdmVBYm9ydGVkID0gbm9vcDtcbiAgY29uc3QgYWJvcnRlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgcmVzb2x2ZUFib3J0ZWQgPSByZXNvbHZlO1xuICB9KTtcbiAgdXNpbmcgX2Fib3J0TGlzdGVuZXIgPSBvbkFib3J0KGFib3J0U2lnbmFsLCAoKSA9PiB7XG4gICAgcmVzb2x2ZUFib3J0ZWQoKTtcbiAgfSk7XG4gIGF3YWl0IFByb21pc2UucmFjZShbYWxsUmVuZGVyZWQsIGFib3J0ZWRdKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2VjdGlvbnNXaXRoTGFuZ3VhZ2UocHJldmlld01vZGU6IE1hcmtkb3duUHJldmlld1ZpZXcsIGxhbmd1YWdlOiBzdHJpbmcpOiBSZW5kZXJlclNlY3Rpb25bXSB7XG4gIGNvbnN0IHsgcmVuZGVyZXIgfSA9IHByZXZpZXdNb2RlO1xuICBjb25zdCBzZWxlY3RvciA9IGBjb2RlLmxhbmd1YWdlLSR7Q1NTLmVzY2FwZShsYW5ndWFnZSl9YDtcbiAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAvLyBUaGUgaGVhZGVyIGFuZCBmb290ZXIgY2Fycnkgbm8gSFRNTCBvZiB0aGVpciBvd24uIEEgc2VjdGlvbidzIEhUTUwgaXMgcGFyc2VkIGludG8gYW4gaW5lcnQgZG9jdW1lbnQ6IG5vdGhpbmcgcnVuc1xuICAvLyBhbmQgbm90aGluZyBsb2Fkcy5cbiAgcmV0dXJuIHJlbmRlcmVyLnNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT5cbiAgICBzZWN0aW9uICE9PSByZW5kZXJlci5oZWFkZXIgJiYgc2VjdGlvbiAhPT0gcmVuZGVyZXIuZm9vdGVyICYmICEhc2VjdGlvbi5odG1sXG4gICAgJiYgcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhzZWN0aW9uLmh0bWwsICd0ZXh0L2h0bWwnKS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSAhPT0gbnVsbFxuICApO1xufVxuXG5mdW5jdGlvbiBpc1ByZXZpZXdTaG93bih2aWV3OiBNYXJrZG93blZpZXcpOiBib29sZWFuIHtcbiAgaWYgKHZpZXcuZ2V0TW9kZSgpICE9PSAncHJldmlldycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBUaGUgc2FtZSB2aXNpYmlsaXR5IHRlc3QgYFJlYWRWaWV3UmVuZGVyZXIub25SZW5kZXJgIG1ha2VzIGJlZm9yZSBpdCByZW5kZXJzIGFueXRoaW5nLlxuICBjb25zdCB7IHByZXZpZXdFbCB9ID0gdmlldy5wcmV2aWV3TW9kZS5yZW5kZXJlcjtcbiAgcmV0dXJuIHByZXZpZXdFbC5pc0Nvbm5lY3RlZCAmJiBwcmV2aWV3RWwub2Zmc2V0UGFyZW50ICE9PSBudWxsICYmIHByZXZpZXdFbC5vZmZzZXRXaWR0aCA+IDA7XG59XG5cbmZ1bmN0aW9uIHJlcmVuZGVyU2VjdGlvbnMocHJldmlld01vZGU6IE1hcmtkb3duUHJldmlld1ZpZXcsIHNlY3Rpb25zOiByZWFkb25seSBSZW5kZXJlclNlY3Rpb25bXSk6IHZvaWQge1xuICBmb3IgKGNvbnN0IHNlY3Rpb24gb2Ygc2VjdGlvbnMpIHtcbiAgICBzZWN0aW9uLnJlbmRlcmVkID0gZmFsc2U7XG4gICAgc2VjdGlvbi5lbC5lbXB0eSgpO1xuICB9XG4gIHByZXZpZXdNb2RlLnJlbmRlcmVyLnF1ZXVlUmVuZGVyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JQcmV2aWV3UmVuZGVyKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHNjcm9sbDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgcHJldmlld01vZGUgfSA9IHZpZXc7XG4gIGNvbnN0IGlzUmVuZGVyZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgIGxldCBpc1NldHRsZWQgPSBmYWxzZTtcbiAgICBjb25zdCB3YXRjaGVyID0gbmV3IENvbXBvbmVudCgpO1xuXG4gICAgZnVuY3Rpb24gc2V0dGxlKGlzUmVuZGVyZWROb3c6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgIGlmIChpc1NldHRsZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXNTZXR0bGVkID0gdHJ1ZTtcbiAgICAgIC8vIEEgbm8tb3Agd2hlbiB0aGUgcHJldmlldyBpcyB1bmxvYWRpbmcsIHNpbmNlIGl0IGhhcyBhbHJlYWR5IHRha2VuIHRoZSB3YXRjaGVyIG9mZiBpdHMgY2hpbGRyZW4uXG4gICAgICBwcmV2aWV3TW9kZS5yZW1vdmVDaGlsZCh3YXRjaGVyKTtcbiAgICAgIHJlc29sdmUoaXNSZW5kZXJlZE5vdyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0dGxlSWZIaWRkZW4oKTogdm9pZCB7XG4gICAgICBpZiAoIWlzUHJldmlld1Nob3duKHZpZXcpKSB7XG4gICAgICAgIHNldHRsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2F0Y2hlci5yZWdpc3RlcigoKSA9PiB7XG4gICAgICBzZXR0bGUoZmFsc2UpO1xuICAgIH0pO1xuICAgIHdhdGNoZXIucmVnaXN0ZXJFdmVudChhcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgc2V0dGxlSWZIaWRkZW4pKTtcbiAgICB3YXRjaGVyLnJlZ2lzdGVyRXZlbnQoYXBwLndvcmtzcGFjZS5vbignYWN0aXZlLWxlYWYtY2hhbmdlJywgc2V0dGxlSWZIaWRkZW4pKTtcbiAgICBwcmV2aWV3TW9kZS5hZGRDaGlsZCh3YXRjaGVyKTtcbiAgICBwcmV2aWV3TW9kZS5yZW5kZXJlci5vblJlbmRlcmVkKCgpID0+IHtcbiAgICAgIHNldHRsZSh0cnVlKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgaWYgKGlzUmVuZGVyZWQpIHtcbiAgICBwcmV2aWV3TW9kZS5hcHBseVNjcm9sbChzY3JvbGwpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FB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
@@ -0,0 +1,38 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A modal that shows a text for the user to copy by hand, for when writing it to the clipboard failed.
6
+ */
7
+ import type { ModalParamsBase } from './modal.mjs';
8
+ /**
9
+ * Parameters for {@link copyTextManually}.
10
+ */
11
+ export interface CopyTextManuallyParams extends ModalParamsBase {
12
+ /**
13
+ * What the user is asked to do with the text.
14
+ */
15
+ readonly message: string;
16
+ /**
17
+ * A text for the button that continues.
18
+ */
19
+ readonly okButtonText?: string;
20
+ /**
21
+ * The text to copy.
22
+ */
23
+ readonly text: string;
24
+ /**
25
+ * A title of the modal.
26
+ *
27
+ * @default `''`
28
+ */
29
+ readonly title?: string;
30
+ }
31
+ /**
32
+ * Shows a read-only text, selected when focused, for the user to copy by hand, with a button that
33
+ * continues and one that cancels.
34
+ *
35
+ * @param params - The parameters.
36
+ * @returns A {@link Promise} that resolves with whether the user continued.
37
+ */
38
+ export declare function copyTextManually(params: CopyTextManuallyParams): Promise<boolean>;
@@ -0,0 +1,99 @@
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
+
33
+ import {
34
+ ButtonComponent,
35
+ TextAreaComponent
36
+ } from "obsidian";
37
+ import { CssClass } from "../css-class.mjs";
38
+ import { t } from "../i18n/i18n.mjs";
39
+ import {
40
+ ModalBase,
41
+ showModal
42
+ } from "./modal.mjs";
43
+ const TEXT_AREA_ROWS = 12;
44
+ class CopyTextManuallyModal extends ModalBase {
45
+ isConfirmed = false;
46
+ message;
47
+ okButtonText;
48
+ text;
49
+ title;
50
+ constructor(params) {
51
+ super(params);
52
+ this.addCssClasses(CssClass.CopyTextManuallyModal);
53
+ this.message = params.message;
54
+ this.okButtonText = params.okButtonText ?? t(($) => $.obsidianLib.buttons.ok);
55
+ this.text = params.text;
56
+ this.title = params.title ?? "";
57
+ }
58
+ onClose() {
59
+ this.promiseResolve(this.isConfirmed);
60
+ }
61
+ onOpen() {
62
+ this.titleEl.setText(this.title);
63
+ this.contentEl.createEl("p", { text: this.message });
64
+ const textArea = new TextAreaComponent(this.contentEl);
65
+ textArea.setValue(this.text);
66
+ textArea.inputEl.readOnly = true;
67
+ textArea.inputEl.rows = TEXT_AREA_ROWS;
68
+ textArea.inputEl.addClass(CssClass.CopyTextManuallyText);
69
+ textArea.inputEl.addEventListener("focus", () => {
70
+ textArea.inputEl.select();
71
+ });
72
+ const buttonContainerEl = this.contentEl.createDiv({ cls: "modal-button-container" });
73
+ const okButton = new ButtonComponent(buttonContainerEl);
74
+ okButton.setButtonText(this.okButtonText);
75
+ okButton.setCta();
76
+ okButton.onClick(() => {
77
+ this.isConfirmed = true;
78
+ this.close();
79
+ });
80
+ okButton.setClass(CssClass.OkButton);
81
+ const cancelButton = new ButtonComponent(buttonContainerEl);
82
+ cancelButton.setButtonText(t(($) => $.obsidianLib.buttons.cancel));
83
+ cancelButton.onClick(this.close.bind(this));
84
+ cancelButton.setClass(CssClass.CancelButton);
85
+ textArea.inputEl.focus();
86
+ }
87
+ }
88
+ async function copyTextManually(params) {
89
+ return await showModal(
90
+ (promiseResolve) => new CopyTextManuallyModal({
91
+ ...params,
92
+ promiseResolve
93
+ })
94
+ );
95
+ }
96
+ export {
97
+ copyTextManually
98
+ };
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvY29weS10ZXh0LW1hbnVhbGx5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBBIG1vZGFsIHRoYXQgc2hvd3MgYSB0ZXh0IGZvciB0aGUgdXNlciB0byBjb3B5IGJ5IGhhbmQsIGZvciB3aGVuIHdyaXRpbmcgaXQgdG8gdGhlIGNsaXBib2FyZCBmYWlsZWQuXG4gKi9cblxuaW1wb3J0IHtcbiAgQnV0dG9uQ29tcG9uZW50LFxuICBUZXh0QXJlYUNvbXBvbmVudFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHtcbiAgTW9kYWxCYXNlQ29uc3RydWN0b3JQYXJhbXMsXG4gIE1vZGFsUGFyYW1zQmFzZVxufSBmcm9tICcuL21vZGFsLnRzJztcblxuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQge1xuICBNb2RhbEJhc2UsXG4gIHNob3dNb2RhbFxufSBmcm9tICcuL21vZGFsLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29weVRleHRNYW51YWxseX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVRleHRNYW51YWxseVBhcmFtcyBleHRlbmRzIE1vZGFsUGFyYW1zQmFzZSB7XG4gIC8qKlxuICAgKiBXaGF0IHRoZSB1c2VyIGlzIGFza2VkIHRvIGRvIHdpdGggdGhlIHRleHQuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGV4dCBmb3IgdGhlIGJ1dHRvbiB0aGF0IGNvbnRpbnVlcy5cbiAgICovXG4gIHJlYWRvbmx5IG9rQnV0dG9uVGV4dD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gY29weS5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbW9kYWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGAnJ2BcbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlPzogc3RyaW5nO1xufVxuXG5jb25zdCBURVhUX0FSRUFfUk9XUyA9IDEyO1xuXG50eXBlIENvcHlUZXh0TWFudWFsbHlNb2RhbENvbnN0cnVjdG9yUGFyYW1zID0gQ29weVRleHRNYW51YWxseVBhcmFtcyAmIE1vZGFsQmFzZUNvbnN0cnVjdG9yUGFyYW1zPGJvb2xlYW4+O1xuXG5jbGFzcyBDb3B5VGV4dE1hbnVhbGx5TW9kYWwgZXh0ZW5kcyBNb2RhbEJhc2U8Ym9vbGVhbj4ge1xuICBwcml2YXRlIGlzQ29uZmlybWVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG9rQnV0dG9uVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB0aXRsZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IENvcHlUZXh0TWFudWFsbHlNb2RhbENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIocGFyYW1zKTtcbiAgICB0aGlzLmFkZENzc0NsYXNzZXMoQ3NzQ2xhc3MuQ29weVRleHRNYW51YWxseU1vZGFsKTtcbiAgICB0aGlzLm1lc3NhZ2UgPSBwYXJhbXMubWVzc2FnZTtcbiAgICB0aGlzLm9rQnV0dG9uVGV4dCA9IHBhcmFtcy5va0J1dHRvblRleHQgPz8gdCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idXR0b25zLm9rKTtcbiAgICB0aGlzLnRleHQgPSBwYXJhbXMudGV4dDtcbiAgICB0aGlzLnRpdGxlID0gcGFyYW1zLnRpdGxlID8/ICcnO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uQ2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5wcm9taXNlUmVzb2x2ZSh0aGlzLmlzQ29uZmlybWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbk9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy50aXRsZUVsLnNldFRleHQodGhpcy50aXRsZSk7XG4gICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IHRoaXMubWVzc2FnZSB9KTtcblxuICAgIGNvbnN0IHRleHRBcmVhID0gbmV3IFRleHRBcmVhQ29tcG9uZW50KHRoaXMuY29udGVudEVsKTtcbiAgICB0ZXh0QXJlYS5zZXRWYWx1ZSh0aGlzLnRleHQpO1xuICAgIHRleHRBcmVhLmlucHV0RWwucmVhZE9ubHkgPSB0cnVlO1xuICAgIHRleHRBcmVhLmlucHV0RWwucm93cyA9IFRFWFRfQVJFQV9ST1dTO1xuICAgIHRleHRBcmVhLmlucHV0RWwuYWRkQ2xhc3MoQ3NzQ2xhc3MuQ29weVRleHRNYW51YWxseVRleHQpO1xuICAgIHRleHRBcmVhLmlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoKSA9PiB7XG4gICAgICB0ZXh0QXJlYS5pbnB1dEVsLnNlbGVjdCgpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgYnV0dG9uQ29udGFpbmVyRWwgPSB0aGlzLmNvbnRlbnRFbC5jcmVhdGVEaXYoeyBjbHM6ICdtb2RhbC1idXR0b24tY29udGFpbmVyJyB9KTtcbiAgICBjb25zdCBva0J1dHRvbiA9IG5ldyBCdXR0b25Db21wb25lbnQoYnV0dG9uQ29udGFpbmVyRWwpO1xuICAgIG9rQnV0dG9uLnNldEJ1dHRvblRleHQodGhpcy5va0J1dHRvblRleHQpO1xuICAgIG9rQnV0dG9uLnNldEN0YSgpO1xuICAgIG9rQnV0dG9uLm9uQ2xpY2soKCkgPT4ge1xuICAgICAgdGhpcy5pc0NvbmZpcm1lZCA9IHRydWU7XG4gICAgICB0aGlzLmNsb3NlKCk7XG4gICAgfSk7XG4gICAgb2tCdXR0b24uc2V0Q2xhc3MoQ3NzQ2xhc3MuT2tCdXR0b24pO1xuXG4gICAgY29uc3QgY2FuY2VsQnV0dG9uID0gbmV3IEJ1dHRvbkNvbXBvbmVudChidXR0b25Db250YWluZXJFbCk7XG4gICAgY2FuY2VsQnV0dG9uLnNldEJ1dHRvblRleHQodCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idXR0b25zLmNhbmNlbCkpO1xuICAgIGNhbmNlbEJ1dHRvbi5vbkNsaWNrKHRoaXMuY2xvc2UuYmluZCh0aGlzKSk7XG4gICAgY2FuY2VsQnV0dG9uLnNldENsYXNzKENzc0NsYXNzLkNhbmNlbEJ1dHRvbik7XG5cbiAgICB0ZXh0QXJlYS5pbnB1dEVsLmZvY3VzKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93cyBhIHJlYWQtb25seSB0ZXh0LCBzZWxlY3RlZCB3aGVuIGZvY3VzZWQsIGZvciB0aGUgdXNlciB0byBjb3B5IGJ5IGhhbmQsIHdpdGggYSBidXR0b24gdGhhdFxuICogY29udGludWVzIGFuZCBvbmUgdGhhdCBjYW5jZWxzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB3aGV0aGVyIHRoZSB1c2VyIGNvbnRpbnVlZC5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1ib29sZWFuLW5hbWUgLS0gYGJvb2xlYW5gIGdpdmVzIGJldHRlciBEWCB0aGFuIGVudW0sIGFzIGluIGBjb25maXJtYC5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb3B5VGV4dE1hbnVhbGx5KHBhcmFtczogQ29weVRleHRNYW51YWxseVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gYXdhaXQgc2hvd01vZGFsPGJvb2xlYW4+KChwcm9taXNlUmVzb2x2ZSkgPT5cbiAgICBuZXcgQ29weVRleHRNYW51YWxseU1vZGFsKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHByb21pc2VSZXNvbHZlXG4gICAgfSlcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQU9QLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQTZCUCxNQUFNLGlCQUFpQjtBQUl2QixNQUFNLDhCQUE4QixVQUFtQjtBQUFBLEVBQzdDLGNBQWM7QUFBQSxFQUNMO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFFVixZQUFZLFFBQWdEO0FBQ2pFLFVBQU0sTUFBTTtBQUNaLFNBQUssY0FBYyxTQUFTLHFCQUFxQjtBQUNqRCxTQUFLLFVBQVUsT0FBTztBQUN0QixTQUFLLGVBQWUsT0FBTyxnQkFBZ0IsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLFFBQVEsRUFBRTtBQUM1RSxTQUFLLE9BQU8sT0FBTztBQUNuQixTQUFLLFFBQVEsT0FBTyxTQUFTO0FBQUEsRUFDL0I7QUFBQSxFQUVnQixVQUFnQjtBQUM5QixTQUFLLGVBQWUsS0FBSyxXQUFXO0FBQUEsRUFDdEM7QUFBQSxFQUVnQixTQUFlO0FBQzdCLFNBQUssUUFBUSxRQUFRLEtBQUssS0FBSztBQUMvQixTQUFLLFVBQVUsU0FBUyxLQUFLLEVBQUUsTUFBTSxLQUFLLFFBQVEsQ0FBQztBQUVuRCxVQUFNLFdBQVcsSUFBSSxrQkFBa0IsS0FBSyxTQUFTO0FBQ3JELGFBQVMsU0FBUyxLQUFLLElBQUk7QUFDM0IsYUFBUyxRQUFRLFdBQVc7QUFDNUIsYUFBUyxRQUFRLE9BQU87QUFDeEIsYUFBUyxRQUFRLFNBQVMsU0FBUyxvQkFBb0I7QUFDdkQsYUFBUyxRQUFRLGlCQUFpQixTQUFTLE1BQU07QUFDL0MsZUFBUyxRQUFRLE9BQU87QUFBQSxJQUMxQixDQUFDO0FBRUQsVUFBTSxvQkFBb0IsS0FBSyxVQUFVLFVBQVUsRUFBRSxLQUFLLHlCQUF5QixDQUFDO0FBQ3BGLFVBQU0sV0FBVyxJQUFJLGdCQUFnQixpQkFBaUI7QUFDdEQsYUFBUyxjQUFjLEtBQUssWUFBWTtBQUN4QyxhQUFTLE9BQU87QUFDaEIsYUFBUyxRQUFRLE1BQU07QUFDckIsV0FBSyxjQUFjO0FBQ25CLFdBQUssTUFBTTtBQUFBLElBQ2IsQ0FBQztBQUNELGFBQVMsU0FBUyxTQUFTLFFBQVE7QUFFbkMsVUFBTSxlQUFlLElBQUksZ0JBQWdCLGlCQUFpQjtBQUMxRCxpQkFBYSxjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxRQUFRLE1BQU0sQ0FBQztBQUNqRSxpQkFBYSxRQUFRLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQztBQUMxQyxpQkFBYSxTQUFTLFNBQVMsWUFBWTtBQUUzQyxhQUFTLFFBQVEsTUFBTTtBQUFBLEVBQ3pCO0FBQ0Y7QUFVQSxlQUFzQixpQkFBaUIsUUFBa0Q7QUFDdkYsU0FBTyxNQUFNO0FBQUEsSUFBbUIsQ0FBQyxtQkFDL0IsSUFBSSxzQkFBc0I7QUFBQSxNQUN4QixHQUFHO0FBQUEsTUFDSDtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLCJuYW1lcyI6W119
@@ -2,10 +2,12 @@
2
2
  export * as 'alert' from './alert.mjs';
3
3
  export * as 'code-block-builder' from './code-block-builder.mjs';
4
4
  export * as 'confirm' from './confirm.mjs';
5
+ export * as 'copy-text-manually' from './copy-text-manually.mjs';
5
6
  export * as 'minimizable-modal' from './minimizable-modal.mjs';
6
7
  export * as 'modal-command-builder' from './modal-command-builder.mjs';
7
8
  export * as 'modal' from './modal.mjs';
8
9
  export * as 'prompt' from './prompt.mjs';
10
+ export * as 'review-bug-report-diagnostics' from './review-bug-report-diagnostics.mjs';
9
11
  export * as 'select-item' from './select-item.mjs';
10
12
  export * as 'select-option' from './select-option.mjs';
11
13
  export * as 'suggest-modal-command-builder' from './suggest-modal-command-builder.mjs';
@@ -6,10 +6,12 @@ if you want to view the source, please visit the github repository of this plugi
6
6
  import * as alert from "./alert.mjs";
7
7
  import * as code_block_builder from "./code-block-builder.mjs";
8
8
  import * as confirm from "./confirm.mjs";
9
+ import * as copy_text_manually from "./copy-text-manually.mjs";
9
10
  import * as minimizable_modal from "./minimizable-modal.mjs";
10
11
  import * as modal_command_builder from "./modal-command-builder.mjs";
11
12
  import * as modal from "./modal.mjs";
12
13
  import * as prompt from "./prompt.mjs";
14
+ import * as review_bug_report_diagnostics from "./review-bug-report-diagnostics.mjs";
13
15
  import * as select_item from "./select-item.mjs";
14
16
  import * as select_option from "./select-option.mjs";
15
17
  import * as suggest_modal_command_builder from "./suggest-modal-command-builder.mjs";
@@ -17,12 +19,14 @@ export {
17
19
  alert,
18
20
  code_block_builder as "code-block-builder",
19
21
  confirm,
22
+ copy_text_manually as "copy-text-manually",
20
23
  minimizable_modal as "minimizable-modal",
21
24
  modal,
22
25
  modal_command_builder as "modal-command-builder",
23
26
  prompt,
27
+ review_bug_report_diagnostics as "review-bug-report-diagnostics",
24
28
  select_item as "select-item",
25
29
  select_option as "select-option",
26
30
  suggest_modal_command_builder as "suggest-modal-command-builder"
27
31
  };
28
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1ibG9jay1idWlsZGVyJyBmcm9tICcuL2NvZGUtYmxvY2stYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL21vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3NlbGVjdC1pdGVtJyBmcm9tICcuL3NlbGVjdC1pdGVtLnRzJztcbmV4cG9ydCAqIGFzICdzZWxlY3Qtb3B0aW9uJyBmcm9tICcuL3NlbGVjdC1vcHRpb24udHMnO1xuZXhwb3J0ICogYXMgJ3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL3N1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBRUEsWUFBWSxXQUFhO0FBQ3pCLFlBQVlBLHdCQUEwQjtBQUN0QyxZQUFZLGFBQWU7QUFDM0IsWUFBWUMsdUJBQXlCO0FBQ3JDLFlBQVlDLDJCQUE2QjtBQUN6QyxZQUFZLFdBQWE7QUFDekIsWUFBWSxZQUFjO0FBQzFCLFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsbUNBQXFDOyIsCiAgIm5hbWVzIjogWyJjb2RlLWJsb2NrLWJ1aWxkZXIiLCAibWluaW1pemFibGUtbW9kYWwiLCAibW9kYWwtY29tbWFuZC1idWlsZGVyIiwgInNlbGVjdC1pdGVtIiwgInNlbGVjdC1vcHRpb24iLCAic3VnZ2VzdC1tb2RhbC1jb21tYW5kLWJ1aWxkZXIiXQp9Cg==
32
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL21vZGFscy9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzICdhbGVydCcgZnJvbSAnLi9hbGVydC50cyc7XG5leHBvcnQgKiBhcyAnY29kZS1ibG9jay1idWlsZGVyJyBmcm9tICcuL2NvZGUtYmxvY2stYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnY29uZmlybScgZnJvbSAnLi9jb25maXJtLnRzJztcbmV4cG9ydCAqIGFzICdjb3B5LXRleHQtbWFudWFsbHknIGZyb20gJy4vY29weS10ZXh0LW1hbnVhbGx5LnRzJztcbmV4cG9ydCAqIGFzICdtaW5pbWl6YWJsZS1tb2RhbCcgZnJvbSAnLi9taW5pbWl6YWJsZS1tb2RhbC50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwtY29tbWFuZC1idWlsZGVyJyBmcm9tICcuL21vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG5leHBvcnQgKiBhcyAnbW9kYWwnIGZyb20gJy4vbW9kYWwudHMnO1xuZXhwb3J0ICogYXMgJ3Byb21wdCcgZnJvbSAnLi9wcm9tcHQudHMnO1xuZXhwb3J0ICogYXMgJ3Jldmlldy1idWctcmVwb3J0LWRpYWdub3N0aWNzJyBmcm9tICcuL3Jldmlldy1idWctcmVwb3J0LWRpYWdub3N0aWNzLnRzJztcbmV4cG9ydCAqIGFzICdzZWxlY3QtaXRlbScgZnJvbSAnLi9zZWxlY3QtaXRlbS50cyc7XG5leHBvcnQgKiBhcyAnc2VsZWN0LW9wdGlvbicgZnJvbSAnLi9zZWxlY3Qtb3B0aW9uLnRzJztcbmV4cG9ydCAqIGFzICdzdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlcicgZnJvbSAnLi9zdWdnZXN0LW1vZGFsLWNvbW1hbmQtYnVpbGRlci50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQUVBLFlBQVksV0FBYTtBQUN6QixZQUFZQSx3QkFBMEI7QUFDdEMsWUFBWSxhQUFlO0FBQzNCLFlBQVlDLHdCQUEwQjtBQUN0QyxZQUFZQyx1QkFBeUI7QUFDckMsWUFBWUMsMkJBQTZCO0FBQ3pDLFlBQVksV0FBYTtBQUN6QixZQUFZLFlBQWM7QUFDMUIsWUFBWUMsbUNBQXFDO0FBQ2pELFlBQVlDLGlCQUFtQjtBQUMvQixZQUFZQyxtQkFBcUI7QUFDakMsWUFBWUMsbUNBQXFDOyIsCiAgIm5hbWVzIjogWyJjb2RlLWJsb2NrLWJ1aWxkZXIiLCAiY29weS10ZXh0LW1hbnVhbGx5IiwgIm1pbmltaXphYmxlLW1vZGFsIiwgIm1vZGFsLWNvbW1hbmQtYnVpbGRlciIsICJyZXZpZXctYnVnLXJlcG9ydC1kaWFnbm9zdGljcyIsICJzZWxlY3QtaXRlbSIsICJzZWxlY3Qtb3B0aW9uIiwgInN1Z2dlc3QtbW9kYWwtY29tbWFuZC1idWlsZGVyIl0KfQo=
@@ -0,0 +1,30 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * A modal where the user reviews, and chooses, the diagnostics a bug report will carry, before anything
6
+ * leaves Obsidian.
7
+ */
8
+ import type { BugReportDiagnosticSection } from '../bug-report-diagnostics.mjs';
9
+ import type { ModalParamsBase } from './modal.mjs';
10
+ /**
11
+ * Parameters for {@link reviewBugReportDiagnostics}.
12
+ */
13
+ export interface ReviewBugReportDiagnosticsParams extends ModalParamsBase {
14
+ /**
15
+ * The text the report always carries, shown first in the preview, such as the formatted environment.
16
+ */
17
+ readonly alwaysIncludedText?: string;
18
+ /**
19
+ * The sections the user may include. A potentially private section starts excluded.
20
+ */
21
+ readonly sections: readonly BugReportDiagnosticSection[];
22
+ }
23
+ /**
24
+ * Shows the user the diagnostics a bug report can carry, with a switch per section and a preview of the
25
+ * exact text, and lets them continue or cancel. A potentially private section starts switched off.
26
+ *
27
+ * @param params - The parameters.
28
+ * @returns The sections the user chose, in their original order, or `null` when the user cancelled.
29
+ */
30
+ export declare function reviewBugReportDiagnostics(params: ReviewBugReportDiagnosticsParams): Promise<null | readonly BugReportDiagnosticSection[]>;
@@ -0,0 +1,120 @@
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
+
33
+ import {
34
+ ButtonComponent,
35
+ Setting
36
+ } from "obsidian";
37
+ import { formatBugReportDiagnostics } from "../bug-report-diagnostics.mjs";
38
+ import { CssClass } from "../css-class.mjs";
39
+ import { t } from "../i18n/i18n.mjs";
40
+ import {
41
+ ModalBase,
42
+ showModal
43
+ } from "./modal.mjs";
44
+ class ReviewBugReportDiagnosticsModal extends ModalBase {
45
+ alwaysIncludedText;
46
+ includedSectionIds = /* @__PURE__ */ new Set();
47
+ isContinued = false;
48
+ previewEl = null;
49
+ sections;
50
+ constructor(params) {
51
+ super(params);
52
+ this.addCssClasses(CssClass.BugReportReviewModal);
53
+ this.alwaysIncludedText = params.alwaysIncludedText ?? "";
54
+ this.sections = params.sections;
55
+ for (const section of this.sections) {
56
+ if (!section.isPotentiallyPrivate) {
57
+ this.includedSectionIds.add(section.id);
58
+ }
59
+ }
60
+ }
61
+ onClose() {
62
+ this.promiseResolve(this.isContinued ? this.getIncludedSections() : null);
63
+ }
64
+ onOpen() {
65
+ this.titleEl.setText(t(($) => $.obsidianLib.bugReport.reviewTitle));
66
+ this.contentEl.createEl("p", { text: t(($) => $.obsidianLib.bugReport.reviewMessage) });
67
+ for (const section of this.sections) {
68
+ const setting = new Setting(this.contentEl).setName(section.title).addToggle((toggle) => {
69
+ toggle.setValue(this.includedSectionIds.has(section.id));
70
+ toggle.onChange((value) => {
71
+ if (value) {
72
+ this.includedSectionIds.add(section.id);
73
+ } else {
74
+ this.includedSectionIds.delete(section.id);
75
+ }
76
+ this.updatePreview();
77
+ });
78
+ });
79
+ if (section.isPotentiallyPrivate) {
80
+ setting.setDesc(t(($) => $.obsidianLib.bugReport.potentiallyPrivate));
81
+ }
82
+ }
83
+ this.contentEl.createEl("p", { text: t(($) => $.obsidianLib.bugReport.previewHeading) });
84
+ this.previewEl = this.contentEl.createEl("pre", { cls: CssClass.BugReportPreview });
85
+ this.updatePreview();
86
+ const buttonContainerEl = this.contentEl.createDiv({ cls: "modal-button-container" });
87
+ const continueButton = new ButtonComponent(buttonContainerEl);
88
+ continueButton.setButtonText(t(($) => $.obsidianLib.bugReport.continue));
89
+ continueButton.setCta();
90
+ continueButton.onClick(() => {
91
+ this.isContinued = true;
92
+ this.close();
93
+ });
94
+ continueButton.setClass(CssClass.OkButton);
95
+ const cancelButton = new ButtonComponent(buttonContainerEl);
96
+ cancelButton.setButtonText(t(($) => $.obsidianLib.buttons.cancel));
97
+ cancelButton.onClick(this.close.bind(this));
98
+ cancelButton.setClass(CssClass.CancelButton);
99
+ }
100
+ getIncludedSections() {
101
+ return this.sections.filter((section) => this.includedSectionIds.has(section.id));
102
+ }
103
+ updatePreview() {
104
+ const diagnostics = formatBugReportDiagnostics(this.getIncludedSections());
105
+ const parts = [this.alwaysIncludedText, diagnostics].filter((part) => part !== "");
106
+ this.previewEl?.setText(parts.join("\n\n"));
107
+ }
108
+ }
109
+ async function reviewBugReportDiagnostics(params) {
110
+ return await showModal(
111
+ (promiseResolve) => new ReviewBugReportDiagnosticsModal({
112
+ ...params,
113
+ promiseResolve
114
+ })
115
+ );
116
+ }
117
+ export {
118
+ reviewBugReportDiagnostics
119
+ };
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvcmV2aWV3LWJ1Zy1yZXBvcnQtZGlhZ25vc3RpY3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEEgbW9kYWwgd2hlcmUgdGhlIHVzZXIgcmV2aWV3cywgYW5kIGNob29zZXMsIHRoZSBkaWFnbm9zdGljcyBhIGJ1ZyByZXBvcnQgd2lsbCBjYXJyeSwgYmVmb3JlIGFueXRoaW5nXG4gKiBsZWF2ZXMgT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHtcbiAgQnV0dG9uQ29tcG9uZW50LFxuICBTZXR0aW5nXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUgeyBCdWdSZXBvcnREaWFnbm9zdGljU2VjdGlvbiB9IGZyb20gJy4uL2J1Zy1yZXBvcnQtZGlhZ25vc3RpY3MudHMnO1xuaW1wb3J0IHR5cGUge1xuICBNb2RhbEJhc2VDb25zdHJ1Y3RvclBhcmFtcyxcbiAgTW9kYWxQYXJhbXNCYXNlXG59IGZyb20gJy4vbW9kYWwudHMnO1xuXG5pbXBvcnQgeyBmb3JtYXRCdWdSZXBvcnREaWFnbm9zdGljcyB9IGZyb20gJy4uL2J1Zy1yZXBvcnQtZGlhZ25vc3RpY3MudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi9jc3MtY2xhc3MudHMnO1xuaW1wb3J0IHsgdCB9IGZyb20gJy4uL2kxOG4vaTE4bi50cyc7XG5pbXBvcnQge1xuICBNb2RhbEJhc2UsXG4gIHNob3dNb2RhbFxufSBmcm9tICcuL21vZGFsLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmV2aWV3QnVnUmVwb3J0RGlhZ25vc3RpY3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldmlld0J1Z1JlcG9ydERpYWdub3N0aWNzUGFyYW1zIGV4dGVuZHMgTW9kYWxQYXJhbXNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRoZSByZXBvcnQgYWx3YXlzIGNhcnJpZXMsIHNob3duIGZpcnN0IGluIHRoZSBwcmV2aWV3LCBzdWNoIGFzIHRoZSBmb3JtYXR0ZWQgZW52aXJvbm1lbnQuXG4gICAqL1xuICByZWFkb25seSBhbHdheXNJbmNsdWRlZFRleHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZWN0aW9ucyB0aGUgdXNlciBtYXkgaW5jbHVkZS4gQSBwb3RlbnRpYWxseSBwcml2YXRlIHNlY3Rpb24gc3RhcnRzIGV4Y2x1ZGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VjdGlvbnM6IHJlYWRvbmx5IEJ1Z1JlcG9ydERpYWdub3N0aWNTZWN0aW9uW107XG59XG5cbnR5cGUgUmV2aWV3QnVnUmVwb3J0RGlhZ25vc3RpY3NNb2RhbENvbnN0cnVjdG9yUGFyYW1zID1cbiAgJiBNb2RhbEJhc2VDb25zdHJ1Y3RvclBhcmFtczxudWxsIHwgcmVhZG9ubHkgQnVnUmVwb3J0RGlhZ25vc3RpY1NlY3Rpb25bXT5cbiAgJiBSZXZpZXdCdWdSZXBvcnREaWFnbm9zdGljc1BhcmFtcztcblxuY2xhc3MgUmV2aWV3QnVnUmVwb3J0RGlhZ25vc3RpY3NNb2RhbCBleHRlbmRzIE1vZGFsQmFzZTxudWxsIHwgcmVhZG9ubHkgQnVnUmVwb3J0RGlhZ25vc3RpY1NlY3Rpb25bXT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGFsd2F5c0luY2x1ZGVkVGV4dDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGluY2x1ZGVkU2VjdGlvbklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGlzQ29udGludWVkID0gZmFsc2U7XG4gIHByaXZhdGUgcHJldmlld0VsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiByZWFkb25seSBCdWdSZXBvcnREaWFnbm9zdGljU2VjdGlvbltdO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJldmlld0J1Z1JlcG9ydERpYWdub3N0aWNzTW9kYWxDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKHBhcmFtcyk7XG4gICAgdGhpcy5hZGRDc3NDbGFzc2VzKENzc0NsYXNzLkJ1Z1JlcG9ydFJldmlld01vZGFsKTtcbiAgICB0aGlzLmFsd2F5c0luY2x1ZGVkVGV4dCA9IHBhcmFtcy5hbHdheXNJbmNsdWRlZFRleHQgPz8gJyc7XG4gICAgdGhpcy5zZWN0aW9ucyA9IHBhcmFtcy5zZWN0aW9ucztcbiAgICBmb3IgKGNvbnN0IHNlY3Rpb24gb2YgdGhpcy5zZWN0aW9ucykge1xuICAgICAgaWYgKCFzZWN0aW9uLmlzUG90ZW50aWFsbHlQcml2YXRlKSB7XG4gICAgICAgIHRoaXMuaW5jbHVkZWRTZWN0aW9uSWRzLmFkZChzZWN0aW9uLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25DbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLnByb21pc2VSZXNvbHZlKHRoaXMuaXNDb250aW51ZWQgPyB0aGlzLmdldEluY2x1ZGVkU2VjdGlvbnMoKSA6IG51bGwpO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9uT3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLnRpdGxlRWwuc2V0VGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1Z1JlcG9ydC5yZXZpZXdUaXRsZSkpO1xuICAgIHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdwJywgeyB0ZXh0OiB0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1Z1JlcG9ydC5yZXZpZXdNZXNzYWdlKSB9KTtcblxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiB0aGlzLnNlY3Rpb25zKSB7XG4gICAgICBjb25zdCBzZXR0aW5nID0gbmV3IFNldHRpbmcodGhpcy5jb250ZW50RWwpXG4gICAgICAgIC5zZXROYW1lKHNlY3Rpb24udGl0bGUpXG4gICAgICAgIC5hZGRUb2dnbGUoKHRvZ2dsZSkgPT4ge1xuICAgICAgICAgIHRvZ2dsZS5zZXRWYWx1ZSh0aGlzLmluY2x1ZGVkU2VjdGlvbklkcy5oYXMoc2VjdGlvbi5pZCkpO1xuICAgICAgICAgIHRvZ2dsZS5vbkNoYW5nZSgodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVkU2VjdGlvbklkcy5hZGQoc2VjdGlvbi5pZCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmluY2x1ZGVkU2VjdGlvbklkcy5kZWxldGUoc2VjdGlvbi5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZpZXcoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAoc2VjdGlvbi5pc1BvdGVudGlhbGx5UHJpdmF0ZSkge1xuICAgICAgICBzZXR0aW5nLnNldERlc2ModCgoJCkgPT4gJC5vYnNpZGlhbkxpYi5idWdSZXBvcnQucG90ZW50aWFsbHlQcml2YXRlKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50RWwuY3JlYXRlRWwoJ3AnLCB7IHRleHQ6IHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVnUmVwb3J0LnByZXZpZXdIZWFkaW5nKSB9KTtcbiAgICB0aGlzLnByZXZpZXdFbCA9IHRoaXMuY29udGVudEVsLmNyZWF0ZUVsKCdwcmUnLCB7IGNsczogQ3NzQ2xhc3MuQnVnUmVwb3J0UHJldmlldyB9KTtcbiAgICB0aGlzLnVwZGF0ZVByZXZpZXcoKTtcblxuICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lckVsID0gdGhpcy5jb250ZW50RWwuY3JlYXRlRGl2KHsgY2xzOiAnbW9kYWwtYnV0dG9uLWNvbnRhaW5lcicgfSk7XG4gICAgY29uc3QgY29udGludWVCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbkNvbnRhaW5lckVsKTtcbiAgICBjb250aW51ZUJ1dHRvbi5zZXRCdXR0b25UZXh0KHQoKCQpID0+ICQub2JzaWRpYW5MaWIuYnVnUmVwb3J0LmNvbnRpbnVlKSk7XG4gICAgY29udGludWVCdXR0b24uc2V0Q3RhKCk7XG4gICAgY29udGludWVCdXR0b24ub25DbGljaygoKSA9PiB7XG4gICAgICB0aGlzLmlzQ29udGludWVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICB9KTtcbiAgICBjb250aW51ZUJ1dHRvbi5zZXRDbGFzcyhDc3NDbGFzcy5Pa0J1dHRvbik7XG5cbiAgICBjb25zdCBjYW5jZWxCdXR0b24gPSBuZXcgQnV0dG9uQ29tcG9uZW50KGJ1dHRvbkNvbnRhaW5lckVsKTtcbiAgICBjYW5jZWxCdXR0b24uc2V0QnV0dG9uVGV4dCh0KCgkKSA9PiAkLm9ic2lkaWFuTGliLmJ1dHRvbnMuY2FuY2VsKSk7XG4gICAgY2FuY2VsQnV0dG9uLm9uQ2xpY2sodGhpcy5jbG9zZS5iaW5kKHRoaXMpKTtcbiAgICBjYW5jZWxCdXR0b24uc2V0Q2xhc3MoQ3NzQ2xhc3MuQ2FuY2VsQnV0dG9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5jbHVkZWRTZWN0aW9ucygpOiByZWFkb25seSBCdWdSZXBvcnREaWFnbm9zdGljU2VjdGlvbltdIHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5maWx0ZXIoKHNlY3Rpb24pID0+IHRoaXMuaW5jbHVkZWRTZWN0aW9uSWRzLmhhcyhzZWN0aW9uLmlkKSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVByZXZpZXcoKTogdm9pZCB7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBmb3JtYXRCdWdSZXBvcnREaWFnbm9zdGljcyh0aGlzLmdldEluY2x1ZGVkU2VjdGlvbnMoKSk7XG4gICAgY29uc3QgcGFydHMgPSBbdGhpcy5hbHdheXNJbmNsdWRlZFRleHQsIGRpYWdub3N0aWNzXS5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcnKTtcbiAgICB0aGlzLnByZXZpZXdFbD8uc2V0VGV4dChwYXJ0cy5qb2luKCdcXG5cXG4nKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG93cyB0aGUgdXNlciB0aGUgZGlhZ25vc3RpY3MgYSBidWcgcmVwb3J0IGNhbiBjYXJyeSwgd2l0aCBhIHN3aXRjaCBwZXIgc2VjdGlvbiBhbmQgYSBwcmV2aWV3IG9mIHRoZVxuICogZXhhY3QgdGV4dCwgYW5kIGxldHMgdGhlbSBjb250aW51ZSBvciBjYW5jZWwuIEEgcG90ZW50aWFsbHkgcHJpdmF0ZSBzZWN0aW9uIHN0YXJ0cyBzd2l0Y2hlZCBvZmYuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgVGhlIHNlY3Rpb25zIHRoZSB1c2VyIGNob3NlLCBpbiB0aGVpciBvcmlnaW5hbCBvcmRlciwgb3IgYG51bGxgIHdoZW4gdGhlIHVzZXIgY2FuY2VsbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmV2aWV3QnVnUmVwb3J0RGlhZ25vc3RpY3MocGFyYW1zOiBSZXZpZXdCdWdSZXBvcnREaWFnbm9zdGljc1BhcmFtcyk6IFByb21pc2U8bnVsbCB8IHJlYWRvbmx5IEJ1Z1JlcG9ydERpYWdub3N0aWNTZWN0aW9uW10+IHtcbiAgcmV0dXJuIGF3YWl0IHNob3dNb2RhbDxudWxsIHwgcmVhZG9ubHkgQnVnUmVwb3J0RGlhZ25vc3RpY1NlY3Rpb25bXT4oKHByb21pc2VSZXNvbHZlKSA9PlxuICAgIG5ldyBSZXZpZXdCdWdSZXBvcnREaWFnbm9zdGljc01vZGFsKHtcbiAgICAgIC4uLnBhcmFtcyxcbiAgICAgIHByb21pc2VSZXNvbHZlXG4gICAgfSlcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFPQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQVFQLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsU0FBUztBQUNsQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQXFCUCxNQUFNLHdDQUF3QyxVQUF3RDtBQUFBLEVBQ25GO0FBQUEsRUFDQSxxQkFBcUIsb0JBQUksSUFBWTtBQUFBLEVBQzlDLGNBQWM7QUFBQSxFQUNkLFlB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