obsidian-dev-utils 74.1.0 → 75.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +1 -0
  3. package/dist/dev/main.js +132 -85
  4. package/dist/lib/cjs/async.cjs +37 -5
  5. package/dist/lib/cjs/async.d.cts +21 -0
  6. package/dist/lib/cjs/debug.cjs +4 -4
  7. package/dist/lib/cjs/index.cjs +4 -1
  8. package/dist/lib/cjs/index.d.cts +1 -0
  9. package/dist/lib/cjs/jest-setup.cjs +115 -0
  10. package/dist/lib/cjs/jest-setup.d.cts +13 -0
  11. package/dist/lib/cjs/library.cjs +1 -1
  12. package/dist/lib/cjs/object-utils.cjs +6 -3
  13. package/dist/lib/cjs/object-utils.d.cts +3 -2
  14. package/dist/lib/cjs/obsidian/app.cjs +3 -19
  15. package/dist/lib/cjs/obsidian/app.d.cts +0 -11
  16. package/dist/lib/cjs/obsidian/callout.cjs +1 -2
  17. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.cjs +2 -4
  18. package/dist/lib/cjs/obsidian/components/generate-markdown-link-default-params-component.d.cts +0 -6
  19. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +25 -6
  20. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +54 -5
  21. package/dist/lib/cjs/obsidian/components/plugin-context-component.cjs +2 -2
  22. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -3
  23. package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +5 -8
  24. package/dist/lib/cjs/obsidian/constructors/getDomEventsHandlersConstructor.cjs +1 -1
  25. package/dist/lib/cjs/obsidian/dataview.cjs +1 -1
  26. package/dist/lib/cjs/obsidian/dataview.d.cts +4 -3
  27. package/dist/lib/cjs/obsidian/file-change.cjs +1 -1
  28. package/dist/lib/cjs/obsidian/file-change.d.cts +9 -18
  29. package/dist/lib/cjs/obsidian/link.cjs +5 -5
  30. package/dist/lib/cjs/obsidian/link.d.cts +1 -2
  31. package/dist/lib/cjs/obsidian/markdown.cjs +1 -1
  32. package/dist/lib/cjs/obsidian/metadata-cache.cjs +6 -6
  33. package/dist/lib/cjs/obsidian/plugin/plugin-context.cjs +4 -4
  34. package/dist/lib/cjs/obsidian/plugin/plugin-context.d.cts +2 -3
  35. package/dist/lib/cjs/obsidian/queue.cjs +9 -10
  36. package/dist/lib/cjs/obsidian/queue.d.cts +1 -12
  37. package/dist/lib/cjs/obsidian-dev-utils-state.cjs +146 -0
  38. package/dist/lib/cjs/obsidian-dev-utils-state.d.cts +29 -0
  39. package/dist/lib/cjs/script-utils/fs.cjs +1 -1
  40. package/dist/lib/cjs/script-utils/fs.d.cts +16 -12
  41. package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +2 -1
  42. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +5 -21
  43. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +4 -1
  44. package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +1 -0
  45. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +315 -0
  46. package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.d.cts +35 -0
  47. package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +3 -1
  48. package/dist/lib/cjs/setup.cjs +145 -0
  49. package/dist/lib/cjs/setup.d.cts +44 -0
  50. package/dist/lib/cjs/strict-proxy.cjs +1 -1
  51. package/dist/lib/cjs/strict-proxy.d.cts +4 -2
  52. package/dist/lib/cjs/vitest-setup.cjs +115 -0
  53. package/dist/lib/cjs/vitest-setup.d.cts +11 -0
  54. package/dist/lib/esm/async.d.mts +21 -0
  55. package/dist/lib/esm/async.mjs +33 -4
  56. package/dist/lib/esm/debug.mjs +4 -4
  57. package/dist/lib/esm/index.d.mts +1 -0
  58. package/dist/lib/esm/index.mjs +3 -1
  59. package/dist/lib/esm/jest-setup.d.mts +13 -0
  60. package/dist/lib/esm/jest-setup.mjs +33 -0
  61. package/dist/lib/esm/library.mjs +1 -1
  62. package/dist/lib/esm/object-utils.d.mts +3 -2
  63. package/dist/lib/esm/object-utils.mjs +6 -3
  64. package/dist/lib/esm/obsidian/app.d.mts +0 -11
  65. package/dist/lib/esm/obsidian/app.mjs +2 -17
  66. package/dist/lib/esm/obsidian/callout.mjs +1 -2
  67. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.d.mts +0 -6
  68. package/dist/lib/esm/obsidian/components/generate-markdown-link-default-params-component.mjs +2 -4
  69. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +54 -5
  70. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +25 -6
  71. package/dist/lib/esm/obsidian/components/plugin-context-component.mjs +2 -2
  72. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -3
  73. package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +5 -8
  74. package/dist/lib/esm/obsidian/constructors/getDomEventsHandlersConstructor.mjs +1 -1
  75. package/dist/lib/esm/obsidian/dataview.d.mts +4 -3
  76. package/dist/lib/esm/obsidian/dataview.mjs +1 -1
  77. package/dist/lib/esm/obsidian/file-change.d.mts +9 -18
  78. package/dist/lib/esm/obsidian/file-change.mjs +1 -1
  79. package/dist/lib/esm/obsidian/link.d.mts +1 -2
  80. package/dist/lib/esm/obsidian/link.mjs +5 -5
  81. package/dist/lib/esm/obsidian/markdown.mjs +1 -1
  82. package/dist/lib/esm/obsidian/metadata-cache.mjs +6 -6
  83. package/dist/lib/esm/obsidian/plugin/plugin-context.d.mts +2 -3
  84. package/dist/lib/esm/obsidian/plugin/plugin-context.mjs +4 -4
  85. package/dist/lib/esm/obsidian/queue.d.mts +1 -12
  86. package/dist/lib/esm/obsidian/queue.mjs +9 -10
  87. package/dist/lib/esm/obsidian-dev-utils-state.d.mts +29 -0
  88. package/dist/lib/esm/obsidian-dev-utils-state.mjs +37 -0
  89. package/dist/lib/esm/script-utils/fs.d.mts +16 -12
  90. package/dist/lib/esm/script-utils/fs.mjs +1 -1
  91. package/dist/lib/esm/script-utils/linters/eslint-config.mjs +2 -1
  92. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +5 -21
  93. package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +1 -0
  94. package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +3 -1
  95. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.d.mts +35 -0
  96. package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +206 -0
  97. package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +3 -1
  98. package/dist/lib/esm/setup.d.mts +44 -0
  99. package/dist/lib/esm/setup.mjs +40 -0
  100. package/dist/lib/esm/strict-proxy.d.mts +4 -2
  101. package/dist/lib/esm/strict-proxy.mjs +1 -1
  102. package/dist/lib/esm/vitest-setup.d.mts +11 -0
  103. package/dist/lib/esm/vitest-setup.mjs +33 -0
  104. package/package.json +2 -1
  105. package/script-utils/linters/eslint-rules/no-unused-params-members/package.json +6 -0
@@ -13,9 +13,46 @@ import { ComponentEx } from './component-ex.mjs';
13
13
  *
14
14
  * @typeParam Obj - The object to patch.
15
15
  */
16
- export type Factories<Obj extends object> = Partial<{
17
- [Key in ConditionalKeys<Obj, GenericFunction | undefined>]: WrapperFactory<Extract<Obj[Key], GenericFunction | undefined>>;
18
- }>;
16
+ export type Factories<Obj extends object> = Partial<FullFactories<Obj>>;
17
+ /**
18
+ * Keys of `Obj` whose value is callable — a method, or a function-like object such as a `Debouncer`. These are the members
19
+ * accepted by {@link MonkeyAroundComponent#registerFunctionPatch}.
20
+ *
21
+ * @typeParam Obj - The object whose keys are filtered.
22
+ */
23
+ export type FunctionKeys<Obj extends object> = ConditionalKeys<Obj, GenericFunction | undefined> & keyof Obj;
24
+ /**
25
+ * Keys of `Obj` whose value is a plain function (a "real method"). Function-like objects that carry extra members are
26
+ * excluded — e.g. a `Debouncer` (which adds `cancel`/`run`) belongs to {@link MonkeyAroundComponent#registerFunctionPatch},
27
+ * not {@link MonkeyAroundComponent#registerMethodPatch}. The check is whether the member has any own keys beyond a bare
28
+ * function's (`Exclude<keyof T, keyof GenericFunction>` is `never`).
29
+ *
30
+ * @typeParam Obj - The object whose keys are filtered.
31
+ */
32
+ export type MethodKeys<Obj extends object> = MethodKeysMap<Obj>[FunctionKeys<Obj>];
33
+ /**
34
+ * Parameters passed to {@link MonkeyAroundComponent#registerFunctionPatch}.
35
+ *
36
+ * @typeParam Obj - The object to patch.
37
+ * @typeParam FunctionName - The function name to patch.
38
+ */
39
+ export interface MonkeyAroundComponentRegisterFunctionPatchParams<Obj extends object, FunctionName extends FunctionKeys<Obj>> {
40
+ /**
41
+ * The function name to patch.
42
+ */
43
+ readonly functionName: FunctionName;
44
+ /**
45
+ * The object to patch.
46
+ */
47
+ readonly obj: Obj;
48
+ /**
49
+ * Patch handler function that takes the original value and returns the patched value.
50
+ *
51
+ * @param originalValue - The original value of the function.
52
+ * @returns The patched value of the function.
53
+ */
54
+ patchHandler(originalValue: Obj[FunctionName]): Obj[FunctionName];
55
+ }
19
56
  /**
20
57
  * Parameters passed to {@link MonkeyAroundComponent#registerMethodPatch}.
21
58
  *
@@ -100,14 +137,26 @@ export interface PostPatchHandlerParams<Obj extends object, MethodName extends M
100
137
  readonly patchedMethod: ExtractFunction<Obj, MethodName>;
101
138
  }
102
139
  type ExtractFunction<Obj extends object, MethodName extends MethodKeys<Obj>> = GenericFunction<Parameters<Extract<Obj[MethodName], GenericFunction>>, ReturnType<Extract<Obj[MethodName], GenericFunction>>>;
103
- type MethodKeys<Obj extends object> = ConditionalKeys<Obj, Function | undefined> & keyof Obj;
140
+ type FullFactories<Obj extends object> = {
141
+ [Key in keyof Obj]: (originalValue: Obj[Key]) => Obj[Key];
142
+ };
143
+ type MethodKeysMap<Obj extends object> = {
144
+ [Key in FunctionKeys<Obj>]: [Exclude<keyof NonNullable<Obj[Key]>, keyof GenericFunction>] extends [never] ? Key : never;
145
+ };
104
146
  type Uninstaller = () => void;
105
- type WrapperFactory<T extends Function | undefined> = (next: T) => T;
106
147
  /**
107
148
  * A component that manages monkey-patches with lifecycle-bound cleanup.
108
149
  * All patches registered via this component are automatically uninstalled when the component unloads.
109
150
  */
