obsidian-dev-utils 22.1.0 → 22.1.1-beta.10

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 (93) hide show
  1. package/CHANGELOG.md +59 -0
  2. package/dist/dprint.json +1 -0
  3. package/dist/lib/cjs/Async.cjs +2 -2
  4. package/dist/lib/cjs/Library.cjs +1 -1
  5. package/dist/lib/cjs/Object.cjs +1 -1
  6. package/dist/lib/cjs/Object.d.cts +12 -0
  7. package/dist/lib/cjs/ScriptUtils/CliUtils.cjs +1 -2
  8. package/dist/lib/cjs/ScriptUtils/CliUtils.d.cts +3 -2
  9. package/dist/lib/cjs/ScriptUtils/cli.cjs +1 -1
  10. package/dist/lib/cjs/String.cjs +1 -1
  11. package/dist/lib/cjs/String.d.cts +2 -1
  12. package/dist/lib/cjs/codemirror/StateFieldSpec.cjs +1 -1
  13. package/dist/lib/cjs/codemirror/StateFieldSpec.d.cts +4 -4
  14. package/dist/lib/cjs/obsidian/Callout.cjs +1 -1
  15. package/dist/lib/cjs/obsidian/Callout.d.cts +2 -1
  16. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.cjs +1 -1
  17. package/dist/lib/cjs/obsidian/Components/MultipleTextComponent.d.cts +2 -1
  18. package/dist/lib/cjs/obsidian/Components/PlaceholderComponent.cjs +38 -0
  19. package/dist/lib/cjs/obsidian/Components/PlaceholderComponent.d.cts +19 -0
  20. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.cjs +1 -1
  21. package/dist/lib/cjs/obsidian/Components/TypedTextComponent.d.cts +2 -1
  22. package/dist/lib/cjs/obsidian/Components/index.cjs +4 -1
  23. package/dist/lib/cjs/obsidian/Components/index.d.cts +1 -0
  24. package/dist/lib/cjs/obsidian/FileManager.cjs +1 -1
  25. package/dist/lib/cjs/obsidian/FileManager.d.cts +2 -1
  26. package/dist/lib/cjs/obsidian/Link.cjs +1 -1
  27. package/dist/lib/cjs/obsidian/Link.d.cts +4 -3
  28. package/dist/lib/cjs/obsidian/Modals/Prompt.cjs +1 -1
  29. package/dist/lib/cjs/obsidian/Modals/Prompt.d.cts +2 -1
  30. package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +15 -31
  31. package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +15 -27
  32. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs +279 -0
  33. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts +60 -0
  34. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.cjs +50 -53
  35. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsTabBase.d.cts +14 -35
  36. package/dist/lib/cjs/obsidian/Plugin/index.cjs +4 -7
  37. package/dist/lib/cjs/obsidian/Plugin/index.d.cts +1 -2
  38. package/dist/lib/cjs/obsidian/{Plugin/EmptySettings.cjs → ValidationMessage.cjs} +8 -8
  39. package/dist/lib/cjs/obsidian/ValidationMessage.d.cts +16 -0
  40. package/dist/lib/cjs/obsidian/Vault.cjs +2 -2
  41. package/dist/lib/cjs/obsidian/index.cjs +4 -1
  42. package/dist/lib/cjs/obsidian/index.d.cts +1 -0
  43. package/dist/lib/esm/Async.mjs +2 -2
  44. package/dist/lib/esm/Library.mjs +1 -1
  45. package/dist/lib/esm/Object.d.mts +12 -0
  46. package/dist/lib/esm/Object.mjs +1 -1
  47. package/dist/lib/esm/ScriptUtils/CliUtils.d.mts +3 -2
  48. package/dist/lib/esm/ScriptUtils/CliUtils.mjs +1 -2
  49. package/dist/lib/esm/ScriptUtils/cli.mjs +1 -1
  50. package/dist/lib/esm/String.d.mts +2 -1
  51. package/dist/lib/esm/String.mjs +1 -1
  52. package/dist/lib/esm/codemirror/StateFieldSpec.d.mts +4 -4
  53. package/dist/lib/esm/obsidian/Callout.d.mts +2 -1
  54. package/dist/lib/esm/obsidian/Callout.mjs +1 -1
  55. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.d.mts +2 -1
  56. package/dist/lib/esm/obsidian/Components/MultipleTextComponent.mjs +1 -1
  57. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.d.mts +19 -0
  58. package/dist/lib/esm/obsidian/Components/PlaceholderComponent.mjs +14 -0
  59. package/dist/lib/esm/obsidian/Components/TypedTextComponent.d.mts +2 -1
  60. package/dist/lib/esm/obsidian/Components/TypedTextComponent.mjs +1 -1
  61. package/dist/lib/esm/obsidian/Components/index.d.mts +1 -0
  62. package/dist/lib/esm/obsidian/Components/index.mjs +3 -1
  63. package/dist/lib/esm/obsidian/FileManager.d.mts +2 -1
  64. package/dist/lib/esm/obsidian/FileManager.mjs +1 -1
  65. package/dist/lib/esm/obsidian/Link.d.mts +4 -3
  66. package/dist/lib/esm/obsidian/Link.mjs +1 -1
  67. package/dist/lib/esm/obsidian/Modals/Prompt.d.mts +2 -1
  68. package/dist/lib/esm/obsidian/Modals/Prompt.mjs +1 -1
  69. package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +15 -27
  70. package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +19 -32
  71. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.d.mts +60 -0
  72. package/dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs +254 -0
  73. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.d.mts +14 -35
  74. package/dist/lib/esm/obsidian/Plugin/PluginSettingsTabBase.mjs +51 -57
  75. package/dist/lib/esm/obsidian/Plugin/index.d.mts +1 -2
  76. package/dist/lib/esm/obsidian/Plugin/index.mjs +3 -5
  77. package/dist/lib/esm/obsidian/ValidationMessage.d.mts +16 -0
  78. package/dist/lib/esm/obsidian/ValidationMessage.mjs +14 -0
  79. package/dist/lib/esm/obsidian/Vault.mjs +2 -2
  80. package/dist/lib/esm/obsidian/index.d.mts +1 -0
  81. package/dist/lib/esm/obsidian/index.mjs +3 -1
  82. package/obsidian/Components/PlaceholderComponent/package.json +6 -0
  83. package/obsidian/Plugin/{PluginSettingsBase → PluginSettingsManagerBase}/package.json +3 -3
  84. package/obsidian/ValidationMessage/package.json +6 -0
  85. package/package.json +7 -7
  86. package/dist/lib/cjs/obsidian/Plugin/EmptySettings.d.cts +0 -14
  87. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsBase.cjs +0 -92
  88. package/dist/lib/cjs/obsidian/Plugin/PluginSettingsBase.d.cts +0 -31
  89. package/dist/lib/esm/obsidian/Plugin/EmptySettings.d.mts +0 -14
  90. package/dist/lib/esm/obsidian/Plugin/EmptySettings.mjs +0 -14
  91. package/dist/lib/esm/obsidian/Plugin/PluginSettingsBase.d.mts +0 -31
  92. package/dist/lib/esm/obsidian/Plugin/PluginSettingsBase.mjs +0 -68
  93. package/obsidian/Plugin/EmptySettings/package.json +0 -6
@@ -6,13 +6,12 @@ if you want to view the source, please visit the github repository of this plugi
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
8
  import { PluginSettingTab } from "obsidian";
9
- import {
10
- convertAsyncToSync,
11
- invokeAsyncSafely
12
- } from "../../Async.mjs";
9
+ import { invokeAsyncSafely } from "../../Async.mjs";
13
10
  import { CssClass } from "../../CssClass.mjs";
14
11
  import { noop } from "../../Function.mjs";
12
+ import { isPlaceholderComponent } from "../Components/PlaceholderComponent.mjs";
15
13
  import { getValidatorComponent } from "../Components/ValidatorComponent.mjs";
14
+ import { isValidationMessageHolder } from "../ValidationMessage.mjs";
16
15
  import { getPluginId } from "./PluginId.mjs";
