obsidian-dev-utils 88.4.0 → 88.6.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 (48) hide show
  1. package/@types/obsidian/package.json +4 -0
  2. package/CHANGELOG.md +12 -0
  3. package/dist/integration-test-plugin/main.js +38269 -0
  4. package/dist/integration-test-plugin/manifest.json +8 -0
  5. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +13 -2
  6. package/dist/lib/cjs/@types/obsidian.d.cts +28 -0
  7. package/dist/lib/cjs/__merged.cjs +3 -1
  8. package/dist/lib/cjs/__merged.d.cts +1 -1
  9. package/dist/lib/cjs/generated-during-build.cjs +1 -1
  10. package/dist/lib/cjs/integration-test-setup.cjs +111 -0
  11. package/dist/lib/cjs/integration-test-setup.d.cts +33 -0
  12. package/dist/lib/cjs/integration-test-vitest-global-setup.cjs +145 -0
  13. package/dist/lib/cjs/integration-test-vitest-global-setup.d.cts +39 -0
  14. package/dist/lib/cjs/obsidian/components/component-ex.cjs +42 -4
  15. package/dist/lib/cjs/obsidian/components/component-ex.d.cts +29 -1
  16. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +186 -11
  17. package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +151 -4
  18. package/dist/lib/cjs/obsidian/setting-ex.cjs +13 -3
  19. package/dist/lib/cjs/obsidian/setting-ex.d.cts +14 -0
  20. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  21. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  22. package/dist/lib/cjs/script-utils/test-runners/index.cjs +4 -1
  23. package/dist/lib/cjs/script-utils/test-runners/index.d.cts +1 -0
  24. package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.cjs +197 -0
  25. package/dist/lib/cjs/script-utils/test-runners/integration-test-plugin.d.cts +44 -0
  26. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +13 -2
  27. package/dist/lib/esm/@types/obsidian.d.mts +28 -0
  28. package/dist/lib/esm/__merged.d.mts +1 -1
  29. package/dist/lib/esm/__merged.mjs +6 -2
  30. package/dist/lib/esm/generated-during-build.mjs +1 -1
  31. package/dist/lib/esm/integration-test-setup.d.mts +33 -0
  32. package/dist/lib/esm/integration-test-setup.mjs +26 -0
  33. package/dist/lib/esm/integration-test-vitest-global-setup.d.mts +39 -0
  34. package/dist/lib/esm/integration-test-vitest-global-setup.mjs +39 -0
  35. package/dist/lib/esm/obsidian/components/component-ex.d.mts +29 -1
  36. package/dist/lib/esm/obsidian/components/component-ex.mjs +46 -5
  37. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +151 -4
  38. package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +191 -12
  39. package/dist/lib/esm/obsidian/setting-ex.d.mts +14 -0
  40. package/dist/lib/esm/obsidian/setting-ex.mjs +11 -2
  41. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  42. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  43. package/dist/lib/esm/script-utils/test-runners/index.d.mts +1 -0
  44. package/dist/lib/esm/script-utils/test-runners/index.mjs +3 -1
  45. package/dist/lib/esm/script-utils/test-runners/integration-test-plugin.d.mts +44 -0
  46. package/dist/lib/esm/script-utils/test-runners/integration-test-plugin.mjs +77 -0
  47. package/package.json +21 -10
  48. package/script-utils/test-runners/integration-test-plugin/package.json +6 -0
@@ -0,0 +1,145 @@
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
+
6
+ (function initCjs() {
7
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
8
+ const globalThisRecord = globalThis;
9
+ globalThisRecord['__name'] ??= name;
10
+ const originalRequire = require;
11
+ if (originalRequire && !originalRequire.__isPatched) {
12
+ // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
13
+ require = Object.assign(
14
+ (id) => requirePatched(id),
15
+ originalRequire,
16
+ {
17
+ __isPatched: true
18
+ }
19
+ );
20
+ }
21
+
22
+ const newFuncs = {
23
+ __extractDefault() {
24
+ return extractDefault;
25
+ },
26
+ process() {
27
+ const browserProcess = {
28
+ browser: true,
29
+ cwd() {
30
+ return '/';
31
+ },
32
+ env: {},
33
+ platform: 'android'
34
+ };
35
+ return browserProcess;
36
+ }
37
+ };
38
+
39
+ for (const key of Object.keys(newFuncs)) {
40
+ globalThisRecord[key] ??= newFuncs[key]?.();
41
+ }
42
+
43
+ function name(obj) {
44
+ return obj;
45
+ }
46
+
47
+ function extractDefault(module) {
48
+ return module && module.__esModule && 'default' in module ? module.default : module;
49
+ }
50
+
51
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
52
+ 'obsidian',
53
+ '@codemirror/autocomplete',
54
+ '@codemirror/collab',
55
+ '@codemirror/commands',
56
+ '@codemirror/language',
57
+ '@codemirror/lint',
58
+ '@codemirror/search',
59
+ '@codemirror/state',
60
+ '@codemirror/text',
61
+ '@codemirror/view',
62
+ '@lezer/common',
63
+ '@lezer/lr',
64
+ '@lezer/highlight'];
65
+
66
+
67
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
68
+ '@codemirror/closebrackets',
69
+ '@codemirror/comment',
70
+ '@codemirror/fold',
71
+ '@codemirror/gutter',
72
+ '@codemirror/highlight',
73
+ '@codemirror/history',
74
+ '@codemirror/matchbrackets',
75
+ '@codemirror/panel',
76
+ '@codemirror/rangeset',
77
+ '@codemirror/rectangular-selection',
78
+ '@codemirror/stream-parser',
79
+ '@codemirror/tooltip'];
80
+
81
+
82
+ function requirePatched(id) {
83
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
84
+ return originalRequire?.(id);
85
+ }
86
+
87
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
88
+ if (globalThis.app.isMobile) {
89
+ if (id === 'process' || id === 'node:process') {
90
+ // eslint-disable-next-line no-console -- Valid usage.
91
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
92
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
93
+ return globalThis.process;
94
+ }
95
+ } else {
96
+ const module = originalRequire?.(id);
97
+ if (module) {
98
+ return extractDefault(module);
99
+ }
100
+ }
101
+
102
+ // eslint-disable-next-line no-console -- Valid usage.
103
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
104
+ return {};
105
+ }
106
+ })();
107
+
108
+ "use strict";
109
+ var __defProp = Object.defineProperty;
110
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
111
+ var __getOwnPropNames = Object.getOwnPropertyNames;
112
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
113
+ var __export = (target, all) => {
114
+ for (var name in all)
115
+ __defProp(target, name, { get: all[name], enumerable: true });
116
+ };
117
+ var __copyProps = (to, from, except, desc) => {
118
+ if (from && typeof from === "object" || typeof from === "function") {
119
+ for (let key of __getOwnPropNames(from))
120
+ if (!__hasOwnProp.call(to, key) && key !== except)
121
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
122
+ }
123
+ return to;
124
+ };
125
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
126
+ var integration_test_vitest_global_setup_exports = {};
127
+ __export(integration_test_vitest_global_setup_exports, {
128
+ setup: () => setup,
129
+ teardown: () => teardown
130
+ });
131
+ module.exports = __toCommonJS(integration_test_vitest_global_setup_exports);
132
+ var import_vitest_global_setup_plugin = require('obsidian-integration-testing/vitest-global-setup-plugin');
133
+ var import_integration_test_plugin = require('./script-utils/test-runners/integration-test-plugin.cjs');
134
+ const globalSetup = (0, import_vitest_global_setup_plugin.createSetup)({
135
+ enableCommunityPlugins: [import_integration_test_plugin.OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID],
136
+ populate: import_integration_test_plugin.getIntegrationTestPluginPopulate
137
+ });
138
+ const setup = globalSetup.setup;
139
+ const teardown = globalSetup.teardown;
140
+ // Annotate the CommonJS export names for ESM import in node:
141
+ 0 && (module.exports = {
142
+ setup,
143
+ teardown
144
+ });
145
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLXRlc3Qtdml0ZXN0LWdsb2JhbC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFR1cm5rZXkgVml0ZXN0IGBnbG9iYWxTZXR1cGAgZm9yIGEgcGx1Z2luJ3MgaW50ZWdyYXRpb24gdGVzdHM6IGRvZXMgZXZlcnl0aGluZ1xuICogYG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmdgJ3Mgb3duIGdsb2JhbCBzZXR1cCBkb2VzICh0ZW1wIHZhdWx0LCBpbnN0YWxsIGFuZCBlbmFibGUgdGhlXG4gKiBwbHVnaW4tdW5kZXItdGVzdCksIGFuZCBhZGRpdGlvbmFsbHkgc2VlZHMgYW5kIGVuYWJsZXMgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGludGVncmF0aW9uLXRlc3QgaGFybmVzc1xuICogcGx1Z2luLCBzbyBgbGliLjxoZWxwZXI+YCB3b3JrcyBpbnNpZGUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlcy5cbiAqXG4gKiBgYGB0c1xuICogZ2xvYmFsU2V0dXA6IFsnb2JzaWRpYW4tZGV2LXV0aWxzL2ludGVncmF0aW9uLXRlc3Qtdml0ZXN0LWdsb2JhbC1zZXR1cCddLFxuICogc2V0dXBGaWxlczogW1xuICogICAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3Qtc2V0dXAnLFxuICogICAnb2JzaWRpYW4tZGV2LXV0aWxzL2ludGVncmF0aW9uLXRlc3Qtc2V0dXAnXG4gKiBdXG4gKiBgYGBcbiAqXG4gKiBSZXBsYWNlcyBgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZy92aXRlc3QtZ2xvYmFsLXNldHVwLXBsdWdpbmA7IGRvIG5vdCBsaXN0IGJvdGguXG4gKlxuICogSWYgdGhlIHByb2plY3QgYWxyZWFkeSBuZWVkcyBpdHMgb3duIGBwb3B1bGF0ZWAgKGRlbW8tdmF1bHQgZml4dHVyZXMsIGEgbGFyZ2UgcGVyZm9ybWFuY2UgdmF1bHQpLCBza2lwXG4gKiB0aGlzIG1vZHVsZSBhbmQgY29tcG9zZSBpbnN0ZWFkIFx1MjAxNCBtZXJnZSB7QGxpbmsgZ2V0SW50ZWdyYXRpb25UZXN0UGx1Z2luUG9wdWxhdGV9IGludG8gdGhhdCBtYXAgYW5kIHBhc3NcbiAqIHtAbGluayBPQlNJRElBTl9ERVZfVVRJTFNfSU5URUdSQVRJT05fVEVTVF9QTFVHSU5fSUR9IHRvIGBlbmFibGVDb21tdW5pdHlQbHVnaW5zYDpcbiAqXG4gKiBgYGB0c1xuICogZXhwb3J0IGNvbnN0IHsgc2V0dXAsIHRlYXJkb3duIH0gPSBjcmVhdGVTZXR1cCh7XG4gKiAgIGVuYWJsZUNvbW11bml0eVBsdWdpbnM6IFtPQlNJRElBTl9ERVZfVVRJTFNfSU5URUdSQVRJT05fVEVTVF9QTFVHSU5fSURdLFxuICogICBwb3B1bGF0ZTogKCkgPT4gKHsgLi4ubXlGaXh0dXJlcygpLCAuLi5nZXRJbnRlZ3JhdGlvblRlc3RQbHVnaW5Qb3B1bGF0ZSgpIH0pXG4gKiB9KTtcbiAqIGBgYFxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBUaGluIGdsb2JhbC1zZXR1cCBnbHVlOyBleGVyY2lzZWQgZW5kLXRvLWVuZCBieSB0aGUgT2JzaWRpYW4gaW50ZWdyYXRpb24gc3VpdGVzLiAqL1xuaW1wb3J0IHsgY3JlYXRlU2V0dXAgfSBmcm9tICdvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nL3ZpdGVzdC1nbG9iYWwtc2V0dXAtcGx1Z2luJztcblxuaW1wb3J0IHtcbiAgZ2V0SW50ZWdyYXRpb25UZXN0UGx1Z2luUG9wdWxhdGUsXG4gIE9CU0lESUFOX0RFVl9VVElMU19JTlRFR1JBVElPTl9URVNUX1BMVUdJTl9JRFxufSBmcm9tICcuL3NjcmlwdC11dGlscy90ZXN0LXJ1bm5lcnMvaW50ZWdyYXRpb24tdGVzdC1wbHVnaW4udHMnO1xuXG5jb25zdCBnbG9iYWxTZXR1cCA9IGNyZWF0ZVNldHVwKHtcbiAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luczogW09CU0lESUFOX0RFVl9VVElMU19JTlRFR1JBVElPTl9URVNUX1BMVUdJTl9JRF0sXG4gIHBvcHVsYXRlOiBnZXRJbnRlZ3JhdGlvblRlc3RQbHVnaW5Qb3B1bGF0ZVxufSk7XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCBzZXR1cDogY3JlYXRlcyB0aGUgdGVtcCB2YXVsdCwgaW5zdGFsbHMgYW5kIGVuYWJsZXMgdGhlIHBsdWdpbi11bmRlci10ZXN0LCB0aGVuIHNlZWRzIGFuZFxuICogZW5hYmxlcyB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgaW50ZWdyYXRpb24tdGVzdCBoYXJuZXNzIHBsdWdpbiBhbG9uZ3NpZGUgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXR1cCA9IGdsb2JhbFNldHVwLnNldHVwO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgdGVhcmRvd246IHJlbW92ZXMgdGhlIHRlbXAgdmF1bHQgYW5kIGRpc3Bvc2VzIHRoZSB0cmFuc3BvcnQuXG4gKi9cbmV4cG9ydCBjb25zdCB0ZWFyZG93biA9IGdsb2JhbFNldHVwLnRlYXJkb3duO1xuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBK0JBLHdDQUE0QjtBQUU1QixxQ0FHTztBQUVQLE1BQU0sa0JBQWMsK0NBQVk7QUFBQSxFQUM5Qix3QkFBd0IsQ0FBQyw0RUFBNkM7QUFBQSxFQUN0RSxVQUFVO0FBQ1osQ0FBQztBQU1NLE1BQU0sUUFBUSxZQUFZO0FBSzFCLE1BQU0sV0FBVyxZQUFZOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,39 @@
1
+ /// <reference path="./library.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Turnkey Vitest `globalSetup` for a plugin's integration tests: does everything
6
+ * `obsidian-integration-testing`'s own global setup does (temp vault, install and enable the
7
+ * plugin-under-test), and additionally seeds and enables the `obsidian-dev-utils` integration-test harness
8
+ * plugin, so `lib.<helper>` works inside `evalInObsidian` closures.
9
+ *
10
+ * ```ts
11
+ * globalSetup: ['obsidian-dev-utils/integration-test-vitest-global-setup'],
12
+ * setupFiles: [
13
+ * 'obsidian-integration-testing/vitest-setup',
14
+ * 'obsidian-dev-utils/integration-test-setup'
15
+ * ]
16
+ * ```
17
+ *
18
+ * Replaces `obsidian-integration-testing/vitest-global-setup-plugin`; do not list both.
19
+ *
20
+ * If the project already needs its own `populate` (demo-vault fixtures, a large performance vault), skip
21
+ * this module and compose instead — merge {@link getIntegrationTestPluginPopulate} into that map and pass
22
+ * {@link OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID} to `enableCommunityPlugins`:
23
+ *
24
+ * ```ts
25
+ * export const { setup, teardown } = createSetup({
26
+ * enableCommunityPlugins: [OBSIDIAN_DEV_UTILS_INTEGRATION_TEST_PLUGIN_ID],
27
+ * populate: () => ({ ...myFixtures(), ...getIntegrationTestPluginPopulate() })
28
+ * });
29
+ * ```
30
+ */
31
+ /**
32
+ * Vitest global setup: creates the temp vault, installs and enables the plugin-under-test, then seeds and
33
+ * enables the `obsidian-dev-utils` integration-test harness plugin alongside it.
34
+ */
35
+ export declare const setup: (this: void, project: import("vitest/node", { with: { 'resolution-mode': 'import' } }).TestProject) => Promise<void>;
36
+ /**
37
+ * Vitest global teardown: removes the temp vault and disposes the transport.
38
+ */
39
+ export declare const teardown: (this: void) => Promise<void>;
@@ -133,6 +133,7 @@ var import_error = require('../../error.cjs');
133
133
  var import_function = require('../../function.cjs');