110
151
  export declare class MonkeyAroundComponent extends ComponentEx {
152
+ /**
153
+ * Registers a patch for a single function-like member (a method, or a callable such as a `Debouncer`) using a simplified handler.
154
+ *
155
+ * @typeParam Obj - The object to patch.
156
+ * @typeParam FunctionName - The function name to patch.
157
+ * @param params - The parameters of the patch.
158
+ */
159
+ registerFunctionPatch<Obj extends object, const FunctionName extends FunctionKeys<Obj>>(params: MonkeyAroundComponentRegisterFunctionPatchParams<Obj, FunctionName>): void;
111
160
  /**
112
161
  * Registers a single-method patch using a simplified handler.
113
162
  *
@@ -22,9 +22,24 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { around as originalAround } from "monkey-around";
25
- import { getObsidianDevUtilsState } from "../app.mjs";
25
+ import { getObsidianDevUtilsState } from "../../obsidian-dev-utils-state.mjs";
26
26
  import { ComponentEx } from "./component-ex.mjs";
27
27
  class MonkeyAroundComponent extends ComponentEx {
28
+ /**
29
+ * Registers a patch for a single function-like member (a method, or a callable such as a `Debouncer`) using a simplified handler.
30
+ *
31
+ * @typeParam Obj - The object to patch.
32
+ * @typeParam FunctionName - The function name to patch.
33
+ * @param params - The parameters of the patch.
34
+ */
35
+ registerFunctionPatch(params) {
36
+ this.ensureLoaded();
37
+ const factories = {};
38
+ factories[params.functionName] = (originalValue) => {
39
+ return params.patchHandler(originalValue);
40
+ };
41
+ this.registerPatch(params.obj, factories);
42
+ }
28
43
  /**
29
44
  * Registers a single-method patch using a simplified handler.
30
45
  *
@@ -38,12 +53,16 @@ class MonkeyAroundComponent extends ComponentEx {
38
53
  const originalMethod = params.obj[params.methodName];
39
54
  getMonkeyAroundPatches().set(originalMethod, params.patchToken);
40
55
  }
41
- this.registerPatch(params.obj, {
42
- [params.methodName]: (originalMethod) => {
43
- return params.postPatchHandler?.({
56
+ this.registerFunctionPatch({
57
+ functionName: params.methodName,
58
+ obj: params.obj,
59
+ patchHandler: (originalMethodRaw) => {
60
+ const originalMethod = originalMethodRaw;
61
+ const finalPatchedMethod = params.postPatchHandler?.({
44
62
  originalMethod,
45
63
  patchedMethod
46
64
  }) ?? patchedMethod;
65
+ return finalPatchedMethod;
47
66
  function patchedMethod(...originalArgs) {
48
67
  const originalThis = this;
49
68
  return params.patchHandler({
@@ -79,11 +98,11 @@ function hasPatchToken(fn, patchToken) {
79
98
  return getMonkeyAroundPatches().get(fn) === patchToken;
80
99
  }
81
100
  function getMonkeyAroundPatches() {
82
- return getObsidianDevUtilsState(null, "monkeyAroundPatches", /* @__PURE__ */ new WeakMap()).value;
101
+ return getObsidianDevUtilsState("monkeyAroundPatches", /* @__PURE__ */ new WeakMap()).value;
83
102
  }
84
103
  export {
85
104
  MonkeyAroundComponent,
86
105
  around,
87
106
  hasPatchToken
88
107
  };
