@mnaoumov/typescript-lib 0.0.0 → 1.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 (180) hide show
  1. package/@types/debug/package.json +4 -0
  2. package/LICENSE +21 -0
  3. package/README.md +7 -1
  4. package/dist/lib/cjs/@types/debug.d.cts +21 -0
  5. package/dist/lib/cjs/abort-controller.cjs +202 -0
  6. package/dist/lib/cjs/abort-controller.d.cts +135 -0
  7. package/dist/lib/cjs/aggregate-error.cjs +98 -0
  8. package/dist/lib/cjs/aggregate-error.d.cts +24 -0
  9. package/dist/lib/cjs/array-buffer.cjs +96 -0
  10. package/dist/lib/cjs/array-buffer.d.cts +16 -0
  11. package/dist/lib/cjs/array.cjs +134 -0
  12. package/dist/lib/cjs/array.d.cts +46 -0
  13. package/dist/lib/cjs/async-events.cjs +466 -0
  14. package/dist/lib/cjs/async-events.d.cts +456 -0
  15. package/dist/lib/cjs/async-operation-hook.cjs +113 -0
  16. package/dist/lib/cjs/async-operation-hook.d.cts +59 -0
  17. package/dist/lib/cjs/async.cjs +521 -0
  18. package/dist/lib/cjs/async.d.cts +414 -0
  19. package/dist/lib/cjs/beeper.cjs +126 -0
  20. package/dist/lib/cjs/beeper.d.cts +21 -0
  21. package/dist/lib/cjs/blob.cjs +160 -0
  22. package/dist/lib/cjs/blob.d.cts +59 -0
  23. package/dist/lib/cjs/bytes.cjs +114 -0
  24. package/dist/lib/cjs/bytes.d.cts +17 -0
  25. package/dist/lib/cjs/debug-controller.cjs +80 -0
  26. package/dist/lib/cjs/debug-controller.d.cts +87 -0
  27. package/dist/lib/cjs/debug.cjs +235 -0
  28. package/dist/lib/cjs/debug.d.cts +66 -0
  29. package/dist/lib/cjs/desktop-zip-extractor.cjs +215 -0
  30. package/dist/lib/cjs/desktop-zip-extractor.d.cts +95 -0
  31. package/dist/lib/cjs/disposable.cjs +414 -0
  32. package/dist/lib/cjs/disposable.d.cts +387 -0
  33. package/dist/lib/cjs/enum.cjs +100 -0
  34. package/dist/lib/cjs/enum.d.cts +24 -0
  35. package/dist/lib/cjs/error.cjs +297 -0
  36. package/dist/lib/cjs/error.d.cts +181 -0
  37. package/dist/lib/cjs/function.cjs +141 -0
  38. package/dist/lib/cjs/function.d.cts +128 -0
  39. package/dist/lib/cjs/html-element.cjs +341 -0
  40. package/dist/lib/cjs/html-element.d.cts +199 -0
  41. package/dist/lib/cjs/index.cjs +195 -0
  42. package/dist/lib/cjs/index.d.cts +33 -0
  43. package/dist/lib/cjs/jpeg-metadata.cjs +228 -0
  44. package/dist/lib/cjs/jpeg-metadata.d.cts +42 -0
  45. package/dist/lib/cjs/library.cjs +158 -0
  46. package/dist/lib/cjs/library.d.cts +96 -0
  47. package/dist/lib/cjs/object-utils.cjs +617 -0
  48. package/dist/lib/cjs/object-utils.d.cts +298 -0
  49. package/dist/lib/cjs/path.cjs +202 -0
  50. package/dist/lib/cjs/path.d.cts +154 -0
  51. package/dist/lib/cjs/reg-exp.cjs +254 -0
  52. package/dist/lib/cjs/reg-exp.d.cts +87 -0
  53. package/dist/lib/cjs/string.cjs +326 -0
  54. package/dist/lib/cjs/string.d.cts +361 -0
  55. package/dist/lib/cjs/transformers/date-transformer.cjs +129 -0
  56. package/dist/lib/cjs/transformers/date-transformer.d.cts +39 -0
  57. package/dist/lib/cjs/transformers/group-transformer.cjs +173 -0
  58. package/dist/lib/cjs/transformers/group-transformer.d.cts +70 -0
  59. package/dist/lib/cjs/transformers/index.cjs +123 -0
  60. package/dist/lib/cjs/transformers/index.d.cts +9 -0
  61. package/dist/lib/cjs/transformers/map-transformer.cjs +129 -0
  62. package/dist/lib/cjs/transformers/map-transformer.d.cts +41 -0
  63. package/dist/lib/cjs/transformers/set-transformer.cjs +129 -0
  64. package/dist/lib/cjs/transformers/set-transformer.d.cts +39 -0
  65. package/dist/lib/cjs/transformers/skip-private-property-transformer.cjs +127 -0
  66. package/dist/lib/cjs/transformers/skip-private-property-transformer.d.cts +36 -0
  67. package/dist/lib/cjs/transformers/transformer.cjs +170 -0
  68. package/dist/lib/cjs/transformers/transformer.d.cts +70 -0
  69. package/dist/lib/cjs/transformers/two-way-map-transformer.cjs +130 -0
  70. package/dist/lib/cjs/transformers/two-way-map-transformer.d.cts +42 -0
  71. package/dist/lib/cjs/transformers/typed-transformer.cjs +94 -0
  72. package/dist/lib/cjs/transformers/typed-transformer.d.cts +39 -0
  73. package/dist/lib/cjs/two-way-map.cjs +208 -0
  74. package/dist/lib/cjs/two-way-map.d.cts +101 -0
  75. package/dist/lib/cjs/type-guards.cjs +128 -0
  76. package/dist/lib/cjs/type-guards.d.cts +84 -0
  77. package/dist/lib/cjs/type.cjs +121 -0
  78. package/dist/lib/cjs/type.d.cts +122 -0
  79. package/dist/lib/cjs/typescript-lib-state.cjs +126 -0
  80. package/dist/lib/cjs/typescript-lib-state.d.cts +56 -0
  81. package/dist/lib/cjs/url.cjs +136 -0
  82. package/dist/lib/cjs/url.d.cts +74 -0
  83. package/dist/lib/cjs/value-provider.cjs +100 -0
  84. package/dist/lib/cjs/value-provider.d.cts +28 -0
  85. package/dist/lib/cjs/value-wrapper.cjs +144 -0
  86. package/dist/lib/cjs/value-wrapper.d.cts +47 -0
  87. package/dist/lib/esm/@types/debug.d.mts +21 -0
  88. package/dist/lib/esm/abort-controller.d.mts +135 -0
  89. package/dist/lib/esm/abort-controller.mjs +159 -0
  90. package/dist/lib/esm/aggregate-error.d.mts +24 -0
  91. package/dist/lib/esm/aggregate-error.mjs +60 -0
  92. package/dist/lib/esm/array-buffer.d.mts +16 -0
  93. package/dist/lib/esm/array-buffer.mjs +58 -0
  94. package/dist/lib/esm/array.d.mts +46 -0
  95. package/dist/lib/esm/array.mjs +93 -0
  96. package/dist/lib/esm/async-events.d.mts +456 -0
  97. package/dist/lib/esm/async-events.mjs +427 -0
  98. package/dist/lib/esm/async-operation-hook.d.mts +59 -0
  99. package/dist/lib/esm/async-operation-hook.mjs +71 -0
  100. package/dist/lib/esm/async.d.mts +414 -0
  101. package/dist/lib/esm/async.mjs +479 -0
  102. package/dist/lib/esm/beeper.d.mts +21 -0
  103. package/dist/lib/esm/beeper.mjs +88 -0
  104. package/dist/lib/esm/blob.d.mts +59 -0
  105. package/dist/lib/esm/blob.mjs +121 -0
  106. package/dist/lib/esm/bytes.d.mts +17 -0
  107. package/dist/lib/esm/bytes.mjs +76 -0
  108. package/dist/lib/esm/debug-controller.d.mts +87 -0
  109. package/dist/lib/esm/debug-controller.mjs +50 -0
  110. package/dist/lib/esm/debug.d.mts +66 -0
  111. package/dist/lib/esm/debug.mjs +185 -0
  112. package/dist/lib/esm/desktop-zip-extractor.d.mts +95 -0
  113. package/dist/lib/esm/desktop-zip-extractor.mjs +180 -0
  114. package/dist/lib/esm/disposable.d.mts +387 -0
  115. package/dist/lib/esm/disposable.mjs +360 -0
  116. package/dist/lib/esm/enum.d.mts +24 -0
  117. package/dist/lib/esm/enum.mjs +61 -0
  118. package/dist/lib/esm/error.d.mts +181 -0
  119. package/dist/lib/esm/error.mjs +248 -0
  120. package/dist/lib/esm/function.d.mts +128 -0
  121. package/dist/lib/esm/function.mjs +96 -0
  122. package/dist/lib/esm/html-element.d.mts +199 -0
  123. package/dist/lib/esm/html-element.mjs +291 -0
  124. package/dist/lib/esm/index.d.mts +33 -0
  125. package/dist/lib/esm/index.mjs +116 -0
  126. package/dist/lib/esm/jpeg-metadata.d.mts +42 -0
  127. package/dist/lib/esm/jpeg-metadata.mjs +189 -0
  128. package/dist/lib/esm/library.d.mts +96 -0
  129. package/dist/lib/esm/library.mjs +118 -0
  130. package/dist/lib/esm/object-utils.d.mts +298 -0
  131. package/dist/lib/esm/object-utils.mjs +567 -0
  132. package/dist/lib/esm/path.d.mts +154 -0
  133. package/dist/lib/esm/path.mjs +139 -0
  134. package/dist/lib/esm/reg-exp.d.mts +87 -0
  135. package/dist/lib/esm/reg-exp.mjs +213 -0
  136. package/dist/lib/esm/string.d.mts +361 -0
  137. package/dist/lib/esm/string.mjs +274 -0
  138. package/dist/lib/esm/transformers/date-transformer.d.mts +39 -0
  139. package/dist/lib/esm/transformers/date-transformer.mjs +91 -0
  140. package/dist/lib/esm/transformers/group-transformer.d.mts +70 -0
  141. package/dist/lib/esm/transformers/group-transformer.mjs +138 -0
  142. package/dist/lib/esm/transformers/index.d.mts +9 -0
  143. package/dist/lib/esm/transformers/index.mjs +68 -0
  144. package/dist/lib/esm/transformers/map-transformer.d.mts +41 -0
  145. package/dist/lib/esm/transformers/map-transformer.mjs +91 -0
  146. package/dist/lib/esm/transformers/set-transformer.d.mts +39 -0
  147. package/dist/lib/esm/transformers/set-transformer.mjs +91 -0
  148. package/dist/lib/esm/transformers/skip-private-property-transformer.d.mts +36 -0
  149. package/dist/lib/esm/transformers/skip-private-property-transformer.mjs +89 -0
  150. package/dist/lib/esm/transformers/transformer.d.mts +70 -0
  151. package/dist/lib/esm/transformers/transformer.mjs +132 -0
  152. package/dist/lib/esm/transformers/two-way-map-transformer.d.mts +42 -0
  153. package/dist/lib/esm/transformers/two-way-map-transformer.mjs +92 -0
  154. package/dist/lib/esm/transformers/typed-transformer.d.mts +39 -0
  155. package/dist/lib/esm/transformers/typed-transformer.mjs +56 -0
  156. package/dist/lib/esm/two-way-map.d.mts +101 -0
  157. package/dist/lib/esm/two-way-map.mjs +170 -0
  158. package/dist/lib/esm/type-guards.d.mts +84 -0
  159. package/dist/lib/esm/type-guards.mjs +85 -0
  160. package/dist/lib/esm/type.d.mts +122 -0
  161. package/dist/lib/esm/type.mjs +83 -0
  162. package/dist/lib/esm/typescript-lib-state.d.mts +56 -0
  163. package/dist/lib/esm/typescript-lib-state.mjs +84 -0
  164. package/dist/lib/esm/url.d.mts +74 -0
  165. package/dist/lib/esm/url.mjs +94 -0
  166. package/dist/lib/esm/value-provider.d.mts +28 -0
  167. package/dist/lib/esm/value-provider.mjs +62 -0
  168. package/dist/lib/esm/value-wrapper.d.mts +47 -0
  169. package/dist/lib/esm/value-wrapper.mjs +106 -0
  170. package/package.json +111 -13
  171. package/transformers/date-transformer/package.json +6 -0
  172. package/transformers/group-transformer/package.json +6 -0
  173. package/transformers/index/package.json +6 -0
  174. package/transformers/map-transformer/package.json +6 -0
  175. package/transformers/package.json +6 -0
  176. package/transformers/set-transformer/package.json +6 -0
  177. package/transformers/skip-private-property-transformer/package.json +6 -0
  178. package/transformers/transformer/package.json +6 -0
  179. package/transformers/two-way-map-transformer/package.json +6 -0
  180. package/transformers/typed-transformer/package.json +6 -0