134
134
  class ComponentEx extends import_obsidian.Component {
135
135
  childrenSet = /* @__PURE__ */ new Set();
136
+ hasBeenLoaded = false;
136
137
  loadErrors = [];
137
138
  loadPromise = null;
138
139
  /**
@@ -142,11 +143,21 @@ class ComponentEx extends import_obsidian.Component {
142
143
  * immediately, so `child._loaded` is set before this method returns even when this component has async load logic.
143
144
  * The child's async tail (if any) is sequenced into the load promise so a later {@link loadWithPromises} call awaits it.
144
145
  *
146
+ * Adding a child BEFORE the first load is legitimate: the child is queued and loaded when this component loads.
147
+ * Adding one AFTER this component has been unloaded is not — the child would never be loaded and never unloaded
148
+ * (a leak), so it is refused with a {@link SilentError}. The typical source of such a call is an `async` method
149
+ * that was suspended on an `await` when the component got unloaded and then resumed on the dead component; the
150
+ * {@link SilentError} unwinds it quietly (see {@link isUnloaded}).
151
+ *
145
152
  * @typeParam TComponent - The type of component to add.
146
153
  * @param component - The component instance to add.
147
154
  * @returns The added component.
155
+ * @throws A {@link SilentError} if the component has already been unloaded.
148
156
  */
149
157
  addChild(component) {
158
+ if (this.isUnloaded()) {
159
+ throw new import_error.SilentError("Component is already unloaded");
160
+ }
150
161
  this._children.push(component);
151
162
  this.childrenSet.add(component);
152
163
  if (this._loaded) {
@@ -164,6 +175,7 @@ class ComponentEx extends import_obsidian.Component {
164
175
  return;
165
176
  }
166
177
  this._loaded = true;
178
+ this.hasBeenLoaded = true;
167
179
  this.resetLoadState();
168
180
  this.onload();
169
181
  const onloadAsyncPromise = this.onloadAsync();
@@ -254,12 +266,22 @@ class ComponentEx extends import_obsidian.Component {
254
266
  * {@link Component.unload} is a no-op while the component is not loaded, so any teardown registered beforehand would
255
267
  * never run if the component is unloaded without first being loaded.
256
268
  *
257
- * @throws An {@link Error} if the component is not loaded.
269
+ * The two not-loaded cases are deliberately distinguished. A component that was NEVER loaded is a genuine
270
+ * programming error, so it throws a loud {@link Error}. A component that has ALREADY been unloaded is not —
271
+ * it is the expected outcome of work that outlived its component (e.g. an `async` method suspended on an
272
+ * `await` while the component was unloaded, then resumed) — so it throws a {@link SilentError}, which
273
+ * `handleSilentError` suppresses, letting such work unwind quietly instead of reporting an async error.
274
+ *
275
+ * @throws An {@link Error} if the component was never loaded, or a {@link SilentError} if it has already been unloaded.
258
276
  */
259
277
  ensureLoaded() {
260
- if (!this._loaded) {
261
- throw new Error("Component is not loaded");
278
+ if (this._loaded) {
279
+ return;
280
+ }
281
+ if (this.isUnloaded()) {
282
+ throw new import_error.SilentError("Component is already unloaded");
262
283
  }
284
+ throw new Error("Component is not loaded");
263
285
  }
264
286
  /**
265
287
  * Returns the component's in-flight load {@link Promise} (its {@link onloadAsync} plus children), or `null` when
@@ -288,6 +310,22 @@ class ComponentEx extends import_obsidian.Component {
288
310
  hasLoadErrors() {
289
311
  return this.loadErrors.length > 0;
290
312
  }
313
+ /**
314
+ * Returns whether the component has already been unloaded, as opposed to simply not having been loaded yet.
315
+ *
316
+ * Both states leave `_loaded` false, but they mean opposite things: a component that was never loaded is still
317
+ * ahead of its lifecycle (queueing children before load is legitimate), while an unloaded one is behind it and
318
+ * must not be used any further. The distinction is tracked by a flag set in {@link load}, NOT by an
319
+ * {@link Component.onunload} override, because subclasses override `onunload` and may not call `super`.
320
+ *
321
+ * Use it in a long-running `async` method to abandon work whose component was unloaded mid-flight, when
322
+ * unwinding via the {@link SilentError} thrown by {@link ensureLoaded} / {@link addChild} is not desired.
323
+ *
324
+ * @returns `true` if the component was loaded at some point and is currently unloaded, otherwise `false`.
325
+ */
326
+ isUnloaded() {
327
+ return this.hasBeenLoaded && !this._loaded;
328
+ }
291
329
  /**
292
330
  * Sequences an already-started load step into the load promise.
293
331
  *
@@ -399,4 +437,4 @@ class ComponentEx extends import_obsidian.Component {
399
437
  0 && (module.exports = {
400
438
  ComponentEx
401
439
  });
402
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRXh0ZW5kZWQgQ29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBFcnJvcldyYXBwZXIgfSBmcm9tICcuLi8uLi9lcnJvci50cyc7XG5pbXBvcnQge1xuICBub29wLFxuICBub29wQXN5bmNTaW5nbGV0b25Qcm9taXNlXG59IGZyb20gJy4uLy4uL2Z1bmN0aW9uLnRzJztcblxuLyoqXG4gKiBFeHRlbmRlZCBDb21wb25lbnRcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9yZXF1aXJlLWNvbXBvbmVudC1zdWZmaXggLS0gRXh0ZW5kZWQgYmFzZSBjbGFzcy5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRFeCBleHRlbmRzIENvbXBvbmVudCBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICBwcml2YXRlIHJlYWRvbmx5IGNoaWxkcmVuU2V0ID0gbmV3IFNldDxDb21wb25lbnQ+KCk7XG4gIHByaXZhdGUgbG9hZEVycm9yczogRXJyb3JbXSA9IFtdO1xuICBwcml2YXRlIGxvYWRQcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAqXG4gICAqIE1pcnJvcnMgdGhlIG5hdGl2ZSBgQ29tcG9uZW50LmFkZENoaWxkYCBjb250cmFjdDogaWYgdGhpcyBjb21wb25lbnQgaXMgYWxyZWFkeSBsb2FkZWQsIHRoZSBjaGlsZCBpcyBsb2FkZWRcbiAgICogaW1tZWRpYXRlbHksIHNvIGBjaGlsZC5fbG9hZGVkYCBpcyBzZXQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMgZXZlbiB3aGVuIHRoaXMgY29tcG9uZW50IGhhcyBhc3luYyBsb2FkIGxvZ2ljLlxuICAgKiBUaGUgY2hpbGQncyBhc3luYyB0YWlsIChpZiBhbnkpIGlzIHNlcXVlbmNlZCBpbnRvIHRoZSBsb2FkIHByb21pc2Ugc28gYSBsYXRlciB7QGxpbmsgbG9hZFdpdGhQcm9taXNlc30gY2FsbCBhd2FpdHMgaXQuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVENvbXBvbmVudCAtIFRoZSB0eXBlIG9mIGNvbXBvbmVudCB0byBhZGQuXG4gICAqIEBwYXJhbSBjb21wb25lbnQgLSBUaGUgY29tcG9uZW50IGluc3RhbmNlIHRvIGFkZC5cbiAgICogQHJldHVybnMgVGhlIGFkZGVkIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSBhZGRDaGlsZDxUQ29tcG9uZW50IGV4dGVuZHMgQ29tcG9uZW50Pihjb21wb25lbnQ6IFRDb21wb25lbnQpOiBUQ29tcG9uZW50IHtcbiAgICB0aGlzLl9jaGlsZHJlbi5wdXNoKGNvbXBvbmVudCk7XG4gICAgdGhpcy5jaGlsZHJlblNldC5hZGQoY29tcG9uZW50KTtcblxuICAgIGlmICh0aGlzLl9sb2FkZWQpIHtcbiAgICAgIHRoaXMuYXBwZW5kRWFnZXJMb2FkU3RlcCh0aGlzLmV4dHJhY3RMb2FkUHJvbWlzYWJsZShjb21wb25lbnQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIERlc3BpdGUgdGhlIGRlY2xhcmVkIGB2b2lkYCByZXR1cm4gdHlwZSwgdGhpcyBtZXRob2QgcmV0dXJucyBhIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBsb2FkZWQgb3IgYG51bGxgIGlmIHRoZSBjb21wb25lbnQgaXMgZnVsbHkgc3luY2hyb25vdXMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgbG9hZCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fbG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0TG9hZFN0YXRlKCk7XG5cbiAgICB0aGlzLm9ubG9hZCgpO1xuXG4gICAgY29uc3Qgb25sb2FkQXN5bmNQcm9taXNlID0gdGhpcy5vbmxvYWRBc3luYygpO1xuICAgIGlmIChvbmxvYWRBc3luY1Byb21pc2UgIT09IG5vb3BBc3luY1NpbmdsZXRvblByb21pc2UpIHtcbiAgICAgIHRoaXMuYXBwZW5kRWFnZXJMb2FkU3RlcChvbmxvYWRBc3luY1Byb21pc2UpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5fY2hpbGRyZW4uc2xpY2UoKSkge1xuICAgICAgdGhpcy5hcHBlbmRTZXF1ZW50aWFsTG9hZFN0ZXAoKCkgPT4gdGhpcy5leHRyYWN0TG9hZFByb21pc2FibGUoY2hpbGQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb2FkUHJvbWlzZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZSwgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gV2UgbmVlZCB0byBieXBhc3MgdHlwZSBzeXN0ZW0gdG8gcmV0dXJuIGBQcm9taXNlPHZvaWQ+YC5cbiAgICAgIHJldHVybiB0aGlzLmxvYWRQcm9taXNlIGFzIHVua25vd24gYXMgdm9pZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudCB3aXRoIHByb21pc2VzLlxuICAgKlxuICAgKiBVbmxpa2Uge0BsaW5rIGxvYWR9LCB0aGlzIG1ldGhvZCBuZXZlciByZWplY3RzIHdpdGggYW4gaW5kaXZpZHVhbCBlcnJvcjogZXZlcnkgZmFpbHVyZSByYWlzZWQgYnkge0BsaW5rIG9ubG9hZEFzeW5jfVxuICAgKiBvciBhIGNoaWxkJ3MgbG9hZCBpcyBjb2xsZWN0ZWQsIGFuZCBvbmNlIGV2ZXJ5dGhpbmcgc2V0dGxlcyB0aGUgcmV0dXJuZWQge0BsaW5rIFByb21pc2V9IHJlamVjdHMgd2l0aCBhIHNpbmdsZVxuICAgKiB7QGxpbmsgQWdncmVnYXRlRXJyb3J9IGhvbGRpbmcgYWxsIG9mIHRoZW0uIE5vbi1gRXJyb3JgIHRocm93YWJsZXMgYXJlIG5vcm1hbGl6ZWQgdmlhIHtAbGluayBFcnJvcldyYXBwZXIuY3JlYXRlfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbiBmaW5pc2ggbG9hZGluZywgcmVqZWN0cyB3aXRoIGFuIHtAbGluayBBZ2dyZWdhdGVFcnJvcn0gaWYgYW55IGxvYWQgc3RlcCBmYWlsZWQsIG9yIGBudWxsYCBpZiB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4gZG9uJ3QgdXNlIGBhc3luY2AgbG9naWMgYW5kIG5vbmUgZmFpbGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBwdWJsaWMgbG9hZFdpdGhQcm9taXNlcygpOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2FkKCk7XG5cbiAgICBjb25zdCBsb2FkUHJvbWlzZSA9IHRoaXMubG9hZFByb21pc2U7XG4gICAgaWYgKCFsb2FkUHJvbWlzZSkge1xuICAgICAgaWYgKHRoaXMubG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IodGhpcy5sb2FkRXJyb3JzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9hZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKHRoaXMubG9hZEVycm9ycyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogT3ZlcnJpZGUgdG8gYWRkIGFzeW5jIGxvYWQgbG9naWMsIHdoaWNoIGlzIGV4ZWN1dGVkIGFmdGVyIHtAbGluayBDb21wb25lbnQub25sb2FkfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIG9ubG9hZEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBub29wQXN5bmNTaW5nbGV0b25Qcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHtAbGluayBEaXNwb3NhYmxlfSBzbyBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubG9hZHMsIGFuZCByZXR1cm5zIGl0IHVuY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHJlY3VycmluZyBcInRpZSBhIGRpc3Bvc2FibGUgdG8gdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZSwgdGhlbiBrZWVwIHVzaW5nIGl0XCIgaWRpb206IHRoZSBkaXNwb3NhYmxlIGlzXG4gICAqIGRpc3Bvc2VkIG9uIHtAbGluayBDb21wb25lbnQudW5sb2FkfSAob3IgZWFybGllciwgaWYgdGhlIGNhbGxlciBkaXNwb3NlcyBpdCBkaXJlY3RseSBcdTIwMTQgZGlzcG9zZSBpcyBleHBlY3RlZCB0b1xuICAgKiBiZSBpZGVtcG90ZW50KS4gR3VhcmQgd2l0aCB7QGxpbmsgZW5zdXJlTG9hZGVkfSBhdCB0aGUgY2FsbCBzaXRlIHdoZW4gcmVnaXN0ZXJpbmcgYmVmb3JlIGxvYWQgd291bGQgYmUgdW5zYWZlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFREaXNwb3NhYmxlIC0gVGhlIHR5cGUgb2YgdGhlIGRpc3Bvc2FibGUuXG4gICAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzYW1lIGRpc3Bvc2FibGUsIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckRpc3Bvc2FibGU8VERpc3Bvc2FibGUgZXh0ZW5kcyBEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBURGlzcG9zYWJsZSk6IFREaXNwb3NhYmxlIHtcbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVtb3ZlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50KTtcbiAgICB0aGlzLmNoaWxkcmVuU2V0LmRlbGV0ZShjb21wb25lbnQpO1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIHRoaXMudW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgY29tcG9uZW50IGlzIGxvYWRlZCwgdGhyb3dpbmcgaWYgaXQgaXMgbm90LlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBndWFyZCBwdWJsaWMgbWV0aG9kcyB0aGF0IHJlZ2lzdGVyIHRlYXJkb3duLWJlYXJpbmcgcmVzb3VyY2VzICh2aWEge0BsaW5rIENvbXBvbmVudC5yZWdpc3Rlcn0sXG4gICAqIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJFdmVudH0sIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJEb21FdmVudH0sIGV0Yy4pLiBSZWdpc3RlcmluZyBiZWZvcmUgbG9hZCBpcyB1bnNhZmU6XG4gICAqIHtAbGluayBDb21wb25lbnQudW5sb2FkfSBpcyBhIG5vLW9wIHdoaWxlIHRoZSBjb21wb25lbnQgaXMgbm90IGxvYWRlZCwgc28gYW55IHRlYXJkb3duIHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCB3b3VsZFxuICAgKiBuZXZlciBydW4gaWYgdGhlIGNvbXBvbmVudCBpcyB1bmxvYWRlZCB3aXRob3V0IGZpcnN0IGJlaW5nIGxvYWRlZC5cbiAgICpcbiAgICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoZSBjb21wb25lbnQgaXMgbm90IGxvYWRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBlbnN1cmVMb2FkZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9sb2FkZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ29tcG9uZW50IGlzIG5vdCBsb2FkZWQnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcG9uZW50J3MgaW4tZmxpZ2h0IGxvYWQge0BsaW5rIFByb21pc2V9IChpdHMge0BsaW5rIG9ubG9hZEFzeW5jfSBwbHVzIGNoaWxkcmVuKSwgb3IgYG51bGxgIHdoZW5cbiAgICogbm90aGluZyBpcyBsb2FkaW5nIFx1MjAxNCBlaXRoZXIgdGhlIGNvbXBvbmVudCBsb2FkZWQgZnVsbHkgc3luY2hyb25vdXNseSBvciBpdHMgYXN5bmMgbG9hZCBoYXMgYWxyZWFkeSBzZXR0bGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY2FsbGVyIHNjaGVkdWxlZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIHN0aWxsIGxvYWRpbmcgYXdhaXQgdGhlIGFzeW5jIGxvYWQgdGFpbCBiZWZvcmUgYWN0aW5nLCBpbnN0ZWFkIG9mXG4gICAqIHJhY2luZyBpdC4gVGhlIG1vdGl2YXRpbmcgY2FzZSBpcyBhIGxheW91dC1yZWFkeSBoYW5kbGVyIChzZWUgYExheW91dFJlYWR5Q29tcG9uZW50YCkgdGhhdCBmaXJlcyBiZWNhdXNlIHRoZVxuICAgKiBjb21wb25lbnQgd2FzIGxvYWRlZCBhZnRlciB0aGUgd29ya3NwYWNlIGxheW91dCB3YXMgYWxyZWFkeSByZWFkeToge0BsaW5rIENvbXBvbmVudC5vbmxvYWR9IGhhcyBydW4gKHNvIGBfbG9hZGVkYFxuICAgKiBpcyBzZXQpIGJ1dCB7QGxpbmsgb25sb2FkQXN5bmN9IG1heSBub3QgaGF2ZSBmaW5pc2hlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGluLWZsaWdodCBsb2FkIHByb21pc2UsIG9yIGBudWxsYCBpZiBubyBsb2FkIGlzIGluIGZsaWdodC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbkZsaWdodExvYWRQcm9taXNlKCk6IG51bGwgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG1vc3QgcmVjZW50IGxvYWQgcmVjb3JkZWQgYW55IGZhaWx1cmUuXG4gICAqXG4gICAqIFJlZmxlY3RzIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IHtAbGluayBsb2FkfSAvIHtAbGluayBsb2FkV2l0aFByb21pc2VzfTogYHRydWVgIHdoZW4ge0BsaW5rIG9ubG9hZEFzeW5jfSBvciBhbnlcbiAgICogY2hpbGQncyBsb2FkIHRocmV3IChzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5KS4gVW5saWtlIHtAbGluayBsb2FkV2l0aFByb21pc2VzfSwgcmVhZGluZyB0aGlzIGRvZXMgTk9UXG4gICAqIHJlLXJhaXNlIHRoZSBjb2xsZWN0ZWQgZXJyb3JzIFx1MjAxNCBpdCBsZXRzIGEgYnlzdGFuZGVyIChlLmcuIGEgbGF5b3V0LXJlYWR5IGhhbmRsZXIgYXdhaXRpbmcgdGhlIGluLWZsaWdodCBsb2FkKSB0ZWxsXG4gICAqIHdoZXRoZXIgdGhlIGxvYWQgc3VjY2VlZGVkIHdpdGhvdXQgYWRvcHRpbmcgYSBmYWlsdXJlIHRoYXQgdGhlIGxvYWQncyBvd25lciBpcyBhbHJlYWR5IHJlc3BvbnNpYmxlIGZvci5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBsYXN0IGxvYWQgcmVjb3JkZWQgYXQgbGVhc3Qgb25lIGVycm9yLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHByb3RlY3RlZCBoYXNMb2FkRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRFcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXF1ZW5jZXMgYW4gYWxyZWFkeS1zdGFydGVkIGxvYWQgc3RlcCBpbnRvIHRoZSBsb2FkIHByb21pc2UuXG4gICAqXG4gICAqIFRoZSBzdGVwIGlzIHByZXN1bWVkIHRvIGhhdmUgc3RhcnRlZCBzeW5jaHJvbm91c2x5IChzbyBhbnkgYF9sb2FkZWRgIGZsYWcgaXQgc2V0cyBpcyBhbHJlYWR5IHZpc2libGUpOyBvbmx5IHRoZVxuICAgKiBhd2FpdGluZyBvZiBpdHMgYXN5bmMgdGFpbCBpcyBzZXF1ZW5jZWQgaGVyZS5cbiAgICpcbiAgICogQHBhcmFtIGxvYWRQcm9taXNhYmxlIC0gVGhlIHJlc3VsdCBvZiBhbiBhbHJlYWR5LXN0YXJ0ZWQgbG9hZCBzdGVwLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRFYWdlckxvYWRTdGVwKGxvYWRQcm9taXNhYmxlOiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPik6IHZvaWQge1xuICAgIGNvbnN0IGNhcHR1cmVkID0gdGhpcy5jYXB0dXJlU2V0dGxlZChsb2FkUHJvbWlzYWJsZSk7XG4gICAgaWYgKCFjYXB0dXJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5sb2FkUHJvbWlzZTtcbiAgICB0aGlzLnNldExvYWRQcm9taXNlKHByZXZpb3VzID8gcHJldmlvdXMudGhlbigoKSA9PiBjYXB0dXJlZCkgOiBjYXB0dXJlZCk7XG4gIH1cblxuICAvKipcbiAgICogU2VxdWVuY2VzIGEgZGVmZXJyZWQgbG9hZCBzdGVwIGludG8gdGhlIGxvYWQgcHJvbWlzZSwgcnVubmluZyBpdCBvbmx5IGFmdGVyIHByZXZpb3VzbHktYXBwZW5kZWQgc3RlcHMgc2V0dGxlLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFByb21pc2FibGVGbiAtIEEgZnVuY3Rpb24gdGhhdCBzdGFydHMgdGhlIGxvYWQgc3RlcCBhbmQgcmV0dXJucyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBlbmRTZXF1ZW50aWFsTG9hZFN0ZXAobG9hZFByb21pc2FibGVGbjogKCkgPT4gbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMubG9hZFByb21pc2U7XG4gICAgaWYgKHByZXZpb3VzKSB7XG4gICAgICB0aGlzLnNldExvYWRQcm9taXNlKHByZXZpb3VzLnRoZW4oKCkgPT4gdGhpcy5ydW5BbmRDYXB0dXJlKGxvYWRQcm9taXNhYmxlRm4pKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2FwdHVyZWQgPSB0aGlzLmNhcHR1cmVTeW5jKGxvYWRQcm9taXNhYmxlRm4pO1xuICAgIGlmIChjYXB0dXJlZCkge1xuICAgICAgdGhpcy5zZXRMb2FkUHJvbWlzZShjYXB0dXJlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgYSBsb2FkIGZhaWx1cmUuXG4gICAqXG4gICAqIEEgZmFpbHVyZSByYWlzZWQgYnkgYSBjaGlsZCB7QGxpbmsgQ29tcG9uZW50RXh9IGlzIGl0c2VsZiBhbiB7QGxpbmsgQWdncmVnYXRlRXJyb3J9OyBpdCBpcyByZWNvcmRlZCBhcy1pcyBzbyB0aGVcbiAgICogZ3JvdXBpbmcgYnkgY2hpbGQgY29tcG9uZW50IGlzIHByZXNlcnZlZCAob3duIGZhaWx1cmVzIHN0YXkgZmxhdCwgY2hpbGQtc3VidHJlZSBmYWlsdXJlcyBzdGF5IG5lc3RlZCkuXG4gICAqXG4gICAqIEBwYXJhbSBlcnJvciAtIFRoZSB0aHJvd24gdmFsdWUgdG8gcmVjb3JkLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXB0dXJlRXJyb3IoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRFcnJvcnMucHVzaChFcnJvcldyYXBwZXIuY3JlYXRlKGVycm9yKSk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHMgYW4gYWxyZWFkeS1zdGFydGVkIGxvYWQgcmVzdWx0IHNvIGl0IG5ldmVyIHJlamVjdHM6IGFueSBmYWlsdXJlIGlzIHJlY29yZGVkIGludG8gYGxvYWRFcnJvcnNgLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFByb21pc2FibGUgLSBUaGUgbG9hZCByZXN1bHQgdG8gb2JzZXJ2ZS5cbiAgICogQHJldHVybnMgQSBuZXZlci1yZWplY3Rpbmcge0BsaW5rIFByb21pc2V9LCBvciBgbnVsbGAgaWYgdGhlIHJlc3VsdCBpcyBmdWxseSBzeW5jaHJvbm91cy5cbiAgICovXG4gIHByaXZhdGUgY2FwdHVyZVNldHRsZWQobG9hZFByb21pc2FibGU6IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogbnVsbCB8IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChsb2FkUHJvbWlzYWJsZSA9PT0gbnVsbCB8fCBsb2FkUHJvbWlzYWJsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxvYWRQcm9taXNhYmxlKS50aGVuKG5vb3AsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgdGhpcy5jYXB0dXJlRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBsb2FkIHN0ZXAgc3luY2hyb25vdXNseSwgcmVjb3JkaW5nIGEgc3luY2hyb25vdXMgdGhyb3csIGFuZCB3cmFwcyBhbnkgYXN5bmMgdGFpbCBzbyBpdCBuZXZlciByZWplY3RzLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFByb21pc2FibGVGbiAtIEEgZnVuY3Rpb24gdGhhdCBzdGFydHMgdGhlIGxvYWQgc3RlcCBhbmQgcmV0dXJucyBpdHMgcmVzdWx0LlxuICAgKiBAcmV0dXJucyBBIG5ldmVyLXJlamVjdGluZyB7QGxpbmsgUHJvbWlzZX0sIG9yIGBudWxsYCBpZiB0aGUgc3RlcCBpcyBmdWxseSBzeW5jaHJvbm91cy5cbiAgICovXG4gIHByaXZhdGUgY2FwdHVyZVN5bmMobG9hZFByb21pc2FibGVGbjogKCkgPT4gbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGxvYWRQcm9taXNhYmxlOiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPjtcbiAgICB0cnkge1xuICAgICAgbG9hZFByb21pc2FibGUgPSBsb2FkUHJvbWlzYWJsZUZuKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuY2FwdHVyZUVycm9yKGVycm9yKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmNhcHR1cmVTZXR0bGVkKGxvYWRQcm9taXNhYmxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZXh0cmFjdExvYWRQcm9taXNhYmxlKGNvbXBvbmVudDogQ29tcG9uZW50KTogbnVsbCB8IFByb21pc2FibGU8dm9pZD4ge1xuICAgIGlmICghdGhpcy5jaGlsZHJlblNldC5oYXMoY29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBDb21wb25lbnRFeCkge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudC5sb2FkV2l0aFByb21pc2VzKCk7XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tY29uZnVzaW5nLXZvaWQtZXhwcmVzc2lvbiwgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uIC0tIEl0IGNhbiBiZSBgUHJvbWlzZTx2b2lkPmAgaW4gcnVudGltZS4gV2FudCBleHBsaWNpdGx5IGNhc3QgdG8gc2hvdyB3ZSBrbm93IGl0IG1heSBiZSBwcm9taXNlLCBkZXNwaXRlIHRoZSBkZWNsYXJlZCB0eXBlIGB2b2lkYC5cbiAgICByZXR1cm4gY29tcG9uZW50LmxvYWQoKSBhcyBQcm9taXNhYmxlPHZvaWQ+O1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldExvYWRTdGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRFcnJvcnMgPSBbXTtcbiAgICB0aGlzLmxvYWRQcm9taXNlID0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgZGVmZXJyZWQgbG9hZCBzdGVwLCByZWNvcmRpbmcgYSBzeW5jaHJvbm91cyB0aHJvdyBvciBhbiBhc3luYyByZWplY3Rpb24gd2l0aG91dCBldmVyIHJlLXRocm93aW5nLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFByb21pc2FibGVGbiAtIEEgZnVuY3Rpb24gdGhhdCBzdGFydHMgdGhlIGxvYWQgc3RlcCBhbmQgcmV0dXJucyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5BbmRDYXB0dXJlKGxvYWRQcm9taXNhYmxlRm46ICgpID0+IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IChsb2FkUHJvbWlzYWJsZUZuKCkgPz8gdW5kZWZpbmVkKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYXB0dXJlRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TG9hZFByb21pc2UobG9hZFByb21pc2U6IFByb21pc2U8dm9pZD4pOiB2b2lkIHtcbiAgICBjb25zdCBsb2FkUHJvbWlzZVdpdGhSZXNldDogUHJvbWlzZTx2b2lkPiA9IGxvYWRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKHRoaXMubG9hZFByb21pc2UgPT09IGxvYWRQcm9taXNlV2l0aFJlc2V0KSB7XG4gICAgICAgIHRoaXMubG9hZFByb21pc2UgPSBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMubG9hZFByb21pc2UgPSBsb2FkUHJvbWlzZVdpdGhSZXNldDtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEsc0JBQTBCO0FBRTFCLG1CQUE2QjtBQUM3QixzQkFHTztBQU1BLE1BQU0sb0JBQW9CLDBCQUFnQztBQUFBLEVBQzlDLGNBQWMsb0JBQUksSUFBZTtBQUFBLEVBQzFDLGFBQXNCLENBQUM7QUFBQSxFQUN2QixjQUFvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWE1QixTQUF1QyxXQUFtQztBQUN4RixTQUFLLFVBQVUsS0FBSyxTQUFTO0FBQzdCLFNBQUssWUFBWSxJQUFJLFNBQVM7QUFFOUIsUUFBSSxLQUFLLFNBQVM7QUFDaEIsV0FBSyxvQkFBb0IsS0FBSyxzQkFBc0IsU0FBUyxDQUFDO0FBQUEsSUFDaEU7QUFFQSxXQUFPO0FBQUEsRUFDVDtB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
440
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvY29tcG9uZW50LWV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRXh0ZW5kZWQgQ29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcblxuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQge1xuICBFcnJvcldyYXBwZXIsXG4gIFNpbGVudEVycm9yXG59IGZyb20gJy4uLy4uL2Vycm9yLnRzJztcbmltcG9ydCB7XG4gIG5vb3AsXG4gIG5vb3BBc3luY1NpbmdsZXRvblByb21pc2Vcbn0gZnJvbSAnLi4vLi4vZnVuY3Rpb24udHMnO1xuXG4vKipcbiAqIEV4dGVuZGVkIENvbXBvbmVudFxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgb2JzaWRpYW4tZGV2LXV0aWxzL3JlcXVpcmUtY29tcG9uZW50LXN1ZmZpeCAtLSBFeHRlbmRlZCBiYXNlIGNsYXNzLlxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEV4IGV4dGVuZHMgQ29tcG9uZW50IGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW5TZXQgPSBuZXcgU2V0PENvbXBvbmVudD4oKTtcbiAgcHJpdmF0ZSBoYXNCZWVuTG9hZGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbG9hZEVycm9yczogRXJyb3JbXSA9IFtdO1xuICBwcml2YXRlIGxvYWRQcm9taXNlOiBudWxsIHwgUHJvbWlzZTx2b2lkPiA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBjaGlsZCBjb21wb25lbnQuXG4gICAqXG4gICAqIE1pcnJvcnMgdGhlIG5hdGl2ZSBgQ29tcG9uZW50LmFkZENoaWxkYCBjb250cmFjdDogaWYgdGhpcyBjb21wb25lbnQgaXMgYWxyZWFkeSBsb2FkZWQsIHRoZSBjaGlsZCBpcyBsb2FkZWRcbiAgICogaW1tZWRpYXRlbHksIHNvIGBjaGlsZC5fbG9hZGVkYCBpcyBzZXQgYmVmb3JlIHRoaXMgbWV0aG9kIHJldHVybnMgZXZlbiB3aGVuIHRoaXMgY29tcG9uZW50IGhhcyBhc3luYyBsb2FkIGxvZ2ljLlxuICAgKiBUaGUgY2hpbGQncyBhc3luYyB0YWlsIChpZiBhbnkpIGlzIHNlcXVlbmNlZCBpbnRvIHRoZSBsb2FkIHByb21pc2Ugc28gYSBsYXRlciB7QGxpbmsgbG9hZFdpdGhQcm9taXNlc30gY2FsbCBhd2FpdHMgaXQuXG4gICAqXG4gICAqIEFkZGluZyBhIGNoaWxkIEJFRk9SRSB0aGUgZmlyc3QgbG9hZCBpcyBsZWdpdGltYXRlOiB0aGUgY2hpbGQgaXMgcXVldWVkIGFuZCBsb2FkZWQgd2hlbiB0aGlzIGNvbXBvbmVudCBsb2Fkcy5cbiAgICogQWRkaW5nIG9uZSBBRlRFUiB0aGlzIGNvbXBvbmVudCBoYXMgYmVlbiB1bmxvYWRlZCBpcyBub3QgXHUyMDE0IHRoZSBjaGlsZCB3b3VsZCBuZXZlciBiZSBsb2FkZWQgYW5kIG5ldmVyIHVubG9hZGVkXG4gICAqIChhIGxlYWspLCBzbyBpdCBpcyByZWZ1c2VkIHdpdGggYSB7QGxpbmsgU2lsZW50RXJyb3J9LiBUaGUgdHlwaWNhbCBzb3VyY2Ugb2Ygc3VjaCBhIGNhbGwgaXMgYW4gYGFzeW5jYCBtZXRob2RcbiAgICogdGhhdCB3YXMgc3VzcGVuZGVkIG9uIGFuIGBhd2FpdGAgd2hlbiB0aGUgY29tcG9uZW50IGdvdCB1bmxvYWRlZCBhbmQgdGhlbiByZXN1bWVkIG9uIHRoZSBkZWFkIGNvbXBvbmVudDsgdGhlXG4gICAqIHtAbGluayBTaWxlbnRFcnJvcn0gdW53aW5kcyBpdCBxdWlldGx5IChzZWUge0BsaW5rIGlzVW5sb2FkZWR9KS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIGFkZC5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gYWRkLlxuICAgKiBAcmV0dXJucyBUaGUgYWRkZWQgY29tcG9uZW50LlxuICAgKiBAdGhyb3dzIEEge0BsaW5rIFNpbGVudEVycm9yfSBpZiB0aGUgY29tcG9uZW50IGhhcyBhbHJlYWR5IGJlZW4gdW5sb2FkZWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgYWRkQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgaWYgKHRoaXMuaXNVbmxvYWRlZCgpKSB7XG4gICAgICB0aHJvdyBuZXcgU2lsZW50RXJyb3IoJ0NvbXBvbmVudCBpcyBhbHJlYWR5IHVubG9hZGVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hpbGRyZW4ucHVzaChjb21wb25lbnQpO1xuICAgIHRoaXMuY2hpbGRyZW5TZXQuYWRkKGNvbXBvbmVudCk7XG5cbiAgICBpZiAodGhpcy5fbG9hZGVkKSB7XG4gICAgICB0aGlzLmFwcGVuZEVhZ2VyTG9hZFN0ZXAodGhpcy5leHRyYWN0TG9hZFByb21pc2FibGUoY29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBEZXNwaXRlIHRoZSBkZWNsYXJlZCBgdm9pZGAgcmV0dXJuIHR5cGUsIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgbG9hZGVkIG9yIGBudWxsYCBpZiB0aGUgY29tcG9uZW50IGlzIGZ1bGx5IHN5bmNocm9ub3VzLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIGxvYWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2xvYWRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgdGhpcy5oYXNCZWVuTG9hZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2V0TG9hZFN0YXRlKCk7XG5cbiAgICB0aGlzLm9ubG9hZCgpO1xuXG4gICAgY29uc3Qgb25sb2FkQXN5bmNQcm9taXNlID0gdGhpcy5vbmxvYWRBc3luYygpO1xuICAgIGlmIChvbmxvYWRBc3luY1Byb21pc2UgIT09IG5vb3BBc3luY1NpbmdsZXRvblByb21pc2UpIHtcbiAgICAgIHRoaXMuYXBwZW5kRWFnZXJMb2FkU3RlcChvbmxvYWRBc3luY1Byb21pc2UpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5fY2hpbGRyZW4uc2xpY2UoKSkge1xuICAgICAgdGhpcy5hcHBlbmRTZXF1ZW50aWFsTG9hZFN0ZXAoKCkgPT4gdGhpcy5leHRyYWN0TG9hZFByb21pc2FibGUoY2hpbGQpKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sb2FkUHJvbWlzZSkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZSwgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gV2UgbmVlZCB0byBieXBhc3MgdHlwZSBzeXN0ZW0gdG8gcmV0dXJuIGBQcm9taXNlPHZvaWQ+YC5cbiAgICAgIHJldHVybiB0aGlzLmxvYWRQcm9taXNlIGFzIHVua25vd24gYXMgdm9pZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIGNvbXBvbmVudCB3aXRoIHByb21pc2VzLlxuICAgKlxuICAgKiBVbmxpa2Uge0BsaW5rIGxvYWR9LCB0aGlzIG1ldGhvZCBuZXZlciByZWplY3RzIHdpdGggYW4gaW5kaXZpZHVhbCBlcnJvcjogZXZlcnkgZmFpbHVyZSByYWlzZWQgYnkge0BsaW5rIG9ubG9hZEFzeW5jfVxuICAgKiBvciBhIGNoaWxkJ3MgbG9hZCBpcyBjb2xsZWN0ZWQsIGFuZCBvbmNlIGV2ZXJ5dGhpbmcgc2V0dGxlcyB0aGUgcmV0dXJuZWQge0BsaW5rIFByb21pc2V9IHJlamVjdHMgd2l0aCBhIHNpbmdsZVxuICAgKiB7QGxpbmsgQWdncmVnYXRlRXJyb3J9IGhvbGRpbmcgYWxsIG9mIHRoZW0uIE5vbi1gRXJyb3JgIHRocm93YWJsZXMgYXJlIG5vcm1hbGl6ZWQgdmlhIHtAbGluayBFcnJvcldyYXBwZXIuY3JlYXRlfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgYW5kIGl0cyBjaGlsZHJlbiBmaW5pc2ggbG9hZGluZywgcmVqZWN0cyB3aXRoIGFuIHtAbGluayBBZ2dyZWdhdGVFcnJvcn0gaWYgYW55IGxvYWQgc3RlcCBmYWlsZWQsIG9yIGBudWxsYCBpZiB0aGUgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4gZG9uJ3QgdXNlIGBhc3luY2AgbG9naWMgYW5kIG5vbmUgZmFpbGVkIHN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBwdWJsaWMgbG9hZFdpdGhQcm9taXNlcygpOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5sb2FkKCk7XG5cbiAgICBjb25zdCBsb2FkUHJvbWlzZSA9IHRoaXMubG9hZFByb21pc2U7XG4gICAgaWYgKCFsb2FkUHJvbWlzZSkge1xuICAgICAgaWYgKHRoaXMubG9hZEVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgQWdncmVnYXRlRXJyb3IodGhpcy5sb2FkRXJyb3JzKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9hZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkRXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKHRoaXMubG9hZEVycm9ycyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQXN5bmNocm9ub3VzbHkgbG9hZHMgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogT3ZlcnJpZGUgdG8gYWRkIGFzeW5jIGxvYWQgbG9naWMsIHdoaWNoIGlzIGV4ZWN1dGVkIGFmdGVyIHtAbGluayBDb21wb25lbnQub25sb2FkfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21wb25lbnQgaXMgbG9hZGVkLlxuICAgKi9cbiAgcHVibGljIG9ubG9hZEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBub29wQXN5bmNTaW5nbGV0b25Qcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHtAbGluayBEaXNwb3NhYmxlfSBzbyBpdCBpcyBkaXNwb3NlZCB3aGVuIHRoaXMgY29tcG9uZW50IHVubG9hZHMsIGFuZCByZXR1cm5zIGl0IHVuY2hhbmdlZC5cbiAgICpcbiAgICogVGhlIHJlY3VycmluZyBcInRpZSBhIGRpc3Bvc2FibGUgdG8gdGhlIGNvbXBvbmVudCdzIGxpZmVjeWNsZSwgdGhlbiBrZWVwIHVzaW5nIGl0XCIgaWRpb206IHRoZSBkaXNwb3NhYmxlIGlzXG4gICAqIGRpc3Bvc2VkIG9uIHtAbGluayBDb21wb25lbnQudW5sb2FkfSAob3IgZWFybGllciwgaWYgdGhlIGNhbGxlciBkaXNwb3NlcyBpdCBkaXJlY3RseSBcdTIwMTQgZGlzcG9zZSBpcyBleHBlY3RlZCB0b1xuICAgKiBiZSBpZGVtcG90ZW50KS4gR3VhcmQgd2l0aCB7QGxpbmsgZW5zdXJlTG9hZGVkfSBhdCB0aGUgY2FsbCBzaXRlIHdoZW4gcmVnaXN0ZXJpbmcgYmVmb3JlIGxvYWQgd291bGQgYmUgdW5zYWZlLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFREaXNwb3NhYmxlIC0gVGhlIHR5cGUgb2YgdGhlIGRpc3Bvc2FibGUuXG4gICAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gVGhlIGRpc3Bvc2FibGUgdG8gcmVnaXN0ZXIuXG4gICAqIEByZXR1cm5zIFRoZSBzYW1lIGRpc3Bvc2FibGUsIGZvciBjaGFpbmluZy5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckRpc3Bvc2FibGU8VERpc3Bvc2FibGUgZXh0ZW5kcyBEaXNwb3NhYmxlPihkaXNwb3NhYmxlOiBURGlzcG9zYWJsZSk6IFREaXNwb3NhYmxlIHtcbiAgICB0aGlzLnJlZ2lzdGVyKCgpID0+IHtcbiAgICAgIGRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIGNoaWxkIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBUQ29tcG9uZW50IC0gVGhlIHR5cGUgb2YgY29tcG9uZW50IHRvIHJlbW92ZS5cbiAgICogQHBhcmFtIGNvbXBvbmVudCAtIFRoZSBjb21wb25lbnQgaW5zdGFuY2UgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyBUaGUgcmVtb3ZlZCBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgcmVtb3ZlQ2hpbGQ8VENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudD4oY29tcG9uZW50OiBUQ29tcG9uZW50KTogVENvbXBvbmVudCB7XG4gICAgc3VwZXIucmVtb3ZlQ2hpbGQoY29tcG9uZW50KTtcbiAgICB0aGlzLmNoaWxkcmVuU2V0LmRlbGV0ZShjb21wb25lbnQpO1xuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgb2YgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIHRoaXMudW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgY29tcG9uZW50IGlzIGxvYWRlZCwgdGhyb3dpbmcgaWYgaXQgaXMgbm90LlxuICAgKlxuICAgKiBVc2UgdGhpcyB0byBndWFyZCBwdWJsaWMgbWV0aG9kcyB0aGF0IHJlZ2lzdGVyIHRlYXJkb3duLWJlYXJpbmcgcmVzb3VyY2VzICh2aWEge0BsaW5rIENvbXBvbmVudC5yZWdpc3Rlcn0sXG4gICAqIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJFdmVudH0sIHtAbGluayBDb21wb25lbnQucmVnaXN0ZXJEb21FdmVudH0sIGV0Yy4pLiBSZWdpc3RlcmluZyBiZWZvcmUgbG9hZCBpcyB1bnNhZmU6XG4gICAqIHtAbGluayBDb21wb25lbnQudW5sb2FkfSBpcyBhIG5vLW9wIHdoaWxlIHRoZSBjb21wb25lbnQgaXMgbm90IGxvYWRlZCwgc28gYW55IHRlYXJkb3duIHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCB3b3VsZFxuICAgKiBuZXZlciBydW4gaWYgdGhlIGNvbXBvbmVudCBpcyB1bmxvYWRlZCB3aXRob3V0IGZpcnN0IGJlaW5nIGxvYWRlZC5cbiAgICpcbiAgICogVGhlIHR3byBub3QtbG9hZGVkIGNhc2VzIGFyZSBkZWxpYmVyYXRlbHkgZGlzdGluZ3Vpc2hlZC4gQSBjb21wb25lbnQgdGhhdCB3YXMgTkVWRVIgbG9hZGVkIGlzIGEgZ2VudWluZVxuICAgKiBwcm9ncmFtbWluZyBlcnJvciwgc28gaXQgdGhyb3dzIGEgbG91ZCB7QGxpbmsgRXJyb3J9LiBBIGNvbXBvbmVudCB0aGF0IGhhcyBBTFJFQURZIGJlZW4gdW5sb2FkZWQgaXMgbm90IFx1MjAxNFxuICAgKiBpdCBpcyB0aGUgZXhwZWN0ZWQgb3V0Y29tZSBvZiB3b3JrIHRoYXQgb3V0bGl2ZWQgaXRzIGNvbXBvbmVudCAoZS5nLiBhbiBgYXN5bmNgIG1ldGhvZCBzdXNwZW5kZWQgb24gYW5cbiAgICogYGF3YWl0YCB3aGlsZSB0aGUgY29tcG9uZW50IHdhcyB1bmxvYWRlZCwgdGhlbiByZXN1bWVkKSBcdTIwMTQgc28gaXQgdGhyb3dzIGEge0BsaW5rIFNpbGVudEVycm9yfSwgd2hpY2hcbiAgICogYGhhbmRsZVNpbGVudEVycm9yYCBzdXBwcmVzc2VzLCBsZXR0aW5nIHN1Y2ggd29yayB1bndpbmQgcXVpZXRseSBpbnN0ZWFkIG9mIHJlcG9ydGluZyBhbiBhc3luYyBlcnJvci5cbiAgICpcbiAgICogQHRocm93cyBBbiB7QGxpbmsgRXJyb3J9IGlmIHRoZSBjb21wb25lbnQgd2FzIG5ldmVyIGxvYWRlZCwgb3IgYSB7QGxpbmsgU2lsZW50RXJyb3J9IGlmIGl0IGhhcyBhbHJlYWR5IGJlZW4gdW5sb2FkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZW5zdXJlTG9hZGVkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1VubG9hZGVkKCkpIHtcbiAgICAgIHRocm93IG5ldyBTaWxlbnRFcnJvcignQ29tcG9uZW50IGlzIGFscmVhZHkgdW5sb2FkZWQnKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbXBvbmVudCBpcyBub3QgbG9hZGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcG9uZW50J3MgaW4tZmxpZ2h0IGxvYWQge0BsaW5rIFByb21pc2V9IChpdHMge0BsaW5rIG9ubG9hZEFzeW5jfSBwbHVzIGNoaWxkcmVuKSwgb3IgYG51bGxgIHdoZW5cbiAgICogbm90aGluZyBpcyBsb2FkaW5nIFx1MjAxNCBlaXRoZXIgdGhlIGNvbXBvbmVudCBsb2FkZWQgZnVsbHkgc3luY2hyb25vdXNseSBvciBpdHMgYXN5bmMgbG9hZCBoYXMgYWxyZWFkeSBzZXR0bGVkLlxuICAgKlxuICAgKiBMZXRzIGEgY2FsbGVyIHNjaGVkdWxlZCB3aGlsZSB0aGUgY29tcG9uZW50IGlzIHN0aWxsIGxvYWRpbmcgYXdhaXQgdGhlIGFzeW5jIGxvYWQgdGFpbCBiZWZvcmUgYWN0aW5nLCBpbnN0ZWFkIG9mXG4gICAqIHJhY2luZyBpdC4gVGhlIG1vdGl2YXRpbmcgY2FzZSBpcyBhIGxheW91dC1yZWFkeSBoYW5kbGVyIChzZWUgYExheW91dFJlYWR5Q29tcG9uZW50YCkgdGhhdCBmaXJlcyBiZWNhdXNlIHRoZVxuICAgKiBjb21wb25lbnQgd2FzIGxvYWRlZCBhZnRlciB0aGUgd29ya3NwYWNlIGxheW91dCB3YXMgYWxyZWFkeSByZWFkeToge0BsaW5rIENvbXBvbmVudC5vbmxvYWR9IGhhcyBydW4gKHNvIGBfbG9hZGVkYFxuICAgKiBpcyBzZXQpIGJ1dCB7QGxpbmsgb25sb2FkQXN5bmN9IG1heSBub3QgaGF2ZSBmaW5pc2hlZC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGluLWZsaWdodCBsb2FkIHByb21pc2UsIG9yIGBudWxsYCBpZiBubyBsb2FkIGlzIGluIGZsaWdodC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRJbkZsaWdodExvYWRQcm9taXNlKCk6IG51bGwgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkUHJvbWlzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIG1vc3QgcmVjZW50IGxvYWQgcmVjb3JkZWQgYW55IGZhaWx1cmUuXG4gICAqXG4gICAqIFJlZmxlY3RzIHRoZSBvdXRjb21lIG9mIHRoZSBsYXN0IHtAbGluayBsb2FkfSAvIHtAbGluayBsb2FkV2l0aFByb21pc2VzfTogYHRydWVgIHdoZW4ge0BsaW5rIG9ubG9hZEFzeW5jfSBvciBhbnlcbiAgICogY2hpbGQncyBsb2FkIHRocmV3IChzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5KS4gVW5saWtlIHtAbGluayBsb2FkV2l0aFByb21pc2VzfSwgcmVhZGluZyB0aGlzIGRvZXMgTk9UXG4gICAqIHJlLXJhaXNlIHRoZSBjb2xsZWN0ZWQgZXJyb3JzIFx1MjAxNCBpdCBsZXRzIGEgYnlzdGFuZGVyIChlLmcuIGEgbGF5b3V0LXJlYWR5IGhhbmRsZXIgYXdhaXRpbmcgdGhlIGluLWZsaWdodCBsb2FkKSB0ZWxsXG4gICAqIHdoZXRoZXIgdGhlIGxvYWQgc3VjY2VlZGVkIHdpdGhvdXQgYWRvcHRpbmcgYSBmYWlsdXJlIHRoYXQgdGhlIGxvYWQncyBvd25lciBpcyBhbHJlYWR5IHJlc3BvbnNpYmxlIGZvci5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBsYXN0IGxvYWQgcmVjb3JkZWQgYXQgbGVhc3Qgb25lIGVycm9yLCBvdGhlcndpc2UgYGZhbHNlYC5cbiAgICovXG4gIHByb3RlY3RlZCBoYXNMb2FkRXJyb3JzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRFcnJvcnMubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBoYXMgYWxyZWFkeSBiZWVuIHVubG9hZGVkLCBhcyBvcHBvc2VkIHRvIHNpbXBseSBub3QgaGF2aW5nIGJlZW4gbG9hZGVkIHlldC5cbiAgICpcbiAgICogQm90aCBzdGF0ZXMgbGVhdmUgYF9sb2FkZWRgIGZhbHNlLCBidXQgdGhleSBtZWFuIG9wcG9zaXRlIHRoaW5nczogYSBjb21wb25lbnQgdGhhdCB3YXMgbmV2ZXIgbG9hZGVkIGlzIHN0aWxsXG4gICAqIGFoZWFkIG9mIGl0cyBsaWZlY3ljbGUgKHF1ZXVlaW5nIGNoaWxkcmVuIGJlZm9yZSBsb2FkIGlzIGxlZ2l0aW1hdGUpLCB3aGlsZSBhbiB1bmxvYWRlZCBvbmUgaXMgYmVoaW5kIGl0IGFuZFxuICAgKiBtdXN0IG5vdCBiZSB1c2VkIGFueSBmdXJ0aGVyLiBUaGUgZGlzdGluY3Rpb24gaXMgdHJhY2tlZCBieSBhIGZsYWcgc2V0IGluIHtAbGluayBsb2FkfSwgTk9UIGJ5IGFuXG4gICAqIHtAbGluayBDb21wb25lbnQub251bmxvYWR9IG92ZXJyaWRlLCBiZWNhdXNlIHN1YmNsYXNzZXMgb3ZlcnJpZGUgYG9udW5sb2FkYCBhbmQgbWF5IG5vdCBjYWxsIGBzdXBlcmAuXG4gICAqXG4gICAqIFVzZSBpdCBpbiBhIGxvbmctcnVubmluZyBgYXN5bmNgIG1ldGhvZCB0byBhYmFuZG9uIHdvcmsgd2hvc2UgY29tcG9uZW50IHdhcyB1bmxvYWRlZCBtaWQtZmxpZ2h0LCB3aGVuXG4gICAqIHVud2luZGluZyB2aWEgdGhlIHtAbGluayBTaWxlbnRFcnJvcn0gdGhyb3duIGJ5IHtAbGluayBlbnN1cmVMb2FkZWR9IC8ge0BsaW5rIGFkZENoaWxkfSBpcyBub3QgZGVzaXJlZC5cbiAgICpcbiAgICogQHJldHVybnMgYHRydWVgIGlmIHRoZSBjb21wb25lbnQgd2FzIGxvYWRlZCBhdCBzb21lIHBvaW50IGFuZCBpcyBjdXJyZW50bHkgdW5sb2FkZWQsIG90aGVyd2lzZSBgZmFsc2VgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVW5sb2FkZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaGFzQmVlbkxvYWRlZCAmJiAhdGhpcy5fbG9hZGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcXVlbmNlcyBhbiBhbHJlYWR5LXN0YXJ0ZWQgbG9hZCBzdGVwIGludG8gdGhlIGxvYWQgcHJvbWlzZS5cbiAgICpcbiAgICogVGhlIHN0ZXAgaXMgcHJlc3VtZWQgdG8gaGF2ZSBzdGFydGVkIHN5bmNocm9ub3VzbHkgKHNvIGFueSBgX2xvYWRlZGAgZmxhZyBpdCBzZXRzIGlzIGFscmVhZHkgdmlzaWJsZSk7IG9ubHkgdGhlXG4gICAqIGF3YWl0aW5nIG9mIGl0cyBhc3luYyB0YWlsIGlzIHNlcXVlbmNlZCBoZXJlLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFByb21pc2FibGUgLSBUaGUgcmVzdWx0IG9mIGFuIGFscmVhZHktc3RhcnRlZCBsb2FkIHN0ZXAuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZEVhZ2VyTG9hZFN0ZXAobG9hZFByb21pc2FibGU6IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+KTogdm9pZCB7XG4gICAgY29uc3QgY2FwdHVyZWQgPSB0aGlzLmNhcHR1cmVTZXR0bGVkKGxvYWRQcm9taXNhYmxlKTtcbiAgICBpZiAoIWNhcHR1cmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldmlvdXMgPSB0aGlzLmxvYWRQcm9taXNlO1xuICAgIHRoaXMuc2V0TG9hZFByb21pc2UocHJldmlvdXMgPyBwcmV2aW91cy50aGVuKCgpID0+IGNhcHR1cmVkKSA6IGNhcHR1cmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXF1ZW5jZXMgYSBkZWZlcnJlZCBsb2FkIHN0ZXAgaW50byB0aGUgbG9hZCBwcm9taXNlLCBydW5uaW5nIGl0IG9ubHkgYWZ0ZXIgcHJldmlvdXNseS1hcHBlbmRlZCBzdGVwcyBzZXR0bGUuXG4gICAqXG4gICAqIEBwYXJhbSBsb2FkUHJvbWlzYWJsZUZuIC0gQSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB0aGUgbG9hZCBzdGVwIGFuZCByZXR1cm5zIGl0cyByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIGFwcGVuZFNlcXVlbnRpYWxMb2FkU3RlcChsb2FkUHJvbWlzYWJsZUZuOiAoKSA9PiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPik6IHZvaWQge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5sb2FkUHJvbWlzZTtcbiAgICBpZiAocHJldmlvdXMpIHtcbiAgICAgIHRoaXMuc2V0TG9hZFByb21pc2UocHJldmlvdXMudGhlbigoKSA9PiB0aGlzLnJ1bkFuZENhcHR1cmUobG9hZFByb21pc2FibGVGbikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjYXB0dXJlZCA9IHRoaXMuY2FwdHVyZVN5bmMobG9hZFByb21pc2FibGVGbik7XG4gICAgaWYgKGNhcHR1cmVkKSB7XG4gICAgICB0aGlzLnNldExvYWRQcm9taXNlKGNhcHR1cmVkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhIGxvYWQgZmFpbHVyZS5cbiAgICpcbiAgICogQSBmYWlsdXJlIHJhaXNlZCBieSBhIGNoaWxkIHtAbGluayBDb21wb25lbnRFeH0gaXMgaXRzZWxmIGFuIHtAbGluayBBZ2dyZWdhdGVFcnJvcn07IGl0IGlzIHJlY29yZGVkIGFzLWlzIHNvIHRoZVxuICAgKiBncm91cGluZyBieSBjaGlsZCBjb21wb25lbnQgaXMgcHJlc2VydmVkIChvd24gZmFpbHVyZXMgc3RheSBmbGF0LCBjaGlsZC1zdWJ0cmVlIGZhaWx1cmVzIHN0YXkgbmVzdGVkKS5cbiAgICpcbiAgICogQHBhcmFtIGVycm9yIC0gVGhlIHRocm93biB2YWx1ZSB0byByZWNvcmQuXG4gICAqL1xuICBwcml2YXRlIGNhcHR1cmVFcnJvcihlcnJvcjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMubG9hZEVycm9ycy5wdXNoKEVycm9yV3JhcHBlci5jcmVhdGUoZXJyb3IpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcyBhbiBhbHJlYWR5LXN0YXJ0ZWQgbG9hZCByZXN1bHQgc28gaXQgbmV2ZXIgcmVqZWN0czogYW55IGZhaWx1cmUgaXMgcmVjb3JkZWQgaW50byBgbG9hZEVycm9yc2AuXG4gICAqXG4gICAqIEBwYXJhbSBsb2FkUHJvbWlzYWJsZSAtIFRoZSBsb2FkIHJlc3VsdCB0byBvYnNlcnZlLlxuICAgKiBAcmV0dXJucyBBIG5ldmVyLXJlamVjdGluZyB7QGxpbmsgUHJvbWlzZX0sIG9yIGBudWxsYCBpZiB0aGUgcmVzdWx0IGlzIGZ1bGx5IHN5bmNocm9ub3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXB0dXJlU2V0dGxlZChsb2FkUHJvbWlzYWJsZTogbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiBudWxsIHwgUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGxvYWRQcm9taXNhYmxlID09PSBudWxsIHx8IGxvYWRQcm9taXNhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobG9hZFByb21pc2FibGUpLnRoZW4obm9vcCwgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICB0aGlzLmNhcHR1cmVFcnJvcihlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIGxvYWQgc3RlcCBzeW5jaHJvbm91c2x5LCByZWNvcmRpbmcgYSBzeW5jaHJvbm91cyB0aHJvdywgYW5kIHdyYXBzIGFueSBhc3luYyB0YWlsIHNvIGl0IG5ldmVyIHJlamVjdHMuXG4gICAqXG4gICAqIEBwYXJhbSBsb2FkUHJvbWlzYWJsZUZuIC0gQSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB0aGUgbG9hZCBzdGVwIGFuZCByZXR1cm5zIGl0cyByZXN1bHQuXG4gICAqIEByZXR1cm5zIEEgbmV2ZXItcmVqZWN0aW5nIHtAbGluayBQcm9taXNlfSwgb3IgYG51bGxgIGlmIHRoZSBzdGVwIGlzIGZ1bGx5IHN5bmNocm9ub3VzLlxuICAgKi9cbiAgcHJpdmF0ZSBjYXB0dXJlU3luYyhsb2FkUHJvbWlzYWJsZUZuOiAoKSA9PiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPik6IG51bGwgfCBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgbG9hZFByb21pc2FibGU6IG51bGwgfCBQcm9taXNhYmxlPHZvaWQ+O1xuICAgIHRyeSB7XG4gICAgICBsb2FkUHJvbWlzYWJsZSA9IGxvYWRQcm9taXNhYmxlRm4oKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5jYXB0dXJlRXJyb3IoZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY2FwdHVyZVNldHRsZWQobG9hZFByb21pc2FibGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0TG9hZFByb21pc2FibGUoY29tcG9uZW50OiBDb21wb25lbnQpOiBudWxsIHwgUHJvbWlzYWJsZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNoaWxkcmVuU2V0Lmhhcyhjb21wb25lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIENvbXBvbmVudEV4KSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50LmxvYWRXaXRoUHJvbWlzZXMoKTtcbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1jb25mdXNpbmctdm9pZC1leHByZXNzaW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb24gLS0gSXQgY2FuIGJlIGBQcm9taXNlPHZvaWQ+YCBpbiBydW50aW1lLiBXYW50IGV4cGxpY2l0bHkgY2FzdCB0byBzaG93IHdlIGtub3cgaXQgbWF5IGJlIHByb21pc2UsIGRlc3BpdGUgdGhlIGRlY2xhcmVkIHR5cGUgYHZvaWRgLlxuICAgIHJldHVybiBjb21wb25lbnQubG9hZCgpIGFzIFByb21pc2FibGU8dm9pZD47XG4gIH1cblxuICBwcml2YXRlIHJlc2V0TG9hZFN0YXRlKCk6IHZvaWQge1xuICAgIHRoaXMubG9hZEVycm9ycyA9IFtdO1xuICAgIHRoaXMubG9hZFByb21pc2UgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBkZWZlcnJlZCBsb2FkIHN0ZXAsIHJlY29yZGluZyBhIHN5bmNocm9ub3VzIHRocm93IG9yIGFuIGFzeW5jIHJlamVjdGlvbiB3aXRob3V0IGV2ZXIgcmUtdGhyb3dpbmcuXG4gICAqXG4gICAqIEBwYXJhbSBsb2FkUHJvbWlzYWJsZUZuIC0gQSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB0aGUgbG9hZCBzdGVwIGFuZCByZXR1cm5zIGl0cyByZXN1bHQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkFuZENhcHR1cmUobG9hZFByb21pc2FibGVGbjogKCkgPT4gbnVsbCB8IFByb21pc2FibGU8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgKGxvYWRQcm9taXNhYmxlRm4oKSA/PyB1bmRlZmluZWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNhcHR1cmVFcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMb2FkUHJvbWlzZShsb2FkUHJvbWlzZTogUHJvbWlzZTx2b2lkPik6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRQcm9taXNlV2l0aFJlc2V0OiBQcm9taXNlPHZvaWQ+ID0gbG9hZFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5sb2FkUHJvbWlzZSA9PT0gbG9hZFByb21pc2VXaXRoUmVzZXQpIHtcbiAgICAgICAgdGhpcy5sb2FkUHJvbWlzZSA9IG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5sb2FkUHJvbWlzZSA9IGxvYWRQcm9taXNlV2l0aFJlc2V0O1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFRQSxzQkFBMEI7QUFFMUIsbUJBR087QUFDUCxzQkFHTztBQU1BLE1BQU0sb0JBQW9CLDBCQUFnQztBQUFBLEVBQzlDLGNBQWMsb0JBQUksSUFBZTtBQUFBLEVBQzFDLGdCQUFnQjtBQUFBLEVBQ2hCLGFBQXNCLENBQUM7QUFBQSxFQUN2QixjQUFvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBb0I1QixTQUF1QyxXQUFtQztBQUN4RixRQUFJLEtBQUssV0FBVyxHQUFHO0FBQ3JCLFlBQU0sSUFBSSx5QkFBWSwrQkFBK0I7QUFBQSxJQUN2RDtBQUVBLFNBQUssVUFBVSxLQUFLLFNBQVM7QUFDN0IsU0FBSyxZQUFZLElBQUksU0FBUztBQUU5QixRQUFJLEtBQUssU0FBUztBQUNoQixXQUFLLG9CQUFvQixLQUFLLHNCQUFzQixTQUFTLENBQUM7QUFBQSxJQUNoRTtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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
@@ -10,6 +10,7 @@ import { Component } from 'obsidian';
10
10
  */
11
11
  export declare class ComponentEx extends Component implements Disposable {
12
12
  private readonly childrenSet;
13
+ private hasBeenLoaded;
13
14
  private loadErrors;
14
15
  private loadPromise;
15
16
  /**
@@ -19,9 +20,16 @@ export declare class ComponentEx extends Component implements Disposable {
19
20
  * immediately, so `child._loaded` is set before this method returns even when this component has async load logic.
20
21
  * The child's async tail (if any) is sequenced into the load promise so a later {@link loadWithPromises} call awaits it.
21
22
  *
23
+ * Adding a child BEFORE the first load is legitimate: the child is queued and loaded when this component loads.
24
+ * Adding one AFTER this component has been unloaded is not — the child would never be loaded and never unloaded
25
+ * (a leak), so it is refused with a {@link SilentError}. The typical source of such a call is an `async` method
26
+ * that was suspended on an `await` when the component got unloaded and then resumed on the dead component; the
27
+ * {@link SilentError} unwinds it quietly (see {@link isUnloaded}).
28
+ *
22
29
  * @typeParam TComponent - The type of component to add.
23
30
  * @param component - The component instance to add.
24
31
  * @returns The added component.
32
+ * @throws A {@link SilentError} if the component has already been unloaded.
25
33
  */
26
34
  addChild<TComponent extends Component>(component: TComponent): TComponent;
27
35
  /**
@@ -80,7 +88,13 @@ export declare class ComponentEx extends Component implements Disposable {
80
88
  * {@link Component.unload} is a no-op while the component is not loaded, so any teardown registered beforehand would
81
89
  * never run if the component is unloaded without first being loaded.
82
90
  *
83
- * @throws An {@link Error} if the component is not loaded.
91
+ * The two not-loaded cases are deliberately distinguished. A component that was NEVER loaded is a genuine
92
+ * programming error, so it throws a loud {@link Error}. A component that has ALREADY been unloaded is not —
93
+ * it is the expected outcome of work that outlived its component (e.g. an `async` method suspended on an
94
+ * `await` while the component was unloaded, then resumed) — so it throws a {@link SilentError}, which
95
+ * `handleSilentError` suppresses, letting such work unwind quietly instead of reporting an async error.
96
+ *
97
+ * @throws An {@link Error} if the component was never loaded, or a {@link SilentError} if it has already been unloaded.
84
98
  */
85
99
  protected ensureLoaded(): void;
86
100
  /**
@@ -106,6 +120,20 @@ export declare class ComponentEx extends Component implements Disposable {
106
120
  * @returns `true` if the last load recorded at least one error, otherwise `false`.
107
121
  */
108
122
  protected hasLoadErrors(): boolean;
123
+ /**
124
+ * Returns whether the component has already been unloaded, as opposed to simply not having been loaded yet.
125
+ *
126
+ * Both states leave `_loaded` false, but they mean opposite things: a component that was never loaded is still
127
+ * ahead of its lifecycle (queueing children before load is legitimate), while an unloaded one is behind it and
128
+ * must not be used any further. The distinction is tracked by a flag set in {@link load}, NOT by an
129
+ * {@link Component.onunload} override, because subclasses override `onunload` and may not call `super`.
130
+ *
131
+ * Use it in a long-running `async` method to abandon work whose component was unloaded mid-flight, when
132
+ * unwinding via the {@link SilentError} thrown by {@link ensureLoaded} / {@link addChild} is not desired.
133
+ *
134
+ * @returns `true` if the component was loaded at some point and is currently unloaded, otherwise `false`.
135
+ */
136
+ protected isUnloaded(): boolean;
109
137
  /**
110
138
  * Sequences an already-started load step into the load promise.
111
139
  *