89
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBJbXByb3ZlZCB0eXBlLXNhZmUgd3JhcHBlciBvZiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbW9ua2V5LWFyb3VuZH0gbGlicmFyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbmFsS2V5cyB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFyb3VuZCBhcyBvcmlnaW5hbEFyb3VuZCB9IGZyb20gJ21vbmtleS1hcm91bmQnO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi8uLi90eXBlLnRzJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vYXBwLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG4vKipcbiAqIEEgdHlwZSBvZiB0aGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICovXG5leHBvcnQgdHlwZSBGYWN0b3JpZXM8T2JqIGV4dGVuZHMgb2JqZWN0PiA9IFBhcnRpYWw8XG4gIHtcbiAgICBbS2V5IGluIENvbmRpdGlvbmFsS2V5czxPYmosIEdlbmVyaWNGdW5jdGlvbiB8IHVuZGVmaW5lZD5dOiBXcmFwcGVyRmFjdG9yeTxFeHRyYWN0PE9ialtLZXldLCBHZW5lcmljRnVuY3Rpb24gfCB1bmRlZmluZWQ+PjtcbiAgfVxuPjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHBhc3NlZCB0byB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50I3JlZ2lzdGVyTWV0aG9kUGF0Y2h9LlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSB0byBwYXRjaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3Rlck1ldGhvZFBhdGNoUGFyYW1zPE9iaiBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8T2JqPj4ge1xuICAvKipcbiAgICogVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0aG9kTmFtZTogTWV0aG9kTmFtZTtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IG9iajogT2JqO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0Y2ggaGFuZGxlciBmdW5jdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoSGFuZGxlcjogUGF0Y2hIYW5kbGVyRm48T2JqLCBNZXRob2ROYW1lPjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgdG9rZW4gdG8gaWRlbnRpZnkgdGhlIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hUb2tlbj86IHN5bWJvbDtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgcG9zdC1wYXRjaCBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgcnVucyBhZnRlciB0aGUgcGF0Y2ggaXMgYXBwbGllZC5cbiAgICovXG4gIHJlYWRvbmx5IHBvc3RQYXRjaEhhbmRsZXI/OiBQb3N0UGF0Y2hIYW5kbGVyRm48T2JqLCBNZXRob2ROYW1lPjtcbn1cblxuLyoqXG4gKiBBIHBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBpbnRlcmNlcHRzIGNhbGxzIHRvIGEgbWV0aG9kIG9uIGFuIG9iamVjdC5cbiAqXG4gKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgdHlwZSBQYXRjaEhhbmRsZXJGbjxPYmogZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPE9iaj4+ID0gKFxuICBwYXJhbXM6IFBhdGNoSGFuZGxlclBhcmFtczxPYmosIE1ldGhvZE5hbWU+XG4pID0+IFJldHVyblR5cGU8RXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT4+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIGEge0BsaW5rIFBhdGNoSGFuZGxlckZufSBjYWxsYmFjay5cbiAqXG4gKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoSGFuZGxlclBhcmFtczxPYmogZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPE9iaj4+IHtcbiAgZmFsbGJhY2sodGhpczogdm9pZCk6IFJldHVyblR5cGU8RXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYXJndW1lbnRzIG9mIHRoZSBpbnRlcmNlcHRlZCBjYWxsLCBhcyBhIHR1cGxlLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxBcmdzOiBQYXJhbWV0ZXJzPEV4dHJhY3RGdW5jdGlvbjxPYmosIE1ldGhvZE5hbWU+PjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsICh1bnBhdGNoZWQpIG1ldGhvZC4gQ2FsbCB2aWEgYG9yaWdpbmFsRm4uY2FsbChvcmlnaW5hbFRoaXMsIC4uLm9yaWdpbmFsQXJncylgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxNZXRob2Q6IEV4dHJhY3RGdW5jdGlvbjxPYmosIE1ldGhvZE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgbWV0aG9kLCBidXQgd2l0aCB0aGUgYHRoaXNgIGNvbnRleHQgYWxyZWFkeSBib3VuZCB0byB0aGUgb3JpZ2luYWwgb2JqZWN0LiBDYWxsIHZpYSBgb3JpZ2luYWxNZXRob2RCb3VuZCguLi5vcmlnaW5hbEFyZ3MpYC5cbiAgICovXG4gIHJlYWRvbmx5IG9yaWdpbmFsTWV0aG9kQm91bmQ6IE9taXRUaGlzUGFyYW1ldGVyPEV4dHJhY3RGdW5jdGlvbjxPYmosIE1ldGhvZE5hbWU+PjtcblxuICAvKipcbiAgICogVGhlIG9yaWdpbmFsIGB0aGlzYCBjb250ZXh0IG9mIHRoZSBpbnRlcmNlcHRlZCBjYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxUaGlzOiBPYmo7XG59XG5cbi8qKlxuICogQSBwb3N0LXBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIGEgcGF0Y2ggaXMgYXBwbGllZC5cbiAqXG4gKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgdHlwZSBQb3N0UGF0Y2hIYW5kbGVyRm48T2JqIGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PiA9IChcbiAgcGFyYW1zOiBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPE9iaiwgTWV0aG9kTmFtZT5cbikgPT4gTWF5YmVSZXR1cm48RXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT4+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIGEge0BsaW5rIFBvc3RQYXRjaEhhbmRsZXJGbn0gY2FsbGJhY2suXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IGJlaW5nIHBhdGNoZWQuXG4gKiBAdHlwZVBhcmFtIE1ldGhvZE5hbWUgLSBUaGUgbWV0aG9kIG5hbWUgYmVpbmcgcGF0Y2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb3N0UGF0Y2hIYW5kbGVyUGFyYW1zPE9iaiBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8T2JqPj4ge1xuICAvKipcbiAgICogVGhlIG9yaWdpbmFsICh1bnBhdGNoZWQpIG1ldGhvZC4gQ2FsbCB2aWEgYG9yaWdpbmFsRm4uY2FsbChvcmlnaW5hbFRoaXMsIC4uLm9yaWdpbmFsQXJncylgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxNZXRob2Q6IEV4dHJhY3RGdW5jdGlvbjxPYmosIE1ldGhvZE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0Y2hlZCBtZXRob2QuXG4gICAqL1xuICByZWFkb25seSBwYXRjaGVkTWV0aG9kOiBFeHRyYWN0RnVuY3Rpb248T2JqLCBNZXRob2ROYW1lPjtcbn1cblxudHlwZSBFeHRyYWN0RnVuY3Rpb248T2JqIGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PiA9IEdlbmVyaWNGdW5jdGlvbjxQYXJhbWV0ZXJzPEV4dHJhY3Q8T2JqW01ldGhvZE5hbWVdLCBHZW5lcmljRnVuY3Rpb24+PiwgUmV0dXJuVHlwZTxFeHRyYWN0PE9ialtNZXRob2ROYW1lXSwgR2VuZXJpY0Z1bmN0aW9uPj4+O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVuc2FmZS1mdW5jdGlvbi10eXBlIC0tIFdlIG5lZWQgdG8gdXNlIGBGdW5jdGlvbmAgdHlwZSBhcyBhIGdlbmVyaWMgcmVzdHJpY3Rpb24uXG50eXBlIE1ldGhvZEtleXM8T2JqIGV4dGVuZHMgb2JqZWN0PiA9IENvbmRpdGlvbmFsS2V5czxPYmosIEZ1bmN0aW9uIHwgdW5kZWZpbmVkPiAmIGtleW9mIE9iajtcblxudHlwZSBPcmlnaW5hbEZhY3RvcmllczxPYmogZXh0ZW5kcyBHZW5lcmljT2JqZWN0PiA9IFBhcmFtZXRlcnM8dHlwZW9mIG9yaWdpbmFsQXJvdW5kPE9iaj4+WzFdO1xuXG50eXBlIFVuaW5zdGFsbGVyID0gKCkgPT4gdm9pZDtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnNhZmUtZnVuY3Rpb24tdHlwZSAtLSBXZSBuZWVkIHRvIHVzZSBgRnVuY3Rpb25gIHR5cGUgYXMgYSBnZW5lcmljIHJlc3RyaWN0aW9uLlxudHlwZSBXcmFwcGVyRmFjdG9yeTxUIGV4dGVuZHMgRnVuY3Rpb24gfCB1bmRlZmluZWQ+ID0gKG5leHQ6IFQpID0+IFQ7XG5cbi8qKlxuICogQSBjb21wb25lbnQgdGhhdCBtYW5hZ2VzIG1vbmtleS1wYXRjaGVzIHdpdGggbGlmZWN5Y2xlLWJvdW5kIGNsZWFudXAuXG4gKiBBbGwgcGF0Y2hlcyByZWdpc3RlcmVkIHZpYSB0aGlzIGNvbXBvbmVudCBhcmUgYXV0b21hdGljYWxseSB1bmluc3RhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIE1vbmtleUFyb3VuZENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHNpbmdsZS1tZXRob2QgcGF0Y2ggdXNpbmcgYSBzaW1wbGlmaWVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIHBhdGNoLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyTWV0aG9kUGF0Y2g8T2JqIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PihcbiAgICBwYXJhbXM6IE1vbmtleUFyb3VuZENvbXBvbmVudFJlZ2lzdGVyTWV0aG9kUGF0Y2hQYXJhbXM8T2JqLCBNZXRob2ROYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgaWYgKHBhcmFtcy5wYXRjaFRva2VuKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IHBhcmFtcy5vYmpbcGFyYW1zLm1ldGhvZE5hbWVdIGFzIEdlbmVyaWNGdW5jdGlvbjtcbiAgICAgIGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKS5zZXQob3JpZ2luYWxNZXRob2QsIHBhcmFtcy5wYXRjaFRva2VuKTtcbiAgICB9XG5cbiAgICB0eXBlIEZuID0gRXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT47XG5cbiAgICB0aGlzLnJlZ2lzdGVyUGF0Y2gocGFyYW1zLm9iaiwge1xuICAgICAgW3BhcmFtcy5tZXRob2ROYW1lXTogKG9yaWdpbmFsTWV0aG9kOiBGbik6IEZuID0+IHtcbiAgICAgICAgcmV0dXJuIHBhcmFtcy5wb3N0UGF0Y2hIYW5kbGVyPy4oe1xuICAgICAgICAgIG9yaWdpbmFsTWV0aG9kLFxuICAgICAgICAgIHBhdGNoZWRNZXRob2RcbiAgICAgICAgfSkgPz8gcGF0Y2hlZE1ldGhvZDtcbiAgICAgICAgZnVuY3Rpb24gcGF0Y2hlZE1ldGhvZCh0aGlzOiBPYmosIC4uLm9yaWdpbmFsQXJnczogUGFyYW1ldGVyczxGbj4pOiBSZXR1cm5UeXBlPEZuPiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbnNpc3RlbnQtdGhpcywgQHR5cGVzY3JpcHQtZXNsaW50L25vLXRoaXMtYWxpYXMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGB0aGlzYCBjb250ZXh0LlxuICAgICAgICAgIGNvbnN0IG9yaWdpbmFsVGhpcyA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIHBhcmFtcy5wYXRjaEhhbmRsZXIoe1xuICAgICAgICAgICAgZmFsbGJhY2soKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZC5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcmlnaW5hbEFyZ3MsXG4gICAgICAgICAgICBvcmlnaW5hbE1ldGhvZCxcbiAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kQm91bmQ6IG9yaWdpbmFsTWV0aG9kLmJpbmQob3JpZ2luYWxUaGlzKSxcbiAgICAgICAgICAgIG9yaWdpbmFsVGhpc1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBhcyBGYWN0b3JpZXM8T2JqPik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgcGF0Y2ggdXNpbmcgcmF3IGZhY3RvcmllcyAoYWR2YW5jZWQgQVBJKS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICogQHBhcmFtIGZhY3RvcmllcyAtIFRoZSBmYWN0b3JpZXMgdG8gYXBwbHkgdG8gdGhlIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlclBhdGNoPE9iaiBleHRlbmRzIG9iamVjdD4ob2JqOiBPYmosIGZhY3RvcmllczogRmFjdG9yaWVzPE9iaj4pOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgY29uc3QgdW5pbnN0YWxsZXIgPSBhcm91bmQob2JqLCBmYWN0b3JpZXMpO1xuICAgIHRoaXMucmVnaXN0ZXIodW5pbnN0YWxsZXIpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBhIHBhdGNoIHRvIHRoZSBvYmplY3QuXG4gKiBCZXR0ZXIgc3Ryb25nbHktdHlwZWQgdmVyc2lvbiBvZiBgbW9ua2V5LWFyb3VuZGAuXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHBhcmFtIG9iaiAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gKiBAcGFyYW0gZmFjdG9yaWVzIC0gVGhlIGZhY3RvcmllcyB0byBhcHBseSB0byB0aGUgb2JqZWN0LlxuICogQHJldHVybnMgVGhlIHVuaW5zdGFsbGVyIHRoYXQgcmVtb3ZlcyB0aGUgcGF0Y2ggd2hlbiBjYWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcm91bmQ8T2JqIGV4dGVuZHMgb2JqZWN0PihvYmo6IE9iaiwgZmFjdG9yaWVzOiBGYWN0b3JpZXM8T2JqPik6IFVuaW5zdGFsbGVyIHtcbiAgcmV0dXJuIG9yaWdpbmFsQXJvdW5kKG9iaiBhcyBHZW5lcmljT2JqZWN0LCBmYWN0b3JpZXMgYXMgT3JpZ2luYWxGYWN0b3JpZXM8R2VuZXJpY09iamVjdD4pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGZ1bmN0aW9uIGhhcyBhIHNwZWNpZmljIHBhdGNoIHRva2VuLlxuICpcbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byBjaGVjay5cbiAqIEBwYXJhbSBwYXRjaFRva2VuIC0gVGhlIHBhdGNoIHRva2VuIHRvIGNoZWNrIGZvci5cbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgcGF0Y2ggdG9rZW4uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQYXRjaFRva2VuKGZuOiBHZW5lcmljRnVuY3Rpb24sIHBhdGNoVG9rZW46IHN5bWJvbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TW9ua2V5QXJvdW5kUGF0Y2hlcygpLmdldChmbikgPT09IHBhdGNoVG9rZW47XG59XG5cbmZ1bmN0aW9uIGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKTogV2Vha01hcDxHZW5lcmljRnVuY3Rpb24sIHN5bWJvbD4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKG51bGwsICdtb25rZXlBcm91bmRQYXRjaGVzJywgbmV3IFdlYWtNYXA8R2VuZXJpY0Z1bmN0aW9uLCBzeW1ib2w+KCkpLnZhbHVlO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQSxTQUFTLFVBQVUsc0JBQXNCO0FBTXpDLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsbUJBQW1CO0FBa0lyQixNQUFNLDhCQUE4QixZQUFZO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE5QyxvQkFDTCxRQUNNO0FBQ04sU0FBSyxhQUFhO0FBRWxCLFFBQUksT0FBTyxZQUFZO0FBQ3JCLFlBQU0saUJBQWlCLE9BQU8sSUFBSSxPQUFPLFVBQVU7QUFDbkQsNkJBQXVCLEVBQUUsSUFBSSxnQkFBZ0IsT0FBTyxVQUFVO0FBQUEsSUFDaEU7QUFJQSxTQUFLLGNBQWMsT0FBTyxLQUFLO0FBQUEsTUFDN0IsQ0FBQyxPQUFPLFVBQVUsR0FBRyxDQUFDLG1CQUEyQjtBQUMvQyxlQUFPLE9BQU8sbUJBQW1CO0FBQUEsVUFDL0I7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDLEtBQUs7QUFDTixpQkFBUyxpQkFBNEIsY0FBOEM7QUFFakYsZ0JBQU0sZUFBZTtBQUNyQixpQkFBTyxPQUFPLGFBQWE7QUFBQSxZQUN6QixXQUFXO0FBQ1QscUJBQU8sZUFBZSxLQUFLLGNBQWMsR0FBRyxZQUFZO0FBQUEsWUFDMUQ7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0EscUJBQXFCLGVBQWUsS0FBSyxZQUFZO0FBQUEsWUFDckQ7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBbUI7QUFBQSxFQUNyQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFTTyxjQUFrQyxLQUFVLFdBQWlDO0FBQ2xGLFNBQUssYUFBYTtBQUVsQixVQUFNLGNBQWMsT0FBTyxLQUFLLFNBQVM7QUFDekMsU0FBSyxTQUFTLFdBQVc7QUFBQSxFQUMzQjtBQUNGO0FBV08sU0FBUyxPQUEyQixLQUFVLFdBQXdDO0FBQzNGLFNBQU8sZUFBZSxLQUFzQixTQUE2QztBQUMzRjtBQVNPLFNBQVMsY0FBYyxJQUFxQixZQUE2QjtBQUM5RSxTQUFPLHVCQUF1QixFQUFFLElBQUksRUFBRSxNQUFNO0FBQzlDO0FBRUEsU0FBUyx5QkFBMkQ7QUFDbEUsU0FBTyx5QkFBeUIsTUFBTSx1QkFBdUIsb0JBQUksUUFBaUMsQ0FBQyxFQUFFO0FBQ3ZHOyIsCiAgIm5hbWVzIjogW10KfQo=
108
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBJbXByb3ZlZCB0eXBlLXNhZmUgd3JhcHBlciBvZiB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvbW9ua2V5LWFyb3VuZH0gbGlicmFyeS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IENvbmRpdGlvbmFsS2V5cyB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFyb3VuZCBhcyBvcmlnaW5hbEFyb3VuZCB9IGZyb20gJ21vbmtleS1hcm91bmQnO1xuXG5pbXBvcnQgdHlwZSB7IEdlbmVyaWNGdW5jdGlvbiB9IGZyb20gJy4uLy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi8uLi90eXBlLnRzJztcblxuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi4vLi4vb2JzaWRpYW4tZGV2LXV0aWxzLXN0YXRlLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnQtZXgudHMnO1xuXG4vKipcbiAqIEEgdHlwZSBvZiB0aGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICovXG5leHBvcnQgdHlwZSBGYWN0b3JpZXM8T2JqIGV4dGVuZHMgb2JqZWN0PiA9IFBhcnRpYWw8RnVsbEZhY3RvcmllczxPYmo+PjtcblxuLyoqXG4gKiBLZXlzIG9mIGBPYmpgIHdob3NlIHZhbHVlIGlzIGNhbGxhYmxlIFx1MjAxNCBhIG1ldGhvZCwgb3IgYSBmdW5jdGlvbi1saWtlIG9iamVjdCBzdWNoIGFzIGEgYERlYm91bmNlcmAuIFRoZXNlIGFyZSB0aGUgbWVtYmVyc1xuICogYWNjZXB0ZWQgYnkge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3RlckZ1bmN0aW9uUGF0Y2h9LlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgRnVuY3Rpb25LZXlzPE9iaiBleHRlbmRzIG9iamVjdD4gPSBDb25kaXRpb25hbEtleXM8T2JqLCBHZW5lcmljRnVuY3Rpb24gfCB1bmRlZmluZWQ+ICYga2V5b2YgT2JqO1xuXG4vKipcbiAqIEtleXMgb2YgYE9iamAgd2hvc2UgdmFsdWUgaXMgYSBwbGFpbiBmdW5jdGlvbiAoYSBcInJlYWwgbWV0aG9kXCIpLiBGdW5jdGlvbi1saWtlIG9iamVjdHMgdGhhdCBjYXJyeSBleHRyYSBtZW1iZXJzIGFyZVxuICogZXhjbHVkZWQgXHUyMDE0IGUuZy4gYSBgRGVib3VuY2VyYCAod2hpY2ggYWRkcyBgY2FuY2VsYC9gcnVuYCkgYmVsb25ncyB0byB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50I3JlZ2lzdGVyRnVuY3Rpb25QYXRjaH0sXG4gKiBub3Qge0BsaW5rIE1vbmtleUFyb3VuZENvbXBvbmVudCNyZWdpc3Rlck1ldGhvZFBhdGNofS4gVGhlIGNoZWNrIGlzIHdoZXRoZXIgdGhlIG1lbWJlciBoYXMgYW55IG93biBrZXlzIGJleW9uZCBhIGJhcmVcbiAqIGZ1bmN0aW9uJ3MgKGBFeGNsdWRlPGtleW9mIFQsIGtleW9mIEdlbmVyaWNGdW5jdGlvbj5gIGlzIGBuZXZlcmApLlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB3aG9zZSBrZXlzIGFyZSBmaWx0ZXJlZC5cbiAqL1xuZXhwb3J0IHR5cGUgTWV0aG9kS2V5czxPYmogZXh0ZW5kcyBvYmplY3Q+ID0gTWV0aG9kS2V5c01hcDxPYmo+W0Z1bmN0aW9uS2V5czxPYmo+XTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIHBhc3NlZCB0byB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50I3JlZ2lzdGVyRnVuY3Rpb25QYXRjaH0uXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHR5cGVQYXJhbSBGdW5jdGlvbk5hbWUgLSBUaGUgZnVuY3Rpb24gbmFtZSB0byBwYXRjaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3RlckZ1bmN0aW9uUGF0Y2hQYXJhbXM8T2JqIGV4dGVuZHMgb2JqZWN0LCBGdW5jdGlvbk5hbWUgZXh0ZW5kcyBGdW5jdGlvbktleXM8T2JqPj4ge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIG5hbWUgdG8gcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbk5hbWU6IEZ1bmN0aW9uTmFtZTtcblxuICAvKipcbiAgICogVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICovXG4gIHJlYWRvbmx5IG9iajogT2JqO1xuXG4gIC8qKlxuICAgKiBQYXRjaCBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgdGFrZXMgdGhlIG9yaWdpbmFsIHZhbHVlIGFuZCByZXR1cm5zIHRoZSBwYXRjaGVkIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gb3JpZ2luYWxWYWx1ZSAtIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoZSBwYXRjaGVkIHZhbHVlIG9mIHRoZSBmdW5jdGlvbi5cbiAgICovXG4gIHBhdGNoSGFuZGxlcihvcmlnaW5hbFZhbHVlOiBPYmpbRnVuY3Rpb25OYW1lXSk6IE9ialtGdW5jdGlvbk5hbWVdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgcGFzc2VkIHRvIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnQjcmVnaXN0ZXJNZXRob2RQYXRjaH0uXG4gKlxuICogQHR5cGVQYXJhbSBPYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbmtleUFyb3VuZENvbXBvbmVudFJlZ2lzdGVyTWV0aG9kUGF0Y2hQYXJhbXM8T2JqIGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PiB7XG4gIC8qKlxuICAgKiBUaGUgbWV0aG9kIG5hbWUgdG8gcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBtZXRob2ROYW1lOiBNZXRob2ROYW1lO1xuXG4gIC8qKlxuICAgKiBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKi9cbiAgcmVhZG9ubHkgb2JqOiBPYmo7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRjaCBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hIYW5kbGVyOiBQYXRjaEhhbmRsZXJGbjxPYmosIE1ldGhvZE5hbWU+O1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB0b2tlbiB0byBpZGVudGlmeSB0aGUgcGF0Y2guXG4gICAqL1xuICByZWFkb25seSBwYXRjaFRva2VuPzogc3ltYm9sO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBwb3N0LXBhdGNoIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBydW5zIGFmdGVyIHRoZSBwYXRjaCBpcyBhcHBsaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdFBhdGNoSGFuZGxlcj86IFBvc3RQYXRjaEhhbmRsZXJGbjxPYmosIE1ldGhvZE5hbWU+O1xufVxuXG4vKipcbiAqIEEgcGF0Y2ggaGFuZGxlciBmdW5jdGlvbiB0aGF0IGludGVyY2VwdHMgY2FsbHMgdG8gYSBtZXRob2Qgb24gYW4gb2JqZWN0LlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCBiZWluZyBwYXRjaGVkLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGJlaW5nIHBhdGNoZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFBhdGNoSGFuZGxlckZuPE9iaiBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8T2JqPj4gPSAoXG4gIHBhcmFtczogUGF0Y2hIYW5kbGVyUGFyYW1zPE9iaiwgTWV0aG9kTmFtZT5cbikgPT4gUmV0dXJuVHlwZTxFeHRyYWN0RnVuY3Rpb248T2JqLCBNZXRob2ROYW1lPj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8gYSB7QGxpbmsgUGF0Y2hIYW5kbGVyRm59IGNhbGxiYWNrLlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCBiZWluZyBwYXRjaGVkLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGJlaW5nIHBhdGNoZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hIYW5kbGVyUGFyYW1zPE9iaiBleHRlbmRzIG9iamVjdCwgTWV0aG9kTmFtZSBleHRlbmRzIE1ldGhvZEtleXM8T2JqPj4ge1xuICBmYWxsYmFjayh0aGlzOiB2b2lkKTogUmV0dXJuVHlwZTxFeHRyYWN0RnVuY3Rpb248T2JqLCBNZXRob2ROYW1lPj47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBhcmd1bWVudHMgb2YgdGhlIGludGVyY2VwdGVkIGNhbGwsIGFzIGEgdHVwbGUuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbEFyZ3M6IFBhcmFtZXRlcnM8RXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgKHVucGF0Y2hlZCkgbWV0aG9kLiBDYWxsIHZpYSBgb3JpZ2luYWxGbi5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZDogRXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmlnaW5hbCBtZXRob2QsIGJ1dCB3aXRoIHRoZSBgdGhpc2AgY29udGV4dCBhbHJlYWR5IGJvdW5kIHRvIHRoZSBvcmlnaW5hbCBvYmplY3QuIENhbGwgdmlhIGBvcmlnaW5hbE1ldGhvZEJvdW5kKC4uLm9yaWdpbmFsQXJncylgLlxuICAgKi9cbiAgcmVhZG9ubHkgb3JpZ2luYWxNZXRob2RCb3VuZDogT21pdFRoaXNQYXJhbWV0ZXI8RXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT4+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgYHRoaXNgIGNvbnRleHQgb2YgdGhlIGludGVyY2VwdGVkIGNhbGwuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbFRoaXM6IE9iajtcbn1cblxuLyoqXG4gKiBBIHBvc3QtcGF0Y2ggaGFuZGxlciBmdW5jdGlvbiB0aGF0IHJ1bnMgYWZ0ZXIgYSBwYXRjaCBpcyBhcHBsaWVkLlxuICpcbiAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCBiZWluZyBwYXRjaGVkLlxuICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIGJlaW5nIHBhdGNoZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFBvc3RQYXRjaEhhbmRsZXJGbjxPYmogZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPE9iaj4+ID0gKFxuICBwYXJhbXM6IFBvc3RQYXRjaEhhbmRsZXJQYXJhbXM8T2JqLCBNZXRob2ROYW1lPlxuKSA9PiBNYXliZVJldHVybjxFeHRyYWN0RnVuY3Rpb248T2JqLCBNZXRob2ROYW1lPj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBwYXNzZWQgdG8gYSB7QGxpbmsgUG9zdFBhdGNoSGFuZGxlckZufSBjYWxsYmFjay5cbiAqXG4gKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgYmVpbmcgcGF0Y2hlZC5cbiAqIEB0eXBlUGFyYW0gTWV0aG9kTmFtZSAtIFRoZSBtZXRob2QgbmFtZSBiZWluZyBwYXRjaGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBvc3RQYXRjaEhhbmRsZXJQYXJhbXM8T2JqIGV4dGVuZHMgb2JqZWN0LCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PiB7XG4gIC8qKlxuICAgKiBUaGUgb3JpZ2luYWwgKHVucGF0Y2hlZCkgbWV0aG9kLiBDYWxsIHZpYSBgb3JpZ2luYWxGbi5jYWxsKG9yaWdpbmFsVGhpcywgLi4ub3JpZ2luYWxBcmdzKWAuXG4gICAqL1xuICByZWFkb25seSBvcmlnaW5hbE1ldGhvZDogRXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRjaGVkIG1ldGhvZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGNoZWRNZXRob2Q6IEV4dHJhY3RGdW5jdGlvbjxPYmosIE1ldGhvZE5hbWU+O1xufVxuXG50eXBlIEV4dHJhY3RGdW5jdGlvbjxPYmogZXh0ZW5kcyBvYmplY3QsIE1ldGhvZE5hbWUgZXh0ZW5kcyBNZXRob2RLZXlzPE9iaj4+ID0gR2VuZXJpY0Z1bmN0aW9uPFBhcmFtZXRlcnM8RXh0cmFjdDxPYmpbTWV0aG9kTmFtZV0sIEdlbmVyaWNGdW5jdGlvbj4+LCBSZXR1cm5UeXBlPEV4dHJhY3Q8T2JqW01ldGhvZE5hbWVdLCBHZW5lcmljRnVuY3Rpb24+Pj47XG5cbnR5cGUgRnVsbEZhY3RvcmllczxPYmogZXh0ZW5kcyBvYmplY3Q+ID0ge1xuICBbS2V5IGluIGtleW9mIE9ial06IChvcmlnaW5hbFZhbHVlOiBPYmpbS2V5XSkgPT4gT2JqW0tleV07XG59O1xuXG50eXBlIE1ldGhvZEtleXNNYXA8T2JqIGV4dGVuZHMgb2JqZWN0PiA9IHtcbiAgW0tleSBpbiBGdW5jdGlvbktleXM8T2JqPl06IFtFeGNsdWRlPGtleW9mIE5vbk51bGxhYmxlPE9ialtLZXldPiwga2V5b2YgR2VuZXJpY0Z1bmN0aW9uPl0gZXh0ZW5kcyBbbmV2ZXJdID8gS2V5IDogbmV2ZXI7XG59O1xuXG50eXBlIE9yaWdpbmFsRmFjdG9yaWVzPE9iaiBleHRlbmRzIEdlbmVyaWNPYmplY3Q+ID0gUGFyYW1ldGVyczx0eXBlb2Ygb3JpZ2luYWxBcm91bmQ8T2JqPj5bMV07XG5cbnR5cGUgVW5pbnN0YWxsZXIgPSAoKSA9PiB2b2lkO1xuXG4vKipcbiAqIEEgY29tcG9uZW50IHRoYXQgbWFuYWdlcyBtb25rZXktcGF0Y2hlcyB3aXRoIGxpZmVjeWNsZS1ib3VuZCBjbGVhbnVwLlxuICogQWxsIHBhdGNoZXMgcmVnaXN0ZXJlZCB2aWEgdGhpcyBjb21wb25lbnQgYXJlIGF1dG9tYXRpY2FsbHkgdW5pbnN0YWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IHVubG9hZHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25rZXlBcm91bmRDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBwYXRjaCBmb3IgYSBzaW5nbGUgZnVuY3Rpb24tbGlrZSBtZW1iZXIgKGEgbWV0aG9kLCBvciBhIGNhbGxhYmxlIHN1Y2ggYXMgYSBgRGVib3VuY2VyYCkgdXNpbmcgYSBzaW1wbGlmaWVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICogQHR5cGVQYXJhbSBGdW5jdGlvbk5hbWUgLSBUaGUgZnVuY3Rpb24gbmFtZSB0byBwYXRjaC5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBwYXRjaC5cbiAgICovXG4gIHB1YmxpYyByZWdpc3RlckZ1bmN0aW9uUGF0Y2g8T2JqIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBGdW5jdGlvbk5hbWUgZXh0ZW5kcyBGdW5jdGlvbktleXM8T2JqPj4oXG4gICAgcGFyYW1zOiBNb25rZXlBcm91bmRDb21wb25lbnRSZWdpc3RlckZ1bmN0aW9uUGF0Y2hQYXJhbXM8T2JqLCBGdW5jdGlvbk5hbWU+XG4gICk6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBjb25zdCBmYWN0b3JpZXM6IEZhY3RvcmllczxPYmo+ID0ge307XG4gICAgZmFjdG9yaWVzW3BhcmFtcy5mdW5jdGlvbk5hbWVdID0gKG9yaWdpbmFsVmFsdWU6IE9ialtGdW5jdGlvbk5hbWVdKTogT2JqW0Z1bmN0aW9uTmFtZV0gPT4ge1xuICAgICAgcmV0dXJuIHBhcmFtcy5wYXRjaEhhbmRsZXIob3JpZ2luYWxWYWx1ZSk7XG4gICAgfTtcblxuICAgIHRoaXMucmVnaXN0ZXJQYXRjaChwYXJhbXMub2JqLCBmYWN0b3JpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIHNpbmdsZS1tZXRob2QgcGF0Y2ggdXNpbmcgYSBzaW1wbGlmaWVkIGhhbmRsZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gT2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAgICogQHR5cGVQYXJhbSBNZXRob2ROYW1lIC0gVGhlIG1ldGhvZCBuYW1lIHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgb2YgdGhlIHBhdGNoLlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyTWV0aG9kUGF0Y2g8T2JqIGV4dGVuZHMgb2JqZWN0LCBjb25zdCBNZXRob2ROYW1lIGV4dGVuZHMgTWV0aG9kS2V5czxPYmo+PihcbiAgICBwYXJhbXM6IE1vbmtleUFyb3VuZENvbXBvbmVudFJlZ2lzdGVyTWV0aG9kUGF0Y2hQYXJhbXM8T2JqLCBNZXRob2ROYW1lPlxuICApOiB2b2lkIHtcbiAgICB0aGlzLmVuc3VyZUxvYWRlZCgpO1xuXG4gICAgaWYgKHBhcmFtcy5wYXRjaFRva2VuKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbE1ldGhvZCA9IHBhcmFtcy5vYmpbcGFyYW1zLm1ldGhvZE5hbWVdIGFzIEdlbmVyaWNGdW5jdGlvbjtcbiAgICAgIGdldE1vbmtleUFyb3VuZFBhdGNoZXMoKS5zZXQob3JpZ2luYWxNZXRob2QsIHBhcmFtcy5wYXRjaFRva2VuKTtcbiAgICB9XG5cbiAgICB0eXBlIEZuID0gRXh0cmFjdEZ1bmN0aW9uPE9iaiwgTWV0aG9kTmFtZT47XG5cbiAgICB0aGlzLnJlZ2lzdGVyRnVuY3Rpb25QYXRjaCh7XG4gICAgICBmdW5jdGlvbk5hbWU6IHBhcmFtcy5tZXRob2ROYW1lLFxuICAgICAgb2JqOiBwYXJhbXMub2JqLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAob3JpZ2luYWxNZXRob2RSYXcpID0+IHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxNZXRob2QgPSBvcmlnaW5hbE1ldGhvZFJhdyBhcyBGbjtcbiAgICAgICAgY29uc3QgZmluYWxQYXRjaGVkTWV0aG9kID0gcGFyYW1zLnBvc3RQYXRjaEhhbmRsZXI/Lih7XG4gICAgICAgICAgb3JpZ2luYWxNZXRob2QsXG4gICAgICAgICAgcGF0Y2hlZE1ldGhvZFxuICAgICAgICB9KSA/PyBwYXRjaGVkTWV0aG9kO1xuICAgICAgICByZXR1cm4gZmluYWxQYXRjaGVkTWV0aG9kIGFzIE9ialtNZXRob2ROYW1lXTtcblxuICAgICAgICBmdW5jdGlvbiBwYXRjaGVkTWV0aG9kKHRoaXM6IE9iaiwgLi4ub3JpZ2luYWxBcmdzOiBQYXJhbWV0ZXJzPEZuPik6IFJldHVyblR5cGU8Rm4+IHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29uc2lzdGVudC10aGlzLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdGhpcy1hbGlhcyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgYHRoaXNgIGNvbnRleHQuXG4gICAgICAgICAgY29uc3Qgb3JpZ2luYWxUaGlzID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gcGFyYW1zLnBhdGNoSGFuZGxlcih7XG4gICAgICAgICAgICBmYWxsYmFjaygpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsTWV0aG9kLmNhbGwob3JpZ2luYWxUaGlzLCAuLi5vcmlnaW5hbEFyZ3MpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9yaWdpbmFsQXJncyxcbiAgICAgICAgICAgIG9yaWdpbmFsTWV0aG9kLFxuICAgICAgICAgICAgb3JpZ2luYWxNZXRob2RCb3VuZDogb3JpZ2luYWxNZXRob2QuYmluZChvcmlnaW5hbFRoaXMpLFxuICAgICAgICAgICAgb3JpZ2luYWxUaGlzXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBwYXRjaCB1c2luZyByYXcgZmFjdG9yaWVzIChhZHZhbmNlZCBBUEkpLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gICAqIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIHBhdGNoLlxuICAgKiBAcGFyYW0gZmFjdG9yaWVzIC0gVGhlIGZhY3RvcmllcyB0byBhcHBseSB0byB0aGUgb2JqZWN0LlxuICAgKi9cbiAgcHVibGljIHJlZ2lzdGVyUGF0Y2g8T2JqIGV4dGVuZHMgb2JqZWN0PihvYmo6IE9iaiwgZmFjdG9yaWVzOiBGYWN0b3JpZXM8T2JqPik6IHZvaWQge1xuICAgIHRoaXMuZW5zdXJlTG9hZGVkKCk7XG5cbiAgICBjb25zdCB1bmluc3RhbGxlciA9IGFyb3VuZChvYmosIGZhY3Rvcmllcyk7XG4gICAgdGhpcy5yZWdpc3Rlcih1bmluc3RhbGxlcik7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgcGF0Y2ggdG8gdGhlIG9iamVjdC5cbiAqIEJldHRlciBzdHJvbmdseS10eXBlZCB2ZXJzaW9uIG9mIGBtb25rZXktYXJvdW5kYC5cbiAqXG4gKiBAdHlwZVBhcmFtIE9iaiAtIFRoZSBvYmplY3QgdG8gcGF0Y2guXG4gKiBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byBwYXRjaC5cbiAqIEBwYXJhbSBmYWN0b3JpZXMgLSBUaGUgZmFjdG9yaWVzIHRvIGFwcGx5IHRvIHRoZSBvYmplY3QuXG4gKiBAcmV0dXJucyBUaGUgdW5pbnN0YWxsZXIgdGhhdCByZW1vdmVzIHRoZSBwYXRjaCB3aGVuIGNhbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFyb3VuZDxPYmogZXh0ZW5kcyBvYmplY3Q+KG9iajogT2JqLCBmYWN0b3JpZXM6IEZhY3RvcmllczxPYmo+KTogVW5pbnN0YWxsZXIge1xuICByZXR1cm4gb3JpZ2luYWxBcm91bmQob2JqIGFzIEdlbmVyaWNPYmplY3QsIGZhY3RvcmllcyBhcyBPcmlnaW5hbEZhY3RvcmllczxHZW5lcmljT2JqZWN0Pik7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgZnVuY3Rpb24gaGFzIGEgc3BlY2lmaWMgcGF0Y2ggdG9rZW4uXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLlxuICogQHBhcmFtIHBhdGNoVG9rZW4gLSBUaGUgcGF0Y2ggdG9rZW4gdG8gY2hlY2sgZm9yLlxuICogQHJldHVybnMgV2hldGhlciB0aGUgZnVuY3Rpb24gaGFzIHRoZSBwYXRjaCB0b2tlbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BhdGNoVG9rZW4oZm46IEdlbmVyaWNGdW5jdGlvbiwgcGF0Y2hUb2tlbjogc3ltYm9sKTogYm9vbGVhbiB7XG4gIHJldHVybiBnZXRNb25rZXlBcm91bmRQYXRjaGVzKCkuZ2V0KGZuKSA9PT0gcGF0Y2hUb2tlbjtcbn1cblxuZnVuY3Rpb24gZ2V0TW9ua2V5QXJvdW5kUGF0Y2hlcygpOiBXZWFrTWFwPEdlbmVyaWNGdW5jdGlvbiwgc3ltYm9sPiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoJ21vbmtleUFyb3VuZFBhdGNoZXMnLCBuZXcgV2Vha01hcDxHZW5lcmljRnVuY3Rpb24sIHN5bWJvbD4oKSkudmFsdWU7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBLFNBQVMsVUFBVSxzQkFBc0I7QUFNekMsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyxtQkFBbUI7QUE0S3JCLE1BQU0sOEJBQThCLFlBQVk7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUTlDLHNCQUNMLFFBQ007QUFDTixTQUFLLGFBQWE7QUFFbEIsVUFBTSxZQUE0QixDQUFDO0FBQ25DLGNBQVUsT0FBTyxZQUFZLElBQUksQ0FBQyxrQkFBd0Q7QUFDeEYsYUFBTyxPQUFPLGFBQWEsYUFBYTtBQUFBLElBQzFDO0FBRUEsU0FBSyxjQUFjLE9BQU8sS0FBSyxTQUFTO0FBQUEsRUFDMUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sb0JBQ0wsUUFDTTtBQUNOLFNBQUssYUFBYTtBQUVsQixRQUFJLE9BQU8sWUFBWTtBQUNyQixZQUFNLGlCQUFpQixPQUFPLElBQUksT0FBTyxVQUFVO0FBQ25ELDZCQUF1QixFQUFFLElBQUksZ0JBQWdCLE9BQU8sVUFBVTtBQUFBLElBQ2hFO0FBSUEsU0FBSyxzQkFBc0I7QUFBQSxNQUN6QixjQUFjLE9BQU87QUFBQSxNQUNyQixLQUFLLE9BQU87QUFBQSxNQUNaLGNBQWMsQ0FBQyxzQkFBc0I7QUFDbkMsY0FBTSxpQkFBaUI7QUFDdkIsY0FBTSxxQkFBcUIsT0FBTyxtQkFBbUI7QUFBQSxVQUNuRDtBQUFBLFVBQ0E7QUFBQSxRQUNGLENBQUMsS0FBSztBQUNOLGVBQU87QUFFUCxpQkFBUyxpQkFBNEIsY0FBOEM7QUFFakYsZ0JBQU0sZUFBZTtBQUNyQixpQkFBTyxPQUFPLGFBQWE7QUFBQSxZQUN6QixXQUFXO0FBQ1QscUJBQU8sZUFBZSxLQUFLLGNBQWMsR0FBRyxZQUFZO0FBQUEsWUFDMUQ7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0EscUJBQXFCLGVBQWUsS0FBSyxZQUFZO0FBQUEsWUFDckQ7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU08sY0FBa0MsS0FBVSxXQUFpQztBQUNsRixTQUFLLGFBQWE7QUFFbEIsVUFBTSxjQUFjLE9BQU8sS0FBSyxTQUFTO0FBQ3pDLFNBQUssU0FBUyxXQUFXO0FBQUEsRUFDM0I7QUFDRjtBQVdPLFNBQVMsT0FBMkIsS0FBVSxXQUF3QztBQUMzRixTQUFPLGVBQWUsS0FBc0IsU0FBNkM7QUFDM0Y7QUFTTyxTQUFTLGNBQWMsSUFBcUIsWUFBNkI7QUFDOUUsU0FBTyx1QkFBdUIsRUFBRSxJQUFJLEVBQUUsTUFBTTtBQUM5QztBQUVBLFNBQVMseUJBQTJEO0FBQ2xFLFNBQU8seUJBQXlCLHVCQUF1QixvQkFBSSxRQUFpQyxDQUFDLEVBQUU7QUFDakc7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -44,7 +44,7 @@ class PluginContextComponent extends ComponentEx {
44
44
  * Initializes the plugin context and debug controller.
45
45
  */
46
46
  onload() {
47
- initPluginContext(this.app, this.pluginId);
47
+ initPluginContext(this.pluginId);
48
48
  this.addChild(new AllWindowsEventComponent(this.app)).registerAllWindowsHandler((win) => {
49
49
  initDebugController(win, this);
50
50
  });
@@ -53,4 +53,4 @@ class PluginContextComponent extends ComponentEx {
53
53
  export {
54
54
  PluginContextComponent
55
55
  };
56
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBjb250ZXh0LCBkZWJ1ZyBjb250cm9sbGVyLCBhbmQgbGlicmFyeSBzdHlsZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGluaXREZWJ1Z0NvbnRyb2xsZXIsXG4gIGluaXRQbHVnaW5Db250ZXh0XG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuaW50ZXJmYWNlIFBsdWdpbkNvbnRleHRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHBsdWdpbiBjb250ZXh0IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKSBvbiBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ29udGV4dENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQ29udGV4dENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQgYW5kIGRlYnVnIGNvbnRyb2xsZXIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGluaXRQbHVnaW5Db250ZXh0KHRoaXMuYXBwLCB0aGlzLnBsdWdpbklkKTtcbiAgICB0aGlzLmFkZENoaWxkKG5ldyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQodGhpcy5hcHApKS5yZWdpc3RlckFsbFdpbmRvd3NIYW5kbGVyKCh3aW4pID0+IHtcbiAgICAgIGluaXREZWJ1Z0NvbnRyb2xsZXIod2luLCB0aGlzKTtcbiAgICB9KTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsZ0NBQWdDO0FBQ3pDLFNBQVMsbUJBQW1CO0FBVXJCLE1BQU0sK0JBQStCLFlBQVk7QUFBQSxFQUNyQztBQUFBLEVBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQWlEO0FBQ2xFLFVBQU07QUFDTixTQUFLLE1BQU0sT0FBTztBQUNsQixTQUFLLFdBQVcsT0FBTztBQUFBLEVBQ3pCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLZ0IsU0FBZTtBQUM3QixzQkFBa0IsS0FBSyxLQUFLLEtBQUssUUFBUTtBQUN6QyxTQUFLLFNBQVMsSUFBSSx5QkFBeUIsS0FBSyxHQUFHLENBQUMsRUFBRSwwQkFBMEIsQ0FBQyxRQUFRO0FBQ3ZGLDBCQUFvQixLQUFLLElBQUk7QUFBQSxJQUMvQixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
56
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLWNvbnRleHQtY29tcG9uZW50LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29tcG9uZW50IHRoYXQgaW5pdGlhbGl6ZXMgdGhlIHBsdWdpbiBjb250ZXh0LCBkZWJ1ZyBjb250cm9sbGVyLCBhbmQgbGlicmFyeSBzdHlsZXMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBBcHAgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7XG4gIGluaXREZWJ1Z0NvbnRyb2xsZXIsXG4gIGluaXRQbHVnaW5Db250ZXh0XG59IGZyb20gJy4uL3BsdWdpbi9wbHVnaW4tY29udGV4dC50cyc7XG5pbXBvcnQgeyBBbGxXaW5kb3dzRXZlbnRDb21wb25lbnQgfSBmcm9tICcuL2FsbC13aW5kb3dzLWV2ZW50LWNvbXBvbmVudC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuaW50ZXJmYWNlIFBsdWdpbkNvbnRleHRDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemVzIHBsdWdpbiBjb250ZXh0IChwbHVnaW4gSUQsIGRlYnVnIGNvbnRyb2xsZXIsIGxpYnJhcnkgc3R5bGVzKSBvbiBsb2FkLlxuICovXG5leHBvcnQgY2xhc3MgUGx1Z2luQ29udGV4dENvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBjb250ZXh0IGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUGx1Z2luQ29udGV4dENvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IHBhcmFtcy5hcHA7XG4gICAgdGhpcy5wbHVnaW5JZCA9IHBhcmFtcy5wbHVnaW5JZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgcGx1Z2luIGNvbnRleHQgYW5kIGRlYnVnIGNvbnRyb2xsZXIuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIGluaXRQbHVnaW5Db250ZXh0KHRoaXMucGx1Z2luSWQpO1xuICAgIHRoaXMuYWRkQ2hpbGQobmV3IEFsbFdpbmRvd3NFdmVudENvbXBvbmVudCh0aGlzLmFwcCkpLnJlZ2lzdGVyQWxsV2luZG93c0hhbmRsZXIoKHdpbikgPT4ge1xuICAgICAgaW5pdERlYnVnQ29udHJvbGxlcih3aW4sIHRoaXMpO1xuICAgIH0pO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxnQ0FBZ0M7QUFDekMsU0FBUyxtQkFBbUI7QUFVckIsTUFBTSwrQkFBK0IsWUFBWTtBQUFBLEVBQ3JDO0FBQUEsRUFDQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBaUQ7QUFDbEUsVUFBTTtBQUNOLFNBQUssTUFBTSxPQUFPO0FBQ2xCLFNBQUssV0FBVyxPQUFPO0FBQUEsRUFDekI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixTQUFlO0FBQzdCLHNCQUFrQixLQUFLLFFBQVE7QUFDL0IsU0FBSyxTQUFTLElBQUkseUJBQXlCLEtBQUssR0FBRyxDQUFDLEVBQUUsMEJBQTBCLENBQUMsUUFBUTtBQUN2RiwwQkFBb0IsS0FBSyxJQUFJO0FBQUEsSUFDL0IsQ0FBQztBQUFBLEVBQ0g7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -22,7 +22,7 @@ if you want to view the source, please visit the github repository of this plugi
22
22
  })();
23
23
 
24
24
  import { Notice } from "obsidian";
25
- import { getObsidianDevUtilsState } from "../app.mjs";
25
+ import { getObsidianDevUtilsState } from "../../obsidian-dev-utils-state.mjs";
26
26
  import { ComponentEx } from "./component-ex.mjs";
27
27
  const PERMANENT_NOTICES_STATE_KEY = "plugin-notice-component:permanent-notices";
28
28
  const PERMANENT_NOTICE_DURATION_IN_MILLISECONDS = 0;
@@ -77,7 +77,7 @@ class PluginNoticeComponent extends ComponentEx {
77
77
  return this.getPermanentNotices().get(this.pluginName) ?? null;
78
78
  }
79
79
  getPermanentNotices() {
80
- return getObsidianDevUtilsState(null, PERMANENT_NOTICES_STATE_KEY, /* @__PURE__ */ new Map()).value;
80
+ return getObsidianDevUtilsState(PERMANENT_NOTICES_STATE_KEY, /* @__PURE__ */ new Map()).value;
81
81
  }
82
82
  setPermanentNotice(notice) {
83
83
  const map = this.getPermanentNotices();
@@ -98,4 +98,4 @@ function prependPrefix(prefix, message) {
98
98
  export {
99
99
  PluginNoticeComponent
100
100
  };
101
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL2FwcC50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZID0gJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50OnBlcm1hbmVudC1ub3RpY2VzJztcbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgLlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUGVybWFuZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEF1dG9tYXRpY2FsbHkgaGlkZXMgdGhlIHByZXZpb3VzIG5vdGljZSB3aGVuIGEgbmV3IG9uZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSBub3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luTmFtZSAtIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBub3RpY2UuXG4gICAqL1xuICBwdWJsaWMgc2hvd05vdGljZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nLCBvcHRpb25zPzogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGljZT8uaGlkZSgpO1xuXG4gICAgY29uc3QgcHJlZml4ID0gYCR7dGhpcy5wbHVnaW5OYW1lfSR7dGhpcy5fbG9hZGVkID8gJycgOiAnICh1bmxvYWRlZCknfVxcbmA7XG4gICAgY29uc3QgcHJlZml4ZWRNZXNzYWdlID0gcHJlcGVuZFByZWZpeChwcmVmaXgsIG1lc3NhZ2UpO1xuICAgIHRoaXMubm90aWNlID0gbmV3IE5vdGljZShwcmVmaXhlZE1lc3NhZ2UsIG9wdGlvbnM/LmlzUGVybWFuZW50ID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmlzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZSh0aGlzLm5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4obnVsbCwgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBlbmRQcmVmaXgocHJlZml4OiBzdHJpbmcsIG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHttZXNzYWdlfWA7XG4gIH1cblxuICBtZXNzYWdlLnByZXBlbmQocHJlZml4KTtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMsY0FBYztBQUV2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLG1CQUFtQjtBQUU1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQXFCM0MsTUFBTSw4QkFBOEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE5QyxZQUE2QixZQUFvQjtBQUN0RCxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBLEVBUDVCLFNBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjaEIsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFDYixVQUFNLGtCQUFrQixLQUFLLG1CQUFtQjtBQUNoRCxxQkFBaUIsS0FBSztBQUN0QixTQUFLLG1CQUFtQixJQUFJO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixXQUFpQjtBQUMvQixRQUFJLEtBQUssbUJBQW1CLE1BQU0sS0FBSyxRQUFRO0FBQzdDLFdBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxXQUFXLFNBQW9DLFNBQXdEO0FBQzVHLFNBQUssUUFBUSxLQUFLO0FBRWxCLFVBQU0sU0FBUyxHQUFHLEtBQUssVUFBVSxHQUFHLEtBQUssVUFBVSxLQUFLLGFBQWE7QUFBQTtBQUNyRSxVQUFNLGtCQUFrQixjQUFjLFFBQVEsT0FBTztBQUNyRCxTQUFLLFNBQVMsSUFBSSxPQUFPLGlCQUFpQixTQUFTLGNBQWMsNENBQTRDLE1BQVM7QUFFdEgsUUFBSSxTQUFTLGFBQWE7QUFDeEIsV0FBSyxtQkFBbUIsS0FBSyxNQUFNO0FBQUEsSUFDckMsT0FBTztBQUNMLFdBQUssbUJBQW1CLElBQUk7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLHFCQUFvQztBQUMxQyxXQUFPLEtBQUssb0JBQW9CLEVBQUUsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLEVBQzVEO0FBQUEsRUFFUSxzQkFBMkM7QUFDakQsV0FBTyx5QkFBOEMsTUFBTSw2QkFBNkIsb0JBQUksSUFBb0IsQ0FBQyxFQUFFO0FBQUEsRUFDckg7QUFBQSxFQUVRLG1CQUFtQixRQUE2QjtBQUN0RCxVQUFNLE1BQU0sS0FBSyxvQkFBb0I7QUFDckMsUUFBSSxRQUFRO0FBQ1YsVUFBSSxJQUFJLEtBQUssWUFBWSxNQUFNO0FBQUEsSUFDakMsT0FBTztBQUNMLFVBQUksT0FBTyxLQUFLLFVBQVU7QUFBQSxJQUM1QjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsY0FBYyxRQUFnQixTQUErRDtBQUNwRyxNQUFJLE9BQU8sWUFBWSxVQUFVO0FBQy9CLFdBQU8sR0FBRyxNQUFNLEdBQUcsT0FBTztBQUFBLEVBQzVCO0FBRUEsVUFBUSxRQUFRLE1BQU07QUFDdEIsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogW10KfQo=
101
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL2NvbXBvbmVudHMvcGx1Z2luLW5vdGljZS1jb21wb25lbnQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBDb21wb25lbnQgdGhhdCBtYW5hZ2VzIGRpc3BsYXlpbmcgbm90aWNlcyB0byB0aGUgdXNlci5cbiAqL1xuXG5pbXBvcnQgeyBOb3RpY2UgfSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uLy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBDb21wb25lbnRFeCB9IGZyb20gJy4vY29tcG9uZW50LWV4LnRzJztcblxuY29uc3QgUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZID0gJ3BsdWdpbi1ub3RpY2UtY29tcG9uZW50OnBlcm1hbmVudC1ub3RpY2VzJztcbmNvbnN0IFBFUk1BTkVOVF9OT1RJQ0VfRFVSQVRJT05fSU5fTUlMTElTRUNPTkRTID0gMDtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgUGx1Z2luTm90aWNlQ29tcG9uZW50LnNob3dOb3RpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk5vdGljZUNvbXBvbmVudFNob3dOb3RpY2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG5vdGljZSBzaG91bGQgc3RheSB1bnRpbCBpdCBpcyByZXBsYWNlZCwgdGhlIHBsdWdpbiBpcyByZWxvYWRlZCwgb3IgdGhlIHVzZXIgZGlzbWlzc2VzIGl0LiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgLlxuICAgKlxuICAgKiBBIHBlcm1hbmVudCBub3RpY2UgaXMgc2hvd24gd2l0aCBhbiBpbmZpbml0ZSBkdXJhdGlvbiBhbmQgaXMgbm90IGhpZGRlbiB3aGVuIHRoZSBjb21wb25lbnQgdW5sb2Fkcywgc28gaXQgY2FuXG4gICAqIGNvbW11bmljYXRlIHN0YXRlIHRoYXQgb3V0bGl2ZXMgdGhlIHBsdWdpbiAoZS5nLiBhIGNsZWFudXAgdGhhdCByZXF1aXJlcyBhIHJlbG9hZCkuIFRoZXJlIGlzIGF0IG1vc3Qgb25lIHBlcm1hbmVudFxuICAgKiBub3RpY2UgcGVyIHBsdWdpbjogaXQgaXMgaGlkZGVuIGJ5IHRoZSBuZXh0IHtAbGluayBQbHVnaW5Ob3RpY2VDb21wb25lbnQuc2hvd05vdGljZX0gY2FsbCBhbmQgZGlzbWlzc2VkXG4gICAqIGF1dG9tYXRpY2FsbHkgdGhlIG5leHQgdGltZSB0aGUgY29tcG9uZW50IGxvYWRzIChpLmUuIHdoZW4gdGhlIHBsdWdpbiBpcyByZS1lbmFibGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzUGVybWFuZW50PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBNYW5hZ2VzIHNob3dpbmcgcGx1Z2luIG5vdGljZXMuIEF1dG9tYXRpY2FsbHkgaGlkZXMgdGhlIHByZXZpb3VzIG5vdGljZSB3aGVuIGEgbmV3IG9uZSBpcyBzaG93bi5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk5vdGljZUNvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSBub3RpY2U6IE5vdGljZSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IHBsdWdpbiBub3RpY2UgY29tcG9uZW50LlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luTmFtZSAtIFRoZSBwbHVnaW4gbmFtZSAoc2hvd24gYXMgcHJlZml4IGluIG5vdGljZXMpLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcGx1Z2luTmFtZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNtaXNzZXMgdGhlIHBlcm1hbmVudCBub3RpY2UgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBsb2FkIChlLmcuIGEgcHJldmlvdXMgcGx1Z2luIHNlc3Npb24pIG9uIGxvYWQuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIGNvbnN0IHBlcm1hbmVudE5vdGljZSA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlKCk7XG4gICAgcGVybWFuZW50Tm90aWNlPy5oaWRlKCk7XG4gICAgdGhpcy5zZXRQZXJtYW5lbnROb3RpY2UobnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogSGlkZXMgdGhlIGN1cnJlbnQgbm90aWNlIG9uIHVubG9hZCwgdW5sZXNzIGl0IGlzIHRoZSBwZXJtYW5lbnQgbm90aWNlICh3aGljaCBpcyBtZWFudCB0byBvdXRsaXZlIHRoZSBwbHVnaW4pLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdldFBlcm1hbmVudE5vdGljZSgpICE9PSB0aGlzLm5vdGljZSkge1xuICAgICAgdGhpcy5ub3RpY2U/LmhpZGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGlzcGxheXMgYSBub3RpY2UgbWVzc2FnZSB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgbWVzc2FnZSB0byBkaXNwbGF5LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBub3RpY2UuXG4gICAqL1xuICBwdWJsaWMgc2hvd05vdGljZShtZXNzYWdlOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nLCBvcHRpb25zPzogUGx1Z2luTm90aWNlQ29tcG9uZW50U2hvd05vdGljZU9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGljZT8uaGlkZSgpO1xuXG4gICAgY29uc3QgcHJlZml4ID0gYCR7dGhpcy5wbHVnaW5OYW1lfSR7dGhpcy5fbG9hZGVkID8gJycgOiAnICh1bmxvYWRlZCknfVxcbmA7XG4gICAgY29uc3QgcHJlZml4ZWRNZXNzYWdlID0gcHJlcGVuZFByZWZpeChwcmVmaXgsIG1lc3NhZ2UpO1xuICAgIHRoaXMubm90aWNlID0gbmV3IE5vdGljZShwcmVmaXhlZE1lc3NhZ2UsIG9wdGlvbnM/LmlzUGVybWFuZW50ID8gUEVSTUFORU5UX05PVElDRV9EVVJBVElPTl9JTl9NSUxMSVNFQ09ORFMgOiB1bmRlZmluZWQpO1xuXG4gICAgaWYgKG9wdGlvbnM/LmlzUGVybWFuZW50KSB7XG4gICAgICB0aGlzLnNldFBlcm1hbmVudE5vdGljZSh0aGlzLm5vdGljZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2V0UGVybWFuZW50Tm90aWNlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGVybWFuZW50Tm90aWNlKCk6IE5vdGljZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmdldFBlcm1hbmVudE5vdGljZXMoKS5nZXQodGhpcy5wbHVnaW5OYW1lKSA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQZXJtYW5lbnROb3RpY2VzKCk6IE1hcDxzdHJpbmcsIE5vdGljZT4ge1xuICAgIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGU8TWFwPHN0cmluZywgTm90aWNlPj4oUEVSTUFORU5UX05PVElDRVNfU1RBVEVfS0VZLCBuZXcgTWFwPHN0cmluZywgTm90aWNlPigpKS52YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGVybWFuZW50Tm90aWNlKG5vdGljZTogTm90aWNlIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IG1hcCA9IHRoaXMuZ2V0UGVybWFuZW50Tm90aWNlcygpO1xuICAgIGlmIChub3RpY2UpIHtcbiAgICAgIG1hcC5zZXQodGhpcy5wbHVnaW5OYW1lLCBub3RpY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBtYXAuZGVsZXRlKHRoaXMucGx1Z2luTmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHByZXBlbmRQcmVmaXgocHJlZml4OiBzdHJpbmcsIG1lc3NhZ2U6IERvY3VtZW50RnJhZ21lbnQgfCBzdHJpbmcpOiBEb2N1bWVudEZyYWdtZW50IHwgc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBgJHtwcmVmaXh9JHttZXNzYWdlfWA7XG4gIH1cblxuICBtZXNzYWdlLnByZXBlbmQocHJlZml4KTtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1BLFNBQVMsY0FBYztBQUV2QixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLG1CQUFtQjtBQUU1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLDRDQUE0QztBQXFCM0MsTUFBTSw4QkFBOEIsWUFBWTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVE5QyxZQUE2QixZQUFvQjtBQUN0RCxVQUFNO0FBRDRCO0FBQUEsRUFFcEM7QUFBQSxFQUZvQztBQUFBLEVBUDVCLFNBQXdCO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFjaEIsU0FBZTtBQUM3QixVQUFNLE9BQU87QUFDYixVQUFNLGtCQUFrQixLQUFLLG1CQUFtQjtBQUNoRCxxQkFBaUIsS0FBSztBQUN0QixTQUFLLG1CQUFtQixJQUFJO0FBQUEsRUFDOUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtnQixXQUFpQjtBQUMvQixRQUFJLEtBQUssbUJBQW1CLE1BQU0sS0FBSyxRQUFRO0FBQzdDLFdBQUssUUFBUSxLQUFLO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRTyxXQUFXLFNBQW9DLFNBQXdEO0FBQzVHLFNBQUssUUFBUSxLQUFLO0FBRWxCLFVBQU0sU0FBUyxHQUFHLEtBQUssVUFBVSxHQUFHLEtBQUssVUFBVSxLQUFLLGFBQWE7QUFBQTtBQUNyRSxVQUFNLGtCQUFrQixjQUFjLFFBQVEsT0FBTztBQUNyRCxTQUFLLFNBQVMsSUFBSSxPQUFPLGlCQUFpQixTQUFTLGNBQWMsNENBQTRDLE1BQVM7QUFFdEgsUUFBSSxTQUFTLGFBQWE7QUFDeEIsV0FBSyxtQkFBbUIsS0FBSyxNQUFNO0FBQUEsSUFDckMsT0FBTztBQUNMLFdBQUssbUJBQW1CLElBQUk7QUFBQSxJQUM5QjtBQUFBLEVBQ0Y7QUFBQSxFQUVRLHFCQUFvQztBQUMxQyxXQUFPLEtBQUssb0JBQW9CLEVBQUUsSUFBSSxLQUFLLFVBQVUsS0FBSztBQUFBLEVBQzVEO0FBQUEsRUFFUSxzQkFBMkM7QUFDakQsV0FBTyx5QkFBOEMsNkJBQTZCLG9CQUFJLElBQW9CLENBQUMsRUFBRTtBQUFBLEVBQy9HO0FBQUEsRUFFUSxtQkFBbUIsUUFBNkI7QUFDdEQsVUFBTSxNQUFNLEtBQUssb0JBQW9CO0FBQ3JDLFFBQUksUUFBUTtBQUNWLFVBQUksSUFBSSxLQUFLLFlBQVksTUFBTTtBQUFBLElBQ2pDLE9BQU87QUFDTCxVQUFJLE9BQU8sS0FBSyxVQUFVO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQ0Y7QUFFQSxTQUFTLGNBQWMsUUFBZ0IsU0FBK0Q7QUFDcEcsTUFBSSxPQUFPLFlBQVksVUFBVTtBQUMvQixXQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU87QUFBQSxFQUM1QjtBQUVBLFVBQVEsUUFBUSxNQUFNO0FBQ3RCLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K