17
16
  class PluginSettingsTabBase extends PluginSettingTab {
18
17
  constructor(plugin) {
@@ -20,81 +19,76 @@ class PluginSettingsTabBase extends PluginSettingTab {
20
19
  this.plugin = plugin;
21
20
  this.containerEl.addClass(CssClass.LibraryName, getPluginId(), CssClass.PluginSettingsTab);
22
21
  }
23
- validatorsMap = /* @__PURE__ */ new WeakMap();
24
22
  /**
25
23
  * Binds a value component to a plugin setting.
26
24
  *
27
25
  * @typeParam UIValue - The type of the value of the UI component.
28
26
  * @typeParam TValueComponent - The type of the value component.
29
- * @typeParam Property - The property of the plugin settings to bind to.
27
+ * @typeParam PropertyName - The property name of the plugin settings to bind to.
30
28
  * @param valueComponent - The value component to bind.
31
- * @param property - The property of the plugin settings to bind to.
29
+ * @param propertyName - The property name of the plugin settings to bind to.
32
30
  * @param options - The options for binding the value component.
33
31
  * @returns The value component.
34
32
  */
35
- bind(valueComponent, property, options) {
33
+ bind(valueComponent, propertyName, options) {
36
34
  const DEFAULT_OPTIONS = {
37
35
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
38
- componentToPluginSettingsValueConverter: (value) => value,
36
+ componentToPluginSettingsValueConverter: (value2) => value2,
39
37
  onChanged: noop,
40
- pluginSettings: void 0,
41
- pluginSettingsToComponentValueConverter: (value) => value,
42
- shouldAutoSave: true,
43
- shouldShowValidationMessage: true,
44
- valueValidator: noop
38
+ pluginSettingsToComponentValueConverter: (value2) => value2,
39
+ shouldShowValidationMessage: true
45
40
  };
46
41
  const optionsExt = { ...DEFAULT_OPTIONS, ...options };
47
- const pluginSettingsFn = () => optionsExt.pluginSettings ?? this.plugin.settingsClone;
48
42
  const validatorElement = getValidatorComponent(valueComponent)?.validatorEl;
49
- const validate = async (uiValue) => {
50
- uiValue ??= valueComponent.getValue();
51
- let errorMessage = await optionsExt.valueValidator(uiValue);
52
- if (validatorElement) {
53
- if (!errorMessage) {
54
- validatorElement.setCustomValidity("");
55
- validatorElement.checkValidity();
56
- errorMessage = validatorElement.validationMessage;
57
- }
58
- validatorElement.setCustomValidity(errorMessage);
59
- validatorElement.title = errorMessage;
60
- if (validatorElement.isActiveElement() && optionsExt.shouldShowValidationMessage) {
61
- validatorElement.reportValidity();
62
- }
43
+ const property = this.plugin.settingsManager.getProperty(propertyName);
44
+ let value = property.getModifiedValue();
45
+ if (value === void 0 && !isPlaceholderComponent(valueComponent)) {
46
+ value = property.defaultValue;
47
+ property.setValue(value);
48
+ }
49
+ if (value !== void 0) {
50
+ valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(value));
51
+ }
52
+ valueComponent.onChange(async (uiValue) => {
53
+ const oldValue = property.getModifiedOrDefaultValue();
54
+ const convertedValue = optionsExt.componentToPluginSettingsValueConverter(uiValue);
55
+ if (isValidationMessageHolder(convertedValue)) {
56
+ property.setValidationMessage(convertedValue.validationMessage);
57
+ } else {
58
+ await property.setValueAndValidate(convertedValue);
63
59
  }
64
- return !errorMessage;
65
- };
66
- valueComponent.setValue(optionsExt.pluginSettingsToComponentValueConverter(pluginSettingsFn()[property])).onChange(async (uiValue) => {
67
- if (!await validate(uiValue)) {
60
+ const newValue = isValidationMessageHolder(convertedValue) ? void 0 : convertedValue;
61
+ await optionsExt.onChanged(newValue, oldValue);
62
+ });
63
+ if (isPlaceholderComponent(valueComponent)) {
64
+ valueComponent.setPlaceholder(optionsExt.pluginSettingsToComponentValueConverter(property.defaultValue));
65
+ }
66
+ validatorElement?.addEventListener("focus", validate);
67
+ validatorElement?.addEventListener("blur", validate);
68
+ validate();
69
+ return valueComponent;
70
+ function validate() {
71
+ if (!validatorElement) {
68
72
  return;
69
73
  }
70
- const pluginSettings = pluginSettingsFn();
71
- pluginSettings[property] = optionsExt.componentToPluginSettingsValueConverter(uiValue);
72
- if (optionsExt.shouldAutoSave) {
73
- await this.plugin.saveSettings(pluginSettings);
74
+ if (!property.validationMessage) {
75
+ validatorElement.setCustomValidity("");
76
+ validatorElement.checkValidity();
77
+ property.setValidationMessage(validatorElement.validationMessage);
78
+ }
79
+ validatorElement.setCustomValidity(property.validationMessage);
80
+ validatorElement.title = property.validationMessage;
81
+ if (validatorElement.isActiveElement() && optionsExt.shouldShowValidationMessage) {
82
+ validatorElement.reportValidity();
74
83
  }
75
- await optionsExt.onChanged();
76
- });
77
- validatorElement?.addEventListener("focus", convertAsyncToSync(() => validate()));
78
- validatorElement?.addEventListener("blur", convertAsyncToSync(() => validate()));
79
- this.validatorsMap.set(valueComponent, () => validate());
80
- invokeAsyncSafely(() => validate());
81
- return valueComponent;
82
- }
83
- /**
84
- * Revalidates the value component.
85
- *
86
- * @param baseComponent - The base component to revalidate.
87
- * @returns A promise that resolves to a boolean indicating whether the value component is valid.
88
- */
89
- async revalidate(baseComponent) {
90
- const validator = this.validatorsMap.get(baseComponent);
91
- if (validator) {
92
- return await validator();
93
84
  }
94
- return true;
85
+ }
86
+ hide() {
87
+ super.hide();
88
+ invokeAsyncSafely(() => this.plugin.settingsManager.saveToFile());
95
89
  }
96
90
  }
97
91
  export {
98
92
  PluginSettingsTabBase
99
93
  };
100
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFBsdWdpblNldHRpbmdzVGFiQmFzZVxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCB9IGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHtcbiAgQ29uZGl0aW9uYWxLZXlzLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmcgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luQmFzZSB9IGZyb20gJy4vUGx1Z2luQmFzZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpblNldHRpbmdzQmFzZSB9IGZyb20gJy4vUGx1Z2luU2V0dGluZ3NCYXNlLnRzJztcblxuaW1wb3J0IHtcbiAgY29udmVydEFzeW5jVG9TeW5jLFxuICBpbnZva2VBc3luY1NhZmVseVxufSBmcm9tICcuLi8uLi9Bc3luYy50cyc7XG5pbXBvcnQgeyBDc3NDbGFzcyB9IGZyb20gJy4uLy4uL0Nzc0NsYXNzLnRzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi8uLi9GdW5jdGlvbi50cyc7XG5pbXBvcnQgeyBnZXRWYWxpZGF0b3JDb21wb25lbnQgfSBmcm9tICcuLi9Db21wb25lbnRzL1ZhbGlkYXRvckNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBnZXRQbHVnaW5JZCB9IGZyb20gJy4vUGx1Z2luSWQudHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGJpbmRpbmcgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uczxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZT4ge1xuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGNoYW5nZXMuXG4gICAqL1xuICBvbkNoYW5nZWQ/OiAoKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGx1Z2luIHNldHRpbmdzIG9iamVjdCB0byBiaW5kIHRoZSBjb21wb25lbnQgdG8uIERlZmF1bHQgaXMgdGhlIHBsdWdpbidzIGN1cnJlbnQgc2V0dGluZ3MuXG4gICAqL1xuICBwbHVnaW5TZXR0aW5ncz86IFBsdWdpblNldHRpbmdzO1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzYXZlcyB0aGUgcGx1Z2luIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlIGNvbXBvbmVudCB2YWx1ZSBjaGFuZ2VzLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZEF1dG9TYXZlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdHJ1ZSwgc2hvd3MgdGhlIHZhbGlkYXRpb24gbWVzc2FnZSB3aGVuIHRoZSBjb21wb25lbnQgdmFsdWUgaXMgaW52YWxpZC4gRGVmYXVsdCBpcyBgdHJ1ZWAuXG4gICAqL1xuICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgdGhlIFVJIHZhbHVlIGJlZm9yZSBzZXR0aW5nIGl0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIEFuIGVycm9yIG1lc3NhZ2UgaWYgdGhlIHZhbHVlIGlzIGludmFsaWQsIG9yIGAoZW1wdHkgc3RyaW5nKWAgb3IgYHZvaWRgIGlmIGl0IGlzIHZhbGlkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1pbnZhbGlkLXZvaWQtdHlwZVxuICB2YWx1ZVZhbGlkYXRvcj86ICh1aVZhbHVlOiBVSVZhbHVlKSA9PiBQcm9taXNhYmxlPHN0cmluZyB8IHZvaWQ+O1xufVxuXG4vKipcbiAqIEV4dGVuZGVkIG9wdGlvbnMgZm9yIGJpbmRpbmcgYSB2YWx1ZSBjb21wb25lbnQgdG8gYSBwbHVnaW4gc2V0dGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIFBsdWdpblNldHRpbmdzPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlPiB7XG4gIC8qKlxuICAgKiBDb252ZXJ0cyB0aGUgVUkgY29tcG9uZW50J3MgdmFsdWUgYmFjayB0byB0aGUgcGx1Z2luIHNldHRpbmdzIHZhbHVlLlxuICAgKiBAcGFyYW0gdWlWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgdG8gc2V0IG9uIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqL1xuICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXI6ICh1aVZhbHVlOiBVSVZhbHVlKSA9PiBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV07XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUgdG8gdGhlIHZhbHVlIHVzZWQgYnkgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHBhcmFtIHBsdWdpblNldHRpbmdzVmFsdWUgLSBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBwbHVnaW4gc2V0dGluZ3MuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIFVJIGNvbXBvbmVudC5cbiAgICovXG4gIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHBsdWdpblNldHRpbmdzVmFsdWU6IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5XSkgPT4gVUlWYWx1ZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgRXh0cmFjdFBsdWdpblNldHRpbmdzPFQgZXh0ZW5kcyBQbHVnaW5CYXNlPGFueT4+ID0gUGx1Z2luU2V0dGluZ3NCYXNlICYgVFsnc2V0dGluZ3NDbG9uZSddO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5ncyB0YWJzIGluIE9ic2lkaWFuLlxuICogUHJvdmlkZXMgYSBtZXRob2QgZm9yIGJpbmRpbmcgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsaW5nIGNoYW5nZXMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IGV4dGVuZHMgUGx1Z2luQmFzZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbHVnaW5TZXR0aW5nc1RhYkJhc2U8VFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8YW55Pj4gZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcbiAgcHJpdmF0ZSB2YWxpZGF0b3JzTWFwID0gbmV3IFdlYWtNYXA8QmFzZUNvbXBvbmVudCwgKCkgPT4gUHJvbWlzZTxib29sZWFuPj4oKTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gICAgdGhpcy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgZ2V0UGx1Z2luSWQoKSwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICogQHBhcmFtIHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgYmluZGluZyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAcmV0dXJucyBUaGUgdmFsdWUgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGJpbmQ8XG4gICAgVUlWYWx1ZSxcbiAgICBUVmFsdWVDb21wb25lbnRcbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHk6IENvbmRpdGlvbmFsS2V5czxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8VFBsdWdpbj4sIFVJVmFsdWU+LFxuICAgIG9wdGlvbnM/OiBCaW5kT3B0aW9uczxFeHRyYWN0UGx1Z2luU2V0dGluZ3M8VFBsdWdpbj4sIFVJVmFsdWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRXh0cmFjdFBsdWdpblNldHRpbmdzPFRQbHVnaW4+XG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zOiBCaW5kT3B0aW9uc0V4dGVuZGVkPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPiwgVUlWYWx1ZSwgUHJvcGVydHk+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5IGV4dGVuZHMga2V5b2YgRXh0cmFjdFBsdWdpblNldHRpbmdzPFRQbHVnaW4+XG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+LFxuICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICBvcHRpb25zPzogQmluZE9wdGlvbnM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFRQbHVnaW4+LCBVSVZhbHVlPlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIHR5cGUgUGx1Z2luU2V0dGluZ3MgPSBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8VFBsdWdpbj47XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eV07XG4gICAgY29uc3QgREVGQVVMVF9PUFRJT05TOiBSZXF1aXJlZDxCaW5kT3B0aW9uc0V4dGVuZGVkPFBsdWdpblNldHRpbmdzLCBVSVZhbHVlLCBQcm9wZXJ0eT4+ID0ge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtcmV0dXJuXG4gICAgICBjb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXI6ICh2YWx1ZTogVUlWYWx1ZSk6IFByb3BlcnR5VHlwZSA9PiB2YWx1ZSBhcyBQcm9wZXJ0eVR5cGUsXG4gICAgICBvbkNoYW5nZWQ6IG5vb3AsXG4gICAgICBwbHVnaW5TZXR0aW5nczogdW5kZWZpbmVkIGFzIFBsdWdpblNldHRpbmdzLFxuICAgICAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAodmFsdWU6IFByb3BlcnR5VHlwZSk6IFVJVmFsdWUgPT4gdmFsdWUgYXMgVUlWYWx1ZSxcbiAgICAgIHNob3VsZEF1dG9TYXZlOiB0cnVlLFxuICAgICAgc2hvdWxkU2hvd1ZhbGlkYXRpb25NZXNzYWdlOiB0cnVlLFxuICAgICAgdmFsdWVWYWxpZGF0b3I6IG5vb3BcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHk+PiA9IHsgLi4uREVGQVVMVF9PUFRJT05TLCAuLi5vcHRpb25zIH07XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICBjb25zdCBwbHVnaW5TZXR0aW5nc0ZuID0gKCk6IFBsdWdpblNldHRpbmdzID0+IG9wdGlvbnNFeHQucGx1Z2luU2V0dGluZ3MgPz8gdGhpcy5wbHVnaW4uc2V0dGluZ3NDbG9uZTtcbiAgICBjb25zdCB2YWxpZGF0b3JFbGVtZW50ID0gZ2V0VmFsaWRhdG9yQ29tcG9uZW50KHZhbHVlQ29tcG9uZW50KT8udmFsaWRhdG9yRWw7XG5cbiAgICBjb25zdCB2YWxpZGF0ZSA9IGFzeW5jICh1aVZhbHVlPzogVUlWYWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgdWlWYWx1ZSA/Pz0gdmFsdWVDb21wb25lbnQuZ2V0VmFsdWUoKTtcbiAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSBhd2FpdCBvcHRpb25zRXh0LnZhbHVlVmFsaWRhdG9yKHVpVmFsdWUpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh2YWxpZGF0b3JFbGVtZW50KSB7XG4gICAgICAgIGlmICghZXJyb3JNZXNzYWdlKSB7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5zZXRDdXN0b21WYWxpZGl0eSgnJyk7XG4gICAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlID0gdmFsaWRhdG9yRWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgdmFsaWRhdG9yRWxlbWVudC50aXRsZSA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgaWYgKHZhbGlkYXRvckVsZW1lbnQuaXNBY3RpdmVFbGVtZW50KCkgJiYgb3B0aW9uc0V4dC5zaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgICB2YWxpZGF0b3JFbGVtZW50LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuICFlcnJvck1lc3NhZ2U7XG4gICAgfTtcblxuICAgIHZhbHVlQ29tcG9uZW50XG4gICAgICAuc2V0VmFsdWUob3B0aW9uc0V4dC5wbHVnaW5TZXR0aW5nc1RvQ29tcG9uZW50VmFsdWVDb252ZXJ0ZXIocGx1Z2luU2V0dGluZ3NGbigpW3Byb3BlcnR5XSkpXG4gICAgICAub25DaGFuZ2UoYXN5bmMgKHVpVmFsdWUpID0+IHtcbiAgICAgICAgaWYgKCFhd2FpdCB2YWxpZGF0ZSh1aVZhbHVlKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbHVnaW5TZXR0aW5ncyA9IHBsdWdpblNldHRpbmdzRm4oKTtcbiAgICAgICAgcGx1Z2luU2V0dGluZ3NbcHJvcGVydHldID0gb3B0aW9uc0V4dC5jb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZSk7XG4gICAgICAgIGlmIChvcHRpb25zRXh0LnNob3VsZEF1dG9TYXZlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKHBsdWdpblNldHRpbmdzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG9wdGlvbnNFeHQub25DaGFuZ2VkKCk7XG4gICAgICB9KTtcblxuICAgIHZhbGlkYXRvckVsZW1lbnQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgY29udmVydEFzeW5jVG9TeW5jKCgpID0+IHZhbGlkYXRlKCkpKTtcbiAgICB2YWxpZGF0b3JFbGVtZW50Py5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgY29udmVydEFzeW5jVG9TeW5jKCgpID0+IHZhbGlkYXRlKCkpKTtcbiAgICB0aGlzLnZhbGlkYXRvcnNNYXAuc2V0KHZhbHVlQ29tcG9uZW50LCAoKSA9PiB2YWxpZGF0ZSgpKTtcblxuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IHZhbGlkYXRlKCkpO1xuICAgIHJldHVybiB2YWx1ZUNvbXBvbmVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZhbGlkYXRlcyB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gYmFzZUNvbXBvbmVudCAtIFRoZSBiYXNlIGNvbXBvbmVudCB0byByZXZhbGlkYXRlLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2YWx1ZSBjb21wb25lbnQgaXMgdmFsaWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgcmV2YWxpZGF0ZShiYXNlQ29tcG9uZW50OiBCYXNlQ29tcG9uZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdmFsaWRhdG9yID0gdGhpcy52YWxpZGF0b3JzTWFwLmdldChiYXNlQ29tcG9uZW50KTtcbiAgICBpZiAodmFsaWRhdG9yKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdmFsaWRhdG9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFZQSxTQUFTLHdCQUF3QjtBQU1qQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsWUFBWTtBQUNyQixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLG1CQUFtQjtBQWdFckIsTUFBZSw4QkFBK0QsaUJBQWlCO0FBQUEsRUFHN0YsWUFBNEIsUUFBaUI7QUFDbEQsVUFBTSxPQUFPLEtBQUssTUFBTTtBQURTO0FBRWpDLFNBQUssWUFBWSxTQUFTLFNBQVMsYUFBYSxZQUFZLEdBQUcsU0FBUyxpQkFBaUI7QUFBQSxFQUMzRjtBQUFBLEVBTFEsZ0JBQWdCLG9CQUFJLFFBQStDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBd0RwRSxLQUtMLGdCQUNBLFVBQ0EsU0FDaUI7QUFHakIsVUFBTSxrQkFBb0Y7QUFBQTtBQUFBLE1BRXhGLHlDQUF5QyxDQUFDLFVBQWlDO0FBQUEsTUFDM0UsV0FBVztBQUFBLE1BQ1gsZ0JBQWdCO0FBQUEsTUFDaEIseUNBQXlDLENBQUMsVUFBaUM7QUFBQSxNQUMzRSxnQkFBZ0I7QUFBQSxNQUNoQiw2QkFBNkI7QUFBQSxNQUM3QixnQkFBZ0I7QUFBQSxJQUNsQjtBQUVBLFVBQU0sYUFBK0UsRUFBRSxHQUFHLGlCQUFpQixHQUFHLFFBQVE7QUFHdEgsVUFBTSxtQkFBbUIsTUFBc0IsV0FBVyxrQkFBa0IsS0FBSyxPQUFPO0FBQ3hGLFVBQU0sbUJBQW1CLHNCQUFzQixjQUFjLEdBQUc7QUFFaEUsVUFBTSxXQUFXLE9BQU8sWUFBd0M7QUFDOUQsa0JBQVksZUFBZSxTQUFTO0FBQ3BDLFVBQUksZUFBZSxNQUFNLFdBQVcsZUFBZSxPQUFPO0FBQzFELFVBQUksa0JBQWtCO0FBQ3BCLFlBQUksQ0FBQyxjQUFjO0FBQ2pCLDJCQUFpQixrQkFBa0IsRUFBRTtBQUNyQywyQkFBaUIsY0FBYztBQUMvQix5QkFBZSxpQkFBaUI7QUFBQSxRQUNsQztBQUVBLHlCQUFpQixrQkFBa0IsWUFBWTtBQUMvQyx5QkFBaUIsUUFBUTtBQUN6QixZQUFJLGlCQUFpQixnQkFBZ0IsS0FBSyxXQUFXLDZCQUE2QjtBQUNoRiwyQkFBaUIsZUFBZTtBQUFBLFFBQ2xDO0FBQUEsTUFDRjtBQUVBLGFBQU8sQ0FBQztBQUFBLElBQ1Y7QUFFQSxtQkFDRyxTQUFTLFdBQVcsd0NBQXdDLGlCQUFpQixFQUFFLFFBQVEsQ0FBQyxDQUFDLEVBQ3pGLFNBQVMsT0FBTyxZQUFZO0FBQzNCLFVBQUksQ0FBQyxNQUFNLFNBQVMsT0FBTyxHQUFHO0FBQzVCO0FBQUEsTUFDRjtBQUNBLFlBQU0saUJBQWlCLGlCQUFpQjtBQUN4QyxxQkFBZSxRQUFRLElBQUksV0FBVyx3Q0FBd0MsT0FBTztBQUNyRixVQUFJLFdBQVcsZ0JBQWdCO0FBQzdCLGNBQU0sS0FBSyxPQUFPLGFBQWEsY0FBYztBQUFBLE1BQy9DO0FBRUEsWUFBTSxXQUFXLFVBQVU7QUFBQSxJQUM3QixDQUFDO0FBRUgsc0JBQWtCLGlCQUFpQixTQUFTLG1CQUFtQixNQUFNLFNBQVMsQ0FBQyxDQUFDO0FBQ2hGLHNCQUFrQixpQkFBaUIsUUFBUSxtQkFBbUIsTUFBTSxTQUFTLENBQUMsQ0FBQztBQUMvRSxTQUFLLGNBQWMsSUFBSSxnQkFBZ0IsTUFBTSxTQUFTLENBQUM7QUFFdkQsc0JBQWtCLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFnQixXQUFXLGVBQWdEO0FBQ3pFLFVBQU0sWUFBWSxLQUFLLGNBQWMsSUFBSSxhQUFhO0FBQ3RELFFBQUksV0FBVztBQUNiLGFBQU8sTUFBTSxVQUFVO0FBQUEsSUFDekI7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
94
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9QbHVnaW5TZXR0aW5nc1RhYkJhc2UudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFBsdWdpblNldHRpbmdzVGFiQmFzZVxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyBhIGJhc2UgY2xhc3MgZm9yIGNyZWF0aW5nIHBsdWdpbiBzZXR0aW5nIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBJdCBwcm92aWRlcyBhIHV0aWxpdHkgbWV0aG9kIHRvIGJpbmQgdmFsdWUgY29tcG9uZW50cyB0byBwbHVnaW4gc2V0dGluZ3MgYW5kIGhhbmRsZSBjaGFuZ2VzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ29uZGl0aW9uYWxLZXlzLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IFBsdWdpblNldHRpbmdUYWIgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgU3RyaW5nS2V5cyB9IGZyb20gJy4uLy4uL09iamVjdC50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nIH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZy50cyc7XG5pbXBvcnQgdHlwZSB7IFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIH0gZnJvbSAnLi4vVmFsaWRhdGlvbk1lc3NhZ2UudHMnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW5CYXNlIH0gZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luU2V0dGluZ3NQcm9wZXJ0eSB9IGZyb20gJy4vUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZS50cyc7XG5cbmltcG9ydCB7IGludm9rZUFzeW5jU2FmZWx5IH0gZnJvbSAnLi4vLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgQ3NzQ2xhc3MgfSBmcm9tICcuLi8uLi9Dc3NDbGFzcy50cyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHsgaXNQbGFjZWhvbGRlckNvbXBvbmVudCB9IGZyb20gJy4uL0NvbXBvbmVudHMvUGxhY2Vob2xkZXJDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgZ2V0VmFsaWRhdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vQ29tcG9uZW50cy9WYWxpZGF0b3JDb21wb25lbnQudHMnO1xuaW1wb3J0IHsgaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlciB9IGZyb20gJy4uL1ZhbGlkYXRpb25NZXNzYWdlLnRzJztcbmltcG9ydCB7IGdldFBsdWdpbklkIH0gZnJvbSAnLi9QbHVnaW5JZC50cyc7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBjaGFuZ2VzLlxuICAgKi9cbiAgb25DaGFuZ2VkPyhuZXdWYWx1ZTogVCB8IHVuZGVmaW5lZCwgb2xkVmFsdWU6IFQpOiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBJZiB0cnVlLCBzaG93cyB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlIHdoZW4gdGhlIGNvbXBvbmVudCB2YWx1ZSBpcyBpbnZhbGlkLiBEZWZhdWx0IGlzIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFNob3dWYWxpZGF0aW9uTWVzc2FnZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXh0ZW5kZWQgb3B0aW9ucyBmb3IgYmluZGluZyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmRPcHRpb25zRXh0ZW5kZWQ8XG4gIFBsdWdpblNldHRpbmdzIGV4dGVuZHMgb2JqZWN0LFxuICBVSVZhbHVlLFxuICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPFBsdWdpblNldHRpbmdzPlxuPiBleHRlbmRzIEJpbmRPcHRpb25zPFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0+IHtcbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBVSSBjb21wb25lbnQncyB2YWx1ZSBiYWNrIHRvIHRoZSBwbHVnaW4gc2V0dGluZ3MgdmFsdWUuXG4gICAqIEBwYXJhbSB1aVZhbHVlIC0gVGhlIHZhbHVlIG9mIHRoZSBVSSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSB0byBzZXQgb24gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICovXG4gIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHVpVmFsdWU6IFVJVmFsdWUpID0+IFBsdWdpblNldHRpbmdzW1Byb3BlcnR5TmFtZV0gfCBWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcjtcblxuICAvKipcbiAgICogQ29udmVydHMgdGhlIHBsdWdpbiBzZXR0aW5ncyB2YWx1ZSB0byB0aGUgdmFsdWUgdXNlZCBieSB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAcGFyYW0gcGx1Z2luU2V0dGluZ3NWYWx1ZSAtIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIHBsdWdpbiBzZXR0aW5ncy5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIHRvIHNldCBvbiB0aGUgVUkgY29tcG9uZW50LlxuICAgKi9cbiAgcGx1Z2luU2V0dGluZ3NUb0NvbXBvbmVudFZhbHVlQ29udmVydGVyOiAocGx1Z2luU2V0dGluZ3NWYWx1ZTogUGx1Z2luU2V0dGluZ3NbUHJvcGVydHlOYW1lXSkgPT4gVUlWYWx1ZTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbnR5cGUgRXh0cmFjdFBsdWdpblNldHRpbmdzPFBsdWdpbiBleHRlbmRzIFBsdWdpbkJhc2U8YW55Pj4gPSBQbHVnaW4gZXh0ZW5kcyBQbHVnaW5CYXNlPGluZmVyIFBsdWdpblNldHRpbmdzPiA/IFBsdWdpblNldHRpbmdzIDogbmV2ZXI7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgcGx1Z2luIHNldHRpbmdzIHRhYnMgaW4gT2JzaWRpYW4uXG4gKiBQcm92aWRlcyBhIG1ldGhvZCBmb3IgYmluZGluZyB2YWx1ZSBjb21wb25lbnRzIHRvIHBsdWdpbiBzZXR0aW5ncyBhbmQgaGFuZGxpbmcgY2hhbmdlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQbHVnaW4gLSBUaGUgdHlwZSBvZiB0aGUgcGx1Z2luIHRoYXQgZXh0ZW5kcyBQbHVnaW5CYXNlLlxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBsdWdpblNldHRpbmdzVGFiQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luQmFzZTxhbnk+PiBleHRlbmRzIFBsdWdpblNldHRpbmdUYWIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIG92ZXJyaWRlIHBsdWdpbjogVFBsdWdpbikge1xuICAgIHN1cGVyKHBsdWdpbi5hcHAsIHBsdWdpbik7XG4gICAgdGhpcy5jb250YWluZXJFbC5hZGRDbGFzcyhDc3NDbGFzcy5MaWJyYXJ5TmFtZSwgZ2V0UGx1Z2luSWQoKSwgQ3NzQ2xhc3MuUGx1Z2luU2V0dGluZ3NUYWIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEBwYXJhbSB2YWx1ZUNvbXBvbmVudCAtIFRoZSB2YWx1ZSBjb21wb25lbnQgdG8gYmluZC5cbiAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50XG4gID4oXG4gICAgdmFsdWVDb21wb25lbnQ6IFRWYWx1ZUNvbXBvbmVudCAmIFZhbHVlQ29tcG9uZW50V2l0aENoYW5nZVRyYWNraW5nPFVJVmFsdWU+LFxuICAgIHByb3BlcnR5TmFtZTogQ29uZGl0aW9uYWxLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPiwgVUlWYWx1ZT4sXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPFVJVmFsdWU+XG4gICk6IFRWYWx1ZUNvbXBvbmVudDtcbiAgLyoqXG4gICAqIEJpbmRzIGEgdmFsdWUgY29tcG9uZW50IHRvIGEgcGx1Z2luIHNldHRpbmcuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVUlWYWx1ZSAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgVUkgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFRWYWx1ZUNvbXBvbmVudCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEB0eXBlUGFyYW0gUHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gdmFsdWVDb21wb25lbnQgLSBUaGUgdmFsdWUgY29tcG9uZW50IHRvIGJpbmQuXG4gICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLSBUaGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgcGx1Z2luIHNldHRpbmdzIHRvIGJpbmQgdG8uXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIGJpbmRpbmcgdGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICogQHJldHVybnMgVGhlIHZhbHVlIGNvbXBvbmVudC5cbiAgICovXG4gIHB1YmxpYyBiaW5kPFxuICAgIFVJVmFsdWUsXG4gICAgVFZhbHVlQ29tcG9uZW50LFxuICAgIFByb3BlcnR5TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXh0cmFjdFBsdWdpblNldHRpbmdzPFRQbHVnaW4+PlxuICA+KFxuICAgIHZhbHVlQ29tcG9uZW50OiBUVmFsdWVDb21wb25lbnQgJiBWYWx1ZUNvbXBvbmVudFdpdGhDaGFuZ2VUcmFja2luZzxVSVZhbHVlPixcbiAgICBwcm9wZXJ0eU5hbWU6IFByb3BlcnR5TmFtZSxcbiAgICBvcHRpb25zOiBCaW5kT3B0aW9uc0V4dGVuZGVkPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPiwgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPlxuICApOiBUVmFsdWVDb21wb25lbnQ7XG4gIC8qKlxuICAgKiBCaW5kcyBhIHZhbHVlIGNvbXBvbmVudCB0byBhIHBsdWdpbiBzZXR0aW5nLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFVJVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFVJIGNvbXBvbmVudC5cbiAgICogQHR5cGVQYXJhbSBUVmFsdWVDb21wb25lbnQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgY29tcG9uZW50LlxuICAgKiBAdHlwZVBhcmFtIFByb3BlcnR5TmFtZSAtIFRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBwbHVnaW4gc2V0dGluZ3MgdG8gYmluZCB0by5cbiAgICogQHBhcmFtIHZhbHVlQ29tcG9uZW50IC0gVGhlIHZhbHVlIGNvbXBvbmVudCB0byBiaW5kLlxuICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0gVGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHBsdWdpbiBzZXR0aW5ncyB0byBiaW5kIHRvLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBiaW5kaW5nIHRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBjb21wb25lbnQuXG4gICAqL1xuICBwdWJsaWMgYmluZDxcbiAgICBVSVZhbHVlLFxuICAgIFRWYWx1ZUNvbXBvbmVudCxcbiAgICBQcm9wZXJ0eU5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPj5cbiAgPihcbiAgICB2YWx1ZUNvbXBvbmVudDogVFZhbHVlQ29tcG9uZW50ICYgVmFsdWVDb21wb25lbnRXaXRoQ2hhbmdlVHJhY2tpbmc8VUlWYWx1ZT4sXG4gICAgcHJvcGVydHlOYW1lOiBQcm9wZXJ0eU5hbWUsXG4gICAgb3B0aW9ucz86IEJpbmRPcHRpb25zPEV4dHJhY3RQbHVnaW5TZXR0aW5nczxUUGx1Z2luPltQcm9wZXJ0eU5hbWVdPlxuICApOiBUVmFsdWVDb21wb25lbnQge1xuICAgIHR5cGUgUGx1Z2luU2V0dGluZ3MgPSBFeHRyYWN0UGx1Z2luU2V0dGluZ3M8VFBsdWdpbj47XG4gICAgdHlwZSBQcm9wZXJ0eVR5cGUgPSBQbHVnaW5TZXR0aW5nc1tQcm9wZXJ0eU5hbWVdO1xuICAgIGNvbnN0IERFRkFVTFRfT1BUSU9OUzogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1yZXR1cm5cbiAgICAgIGNvbXBvbmVudFRvUGx1Z2luU2V0dGluZ3NWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBVSVZhbHVlKTogUHJvcGVydHlUeXBlID0+IHZhbHVlIGFzIFByb3BlcnR5VHlwZSxcbiAgICAgIG9uQ2hhbmdlZDogbm9vcCxcbiAgICAgIHBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcjogKHZhbHVlOiBQcm9wZXJ0eVR5cGUpOiBVSVZhbHVlID0+IHZhbHVlIGFzIFVJVmFsdWUsXG4gICAgICBzaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2U6IHRydWVcbiAgICB9O1xuXG4gICAgY29uc3Qgb3B0aW9uc0V4dDogUmVxdWlyZWQ8QmluZE9wdGlvbnNFeHRlbmRlZDxQbHVnaW5TZXR0aW5ncywgVUlWYWx1ZSwgUHJvcGVydHlOYW1lPj4gPSB7IC4uLkRFRkFVTFRfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gICAgY29uc3QgdmFsaWRhdG9yRWxlbWVudCA9IGdldFZhbGlkYXRvckNvbXBvbmVudCh2YWx1ZUNvbXBvbmVudCk/LnZhbGlkYXRvckVsO1xuXG4gICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnBsdWdpbi5zZXR0aW5nc01hbmFnZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKSBhcyBQbHVnaW5TZXR0aW5nc1Byb3BlcnR5PFByb3BlcnR5VHlwZT47XG5cbiAgICBsZXQgdmFsdWUgPSBwcm9wZXJ0eS5nZXRNb2RpZmllZFZhbHVlKCk7XG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhaXNQbGFjZWhvbGRlckNvbXBvbmVudCh2YWx1ZUNvbXBvbmVudCkpIHtcbiAgICAgIHZhbHVlID0gcHJvcGVydHkuZGVmYXVsdFZhbHVlO1xuICAgICAgcHJvcGVydHkuc2V0VmFsdWUodmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB2YWx1ZUNvbXBvbmVudC5zZXRWYWx1ZShvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcih2YWx1ZSkpO1xuICAgIH1cblxuICAgIHZhbHVlQ29tcG9uZW50Lm9uQ2hhbmdlKGFzeW5jICh1aVZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHByb3BlcnR5LmdldE1vZGlmaWVkT3JEZWZhdWx0VmFsdWUoKTtcbiAgICAgIGNvbnN0IGNvbnZlcnRlZFZhbHVlID0gb3B0aW9uc0V4dC5jb21wb25lbnRUb1BsdWdpblNldHRpbmdzVmFsdWVDb252ZXJ0ZXIodWlWYWx1ZSk7XG4gICAgICBpZiAoaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcihjb252ZXJ0ZWRWYWx1ZSkpIHtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdGlvbk1lc3NhZ2UoY29udmVydGVkVmFsdWUudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgcHJvcGVydHkuc2V0VmFsdWVBbmRWYWxpZGF0ZShjb252ZXJ0ZWRWYWx1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBuZXdWYWx1ZSA9IGlzVmFsaWRhdGlvbk1lc3NhZ2VIb2xkZXIoY29udmVydGVkVmFsdWUpID8gdW5kZWZpbmVkIDogY29udmVydGVkVmFsdWU7XG4gICAgICBhd2FpdCBvcHRpb25zRXh0Lm9uQ2hhbmdlZChuZXdWYWx1ZSwgb2xkVmFsdWUpO1xuICAgIH0pO1xuXG4gICAgaWYgKGlzUGxhY2Vob2xkZXJDb21wb25lbnQodmFsdWVDb21wb25lbnQpKSB7XG4gICAgICB2YWx1ZUNvbXBvbmVudC5zZXRQbGFjZWhvbGRlcihvcHRpb25zRXh0LnBsdWdpblNldHRpbmdzVG9Db21wb25lbnRWYWx1ZUNvbnZlcnRlcihwcm9wZXJ0eS5kZWZhdWx0VmFsdWUpIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB2YWxpZGF0ZSk7XG4gICAgdmFsaWRhdG9yRWxlbWVudD8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHZhbGlkYXRlKTtcblxuICAgIHZhbGlkYXRlKCk7XG4gICAgcmV0dXJuIHZhbHVlQ29tcG9uZW50O1xuXG4gICAgZnVuY3Rpb24gdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgICBpZiAoIXZhbGlkYXRvckVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlKSB7XG4gICAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkoJycpO1xuICAgICAgICB2YWxpZGF0b3JFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtcbiAgICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdGlvbk1lc3NhZ2UodmFsaWRhdG9yRWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIHZhbGlkYXRvckVsZW1lbnQuc2V0Q3VzdG9tVmFsaWRpdHkocHJvcGVydHkudmFsaWRhdGlvbk1lc3NhZ2UpO1xuICAgICAgdmFsaWRhdG9yRWxlbWVudC50aXRsZSA9IHByb3BlcnR5LnZhbGlkYXRpb25NZXNzYWdlO1xuICAgICAgaWYgKHZhbGlkYXRvckVsZW1lbnQuaXNBY3RpdmVFbGVtZW50KCkgJiYgb3B0aW9uc0V4dC5zaG91bGRTaG93VmFsaWRhdGlvbk1lc3NhZ2UpIHtcbiAgICAgICAgdmFsaWRhdG9yRWxlbWVudC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBoaWRlKCk6IHZvaWQge1xuICAgIHN1cGVyLmhpZGUoKTtcbiAgICBpbnZva2VBc3luY1NhZmVseSgoKSA9PiB0aGlzLnBsdWdpbi5zZXR0aW5nc01hbmFnZXIuc2F2ZVRvRmlsZSgpKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVdBLFNBQVMsd0JBQXdCO0FBUWpDLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsWUFBWTtBQUNyQixTQUFTLDhCQUE4QjtBQUN2QyxTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLGlDQUFpQztBQUMxQyxT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
@@ -1,8 +1,7 @@
1
- export * as EmptySettings from './EmptySettings.mjs';
2
1
  export * as ObsidianPluginRepoPaths from './ObsidianPluginRepoPaths.mjs';
3
2
  export * as Plugin from './Plugin.mjs';
4
3
  export * as PluginBase from './PluginBase.mjs';
5
4
  export * as PluginContext from './PluginContext.mjs';
6
5
  export * as PluginId from './PluginId.mjs';
7
- export * as PluginSettingsBase from './PluginSettingsBase.mjs';
6
+ export * as PluginSettingsManagerBase from './PluginSettingsManagerBase.mjs';
8
7
  export * as PluginSettingsTabBase from './PluginSettingsTabBase.mjs';
@@ -5,22 +5,20 @@ if you want to view the source, please visit the github repository of this plugi
5
5
 
6
6
  (function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
7
 
8
- import * as EmptySettings from "./EmptySettings.mjs";
9
8
  import * as ObsidianPluginRepoPaths from "./ObsidianPluginRepoPaths.mjs";
10
9
  import * as Plugin from "./Plugin.mjs";
11
10
  import * as PluginBase from "./PluginBase.mjs";
12
11
  import * as PluginContext from "./PluginContext.mjs";
13
12
  import * as PluginId from "./PluginId.mjs";
14
- import * as PluginSettingsBase from "./PluginSettingsBase.mjs";
13
+ import * as PluginSettingsManagerBase from "./PluginSettingsManagerBase.mjs";
15
14
  import * as PluginSettingsTabBase from "./PluginSettingsTabBase.mjs";
16
15
  export {
17
- EmptySettings,
18
16
  ObsidianPluginRepoPaths,
19
17
  Plugin,
20
18
  PluginBase,
21
19
  PluginContext,
22
20
  PluginId,
23
- PluginSettingsBase,
21
+ PluginSettingsManagerBase,
24
22
  PluginSettingsTabBase
25
23
  };
26
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzIEVtcHR5U2V0dGluZ3MgZnJvbSAnLi9FbXB0eVNldHRpbmdzLnRzJztcbmV4cG9ydCAqIGFzIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIGZyb20gJy4vT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gJy4vUGx1Z2luLnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbkJhc2UgZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbkNvbnRleHQgZnJvbSAnLi9QbHVnaW5Db250ZXh0LnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbklkIGZyb20gJy4vUGx1Z2luSWQudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luU2V0dGluZ3NCYXNlIGZyb20gJy4vUGx1Z2luU2V0dGluZ3NCYXNlLnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpblNldHRpbmdzVGFiQmFzZSBmcm9tICcuL1BsdWdpblNldHRpbmdzVGFiQmFzZS50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBRUEsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSw2QkFBNkI7QUFDekMsWUFBWSxZQUFZO0FBQ3hCLFlBQVksZ0JBQWdCO0FBQzVCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksY0FBYztBQUMxQixZQUFZLHdCQUF3QjtBQUNwQyxZQUFZLDJCQUEyQjsiLAogICJuYW1lcyI6IFtdCn0K
24
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1BsdWdpbi9pbmRleC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyogVEhJUyBJUyBBIEdFTkVSQVRFRC9CVU5ETEVEIEZJTEUgQlkgQlVJTEQgU0NSSVBUICovXG5cbmV4cG9ydCAqIGFzIE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzIGZyb20gJy4vT2JzaWRpYW5QbHVnaW5SZXBvUGF0aHMudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gJy4vUGx1Z2luLnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbkJhc2UgZnJvbSAnLi9QbHVnaW5CYXNlLnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbkNvbnRleHQgZnJvbSAnLi9QbHVnaW5Db250ZXh0LnRzJztcbmV4cG9ydCAqIGFzIFBsdWdpbklkIGZyb20gJy4vUGx1Z2luSWQudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luU2V0dGluZ3NNYW5hZ2VyQmFzZSBmcm9tICcuL1BsdWdpblNldHRpbmdzTWFuYWdlckJhc2UudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luU2V0dGluZ3NUYWJCYXNlIGZyb20gJy4vUGx1Z2luU2V0dGluZ3NUYWJCYXNlLnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFFQSxZQUFZLDZCQUE2QjtBQUN6QyxZQUFZLFlBQVk7QUFDeEIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxtQkFBbUI7QUFDL0IsWUFBWSxjQUFjO0FBQzFCLFlBQVksK0JBQStCO0FBQzNDLFlBQVksMkJBQTJCOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Holds a validation message.
3
+ */
4
+ export interface ValidationMessageHolder {
5
+ /**
6
+ * The validation message.
7
+ */
8
+ validationMessage: string;
9
+ }
10
+ /**
11
+ * Type guard to check if a value is a validation message holder.
12
+ *
13
+ * @param value - The value to check.
14
+ * @returns `true` if the value is a validation message holder, `false` otherwise.
15
+ */
16
+ export declare function isValidationMessageHolder(value: unknown): value is ValidationMessageHolder;
@@ -0,0 +1,14 @@
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 initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
7
+
8
+ function isValidationMessageHolder(value) {
9
+ return value.validationMessage !== void 0;
10
+ }
11
+ export {
12
+ isValidationMessageHolder
13
+ };
14
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1ZhbGlkYXRpb25NZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEhvbGRzIGEgdmFsaWRhdGlvbiBtZXNzYWdlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgLyoqXG4gICAqIFRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuXG4gICAqL1xuICB2YWxpZGF0aW9uTWVzc2FnZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHZhbGlkYXRpb24gbWVzc2FnZSBob2xkZXIuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNoZWNrLlxuICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkYXRpb24gbWVzc2FnZSBob2xkZXIsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZGF0aW9uTWVzc2FnZUhvbGRlcih2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyIHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBQYXJ0aWFsPFZhbGlkYXRpb25NZXNzYWdlSG9sZGVyPikudmFsaWRhdGlvbk1lc3NhZ2UgIT09IHVuZGVmaW5lZDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFnQk8sU0FBUywwQkFBMEIsT0FBa0Q7QUFDMUYsU0FBUSxNQUEyQyxzQkFBc0I7QUFDM0U7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -106,7 +106,7 @@ function getSafeRenamePath(app, oldPathOrFile, newPath) {
106
106
  let folderPath = dirname(newPath);
107
107
  let nonExistingPath = basename(newPath);
108
108
  let folder;
109
- for (; ; ) {
109
+ while (true) {
110
110
  folder = getFolderOrNull(app, folderPath, true);
111
111
  if (folder) {
112
112
  break;
@@ -241,4 +241,4 @@ export {
241
241
  readSafe,
242
242
  renameSafe
243
243
  };
244
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBWYXVsdFxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IHBhcmVudEZvbGRlclBhdGggfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyByZXRyeVdpdGhUaW1lb3V0IH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBgcHJvY2Vzc2AgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gICAqL1xuICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29waWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2xkUGF0aE9yRmlsZSAtIFRoZSBvbGQgcGF0aCBvciBmaWxlIHRvIGNvcHkuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byBjb3B5IHRoZSBmaWxlIHRvLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBjb3BpZWQgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlTYWZlKGFwcDogQXBwLCBvbGRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIG9sZFBhdGhPckZpbGUpO1xuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld1BhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldEF2YWlsYWJsZVBhdGgoYXBwLCBuZXdQYXRoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jb3B5KGZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmb2xkZXIgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciB3YXMgY3JlYXRlZC5cbiAqIEB0aHJvd3MgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBmb2xkZXIgYW5kIGl0IHN0aWxsIGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZpbGUpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmb2xkZXIgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBkZWxldGUgdGhlIHRlbXBvcmFyeSBmb2xkZXIgYW5kIGFsbCBpdHMgY3JlYXRlZCBwYXJlbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVtcEZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKGZvbGRlcikge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBkaXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChwYXRoKTtcbiAgYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wRm9sZGVyKGFwcCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG5cbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIHBhdGgpO1xuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgZm9sZGVyID0gZ2V0Rm9sZGVyKGFwcCwgcGF0aCk7XG4gICAgaWYgKCFmb2xkZXIuZGVsZXRlZCkge1xuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShmb2xkZXIpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogR2V0cyBhbiBhdmFpbGFibGUgcGF0aCBmb3IgYSBmaWxlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgYW4gYXZhaWxhYmxlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBwYXRoIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IGV4dG5hbWUocGF0aCk7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpcm5hbWUocGF0aCksIGJhc2VuYW1lKHBhdGgsIGV4dCkpLCBleHQuc2xpY2UoMSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya2Rvd25GaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKS5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgYWxsIG5vdGUgZmlsZXMgZnJvbSB0aGUgYXBwJ3MgdmF1bHQgYW5kIHNvcnRzIHRoZW0gYWxwaGFiZXRpY2FsbHkgYnkgdGhlaXIgZmlsZSBwYXRoLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGFwcCwgZmlsZSkpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpIGFzIFRGaWxlW107XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcmVuYW1lIHBhdGggZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIG9sZFBhdGhPckZpbGUgLSBUaGUgb2xkIHBhdGggb3IgZmlsZSB0byByZW5hbWUuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGZpbGUgdG8uXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgb2xkUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRQYXRoT3JGaWxlKTtcblxuICBpZiAoYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUpIHtcbiAgICBsZXQgZm9sZGVyUGF0aCA9IGRpcm5hbWUobmV3UGF0aCk7XG4gICAgbGV0IG5vbkV4aXN0aW5nUGF0aCA9IGJhc2VuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBmb2xkZXI6IG51bGwgfCBURm9sZGVyO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGZvbGRlclBhdGgsIHRydWUpO1xuICAgICAgaWYgKGZvbGRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vbkV4aXN0aW5nUGF0aCA9IGpvaW4oYmFzZW5hbWUoZm9sZGVyUGF0aCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gICAgICBmb2xkZXJQYXRoID0gZGlybmFtZShmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgbmV3UGF0aCA9IGpvaW4oZm9sZGVyLmdldFBhcmVudFByZWZpeCgpLCBub25FeGlzdGluZ1BhdGgpO1xuICB9XG5cbiAgaWYgKG9sZFBhdGgudG9Mb3dlckNhc2UoKSA9PT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZvbGRlciBpcyBlbXB0eS5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9sZGVyIGlzIGVtcHR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbGlzdGVkRmlsZXMgPSBhd2FpdCBsaXN0U2FmZShhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpKTtcbiAgcmV0dXJuIGxpc3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMCAmJiBsaXN0ZWRGaWxlcy5mb2xkZXJzLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgbGlzdHMgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gbGlzdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYExpc3RlZEZpbGVzYCBvYmplY3QgY29udGFpbmluZyB0aGUgbGlzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNhZmUoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxMaXN0ZWRGaWxlcz4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcik7XG4gIGNvbnN0IEVNUFRZID0geyBmaWxlczogW10sIGZvbGRlcnM6IFtdIH07XG5cbiAgaWYgKChhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpKT8udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5saXN0KHBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGZpbGUgd2l0aCByZXRyeSBsb2dpYywgdXBkYXRpbmcgaXRzIGNvbnRlbnQgYmFzZWQgb24gYSBwcm92aWRlZCB2YWx1ZSBvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLCB0eXBpY2FsbHkgdXNlZCBmb3IgYWNjZXNzaW5nIHRoZSB2YXVsdC5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBiZSBwcm9jZXNzZWQuIEl0IGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb3IgYSBmaWxlIG9iamVjdC5cbiAqIEBwYXJhbSBuZXdDb250ZW50UHJvdmlkZXIgLSBBIHZhbHVlIHByb3ZpZGVyIHRoYXQgcmV0dXJucyB0aGUgbmV3IGNvbnRlbnQgYmFzZWQgb24gdGhlIG9sZCBjb250ZW50IG9mIHRoZSBmaWxlLlxuICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICogSWYgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHNob3VsZCByZXR1cm4gYG51bGxgIGlmIHRoZSBwcm9jZXNzIHNob3VsZCBiZSByZXRyaWVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciBwcm9jZXNzaW5nL3JldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByb2Nlc3MgZmFpbHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmV0cmllcyBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2VzcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIG5ld0NvbnRlbnRQcm92aWRlcjogVmFsdWVQcm92aWRlcjxudWxsIHwgc3RyaW5nLCBbc3RyaW5nXT4sXG4gIG9wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IHRydWVcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBoYW5kbGVNaXNzaW5nRmlsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUobmV3Q29udGVudFByb3ZpZGVyLCBvbGRDb250ZW50KTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpc1N1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IGRvZXNGaWxlRXhpc3QgPSBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZShhcHAsIHBhdGhPckZpbGUsIGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgcmVhZC4gUmV0cnlpbmcuLi4nLCB7XG4gICAgICAgICAgICBhY3R1YWxDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBvbGRDb250ZW50LFxuICAgICAgICAgICAgcGF0aDogZmlsZS5wYXRoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3Q29udGVudDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKCFkb2VzRmlsZUV4aXN0KSB7XG4gICAgICByZXR1cm4gaGFuZGxlTWlzc2luZ0ZpbGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNTdWNjZXNzO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlTWlzc2luZ0ZpbGUoKTogYm9vbGVhbiB7XG4gICAgICBpZiAoZnVsbE9wdGlvbnMuc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGUpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwgZnVsbE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogSXQgY292ZXJzIHRoZSBjYXNlIHdoZW4gdGhlIGZpbGUgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSByZWFkaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIGBudWxsYCBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBsZXQgY29udGVudDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gIH0pO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICogSWYgdGhlIG5ldyBwYXRoIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYW4gYXZhaWxhYmxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gcmVuYW1lLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBmaWxlIHRvLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2FmZShhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoT3JGaWxlLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aE9yRmlsZSwgbmV3UGF0aCk7XG5cbiAgaWYgKG9sZEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdBdmFpbGFibGVQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBpZiAob2xkRmlsZS5wYXRoICE9PSBuZXdQYXRoKSB7XG4gICAgICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKG9sZEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld0F2YWlsYWJsZVBhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKG9sZEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpIHx8IGF3YWl0IGFwcC52YXVsdC5leGlzdHMob2xkRmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW52b2tlRmlsZUFjdGlvblNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIGZpbGVBY3Rpb246IChmaWxlOiBURmlsZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZpbGVBY3Rpb24oZmlsZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVlBLFNBQVMsd0JBQXdCO0FBU2pDLFNBQVMsd0JBQXdCO0FBQ2pDLFNBQVMsaUJBQWlCO0FBQzFCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLG9CQUFvQjtBQUM3QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBb0JQLGVBQXNCLFNBQVMsS0FBVSxlQUEyQixTQUFrQztBQUNwRyxRQUFNLE9BQU8sUUFBUSxLQUFLLGFBQWE7QUFFdkMsUUFBTSxnQkFBZ0IsaUJBQWlCLE9BQU87QUFDOUMsUUFBTSxpQkFBaUIsS0FBSyxhQUFhO0FBRXpDLFFBQU0sbUJBQW1CLGlCQUFpQixLQUFLLE9BQU87QUFFdEQsTUFBSTtBQUNGLFVBQU0sSUFBSSxNQUFNLEtBQUssTUFBTSxnQkFBZ0I7QUFBQSxFQUM3QyxTQUFTLEdBQUc7QUFDVixRQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sT0FBTyxnQkFBZ0IsR0FBRztBQUM3QyxZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFVQSxlQUFzQixpQkFBaUIsS0FBVSxNQUFnQztBQUMvRSxNQUFJLE1BQU0sSUFBSSxNQUFNLFFBQVEsT0FBTyxJQUFJLEdBQUc7QUFDeEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0YsVUFBTSxJQUFJLE1BQU0sYUFBYSxJQUFJO0FBQ2pDLFdBQU87QUFBQSxFQUNULFNBQVMsR0FBRztBQUNWLFFBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxPQUFPLElBQUksR0FBRztBQUNqQyxZQUFNO0FBQUEsSUFDUjtBQUNBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFRQSxlQUFzQixlQUFlLEtBQVUsTUFBNEM7QUFDekYsTUFBSSxPQUFPLGNBQWMsS0FBSyxJQUFJO0FBQ2xDLE1BQUksTUFBTTtBQUNSLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQkFBZ0IsTUFBTSxpQkFBaUIsS0FBSyxpQkFBaUIsSUFBSSxDQUFDO0FBRXhFLE1BQUk7QUFDRixVQUFNLElBQUksTUFBTSxPQUFPLE1BQU0sRUFBRTtBQUFBLEVBQ2pDLFNBQVMsR0FBRztBQUNWLFFBQUksQ0FBQyxNQUFNLElBQUksTUFBTSxPQUFPLElBQUksR0FBRztBQUNqQyxZQUFNO0FBQUEsSUFDUjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLFlBQVk7QUFDakIsV0FBTyxRQUFRLEtBQUssSUFBSTtBQUN4QixRQUFJLENBQUMsS0FBSyxTQUFTO0FBQ2pCLFlBQU0sSUFBSSxZQUFZLFVBQVUsSUFBSTtBQUFBLElBQ3RDO0FBQ0EsVUFBTSxjQUFjO0FBQUEsRUFDdEI7QUFDRjtBQVFBLGVBQXNCLGlCQUFpQixLQUFVLE1BQTRDO0FBQzNGLE1BQUksU0FBUyxnQkFBZ0IsS0FBSyxJQUFJO0FBQ3RDLE1BQUksUUFBUTtBQUNWLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxVQUFVLGlCQUFpQixJQUFJO0FBQ3JDLFFBQU0saUJBQWlCLEtBQUssT0FBTztBQUVuQyxRQUFNLGdCQUFnQixNQUFNLGlCQUFpQixLQUFLLGlCQUFpQixJQUFJLENBQUM7QUFFeEUsUUFBTSxpQkFBaUIsS0FBSyxJQUFJO0FBRWhDLFNBQU8sWUFBWTtBQUNqQixhQUFTLFVBQVUsS0FBSyxJQUFJO0FBQzVCLFFBQUksQ0FBQyxPQUFPLFNBQVM7QUFDbkIsWUFBTSxJQUFJLFlBQVksVUFBVSxNQUFNO0FBQUEsSUFDeEM7QUFDQSxVQUFNLGNBQWM7QUFBQSxFQUN0QjtBQUNGO0FBU08sU0FBUyxpQkFBaUIsS0FBVSxNQUFzQjtBQUMvRCxRQUFNLE1BQU0sUUFBUSxJQUFJO0FBQ3hCLFNBQU8sSUFBSSxNQUFNLGlCQUFpQixLQUFLLFFBQVEsSUFBSSxHQUFHLFNBQVMsTUFBTSxHQUFHLENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxDQUFDO0FBQzFGO0FBUU8sU0FBUyx1QkFBdUIsS0FBbUI7QUFDeEQsU0FBTyxJQUFJLE1BQU0saUJBQWlCLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssY0FBYyxFQUFFLElBQUksQ0FBQztBQUNqRjtBQU9PLFNBQVMsbUJBQW1CLEtBQW1CO0FBQ3BELFNBQU8sSUFBSSxNQUFNLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxTQUFTLE9BQU8sSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxNQUFNLEVBQUUsS0FBSyxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQ3RJO0FBVU8sU0FBUyxrQkFBa0IsS0FBVSxlQUEyQixTQUF5QjtBQUM5RixRQUFNLFVBQVUsUUFBUSxLQUFLLGFBQWE7QUFFMUMsTUFBSSxJQUFJLE1BQU0sUUFBUSxhQUFhO0FBQ2pDLFFBQUksYUFBYSxRQUFRLE9BQU87QUFDaEMsUUFBSSxrQkFBa0IsU0FBUyxPQUFPO0FBQ3RDLFFBQUk7QUFDSixlQUFTO0FBQ1AsZUFBUyxnQkFBZ0IsS0FBSyxZQUFZLElBQUk7QUFDOUMsVUFBSSxRQUFRO0FBQ1Y7QUFBQSxNQUNGO0FBQ0Esd0JBQWtCLEtBQUssU0FBUyxVQUFVLEdBQUcsZUFBZTtBQUM1RCxtQkFBYSxRQUFRLFVBQVU7QUFBQSxJQUNqQztBQUNBLGNBQVUsS0FBSyxPQUFPLGdCQUFnQixHQUFHLGVBQWU7QUFBQSxFQUMxRDtBQUVBLE1BQUksUUFBUSxZQUFZLE1BQU0sUUFBUSxZQUFZLEdBQUc7QUFDbkQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLGlCQUFpQixLQUFLLE9BQU87QUFDdEM7QUFRQSxlQUFzQixjQUFjLEtBQVUsY0FBOEM7QUFDMUYsUUFBTSxjQUFjLE1BQU0sU0FBUyxLQUFLLFFBQVEsS0FBSyxZQUFZLENBQUM7QUFDbEUsU0FBTyxZQUFZLE1BQU0sV0FBVyxLQUFLLFlBQVksUUFBUSxXQUFXO0FBQzFFO0FBU0EsZUFBc0IsU0FBUyxLQUFVLGNBQWtEO0FBQ3pGLFFBQU0sT0FBTyxRQUFRLEtBQUssWUFBWTtBQUN0QyxRQUFNLFFBQVEsRUFBRSxPQUFPLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRTtBQUV2QyxPQUFLLE1BQU0sSUFBSSxNQUFNLFFBQVEsS0FBSyxJQUFJLElBQUksU0FBUyxVQUFVO0FBQzNELFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSTtBQUNGLFdBQU8sTUFBTSxJQUFJLE1BQU0sUUFBUSxLQUFLLElBQUk7QUFBQSxFQUMxQyxTQUFTLEdBQUc7QUFDVixRQUFJLE1BQU0sSUFBSSxNQUFNLE9BQU8sSUFBSSxHQUFHO0FBQ2hDLFlBQU07QUFBQSxJQUNSO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQWdCQSxlQUFzQixRQUNwQixLQUNBLFlBQ0Esb0JBQ0EsVUFBMEIsQ0FBQyxHQUNaO0FBQ2YsUUFBTSx3QkFBd0I7QUFBQSxJQUM1Qix5QkFBeUI7QUFBQSxFQUMzQjtBQUNBLFFBQU0sY0FBYyxFQUFFLEdBQUcsdUJBQXVCLEdBQUcsUUFBUTtBQUUzRCxRQUFNLGlCQUFpQixZQUFZO0FBQ2pDLFVBQU0sYUFBYSxNQUFNLFNBQVMsS0FBSyxVQUFVO0FBRWpELFFBQUksZUFBZSxNQUFNO0FBQ3ZCLGFBQU8sa0JBQWtCO0FBQUEsSUFDM0I7QUFFQSxVQUFNLGFBQWEsTUFBTSxhQUFhLG9CQUFvQixVQUFVO0FBQ3BFLFFBQUksZUFBZSxNQUFNO0FBQ3ZCLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSSxZQUFZO0FBQ2hCLFVBQU0sZ0JBQWdCLE1BQU0scUJBQXFCLEtBQUssWUFBWSxPQUFPLFNBQVM7QUFDaEYsWUFBTSxJQUFJLE1BQU0sUUFBUSxNQUFNLENBQUMsWUFBWTtBQUN6QyxZQUFJLFlBQVksWUFBWTtBQUMxQixrQkFBUSxLQUFLLHNEQUFzRDtBQUFBLFlBQ2pFLGVBQWU7QUFBQSxZQUNmLGlCQUFpQjtBQUFBLFlBQ2pCLE1BQU0sS0FBSztBQUFBLFVBQ2IsQ0FBQztBQUNELHNCQUFZO0FBQ1osaUJBQU87QUFBQSxRQUNUO0FBRUEsZUFBTztBQUFBLE1BQ1QsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUVELFFBQUksQ0FBQyxlQUFlO0FBQ2xCLGFBQU8sa0JBQWtCO0FBQUEsSUFDM0I7QUFFQSxXQUFPO0FBRVAsYUFBUyxvQkFBNkI7QUFDcEMsVUFBSSxZQUFZLHlCQUF5QjtBQUN2QyxjQUFNLE9BQU8sUUFBUSxLQUFLLFVBQVU7QUFDcEMsY0FBTSxJQUFJLE1BQU0sU0FBUyxJQUFJLGFBQWE7QUFBQSxNQUM1QztBQUNBLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRixHQUFHLFdBQVc7QUFDaEI7QUFXQSxlQUFzQixTQUFTLEtBQVUsWUFBZ0Q7QUFDdkYsTUFBSSxVQUF5QjtBQUM3QixRQUFNLHFCQUFxQixLQUFLLFlBQVksT0FBTyxTQUFTO0FBQzFELGNBQVUsTUFBTSxJQUFJLE1BQU0sS0FBSyxJQUFJO0FBQUEsRUFDckMsQ0FBQztBQUNELFNBQU87QUFDVDtBQVdBLGVBQXNCLFdBQVcsS0FBVSxlQUEyQixTQUFrQztBQUN0RyxRQUFNLFVBQVUsUUFBUSxLQUFLLGVBQWUsT0FBTyxJQUFJO0FBRXZELFFBQU0sbUJBQW1CLGtCQUFrQixLQUFLLGVBQWUsT0FBTztBQUV0RSxNQUFJLFFBQVEsS0FBSyxZQUFZLE1BQU0saUJBQWlCLFlBQVksR0FBRztBQUNqRSxRQUFJLFFBQVEsU0FBUyxTQUFTO0FBQzVCLFlBQU0sSUFBSSxNQUFNLE9BQU8sU0FBUyxnQkFBZ0I7QUFBQSxJQUNsRDtBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxnQkFBZ0IsaUJBQWlCLGdCQUFnQjtBQUN2RCxRQUFNLGlCQUFpQixLQUFLLGFBQWE7QUFFekMsTUFBSTtBQUNGLFVBQU0sSUFBSSxNQUFNLE9BQU8sU0FBUyxnQkFBZ0I7QUFBQSxFQUNsRCxTQUFTLEdBQUc7QUFDVixRQUFJLENBQUMsTUFBTSxJQUFJLE1BQU0sT0FBTyxnQkFBZ0IsS0FBSyxNQUFNLElBQUksTUFBTSxPQUFPLFFBQVEsSUFBSSxHQUFHO0FBQ3JGLFlBQU07QUFBQSxJQUNSO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLGVBQWUscUJBQXFCLEtBQVUsWUFBd0IsWUFBOEQ7QUFDbEksUUFBTSxPQUFPLFFBQVEsS0FBSyxVQUFVO0FBQ3BDLE1BQUksT0FBTyxjQUFjLEtBQUssSUFBSTtBQUNsQyxNQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJO0FBQ0YsVUFBTSxXQUFXLElBQUk7QUFDckIsV0FBTztBQUFBLEVBQ1QsU0FBUyxHQUFHO0FBQ1YsV0FBTyxjQUFjLEtBQUssSUFBSTtBQUM5QixRQUFJLENBQUMsUUFBUSxLQUFLLFNBQVM7QUFDekIsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
244
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL1ZhdWx0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBWYXVsdFxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCB0aGUgT2JzaWRpYW4gVmF1bHQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIExpc3RlZEZpbGVzLFxuICBURmlsZSxcbiAgVEZvbGRlclxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IHBhcmVudEZvbGRlclBhdGggfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUmV0cnlPcHRpb25zIH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHR5cGUgeyBWYWx1ZVByb3ZpZGVyIH0gZnJvbSAnLi4vVmFsdWVQcm92aWRlci50cyc7XG5pbXBvcnQgdHlwZSB7XG4gIFBhdGhPckZpbGUsXG4gIFBhdGhPckZvbGRlclxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyByZXRyeVdpdGhUaW1lb3V0IH0gZnJvbSAnLi4vQXN5bmMudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW5cbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyByZXNvbHZlVmFsdWUgfSBmcm9tICcuLi9WYWx1ZVByb3ZpZGVyLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlcixcbiAgZ2V0Rm9sZGVyT3JOdWxsLFxuICBnZXRQYXRoLFxuICBpc0ZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBgcHJvY2Vzc2AgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc09wdGlvbnMgZXh0ZW5kcyBSZXRyeU9wdGlvbnMge1xuICAvKipcbiAgICogSWYgYHRydWVgLCB0aGUgZnVuY3Rpb24gd2lsbCB0aHJvdyBhbiBlcnJvciBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gICAqL1xuICBzaG91bGRGYWlsT25NaXNzaW5nRmlsZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ29waWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gb2xkUGF0aE9yRmlsZSAtIFRoZSBvbGQgcGF0aCBvciBmaWxlIHRvIGNvcHkuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byBjb3B5IHRoZSBmaWxlIHRvLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBjb3BpZWQgZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlTYWZlKGFwcDogQXBwLCBvbGRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBmaWxlID0gZ2V0RmlsZShhcHAsIG9sZFBhdGhPckZpbGUpO1xuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld1BhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldEF2YWlsYWJsZVBhdGgoYXBwLCBuZXdQYXRoKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGFwcC52YXVsdC5jb3B5KGZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdBdmFpbGFibGVQYXRoO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBmb2xkZXIgc2FmZWx5IGluIHRoZSBzcGVjaWZpZWQgcGF0aC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZm9sZGVyIHRvIGNyZWF0ZS5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvbGRlciB3YXMgY3JlYXRlZC5cbiAqIEB0aHJvd3MgSWYgYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGNyZWF0aW5nIHRoZSBmb2xkZXIgYW5kIGl0IHN0aWxsIGRvZXNuJ3QgZXhpc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVGb2xkZXJTYWZlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGF3YWl0IGFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwYXRoKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZUZvbGRlcihwYXRoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghYXdhaXQgYXBwLnZhdWx0LmV4aXN0cyhwYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IGZpbGUgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZpbGUgdG8gY3JlYXRlLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgYWxsIGl0cyBjcmVhdGVkIHBhcmVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVUZW1wRmlsZShhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICBpZiAoZmlsZSkge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBmb2xkZXJDbGVhbnVwID0gYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIHBhcmVudEZvbGRlclBhdGgocGF0aCkpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCAnJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICBmaWxlID0gZ2V0RmlsZShhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZS5kZWxldGVkKSB7XG4gICAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKGZpbGUpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBmb2xkZXIgaW4gdGhlIHZhdWx0IHdpdGggcGFyZW50IGZvbGRlcnMgaWYgbmVlZGVkLlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIGZvbGRlciB0byBjcmVhdGUuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCB0byBkZWxldGUgdGhlIHRlbXBvcmFyeSBmb2xkZXIgYW5kIGFsbCBpdHMgY3JlYXRlZCBwYXJlbnRzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVGVtcEZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogUHJvbWlzZTwoKSA9PiBQcm9taXNlPHZvaWQ+PiB7XG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKGZvbGRlcikge1xuICAgIHJldHVybiBub29wQXN5bmM7XG4gIH1cblxuICBjb25zdCBkaXJQYXRoID0gcGFyZW50Rm9sZGVyUGF0aChwYXRoKTtcbiAgYXdhaXQgY3JlYXRlVGVtcEZvbGRlcihhcHAsIGRpclBhdGgpO1xuXG4gIGNvbnN0IGZvbGRlckNsZWFudXAgPSBhd2FpdCBjcmVhdGVUZW1wRm9sZGVyKGFwcCwgcGFyZW50Rm9sZGVyUGF0aChwYXRoKSk7XG5cbiAgYXdhaXQgY3JlYXRlRm9sZGVyU2FmZShhcHAsIHBhdGgpO1xuXG4gIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgZm9sZGVyID0gZ2V0Rm9sZGVyKGFwcCwgcGF0aCk7XG4gICAgaWYgKCFmb2xkZXIuZGVsZXRlZCkge1xuICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShmb2xkZXIpO1xuICAgIH1cbiAgICBhd2FpdCBmb2xkZXJDbGVhbnVwKCk7XG4gIH07XG59XG5cbi8qKlxuICogR2V0cyBhbiBhdmFpbGFibGUgcGF0aCBmb3IgYSBmaWxlIGluIHRoZSB2YXVsdC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byBnZXQgYW4gYXZhaWxhYmxlIHBhdGggZm9yLlxuICogQHJldHVybnMgVGhlIGF2YWlsYWJsZSBwYXRoIGZvciB0aGUgZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF2YWlsYWJsZVBhdGgoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGV4dCA9IGV4dG5hbWUocGF0aCk7XG4gIHJldHVybiBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKGRpcm5hbWUocGF0aCksIGJhc2VuYW1lKHBhdGgsIGV4dCkpLCBleHQuc2xpY2UoMSkpO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyBhbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBmcm9tIHRoZSBhcHAncyB2YXVsdCBhbmQgc29ydHMgdGhlbSBhbHBoYWJldGljYWxseSBieSB0aGVpciBmaWxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBNYXJrZG93biBmaWxlcyBzb3J0ZWQgYnkgZmlsZSBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFya2Rvd25GaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldE1hcmtkb3duRmlsZXMoKS5zb3J0KChhLCBiKSA9PiBhLnBhdGgubG9jYWxlQ29tcGFyZShiLnBhdGgpKTtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgYW4gYXJyYXkgb2YgYWxsIG5vdGUgZmlsZXMgZnJvbSB0aGUgYXBwJ3MgdmF1bHQgYW5kIHNvcnRzIHRoZW0gYWxwaGFiZXRpY2FsbHkgYnkgdGhlaXIgZmlsZSBwYXRoLlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBhbGwgbm90ZSBmaWxlcyBpbiB0aGUgdmF1bHQgc29ydGVkIGJ5IGZpbGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vdGVGaWxlc1NvcnRlZChhcHA6IEFwcCk6IFRGaWxlW10ge1xuICByZXR1cm4gYXBwLnZhdWx0LmdldEFsbExvYWRlZEZpbGVzKCkuZmlsdGVyKChmaWxlKSA9PiBpc0ZpbGUoZmlsZSkgJiYgaXNOb3RlKGFwcCwgZmlsZSkpLnNvcnQoKGEsIGIpID0+IGEucGF0aC5sb2NhbGVDb21wYXJlKGIucGF0aCkpIGFzIFRGaWxlW107XG59XG5cbi8qKlxuICogR2V0cyBhIHNhZmUgcmVuYW1lIHBhdGggZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLlxuICogQHBhcmFtIG9sZFBhdGhPckZpbGUgLSBUaGUgb2xkIHBhdGggb3IgZmlsZSB0byByZW5hbWUuXG4gKiBAcGFyYW0gbmV3UGF0aCAtIFRoZSBuZXcgcGF0aCB0byByZW5hbWUgdGhlIGZpbGUgdG8uXG4gKiBAcmV0dXJucyBUaGUgc2FmZSByZW5hbWUgcGF0aCBmb3IgdGhlIGZpbGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYWZlUmVuYW1lUGF0aChhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgb2xkUGF0aCA9IGdldFBhdGgoYXBwLCBvbGRQYXRoT3JGaWxlKTtcblxuICBpZiAoYXBwLnZhdWx0LmFkYXB0ZXIuaW5zZW5zaXRpdmUpIHtcbiAgICBsZXQgZm9sZGVyUGF0aCA9IGRpcm5hbWUobmV3UGF0aCk7XG4gICAgbGV0IG5vbkV4aXN0aW5nUGF0aCA9IGJhc2VuYW1lKG5ld1BhdGgpO1xuICAgIGxldCBmb2xkZXI6IG51bGwgfCBURm9sZGVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGZvbGRlclBhdGgsIHRydWUpO1xuICAgICAgaWYgKGZvbGRlcikge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIG5vbkV4aXN0aW5nUGF0aCA9IGpvaW4oYmFzZW5hbWUoZm9sZGVyUGF0aCksIG5vbkV4aXN0aW5nUGF0aCk7XG4gICAgICBmb2xkZXJQYXRoID0gZGlybmFtZShmb2xkZXJQYXRoKTtcbiAgICB9XG4gICAgbmV3UGF0aCA9IGpvaW4oZm9sZGVyLmdldFBhcmVudFByZWZpeCgpLCBub25FeGlzdGluZ1BhdGgpO1xuICB9XG5cbiAgaWYgKG9sZFBhdGgudG9Mb3dlckNhc2UoKSA9PT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cblxuICByZXR1cm4gZ2V0QXZhaWxhYmxlUGF0aChhcHAsIG5ld1BhdGgpO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZvbGRlciBpcyBlbXB0eS5cbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRm9sZGVyIC0gVGhlIHBhdGggb3IgZm9sZGVyIHRvIGNoZWNrLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZm9sZGVyIGlzIGVtcHR5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaXNFbXB0eUZvbGRlcihhcHA6IEFwcCwgcGF0aE9yRm9sZGVyOiBQYXRoT3JGb2xkZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgbGlzdGVkRmlsZXMgPSBhd2FpdCBsaXN0U2FmZShhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGb2xkZXIpKTtcbiAgcmV0dXJuIGxpc3RlZEZpbGVzLmZpbGVzLmxlbmd0aCA9PT0gMCAmJiBsaXN0ZWRGaWxlcy5mb2xkZXJzLmxlbmd0aCA9PT0gMDtcbn1cblxuLyoqXG4gKiBTYWZlbHkgbGlzdHMgdGhlIGZpbGVzIGFuZCBmb2xkZXJzIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBpbiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGb2xkZXIgLSBUaGUgcGF0aCBvciBmb2xkZXIgdG8gbGlzdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYExpc3RlZEZpbGVzYCBvYmplY3QgY29udGFpbmluZyB0aGUgbGlzdGVkIGZpbGVzIGFuZCBmb2xkZXJzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbGlzdFNhZmUoYXBwOiBBcHAsIHBhdGhPckZvbGRlcjogUGF0aE9yRm9sZGVyKTogUHJvbWlzZTxMaXN0ZWRGaWxlcz4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZvbGRlcik7XG4gIGNvbnN0IEVNUFRZID0geyBmaWxlczogW10sIGZvbGRlcnM6IFtdIH07XG5cbiAgaWYgKChhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5zdGF0KHBhdGgpKT8udHlwZSAhPT0gJ2ZvbGRlcicpIHtcbiAgICByZXR1cm4gRU1QVFk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBhcHAudmF1bHQuYWRhcHRlci5saXN0KHBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGF3YWl0IGFwcC52YXVsdC5leGlzdHMocGF0aCkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIHJldHVybiBFTVBUWTtcbiAgfVxufVxuXG4vKipcbiAqIFByb2Nlc3NlcyBhIGZpbGUgd2l0aCByZXRyeSBsb2dpYywgdXBkYXRpbmcgaXRzIGNvbnRlbnQgYmFzZWQgb24gYSBwcm92aWRlZCB2YWx1ZSBvciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIGFwcGxpY2F0aW9uIGluc3RhbmNlLCB0eXBpY2FsbHkgdXNlZCBmb3IgYWNjZXNzaW5nIHRoZSB2YXVsdC5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSB0byBiZSBwcm9jZXNzZWQuIEl0IGNhbiBiZSBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggb3IgYSBmaWxlIG9iamVjdC5cbiAqIEBwYXJhbSBuZXdDb250ZW50UHJvdmlkZXIgLSBBIHZhbHVlIHByb3ZpZGVyIHRoYXQgcmV0dXJucyB0aGUgbmV3IGNvbnRlbnQgYmFzZWQgb24gdGhlIG9sZCBjb250ZW50IG9mIHRoZSBmaWxlLlxuICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgb2xkIGNvbnRlbnQgYXMgYW4gYXJndW1lbnQgYW5kIHJldHVybnMgdGhlIG5ldyBjb250ZW50LlxuICogSWYgZnVuY3Rpb24gaXMgcHJvdmlkZWQsIGl0IHNob3VsZCByZXR1cm4gYG51bGxgIGlmIHRoZSBwcm9jZXNzIHNob3VsZCBiZSByZXRyaWVkLlxuICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBvcHRpb25zIGZvciBwcm9jZXNzaW5nL3JldHJ5aW5nIHRoZSBvcGVyYXRpb24uXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJvY2VzcyBpcyBjb21wbGV0ZS5cbiAqXG4gKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHByb2Nlc3MgZmFpbHMgYWZ0ZXIgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcmV0cmllcyBvciB0aW1lb3V0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvY2VzcyhcbiAgYXBwOiBBcHAsXG4gIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsXG4gIG5ld0NvbnRlbnRQcm92aWRlcjogVmFsdWVQcm92aWRlcjxudWxsIHwgc3RyaW5nLCBbc3RyaW5nXT4sXG4gIG9wdGlvbnM6IFByb2Nlc3NPcHRpb25zID0ge31cbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IHRydWVcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ub3B0aW9ucyB9O1xuXG4gIGF3YWl0IHJldHJ5V2l0aFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9sZENvbnRlbnQgPSBhd2FpdCByZWFkU2FmZShhcHAsIHBhdGhPckZpbGUpO1xuXG4gICAgaWYgKG9sZENvbnRlbnQgPT09IG51bGwpIHtcbiAgICAgIHJldHVybiBoYW5kbGVNaXNzaW5nRmlsZSgpO1xuICAgIH1cblxuICAgIGNvbnN0IG5ld0NvbnRlbnQgPSBhd2FpdCByZXNvbHZlVmFsdWUobmV3Q29udGVudFByb3ZpZGVyLCBvbGRDb250ZW50KTtcbiAgICBpZiAobmV3Q29udGVudCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGxldCBpc1N1Y2Nlc3MgPSB0cnVlO1xuICAgIGNvbnN0IGRvZXNGaWxlRXhpc3QgPSBhd2FpdCBpbnZva2VGaWxlQWN0aW9uU2FmZShhcHAsIHBhdGhPckZpbGUsIGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICBhd2FpdCBhcHAudmF1bHQucHJvY2VzcyhmaWxlLCAoY29udGVudCkgPT4ge1xuICAgICAgICBpZiAoY29udGVudCAhPT0gb2xkQ29udGVudCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignQ29udGVudCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgcmVhZC4gUmV0cnlpbmcuLi4nLCB7XG4gICAgICAgICAgICBhY3R1YWxDb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgZXhwZWN0ZWRDb250ZW50OiBvbGRDb250ZW50LFxuICAgICAgICAgICAgcGF0aDogZmlsZS5wYXRoXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaXNTdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3Q29udGVudDtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKCFkb2VzRmlsZUV4aXN0KSB7XG4gICAgICByZXR1cm4gaGFuZGxlTWlzc2luZ0ZpbGUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaXNTdWNjZXNzO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlTWlzc2luZ0ZpbGUoKTogYm9vbGVhbiB7XG4gICAgICBpZiAoZnVsbE9wdGlvbnMuc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGUpIHtcbiAgICAgICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlICcke3BhdGh9JyBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSwgZnVsbE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIFJlYWRzIHRoZSBjb250ZW50IG9mIGEgZmlsZSBzYWZlbHkgZnJvbSB0aGUgdmF1bHQuXG4gKlxuICogSXQgY292ZXJzIHRoZSBjYXNlIHdoZW4gdGhlIGZpbGUgd2FzIHJlbW92ZWQgZHVyaW5nIHRoZSByZWFkaW5nLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gcmVhZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIGBudWxsYCBpZiB0aGUgZmlsZSBpcyBtaXNzaW5nIG9yIGRlbGV0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWFkU2FmZShhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICBsZXQgY29udGVudDogbnVsbCB8IHN0cmluZyA9IG51bGw7XG4gIGF3YWl0IGludm9rZUZpbGVBY3Rpb25TYWZlKGFwcCwgcGF0aE9yRmlsZSwgYXN5bmMgKGZpbGUpID0+IHtcbiAgICBjb250ZW50ID0gYXdhaXQgYXBwLnZhdWx0LnJlYWQoZmlsZSk7XG4gIH0pO1xuICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBSZW5hbWVzIGEgZmlsZSBzYWZlbHkgaW4gdGhlIHZhdWx0LlxuICogSWYgdGhlIG5ldyBwYXRoIGFscmVhZHkgZXhpc3RzLCB0aGUgZmlsZSB3aWxsIGJlIHJlbmFtZWQgdG8gYW4gYXZhaWxhYmxlIHBhdGguXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvbGRQYXRoT3JGaWxlIC0gVGhlIG9sZCBwYXRoIG9yIGZpbGUgdG8gcmVuYW1lLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgbmV3IHBhdGggdG8gcmVuYW1lIHRoZSBmaWxlIHRvLlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG5ldyBwYXRoIG9mIHRoZSBmaWxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuYW1lU2FmZShhcHA6IEFwcCwgb2xkUGF0aE9yRmlsZTogUGF0aE9yRmlsZSwgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgb2xkRmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoT3JGaWxlLCBmYWxzZSwgdHJ1ZSk7XG5cbiAgY29uc3QgbmV3QXZhaWxhYmxlUGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aE9yRmlsZSwgbmV3UGF0aCk7XG5cbiAgaWYgKG9sZEZpbGUucGF0aC50b0xvd2VyQ2FzZSgpID09PSBuZXdBdmFpbGFibGVQYXRoLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBpZiAob2xkRmlsZS5wYXRoICE9PSBuZXdQYXRoKSB7XG4gICAgICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKG9sZEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbiAgfVxuXG4gIGNvbnN0IG5ld0ZvbGRlclBhdGggPSBwYXJlbnRGb2xkZXJQYXRoKG5ld0F2YWlsYWJsZVBhdGgpO1xuICBhd2FpdCBjcmVhdGVGb2xkZXJTYWZlKGFwcCwgbmV3Rm9sZGVyUGF0aCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBhcHAudmF1bHQucmVuYW1lKG9sZEZpbGUsIG5ld0F2YWlsYWJsZVBhdGgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFhd2FpdCBhcHAudmF1bHQuZXhpc3RzKG5ld0F2YWlsYWJsZVBhdGgpIHx8IGF3YWl0IGFwcC52YXVsdC5leGlzdHMob2xkRmlsZS5wYXRoKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QXZhaWxhYmxlUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW52b2tlRmlsZUFjdGlvblNhZmUoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIGZpbGVBY3Rpb246IChmaWxlOiBURmlsZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICBsZXQgZmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBwYXRoKTtcbiAgaWYgKCFmaWxlIHx8IGZpbGUuZGVsZXRlZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IGZpbGVBY3Rpb24oZmlsZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBmaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhdGgpO1xuICAgIGlmICghZmlsZSB8fCBmaWxlLmRlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdGhyb3cgZTtc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
@@ -27,5 +27,6 @@ export * as Reference from './Reference.mjs';
27
27
  export * as RenameDeleteHandler from './RenameDeleteHandler.mjs';
28
28
  export * as ResourceUrl from './ResourceUrl.mjs';
29
29
  export * as SettingEx from './SettingEx.mjs';
30
+ export * as ValidationMessage from './ValidationMessage.mjs';
30
31
  export * as Vault from './Vault.mjs';
31
32
  export * as VaultEx from './VaultEx.mjs';
@@ -34,6 +34,7 @@ import * as Reference from "./Reference.mjs";
34
34
  import * as RenameDeleteHandler from "./RenameDeleteHandler.mjs";
35
35
  import * as ResourceUrl from "./ResourceUrl.mjs";
36
36
  import * as SettingEx from "./SettingEx.mjs";
37
+ import * as ValidationMessage from "./ValidationMessage.mjs";
37
38
  import * as Vault from "./Vault.mjs";
38
39
  import * as VaultEx from "./VaultEx.mjs";
39
40
  export {
@@ -66,7 +67,8 @@ export {
66
67
  RenameDeleteHandler,
67
68
  ResourceUrl,
68
69
  SettingEx,
70
+ ValidationMessage,
69
71
  Vault,
70
72
  VaultEx
71
73
  };
72
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgQXBwIGZyb20gJy4vQXBwLnRzJztcbmV4cG9ydCAqIGFzIEF0dGFjaG1lbnRQYXRoIGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuZXhwb3J0ICogYXMgQmFja2xpbmsgZnJvbSAnLi9CYWNrbGluay50cyc7XG5leHBvcnQgKiBhcyBDYWxsb3V0IGZyb20gJy4vQ2FsbG91dC50cyc7XG5leHBvcnQgKiBhcyBDb21wb25lbnRzIGZyb20gJy4vQ29tcG9uZW50cy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyBEYXRhdmlldyBmcm9tICcuL0RhdGF2aWV3LnRzJztcbmV4cG9ydCAqIGFzIERhdGF2aWV3TGluayBmcm9tICcuL0RhdGF2aWV3TGluay50cyc7XG5leHBvcnQgKiBhcyBGaWxlQ2hhbmdlIGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5leHBvcnQgKiBhcyBGaWxlTWFuYWdlciBmcm9tICcuL0ZpbGVNYW5hZ2VyLnRzJztcbmV4cG9ydCAqIGFzIEZpbGVTeXN0ZW0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmV4cG9ydCAqIGFzIEZyb250bWF0dGVyIGZyb20gJy4vRnJvbnRtYXR0ZXIudHMnO1xuZXhwb3J0ICogYXMgTGluayBmcm9tICcuL0xpbmsudHMnO1xuZXhwb3J0ICogYXMgTG9nZ2VyIGZyb20gJy4vTG9nZ2VyLnRzJztcbmV4cG9ydCAqIGFzIExvb3AgZnJvbSAnLi9Mb29wLnRzJztcbmV4cG9ydCAqIGFzIE1hcmtkb3duIGZyb20gJy4vTWFya2Rvd24udHMnO1xuZXhwb3J0ICogYXMgTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IgZnJvbSAnLi9NYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3Nvci50cyc7XG5leHBvcnQgKiBhcyBNYXJrZG93blZpZXcgZnJvbSAnLi9NYXJrZG93blZpZXcudHMnO1xuZXhwb3J0ICogYXMgTWV0YWRhdGFDYWNoZSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuZXhwb3J0ICogYXMgTW9kYWxzIGZyb20gJy4vTW9kYWxzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzIE1vbmtleUFyb3VuZCBmcm9tICcuL01vbmtleUFyb3VuZC50cyc7XG5leHBvcnQgKiBhcyBPYnNpZGlhblNldHRpbmdzIGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyBQZGYgZnJvbSAnLi9QZGYudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gJy4vUGx1Z2luL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzIFF1ZXVlIGZyb20gJy4vUXVldWUudHMnO1xuZXhwb3J0ICogYXMgUmVhY3QgZnJvbSAnLi9SZWFjdC9pbmRleC50cyc7XG5leHBvcnQgKiBhcyBSZWZlcmVuY2UgZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuZXhwb3J0ICogYXMgUmVuYW1lRGVsZXRlSGFuZGxlciBmcm9tICcuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgUmVzb3VyY2VVcmwgZnJvbSAnLi9SZXNvdXJjZVVybC50cyc7XG5leHBvcnQgKiBhcyBTZXR0aW5nRXggZnJvbSAnLi9TZXR0aW5nRXgudHMnO1xuZXhwb3J0ICogYXMgVmF1bHQgZnJvbSAnLi9WYXVsdC50cyc7XG5leHBvcnQgKiBhcyBWYXVsdEV4IGZyb20gJy4vVmF1bHRFeC50cyc7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBRUEsWUFBWSxTQUFTO0FBQ3JCLFlBQVksb0JBQW9CO0FBQ2hDLFlBQVksY0FBYztBQUMxQixZQUFZLGFBQWE7QUFDekIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxjQUFjO0FBQzFCLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksZ0JBQWdCO0FBQzVCLFlBQVksaUJBQWlCO0FBQzdCLFlBQVksZ0JBQWdCO0FBQzVCLFlBQVksaUJBQWlCO0FBQzdCLFlBQVksVUFBVTtBQUN0QixZQUFZLFlBQVk7QUFDeEIsWUFBWSxVQUFVO0FBQ3RCLFlBQVksY0FBYztBQUMxQixZQUFZLGdDQUFnQztBQUM1QyxZQUFZLGtCQUFrQjtBQUM5QixZQUFZLG1CQUFtQjtBQUMvQixZQUFZLFlBQVk7QUFDeEIsWUFBWSxrQkFBa0I7QUFDOUIsWUFBWSxzQkFBc0I7QUFDbEMsWUFBWSxTQUFTO0FBQ3JCLFlBQVksWUFBWTtBQUN4QixZQUFZLFdBQVc7QUFDdkIsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksZUFBZTtBQUMzQixZQUFZLHlCQUF5QjtBQUNyQyxZQUFZLGlCQUFpQjtBQUM3QixZQUFZLGVBQWU7QUFDM0IsWUFBWSxXQUFXO0FBQ3ZCLFlBQVksYUFBYTsiLAogICJuYW1lcyI6IFtdCn0K
74
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKiBUSElTIElTIEEgR0VORVJBVEVEL0JVTkRMRUQgRklMRSBCWSBCVUlMRCBTQ1JJUFQgKi9cblxuZXhwb3J0ICogYXMgQXBwIGZyb20gJy4vQXBwLnRzJztcbmV4cG9ydCAqIGFzIEF0dGFjaG1lbnRQYXRoIGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuZXhwb3J0ICogYXMgQmFja2xpbmsgZnJvbSAnLi9CYWNrbGluay50cyc7XG5leHBvcnQgKiBhcyBDYWxsb3V0IGZyb20gJy4vQ2FsbG91dC50cyc7XG5leHBvcnQgKiBhcyBDb21wb25lbnRzIGZyb20gJy4vQ29tcG9uZW50cy9pbmRleC50cyc7XG5leHBvcnQgKiBhcyBEYXRhdmlldyBmcm9tICcuL0RhdGF2aWV3LnRzJztcbmV4cG9ydCAqIGFzIERhdGF2aWV3TGluayBmcm9tICcuL0RhdGF2aWV3TGluay50cyc7XG5leHBvcnQgKiBhcyBGaWxlQ2hhbmdlIGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5leHBvcnQgKiBhcyBGaWxlTWFuYWdlciBmcm9tICcuL0ZpbGVNYW5hZ2VyLnRzJztcbmV4cG9ydCAqIGFzIEZpbGVTeXN0ZW0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmV4cG9ydCAqIGFzIEZyb250bWF0dGVyIGZyb20gJy4vRnJvbnRtYXR0ZXIudHMnO1xuZXhwb3J0ICogYXMgTGluayBmcm9tICcuL0xpbmsudHMnO1xuZXhwb3J0ICogYXMgTG9nZ2VyIGZyb20gJy4vTG9nZ2VyLnRzJztcbmV4cG9ydCAqIGFzIExvb3AgZnJvbSAnLi9Mb29wLnRzJztcbmV4cG9ydCAqIGFzIE1hcmtkb3duIGZyb20gJy4vTWFya2Rvd24udHMnO1xuZXhwb3J0ICogYXMgTWFya2Rvd25Db2RlQmxvY2tQcm9jZXNzb3IgZnJvbSAnLi9NYXJrZG93bkNvZGVCbG9ja1Byb2Nlc3Nvci50cyc7XG5leHBvcnQgKiBhcyBNYXJrZG93blZpZXcgZnJvbSAnLi9NYXJrZG93blZpZXcudHMnO1xuZXhwb3J0ICogYXMgTWV0YWRhdGFDYWNoZSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuZXhwb3J0ICogYXMgTW9kYWxzIGZyb20gJy4vTW9kYWxzL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzIE1vbmtleUFyb3VuZCBmcm9tICcuL01vbmtleUFyb3VuZC50cyc7XG5leHBvcnQgKiBhcyBPYnNpZGlhblNldHRpbmdzIGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5leHBvcnQgKiBhcyBQZGYgZnJvbSAnLi9QZGYudHMnO1xuZXhwb3J0ICogYXMgUGx1Z2luIGZyb20gJy4vUGx1Z2luL2luZGV4LnRzJztcbmV4cG9ydCAqIGFzIFF1ZXVlIGZyb20gJy4vUXVldWUudHMnO1xuZXhwb3J0ICogYXMgUmVhY3QgZnJvbSAnLi9SZWFjdC9pbmRleC50cyc7XG5leHBvcnQgKiBhcyBSZWZlcmVuY2UgZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuZXhwb3J0ICogYXMgUmVuYW1lRGVsZXRlSGFuZGxlciBmcm9tICcuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMnO1xuZXhwb3J0ICogYXMgUmVzb3VyY2VVcmwgZnJvbSAnLi9SZXNvdXJjZVVybC50cyc7XG5leHBvcnQgKiBhcyBTZXR0aW5nRXggZnJvbSAnLi9TZXR0aW5nRXgudHMnO1xuZXhwb3J0ICogYXMgVmFsaWRhdGlvbk1lc3NhZ2UgZnJvbSAnLi9WYWxpZGF0aW9uTWVzc2FnZS50cyc7XG5leHBvcnQgKiBhcyBWYXVsdCBmcm9tICcuL1ZhdWx0LnRzJztcbmV4cG9ydCAqIGFzIFZhdWx0RXggZnJvbSAnLi9WYXVsdEV4LnRzJztcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFFQSxZQUFZLFNBQVM7QUFDckIsWUFBWSxvQkFBb0I7QUFDaEMsWUFBWSxjQUFjO0FBQzFCLFlBQVksYUFBYTtBQUN6QixZQUFZLGdCQUFnQjtBQUM1QixZQUFZLGNBQWM7QUFDMUIsWUFBWSxrQkFBa0I7QUFDOUIsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxnQkFBZ0I7QUFDNUIsWUFBWSxpQkFBaUI7QUFDN0IsWUFBWSxVQUFVO0FBQ3RCLFlBQVksWUFBWTtBQUN4QixZQUFZLFVBQVU7QUFDdEIsWUFBWSxjQUFjO0FBQzFCLFlBQVksZ0NBQWdDO0FBQzVDLFlBQVksa0JBQWtCO0FBQzlCLFlBQVksbUJBQW1CO0FBQy9CLFlBQVksWUFBWTtBQUN4QixZQUFZLGtCQUFrQjtBQUM5QixZQUFZLHNCQUFzQjtBQUNsQyxZQUFZLFNBQVM7QUFDckIsWUFBWSxZQUFZO0FBQ3hCLFlBQVksV0FBVztBQUN2QixZQUFZLFdBQVc7QUFDdkIsWUFBWSxlQUFlO0FBQzNCLFlBQVkseUJBQXlCO0FBQ3JDLFlBQVksaUJBQWlCO0FBQzdCLFlBQVksZUFBZTtBQUMzQixZQUFZLHVCQUF1QjtBQUNuQyxZQUFZLFdBQVc7QUFDdkIsWUFBWSxhQUFhOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../../dist/lib/cjs/obsidian/Components/PlaceholderComponent.cjs",
3
+ "module": "../../../dist/lib/esm/obsidian/Components/PlaceholderComponent.mjs",
4
+ "type": "module",
5
+ "types": "../../../dist/lib/cjs/obsidian/Components/PlaceholderComponent.d.cts"
6
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
- "main": "../../../dist/lib/cjs/obsidian/Plugin/PluginSettingsBase.cjs",
3
- "module": "../../../dist/lib/esm/obsidian/Plugin/PluginSettingsBase.mjs",
2
+ "main": "../../../dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.cjs",
3
+ "module": "../../../dist/lib/esm/obsidian/Plugin/PluginSettingsManagerBase.mjs",
4
4
  "type": "module",
5
- "types": "../../../dist/lib/cjs/obsidian/Plugin/PluginSettingsBase.d.cts"
5
+ "types": "../../../dist/lib/cjs/obsidian/Plugin/PluginSettingsManagerBase.d.cts"
6
6
  }
@@ -0,0 +1,6 @@
1
+ {
2
+ "main": "../../dist/lib/cjs/obsidian/ValidationMessage.cjs",
3
+ "module": "../../dist/lib/esm/obsidian/ValidationMessage.mjs",
4
+ "type": "module",
5
+ "types": "../../dist/lib/cjs/obsidian/ValidationMessage.d.cts"
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "obsidian-dev-utils",
3
- "version": "22.1.0",
3
+ "version": "22.1.1-beta.10",
4
4
  "description": "This is the collection of useful functions that you can use for your Obsidian plugin development",
5
5
  "keywords": [
6
6
  "obsidian"
@@ -431,13 +431,13 @@
431
431
  "@types/babel__core": "^7.20.5",
432
432
  "@types/doctrine": "^0.0.9",
433
433
  "@types/eslint": "^9.6.1",
434
- "@types/luxon": "^3.6.0",
435
- "@types/node": "^22.13.17",
434
+ "@types/luxon": "^3.6.2",
435
+ "@types/node": "^22.14.0",
436
436
  "@types/parsimmon": "^1.10.9",
437
437
  "@types/path-browserify": "^1.0.3",
438
438
  "@types/picomatch": "^4.0.0",
439
439
  "@types/pug": "^2.0.10",
440
- "@types/react": "^19.0.12",
440
+ "@types/react": "^19.1.0",
441
441
  "@types/shell-quote": "^1.7.5",
442
442
  "@typescript-eslint/eslint-plugin": "^8.29.0",
443
443
  "@typescript-eslint/parser": "^8.29.0",
@@ -456,7 +456,7 @@
456
456
  "eslint-import-resolver-typescript": "^4.3.1",
457
457
  "eslint-plugin-import-x": "^4.10.0",
458
458
  "eslint-plugin-modules-newlines": "^0.0.7",
459
- "eslint-plugin-perfectionist": "^4.10.1",
459
+ "eslint-plugin-perfectionist": "^4.11.0",
460
460
  "eslint-plugin-tsdoc": "^0.4.0",
461
461
  "eslint-plugin-verify-tsdoc": "^1.0.20",
462
462
  "eventemitter3": "^5.0.1",
@@ -477,12 +477,12 @@
477
477
  "remark": "^15.0.1",
478
478
  "remark-parse": "^11.0.0",
479
479
  "remark-wiki-link": "^2.0.1",
480
- "sass": "^1.86.1",
480
+ "sass": "^1.86.3",
481
481
  "shell-quote": "^1.8.2",
482
482
  "svelte-check": "^4.1.5",
483
483
  "svelte-preprocess": "^6.0.3",
484
484
  "tsx": "^4.19.3",
485
- "type-fest": "^4.39.0",
485
+ "type-fest": "^4.39.1",
486
486
  "typescript": "^5.8.2",
487
487
  "typescript-eslint": "^8.29.0"
488
488
  },
@@ -1,14 +0,0 @@
1
- /**
2
- * @packageDocumentation EmptySettings
3
- * Empty settings class.
4
- */
5
- import { PluginSettingsBase } from './PluginSettingsBase.cjs';
6
- /**
7
- * @packageDocumentation EmptySettings
8
- * Empty settings class.
9
- */
10
- /**
11
- * Empty settings class.
12
- */
13
- export declare class EmptySettings extends PluginSettingsBase {
14
- }