@@ -0,0 +1,466 @@
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 () {
7
+ function ensureDisposeSymbols(symbolConstructor = Symbol) {
8
+ symbolConstructor.asyncDispose ??= symbolConstructor.for('Symbol.asyncDispose');
9
+ symbolConstructor.dispose ??= symbolConstructor.for('Symbol.dispose');
10
+ }
11
+
12
+ function ensureBrowserProcess() {
13
+ const browserProcess = {
14
+ browser: true,
15
+ cwd() {
16
+ return '/';
17
+ },
18
+ env: {},
19
+ platform: 'android'
20
+ };
21
+
22
+ // eslint-disable-next-line obsidianmd/no-global-this, unicorn/no-unnecessary-global-this -- Must stay `globalThis`-qualified: in the emitted banner a bare `process` is a free identifier, so reading it where the host has none throws a ReferenceError instead of yielding `undefined`. That is the very case this function exists to handle.
23
+ const existingProcess = globalThis.process;
24
+
25
+ if (!existingProcess) {
26
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
27
+ globalThis.process = browserProcess;
28
+ return;
29
+ }
30
+
31
+ if (existingProcess.versions?.node) {
32
+ return;
33
+ }
34
+
35
+ const existingProcessRecord = existingProcess;
36
+
37
+ for (const [key, value] of Object.entries(browserProcess)) {
38
+ existingProcessRecord[key] ??= value;
39
+ }
40
+
41
+ existingProcessRecord['browser'] = true;
42
+ }
43
+
44
+ function keepName($unknown) {
45
+ return $unknown;
46
+ }
47
+
48
+ (function initCjs() {
49
+ // eslint-disable-next-line obsidianmd/no-global-this -- Actively use globalThis.
50
+ const globalThisRecord = globalThis;
51
+ ensureDisposeSymbols();
52
+ globalThisRecord['__name'] ??= keepName;
53
+ globalThisRecord['__extractDefault'] ??= extractDefault;
54
+
55
+ ensureBrowserProcess();
56
+
57
+ // eslint-disable-next-line unicorn/consistent-function-scoping -- Serialized with initCjs into the banner; at module scope it would be left out of it.
58
+ function extractDefault(module) {
59
+ return module && module.__esModule && 'default' in module ? module.default : module;
60
+ }
61
+ })();
62
+ })();
63
+
64
+ "use strict";
65
+ var __defProp = Object.defineProperty;
66
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
67
+ var __getOwnPropNames = Object.getOwnPropertyNames;
68
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
69
+ var __export = (target, all) => {
70
+ for (var name in all)
71
+ __defProp(target, name, { get: all[name], enumerable: true });
72
+ };
73
+ var __copyProps = (to, from, except, desc) => {
74
+ if (from && typeof from === "object" || typeof from === "function") {
75
+ for (let key of __getOwnPropNames(from))
76
+ if (!__hasOwnProp.call(to, key) && key !== except)
77
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
78
+ }
79
+ return to;
80
+ };
81
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
82
+ var async_events_exports = {};
83
+ __export(async_events_exports, {
84
+ AsyncEventRefDisposable: () => AsyncEventRefDisposable,
85
+ AsyncEvents: () => AsyncEvents,
86
+ AsyncEventsBase: () => AsyncEventsBase,
87
+ mixinAsyncEvents: () => mixinAsyncEvents,
88
+ subscribeAsyncDisposableEvent: () => subscribeAsyncDisposableEvent
89
+ });
90
+ module.exports = __toCommonJS(async_events_exports);
91
+ var import_array = require('./array.cjs');
92
+ var import_disposable = require('./disposable.cjs');
93
+ class AsyncEventRefDisposable extends import_disposable.AsyncDisposableBase {
94
+ /**
95
+ * Creates a disposable wrapping an existing {@link AsyncEventRef}.
96
+ *
97
+ * @param asyncEventRef - The async event reference to unregister on dispose.
98
+ */
99
+ constructor(asyncEventRef) {
100
+ super();
101
+ this.asyncEventRef = asyncEventRef;
102
+ }
103
+ asyncEventRef;
104
+ /**
105
+ * Unregisters the event via the source stored on the ref (`asyncEventSource.offref`).
106
+ */
107
+ performDisposeAsync() {
108
+ this.asyncEventRef.asyncEventSource.offref(this.asyncEventRef);
109
+ }
110
+ }
111
+ class AsyncEventsBase {
112
+ /**
113
+ * The registry mapping each event name to its list of registered listener references.
114
+ */
115
+ eventReferencesMap = /* @__PURE__ */ new Map();
116
+ /**
117
+ * Remove an event listener.
118
+ *
119
+ * @typeParam EventName - The name of the event.
120
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
121
+ * @param name - The name of the event.
122
+ * @param callback - The callback to remove.
123
+ *
124
+ * @example
125
+ * ```ts
126
+ * events.off('my-event', myListener);
127
+ * ```
128
+ */
129
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
130
+ off(name, callback) {
131
+ const eventRefs = this.eventReferencesMap.get(name);
132
+ if (!eventRefs) {
133
+ return;
134
+ }
135
+ (0, import_array.filterInPlace)(eventRefs, (eventRef) => eventRef.callback !== callback);
136
+ if (eventRefs.length === 0) {
137
+ this.eventReferencesMap.delete(name);
138
+ }
139
+ }
140
+ /**
141
+ * Remove an event listener by reference.
142
+ *
143
+ * @param eventRef - The reference to the event listener.
144
+ *
145
+ * @example
146
+ * ```ts
147
+ * events.offref(myRef);
148
+ * ```
149
+ */
150
+ offref(eventRef) {
151
+ const eventRefs = this.eventReferencesMap.get(eventRef.name);
152
+ if (!eventRefs) {
153
+ return;
154
+ }
155
+ (0, import_array.filterInPlace)(eventRefs, (storedEventRef) => storedEventRef !== eventRef);
156
+ if (eventRefs.length === 0) {
157
+ this.eventReferencesMap.delete(eventRef.name);
158
+ }
159
+ }
160
+ /**
161
+ * Add an event listener.
162
+ *
163
+ * @typeParam EventName - The name of the event.
164
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
165
+ * @param name - The name of the event.
166
+ * @param callback - The callback to call when the event is triggered.
167
+ * @param thisArgument - The context passed as `this` to the `callback`.
168
+ * @returns A reference to the event listener.
169
+ *
170
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `Events.on` (or once, correspondingly).
171
+ *
172
+ * @example
173
+ * ```ts
174
+ * events.on('my-event', async (arg1, arg2) => {
175
+ * await sleep(100);
176
+ * console.log(arg1, arg2);
177
+ * });
178
+ * ```
179
+ */
180
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
181
+ on(name, callback, thisArgument) {
182
+ let eventRefs = this.eventReferencesMap.get(name);
183
+ if (!eventRefs) {
184
+ eventRefs = [];
185
+ this.eventReferencesMap.set(name, eventRefs);
186
+ }
187
+ const eventRef = {
188
+ asyncEventSource: this,
189
+ callback,
190
+ name,
191
+ thisArgument
192
+ };
193
+ eventRefs.push(eventRef);
194
+ return eventRef;
195
+ }
196
+ /**
197
+ * Add an event listener that will be triggered only once.
198
+ *
199
+ * @typeParam EventName - The name of the event.
200
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
201
+ * @param name - The name of the event.
202
+ * @param callback - The callback to call when the event is triggered.
203
+ * @param thisArgument - The context passed as `this` to the `callback`.
204
+ * @returns A reference to the event listener.
205
+ *
206
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `Events.on` (or once, correspondingly).
207
+ *
208
+ * @example
209
+ * ```ts
210
+ * events.once('my-event', async (arg1, arg2) => {
211
+ * await sleep(100);
212
+ * console.log(arg1, arg2);
213
+ * });
214
+ * ```
215
+ */
216
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
217
+ once(name, callback, thisArgument) {
218
+ const originalEventRef = this.on(name, callback, thisArgument);
219
+ const cleanupEventRef = this.on(name, () => {
220
+ this.offref(originalEventRef);
221
+ this.offref(cleanupEventRef);
222
+ });
223
+ return originalEventRef;
224
+ }
225
+ /**
226
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
227
+ *
228
+ * @typeParam EventName - The name of the event.
229
+ * @param name - The name of the event.
230
+ * @param $arguments - The data to pass to the event listeners.
231
+ *
232
+ * @example
233
+ * ```ts
234
+ * events.trigger('my-event', 'arg1', 'arg2');
235
+ * ```
236
+ */
237
+ trigger(name, ...$arguments) {
238
+ const eventRefs = this.eventReferencesMap.get(name) ?? [];
239
+ for (const eventRef of (0, import_array.snapshot)(eventRefs)) {
240
+ this.tryTrigger(eventRef, $arguments);
241
+ }
242
+ }
243
+ /**
244
+ * Trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
245
+ *
246
+ * @typeParam EventName - The name of the event.
247
+ * @param name - The name of the event.
248
+ * @param $arguments - The data to pass to the event listeners.
249
+ * @returns A {@link Promise} that resolves when all listeners have completed.
250
+ */
251
+ async triggerAsync(name, ...$arguments) {
252
+ const eventRefs = this.eventReferencesMap.get(name) ?? [];
253
+ for (const eventRef of (0, import_array.snapshot)(eventRefs)) {
254
+ await this.tryTriggerAsync(eventRef, $arguments);
255
+ }
256
+ }
257
+ /**
258
+ * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
259
+ *
260
+ * @typeParam Arguments - The types of the arguments the function accepts.
261
+ * @param eventRef - The event reference.
262
+ * @param $arguments - The data to pass to the event listeners.
263
+ *
264
+ * @example
265
+ * ```ts
266
+ * events.tryTrigger(myRef, ['arg1', 'arg2']);
267
+ * ```
268
+ */
269
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
270
+ tryTrigger(eventRef, $arguments) {
271
+ try {
272
+ const result = eventRef.callback.call(eventRef.thisArgument, ...$arguments);
273
+ if (result instanceof Promise) {
274
+ result.catch(throwDelayed);
275
+ }
276
+ } catch (error) {
277
+ throwDelayed(error);
278
+ }
279
+ }
280
+ /**
281
+ * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
282
+ *
283
+ * @typeParam Arguments - The types of the arguments the function accepts.
284
+ * @param eventRef - The event reference.
285
+ * @param $arguments - The data to pass to the event listeners.
286
+ * @returns A {@link Promise} that resolves when all listeners have completed.
287
+ */
288
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
289
+ async tryTriggerAsync(eventRef, $arguments) {
290
+ try {
291
+ await eventRef.callback.call(eventRef.thisArgument, ...$arguments);
292
+ } catch (error) {
293
+ throwDelayed(error);
294
+ }
295
+ }
296
+ }
297
+ class AsyncEvents extends AsyncEventsBase {
298
+ /**
299
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
300
+ *
301
+ * @typeParam EventName - The name of the event.
302
+ * @param name - The name of the event.
303
+ * @param $arguments - The data to pass to the event listeners.
304
+ */
305
+ trigger(name, ...$arguments) {
306
+ super.trigger(name, ...$arguments);
307
+ }
308
+ /**
309
+ * Trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
310
+ *
311
+ * @typeParam EventName - The name of the event.
312
+ * @param name - The name of the event.
313
+ * @param $arguments - The data to pass to the event listeners.
314
+ * @returns A {@link Promise} that resolves when all listeners have completed.
315
+ */
316
+ triggerAsync(name, ...$arguments) {
317
+ return super.triggerAsync(name, ...$arguments);
318
+ }
319
+ /**
320
+ * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
321
+ *
322
+ * @typeParam Arguments - The types of the arguments the function accepts.
323
+ * @param eventRef - The event reference.
324
+ * @param $arguments - The data to pass to the event listeners.
325
+ */
326
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
327
+ tryTrigger(eventRef, $arguments) {
328
+ super.tryTrigger(eventRef, $arguments);
329
+ }
330
+ /**
331
+ * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
332
+ *
333
+ * @typeParam Arguments - The types of the arguments the function accepts.
334
+ * @param eventRef - The event reference.
335
+ * @param $arguments - The data to pass to the event listeners.
336
+ * @returns A {@link Promise} that resolves when all listeners have completed.
337
+ */
338
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
339
+ async tryTriggerAsync(eventRef, $arguments) {
340
+ return super.tryTriggerAsync(eventRef, $arguments);
341
+ }
342
+ }
343
+ function mixinAsyncEvents() {
344
+ return function inner(baseClass) {
345
+ class AsyncEventsMixin extends baseClass {
346
+ #asyncEvents = new AsyncEvents();
347
+ /**
348
+ * Remove an event listener.
349
+ *
350
+ * @typeParam EventName - The name of the event.
351
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
352
+ * @param name - The name of the event.
353
+ * @param callback - The callback to remove.
354
+ */
355
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
356
+ off(name, callback) {
357
+ this.#asyncEvents.off(name, callback);
358
+ }
359
+ /**
360
+ * Remove an event listener by reference.
361
+ *
362
+ * @param eventRef - The event reference to remove.
363
+ */
364
+ offref(eventRef) {
365
+ this.#asyncEvents.offref(eventRef);
366
+ }
367
+ /**
368
+ * Add an event listener.
369
+ *
370
+ * @typeParam EventName - The name of the event.
371
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
372
+ * @param name - The name of the event.
373
+ * @param callback - The callback to call when the event is triggered.
374
+ * @param thisArgument - The context passed as `this` to the `callback`.
375
+ * @returns A reference to the event listener.
376
+ *
377
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `Events.on` (or once, correspondingly).
378
+ */
379
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
380
+ on(name, callback, thisArgument) {
381
+ return this.#asyncEvents.on(name, callback, thisArgument);
382
+ }
383
+ /**
384
+ * Add an event listener that will be called only once.
385
+ *
386
+ * @typeParam EventName - The name of the event.
387
+ * @typeParam Arguments - The types of the arguments the event callback accepts.
388
+ * @param name - The name of the event.
389
+ * @param callback - The callback to call when the event is triggered.
390
+ * @param thisArgument - The context passed as `this` to the `callback`.
391
+ * @returns A reference to the event listener.
392
+ *
393
+ * @remarks Not refactored to parameter-object pattern, to keep the parity with Obsidian's `Events.on` (or once, correspondingly).
394
+ */
395
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- We need to use the dummy parameter to get type inference.
396
+ once(name, callback, thisArgument) {
397
+ return this.#asyncEvents.once(name, callback, thisArgument);
398
+ }
399
+ /**
400
+ * Trigger an event, executing all the listeners in order even if some of them throw an error.
401
+ *
402
+ * @typeParam EventName - The name of the event.
403
+ * @param name - The name of the event.
404
+ * @param $arguments - The data to pass to the event listeners.
405
+ */
406
+ trigger(name, ...$arguments) {
407
+ this.#asyncEvents.trigger(name, ...$arguments);
408
+ }
409
+ /**
410
+ * Trigger an event asynchronously.
411
+ *
412
+ * @typeParam EventName - The name of the event.
413
+ * @param name - The name of the event.
414
+ * @param $arguments - The data to pass to the event listeners.
415
+ * @returns A {@link Promise} that resolves when all listeners have completed.
416
+ */
417
+ async triggerAsync(name, ...$arguments) {
418
+ await this.#asyncEvents.triggerAsync(name, ...$arguments);
419
+ }
420
+ /**
421
+ * Try to trigger an event, executing all the listeners in order even if some of them throw an error.
422
+ *
423
+ * @typeParam Arguments - The types of the arguments the function accepts.
424
+ * @param eventRef - The event reference.
425
+ * @param $arguments - The data to pass to the event listeners.
426
+ */
427
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
428
+ tryTrigger(eventRef, $arguments) {
429
+ this.#asyncEvents.tryTrigger(eventRef, $arguments);
430
+ }
431
+ /**
432
+ * Try to trigger an event asynchronously, executing all the listeners in order even if some of them throw an error.
433
+ *
434
+ * @typeParam Arguments - The types of the arguments the function accepts.
435
+ * @param eventRef - The event reference.
436
+ * @param $arguments - The data to pass to the event listeners.
437
+ * @returns A {@link Promise} that resolves when all listeners have completed.
438
+ */
439
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- Parity with Obsidian's Events.tryTrigger.
440
+ async tryTriggerAsync(eventRef, $arguments) {
441
+ await this.#asyncEvents.tryTriggerAsync(eventRef, $arguments);
442
+ }
443
+ }
444
+ return AsyncEventsMixin;
445
+ };
446
+ }
447
+ function subscribeAsyncDisposableEvent(params) {
448
+ return new AsyncEventRefDisposable(asAsyncEventSource(params.asyncEventSource).on(params.name, params.callback, params.thisArgument));
449
+ }
450
+ function asAsyncEventSource(value) {
451
+ return value;
452
+ }
453
+ function throwDelayed(error) {
454
+ window.setTimeout(() => {
455
+ throw error;
456
+ }, 0);
457
+ }
458
+ // Annotate the CommonJS export names for ESM import in node:
459
+ 0 && (module.exports = {
460
+ AsyncEventRefDisposable,
461
+ AsyncEvents,
462
+ AsyncEventsBase,
463
+ mixinAsyncEvents,
464
+ subscribeAsyncDisposableEvent
465
+ });
466
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2FzeW5jLWV2ZW50cy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEFzeW5jIGV2ZW50IGVtaXR0ZXIuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBYnN0cmFjdENvbnN0cnVjdG9yLFxuICBQcm9taXNhYmxlXG59IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB0eXBlIHsgQXN5bmNEaXNwb3NhYmxlRXggfSBmcm9tICcuL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmljUHJvbWlzYWJsZVZvaWRGdW5jdGlvbiB9IGZyb20gJy4vZnVuY3Rpb24udHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdLZXlzIH0gZnJvbSAnLi90eXBlLnRzJztcblxuaW1wb3J0IHtcbiAgZmlsdGVySW5QbGFjZSxcbiAgc25hcHNob3Rcbn0gZnJvbSAnLi9hcnJheS50cyc7XG5pbXBvcnQgeyBBc3luY0Rpc3Bvc2FibGVCYXNlIH0gZnJvbSAnLi9kaXNwb3NhYmxlLnRzJztcblxuZGVjbGFyZSBjb25zdCBBU1lOQ19FVkVOVF9NQVA6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRXZlbnRSZWYge1xuICAvKipcbiAgICogQW4gZXZlbnQgc291cmNlLlxuICAgKi9cbiAgYXN5bmNFdmVudFNvdXJjZTogR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2U7XG5cbiAgLyoqXG4gICAqIEEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqL1xuICBjYWxsYmFjazogR2VuZXJpY0NhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBBIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICovXG4gIHRoaXNBcmd1bWVudDogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBBc3luYyBldmVudCBlbWl0dGVyIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwIGV4dGVuZHMgRXZlbnRNYXBDb25zdHJhaW50PEV2ZW50TWFwPiA9IEV2ZW50TWFwQmFzZT4gZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBQaGFudG9tIG1hcmtlciB0aGF0IG1ha2VzIHtAbGluayBFdmVudE1hcH0gaW5mZXJhYmxlIGZyb20gYW4ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IChlLmcuIHZpYVxuICAgKiBgU291cmNlIGV4dGVuZHMgQXN5bmNFdmVudFNvdXJjZTxpbmZlciBFdmVudE1hcD5gKS4gTmV2ZXIgcHJlc2VudCBhdCBydW50aW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgW0FTWU5DX0VWRU5UX01BUF0/OiBFdmVudE1hcDtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byByZW1vdmUuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vZmYoJ215LWV2ZW50JywgbXlMaXN0ZW5lcik7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9mZjogPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gICkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgYXJndW1lbnRzIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZC5cbiAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICpcbiAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub24oJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4sIEFyZ3VtZW50cyBleHRlbmRzIENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+PihcbiAgICBuYW1lOiBFdmVudE5hbWUsXG4gICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgdGhpc0FyZ3VtZW50PzogdW5rbm93blxuICApID0+IEFzeW5jRXZlbnRSZWY7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgdHJpZ2dlcmVkIG9ubHkgb25jZS5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAqIEBwYXJhbSB0aGlzQXJndW1lbnQgLSBUaGUgY29udGV4dCBwYXNzZWQgYXMgYHRoaXNgIHRvIHRoZSBgY2FsbGJhY2tgLlxuICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEByZW1hcmtzIE5vdCByZWZhY3RvcmVkIHRvIHBhcmFtZXRlci1vYmplY3QgcGF0dGVybiwgdG8ga2VlcCB0aGUgcGFyaXR5IHdpdGggT2JzaWRpYW4ncyBgRXZlbnRzLm9uYCAob3Igb25jZSwgY29ycmVzcG9uZGluZ2x5KS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9uY2UoJ215LWV2ZW50JywgYXN5bmMgKGFyZzEsIGFyZzIpID0+IHtcbiAgICogICAgIGF3YWl0IHNsZWVwKDEwMCk7XG4gICAqICAgICBjb25zb2xlLmxvZyhhcmcxLCBhcmcyKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIG9uY2U6IDxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICkgPT4gQXN5bmNFdmVudFJlZjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZXhwb3NpbmcgZXZlbnQtdHJpZ2dlcmluZyBtZXRob2RzIGZvciBzdWJjbGFzc2VzIG9mIG1peGluLWNyZWF0ZWQgY2xhc3Nlcy5cbiAqXG4gKiBUaGVzZSBtZXRob2RzIGFyZSBgcHJvdGVjdGVkYCBhdCBydW50aW1lIGJ1dCBzdXJmYWNlZCBpbiB0aGUgZGVjbGFyYXRpb24gdHlwZVxuICogYmVjYXVzZSBUeXBlU2NyaXB0IGNhbm5vdCByZXByZXNlbnQgYHByb3RlY3RlZGAgaW4gYW5vbnltb3VzLWNsYXNzIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNFdmVudFRyaWdnZXI8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICB0cmlnZ2VyOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgdHJpZ2dlckFzeW5jOiA8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHRyeVRyaWdnZXI6IDxBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10+KGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmLCAkYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgdHJ5VHJpZ2dlckFzeW5jOiA8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIGNhbGxiYWNrIGFyZ3VtZW50IHR5cGVzIGZvciBhbiBldmVudC5cbiAqXG4gKiAtIFdoZW4gYEV2ZW50TWFwYCBoYXMgYW4gaW5kZXggc2lnbmF0dXJlICh1bnR5cGVkIGRlZmF1bHQpOiByZXR1cm5zIGB1bmtub3duW11gLFxuICogICBhbGxvd2luZyBgQXJnc2AgdG8gYmUgaW5mZXJyZWQgZnJlZWx5IGZyb20gdGhlIGNhbGxiYWNrLlxuICogLSBXaGVuIGBFdmVudE1hcGAgaGFzIGV4cGxpY2l0IGtleXMgb25seSAodHlwZWQgbWFwKTogcmV0dXJucyBgRXZlbnRNYXBbRXZlbnROYW1lXWAsXG4gKiAgIGVuZm9yY2luZyB0aGUgZGVjbGFyZWQgYXJndW1lbnQgdHlwZXMgYW5kIGVuYWJsaW5nIGF1dG9jb21wbGV0ZS5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZSBleHRlbmRzIHN0cmluZz4gPSBzdHJpbmcgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IHVua25vd25bXVxuICA6IChFdmVudE5hbWUgZXh0ZW5kcyBrZXlvZiBFdmVudE1hcCA/IEV2ZW50TWFwW0V2ZW50TmFtZV0gOiB1bmtub3duW10pO1xuXG4vKipcbiAqIEJhc2UgZXZlbnQgbWFwIHR5cGUgZm9yIHVudHlwZWQgZW1pdHRlcnMuXG4gKi9cbmV4cG9ydCB0eXBlIEV2ZW50TWFwQmFzZSA9IFJlY29yZDxzdHJpbmcsIHVua25vd25bXT47XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBldmVudCBzb3VyY2UsIHVzZWQgYnkge0BsaW5rIEFzeW5jRXZlbnRSZWZ9XG4gKiBzbyB0aGF0IHJlZnMgY2FuIGJlIHN0b3JlZCByZWdhcmRsZXNzIG9mIHRoZSBlbWl0dGVyJ3MgYEV2ZW50TWFwYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIgYnkgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgcmVmZXJlbmNlIHRvIHJlbW92ZS5cbiAgICovXG4gIG9mZnJlZjogKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudH0uXG4gKlxuICogQHR5cGVQYXJhbSBTb3VyY2UgLSBUaGUge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHR5cGUuXG4gKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBldmVudCBuYW1lLCBjb25zdHJhaW5lZCB0byB0aGUgc291cmNlJ3Mga25vd24gZXZlbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZUFzeW5jRGlzcG9zYWJsZUV2ZW50UGFyYW1zPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+IHtcbiAgLyoqXG4gICAqIFRoZSBhc3luYyBldmVudCBzb3VyY2UgdG8gc3Vic2NyaWJlIG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgYXN5bmNFdmVudFNvdXJjZTogU291cmNlO1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgY2FsbGJhY2suIEl0cyBhcmd1bWVudCB0eXBlcyBhcmUgaW5mZXJyZWQgZnJvbSB7QGxpbmsgU3Vic2NyaWJlQXN5bmNEaXNwb3NhYmxlRXZlbnRQYXJhbXMubmFtZX0uXG4gICAqL1xuICByZWFkb25seSBjYWxsYmFjazogQXN5bmNFdmVudENhbGxiYWNrT2Y8U291cmNlLCBFdmVudE5hbWU+O1xuXG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgbmFtZSB0byBzdWJzY3JpYmUgdG8uXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBFdmVudE5hbWU7XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGNhbGxiYWNrLlxuICAgKi9cbiAgcmVhZG9ubHkgdGhpc0FyZ3VtZW50PzogdW5rbm93bjtcbn1cblxuLy8gVGhlIGNhbGxiYWNrIHR5cGUgZm9yIGEgZ2l2ZW4gZXZlbnQgb24gYW4gYXN5bmMgZXZlbnQgc291cmNlLCB3aXRoIGl0cyBhcmd1bWVudCB0dXBsZSBpbmZlcnJlZCBmcm9tIHRoZSBzb3VyY2UncyBldmVudCBtYXAuXG50eXBlIEFzeW5jRXZlbnRDYWxsYmFja09mPFNvdXJjZSBleHRlbmRzIEdlbmVyaWNBc3luY0V2ZW50U291cmNlLCBFdmVudE5hbWUgZXh0ZW5kcyBBc3luY0V2ZW50TmFtZU9mPFNvdXJjZT4+ID0gRXZlbnRNYXBPZjxTb3VyY2U+W0V2ZW50TmFtZV0gZXh0ZW5kcyBpbmZlciBBcmd1bWVudHMgZXh0ZW5kcyB1bmtub3duW10gPyAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+XG4gIDogbmV2ZXI7XG5cbi8vIFRoZSB1bmlvbiBvZiBrbm93biBldmVudCBuYW1lcyBmb3IgYW4gYXN5bmMgZXZlbnQgc291cmNlLCBkZXJpdmVkIGZyb20gaXRzIGV2ZW50IG1hcC5cbnR5cGUgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZT4gPSBrZXlvZiBFdmVudE1hcE9mPFNvdXJjZT4gJiBzdHJpbmc7XG5cbnR5cGUgRXZlbnRNYXBDb25zdHJhaW50PFQ+ID0gUmVjb3JkPGtleW9mIFQsIHVua25vd25bXT47XG5cbi8vIFJlY292ZXJzIHRoZSBldmVudCBtYXAgb2YgYW4gYXN5bmMgZXZlbnQgc291cmNlIHZpYSB0aGUgcGhhbnRvbSBtYXJrZXIgb24gYEFzeW5jRXZlbnRTb3VyY2VgLlxudHlwZSBFdmVudE1hcE9mPFNvdXJjZT4gPSBTb3VyY2UgZXh0ZW5kcyBBc3luY0V2ZW50U291cmNlPGluZmVyIEV2ZW50TWFwPiA/IEV2ZW50TWFwIDogbmV2ZXI7XG5cbnR5cGUgR2VuZXJpY0NhbGxiYWNrID0gR2VuZXJpY1Byb21pc2FibGVWb2lkRnVuY3Rpb248dW5rbm93bltdPjtcblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnMgYW4ge0BsaW5rIEFzeW5jRXZlbnRSZWZ9IG9uIGRpc3Bvc2UsIHZpYSB0aGUgZXZlbnQgc291cmNlIHN0b3JlZFxuICogb24gdGhlIHJlZiBpdHNlbGYuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYEV2ZW50UmVmRGlzcG9zYWJsZWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50UmVmRGlzcG9zYWJsZSBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZUJhc2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGRpc3Bvc2FibGUgd3JhcHBpbmcgYW4gZXhpc3Rpbmcge0BsaW5rIEFzeW5jRXZlbnRSZWZ9LlxuICAgKlxuICAgKiBAcGFyYW0gYXN5bmNFdmVudFJlZiAtIFRoZSBhc3luYyBldmVudCByZWZlcmVuY2UgdG8gdW5yZWdpc3RlciBvbiBkaXNwb3NlLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXN5bmNFdmVudFJlZjogQXN5bmNFdmVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICAvKipcbiAgICogVW5yZWdpc3RlcnMgdGhlIGV2ZW50IHZpYSB0aGUgc291cmNlIHN0b3JlZCBvbiB0aGUgcmVmIChgYXN5bmNFdmVudFNvdXJjZS5vZmZyZWZgKS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBwZXJmb3JtRGlzcG9zZUFzeW5jKCk6IHZvaWQge1xuICAgIHRoaXMuYXN5bmNFdmVudFJlZi5hc3luY0V2ZW50U291cmNlLm9mZnJlZih0aGlzLmFzeW5jRXZlbnRSZWYpO1xuICB9XG59XG5cbi8qKlxuICogQXN5bmMgZXZlbnQgc291cmNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gRXZlbnRNYXAgLSBNYXBzIGV2ZW50IG5hbWVzIHRvIHRoZWlyIGFyZ3VtZW50IHR1cGxlcy5cbiAqIFdoZW4gb21pdHRlZCwgdGhlIGVtaXR0ZXIgYWNjZXB0cyBhbnkgc3RyaW5nIGV2ZW50IG5hbWUgd2l0aCBhbnkgYXJndW1lbnRzLlxuICogV2hlbiBwcm92aWRlZCwgbWV0aG9kcyBlbmZvcmNlIGNvcnJlY3QgZXZlbnQgbmFtZXMgYW5kIGFyZ3VtZW50IHR5cGVzXG4gKiB3aXRoIGZ1bGwgYXV0b2NvbXBsZXRlLiBXb3JrcyB3aXRoIGJvdGggYHR5cGVgIGFsaWFzZXMgYW5kIGBpbnRlcmZhY2VgIGRlY2xhcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIC8vIFVudHlwZWQgKGRlZmF1bHQpIFx1MjAxNCBhbnkgZXZlbnQgbmFtZSwgYW55IGFyZ3M6XG4gKiBjb25zdCBldmVudHMgPSBuZXcgQXN5bmNFdmVudHMoKTtcbiAqIGV2ZW50cy5vbignbXktZXZlbnQnLCAoYXJnMTogc3RyaW5nKSA9PiB7IC4uLiB9KTtcbiAqXG4gKiAvLyBUeXBlZCBcdTIwMTQgb25seSBkZWNsYXJlZCBldmVudHMgd2l0aCBjb3JyZWN0IGFyZ3M6XG4gKiBpbnRlcmZhY2UgTXlFdmVudE1hcCB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogICBsb2FkOiBbaWQ6IG51bWJlciwgZm9yY2U6IGJvb2xlYW5dO1xuICogfVxuICogY29uc3QgZXZlbnRzID0gbmV3IEFzeW5jRXZlbnRzPE15RXZlbnRNYXA+KCk7XG4gKiBldmVudHMub24oJ3NhdmUnLCAoZGF0YSkgPT4geyAuLi4gfSk7ICAgLy8gZGF0YTogc3RyaW5nIFx1MjAxNCBhdXRvY29tcGxldGUgb24gZXZlbnQgbmFtZVxuICogZXZlbnRzLm9uKCdsb2FkJywgKGlkLCBmb3JjZSkgPT4geyAuLi4gfSk7IC8vIGlkOiBudW1iZXIsIGZvcmNlOiBib29sZWFuXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzQmFzZTxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGltcGxlbWVudHMgQXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4ge1xuICAvKipcbiAgICogVGhlIHJlZ2lzdHJ5IG1hcHBpbmcgZWFjaCBldmVudCBuYW1lIHRvIGl0cyBsaXN0IG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXIgcmVmZXJlbmNlcy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBldmVudFJlZmVyZW5jZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgQXN5bmNFdmVudFJlZltdPigpO1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLm9mZignbXktZXZlbnQnLCBteUxpc3RlbmVyKTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9mZjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSk7XG4gICAgaWYgKCFldmVudFJlZnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBmaWx0ZXJJblBsYWNlKGV2ZW50UmVmcywgKGV2ZW50UmVmKSA9PiBldmVudFJlZi5jYWxsYmFjayAhPT0gY2FsbGJhY2spO1xuICAgIGlmIChldmVudFJlZnMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMub2ZmcmVmKG15UmVmKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb2ZmcmVmKGV2ZW50UmVmOiBBc3luY0V2ZW50UmVmKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KGV2ZW50UmVmLm5hbWUpO1xuICAgIGlmICghZXZlbnRSZWZzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZmlsdGVySW5QbGFjZShldmVudFJlZnMsIChzdG9yZWRFdmVudFJlZikgPT4gc3RvcmVkRXZlbnRSZWYgIT09IGV2ZW50UmVmKTtcbiAgICBpZiAoZXZlbnRSZWZzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZGVsZXRlKGV2ZW50UmVmLm5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbignbXktZXZlbnQnLCBhc3luYyAoYXJnMSwgYXJnMikgPT4ge1xuICAgKiAgICAgYXdhaXQgc2xlZXAoMTAwKTtcbiAgICogICAgIGNvbnNvbGUubG9nKGFyZzEsIGFyZzIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgbmFtZTogRXZlbnROYW1lLFxuICAgIGNhbGxiYWNrOiAoLi4uJGFyZ3VtZW50czogQXJndW1lbnRzKSA9PiBQcm9taXNhYmxlPHZvaWQ+LFxuICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgKTogQXN5bmNFdmVudFJlZiB7XG4gICAgbGV0IGV2ZW50UmVmcyA9IHRoaXMuZXZlbnRSZWZlcmVuY2VzTWFwLmdldChuYW1lKTtcbiAgICBpZiAoIWV2ZW50UmVmcykge1xuICAgICAgZXZlbnRSZWZzID0gW107XG4gICAgICB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5zZXQobmFtZSwgZXZlbnRSZWZzKTtcbiAgICB9XG5cbiAgICBjb25zdCBldmVudFJlZjogQXN5bmNFdmVudFJlZiA9IHtcbiAgICAgIGFzeW5jRXZlbnRTb3VyY2U6IHRoaXMsXG4gICAgICBjYWxsYmFjazogY2FsbGJhY2sgYXMgR2VuZXJpY0NhbGxiYWNrLFxuICAgICAgbmFtZSxcbiAgICAgIHRoaXNBcmd1bWVudFxuICAgIH07XG4gICAgZXZlbnRSZWZzLnB1c2goZXZlbnRSZWYpO1xuICAgIHJldHVybiBldmVudFJlZjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCBvbmx5IG9uY2UuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIGV2ZW50IGxpc3RlbmVyLlxuICAgKlxuICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIGV2ZW50cy5vbmNlKCdteS1ldmVudCcsIGFzeW5jIChhcmcxLCBhcmcyKSA9PiB7XG4gICAqICAgICBhd2FpdCBzbGVlcCgxMDApO1xuICAgKiAgICAgY29uc29sZS5sb2coYXJnMSwgYXJnMik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb25jZTxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPiwgQXJndW1lbnRzIGV4dGVuZHMgQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4+KFxuICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICBjYWxsYmFjazogKC4uLiRhcmd1bWVudHM6IEFyZ3VtZW50cykgPT4gUHJvbWlzYWJsZTx2b2lkPixcbiAgICB0aGlzQXJndW1lbnQ/OiB1bmtub3duXG4gICk6IEFzeW5jRXZlbnRSZWYge1xuICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRSZWYgPSB0aGlzLm9uKG5hbWUsIGNhbGxiYWNrLCB0aGlzQXJndW1lbnQpO1xuICAgIGNvbnN0IGNsZWFudXBFdmVudFJlZiA9IHRoaXMub24obmFtZSwgKCkgPT4ge1xuICAgICAgdGhpcy5vZmZyZWYob3JpZ2luYWxFdmVudFJlZik7XG4gICAgICB0aGlzLm9mZnJlZihjbGVhbnVwRXZlbnRSZWYpO1xuICAgIH0pO1xuICAgIHJldHVybiBvcmlnaW5hbEV2ZW50UmVmO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyaWdnZXIgYW4gZXZlbnQsIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogZXZlbnRzLnRyaWdnZXIoJ215LWV2ZW50JywgJ2FyZzEnLCAnYXJnMicpO1xuICAgKiBgYGBcbiAgICovXG4gIHByb3RlY3RlZCB0cmlnZ2VyPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+PihuYW1lOiBFdmVudE5hbWUsIC4uLiRhcmd1bWVudHM6IENhbGxiYWNrQXJndW1lbnRzPEV2ZW50TWFwLCBFdmVudE5hbWU+KTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnRSZWZzID0gdGhpcy5ldmVudFJlZmVyZW5jZXNNYXAuZ2V0KG5hbWUpID8/IFtdO1xuICAgIGZvciAoY29uc3QgZXZlbnRSZWYgb2Ygc25hcHNob3QoZXZlbnRSZWZzKSkge1xuICAgICAgdGhpcy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBldmVudFJlZnMgPSB0aGlzLmV2ZW50UmVmZXJlbmNlc01hcC5nZXQobmFtZSkgPz8gW107XG4gICAgZm9yIChjb25zdCBldmVudFJlZiBvZiBzbmFwc2hvdChldmVudFJlZnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBldmVudHMudHJ5VHJpZ2dlcihteVJlZiwgWydhcmcxJywgJ2FyZzInXSk7XG4gICAqIGBgYFxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBldmVudFJlZi5jYWxsYmFjay5jYWxsKGV2ZW50UmVmLnRoaXNBcmd1bWVudCwgLi4uJGFyZ3VtZW50cyk7XG4gICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXN1bHQuY2F0Y2godGhyb3dEZWxheWVkKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJ5IHRvIHRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHksIGV4ZWN1dGluZyBhbGwgdGhlIGxpc3RlbmVycyBpbiBvcmRlciBldmVuIGlmIHNvbWUgb2YgdGhlbSB0aHJvdyBhbiBlcnJvci5cbiAgICpcbiAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZS5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiBhbGwgbGlzdGVuZXJzIGhhdmUgY29tcGxldGVkLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGV2ZW50UmVmLmNhbGxiYWNrLmNhbGwoZXZlbnRSZWYudGhpc0FyZ3VtZW50LCAuLi4kYXJndW1lbnRzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3dEZWxheWVkKGVycm9yKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIGNsYXNzIHRoYXQgZXh0ZW5kcyB7QGxpbmsgQXN5bmNFdmVudHNCYXNlfSBhbmQgcHJvdmlkZXMgcHVibGljIG1ldGhvZHMgZm9yIHRyaWdnZXJpbmcgZXZlbnRzLlxuICpcbiAqIFRoaXMgY2xhc3MgZXhpc3RzIGFzIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50c2AuIEJ1dCBleHBvc2luZyBwdWJsaWNseSBgdHJpZ2dlcigpYCBtZXRob2RzIHZpb2xhdGVzIGVuY2Fwc3VsYXRpb24uXG4gKlxuICogQXZvaWQgdXNpbmcgaXQgaW4gZmF2b3Igb2Yge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0uXG4gKlxuICogQHR5cGVQYXJhbSBFdmVudE1hcCAtIFRoZSB0eXBlIG9mIHRoZSBldmVudCBtYXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0V2ZW50czxFdmVudE1hcCBleHRlbmRzIEV2ZW50TWFwQ29uc3RyYWludDxFdmVudE1hcD4gPSBFdmVudE1hcEJhc2U+IGV4dGVuZHMgQXN5bmNFdmVudHNCYXNlPEV2ZW50TWFwPiB7XG4gIC8qKlxuICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAqL1xuICBwdWJsaWMgb3ZlcnJpZGUgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgIHN1cGVyLnRyaWdnZXIobmFtZSwgLi4uJGFyZ3VtZW50cyk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIEV2ZW50TmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIHB1YmxpYyBvdmVycmlkZSB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gc3VwZXIudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gIHB1YmxpYyBvdmVycmlkZSB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgIHN1cGVyLnRyeVRyaWdnZXIoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50IGFzeW5jaHJvbm91c2x5LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICBwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgdHJ5VHJpZ2dlckFzeW5jPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBzdXBlci50cnlUcmlnZ2VyQXN5bmMoZXZlbnRSZWYsICRhcmd1bWVudHMpO1xuICB9XG59XG5cbi8qKlxuICogTWl4aW4gdGhhdCBhZGRzIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBkZWxlZ2F0aW9uIHRvIGEgYmFzZSBjbGFzcy5cbiAqXG4gKiBBbGwgZXZlbnQgbWV0aG9kcyBkZWxlZ2F0ZSB0byBhIHByaXZhdGUge0BsaW5rIEFzeW5jRXZlbnRzQmFzZX0gaW5zdGFuY2UuXG4gKiBUaGUgYEV2ZW50TWFwYCBnZW5lcmljIGlzIGZpeGVkIGF0IG1peGluLWFwcGxpY2F0aW9uIHRpbWUgXHUyMDE0IGlmIHlvdSBuZWVkIGEgY2xhc3NcbiAqIHRoYXQgaXMgaXRzZWxmIGdlbmVyaWMgb3ZlciBpdHMgZXZlbnQgbWFwLCB1c2UgY29tcG9zaXRpb24gaW5zdGVhZC5cbiAqXG4gKiBAdHlwZVBhcmFtIEV2ZW50TWFwIC0gTWFwcyBldmVudCBuYW1lcyB0byB0aGVpciBhcmd1bWVudCB0dXBsZXMuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBiYXNlIGNsYXNzIGFuZCByZXR1cm5zIGEgbmV3IGNsYXNzIGV4dGVuZGluZyBpdCB3aXRoIHtAbGluayBBc3luY0V2ZW50U291cmNlfS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGludGVyZmFjZSBNeUV2ZW50cyB7XG4gKiAgIHNhdmU6IFtkYXRhOiBzdHJpbmddO1xuICogfVxuICogY2xhc3MgTXlDb21wb25lbnQgZXh0ZW5kcyBtaXhpbkFzeW5jRXZlbnRzPE15RXZlbnRzPigpKENvbXBvbmVudCkge1xuICogICAvLyBvbigpLCBvZmYoKSwgb25jZSgpLCBvZmZyZWYoKSBhcmUgYXZhaWxhYmxlXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1peGluQXN5bmNFdmVudHM8RXZlbnRNYXAgZXh0ZW5kcyBFdmVudE1hcENvbnN0cmFpbnQ8RXZlbnRNYXA+ID0gRXZlbnRNYXBCYXNlPigpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlubmVyPFRCYXNlIGV4dGVuZHMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxvYmplY3Q+PihcbiAgICBiYXNlQ2xhc3M6IFRCYXNlXG4gICk6IEFic3RyYWN0Q29uc3RydWN0b3I8QXN5bmNFdmVudFNvdXJjZTxFdmVudE1hcD4gJiBBc3luY0V2ZW50VHJpZ2dlcjxFdmVudE1hcD4+ICYgVEJhc2Uge1xuICAgIGFic3RyYWN0IGNsYXNzIEFzeW5jRXZlbnRzTWl4aW4gZXh0ZW5kcyBiYXNlQ2xhc3MgaW1wbGVtZW50cyBBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiB7XG4gICAgICByZWFkb25seSAjYXN5bmNFdmVudHMgPSBuZXcgQXN5bmNFdmVudHM8RXZlbnRNYXA+KCk7XG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gV2UgbmVlZCB0byB1c2UgdGhlIGR1bW15IHBhcmFtZXRlciB0byBnZXQgdHlwZSBpbmZlcmVuY2UuXG4gICAgICBwdWJsaWMgb2ZmPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD5cbiAgICAgICk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy5vZmYobmFtZSwgY2FsbGJhY2spO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhbiBldmVudCBsaXN0ZW5lciBieSByZWZlcmVuY2UuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIGV2ZW50UmVmIC0gVGhlIGV2ZW50IHJlZmVyZW5jZSB0byByZW1vdmUuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBvZmZyZWYoZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jYXN5bmNFdmVudHMub2ZmcmVmKGV2ZW50UmVmKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAdHlwZVBhcmFtIEFyZ3VtZW50cyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBldmVudCBjYWxsYmFjayBhY2NlcHRzLlxuICAgICAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuXG4gICAgICAgKiBAcGFyYW0gdGhpc0FyZ3VtZW50IC0gVGhlIGNvbnRleHQgcGFzc2VkIGFzIGB0aGlzYCB0byB0aGUgYGNhbGxiYWNrYC5cbiAgICAgICAqIEByZXR1cm5zIEEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBsaXN0ZW5lci5cbiAgICAgICAqXG4gICAgICAgKiBAcmVtYXJrcyBOb3QgcmVmYWN0b3JlZCB0byBwYXJhbWV0ZXItb2JqZWN0IHBhdHRlcm4sIHRvIGtlZXAgdGhlIHBhcml0eSB3aXRoIE9ic2lkaWFuJ3MgYEV2ZW50cy5vbmAgKG9yIG9uY2UsIGNvcnJlc3BvbmRpbmdseSkuXG4gICAgICAgKi9cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1wYXJhbWV0ZXJzIC0tIFdlIG5lZWQgdG8gdXNlIHRoZSBkdW1teSBwYXJhbWV0ZXIgdG8gZ2V0IHR5cGUgaW5mZXJlbmNlLlxuICAgICAgcHVibGljIG9uPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub24obmFtZSwgY2FsbGJhY2ssIHRoaXNBcmd1bWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZXZlbnQgY2FsbGJhY2sgYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGV2ZW50LlxuICAgICAgICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgZXZlbnQgaXMgdHJpZ2dlcmVkLlxuICAgICAgICogQHBhcmFtIHRoaXNBcmd1bWVudCAtIFRoZSBjb250ZXh0IHBhc3NlZCBhcyBgdGhpc2AgdG8gdGhlIGBjYWxsYmFja2AuXG4gICAgICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAgICAgKlxuICAgICAgICogQHJlbWFya3MgTm90IHJlZmFjdG9yZWQgdG8gcGFyYW1ldGVyLW9iamVjdCBwYXR0ZXJuLCB0byBrZWVwIHRoZSBwYXJpdHkgd2l0aCBPYnNpZGlhbidzIGBFdmVudHMub25gIChvciBvbmNlLCBjb3JyZXNwb25kaW5nbHkpLlxuICAgICAgICovXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LXR5cGUtcGFyYW1ldGVycyAtLSBXZSBuZWVkIHRvIHVzZSB0aGUgZHVtbXkgcGFyYW1ldGVyIHRvIGdldCB0eXBlIGluZmVyZW5jZS5cbiAgICAgIHB1YmxpYyBvbmNlPEV2ZW50TmFtZSBleHRlbmRzIFN0cmluZ0tleXM8RXZlbnRNYXA+LCBBcmd1bWVudHMgZXh0ZW5kcyBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPj4oXG4gICAgICAgIG5hbWU6IEV2ZW50TmFtZSxcbiAgICAgICAgY2FsbGJhY2s6ICguLi4kYXJndW1lbnRzOiBBcmd1bWVudHMpID0+IFByb21pc2FibGU8dm9pZD4sXG4gICAgICAgIHRoaXNBcmd1bWVudD86IHVua25vd25cbiAgICAgICk6IEFzeW5jRXZlbnRSZWYge1xuICAgICAgICByZXR1cm4gdGhpcy4jYXN5bmNFdmVudHMub25jZShuYW1lLCBjYWxsYmFjaywgdGhpc0FyZ3VtZW50KTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICovXG4gICAgICBwcm90ZWN0ZWQgdHJpZ2dlcjxFdmVudE5hbWUgZXh0ZW5kcyBTdHJpbmdLZXlzPEV2ZW50TWFwPj4obmFtZTogRXZlbnROYW1lLCAuLi4kYXJndW1lbnRzOiBDYWxsYmFja0FyZ3VtZW50czxFdmVudE1hcCwgRXZlbnROYW1lPik6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cmlnZ2VyKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyaWdnZXIgYW4gZXZlbnQgYXN5bmNocm9ub3VzbHkuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBFdmVudE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBldmVudC5cbiAgICAgICAqIEBwYXJhbSAkYXJndW1lbnRzIC0gVGhlIGRhdGEgdG8gcGFzcyB0byB0aGUgZXZlbnQgbGlzdGVuZXJzLlxuICAgICAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIGFsbCBsaXN0ZW5lcnMgaGF2ZSBjb21wbGV0ZWQuXG4gICAgICAgKi9cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cmlnZ2VyQXN5bmM8RXZlbnROYW1lIGV4dGVuZHMgU3RyaW5nS2V5czxFdmVudE1hcD4+KG5hbWU6IEV2ZW50TmFtZSwgLi4uJGFyZ3VtZW50czogQ2FsbGJhY2tBcmd1bWVudHM8RXZlbnRNYXAsIEV2ZW50TmFtZT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgdGhpcy4jYXN5bmNFdmVudHMudHJpZ2dlckFzeW5jKG5hbWUsIC4uLiRhcmd1bWVudHMpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIFRyeSB0byB0cmlnZ2VyIGFuIGV2ZW50LCBleGVjdXRpbmcgYWxsIHRoZSBsaXN0ZW5lcnMgaW4gb3JkZXIgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3cgYW4gZXJyb3IuXG4gICAgICAgKlxuICAgICAgICogQHR5cGVQYXJhbSBBcmd1bWVudHMgLSBUaGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cyB0aGUgZnVuY3Rpb24gYWNjZXB0cy5cbiAgICAgICAqIEBwYXJhbSBldmVudFJlZiAtIFRoZSBldmVudCByZWZlcmVuY2UuXG4gICAgICAgKiBAcGFyYW0gJGFyZ3VtZW50cyAtIFRoZSBkYXRhIHRvIHBhc3MgdG8gdGhlIGV2ZW50IGxpc3RlbmVycy5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCB0cnlUcmlnZ2VyPEFyZ3VtZW50cyBleHRlbmRzIHVua25vd25bXT4oZXZlbnRSZWY6IEFzeW5jRXZlbnRSZWYsICRhcmd1bWVudHM6IEFyZ3VtZW50cyk6IHZvaWQge1xuICAgICAgICB0aGlzLiNhc3luY0V2ZW50cy50cnlUcmlnZ2VyKGV2ZW50UmVmLCAkYXJndW1lbnRzKTtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBUcnkgdG8gdHJpZ2dlciBhbiBldmVudCBhc3luY2hyb25vdXNseSwgZXhlY3V0aW5nIGFsbCB0aGUgbGlzdGVuZXJzIGluIG9yZGVyIGV2ZW4gaWYgc29tZSBvZiB0aGVtIHRocm93IGFuIGVycm9yLlxuICAgICAgICpcbiAgICAgICAqIEB0eXBlUGFyYW0gQXJndW1lbnRzIC0gVGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMgdGhlIGZ1bmN0aW9uIGFjY2VwdHMuXG4gICAgICAgKiBAcGFyYW0gZXZlbnRSZWYgLSBUaGUgZXZlbnQgcmVmZXJlbmNlLlxuICAgICAgICogQHBhcmFtICRhcmd1bWVudHMgLSBUaGUgZGF0YSB0byBwYXNzIHRvIHRoZSBldmVudCBsaXN0ZW5lcnMuXG4gICAgICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gYWxsIGxpc3RlbmVycyBoYXZlIGNvbXBsZXRlZC5cbiAgICAgICAqL1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLXBhcmFtZXRlcnMgLS0gUGFyaXR5IHdpdGggT2JzaWRpYW4ncyBFdmVudHMudHJ5VHJpZ2dlci5cbiAgICAgIHByb3RlY3RlZCBhc3luYyB0cnlUcmlnZ2VyQXN5bmM8QXJndW1lbnRzIGV4dGVuZHMgdW5rbm93bltdPihldmVudFJlZjogQXN5bmNFdmVudFJlZiwgJGFyZ3VtZW50czogQXJndW1lbnRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuI2FzeW5jRXZlbnRzLnRyeVRyaWdnZXJBc3luYyhldmVudFJlZiwgJGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIEFzeW5jRXZlbnRzTWl4aW4gYXMgQWJzdHJhY3RDb25zdHJ1Y3RvcjxBc3luY0V2ZW50U291cmNlPEV2ZW50TWFwPiAmIEFzeW5jRXZlbnRUcmlnZ2VyPEV2ZW50TWFwPj4gJiBUQmFzZTtcbiAgfTtcbn1cblxuLyoqXG4gKiBTdWJzY3JpYmVzIHRvIGFuIGV2ZW50IG9uIGFuIHtAbGluayBBc3luY0V2ZW50U291cmNlfSBhbmQgcmV0dXJucyBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IHRoYXQgdW5yZWdpc3RlcnNcbiAqIGl0IG9uIGRpc3Bvc2UuIEFzeW5jIGNvdW50ZXJwYXJ0IG9mIHRoZSBuYXRpdmUgYHN1YnNjcmliZURpc3Bvc2FibGVFdmVudGA7IHRoZSBldmVudCBuYW1lIGFuZCBjYWxsYmFjayBhcmd1bWVudFxuICogdHlwZXMgYXJlIGluZmVycmVkIGZyb20gdGhlIHNvdXJjZSdzIGV2ZW50IG1hcC5cbiAqXG4gKiBAdHlwZVBhcmFtIFNvdXJjZSAtIFRoZSB7QGxpbmsgQXN5bmNFdmVudFNvdXJjZX0gdHlwZS5cbiAqIEB0eXBlUGFyYW0gRXZlbnROYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHN1YnNjcmlwdGlvbiBwYXJhbWV0ZXJzLlxuICogQHJldHVybnMgQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IHVucmVnaXN0ZXJzIHRoZSBoYW5kbGVyIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudDxTb3VyY2UgZXh0ZW5kcyBHZW5lcmljQXN5bmNFdmVudFNvdXJjZSwgRXZlbnROYW1lIGV4dGVuZHMgQXN5bmNFdmVudE5hbWVPZjxTb3VyY2U+PihcbiAgcGFyYW1zOiBTdWJzY3JpYmVBc3luY0Rpc3Bvc2FibGVFdmVudFBhcmFtczxTb3VyY2UsIEV2ZW50TmFtZT5cbik6IEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgLy8gYFNvdXJjZWAgaXMgY29uc3RyYWluZWQgb25seSB0byB0aGUgb24tbGVzcyBgR2VuZXJpY0FzeW5jRXZlbnRTb3VyY2VgIChzbyBhIHR5cGVkIHNvdXJjZSBpcyBhY2NlcHRlZCB3aGF0ZXZlclxuICAvLyBpdHMgZXZlbnQgbWFwJ3MgdmFyaWFuY2UpOyBldmVyeSBzb3VyY2UgaXMgYW4gYEFzeW5jRXZlbnRTb3VyY2VgLCBzbyBpdCBpcyBuYXJyb3dlZCB0byByZWFjaCBgb25gLCB3aG9zZSB0eXBlXG4gIC8vIHBhcmFtZXRlcnMgdGhlbiBpbmZlciBmcm9tIHRoZSAoYWxyZWFkeS10eXBlZCkgbmFtZSBhbmQgY2FsbGJhY2suXG4gIHJldHVybiBuZXcgQXN5bmNFdmVudFJlZkRpc3Bvc2FibGUoYXNBc3luY0V2ZW50U291cmNlKHBhcmFtcy5hc3luY0V2ZW50U291cmNlKS5vbihwYXJhbXMubmFtZSwgcGFyYW1zLmNhbGxiYWNrLCBwYXJhbXMudGhpc0FyZ3VtZW50KSk7XG59XG5cbi8vIE5hcnJvd3MgYSBzb3VyY2UgdG8ge0BsaW5rIEFzeW5jRXZlbnRTb3VyY2V9IHRvIHJlYWNoIGBvbmAuIEEgbG9jYWwgZXF1aXZhbGVudCBvZiBgY2FzdFRvYDogaW1wb3J0aW5nIGBjYXN0VG9gXG4vLyBmcm9tIGBvYmplY3QtdXRpbHNgIGhlcmUgd291bGQgY3JlYXRlIGEgbW9kdWxlIGN5Y2xlIChvYmplY3QtdXRpbHMgXHUyMTkyIGVycm9yIFx1MjE5MiBhc3luYy1ldmVudHMpLlxuZnVuY3Rpb24gYXNBc3luY0V2ZW50U291cmNlKHZhbHVlOiB1bmtub3duKTogQXN5bmNFdmVudFNvdXJjZSB7XG4gIHJldHVybiB2YWx1ZSBhcyBBc3luY0V2ZW50U291cmNlO1xufVxuXG5mdW5jdGlvbiB0aHJvd0RlbGF5ZWQoZXJyb3I6IHVua25vd24pOiB2b2lkIHtcbiAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIHRocm93IGVycm9yO1xuICB9LCAwKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWVBLG1CQUdPO0FBQ1Asd0JBQW9DO0FBcVE3QixNQUFNLGdDQUFnQyxzQ0FBb0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNeEQsWUFBNkIsZUFBOEI7QUFDaEUsVUFBTTtBQUQ0QjtBQUFBLEVBRXBDO0FBQUEsRUFGb0M7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9qQixzQkFBNEI7QUFDN0MsU0FBSyxjQUFjLGlCQUFpQixPQUFPLEtBQUssYUFBYTtBQUFBLEVBQy9EO0FBQ0Y7QUEwQk8sTUFBZSxnQkFBb0g7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUlySCxxQkFBcUIsb0JBQUksSUFBNkI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFnQmxFLElBQ0wsTUFDQSxVQUNNO0FBQ04sVUFBTSxZQUFZLEtBQUssbUJBQW1CLElBQUksSUFBSTtBQUNsRCxRQUFJLENBQUMsV0FBVztB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LGFBQUssYUFBYSxPQUFPLFFBQVE7QUFBQSxNQUNuQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFlTyxHQUNMLE1BQ0EsVUFDQSxjQUNlO0FBQ2YsZUFBTyxLQUFLLGFBQWEsR0FBRyxNQUFNLFVBQVUsWUFBWTtBQUFBLE1BQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQWVPLEtBQ0wsTUFDQSxVQUNBLGNBQ2U7QUFDZixlQUFPLEtBQUssYUFBYSxLQUFLLE1BQU0sVUFBVSxZQUFZO0FBQUEsTUFDNUQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BU1UsUUFBZ0QsU0FBb0IsWUFBMEQ7QUFDdEksYUFBSyxhQUFhLFFBQVEsTUFBTSxHQUFHLFVBQVU7QUFBQSxNQUMvQztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVVBLE1BQWdCLGFBQXFELFNBQW9CLFlBQW1FO0FBQzFKLGNBQU0sS0FBSyxhQUFhLGFBQWEsTUFBTSxHQUFHLFVBQVU7QUFBQSxNQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxNQVVVLFdBQXdDLFVBQXlCLFlBQTZCO0FBQ3RHLGFBQUssYUFBYSxXQUFXLFVBQVUsVUFBVTtBQUFBLE1BQ25EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFXQSxNQUFnQixnQkFBNkMsVUFBeUIsWUFBc0M7QUFDMUgsY0FBTSxLQUFLLGFBQWEsZ0JBQWdCLFVBQVUsVUFBVTtBQUFBLE1BQzlEO0FBQUEsSUFDRjtBQUVBLFdBQU87QUFBQSxFQUNUO0FBQ0Y7QUFZTyxTQUFTLDhCQUNkLFFBQ21CO0FBSW5CLFNBQU8sSUFBSSx3QkFBd0IsbUJBQW1CLE9BQU8sZ0JBQWdCLEVBQUUsR0FBRyxPQUFPLE1BQU0sT0FBTyxVQUFVLE9BQU8sWUFBWSxDQUFDO0FBQ3RJO0FBSUEsU0FBUyxtQkFBbUIsT0FBa0M7QUFDNUQsU0FBTztBQUNUO0FBRUEsU0FBUyxhQUFhLE9BQXNCO0FBQzFDLFNBQU8sV0FBVyxNQUFNO0FBQ3RCLFVBQU07QUFBQSxFQUNSLEdBQUcsQ0FBQztBQUNOOyIsCiAgIm5hbWVzIjogW10KfQo=