obsidian-dev-utils 32.0.1 → 32.0.2-beta.1
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.
- package/CHANGELOG.md +4 -0
- package/dist/lib/cjs/AbortController.cjs +70 -12
- package/dist/lib/cjs/AbortController.d.cts +39 -2
- package/dist/lib/cjs/Array.cjs +4 -3
- package/dist/lib/cjs/Async.cjs +187 -100
- package/dist/lib/cjs/Async.d.cts +71 -26
- package/dist/lib/cjs/Debug.cjs +18 -14
- package/dist/lib/cjs/Error.cjs +37 -4
- package/dist/lib/cjs/Error.d.cts +16 -3
- package/dist/lib/cjs/Library.cjs +1 -1
- package/dist/lib/cjs/ScriptUtils/version.cjs +4 -4
- package/dist/lib/cjs/String.cjs +2 -2
- package/dist/lib/cjs/ValueProvider.cjs +2 -2
- package/dist/lib/cjs/obsidian/FileChange.cjs +3 -3
- package/dist/lib/cjs/obsidian/Link.cjs +3 -3
- package/dist/lib/cjs/obsidian/Logger.cjs +21 -10
- package/dist/lib/cjs/obsidian/Loop.cjs +5 -6
- package/dist/lib/cjs/obsidian/MarkdownCodeBlockProcessor.cjs +2 -2
- package/dist/lib/cjs/obsidian/Plugin/PluginBase.cjs +16 -4
- package/dist/lib/cjs/obsidian/Plugin/PluginBase.d.cts +7 -0
- package/dist/lib/cjs/obsidian/Queue.cjs +9 -10
- package/dist/lib/cjs/obsidian/RenameDeleteHandler.cjs +3 -3
- package/dist/lib/esm/AbortController.d.mts +39 -2
- package/dist/lib/esm/AbortController.mjs +65 -11
- package/dist/lib/esm/Array.mjs +4 -3
- package/dist/lib/esm/Async.d.mts +71 -26
- package/dist/lib/esm/Async.mjs +184 -100
- package/dist/lib/esm/Debug.mjs +18 -14
- package/dist/lib/esm/Error.d.mts +16 -3
- package/dist/lib/esm/Error.mjs +35 -3
- package/dist/lib/esm/Library.mjs +1 -1
- package/dist/lib/esm/ScriptUtils/version.mjs +4 -4
- package/dist/lib/esm/String.mjs +2 -2
- package/dist/lib/esm/ValueProvider.mjs +2 -2
- package/dist/lib/esm/obsidian/FileChange.mjs +3 -3
- package/dist/lib/esm/obsidian/Link.mjs +3 -3
- package/dist/lib/esm/obsidian/Logger.mjs +21 -10
- package/dist/lib/esm/obsidian/Loop.mjs +9 -8
- package/dist/lib/esm/obsidian/MarkdownCodeBlockProcessor.mjs +2 -2
- package/dist/lib/esm/obsidian/Plugin/PluginBase.d.mts +7 -0
- package/dist/lib/esm/obsidian/Plugin/PluginBase.mjs +16 -4
- package/dist/lib/esm/obsidian/Queue.mjs +9 -10
- package/dist/lib/esm/obsidian/RenameDeleteHandler.mjs +3 -3
- package/package.json +1 -1
package/dist/lib/esm/Async.mjs
CHANGED
|
@@ -7,58 +7,138 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
abortSignalAny,
|
|
10
|
-
abortSignalNever
|
|
10
|
+
abortSignalNever,
|
|
11
|
+
abortSignalTimeout,
|
|
12
|
+
waitForAbort
|
|
11
13
|
} from "./AbortController.mjs";
|
|
12
14
|
import { getLibDebugger } from "./Debug.mjs";
|
|
13
15
|
import {
|
|
14
|
-
|
|
16
|
+
ASYNC_WRAPPER_ERROR_MESSAGE,
|
|
17
|
+
CustomStackTraceError,
|
|
15
18
|
emitAsyncErrorEvent,
|
|
16
19
|
getStackTrace,
|
|
17
20
|
printError
|
|
18
21
|
} from "./Error.mjs";
|
|
19
|
-
|
|
20
|
-
async function addErrorHandler(asyncFn) {
|
|
21
|
-
|
|
22
|
+
import { noop } from "./Function.mjs";
|
|
23
|
+
async function addErrorHandler(asyncFn, stackTrace) {
|
|
24
|
+
stackTrace ??= getStackTrace(1);
|
|
22
25
|
try {
|
|
23
26
|
await asyncFn();
|
|
24
27
|
} catch (asyncError) {
|
|
25
|
-
|
|
26
|
-
emitAsyncErrorEvent(asyncErrorWrapper);
|
|
28
|
+
emitAsyncErrorEvent(new CustomStackTraceError(ASYNC_WRAPPER_ERROR_MESSAGE, stackTrace, asyncError));
|
|
27
29
|
}
|
|
28
30
|
}
|
|
29
31
|
async function asyncFilter(arr, predicate) {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
+
const ans = [];
|
|
33
|
+
const length = arr.length;
|
|
34
|
+
for (let i = 0; i < length; i++) {
|
|
35
|
+
if (!Object.hasOwn(arr, i)) {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const item = arr[i];
|
|
39
|
+
if (await predicate(item, i, arr)) {
|
|
40
|
+
ans.push(item);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return ans;
|
|
44
|
+
}
|
|
45
|
+
async function asyncFilterInPlace(arr, predicate) {
|
|
46
|
+
const length = arr.length;
|
|
47
|
+
let writeIndex = 0;
|
|
48
|
+
for (let readIndex = 0; readIndex < length; readIndex++) {
|
|
49
|
+
if (!Object.hasOwn(arr, readIndex)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const current = arr[readIndex];
|
|
53
|
+
if (await predicate(current, readIndex, arr)) {
|
|
54
|
+
arr[writeIndex++] = current;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
arr.length = writeIndex;
|
|
32
58
|
}
|
|
33
59
|
async function asyncFlatMap(arr, callback) {
|
|
34
60
|
return (await asyncMap(arr, callback)).flat();
|
|
35
61
|
}
|
|
36
62
|
async function asyncMap(arr, callback) {
|
|
37
|
-
return await
|
|
63
|
+
return await promiseAllSequentially(arr.map(callback));
|
|
38
64
|
}
|
|
39
|
-
function convertAsyncToSync(asyncFunc) {
|
|
65
|
+
function convertAsyncToSync(asyncFunc, stackTrace) {
|
|
66
|
+
stackTrace ??= getStackTrace(1);
|
|
40
67
|
return (...args) => {
|
|
41
|
-
|
|
68
|
+
const innerStackTrace = getStackTrace(1);
|
|
69
|
+
stackTrace = `${stackTrace ?? ""}
|
|
70
|
+
at --- convertAsyncToSync --- (0)
|
|
71
|
+
${innerStackTrace}`;
|
|
72
|
+
invokeAsyncSafely(() => asyncFunc(...args), stackTrace);
|
|
42
73
|
};
|
|
43
74
|
}
|
|
44
75
|
function convertSyncToAsync(syncFn) {
|
|
45
|
-
return (...args) =>
|
|
76
|
+
return async (...args) => {
|
|
77
|
+
await Promise.resolve();
|
|
78
|
+
return syncFn(...args);
|
|
79
|
+
};
|
|
46
80
|
}
|
|
47
81
|
async function ignoreError(promise, fallbackValue) {
|
|
82
|
+
const ignoreErrorDebugger = getLibDebugger("Async:ignoreError");
|
|
83
|
+
const stackTrace = getStackTrace(1);
|
|
48
84
|
try {
|
|
49
85
|
return await promise;
|
|
50
|
-
} catch {
|
|
86
|
+
} catch (e) {
|
|
87
|
+
ignoreErrorDebugger("Ignored error", new CustomStackTraceError("Ignored error", stackTrace, e));
|
|
51
88
|
return fallbackValue;
|
|
52
89
|
}
|
|
53
90
|
}
|
|
54
|
-
function invokeAsyncSafely(asyncFn) {
|
|
55
|
-
|
|
91
|
+
function invokeAsyncSafely(asyncFn, stackTrace) {
|
|
92
|
+
stackTrace ??= getStackTrace(1);
|
|
93
|
+
void addErrorHandler(asyncFn, stackTrace);
|
|
56
94
|
}
|
|
57
|
-
function invokeAsyncSafelyAfterDelay(asyncFn, delayInMilliseconds = 0) {
|
|
58
|
-
|
|
95
|
+
function invokeAsyncSafelyAfterDelay(asyncFn, delayInMilliseconds = 0, stackTrace, abortSignal) {
|
|
96
|
+
abortSignal ??= abortSignalNever();
|
|
97
|
+
abortSignal.throwIfAborted();
|
|
98
|
+
stackTrace ??= getStackTrace(1);
|
|
99
|
+
invokeAsyncSafely(async () => {
|
|
100
|
+
await sleep(delayInMilliseconds, abortSignal, true);
|
|
101
|
+
await asyncFn(abortSignal);
|
|
102
|
+
}, stackTrace);
|
|
103
|
+
}
|
|
104
|
+
async function promiseAllAsyncFnsSequentially(asyncFns) {
|
|
105
|
+
const results = [];
|
|
106
|
+
for (const asyncFn of asyncFns) {
|
|
107
|
+
results.push(await asyncFn());
|
|
108
|
+
}
|
|
109
|
+
return results;
|
|
110
|
+
}
|
|
111
|
+
async function promiseAllSequentially(promises) {
|
|
112
|
+
return await promiseAllAsyncFnsSequentially(promises.map((promise) => () => promise));
|
|
113
|
+
}
|
|
114
|
+
const terminateRetryErrors = /* @__PURE__ */ new WeakSet();
|
|
115
|
+
class Result {
|
|
116
|
+
constructor(result) {
|
|
117
|
+
this.result = result;
|
|
118
|
+
}
|
|
59
119
|
}
|
|
60
120
|
function marksAsTerminateRetry(error) {
|
|
61
|
-
|
|
121
|
+
terminateRetryErrors.add(error);
|
|
122
|
+
}
|
|
123
|
+
async function neverEnds() {
|
|
124
|
+
await new Promise(() => {
|
|
125
|
+
noop();
|
|
126
|
+
});
|
|
127
|
+
throw new Error("Should never happen");
|
|
128
|
+
}
|
|
129
|
+
async function nextTickAsync() {
|
|
130
|
+
return new Promise((resolve) => {
|
|
131
|
+
process.nextTick(() => {
|
|
132
|
+
resolve();
|
|
133
|
+
});
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async function queueMicrotaskAsync() {
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
queueMicrotask(() => {
|
|
139
|
+
resolve();
|
|
140
|
+
});
|
|
141
|
+
});
|
|
62
142
|
}
|
|
63
143
|
async function requestAnimationFrameAsync() {
|
|
64
144
|
return new Promise((resolve) => {
|
|
@@ -71,7 +151,7 @@ async function retryWithTimeout(fn, retryOptions, stackTrace) {
|
|
|
71
151
|
const retryWithTimeoutDebugger = getLibDebugger("Async:retryWithTimeout");
|
|
72
152
|
stackTrace ??= getStackTrace(1);
|
|
73
153
|
const DEFAULT_RETRY_OPTIONS = {
|
|
74
|
-
abortSignal: abortSignalNever,
|
|
154
|
+
abortSignal: abortSignalNever(),
|
|
75
155
|
// eslint-disable-next-line no-magic-numbers
|
|
76
156
|
retryDelayInMilliseconds: 100,
|
|
77
157
|
shouldRetryOnError: false,
|
|
@@ -80,107 +160,105 @@ async function retryWithTimeout(fn, retryOptions, stackTrace) {
|
|
|
80
160
|
};
|
|
81
161
|
const fullOptions = { ...DEFAULT_RETRY_OPTIONS, ...retryOptions };
|
|
82
162
|
fullOptions.abortSignal.throwIfAborted();
|
|
83
|
-
await runWithTimeout(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
163
|
+
await runWithTimeout(
|
|
164
|
+
fullOptions.timeoutInMilliseconds,
|
|
165
|
+
async (abortSignal) => {
|
|
166
|
+
const combinedAbortSignal = abortSignalAny([fullOptions.abortSignal, abortSignal]);
|
|
87
167
|
combinedAbortSignal.throwIfAborted();
|
|
88
|
-
attempt
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
isSuccess
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
168
|
+
let attempt = 0;
|
|
169
|
+
while (!combinedAbortSignal.aborted) {
|
|
170
|
+
attempt++;
|
|
171
|
+
let isSuccess;
|
|
172
|
+
try {
|
|
173
|
+
isSuccess = await fn(combinedAbortSignal);
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (combinedAbortSignal.aborted || !fullOptions.shouldRetryOnError || terminateRetryErrors.has(error)) {
|
|
176
|
+
throw new CustomStackTraceError("retryWithTimeout failed", stackTrace, error);
|
|
177
|
+
}
|
|
178
|
+
printError(error);
|
|
179
|
+
isSuccess = false;
|
|
95
180
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (attempt > 1) {
|
|
101
|
-
retryWithTimeoutDebugger(`Retry completed successfully after ${String(attempt)} attempts`);
|
|
181
|
+
if (isSuccess) {
|
|
182
|
+
retryWithTimeoutDebugger(`Retry completed successfully after ${String(attempt)} attempts`, {
|
|
183
|
+
fn
|
|
184
|
+
});
|
|
102
185
|
retryWithTimeoutDebugger.printStackTrace(stackTrace);
|
|
186
|
+
return;
|
|
103
187
|
}
|
|
104
|
-
|
|
188
|
+
retryWithTimeoutDebugger(
|
|
189
|
+
`Retry attempt ${String(attempt)} completed unsuccessfully. Trying again in ${String(fullOptions.retryDelayInMilliseconds)} milliseconds`,
|
|
190
|
+
{
|
|
191
|
+
fn
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
retryWithTimeoutDebugger.printStackTrace(stackTrace);
|
|
195
|
+
await sleep(fullOptions.retryDelayInMilliseconds);
|
|
105
196
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
retryWithTimeoutDebugger.printStackTrace(stackTrace);
|
|
113
|
-
await sleep(fullOptions.retryDelayInMilliseconds);
|
|
114
|
-
}
|
|
115
|
-
}, { retryFn: fn });
|
|
197
|
+
},
|
|
198
|
+
{ retryFn: fn },
|
|
199
|
+
stackTrace
|
|
200
|
+
);
|
|
116
201
|
}
|
|
117
|
-
async function runWithTimeout(timeoutInMilliseconds, fn, context) {
|
|
118
|
-
|
|
119
|
-
let result = null;
|
|
202
|
+
async function runWithTimeout(timeoutInMilliseconds, fn, context, stackTrace) {
|
|
203
|
+
stackTrace ??= getStackTrace(1);
|
|
120
204
|
const startTime = performance.now();
|
|
121
205
|
const abortController = new AbortController();
|
|
122
|
-
if (timeoutInMilliseconds === INFINITE_TIMEOUT) {
|
|
123
|
-
await run();
|
|
124
|
-
return result;
|
|
125
|
-
}
|
|
126
206
|
await Promise.race([run(), innerTimeout()]);
|
|
127
|
-
if (
|
|
128
|
-
|
|
207
|
+
if (abortController.signal.reason instanceof Result) {
|
|
208
|
+
return abortController.signal.reason.result;
|
|
129
209
|
}
|
|
130
|
-
|
|
210
|
+
throw new CustomStackTraceError("Run with timeout failed", stackTrace, abortController.signal.reason);
|
|
131
211
|
async function run() {
|
|
132
212
|
try {
|
|
133
|
-
result = await fn(abortController.signal);
|
|
213
|
+
const result = await fn(abortController.signal);
|
|
134
214
|
const duration = performance.now() - startTime;
|
|
135
|
-
getLibDebugger("Async:runWithTimeout")
|
|
136
|
-
|
|
137
|
-
|
|
215
|
+
const runWithTimeoutDebugger = getLibDebugger("Async:runWithTimeout");
|
|
216
|
+
runWithTimeoutDebugger(`Execution time: ${String(duration)} milliseconds`, { context, fn });
|
|
217
|
+
runWithTimeoutDebugger.printStackTrace(stackTrace ?? "");
|
|
218
|
+
abortController.abort(new Result(result));
|
|
219
|
+
} catch (e) {
|
|
220
|
+
abortController.abort(e);
|
|
138
221
|
}
|
|
139
222
|
}
|
|
140
223
|
async function innerTimeout() {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
224
|
+
while (!abortController.signal.aborted) {
|
|
225
|
+
await sleep(timeoutInMilliseconds, abortController.signal);
|
|
226
|
+
if (abortController.signal.aborted) {
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const duration = performance.now() - startTime;
|
|
230
|
+
console.warn(`Timed out after ${String(duration)} milliseconds`, { context, fn });
|
|
231
|
+
const timeoutDebugger = getLibDebugger("Async:runWithTimeout:timeout");
|
|
232
|
+
if (!timeoutDebugger.enabled) {
|
|
233
|
+
abortController.abort(new Error(`Timed out after ${String(duration)} milliseconds`));
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
timeoutDebugger(
|
|
237
|
+
`The execution is not terminated because debugger ${timeoutDebugger.namespace} is enabled. See https://github.com/mnaoumov/obsidian-dev-utils/blob/main/docs/debugging.md for more information`
|
|
154
238
|
);
|
|
155
|
-
await innerTimeout();
|
|
156
239
|
}
|
|
157
|
-
abortController.abort();
|
|
158
240
|
}
|
|
159
241
|
}
|
|
160
|
-
async function
|
|
161
|
-
|
|
162
|
-
|
|
242
|
+
async function setImmediateAsync() {
|
|
243
|
+
return new Promise((resolve) => {
|
|
244
|
+
setImmediate(() => {
|
|
245
|
+
resolve();
|
|
246
|
+
});
|
|
163
247
|
});
|
|
164
248
|
}
|
|
165
|
-
function
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
abortSignal.addEventListener("abort", handleAbort, { once: true });
|
|
171
|
-
function handleAbort() {
|
|
172
|
-
try {
|
|
173
|
-
abortSignal.throwIfAborted();
|
|
174
|
-
return false;
|
|
175
|
-
} catch (e) {
|
|
176
|
-
reject(e);
|
|
177
|
-
return true;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
249
|
+
async function setTimeoutAsync(delay) {
|
|
250
|
+
await new Promise((resolve) => {
|
|
251
|
+
setTimeout(resolve, delay);
|
|
180
252
|
});
|
|
181
253
|
}
|
|
182
|
-
async function
|
|
183
|
-
await
|
|
254
|
+
async function sleep(milliseconds, abortSignal, shouldThrowOnAbort) {
|
|
255
|
+
await waitForAbort(abortSignalAny([abortSignal ?? abortSignalNever(), abortSignalTimeout(milliseconds)]));
|
|
256
|
+
if (shouldThrowOnAbort) {
|
|
257
|
+
abortSignal?.throwIfAborted();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
async function timeout(timeoutInMilliseconds, abortSignal, shouldThrowOnAbort) {
|
|
261
|
+
await sleep(timeoutInMilliseconds, abortSignal, shouldThrowOnAbort);
|
|
184
262
|
throw new Error(`Timed out in ${String(timeoutInMilliseconds)} milliseconds`);
|
|
185
263
|
}
|
|
186
264
|
async function toArray(iter) {
|
|
@@ -191,9 +269,9 @@ async function toArray(iter) {
|
|
|
191
269
|
return arr;
|
|
192
270
|
}
|
|
193
271
|
export {
|
|
194
|
-
INFINITE_TIMEOUT,
|
|
195
272
|
addErrorHandler,
|
|
196
273
|
asyncFilter,
|
|
274
|
+
asyncFilterInPlace,
|
|
197
275
|
asyncFlatMap,
|
|
198
276
|
asyncMap,
|
|
199
277
|
convertAsyncToSync,
|
|
@@ -202,12 +280,18 @@ export {
|
|
|
202
280
|
invokeAsyncSafely,
|
|
203
281
|
invokeAsyncSafelyAfterDelay,
|
|
204
282
|
marksAsTerminateRetry,
|
|
283
|
+
neverEnds,
|
|
284
|
+
nextTickAsync,
|
|
285
|
+
promiseAllAsyncFnsSequentially,
|
|
286
|
+
promiseAllSequentially,
|
|
287
|
+
queueMicrotaskAsync,
|
|
205
288
|
requestAnimationFrameAsync,
|
|
206
289
|
retryWithTimeout,
|
|
207
290
|
runWithTimeout,
|
|
291
|
+
setImmediateAsync,
|
|
292
|
+
setTimeoutAsync,
|
|
208
293
|
sleep,
|
|
209
|
-
throwOnAbort,
|
|
210
294
|
timeout,
|
|
211
295
|
toArray
|
|
212
296
|
};
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBhYm9ydFNpZ25hbEFueSxcbiAgYWJvcnRTaWduYWxOZXZlclxufSBmcm9tICcuL0Fib3J0Q29udHJvbGxlci50cyc7XG5pbXBvcnQgeyBnZXRMaWJEZWJ1Z2dlciB9IGZyb20gJy4vRGVidWcudHMnO1xuaW1wb3J0IHtcbiAgQVNZTkNfRVJST1JfV1JBUFBFUl9NRVNTQUdFLFxuICBlbWl0QXN5bmNFcnJvckV2ZW50LFxuICBnZXRTdGFja1RyYWNlLFxuICBwcmludEVycm9yXG59IGZyb20gJy4vRXJyb3IudHMnO1xuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogQSBjb25zdGFudCByZXByZXNlbnRpbmcgYW4gaW5maW5pdGUgdGltZW91dC5cbiAqL1xuZXhwb3J0IGNvbnN0IElORklOSVRFX1RJTUVPVVQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLlxuICAgKi9cbiAgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHJ5IHRoZSBmdW5jdGlvbiBvbiBlcnJvci5cbiAgICovXG4gIHNob3VsZFJldHJ5T25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXRyeWluZy5cbiAgICovXG4gIHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBIG1hcmtlciBpbnRlcmZhY2UgdG8gaW5kaWNhdGUgdGhhdCBhbiBlcnJvciBzaG91bGQgdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlcm1pbmF0ZVJldHJ5IHtcbiAgLyoqXG4gICAqIEEgbWFya2VyIHByb3BlcnR5IHRvIGluZGljYXRlIHRoYXQgYW4gZXJyb3Igc2hvdWxkIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAgICovXG4gIF9fdGVybWluYXRlUmV0cnk6IHRydWU7XG59XG5cbi8qKlxuICogQWRkcyBhbiBlcnJvciBoYW5kbGVyIHRvIGEge0BsaW5rIFByb21pc2V9IHRoYXQgY2F0Y2hlcyBhbnkgZXJyb3JzIGFuZCBlbWl0cyBhbiBhc3luYyBlcnJvciBldmVudC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNGbiAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gYWRkIGFuIGVycm9yIGhhbmRsZXIgdG8uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhc3luY0Vycm9yV3JhcHBlciA9IG5ldyBFcnJvcihBU1lOQ19FUlJPUl9XUkFQUEVSX01FU1NBR0UpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRm4oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGFzeW5jRXJyb3JXcmFwcGVyLmNhdXNlID0gYXN5bmNFcnJvcjtcbiAgICBlbWl0QXN5bmNFcnJvckV2ZW50KGFzeW5jRXJyb3JXcmFwcGVyKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycjogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IHByZWRpY2F0ZVJlc3VsdHMgPSBhd2FpdCBhc3luY01hcChhcnIsIHByZWRpY2F0ZSk7XG4gIHJldHVybiBhcnIuZmlsdGVyKChfLCBpbmRleCkgPT4gcHJlZGljYXRlUmVzdWx0c1tpbmRleF0gPz8gZmFsc2UpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudCwgYW5kIHRoZW4gZmxhdHRlbnMgdGhlIHJlc3VsdHMgaW50byBhIHNpbmdsZSBhcnJheS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBtYXAgb3ZlciBhbmQgZmxhdHRlbi5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYSBmbGF0dGVuZWQgYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNGbGF0TWFwPFQsIFU+KGFycjogVFtdLCBjYWxsYmFjazogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPFVbXT4pOiBQcm9taXNlPFVbXT4ge1xuICByZXR1cm4gKGF3YWl0IGFzeW5jTWFwKGFyciwgY2FsbGJhY2spKS5mbGF0KCk7XG59XG5cbi8qKlxuICogTWFwcyBvdmVyIGFuIGFycmF5IGFzeW5jaHJvbm91c2x5LCBhcHBseWluZyB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gdG8gZWFjaCBlbGVtZW50LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBhcnJheS5cbiAqIEB0eXBlUGFyYW0gVSAtIFRoZSB0eXBlIG9mIGVsZW1lbnRzIGluIHRoZSBvdXRwdXQgYXJyYXkuXG4gKiBAcGFyYW0gYXJyIC0gVGhlIGFycmF5IHRvIG1hcCBvdmVyLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY01hcDxULCBVPihhcnI6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVPik6IFByb21pc2U8VVtdPiB7XG4gIHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChhcnIubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuYyAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB3cmFwcyB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGEgc3luY2hyb25vdXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEFzeW5jVG9TeW5jPEFyZ3MgZXh0ZW5kcyB1bmtub3duW10+KGFzeW5jRnVuYzogKC4uLmFyZ3M6IEFyZ3MpID0+IFByb21pc2U8dW5rbm93bj4pOiAoLi4uYXJnczogQXJncykgPT4gdm9pZCB7XG4gIHJldHVybiAoLi4uYXJnczogQXJncyk6IHZvaWQgPT4ge1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHQpOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgcmV0dXJuICguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gc3luY0ZuKC4uLmFyZ3MpKTtcbn1cblxuLyoqXG4gKiBJZ25vcmVzIGFuIGVycm9yIHRoYXQgaXMgdGhyb3duIGJ5IGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIEFsd2F5cyBgdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGNvbXBsZXRlcyBvciBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGlnbm9yZUVycm9yKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4sIGZhbGxiYWNrVmFsdWU/OiB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIEludm9rZXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGFuZCByZXR1cm5zIGEgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHByb21pc2UgLSBUaGUgcHJvbWlzZSB0byBpZ25vcmUgdGhlIGVycm9yIG9mLlxuICogQHBhcmFtIGZhbGxiYWNrVmFsdWUgLSBUaGUgdmFsdWUgdG8gcmV0dXJuIGlmIGFuIGVycm9yIGlzIHRocm93bi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBvciB0aGUgZmFsbGJhY2sgdmFsdWUgaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPiwgZmFsbGJhY2tWYWx1ZTogVCk6IFByb21pc2U8VD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBwcm9taXNlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseShhc3luY0ZuOiAoKSA9PiBQcm9taXNlPHVua25vd24+KTogdm9pZCB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXG4gIHZvaWQgYWRkRXJyb3JIYW5kbGVyKGFzeW5jRm4pO1xufVxuXG4vKipcbiAqIEludm9rZXMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIGFmdGVyIGEgZGVsYXkuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZS5cbiAqIEBwYXJhbSBkZWxheUluTWlsbGlzZWNvbmRzIC0gVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzeW5jU2FmZWx5QWZ0ZXJEZWxheShhc3luY0ZuOiAoKSA9PiBQcm9taXNhYmxlPHVua25vd24+LCBkZWxheUluTWlsbGlzZWNvbmRzID0gMCk6IHZvaWQge1xuICB3aW5kb3cuc2V0VGltZW91dChjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4gYXdhaXQgYXN5bmNGbigpKSwgZGVsYXlJbk1pbGxpc2Vjb25kcyk7XG59XG5cbi8qKlxuICogTWFya3MgYW4gZXJyb3IgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBtYXJrIHRvIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAqIEByZXR1cm5zIEFuIGVycm9yIHRoYXQgc2hvdWxkIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtzQXNUZXJtaW5hdGVSZXRyeTxURXJyb3IgZXh0ZW5kcyBFcnJvcj4oZXJyb3I6IFRFcnJvcik6IFRlcm1pbmF0ZVJldHJ5ICYgVEVycm9yIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oZXJyb3IsIHsgX190ZXJtaW5hdGVSZXRyeTogdHJ1ZSB9KSBhcyBUZXJtaW5hdGVSZXRyeSAmIFRFcnJvcjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHJlcXVlc3QgYW5pbWF0aW9uIGZyYW1lLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUgaXMgYXZhaWxhYmxlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEFuaW1hdGlvbkZyYW1lQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXMgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIHVudGlsIGl0IHJldHVybnMgdHJ1ZSBvciB0aGUgdGltZW91dCBpcyByZWFjaGVkLlxuICpcbiAqIEBwYXJhbSBmbiAtIFRoZSBmdW5jdGlvbiB0byByZXRyeS5cbiAqIEBwYXJhbSByZXRyeU9wdGlvbnMgLSBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGNvbmZpZ3VyZSB0aGUgcmV0cnkgYmVoYXZpb3IuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIE9wdGlvbmFsIHN0YWNrIHRyYWNlLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgb3IgcmVqZWN0cyB3aGVuIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXRyeVdpdGhUaW1lb3V0KGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+LCByZXRyeU9wdGlvbnM/OiBSZXRyeU9wdGlvbnMsIHN0YWNrVHJhY2U/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyID0gZ2V0TGliRGVidWdnZXIoJ0FzeW5jOnJldHJ5V2l0aFRpbWVvdXQnKTtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgY29uc3QgREVGQVVMVF9SRVRSWV9PUFRJT05TID0ge1xuICAgIGFib3J0U2lnbmFsOiBhYm9ydFNpZ25hbE5ldmVyLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tYWdpYy1udW1iZXJzXG4gICAgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzOiAxMDAsXG4gICAgc2hvdWxkUmV0cnlPbkVycm9yOiBmYWxzZSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogNTAwMFxuICB9O1xuICBjb25zdCBmdWxsT3B0aW9ucyA9IHsgLi4uREVGQVVMVF9SRVRSWV9PUFRJT05TLCAuLi5yZXRyeU9wdGlvbnMgfTtcbiAgZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcblxuICBhd2FpdCBydW5XaXRoVGltZW91dChmdWxsT3B0aW9ucy50aW1lb3V0SW5NaWxsaXNlY29uZHMsIGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IHtcbiAgICBjb25zdCBjb21iaW5lZEFib3J0U2lnbmFsID0gYWJvcnRTaWduYWxBbnkoW2Z1bGxPcHRpb25zLmFib3J0U2lnbmFsLCBhYm9ydFNpZ25hbF0pO1xuICAgIGxldCBhdHRlbXB0ID0gMDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb21iaW5lZEFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBhdHRlbXB0Kys7XG4gICAgICBsZXQgaXNTdWNjZXNzOiBib29sZWFuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaXNTdWNjZXNzID0gYXdhaXQgZm4oY29tYmluZWRBYm9ydFNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkIHx8ICFmdWxsT3B0aW9ucy5zaG91bGRSZXRyeU9uRXJyb3IgfHwgKGVycm9yIGFzIFBhcnRpYWw8VGVybWluYXRlUmV0cnk+KS5fX3Rlcm1pbmF0ZVJldHJ5KSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgcHJpbnRFcnJvcihlcnJvcik7XG4gICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU3VjY2Vzcykge1xuICAgICAgICBpZiAoYXR0ZW1wdCA+IDEpIHtcbiAgICAgICAgICByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIoYFJldHJ5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHtTdHJpbmcoYXR0ZW1wdCl9IGF0dGVtcHRzYCk7XG4gICAgICAgICAgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLnByaW50U3RhY2tUcmFjZShzdGFja1RyYWNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcihcbiAgICAgICAgYFJldHJ5IGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCl9IGNvbXBsZXRlZCB1bnN1Y2Nlc3NmdWxseS4gVHJ5aW5nIGFnYWluIGluICR7U3RyaW5nKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2AsXG4gICAgICAgIHtcbiAgICAgICAgICBmblxuICAgICAgICB9XG4gICAgICApO1xuICAgICAgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLnByaW50U3RhY2tUcmFjZShzdGFja1RyYWNlKTtcbiAgICAgIGF3YWl0IHNsZWVwKGZ1bGxPcHRpb25zLnJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9LCB7IHJldHJ5Rm46IGZuIH0pO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2l0aCBhIHRpbWVvdXQuIElmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBjb21wbGV0ZSB3aXRoaW4gdGhlIHNwZWNpZmllZCB0aW1lLCBpdCBpcyBjb25zaWRlcmVkIHRvIGhhdmUgdGltZWQgb3V0LlxuICpcbiAqIElmIGBERUJVRz1vYnNpZGlhbi1kZXYtdXRpbHM6QXN5bmM6cnVuV2l0aFRpbWVvdXRgIGlzIHNldCwgdGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBhZnRlciB0aGUgdGltZW91dCBhbmQgdGhlIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gcnVuIGluZGVmaW5pdGVseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzdWx0IGZyb20gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgcmVqZWN0cyBpZiBpdCB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoVGltZW91dDxSPih0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlciwgZm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8Uj4sIGNvbnRleHQ/OiB1bmtub3duKTogUHJvbWlzZTxSPiB7XG4gIGxldCBpc1RpbWVkT3V0ID0gdHJ1ZTtcbiAgbGV0IHJlc3VsdDogUiA9IG51bGwgYXMgUjtcbiAgY29uc3Qgc3RhcnRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGlmICh0aW1lb3V0SW5NaWxsaXNlY29uZHMgPT09IElORklOSVRFX1RJTUVPVVQpIHtcbiAgICBhd2FpdCBydW4oKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXdhaXQgUHJvbWlzZS5yYWNlKFtydW4oKSwgaW5uZXJUaW1lb3V0KCldKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgaWYgKGlzVGltZWRPdXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVkIG91dCcpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBmbihhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQnKShgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaXNUaW1lZE91dCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubmVyVGltZW91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWlzVGltZWRPdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgc2xlZXAodGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuICAgIGlmICghaXNUaW1lZE91dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgIGNvbnNvbGUud2FybihgVGltZWQgb3V0IGluICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICBjb25zdCBfZGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQ6dGltZW91dCcpO1xuICAgIGlmIChfZGVidWdnZXIuZW5hYmxlZCkge1xuICAgICAgX2RlYnVnZ2VyKFxuICAgICAgICBgVGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBiZWNhdXNlIGRlYnVnZ2VyICR7X2RlYnVnZ2VyLm5hbWVzcGFjZX0gaXMgZW5hYmxlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uYFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGlubmVyVGltZW91dCgpO1xuICAgIH1cbiAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICB3aW5kb3cuc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXNlY29uZHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyB3aGVuIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyB3aGVuIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRocm93T25BYm9ydChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgaWYgKGhhbmRsZUFib3J0KCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYWJvcnRTaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBoYW5kbGVBYm9ydCwgeyBvbmNlOiB0cnVlIH0pO1xuXG4gICAgZnVuY3Rpb24gaGFuZGxlQWJvcnQoKTogYm9vbGVhbiB7XG4gICAgICB0cnkge1xuICAgICAgICBhYm9ydFNpZ25hbC50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlIGFzIEVycm9yKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVqZWN0cyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgcGVyaW9kLlxuICpcbiAqIEBwYXJhbSB0aW1lb3V0SW5NaWxsaXNlY29uZHMgLSBUaGUgdGltZW91dCBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBhbHdheXMgcmVqZWN0cyB3aXRoIGEgdGltZW91dCBlcnJvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRpbWVvdXQodGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGF3YWl0IHNsZWVwKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gIHRocm93IG5ldyBFcnJvcihgVGltZWQgb3V0IGluICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kc2ApO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIGFuIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBhbiBhcnJheSBieSBjb25zdW1pbmcgYWxsIGl0cyBlbGVtZW50cy5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBwcm9kdWNlZCBieSB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICogQHBhcmFtIGl0ZXIgLSBUaGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgYWxsIHRoZSBlbGVtZW50cyBpbiB0aGUgQXN5bmNJdGVyYWJsZUl0ZXJhdG9yLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9BcnJheTxUPihpdGVyOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4pOiBQcm9taXNlPFRbXT4ge1xuICBjb25zdCBhcnI6IFRbXSA9IFtdO1xuICBmb3IgYXdhaXQgKGNvbnN0IGl0ZW0gb2YgaXRlcikge1xuICAgIGFyci5wdXNoKGl0ZW0pO1xuICB9XG4gIHJldHVybiBhcnI7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBUUE7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBYUEsTUFBTSxtQkFBbUIsT0FBTztBQTJDdkMsZUFBc0IsZ0JBQWdCLFNBQWdEO0FBQ3BGLFFBQU0sb0JBQW9CLElBQUksTUFBTSwyQkFBMkI7QUFDL0QsTUFBSTtBQUNGLFVBQU0sUUFBUTtBQUFBLEVBQ2hCLFNBQVMsWUFBWTtBQUNuQixzQkFBa0IsUUFBUTtBQUMxQix3QkFBb0IsaUJBQWlCO0FBQUEsRUFDdkM7QUFDRjtBQVVBLGVBQXNCLFlBQWUsS0FBVSxXQUF1RjtBQUNwSSxRQUFNLG1CQUFtQixNQUFNLFNBQVMsS0FBSyxTQUFTO0FBQ3RELFNBQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxVQUFVLGlCQUFpQixLQUFLLEtBQUssS0FBSztBQUNsRTtBQVdBLGVBQXNCLGFBQW1CLEtBQVUsVUFBa0Y7QUFDbkksVUFBUSxNQUFNLFNBQVMsS0FBSyxRQUFRLEdBQUcsS0FBSztBQUM5QztBQVdBLGVBQXNCLFNBQWUsS0FB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
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0FzeW5jLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2FibGUgfSBmcm9tICd0eXBlLWZlc3QnO1xuXG5pbXBvcnQge1xuICBhYm9ydFNpZ25hbEFueSxcbiAgYWJvcnRTaWduYWxOZXZlcixcbiAgYWJvcnRTaWduYWxUaW1lb3V0LFxuICB3YWl0Rm9yQWJvcnRcbn0gZnJvbSAnLi9BYm9ydENvbnRyb2xsZXIudHMnO1xuaW1wb3J0IHsgZ2V0TGliRGVidWdnZXIgfSBmcm9tICcuL0RlYnVnLnRzJztcbmltcG9ydCB7XG4gIEFTWU5DX1dSQVBQRVJfRVJST1JfTUVTU0FHRSxcbiAgQ3VzdG9tU3RhY2tUcmFjZUVycm9yLFxuICBlbWl0QXN5bmNFcnJvckV2ZW50LFxuICBnZXRTdGFja1RyYWNlLFxuICBwcmludEVycm9yXG59IGZyb20gJy4vRXJyb3IudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4vRnVuY3Rpb24udHMnO1xuXG4vKipcbiAqIEEgdHlwZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiB0aGF0IHJlc29sdmVzIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHJvbWlzZVJlc29sdmU8VD4gPSB1bmRlZmluZWQgZXh0ZW5kcyBUID8gKHZhbHVlPzogUHJvbWlzZUxpa2U8VD4gfCBUKSA9PiB2b2lkXG4gIDogKHZhbHVlOiBQcm9taXNlTGlrZTxUPiB8IFQpID0+IHZvaWQ7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHJldHJ5IGJlaGF2aW9yLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJldHJ5T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYWJvcnQgc2lnbmFsIHRvIGNhbmNlbCB0aGUgcmV0cnkgb3BlcmF0aW9uLlxuICAgKi9cbiAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbDtcblxuICAvKipcbiAgICogVGhlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBiZXR3ZWVuIHJldHJ5IGF0dGVtcHRzLlxuICAgKi9cbiAgcmV0cnlEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJldHJ5IHRoZSBmdW5jdGlvbiBvbiBlcnJvci5cbiAgICovXG4gIHNob3VsZFJldHJ5T25FcnJvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGdpdmluZyB1cCBvbiByZXRyeWluZy5cbiAgICovXG4gIHRpbWVvdXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIGVycm9yIGhhbmRsZXIgdG8gYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBjYXRjaGVzIGFueSBlcnJvcnMgYW5kIGVtaXRzIGFuIGFzeW5jIGVycm9yIGV2ZW50LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciB0by5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBjb21wbGV0ZXMgb3IgZW1pdHMgYXN5bmMgZXJyb3IgZXZlbnQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhZGRFcnJvckhhbmRsZXIoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICB0cnkge1xuICAgIGF3YWl0IGFzeW5jRm4oKTtcbiAgfSBjYXRjaCAoYXN5bmNFcnJvcikge1xuICAgIGVtaXRBc3luY0Vycm9yRXZlbnQobmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcihBU1lOQ19XUkFQUEVSX0VSUk9SX01FU1NBR0UsIHN0YWNrVHJhY2UsIGFzeW5jRXJyb3IpKTtcbiAgfVxufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCBhbiBhcnJheSBvZiBlbGVtZW50cyB0aGF0IHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmlsdGVyPFQ+KGFycjogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxib29sZWFuPik6IFByb21pc2U8VFtdPiB7XG4gIGNvbnN0IGFuczogVFtdID0gW107XG5cbiAgY29uc3QgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIGkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBpdGVtID0gYXJyW2ldIGFzIFQ7XG4gICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtLCBpLCBhcnIpKSB7XG4gICAgICBhbnMucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYW5zO1xufVxuXG4vKipcbiAqIEZpbHRlcnMgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHkgaW4gcGxhY2UsIGtlZXBpbmcgb25seSB0aGUgZWxlbWVudHMgdGhhdCBzYXRpc2Z5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUgZnVuY3Rpb24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBmaWx0ZXIuXG4gKiBAcGFyYW0gcHJlZGljYXRlIC0gVGhlIHByZWRpY2F0ZSBmdW5jdGlvbiB0byB0ZXN0IGVhY2ggZWxlbWVudC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgYXJyYXkgaXMgZmlsdGVyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbHRlckluUGxhY2U8VD4oYXJyOiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogVFtdKSA9PiBQcm9taXNhYmxlPGJvb2xlYW4+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGxlbmd0aCA9IGFyci5sZW5ndGg7XG4gIGxldCB3cml0ZUluZGV4ID0gMDtcbiAgZm9yIChsZXQgcmVhZEluZGV4ID0gMDsgcmVhZEluZGV4IDwgbGVuZ3RoOyByZWFkSW5kZXgrKykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihhcnIsIHJlYWRJbmRleCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnQgPSBhcnJbcmVhZEluZGV4XSBhcyBUO1xuICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoY3VycmVudCwgcmVhZEluZGV4LCBhcnIpKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVxdWlyZS1hdG9taWMtdXBkYXRlc1xuICAgICAgYXJyW3dyaXRlSW5kZXgrK10gPSBjdXJyZW50O1xuICAgIH1cbiAgfVxuICBhcnIubGVuZ3RoID0gd3JpdGVJbmRleDtcbn1cblxuLyoqXG4gKiBNYXBzIG92ZXIgYW4gYXJyYXkgYXN5bmNocm9ub3VzbHksIGFwcGx5aW5nIHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiB0byBlYWNoIGVsZW1lbnQsIGFuZCB0aGVuIGZsYXR0ZW5zIHRoZSByZXN1bHRzIGludG8gYSBzaW5nbGUgYXJyYXkuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGlucHV0IGFycmF5LlxuICogQHR5cGVQYXJhbSBVIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBhcnJheS5cbiAqIEBwYXJhbSBhcnIgLSBUaGUgYXJyYXkgdG8gbWFwIG92ZXIgYW5kIGZsYXR0ZW4uXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGEgZmxhdHRlbmVkIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmxhdE1hcDxULCBVPihhcnI6IFRbXSwgY2FsbGJhY2s6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gUHJvbWlzYWJsZTxVW10+KTogUHJvbWlzZTxVW10+IHtcbiAgcmV0dXJuIChhd2FpdCBhc3luY01hcChhcnIsIGNhbGxiYWNrKSkuZmxhdCgpO1xufVxuXG4vKipcbiAqIE1hcHMgb3ZlciBhbiBhcnJheSBhc3luY2hyb25vdXNseSwgYXBwbHlpbmcgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGVhY2ggZWxlbWVudC5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgYXJyYXkuXG4gKiBAdHlwZVBhcmFtIFUgLSBUaGUgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgb3V0cHV0IGFycmF5LlxuICogQHBhcmFtIGFyciAtIFRoZSBhcnJheSB0byBtYXAgb3Zlci5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYXN5bmNNYXA8VCwgVT4oYXJyOiBUW10sIGNhbGxiYWNrOiAodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiBUW10pID0+IFByb21pc2FibGU8VT4pOiBQcm9taXNlPFVbXT4ge1xuICByZXR1cm4gYXdhaXQgcHJvbWlzZUFsbFNlcXVlbnRpYWxseShhcnIubWFwKGNhbGxiYWNrKSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGEgc3luY2hyb25vdXMgb25lIGJ5IGF1dG9tYXRpY2FsbHkgaGFuZGxpbmcgdGhlIFByb21pc2UgcmVqZWN0aW9uLlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHBhcmFtIGFzeW5jRnVuYyAtIFRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gdG8gY29udmVydC5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gVGhlIHN0YWNrIHRyYWNlIG9mIHRoZSBzb3VyY2UgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBpbiBhIHN5bmNocm9ub3VzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRBc3luY1RvU3luYzxBcmdzIGV4dGVuZHMgdW5rbm93bltdPihhc3luY0Z1bmM6ICguLi5hcmdzOiBBcmdzKSA9PiBQcm9taXNlPHVua25vd24+LCBzdGFja1RyYWNlPzogc3RyaW5nKTogKC4uLmFyZ3M6IEFyZ3MpID0+IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICByZXR1cm4gKC4uLmFyZ3M6IEFyZ3MpOiB2b2lkID0+IHtcbiAgICBjb25zdCBpbm5lclN0YWNrVHJhY2UgPSBnZXRTdGFja1RyYWNlKDEpO1xuICAgIHN0YWNrVHJhY2UgPSBgJHtzdGFja1RyYWNlID8/ICcnfVxcbiAgICBhdCAtLS0gY29udmVydEFzeW5jVG9TeW5jIC0tLSAoMClcXG4ke2lubmVyU3RhY2tUcmFjZX1gO1xuICAgIGludm9rZUFzeW5jU2FmZWx5KCgpID0+IGFzeW5jRnVuYyguLi5hcmdzKSwgc3RhY2tUcmFjZSk7XG4gIH07XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBhbiBhc3luY2hyb25vdXMgb25lIGJ5IHdyYXBwaW5nIGl0IGluIGEge0BsaW5rIFByb21pc2V9LlxuICpcbiAqIEB0eXBlUGFyYW0gQXJncyAtIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIHRoZSBmdW5jdGlvbiBhY2NlcHRzLlxuICogQHR5cGVQYXJhbSBSZXN1bHQgLSBUaGUgdHlwZSBvZiB0aGUgZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuXG4gKiBAcGFyYW0gc3luY0ZuIC0gVGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIHN5bmNocm9ub3VzIGZ1bmN0aW9uIGluIGFuIGFzeW5jaHJvbm91cyBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0U3luY1RvQXN5bmM8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihzeW5jRm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHQpOiAoLi4uYXJnczogQXJncykgPT4gUHJvbWlzZTxSZXN1bHQ+IHtcbiAgcmV0dXJuIGFzeW5jICguLi5hcmdzOiBBcmdzKTogUHJvbWlzZTxSZXN1bHQ+ID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gc3luY0ZuKC4uLmFyZ3MpO1xuICB9O1xufVxuXG4vKipcbiAqIElnbm9yZXMgYW4gZXJyb3IgdGhhdCBpcyB0aHJvd24gYnkgYW4gYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBwcm9taXNlIC0gVGhlIHByb21pc2UgdG8gaWdub3JlIHRoZSBlcnJvciBvZi5cbiAqIEBwYXJhbSBmYWxsYmFja1ZhbHVlIC0gQWx3YXlzIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gY29tcGxldGVzIG9yIGZhaWxzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaWdub3JlRXJyb3IocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPiwgZmFsbGJhY2tWYWx1ZT86IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD47XG5cbi8qKlxuICogSW52b2tlcyBhbiBhc3luY2hyb25vdXMgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24uXG4gKiBAcGFyYW0gcHJvbWlzZSAtIFRoZSBwcm9taXNlIHRvIGlnbm9yZSB0aGUgZXJyb3Igb2YuXG4gKiBAcGFyYW0gZmFsbGJhY2tWYWx1ZSAtIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgYW4gZXJyb3IgaXMgdGhyb3duLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIG9yIHRoZSBmYWxsYmFjayB2YWx1ZSBpZiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpZ25vcmVFcnJvcjxUPihwcm9taXNlOiBQcm9taXNlPFQ+LCBmYWxsYmFja1ZhbHVlOiBUKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IGlnbm9yZUVycm9yRGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6aWdub3JlRXJyb3InKTtcbiAgY29uc3Qgc3RhY2tUcmFjZSA9IGdldFN0YWNrVHJhY2UoMSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZ25vcmVFcnJvckRlYnVnZ2VyKCdJZ25vcmVkIGVycm9yJywgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcignSWdub3JlZCBlcnJvcicsIHN0YWNrVHJhY2UsIGUpKTtcbiAgICByZXR1cm4gZmFsbGJhY2tWYWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEludm9rZXMgYSB7QGxpbmsgUHJvbWlzZX0gYW5kIHNhZmVseSBoYW5kbGVzIGFueSBlcnJvcnMgYnkgY2F0Y2hpbmcgdGhlbSBhbmQgZW1pdHRpbmcgYW4gYXN5bmMgZXJyb3IgZXZlbnQuXG4gKlxuICogQHBhcmFtIGFzeW5jRm4gLSBUaGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uIHRvIGludm9rZSBzYWZlbHkuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52b2tlQXN5bmNTYWZlbHkoYXN5bmNGbjogKCkgPT4gUHJvbWlzZTx1bmtub3duPiwgc3RhY2tUcmFjZT86IHN0cmluZyk6IHZvaWQge1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdm9pZFxuICB2b2lkIGFkZEVycm9ySGFuZGxlcihhc3luY0ZuLCBzdGFja1RyYWNlKTtcbn1cblxuLyoqXG4gKiBJbnZva2VzIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvbiBhZnRlciBhIGRlbGF5LlxuICpcbiAqIEBwYXJhbSBhc3luY0ZuIC0gVGhlIGFzeW5jaHJvbm91cyBmdW5jdGlvbiB0byBpbnZva2UuXG4gKiBAcGFyYW0gZGVsYXlJbk1pbGxpc2Vjb25kcyAtIFRoZSBkZWxheSBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gc3RhY2tUcmFjZSAtIFRoZSBzdGFjayB0cmFjZSBvZiB0aGUgc291cmNlIGZ1bmN0aW9uLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3luY1NhZmVseUFmdGVyRGVsYXkoXG4gIGFzeW5jRm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8dm9pZD4sXG4gIGRlbGF5SW5NaWxsaXNlY29uZHMgPSAwLFxuICBzdGFja1RyYWNlPzogc3RyaW5nLFxuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsXG4pOiB2b2lkIHtcbiAgYWJvcnRTaWduYWwgPz89IGFib3J0U2lnbmFsTmV2ZXIoKTtcbiAgYWJvcnRTaWduYWwudGhyb3dJZkFib3J0ZWQoKTtcbiAgc3RhY2tUcmFjZSA/Pz0gZ2V0U3RhY2tUcmFjZSgxKTtcbiAgaW52b2tlQXN5bmNTYWZlbHkoYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHNsZWVwKGRlbGF5SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCB0cnVlKTtcbiAgICBhd2FpdCBhc3luY0ZuKGFib3J0U2lnbmFsKTtcbiAgfSwgc3RhY2tUcmFjZSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYXN5bmMgZnVuY3Rpb25zIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gYXN5bmNGbnMgLSBUaGUgYXN5bmMgZnVuY3Rpb25zIHRvIGV4ZWN1dGUgc2VxdWVudGlhbGx5LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIHRoZSByZXN1bHRzIG9mIHRoZSBhc3luYyBmdW5jdGlvbnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9taXNlQWxsQXN5bmNGbnNTZXF1ZW50aWFsbHk8VD4oYXN5bmNGbnM6ICgoKSA9PiBQcm9taXNhYmxlPFQ+KVtdKTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgcmVzdWx0czogVFtdID0gW107XG4gIGZvciAoY29uc3QgYXN5bmNGbiBvZiBhc3luY0Zucykge1xuICAgIHJlc3VsdHMucHVzaChhd2FpdCBhc3luY0ZuKCkpO1xuICB9XG4gIHJldHVybiByZXN1bHRzO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHByb21pc2VzIHNlcXVlbnRpYWxseS5cbiAqXG4gKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUuXG4gKiBAcGFyYW0gcHJvbWlzZXMgLSBUaGUgcHJvbWlzZXMgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdpdGggYW4gYXJyYXkgb2YgdGhlIHJlc3VsdHMgb2YgdGhlIHByb21pc2VzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvbWlzZUFsbFNlcXVlbnRpYWxseTxUPihwcm9taXNlczogUHJvbWlzYWJsZTxUPltdKTogUHJvbWlzZTxUW10+IHtcbiAgcmV0dXJuIGF3YWl0IHByb21pc2VBbGxBc3luY0Zuc1NlcXVlbnRpYWxseShwcm9taXNlcy5tYXAoKHByb21pc2UpID0+ICgpID0+IHByb21pc2UpKTtcbn1cblxuY29uc3QgdGVybWluYXRlUmV0cnlFcnJvcnMgPSBuZXcgV2Vha1NldDxFcnJvcj4oKTtcblxuY2xhc3MgUmVzdWx0PFI+IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSByZXN1bHQ6IFIpIHt9XG59XG5cbi8qKlxuICogTWFya3MgYW4gZXJyb3IgdG8gdGVybWluYXRlIHJldHJ5IGxvZ2ljLlxuICpcbiAqIEBwYXJhbSBlcnJvciAtIFRoZSBlcnJvciB0byBtYXJrIHRvIHRlcm1pbmF0ZSByZXRyeSBsb2dpYy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtzQXNUZXJtaW5hdGVSZXRyeShlcnJvcjogRXJyb3IpOiB2b2lkIHtcbiAgdGVybWluYXRlUmV0cnlFcnJvcnMuYWRkKGVycm9yKTtcbn1cblxuLyoqXG4gKiBBbiBhc3luYyBmdW5jdGlvbiB0aGF0IG5ldmVyIGVuZHMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCBuZXZlciByZXNvbHZlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5ldmVyRW5kcygpOiBQcm9taXNlPG5ldmVyPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKCgpID0+IHtcbiAgICBub29wKCk7XG4gIH0pO1xuICB0aHJvdyBuZXcgRXJyb3IoJ1Nob3VsZCBuZXZlciBoYXBwZW4nKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHRpY2suXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCB0aWNrIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5leHRUaWNrQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzay5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBuZXh0IHF1ZXVlIG1pY3JvdGFzayBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWV1ZU1pY3JvdGFza0FzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIG5leHQgcmVxdWVzdCBhbmltYXRpb24gZnJhbWUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCByZXF1ZXN0IGFuaW1hdGlvbiBmcmFtZSBpcyBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmV0cmllcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gdW50aWwgaXQgcmV0dXJucyB0cnVlIG9yIHRoZSB0aW1lb3V0IGlzIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIGZuIC0gVGhlIGZ1bmN0aW9uIHRvIHJldHJ5LlxuICogQHBhcmFtIHJldHJ5T3B0aW9ucyAtIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gY29uZmlndXJlIHRoZSByZXRyeSBiZWhhdmlvci5cbiAqIEBwYXJhbSBzdGFja1RyYWNlIC0gT3B0aW9uYWwgc3RhY2sgdHJhY2UuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBvciByZWplY3RzIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJldHJ5V2l0aFRpbWVvdXQoZm46IChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IFByb21pc2FibGU8Ym9vbGVhbj4sIHJldHJ5T3B0aW9ucz86IFJldHJ5T3B0aW9ucywgc3RhY2tUcmFjZT86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cmV0cnlXaXRoVGltZW91dCcpO1xuICBzdGFja1RyYWNlID8/PSBnZXRTdGFja1RyYWNlKDEpO1xuICBjb25zdCBERUZBVUxUX1JFVFJZX09QVElPTlMgPSB7XG4gICAgYWJvcnRTaWduYWw6IGFib3J0U2lnbmFsTmV2ZXIoKSxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbWFnaWMtbnVtYmVyc1xuICAgIHJldHJ5RGVsYXlJbk1pbGxpc2Vjb25kczogMTAwLFxuICAgIHNob3VsZFJldHJ5T25FcnJvcjogZmFsc2UsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW1hZ2ljLW51bWJlcnNcbiAgICB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IDUwMDBcbiAgfTtcbiAgY29uc3QgZnVsbE9wdGlvbnMgPSB7IC4uLkRFRkFVTFRfUkVUUllfT1BUSU9OUywgLi4ucmV0cnlPcHRpb25zIH07XG4gIGZ1bGxPcHRpb25zLmFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG5cbiAgYXdhaXQgcnVuV2l0aFRpbWVvdXQoXG4gICAgZnVsbE9wdGlvbnMudGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgIGFzeW5jIChhYm9ydFNpZ25hbDogQWJvcnRTaWduYWwpID0+IHtcbiAgICAgIGNvbnN0IGNvbWJpbmVkQWJvcnRTaWduYWwgPSBhYm9ydFNpZ25hbEFueShbZnVsbE9wdGlvbnMuYWJvcnRTaWduYWwsIGFib3J0U2lnbmFsXSk7XG4gICAgICBjb21iaW5lZEFib3J0U2lnbmFsLnRocm93SWZBYm9ydGVkKCk7XG4gICAgICBsZXQgYXR0ZW1wdCA9IDA7XG4gICAgICB3aGlsZSAoIWNvbWJpbmVkQWJvcnRTaWduYWwuYWJvcnRlZCkge1xuICAgICAgICBhdHRlbXB0Kys7XG4gICAgICAgIGxldCBpc1N1Y2Nlc3M6IGJvb2xlYW47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaXNTdWNjZXNzID0gYXdhaXQgZm4oY29tYmluZWRBYm9ydFNpZ25hbCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS1jb25kaXRpb25cbiAgICAgICAgICBpZiAoY29tYmluZWRBYm9ydFNpZ25hbC5hYm9ydGVkIHx8ICFmdWxsT3B0aW9ucy5zaG91bGRSZXRyeU9uRXJyb3IgfHwgdGVybWluYXRlUmV0cnlFcnJvcnMuaGFzKGVycm9yIGFzIEVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEN1c3RvbVN0YWNrVHJhY2VFcnJvcigncmV0cnlXaXRoVGltZW91dCBmYWlsZWQnLCBzdGFja1RyYWNlLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHByaW50RXJyb3IoZXJyb3IpO1xuICAgICAgICAgIGlzU3VjY2VzcyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1N1Y2Nlc3MpIHtcbiAgICAgICAgICByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIoYFJldHJ5IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkgYWZ0ZXIgJHtTdHJpbmcoYXR0ZW1wdCl9IGF0dGVtcHRzYCwge1xuICAgICAgICAgICAgZm5cbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXRyeVdpdGhUaW1lb3V0RGVidWdnZXIucHJpbnRTdGFja1RyYWNlKHN0YWNrVHJhY2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHJ5V2l0aFRpbWVvdXREZWJ1Z2dlcihcbiAgICAgICAgICBgUmV0cnkgYXR0ZW1wdCAke1N0cmluZyhhdHRlbXB0KX0gY29tcGxldGVkIHVuc3VjY2Vzc2Z1bGx5LiBUcnlpbmcgYWdhaW4gaW4gJHtTdHJpbmcoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKX0gbWlsbGlzZWNvbmRzYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmblxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgcmV0cnlXaXRoVGltZW91dERlYnVnZ2VyLnByaW50U3RhY2tUcmFjZShzdGFja1RyYWNlKTtcbiAgICAgICAgYXdhaXQgc2xlZXAoZnVsbE9wdGlvbnMucmV0cnlEZWxheUluTWlsbGlzZWNvbmRzKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHsgcmV0cnlGbjogZm4gfSxcbiAgICBzdGFja1RyYWNlXG4gICk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYSBmdW5jdGlvbiB3aXRoIGEgdGltZW91dC4gSWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNvbXBsZXRlIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUsIGl0IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSB0aW1lZCBvdXQuXG4gKlxuICogSWYgYERFQlVHPW9ic2lkaWFuLWRldi11dGlsczpBc3luYzpydW5XaXRoVGltZW91dGAgaXMgc2V0LCB0aGUgZXhlY3V0aW9uIGlzIG5vdCB0ZXJtaW5hdGVkIGFmdGVyIHRoZSB0aW1lb3V0IGFuZCB0aGUgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBydW4gaW5kZWZpbml0ZWx5LlxuICpcbiAqIEB0eXBlUGFyYW0gUiAtIFRoZSB0eXBlIG9mIHRoZSByZXN1bHQgZnJvbSB0aGUgYXN5bmNocm9ub3VzIGZ1bmN0aW9uLlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQgb2YgdGhlIGZ1bmN0aW9uLlxuICogQHBhcmFtIHN0YWNrVHJhY2UgLSBUaGUgc3RhY2sgdHJhY2Ugb2YgdGhlIHNvdXJjZSBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBhc3luY2hyb25vdXMgZnVuY3Rpb24gb3IgcmVqZWN0cyBpZiBpdCB0aW1lcyBvdXQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XaXRoVGltZW91dDxSPihcbiAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIsXG4gIGZuOiAoYWJvcnRTaWduYWw6IEFib3J0U2lnbmFsKSA9PiBQcm9taXNhYmxlPFI+LFxuICBjb250ZXh0PzogdW5rbm93bixcbiAgc3RhY2tUcmFjZT86IHN0cmluZ1xuKTogUHJvbWlzZTxSPiB7XG4gIHN0YWNrVHJhY2UgPz89IGdldFN0YWNrVHJhY2UoMSk7XG4gIGNvbnN0IHN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICBhd2FpdCBQcm9taXNlLnJhY2UoW3J1bigpLCBpbm5lclRpbWVvdXQoKV0pO1xuICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBSZXN1bHQpIHtcbiAgICByZXR1cm4gYWJvcnRDb250cm9sbGVyLnNpZ25hbC5yZWFzb24ucmVzdWx0IGFzIFI7XG4gIH1cblxuICB0aHJvdyBuZXcgQ3VzdG9tU3RhY2tUcmFjZUVycm9yKCdSdW4gd2l0aCB0aW1lb3V0IGZhaWxlZCcsIHN0YWNrVHJhY2UsIGFib3J0Q29udHJvbGxlci5zaWduYWwucmVhc29uIGFzIHVua25vd24pO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oYWJvcnRDb250cm9sbGVyLnNpZ25hbCk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgcnVuV2l0aFRpbWVvdXREZWJ1Z2dlciA9IGdldExpYkRlYnVnZ2VyKCdBc3luYzpydW5XaXRoVGltZW91dCcpO1xuICAgICAgcnVuV2l0aFRpbWVvdXREZWJ1Z2dlcihgRXhlY3V0aW9uIHRpbWU6ICR7U3RyaW5nKGR1cmF0aW9uKX0gbWlsbGlzZWNvbmRzYCwgeyBjb250ZXh0LCBmbiB9KTtcbiAgICAgIHJ1bldpdGhUaW1lb3V0RGVidWdnZXIucHJpbnRTdGFja1RyYWNlKHN0YWNrVHJhY2UgPz8gJycpO1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KG5ldyBSZXN1bHQocmVzdWx0KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgYWJvcnRDb250cm9sbGVyLmFib3J0KGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGlubmVyVGltZW91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB3aGlsZSAoIWFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgYXdhaXQgc2xlZXAodGltZW91dEluTWlsbGlzZWNvbmRzLCBhYm9ydENvbnRyb2xsZXIuc2lnbmFsKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICBpZiAoYWJvcnRDb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGR1cmF0aW9uID0gcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICBjb25zb2xlLndhcm4oYFRpbWVkIG91dCBhZnRlciAke1N0cmluZyhkdXJhdGlvbil9IG1pbGxpc2Vjb25kc2AsIHsgY29udGV4dCwgZm4gfSk7XG4gICAgICBjb25zdCB0aW1lb3V0RGVidWdnZXIgPSBnZXRMaWJEZWJ1Z2dlcignQXN5bmM6cnVuV2l0aFRpbWVvdXQ6dGltZW91dCcpO1xuICAgICAgaWYgKCF0aW1lb3V0RGVidWdnZXIuZW5hYmxlZCkge1xuICAgICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBUaW1lZCBvdXQgYWZ0ZXIgJHtTdHJpbmcoZHVyYXRpb24pfSBtaWxsaXNlY29uZHNgKSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGltZW91dERlYnVnZ2VyKFxuICAgICAgICBgVGhlIGV4ZWN1dGlvbiBpcyBub3QgdGVybWluYXRlZCBiZWNhdXNlIGRlYnVnZ2VyICR7dGltZW91dERlYnVnZ2VyLm5hbWVzcGFjZX0gaXMgZW5hYmxlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uYFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXh0IHNldCBpbW1lZGlhdGUuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgbmV4dCBzZXQgaW1tZWRpYXRlIGlzIGF2YWlsYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldEltbWVkaWF0ZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBEZWxheXMgZXhlY3V0aW9uIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSBkZWxheSAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2V0VGltZW91dEFzeW5jKGRlbGF5PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc2V0VGltZW91dChyZXNvbHZlLCBkZWxheSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIERlbGF5cyBleGVjdXRpb24gZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBtaWxsaXNlY29uZHMuXG4gKlxuICogQHBhcmFtIG1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lIHRvIHdhaXQgaW4gbWlsbGlzZWNvbmRzLlxuICogQHBhcmFtIGFib3J0U2lnbmFsIC0gVGhlIGFib3J0IHNpZ25hbCB0byBsaXN0ZW4gdG8uXG4gKiBAcGFyYW0gc2hvdWxkVGhyb3dPbkFib3J0IC0gV2hldGhlciB0byB0aHJvdyBhbiBlcnJvciBpZiB0aGUgYWJvcnQgc2lnbmFsIGlzIGFib3J0ZWQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzbGVlcChtaWxsaXNlY29uZHM6IG51bWJlciwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCwgc2hvdWxkVGhyb3dPbkFib3J0PzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCB3YWl0Rm9yQWJvcnQoYWJvcnRTaWduYWxBbnkoW2Fib3J0U2lnbmFsID8/IGFib3J0U2lnbmFsTmV2ZXIoKSwgYWJvcnRTaWduYWxUaW1lb3V0KG1pbGxpc2Vjb25kcyldKSk7XG4gIGlmIChzaG91bGRUaHJvd09uQWJvcnQpIHtcbiAgICBhYm9ydFNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZWplY3RzIGFmdGVyIHRoZSBzcGVjaWZpZWQgdGltZW91dCBwZXJpb2QuXG4gKlxuICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIFRoZSB0aW1lb3V0IHBlcmlvZCBpbiBtaWxsaXNlY29uZHMuXG4gKiBAcGFyYW0gYWJvcnRTaWduYWwgLSBUaGUgYWJvcnQgc2lnbmFsIHRvIGxpc3RlbiB0by5cbiAqIEBwYXJhbSBzaG91bGRUaHJvd09uQWJvcnQgLSBXaGV0aGVyIHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSBhYm9ydCBzaWduYWwgaXMgYWJvcnRlZC5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgYWx3YXlzIHJlamVjdHMgd2l0aCBhIHRpbWVvdXQgZXJyb3IuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0aW1lb3V0KHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyLCBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQ/OiBib29sZWFuKTogUHJvbWlzZTxuZXZlcj4ge1xuICBhd2FpdCBzbGVlcCh0aW1lb3V0SW5NaWxsaXNlY29uZHMsIGFib3J0U2lnbmFsLCBzaG91bGRUaHJvd09uQWJvcnQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYFRpbWVkIG91dCBpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfSBtaWxsaXNlY29uZHNgKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBBc3luY0l0ZXJhYmxlSXRlcmF0b3IgdG8gYW4gYXJyYXkgYnkgY29uc3VtaW5nIGFsbCBpdHMgZWxlbWVudHMuXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgZWxlbWVudHMgcHJvZHVjZWQgYnkgdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqIEBwYXJhbSBpdGVyIC0gVGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvciB0byBjb252ZXJ0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aXRoIGFuIGFycmF5IG9mIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlIEFzeW5jSXRlcmFibGVJdGVyYXRvci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRvQXJyYXk8VD4oaXRlcjogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+KTogUHJvbWlzZTxUW10+IHtcbiAgY29uc3QgYXJyOiBUW10gPSBbXTtcbiAgZm9yIGF3YWl0IChjb25zdCBpdGVtIG9mIGl0ZXIpIHtcbiAgICBhcnIucHVzaChpdGVtKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7OztBQVFBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHNCQUFzQjtBQUMvQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQTBDckIsZUFBc0IsZ0JBQWdCLFNBQWlDLFlBQW9DO0FBQ3pHLGlCQUFlLGNBQWMsQ0FBQztBQUM5QixNQUFJO0FBQ0YsVUFBTSxRQUFRO0FBQUEsRUFDaEIsU0FBUyxZQUFZO0FBQ25CLHdCQUFvQixJQUFJLHNCQUFzQiw2QkFBNkIsWUFBWSxVQUFVLENBQUM7QUFBQSxFQUNwRztBQUNGO0FBVUEsZUFBc0IsWUFBZSxLQUFVLFdBQXVGO0FBQ3BJLFFBQU0sTUFBVyxDQUFDO0FBRWxCLFFBQU0sU0FBUyxJQUFJO0FBQ25CLFdBQVMsSUFBSSxHQUFHLElBQUksUUFBUSxLQUFLO0FBQy9CLFFBQUksQ0FBQyxPQUFPLE9BQU8sS0FBSyxDQUFDLEdBQUc7QUFDMUI7QUFBQSxJQUNGO0FBRUEsVUFBTSxPQUFPLElBQUksQ0FBQztBQUNsQixRQUFJLE1BQU0sVUFBVSxNQUFNLEdBQUcsR0FBRyxHQUFHO0FBQ2pDLFVBQUksS0FBSyxJQUFJO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFFQSxTQUFPO0FBQ1Q7QUFVQSxlQUFzQixtQkFBc0IsS0FBVSxXQUF3RjtBQUM1SSxRQUFNLFNBQVMsSUFBSTtBQUNuQixNQUFJLGFBQWE7QUFDakIsV0FBUyxZQUFZLEdBQUcsWUFBWSxRQUFRLGFBQWE7QUFDdkQsUUFBSSxDQUFDLE9BQU8sT0FBTyxLQUFLLFNBQVMsR0FBRztBQUNsQztBQUFBLElBQ0Y7QUFFQSxVQUFNLFVBQVUsSUFBSSxTQUFTO0FBQzdCLFFBQUksTUFBTSxVQUFVLFNBQVMsV0FBVyxHQUFHLEdBQUc7QUFFNUMsVUFBSSxZQUFZLElBQUk7QUFBQSxJQUN0QjtBQUFBLEVBQ0Y7QUFDQSxNQUFJLFNBQVM7QUFDZjtBQVdBLGVBQXNCLGFBQW1CLEtBQVUsVUFBa0Y7QUFDbkksVUFBUSxNQUFNLFNBQVMsS0FBSyxRQUFRLEdBQUcsS0FBSztBQUM5QztBQVdBLGVBQXNCLFNBQWUsS0FBVSxVQUFnRjtBQUM3SCxTQUFPLE1BQU0sdUJBQXVCLElBQUksSUFBSSxRQUFRLENBQUM7QUFDdkQ7QUFVTyxTQUFTLG1CQUEyQyxXQUFnRCxZQUE4QztBQUN2SixpQkFBZSxjQUFjLENBQUM7QUFDOUIsU0FBTyxJQUFJLFNBQXFCO0FBQzlCLFVBQU0sa0JBQWtCLGNBQWMsQ0FBQztBQUN2QyxpQkFBYSxHQUFHLGNBQWMsRUFBRTtBQUFBO0FBQUEsRUFBNEMsZUFBZTtBQUMzRixzQkFBa0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLFVBQVU7QUFBQSxFQUN4RDtBQUNGO0FBVU8sU0FBUyxtQkFBbUQsUUFBdUU7QUFDeEksU0FBTyxVQUFVLFNBQWdDO0FBQy9DLFVBQU0sUUFBUSxRQUFRO0FBQ3RCLFdBQU8sT0FBTyxHQUFHLElBQUk7QUFBQSxFQUN2QjtBQUNGO0FBbUJBLGVBQXNCLFlBQWUsU0FBcUIsZUFBOEI7QUFDdEYsUUFBTSxzQkFBc0IsZUFBZSxtQkFBbUI7QUFDOUQsUUFBTSxhQUFhLGNBQWMsQ0FBQztBQUNsQyxNQUFJO0FBQ0YsV0FBTyxNQUFNO0FBQUEsRUFDZixTQUFTLEdBQUc7QUFDVix3QkFBb0IsaUJBQWlCLElBQUksc0JBQXNCLGlCQUFpQixZQUFZLENBQUMsQ0FBQztBQUM5RixXQUFPO0FBQUEsRUFDVDtBQUNGO0FBUU8sU0FBUyxrQkFBa0IsU0FBaUMsWUFBMkI7QUFDNUYsaUJBQWUsY0FBYyxDQUFDO0FBRTlCLE9BQUssZ0JBQWdCLFNBQVMsVUFBVTtBQUMxQztBQVVPLFNBQVMsNEJBQ2QsU0FDQSxzQkFBc0IsR0FDdEIsWUFDQSxhQUNNO0FBQ04sa0JBQWdCLGlCQUFpQjtBQUNqQyxjQUFZLGVBQWU7QUFDM0IsaUJBQWUsY0FBYyxDQUFDO0FBQzlCLG9CQUFrQixZQUFZO0FBQzVCLFVBQU0sTUFBTSxxQkFBcUIsYUFBYSxJQUFJO0FBQ2xELFVBQU0sUUFBUSxXQUFXO0FBQUEsRUFDM0IsR0FBRyxVQUFVO0FBQ2Y7QUFTQSxlQUFzQiwrQkFBa0MsVUFBaUQ7QUFDdkcsUUFBTSxVQUFlLENBQUM7QUFDdEIsYUFBVyxXQUFXLFVBQVU7QUFDOUIsWUFBUSxLQUFLLE1BQU0sUUFBUSxDQUFDO0FBQUEsRUFDOUI7QUFDQSxTQUFPO0FBQ1Q7QUFTQSxlQUFzQix1QkFBMEIsVUFBeUM7QUFDdkYsU0FBTyxNQUFNLCtCQUErQixTQUFTLElBQUksQ0FBQyxZQUFZLE1BQU0sT0FBTyxDQUFDO0FBQ3RGO0FBRUEsTUFBTSx1QkFBdUIsb0JBQUksUUFBZTtBQUVoRCxNQUFNLE9BQVU7QUFBQSxFQUNQLFlBQTRCLFFBQVc7QUFBWDtBQUFBLEVBQVk7QUFDakQ7QUFPTyxTQUFTLHNCQUFzQixPQUFvQjtBQUN4RCx1QkFBcUIsSUFBSSxLQUFLO0FBQ2hDO0FBT0EsZUFBc0IsWUFBNEI7QUFDaEQsUUFBTSxJQUFJLFFBQVEsTUFBTTtBQUN0QixTQUFLO0FBQUEsRUFDUCxDQUFDO0FBQ0QsUUFBTSxJQUFJLE1BQU0scUJBQXFCO0FBQ3ZDO0FBT0EsZUFBc0IsZ0JBQStCO0FBQ25ELFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixZQUFRLFNBQVMsTUFBTTtBQUNyQixjQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFPQSxlQUFzQixzQkFBcUM7QUFDekQsU0FBTyxJQUFJLFFBQVEsQ0FBQyxZQUFZO0FBQzlCLG1CQUFlLE1BQU07QUFDbkIsY0FBUTtBQUFBLElBQ1YsQ0FBQztBQUFBLEVBQ0gsQ0FBQztBQUNIO0FBT0EsZUFBc0IsNkJBQTRDO0FBQ2hFLFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QiwwQkFBc0IsTUFBTTtBQUMxQixjQUFRO0FBQUEsSUFDVixDQUFDO0FBQUEsRUFDSCxDQUFDO0FBQ0g7QUFVQSxlQUFzQixpQkFBaUIsSUFBdUQsY0FBNkIsWUFBb0M7QUFDN0osUUFBTSwyQkFBMkIsZUFBZSx3QkFBd0I7QUFDeEUsaUJBQWUsY0FBYyxDQUFDO0FBQzlCLFFBQU0sd0JBQXdCO0FBQUEsSUFDNUIsYUFBYSxpQkFBaUI7QUFBQTtBQUFBLElBRTlCLDBCQUEwQjtBQUFBLElBQzFCLG9CQUFvQjtBQUFBO0FBQUEsSUFFcEIsdUJBQXVCO0FBQUEsRUFDekI7QUFDQSxRQUFNLGNBQWMsRUFBRSxHQUFHLHVCQUF1QixHQUFHLGFBQWE7QUFDaEUsY0FBWSxZQUFZLGVBQWU7QUFFdkMsUUFBTTtBQUFBLElBQ0osWUFBWTtBQUFBLElBQ1osT0FBTyxnQkFBNkI7QUFDbEMsWUFBTSxzQkFBc0IsZUFBZSxDQUFDLFlBQVksYUFBYSxXQUFXLENBQUM7QUFDakYsMEJBQW9CLGVBQWU7QUFDbkMsVUFBSSxVQUFVO0FBQ2QsYUFBTyxDQUFDLG9CQUFvQixTQUFTO0FBQ25DO0FBQ0EsWUFBSTtBQUNKLFlBQUk7QUFDRixzQkFBWSxNQUFNLEdBQUcsbUJBQW1CO0FBQUEsUUFDMUMsU0FBUyxPQUFPO0FBRWQsY0FBSSxvQkFBb0IsV0FBVyxDQUFDLFlBQVksc0JBQXNCLHFCQUFxQixJQUFJLEtBQWMsR0FBRztBQUM5RyxrQkFBTSxJQUFJLHNCQUFzQiwyQkFBMkIsWUFBWSxLQUFLO0FBQUEsVUFDOUU7QUFDQSxxQkFBVyxLQUFLO0FBQ2hCLHNCQUFZO0FBQUEsUUFDZDtBQUNBLFlBQUksV0FBVztBQUNiLG1DQUF5QixzQ0FBc0MsT0FBTyxPQUFPLENBQUMsYUFBYTtBQUFBLFlBQ3pGO0FBQUEsVUFDRixDQUFDO0FBQ0QsbUNBQXlCLGdCQUFnQixVQUFVO0FBQ25EO0FBQUEsUUFDRjtBQUVBO0FBQUEsVUFDRSxpQkFBaUIsT0FBTyxPQUFPLENBQUMsOENBQThDLE9BQU8sWUFBWSx3QkFBd0IsQ0FBQztBQUFBLFVBQzFIO0FBQUEsWUFDRTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQ0EsaUNBQXlCLGdCQUFnQixVQUFVO0FBQ25ELGNBQU0sTUFBTSxZQUFZLHdCQUF3QjtBQUFBLE1BQ2xEO0FBQUEsSUFDRjtBQUFBLElBQ0EsRUFBRSxTQUFTLEdBQUc7QUFBQSxJQUNkO0FBQUEsRUFDRjtBQUNGO0FBY0EsZUFBc0IsZUFDcEIsdUJBQ0EsSUFDQSxTQUNBLFlBQ1k7QUFDWixpQkFBZSxjQUFjLENBQUM7QUFDOUIsUUFBTSxZQUFZLFlBQVksSUFBSTtBQUVsQyxRQUFNLGtCQUFrQixJQUFJLGdCQUFnQjtBQUU1QyxRQUFNLFFBQVEsS0FBSyxDQUFDLElBQUksR0FBRyxhQUFhLENBQUMsQ0FBQztBQUMxQyxNQUFJLGdCQUFnQixPQUFPLGtCQUFrQixRQUFRO0FBQ25ELFdBQU8sZ0JBQWdCLE9BQU8sT0FBTztBQUFBLEVBQ3ZDO0FBRUEsUUFBTSxJQUFJLHNCQUFzQiwyQkFBMkIsWUFBWSxnQkFBZ0IsT0FBTyxNQUFpQjtBQUUvRyxpQkFBZSxNQUFxQjtBQUNsQyxRQUFJO0FBQ0YsWUFBTSxTQUFTLE1BQU0sR0FBRyxnQkFBZ0IsTUFBTTtBQUM5QyxZQUFNLFdBQVcsWUFBWSxJQUFJLElBQUk7QUFDckMsWUFBTSx5QkFBeUIsZUFBZSxzQkFBc0I7QUFDcEUsNkJBQXVCLG1CQUFtQixPQUFPLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLEdBQUcsQ0FBQztBQUMxRiw2QkFBdUIsZ0JBQWdCLGNBQWMsRUFBRTtBQUN2RCxzQkFBZ0IsTUFBTSxJQUFJLE9BQU8sTUFBTSxDQUFDO0FBQUEsSUFDMUMsU0FBUyxHQUFHO0FBQ1Ysc0JBQWdCLE1BQU0sQ0FBQztBQUFBLElBQ3pCO0FBQUEsRUFDRjtBQUVBLGlCQUFlLGVBQThCO0FBQzNDLFdBQU8sQ0FBQyxnQkFBZ0IsT0FBTyxTQUFTO0FBQ3RDLFlBQU0sTUFBTSx1QkFBdUIsZ0JBQWdCLE1BQU07QUFFekQsVUFBSSxnQkFBZ0IsT0FBTyxTQUFTO0FBQ2xDO0FBQUEsTUFDRjtBQUNBLFlBQU0sV0FBVyxZQUFZLElBQUksSUFBSTtBQUNyQyxjQUFRLEtBQUssbUJBQW1CLE9BQU8sUUFBUSxDQUFDLGlCQUFpQixFQUFFLFNBQVMsR0FBRyxDQUFDO0FBQ2hGLFlBQU0sa0JBQWtCLGVBQWUsOEJBQThCO0FBQ3JFLFVBQUksQ0FBQyxnQkFBZ0IsU0FBUztBQUM1Qix3QkFBZ0IsTUFBTSxJQUFJLE1BQU0sbUJBQW1CLE9BQU8sUUFBUSxDQUFDLGVBQWUsQ0FBQztBQUNuRjtBQUFBLE1BQ0Y7QUFFQTtBQUFBLFFBQ0Usb0RBQW9ELGdCQUFnQixTQUFTO0FBQUEsTUFDL0U7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBT0EsZUFBc0Isb0JBQW1DO0FBQ3ZELFNBQU8sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM5QixpQkFBYSxNQUFNO0FBQ2pCLGNBQVE7QUFBQSxJQUNWLENBQUM7QUFBQSxFQUNILENBQUM7QUFDSDtBQVFBLGVBQXNCLGdCQUFnQixPQUErQjtBQUNuRSxRQUFNLElBQUksUUFBUSxDQUFDLFlBQVk7QUFDN0IsZUFBVyxTQUFTLEtBQUs7QUFBQSxFQUMzQixDQUFDO0FBQ0g7QUFVQSxlQUFzQixNQUFNLGNBQXNCLGFBQTJCLG9CQUE2QztBQUN4SCxRQUFNLGFBQWEsZUFBZSxDQUFDLGVBQWUsaUJBQWlCLEdBQUcsbUJBQW1CLFlBQVksQ0FBQyxDQUFDLENBQUM7QUFDeEcsTUFBSSxvQkFBb0I7QUFDdEIsaUJBQWEsZUFBZTtBQUFBLEVBQzlCO0FBQ0Y7QUFVQSxlQUFzQixRQUFRLHVCQUErQixhQUEyQixvQkFBOEM7QUFDcEksUUFBTSxNQUFNLHVCQUF1QixhQUFhLGtCQUFrQjtBQUNsRSxRQUFNLElBQUksTUFBTSxnQkFBZ0IsT0FBTyxxQkFBcUIsQ0FBQyxlQUFlO0FBQzlFO0FBU0EsZUFBc0IsUUFBVyxNQUE4QztBQUM3RSxRQUFNLE1BQVcsQ0FBQztBQUNsQixtQkFBaUIsUUFBUSxNQUFNO0FBQzdCLFFBQUksS0FBSyxJQUFJO0FBQUEsRUFDZjtBQUNBLFNBQU87QUFDVDsiLAogICJuYW1lcyI6IFtdCn0K
|
package/dist/lib/esm/Debug.mjs
CHANGED
|
@@ -6,6 +6,7 @@ if you want to view the source, please visit the github repository of this plugi
|
|
|
6
6
|
(function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
|
|
7
7
|
|
|
8
8
|
import debug from "debug";
|
|
9
|
+
import { CustomStackTraceError } from "./Error.mjs";
|
|
9
10
|
import { LIBRARY_NAME } from "./Library.mjs";
|
|
10
11
|
import { getObsidianDevUtilsState } from "./obsidian/App.mjs";
|
|
11
12
|
import {
|
|
@@ -28,18 +29,18 @@ function getDebugController() {
|
|
|
28
29
|
function getDebugger(namespace, framesToSkip = 0) {
|
|
29
30
|
const key = `${namespace}:${String(framesToSkip)}`;
|
|
30
31
|
const debuggersMap = getObsidianDevUtilsState(null, "debuggers", /* @__PURE__ */ new Map()).value;
|
|
31
|
-
let
|
|
32
|
-
if (!
|
|
33
|
-
|
|
34
|
-
|
|
32
|
+
let debuggerEx = debuggersMap.get(key);
|
|
33
|
+
if (!debuggerEx) {
|
|
34
|
+
debuggerEx = getSharedDebugLibInstance()(namespace);
|
|
35
|
+
debuggerEx.log = (message, ...args) => {
|
|
35
36
|
logWithCaller(namespace, framesToSkip, message, ...args);
|
|
36
37
|
};
|
|
37
|
-
|
|
38
|
+
debuggerEx.printStackTrace = (stackTrace, title) => {
|
|
38
39
|
printStackTrace(namespace, stackTrace, title);
|
|
39
40
|
};
|
|
40
|
-
debuggersMap.set(key,
|
|
41
|
+
debuggersMap.set(key, debuggerEx);
|
|
41
42
|
}
|
|
42
|
-
return
|
|
43
|
+
return debuggerEx;
|
|
43
44
|
}
|
|
44
45
|
function getLibDebugger(namespace) {
|
|
45
46
|
const pluginId = getPluginId();
|
|
@@ -109,19 +110,22 @@ function logWithCaller(namespace, framesToSkip, message, ...args) {
|
|
|
109
110
|
}
|
|
110
111
|
}
|
|
111
112
|
function printStackTrace(namespace, stackTrace, title) {
|
|
112
|
-
const
|
|
113
|
-
if (!
|
|
113
|
+
const internalDebugger = getSharedDebugLibInstance()(namespace);
|
|
114
|
+
if (!internalDebugger.enabled) {
|
|
114
115
|
return;
|
|
115
116
|
}
|
|
116
117
|
if (!stackTrace) {
|
|
117
118
|
stackTrace = "(unavailable)";
|
|
118
119
|
}
|
|
119
|
-
if (!
|
|
120
|
+
if (!title) {
|
|
120
121
|
title = "Caller stack trace";
|
|
121
122
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
123
|
+
internalDebugger(title);
|
|
124
|
+
if (!isInObsidian()) {
|
|
125
|
+
console.debug(stackTrace);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
console.debug(new CustomStackTraceError("This is not an actual error. It's just a workaround to make stack trace links clickable", stackTrace, void 0));
|
|
125
129
|
}
|
|
126
130
|
function setNamespaces(namespaces) {
|
|
127
131
|
getSharedDebugLibInstance().enable(toArray(namespaces).join(NAMESPACE_SEPARATOR));
|
|
@@ -136,4 +140,4 @@ export {
|
|
|
136
140
|
getLibDebugger,
|
|
137
141
|
showInitialDebugMessage
|
|
138
142
|
};
|
|
139
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0RlYnVnLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciB9IGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z0NvbnRyb2xsZXIgfSBmcm9tICcuL0RlYnVnQ29udHJvbGxlci50cyc7XG5cbmltcG9ydCB7IExJQlJBUllfTkFNRSB9IGZyb20gJy4vTGlicmFyeS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuL0FwcC50cyc7XG5pbXBvcnQge1xuICBnZXRQbHVnaW5JZCxcbiAgTk9fUExVR0lOX0lEX0lOSVRJQUxJWkVEXG59IGZyb20gJy4vb2JzaWRpYW4vUGx1Z2luL1BsdWdpbklkLnRzJztcblxuaW50ZXJmYWNlIERlYnVnZ2VyRXggZXh0ZW5kcyBEZWJ1Z2dlciB7XG4gIHByaW50U3RhY2tUcmFjZShzdGFja1RyYWNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdm9pZDtcbn1cblxuY29uc3QgTkFNRVNQQUNFX1NFUEFSQVRPUiA9ICcsJztcbmNvbnN0IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCA9ICctJztcblxuLyoqXG4gKiBFbmFibGVzIHRoZSBkZWJ1Z2dlcnMgZm9yIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlTGlicmFyeURlYnVnZ2VycygpOiB2b2lkIHtcbiAgZW5hYmxlTmFtZXNwYWNlcyhbTElCUkFSWV9OQU1FLCBgJHtMSUJSQVJZX05BTUV9OipgXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlYnVnIGNvbnRyb2xsZXIuXG4gKlxuICogQHJldHVybnMgQSBkZWJ1ZyBjb250cm9sbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdDb250cm9sbGVyKCk6IERlYnVnQ29udHJvbGxlciB7XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZTogZGlzYWJsZU5hbWVzcGFjZXMsXG4gICAgZW5hYmxlOiBlbmFibGVOYW1lc3BhY2VzLFxuICAgIGdldDogZ2V0TmFtZXNwYWNlcyxcbiAgICBzZXQ6IHNldE5hbWVzcGFjZXNcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVidWdnZXIgaW5zdGFuY2Ugd2l0aCBhIGxvZyBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBjYWxsZXIncyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgZGVidWdnZXIgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZnJhbWVzVG9Ta2lwIC0gVGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gKiBAcmV0dXJucyBBIGRlYnVnZ2VyIGluc3RhbmNlIHdpdGggYSBsb2cgZnVuY3Rpb24gdGhhdCBpbmNsdWRlcyB0aGUgY2FsbGVyJ3MgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlYnVnZ2VyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXAgPSAwKTogRGVidWdnZXJFeCB7XG4gIGNvbnN0IGtleSA9IGAke25hbWVzcGFjZX06JHtTdHJpbmcoZnJhbWVzVG9Ta2lwKX1gO1xuICBjb25zdCBkZWJ1Z2dlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUobnVsbCwgJ2RlYnVnZ2VycycsIG5ldyBNYXA8c3RyaW5nLCBEZWJ1Z2dlckV4PigpKS52YWx1ZTtcbiAgbGV0IF9kZWJ1Z2dlciA9IGRlYnVnZ2Vyc01hcC5nZXQoa2V5KTtcbiAgaWYgKCFfZGVidWdnZXIpIHtcbiAgICBfZGVidWdnZXIgPSBnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkobmFtZXNwYWNlKSBhcyBEZWJ1Z2dlckV4O1xuICAgIF9kZWJ1Z2dlci5sb2cgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICAgIGxvZ1dpdGhDYWxsZXIobmFtZXNwYWNlLCBmcmFtZXNUb1NraXAsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgX2RlYnVnZ2VyLnByaW50U3RhY2tUcmFjZSA9IChzdGFja1RyYWNlLCB0aXRsZSk6IHZvaWQgPT4ge1xuICAgICAgcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZSwgc3RhY2tUcmFjZSwgdGl0bGUpO1xuICAgIH07XG5cbiAgICBkZWJ1Z2dlcnNNYXAuc2V0KGtleSwgX2RlYnVnZ2VyKTtcbiAgfVxuXG4gIHJldHVybiBfZGVidWdnZXI7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlYnVnZ2VyIGluc3RhbmNlIGZvciB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGRlYnVnZ2VyIGluc3RhbmNlLlxuICogQHJldHVybnMgQSBkZWJ1Z2dlciBpbnN0YW5jZSBmb3IgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaWJEZWJ1Z2dlcihuYW1lc3BhY2U6IHN0cmluZyk6IERlYnVnZ2VyRXgge1xuICBjb25zdCBwbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIGNvbnN0IHByZWZpeCA9IHBsdWdpbklkID09PSBOT19QTFVHSU5fSURfSU5JVElBTElaRUQgPyAnJyA6IGAke3BsdWdpbklkfTpgO1xuICByZXR1cm4gZ2V0RGVidWdnZXIoYCR7cHJlZml4fSR7TElCUkFSWV9OQU1FfToke25hbWVzcGFjZX1gKTtcbn1cblxuLyoqXG4gKiBTaG93cyBhbiBpbml0aWFsIGRlYnVnIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgaXNFbmFibGVkID0gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZWQocGx1Z2luSWQpO1xuICBjb25zdCBzdGF0ZSA9IGlzRW5hYmxlZCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCc7XG4gIGNvbnN0IGNoYW5nZUFjdGlvbiA9IGlzRW5hYmxlZCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICBjb25zdCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpO1xuICBzZXROYW1lc3BhY2VzKHBsdWdpbklkKTtcbiAgZ2V0RGVidWdnZXIocGx1Z2luSWQpKFxuICAgIGBEZWJ1ZyBtZXNzYWdlcyBmb3IgcGx1Z2luICR7cGx1Z2luSWR9IGFyZSAke3N0YXRlfS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGhvdyB0byAke2NoYW5nZUFjdGlvbn0gdGhlbS5gXG4gICk7XG4gIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aChORUdBVEVEX05BTUVTUEFDRV9QUkVGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICBpZiAoc2V0LmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICBzZXQuZGVsZXRlKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIHNldC5hZGQobmVnYXRlZE5hbWVzcGFjZSk7XG4gIH1cbiAgc2V0TmFtZXNwYWNlcyhBcnJheS5mcm9tKHNldCkpO1xufVxuXG5mdW5jdGlvbiBlbmFibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmICghbmFtZXNwYWNlLnN0YXJ0c1dpdGgoTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYKSkge1xuICAgICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICAgIGlmIChzZXQuaGFzKG5lZ2F0ZWROYW1lc3BhY2UpKSB7XG4gICAgICAgIHNldC5kZWxldGUobmVnYXRlZE5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldC5hZGQobmFtZXNwYWNlKTtcbiAgfVxuICBzZXROYW1lc3BhY2VzKEFycmF5LmZyb20oc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gdG9BcnJheShnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkubG9hZCgpID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpOiB0eXBlb2YgZGVidWcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShudWxsLCAnZGVidWcnLCBkZWJ1ZykudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzSW5PYnNpZGlhbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBsb2dXaXRoQ2FsbGVyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXA6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgaWYgKCFnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkuZW5hYmxlZChuYW1lc3BhY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgbGluZSBpbmRleCBpcyA0IGJlY2F1c2UgdGhlIGNhbGwgc3RhY2sgaXMgYXMgZm9sbG93czpcbiAgICpcbiAgICogMDogRXJyb3JcbiAgICogMTogICAgIGF0IGxvZ1dpdGhDYWxsZXIgKD86Pzo/KVxuICAgKiAyOiAgICAgYXQgZGVidWdJbnN0YW5jZS5sb2cgKD86Pzo/KVxuICAgKiAzOiAgICAgYXQgZGVidWcgKD86Pzo/KVxuICAgKiA0OiAgICAgYXQgZnVuY3Rpb25OYW1lIChwYXRoL3RvL2NhbGxlci5qczo/Oj8pXG4gICAqL1xuICBjb25zdCBDQUxMRVJfTElORV9JTkRFWCA9IDQ7XG5cbiAgY29uc3Qgc3RhY2tMaW5lcyA9IG5ldyBFcnJvcigpLnN0YWNrPy5zcGxpdCgnXFxuJykgPz8gW107XG4gIGNvbnN0IGNhbGxlckxpbmUgPSBzdGFja0xpbmVzW0NBTExFUl9MSU5FX0lOREVYICsgZnJhbWVzVG9Ta2lwXSA/PyAnJztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgaWYgKGlzSW5PYnNpZGlhbigpKSB7XG4gICAgcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZSwgY2FsbGVyTGluZSwgJ0RlYnVnIG1lc3NhZ2UgY2FsbGVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZTogc3RyaW5nLCBzdGFja1RyYWNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IF9kZWJ1Z2dlciA9IGdldFNoYXJlZERlYnVnTGliSW5zdGFuY2UoKShuYW1lc3BhY2UpO1xuXG4gIGlmICghX2RlYnVnZ2VyLmVuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YWNrVHJhY2UpIHtcbiAgICBzdGFja1RyYWNlID0gJyh1bmF2YWlsYWJsZSknO1xuICB9XG4gIGlmICghKHRpdGxlID8/ICcnKSkge1xuICAgIHRpdGxlID0gJ0NhbGxlciBzdGFjayB0cmFjZSc7XG4gIH1cblxuICBfZGVidWdnZXIodGl0bGUpO1xuICBjb25zdCBwcmVmaXggPSBpc0luT2JzaWRpYW4oKSA/ICdTdGFja1RyYWNlRmFrZUVycm9yXFxuJyA6ICcnO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmRlYnVnKGAke3ByZWZpeH0ke3N0YWNrVHJhY2V9YCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZXMgLSBUaGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKi9cbmZ1bmN0aW9uIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZSh0b0FycmF5KG5hbWVzcGFjZXMpLmpvaW4oTkFNRVNQQUNFX1NFUEFSQVRPUikpO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcy5zcGxpdChOQU1FU1BBQ0VfU0VQQVJBVE9SKS5maWx0ZXIoQm9vbGVhbikgOiBuYW1lc3BhY2VzLmZsYXRNYXAodG9BcnJheSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBUUEsT0FBTyxXQUFXO0FBSWxCLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSwyQkFBMkI7QUFLMUIsU0FBUyx5QkFBK0I7QUFDN0MsbUJBQWlCLENBQUMsY0FBYyxHQUFHLFlBQVksSUFBSSxDQUFDO0FBQ3REO0FBT08sU0FBUyxxQkFBc0M7QUFDcEQsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQ1A7QUFDRjtBQVNPLFNBQVMsWUFBWSxXQUFtQixlQUFlLEdBQWU7QUFDM0UsUUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQ2hELFFBQU0sZUFBZSx5QkFBeUIsTUFBTSxhQUFhLG9CQUFJLElBQXdCLENBQUMsRUFBRTtBQUNoRyxNQUFJLFlBQVksYUFBYSxJQUFJLEdBQUc7QUFDcEMsTUFBSSxDQUFDLFdBQVc7QUFDZCxnQkFBWSwwQkFBMEIsRUFBRSxTQUFTO0FBQ2pELGNBQVUsTUFBTSxDQUFDLFlBQW9CLFNBQTBCO0FBQzdELG9CQUFjLFdBQVcsY0FBYyxTQUFTLEdBQUcsSUFBSTtBQUFBLElBQ3pEO0FBQ0EsY0FBVSxrQkFBa0IsQ0FBQyxZQUFZLFVBQWdCO0FBQ3ZELHNCQUFnQixXQUFXLFlBQVksS0FBSztBQUFBLElBQzlDO0FBRUEsaUJBQWEsSUFBSSxLQUFLLFNBQVM7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsZUFBZSxXQUErQjtBQUM1RCxRQUFNLFdBQVcsWUFBWTtBQUM3QixRQUFNLFNBQVMsYUFBYSwyQkFBMkIsS0FBSyxHQUFHLFFBQVE7QUFD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
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0RlYnVnLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciB9IGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z0NvbnRyb2xsZXIgfSBmcm9tICcuL0RlYnVnQ29udHJvbGxlci50cyc7XG5cbmltcG9ydCB7IEN1c3RvbVN0YWNrVHJhY2VFcnJvciB9IGZyb20gJy4vRXJyb3IudHMnO1xuaW1wb3J0IHsgTElCUkFSWV9OQU1FIH0gZnJvbSAnLi9MaWJyYXJ5LnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4vb2JzaWRpYW4vQXBwLnRzJztcbmltcG9ydCB7XG4gIGdldFBsdWdpbklkLFxuICBOT19QTFVHSU5fSURfSU5JVElBTElaRURcbn0gZnJvbSAnLi9vYnNpZGlhbi9QbHVnaW4vUGx1Z2luSWQudHMnO1xuXG5pbnRlcmZhY2UgRGVidWdnZXJFeCBleHRlbmRzIERlYnVnZ2VyIHtcbiAgcHJpbnRTdGFja1RyYWNlKHN0YWNrVHJhY2U6IHN0cmluZywgdGl0bGU/OiBzdHJpbmcpOiB2b2lkO1xufVxuXG5jb25zdCBOQU1FU1BBQ0VfU0VQQVJBVE9SID0gJywnO1xuY29uc3QgTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYID0gJy0nO1xuXG4vKipcbiAqIEVuYWJsZXMgdGhlIGRlYnVnZ2VycyBmb3IgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVMaWJyYXJ5RGVidWdnZXJzKCk6IHZvaWQge1xuICBlbmFibGVOYW1lc3BhY2VzKFtMSUJSQVJZX05BTUUsIGAke0xJQlJBUllfTkFNRX06KmBdKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVidWcgY29udHJvbGxlci5cbiAqXG4gKiBAcmV0dXJucyBBIGRlYnVnIGNvbnRyb2xsZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZWJ1Z0NvbnRyb2xsZXIoKTogRGVidWdDb250cm9sbGVyIHtcbiAgcmV0dXJuIHtcbiAgICBkaXNhYmxlOiBkaXNhYmxlTmFtZXNwYWNlcyxcbiAgICBlbmFibGU6IGVuYWJsZU5hbWVzcGFjZXMsXG4gICAgZ2V0OiBnZXROYW1lc3BhY2VzLFxuICAgIHNldDogc2V0TmFtZXNwYWNlc1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBkZWJ1Z2dlciBpbnN0YW5jZSB3aXRoIGEgbG9nIGZ1bmN0aW9uIHRoYXQgaW5jbHVkZXMgdGhlIGNhbGxlcidzIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZSAtIFRoZSBuYW1lc3BhY2UgZm9yIHRoZSBkZWJ1Z2dlciBpbnN0YW5jZS5cbiAqIEBwYXJhbSBmcmFtZXNUb1NraXAgLSBUaGUgbnVtYmVyIG9mIGZyYW1lcyB0byBza2lwIGluIHRoZSBzdGFjayB0cmFjZS5cbiAqIEByZXR1cm5zIEEgZGVidWdnZXIgaW5zdGFuY2Ugd2l0aCBhIGxvZyBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBjYWxsZXIncyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdnZXIobmFtZXNwYWNlOiBzdHJpbmcsIGZyYW1lc1RvU2tpcCA9IDApOiBEZWJ1Z2dlckV4IHtcbiAgY29uc3Qga2V5ID0gYCR7bmFtZXNwYWNlfToke1N0cmluZyhmcmFtZXNUb1NraXApfWA7XG4gIGNvbnN0IGRlYnVnZ2Vyc01hcCA9IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShudWxsLCAnZGVidWdnZXJzJywgbmV3IE1hcDxzdHJpbmcsIERlYnVnZ2VyRXg+KCkpLnZhbHVlO1xuICBsZXQgZGVidWdnZXJFeCA9IGRlYnVnZ2Vyc01hcC5nZXQoa2V5KTtcbiAgaWYgKCFkZWJ1Z2dlckV4KSB7XG4gICAgZGVidWdnZXJFeCA9IGdldFNoYXJlZERlYnVnTGliSW5zdGFuY2UoKShuYW1lc3BhY2UpIGFzIERlYnVnZ2VyRXg7XG4gICAgZGVidWdnZXJFeC5sb2cgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICAgIGxvZ1dpdGhDYWxsZXIobmFtZXNwYWNlLCBmcmFtZXNUb1NraXAsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgZGVidWdnZXJFeC5wcmludFN0YWNrVHJhY2UgPSAoc3RhY2tUcmFjZSwgdGl0bGUpOiB2b2lkID0+IHtcbiAgICAgIHByaW50U3RhY2tUcmFjZShuYW1lc3BhY2UsIHN0YWNrVHJhY2UsIHRpdGxlKTtcbiAgICB9O1xuXG4gICAgZGVidWdnZXJzTWFwLnNldChrZXksIGRlYnVnZ2VyRXgpO1xuICB9XG5cbiAgcmV0dXJuIGRlYnVnZ2VyRXg7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlYnVnZ2VyIGluc3RhbmNlIGZvciB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGRlYnVnZ2VyIGluc3RhbmNlLlxuICogQHJldHVybnMgQSBkZWJ1Z2dlciBpbnN0YW5jZSBmb3IgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaWJEZWJ1Z2dlcihuYW1lc3BhY2U6IHN0cmluZyk6IERlYnVnZ2VyRXgge1xuICBjb25zdCBwbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIGNvbnN0IHByZWZpeCA9IHBsdWdpbklkID09PSBOT19QTFVHSU5fSURfSU5JVElBTElaRUQgPyAnJyA6IGAke3BsdWdpbklkfTpgO1xuICByZXR1cm4gZ2V0RGVidWdnZXIoYCR7cHJlZml4fSR7TElCUkFSWV9OQU1FfToke25hbWVzcGFjZX1gKTtcbn1cblxuLyoqXG4gKiBTaG93cyBhbiBpbml0aWFsIGRlYnVnIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgaXNFbmFibGVkID0gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZWQocGx1Z2luSWQpO1xuICBjb25zdCBzdGF0ZSA9IGlzRW5hYmxlZCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCc7XG4gIGNvbnN0IGNoYW5nZUFjdGlvbiA9IGlzRW5hYmxlZCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICBjb25zdCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpO1xuICBzZXROYW1lc3BhY2VzKHBsdWdpbklkKTtcbiAgZ2V0RGVidWdnZXIocGx1Z2luSWQpKFxuICAgIGBEZWJ1ZyBtZXNzYWdlcyBmb3IgcGx1Z2luICR7cGx1Z2luSWR9IGFyZSAke3N0YXRlfS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGhvdyB0byAke2NoYW5nZUFjdGlvbn0gdGhlbS5gXG4gICk7XG4gIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aChORUdBVEVEX05BTUVTUEFDRV9QUkVGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICBpZiAoc2V0LmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICBzZXQuZGVsZXRlKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIHNldC5hZGQobmVnYXRlZE5hbWVzcGFjZSk7XG4gIH1cbiAgc2V0TmFtZXNwYWNlcyhBcnJheS5mcm9tKHNldCkpO1xufVxuXG5mdW5jdGlvbiBlbmFibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmICghbmFtZXNwYWNlLnN0YXJ0c1dpdGgoTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYKSkge1xuICAgICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICAgIGlmIChzZXQuaGFzKG5lZ2F0ZWROYW1lc3BhY2UpKSB7XG4gICAgICAgIHNldC5kZWxldGUobmVnYXRlZE5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldC5hZGQobmFtZXNwYWNlKTtcbiAgfVxuICBzZXROYW1lc3BhY2VzKEFycmF5LmZyb20oc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gdG9BcnJheShnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkubG9hZCgpID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpOiB0eXBlb2YgZGVidWcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShudWxsLCAnZGVidWcnLCBkZWJ1ZykudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzSW5PYnNpZGlhbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBsb2dXaXRoQ2FsbGVyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXA6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgaWYgKCFnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkuZW5hYmxlZChuYW1lc3BhY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgbGluZSBpbmRleCBpcyA0IGJlY2F1c2UgdGhlIGNhbGwgc3RhY2sgaXMgYXMgZm9sbG93czpcbiAgICpcbiAgICogMDogRXJyb3JcbiAgICogMTogICAgIGF0IGxvZ1dpdGhDYWxsZXIgKD86Pzo/KVxuICAgKiAyOiAgICAgYXQgZGVidWdJbnN0YW5jZS5sb2cgKD86Pzo/KVxuICAgKiAzOiAgICAgYXQgZGVidWcgKD86Pzo/KVxuICAgKiA0OiAgICAgYXQgZnVuY3Rpb25OYW1lIChwYXRoL3RvL2NhbGxlci5qczo/Oj8pXG4gICAqL1xuICBjb25zdCBDQUxMRVJfTElORV9JTkRFWCA9IDQ7XG5cbiAgY29uc3Qgc3RhY2tMaW5lcyA9IG5ldyBFcnJvcigpLnN0YWNrPy5zcGxpdCgnXFxuJykgPz8gW107XG4gIGNvbnN0IGNhbGxlckxpbmUgPSBzdGFja0xpbmVzW0NBTExFUl9MSU5FX0lOREVYICsgZnJhbWVzVG9Ta2lwXSA/PyAnJztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgaWYgKGlzSW5PYnNpZGlhbigpKSB7XG4gICAgcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZSwgY2FsbGVyTGluZSwgJ0RlYnVnIG1lc3NhZ2UgY2FsbGVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZTogc3RyaW5nLCBzdGFja1RyYWNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGludGVybmFsRGVidWdnZXIgPSBnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkobmFtZXNwYWNlKTtcblxuICBpZiAoIWludGVybmFsRGVidWdnZXIuZW5hYmxlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc3RhY2tUcmFjZSkge1xuICAgIHN0YWNrVHJhY2UgPSAnKHVuYXZhaWxhYmxlKSc7XG4gIH1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9wcmVmZXItbnVsbGlzaC1jb2FsZXNjaW5nXG4gIGlmICghdGl0bGUpIHtcbiAgICB0aXRsZSA9ICdDYWxsZXIgc3RhY2sgdHJhY2UnO1xuICB9XG5cbiAgaW50ZXJuYWxEZWJ1Z2dlcih0aXRsZSk7XG5cbiAgaWYgKCFpc0luT2JzaWRpYW4oKSkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5kZWJ1ZyhzdGFja1RyYWNlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmRlYnVnKG5ldyBDdXN0b21TdGFja1RyYWNlRXJyb3IoJ1RoaXMgaXMgbm90IGFuIGFjdHVhbCBlcnJvci4gSXRcXCdzIGp1c3QgYSB3b3JrYXJvdW5kIHRvIG1ha2Ugc3RhY2sgdHJhY2UgbGlua3MgY2xpY2thYmxlJywgc3RhY2tUcmFjZSwgdW5kZWZpbmVkKSk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZXMgLSBUaGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKi9cbmZ1bmN0aW9uIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZSh0b0FycmF5KG5hbWVzcGFjZXMpLmpvaW4oTkFNRVNQQUNFX1NFUEFSQVRPUikpO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcy5zcGxpdChOQU1FU1BBQ0VfU0VQQVJBVE9SKS5maWx0ZXIoQm9vbGVhbikgOiBuYW1lc3BhY2VzLmZsYXRNYXAodG9BcnJheSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBUUEsT0FBTyxXQUFXO0FBSWxCLFNBQVMsNkJBQTZCO0FBQ3RDLFNBQVMsb0JBQW9CO0FBQzdCLFNBQVMsZ0NBQWdDO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVAsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSwyQkFBMkI7QUFLMUIsU0FBUyx5QkFBK0I7QUFDN0MsbUJBQWlCLENBQUMsY0FBYyxHQUFHLFlBQVksSUFBSSxDQUFDO0FBQ3REO0FBT08sU0FBUyxxQkFBc0M7QUFDcEQsU0FBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsUUFBUTtBQUFBLElBQ1IsS0FBSztBQUFBLElBQ0wsS0FBSztBQUFBLEVBQ1A7QUFDRjtBQVNPLFNBQVMsWUFBWSxXQUFtQixlQUFlLEdBQWU7QUFDM0UsUUFBTSxNQUFNLEdBQUcsU0FBUyxJQUFJLE9BQU8sWUFBWSxDQUFDO0FBQ2hELFFBQU0sZUFBZSx5QkFBeUIsTUFBTSxhQUFhLG9CQUFJLElBQXdCLENBQUMsRUFBRTtBQUNoRyxNQUFJLGFBQWEsYUFBYSxJQUFJLEdBQUc7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
|