@mnaoumov/obsidian-lib 10.5.0 → 10.5.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/README.md +6 -0
- package/dist/lib/cjs/__merged.cjs +9 -1
- package/dist/lib/cjs/__merged.d.cts +3 -3
- package/dist/lib/cjs/backlink-index.cjs +44 -8
- package/dist/lib/cjs/backlink-index.d.cts +23 -0
- package/dist/lib/cjs/bulk-operation-progress.cjs +16 -1
- package/dist/lib/cjs/bulk-operation-progress.d.cts +22 -0
- package/dist/lib/cjs/case-insensitive-file-index.cjs +9 -1
- package/dist/lib/cjs/community-plugins.cjs +19 -2
- package/dist/lib/cjs/community-plugins.d.cts +14 -0
- package/dist/lib/cjs/components/bulk-operation-commit-component.cjs +5 -2
- package/dist/lib/cjs/components/rename-delete-handler-component.cjs +105 -2
- package/dist/lib/cjs/desktop-bulk-operation-git.cjs +38 -13
- package/dist/lib/cjs/desktop-bulk-operation-git.d.cts +21 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/i18n/locales/en.cjs +2 -1
- package/dist/lib/cjs/i18n/locales/en.d.cts +1 -0
- package/dist/lib/cjs/i18n/locales/translations-map.d.cts +1 -0
- package/dist/lib/cjs/modals/modal.cjs +8 -5
- package/dist/lib/cjs/modals/modal.d.cts +4 -0
- package/dist/lib/cjs/plugin/plugin.cjs +5 -2
- package/dist/lib/cjs/plugin/plugin.d.cts +2 -0
- package/dist/lib/esm/__merged.d.mts +3 -3
- package/dist/lib/esm/__merged.mjs +12 -2
- package/dist/lib/esm/backlink-index.d.mts +23 -0
- package/dist/lib/esm/backlink-index.mjs +42 -7
- package/dist/lib/esm/bulk-operation-progress.d.mts +22 -0
- package/dist/lib/esm/bulk-operation-progress.mjs +14 -1
- package/dist/lib/esm/case-insensitive-file-index.mjs +9 -1
- package/dist/lib/esm/community-plugins.d.mts +14 -0
- package/dist/lib/esm/community-plugins.mjs +18 -2
- package/dist/lib/esm/components/bulk-operation-commit-component.mjs +5 -2
- package/dist/lib/esm/components/rename-delete-handler-component.mjs +105 -2
- package/dist/lib/esm/desktop-bulk-operation-git.d.mts +21 -1
- package/dist/lib/esm/desktop-bulk-operation-git.mjs +38 -13
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/i18n/locales/en.d.mts +1 -0
- package/dist/lib/esm/i18n/locales/en.mjs +2 -1
- package/dist/lib/esm/i18n/locales/translations-map.d.mts +1 -0
- package/dist/lib/esm/modals/modal.d.mts +4 -0
- package/dist/lib/esm/modals/modal.mjs +8 -5
- package/dist/lib/esm/plugin/plugin.d.mts +2 -0
- package/dist/lib/esm/plugin/plugin.mjs +5 -2
- package/package.json +3 -3
|
@@ -258,30 +258,36 @@ class BulkOperationGitRepo {
|
|
|
258
258
|
* follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
|
|
259
259
|
* still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
|
|
260
260
|
*
|
|
261
|
+
* When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
|
|
262
|
+
* a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
|
|
263
|
+
* lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
|
|
264
|
+
*
|
|
261
265
|
* @typeParam T - The type of the operation's result.
|
|
262
266
|
* @param params - The parameters.
|
|
263
|
-
* @returns The operation's result, its id
|
|
267
|
+
* @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
|
|
264
268
|
*/
|
|
265
269
|
async runBulkOperation(params) {
|
|
266
270
|
await this.assertCanCommitLargeFiles();
|
|
267
271
|
await this.acquireLock();
|
|
268
272
|
let unregisterProgressListener = null;
|
|
269
273
|
try {
|
|
270
|
-
const
|
|
271
|
-
await this.commitPending({ body: "", subject: (0, import_bulk_operation.buildBeforeOperationCommitSubject)(
|
|
274
|
+
const startOperationId = await this.allocateOperationId(params.pluginId);
|
|
275
|
+
await this.commitPending({ body: "", subject: (0, import_bulk_operation.buildBeforeOperationCommitSubject)(startOperationId) });
|
|
272
276
|
unregisterProgressListener = (0, import_bulk_operation_progress.registerBulkOperationProgressListener)(this.createThrottledHeartbeat());
|
|
273
277
|
let result;
|
|
274
278
|
try {
|
|
275
279
|
result = await params.operation();
|
|
276
280
|
await params.settle();
|
|
277
281
|
} catch (error) {
|
|
278
|
-
await this.
|
|
279
|
-
await this.commitOperation({ isInterrupted: true, operationId, pluginId: params.pluginId });
|
|
282
|
+
const operationId2 = await this.reclaimLockIfRecovered(startOperationId, params.pluginId) ?? startOperationId;
|
|
283
|
+
await this.commitOperation({ isInterrupted: true, operationId: operationId2, pluginId: params.pluginId });
|
|
280
284
|
throw error;
|
|
281
285
|
}
|
|
282
|
-
await this.
|
|
283
|
-
const
|
|
284
|
-
|
|
286
|
+
const resumedOperationId = await this.reclaimLockIfRecovered(startOperationId, params.pluginId);
|
|
287
|
+
const operationId = resumedOperationId ?? startOperationId;
|
|
288
|
+
const summary = resumedOperationId === null ? params.summary : `${params.summary} (resumed after ${startOperationId} was recovered)`;
|
|
289
|
+
const commitSha = await this.commitOperation({ operationId, pluginId: params.pluginId, summary });
|
|
290
|
+
return { commitSha, operationId, recoveredOperationId: resumedOperationId === null ? null : startOperationId, result };
|
|
285
291
|
} finally {
|
|
286
292
|
unregisterProgressListener?.();
|
|
287
293
|
await this.releaseLock();
|
|
@@ -309,8 +315,8 @@ class BulkOperationGitRepo {
|
|
|
309
315
|
await (0, import_async.setTimeoutAsync)(LOCK_POLL_INTERVAL_IN_MILLISECONDS);
|
|
310
316
|
}
|
|
311
317
|
}
|
|
312
|
-
async allocateOperationId(pluginId) {
|
|
313
|
-
const operationId = await this.findNextOperationId();
|
|
318
|
+
async allocateOperationId(pluginId, usedOperationId) {
|
|
319
|
+
const operationId = await this.findNextOperationId(usedOperationId);
|
|
314
320
|
const ownLock = (0, import_type_guards.ensureNonNullable)(this.ownLock);
|
|
315
321
|
this.ownLock = { ...ownLock, heartbeatAt: Date.now(), operationId, pluginId };
|
|
316
322
|
await this.writeLock(this.ownLock);
|
|
@@ -354,11 +360,11 @@ class BulkOperationGitRepo {
|
|
|
354
360
|
});
|
|
355
361
|
};
|
|
356
362
|
}
|
|
357
|
-
async findNextOperationId() {
|
|
363
|
+
async findNextOperationId(usedOperationId) {
|
|
358
364
|
const result = await this.runGit({
|
|
359
365
|
gitArguments: ["log", "--all", "--format=%s", "--extended-regexp", "--grep=^(chore: before )?OP[0-9]+"]
|
|
360
366
|
});
|
|
361
|
-
return (0, import_bulk_operation.getNextOperationId)(result.stdout.split(/\r?\n/));
|
|
367
|
+
return (0, import_bulk_operation.getNextOperationId)([...result.stdout.split(/\r?\n/), usedOperationId ?? ""]);
|
|
362
368
|
}
|
|
363
369
|
async heartbeat() {
|
|
364
370
|
const lock = await this.readLock();
|
|
@@ -406,6 +412,25 @@ class BulkOperationGitRepo {
|
|
|
406
412
|
startedAt: 0
|
|
407
413
|
};
|
|
408
414
|
}
|
|
415
|
+
/**
|
|
416
|
+
* Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
|
|
417
|
+
* operation.
|
|
418
|
+
*
|
|
419
|
+
* @param operationId - The id the operation started under.
|
|
420
|
+
* @param pluginId - The id of the plugin running the operation.
|
|
421
|
+
* @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
|
|
422
|
+
*/
|
|
423
|
+
async reclaimLockIfRecovered(operationId, pluginId) {
|
|
424
|
+
const lock = await this.readLock();
|
|
425
|
+
if (lock !== null && this.isOwnLock(lock)) {
|
|
426
|
+
await this.writeLock({ ...lock, heartbeatAt: Date.now() });
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
console.warn(`The bulk operation lock of ${operationId} was recovered while it ran; committing the rest under a fresh operation id.`);
|
|
430
|
+
this.ownLock = null;
|
|
431
|
+
await this.acquireLock();
|
|
432
|
+
return await this.allocateOperationId(pluginId, operationId);
|
|
433
|
+
}
|
|
409
434
|
async recover(lock) {
|
|
410
435
|
const operationId = lock.operationId || await this.findNextOperationId();
|
|
411
436
|
await this.commitOperation({ isInterrupted: true, operationId, pluginId: lock.pluginId || "unknown" });
|
|
@@ -531,4 +556,4 @@ function isProcessAlive(processId) {
|
|
|
531
556
|
BulkOperationGitRepo,
|
|
532
557
|
GitCommandError
|
|
533
558
|
});
|
|
534
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSByZXN1bHQ6IFQ7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2l0UmV2ZXJ0UmVzdWx0IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHJldmVydCBzdG9wcGVkIG9uIGEgY29uZmxpY3QsIGxlYXZpbmcgdGhlIHJlcG8gbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ29uZmxpY3Q6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zIHtcbiAgcmVhZG9ubHkgYWxsb3dlZEV4aXRDb2Rlcz86IHJlYWRvbmx5IG51bWJlcltdO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5pbnRlcmZhY2UgR2l0Q29tbWFuZFJlc3VsdCB7XG4gIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXI7XG4gIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nO1xuICByZWFkb25seSBzdGRvdXQ6IHN0cmluZztcbn1cblxuY29uc3QgREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA2MDBfMDAwO1xuY29uc3QgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0NPVU5UID0gMjA7XG5jb25zdCBJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IExPQ0tfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuY29uc3QgTUFYX0JVRkZFUl9JTl9CWVRFUyA9IDI2OF80MzVfNDU2O1xuY29uc3QgTUlMTElTRUNPTkRTX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBHSVRfRkFUQUxfRVhJVF9DT0RFID0gMTI4O1xuY29uc3QgUkVWX1BBUlNFX09VVFBVVF9MSU5FX0NPVU5UID0gMjtcbmNvbnN0IFVOSVRfU0VQQVJBVE9SID0gJ1xcdXsxRn0nO1xuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMge1xuICByZWFkb25seSBpc0ludGVycnVwdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3VtbWFyeT86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIENvbW1pdE1lc3NhZ2Uge1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN1YmplY3Q6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIEV4ZWNHaXRQYXJhbXMge1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcbiAgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGdpdCByZXBvIGhvbGRpbmcgYSB2YXVsdCwgZHJpdmVuIHRvIHdyYXAgYnVsayBvcGVyYXRpb25zIGluIGNvbW1pdHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdWxrT3BlcmF0aW9uR2l0UmVwbyB7XG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVwbydzIGdpdCBkaXJlY3RvcnkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ2l0RGlyZWN0b3J5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tGaWxlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG4gIHByaXZhdGUgb3duTG9jazogQnVsa09wZXJhdGlvbkxvY2sgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4gVXNlIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5vcGVufSB0byBmaW5kIHRoZSByZXBvIG9mIGEgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5naXREaXJlY3RvcnkgPSBwYXJhbXMuZ2l0RGlyZWN0b3J5O1xuICAgIHRoaXMud29ya2luZ0RpcmVjdG9yeSA9IHBhcmFtcy53b3JraW5nRGlyZWN0b3J5O1xuICAgIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSBwYXJhbXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9MT0NLX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG4gICAgdGhpcy5sb2NrRmlsZVBhdGggPSBqb2luKHRoaXMuZ2l0RGlyZWN0b3J5LCBCVUxLX09QRVJBVElPTl9MT0NLX0ZJTEVfTkFNRSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGdpdCByZXBvIGEgZm9sZGVyIGJlbG9uZ3MgdG8uXG4gICAqXG4gICAqIEBwYXJhbSB3b3JraW5nRGlyZWN0b3J5IC0gVGhlIGZvbGRlciwgbm9ybWFsbHkgdGhlIHZhdWx0IHJvb3QuXG4gICAqIEByZXR1cm5zIFRoZSByZXBvLCBvciBgbnVsbGAgd2hlbiB0aGUgZm9sZGVyIGlzIG5vdCBpbnNpZGUgYSBnaXQgd29yayB0cmVlIG9yIGBnaXRgIGNhbm5vdCBiZSBydW4uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG9wZW4od29ya2luZ0RpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uR2l0UmVwbyB8IG51bGw+IHtcbiAgICBsZXQgcmVzdWx0OiBHaXRDb21tYW5kUmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB3b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IFsncmV2LXBhcnNlJywgJy0taXMtaW5zaWRlLXdvcmstdHJlZScsICctLWFic29sdXRlLWdpdC1kaXInXSB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBbaXNJbnNpZGVXb3JrVHJlZSwgZ2l0RGlyZWN0b3J5XSA9IHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vLCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQpO1xuICAgIHJldHVybiByZXN1bHQuZXhpdENvZGUgIT09IDAgfHwgaXNJbnNpZGVXb3JrVHJlZSAhPT0gJ3RydWUnIHx8ICFnaXREaXJlY3RvcnkgPyBudWxsIDogbmV3IEJ1bGtPcGVyYXRpb25HaXRSZXBvKHsgZ2l0RGlyZWN0b3J5LCB3b3JraW5nRGlyZWN0b3J5IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnVzZXMgdG8gZ28gb24gd2hlbiB0aGUgcmVwbyByb3V0ZXMgZmlsZXMgdGhyb3VnaCBnaXQtYW5uZXggYnV0IGBnaXQtYW5uZXhgIGNhbm5vdCBiZSBydW4sIHNpbmNlIGFcbiAgICogcGxhaW4gYGdpdCBhZGRgIHdvdWxkIHRoZW4gcHV0IHRoZSBsYXJnZSBmaWxlcyBpbnRvIGdpdCBpdHNlbGYuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbm5leEZpbHRlcnMgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ2NvbmZpZycsICctLWdldC1yZWdleHAnLCBTdHJpbmcucmF3YF5maWx0ZXJcXC5hbm5leFxcLmBdIH0pO1xuICAgIGlmICghYW5uZXhGaWx0ZXJzLnN0ZG91dC50cmltKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgYW5uZXhWZXJzaW9uID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnYW5uZXgnLCAndmVyc2lvbicsICctLXJhdyddIH0pLmNhdGNoKCgpID0+IG51bGwpO1xuICAgIGlmIChhbm5leFZlcnNpb24gPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1RoZSB2YXVsdCByZXBvc2l0b3J5IHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCwgYnV0IGdpdC1hbm5leCBpcyBub3Qgb24gUEFUSC4gQnVsayBvcGVyYXRpb24gY29tbWl0cyBhcmUgcmVmdXNlZCwgYmVjYXVzZSB0aGV5IHdvdWxkIGFkZCBsYXJnZSBmaWxlcyB0byBnaXQgaXRzZWxmLidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExpc3RzIHRoZSBidWxrLW9wZXJhdGlvbiBjb21taXRzIGEgcGx1Z2luIG1hZGUgb24gdGhlIGN1cnJlbnQgYnJhbmNoLCBuZXdlc3QgZmlyc3QuXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBwbHVnaW4gaWQuXG4gICAqIEByZXR1cm5zIFRoZSBjb21taXRzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGxpc3RCdWxrT3BlcmF0aW9uQ29tbWl0cyhwbHVnaW5JZDogc3RyaW5nKTogUHJvbWlzZTxCdWxrT3BlcmF0aW9uQ29tbWl0W10+IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7XG4gICAgICBhbGxvd2VkRXhpdENvZGVzOiBbMCwgR0lUX0ZBVEFMX0VYSVRfQ09ERV0sXG4gICAgICBnaXRBcmd1bWVudHM6IFtcbiAgICAgICAgJ2xvZycsXG4gICAgICAgIGAtLWZvcm1hdD0lSCR7VU5JVF9TRVBBUkFUT1J9JWFJJHtVTklUX1NFUEFSQVRPUn0lc2AsXG4gICAgICAgICctLWV4dGVuZGVkLXJlZ2V4cCcsXG4gICAgICAgIGAtLWdyZXA9XiR7UExVR0lOX1RSQUlMRVJfS0VZfTogJHtlc2NhcGVSZWdFeHAocGx1Z2luSWQpfSRgXG4gICAgICBdXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBjb25zdCBjb21taXRzOiBCdWxrT3BlcmF0aW9uQ29tbWl0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8pKSB7XG4gICAgICBjb25zdCBbc2hhID0gJycsIGRhdGUgPSAnJywgLi4uc3ViamVjdFBhcnRzXSA9IGxpbmUuc3BsaXQoVU5JVF9TRVBBUkFUT1IpO1xuICAgICAgY29uc3QgY29tbWl0ID0gcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0KHsgZGF0ZSwgc2hhLCBzdWJqZWN0OiBzdWJqZWN0UGFydHMuam9pbihVTklUX1NFUEFSQVRPUikgfSk7XG4gICAgICBpZiAoY29tbWl0KSB7XG4gICAgICAgIGNvbW1pdHMucHVzaChjb21taXQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29tbWl0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21taXRzIHdoYXRldmVyIGEgc3RhbGUgbG9jaydzIG9wZXJhdGlvbiBsZWZ0IGJlaGluZCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgIGFuZCByZW1vdmVzIHRoZSBsb2NrLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgaWQgb2YgdGhlIHJlY292ZXJlZCBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZXJlIHdhcyBubyBzdGFsZSBsb2NrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY292ZXJTdGFsZUxvY2soKTogUHJvbWlzZTxudWxsIHwgc3RyaW5nPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICByZXR1cm4gIWxvY2sgfHwgIXRoaXMuaXNTdGFsZShsb2NrKSA/IG51bGwgOiAoYXdhaXQgdGhpcy5yZWNvdmVyKGxvY2spKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXZlcnRzIGEgYnVsay1vcGVyYXRpb24gY29tbWl0IHdpdGggYGdpdCByZXZlcnQgLS1uby1lZGl0YC5cbiAgICpcbiAgICogV2hhdGV2ZXIgaXMgcGVuZGluZyBpcyBjb21taXR0ZWQgZmlyc3QsIHNvIHRoZSByZXZlcnQgc3RhcnRzIGZyb20gYSBjbGVhbiB0cmVlLiBBIGNvbmZsaWN0IGlzIE5PVCBhYm9ydGVkOiB0aGVcbiAgICogcmVwbyBpcyBsZWZ0IG1pZC1yZXZlcnQgZm9yIHRoZSB1c2VyIHRvIHJlc29sdmUuXG4gICAqXG4gICAqIEBwYXJhbSBjb21taXQgLSBUaGUgY29tbWl0IHRvIHJldmVydC5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgYW5kIHdoYXQgZ2l0IHByaW50ZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmV2ZXJ0QnVsa09wZXJhdGlvbkNvbW1pdChjb21taXQ6IEJ1bGtPcGVyYXRpb25Db21taXQpOiBQcm9taXNlPEdpdFJldmVydFJlc3VsdD4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5jb21taXRQZW5kaW5nKHsgYm9keTogJycsIHN1YmplY3Q6IGBjaG9yZTogYmVmb3JlIHJldmVydCBvZiAke2NvbW1pdC5vcGVyYXRpb25JZH1gIH0pO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBhbGxvd2VkRXhpdENvZGVzOiBbMCwgMV0sIGdpdEFyZ3VtZW50czogWydyZXZlcnQnLCAnLS1uby1lZGl0JywgY29tbWl0LnNoYV0gfSk7XG4gICAgICByZXR1cm4geyBpc0NvbmZsaWN0OiByZXN1bHQuZXhpdENvZGUgIT09IDAsIG91dHB1dDogYCR7cmVzdWx0LnN0ZG91dH0ke3Jlc3VsdC5zdGRlcnJ9YC50cmltKCkgfTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgdGhpcy5yZWxlYXNlTG9jaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGEgYnVsayBvcGVyYXRpb24gYmV0d2VlbiB0d28gY29tbWl0cy5cbiAgICpcbiAgICogVGFrZXMgdGhlIGxlYXNlIGxvY2ssIGNvbW1pdHMgd2hhdGV2ZXIgaXMgcGVuZGluZyBhcyBgY2hvcmU6IGJlZm9yZSBPUDxuPmAsIHJ1bnMgdGhlIG9wZXJhdGlvbiwgd2FpdHMgZm9yIGl0c1xuICAgKiBmb2xsb3ctdXBzIHRvIHNldHRsZSwgY29tbWl0cyB0aGUgcmVzdWx0IGFzIGBPUDxuPjogPHN1bW1hcnk+YCBhbmQgcmVsZWFzZXMgdGhlIGxvY2suIEFuIG9wZXJhdGlvbiB0aGF0IHRocm93c1xuICAgKiBzdGlsbCBnZXRzIGl0cyBwYXJ0aWFsIGNoYW5nZXMgY29tbWl0dGVkLCBhcyBgT1A8bj4gaW50ZXJydXB0ZWRgLCBiZWZvcmUgdGhlIGVycm9yIGlzIHJldGhyb3duLlxuICAgKlxuICAgKiBAdHlwZVBhcmFtIFQgLSBUaGUgdHlwZSBvZiB0aGUgb3BlcmF0aW9uJ3MgcmVzdWx0LlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQsIGl0cyBpZCBhbmQgdGhlIGhhc2ggb2YgaXRzIGNvbW1pdC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW5CdWxrT3BlcmF0aW9uPFQ+KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5CdWxrT3BlcmF0aW9uUGFyYW1zPFQ+KTogUHJvbWlzZTxHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIGxldCB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KG9wZXJhdGlvbklkKSB9KTtcblxuICAgICAgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXIgPSByZWdpc3RlckJ1bGtPcGVyYXRpb25Qcm9ncmVzc0xpc3RlbmVyKHRoaXMuY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCkpO1xuXG4gICAgICBsZXQgcmVzdWx0OiBUO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGFyYW1zLm9wZXJhdGlvbigpO1xuICAgICAgICBhd2FpdCBwYXJhbXMuc2V0dGxlKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBhd2FpdCB0aGlzLmhlYXJ0YmVhdCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogcGFyYW1zLnBsdWdpbklkIH0pO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy5oZWFydGJlYXQoKTtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnk6IHBhcmFtcy5zdW1tYXJ5IH0pO1xuICAgICAgcmV0dXJuIHsgY29tbWl0U2hhLCBvcGVyYXRpb25JZCwgcmVzdWx0IH07XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHVucmVnaXN0ZXJQcm9ncmVzc0xpc3RlbmVyPy4oKTtcbiAgICAgIGF3YWl0IHRoaXMucmVsZWFzZUxvY2soKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFjcXVpcmVMb2NrKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRoaXMubG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgZm9yICg7Oykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5Q3JlYXRlTG9jaygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICAgIGlmICghbG9jaykge1xuICAgICAgICAvLyBSZWxlYXNlZCBiZXR3ZWVuIHRoZSB0d28gY2FsbHM6IHRyeSB0byB0YWtlIGl0IGFnYWluIGF0IG9uY2UuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5pc1N0YWxlKGxvY2spKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVjb3Zlcihsb2NrKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChEYXRlLm5vdygpID49IGRlYWRsaW5lKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGltZWQgb3V0IHdhaXRpbmcgZm9yICR7bG9jay5vcGVyYXRpb25JZCB8fCAnYW4gb3BlcmF0aW9uJ30gb2YgJHtsb2NrLnBsdWdpbklkfSBvbiAke2xvY2suaG9zdH0gdG8gcmVsZWFzZSB0aGUgYnVsayBvcGVyYXRpb24gbG9jayAke3RoaXMubG9ja0ZpbGVQYXRofS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhMT0NLX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGFsbG9jYXRlT3BlcmF0aW9uSWQocGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICByZXR1cm4gZ2V0TmV4dE9wZXJhdGlvbklkKHJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWNvdmVyKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcGVyYXRpb25JZCA9IGxvY2sub3BlcmF0aW9uSWQgfHwgYXdhaXQgdGhpcy5maW5kTmV4dE9wZXJhdGlvbklkKCk7XG4gICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IGxvY2sucGx1Z2luSWQgfHwgJ3Vua25vd24nIH0pO1xuICAgIGF3YWl0IHVubGluayh0aGlzLmxvY2tGaWxlUGF0aCkuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBpZiAoIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VOT0VOVCcpKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVsZWFzZUxvY2soKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbG9jayA9IGF3YWl0IHRoaXMucmVhZExvY2soKTtcbiAgICBjb25zdCBpc093bkxvY2sgPSBsb2NrICE9PSBudWxsICYmIHRoaXMuaXNPd25Mb2NrKGxvY2spO1xuICAgIHRoaXMub3duTG9jayA9IG51bGw7XG4gICAgaWYgKCFpc093bkxvY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkdpdChwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gICAgY29uc3QgYWxsb3dlZEV4aXRDb2RlcyA9IHBhcmFtcy5hbGxvd2VkRXhpdENvZGVzID8/IFswXTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTs7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY0dpdCh7IGN3ZDogdGhpcy53b3JraW5nRGlyZWN0b3J5LCBnaXRBcmd1bWVudHM6IHBhcmFtcy5naXRBcmd1bWVudHMgfSk7XG4gICAgICBpZiAoYWxsb3dlZEV4aXRDb2Rlcy5pbmNsdWRlcyhyZXN1bHQuZXhpdENvZGUpKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBpZiAoYXR0ZW1wdCA8IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgJiYgcmVzdWx0LnN0ZGVyci5pbmNsdWRlcygnaW5kZXgubG9jaycpKSB7XG4gICAgICAgIGF3YWl0IHNldFRpbWVvdXRBc3luYyhJTkRFWF9MT0NLX1JFVFJZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEdpdENvbW1hbmRFcnJvcihwYXJhbXMuZ2l0QXJndW1lbnRzLCByZXN1bHQuZXhpdENvZGUsIHJlc3VsdC5zdGRlcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc3RhZ2VBbGwoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhZGQnLCAnLS1hbGwnLCAnLS0nLCAnLiddIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2RpZmYnLCAnLS1jYWNoZWQnLCAnLS1uYW1lLW9ubHknLCAnLXonLCAnLS0nLCAnLiddIH0pO1xuICAgIHJldHVybiByZXN1bHQuc3Rkb3V0LnNwbGl0KCdcXDAnKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB0cnlDcmVhdGVMb2NrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvY2sgPSBjcmVhdGVMb2NrUmVjb3JkKCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jayksIHsgZmxhZzogJ3d4JyB9KTtcbiAgICAgIHRoaXMub3duTG9jayA9IGxvY2s7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VFWElTVCcpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVMb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gV3JpdHRlbiBiZXNpZGUgdGhlIGxvY2sgYW5kIHJlbmFtZWQgb3ZlciBpdCwgc28gYSByZWFkZXIgbmV2ZXIgc2VlcyBhIGhhbGYtd3JpdHRlbiBoZWFydGJlYXQuXG4gICAgY29uc3QgdGVtcG9yYXJ5UGF0aCA9IGAke3RoaXMubG9ja0ZpbGVQYXRofS4ke1N0cmluZyhsb2NrLnByb2Nlc3NJZCl9LnRtcGA7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBvcmFyeVBhdGgsIEpTT04uc3RyaW5naWZ5KGxvY2spKTtcbiAgICBhd2FpdCByZW5hbWUodGVtcG9yYXJ5UGF0aCwgdGhpcy5sb2NrRmlsZVBhdGgpO1xuICB9XG59XG5cbi8qKlxuICogQW4gZXJyb3IgdGhyb3duIHdoZW4gYSBgZ2l0YCBjb21tYW5kIGZhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgR2l0Q29tbWFuZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGdpdEFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudHMgYGdpdGAgd2FzIHJ1biB3aXRoLlxuICAgKiBAcGFyYW0gZXhpdENvZGUgLSBUaGUgZXhpdCBjb2RlLlxuICAgKiBAcGFyYW0gc3RkZXJyIC0gV2hhdCBgZ2l0YCBwcmludGVkIHRvIHN0ZGVyci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgZ2l0QXJndW1lbnRzOiByZWFkb25seSBzdHJpbmdbXSwgcHVibGljIHJlYWRvbmx5IGV4aXRDb2RlOiBudW1iZXIsIHB1YmxpYyByZWFkb25seSBzdGRlcnI6IHN0cmluZykge1xuICAgIHN1cGVyKGBnaXQgJHtnaXRBcmd1bWVudHMuam9pbignICcpfSBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJHtTdHJpbmcoZXhpdENvZGUpfTogJHtzdGRlcnIudHJpbSgpfWApO1xuICAgIHRoaXMubmFtZSA9ICdHaXRDb21tYW5kRXJyb3InO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxvY2tSZWNvcmQoKTogQnVsa09wZXJhdGlvbkxvY2sge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICByZXR1cm4ge1xuICAgIGhlYXJ0YmVhdEF0OiBub3csXG4gICAgaG9zdDogaG9zdG5hbWUoKSxcbiAgICBvcGVyYXRpb25JZDogJycsXG4gICAgcGx1Z2luSWQ6ICcnLFxuICAgIHByb2Nlc3NJZDogcHJvY2Vzcy5waWQsXG4gICAgcHJvY2Vzc1N0YXJ0ZWRBdDogZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpLFxuICAgIHN0YXJ0ZWRBdDogbm93XG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWNHaXQocGFyYW1zOiBFeGVjR2l0UGFyYW1zKTogUHJvbWlzZTxHaXRDb21tYW5kUmVzdWx0PiB7XG4gIHJldHVybiBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgZXhlY0ZpbGUoJ2dpdCcsIFsuLi5wYXJhbXMuZ2l0QXJndW1lbnRzXSwgeyBjd2Q6IHBhcmFtcy5jd2QsIG1heEJ1ZmZlcjogTUFYX0JVRkZFUl9JTl9CWVRFUywgd2luZG93c0hpZGU6IHRydWUgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgaWYgKGVycm9yICYmIHR5cGVvZiBlcnJvci5jb2RlICE9PSAnbnVtYmVyJykge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGdpdCAke3BhcmFtcy5naXRBcmd1bWVudHMuam9pbignICcpfWAsIHsgY2F1c2U6IGVycm9yIH0pKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSh7IGV4aXRDb2RlOiB0eXBlb2YgZXJyb3I/LmNvZGUgPT09ICdudW1iZXInID8gZXJyb3IuY29kZSA6IDAsIHN0ZGVyciwgc3Rkb3V0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0UHJvY2Vzc1N0YXJ0ZWRBdCgpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5yb3VuZChwZXJmb3JtYW5jZS50aW1lT3JpZ2luKTtcbn1cblxuZnVuY3Rpb24gaXNFcnJvcldpdGhDb2RlKGVycm9yOiB1bmtub3duLCBjb2RlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBlcnJvciA9PT0gJ29iamVjdCcgJiYgZXJyb3IgIT09IG51bGwgJiYgJ2NvZGUnIGluIGVycm9yICYmIGVycm9yLmNvZGUgPT09IGNvZGU7XG59XG5cbmZ1bmN0aW9uIGlzUHJvY2Vzc0FsaXZlKHByb2Nlc3NJZDogbnVtYmVyKTogYm9vbGVhbiB8IG51bGwge1xuICBpZiAocHJvY2Vzc0lkIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICBwcm9jZXNzLmtpbGwocHJvY2Vzc0lkLCAwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gIWlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VTUkNIJykgJiYgKGlzRXJyb3JXaXRoQ29kZShlcnJvciwgJ0VQRVJNJykgfHwgbnVsbCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLG1CQUFnQztBQUNoQyxzQkFBMEI7QUFDMUIscUJBQTZCO0FBQzdCLHlCQUFrQztBQUNsQyxnQ0FBeUI7QUFDekIsc0JBTU87QUFDUCxxQkFHTztBQUNQLHVCQUFxQjtBQU9yQixxQ0FBc0Q7QUFDdEQsNEJBU087QUFzR1AsTUFBTSw0Q0FBNEM7QUFDbEQsTUFBTSxxQ0FBcUM7QUFDM0MsTUFBTSx5QkFBeUI7QUFDL0IsTUFBTSx5Q0FBeUM7QUFDL0MsTUFBTSxxQ0FBcUM7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
|
|
559
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kZXNrdG9wLWJ1bGstb3BlcmF0aW9uLWdpdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIGRlc2t0b3AgaGFsZiBvZiBidWxrLW9wZXJhdGlvbiBnaXQgY29tbWl0czogZHJpdmVzIHRoZSBzeXN0ZW0gYGdpdGAgQ0xJIHRvIHdyYXAgYSBidWxrIG9wZXJhdGlvbiBpbiBjb21taXRzLFxuICogZ3VhcmRlZCBieSBhIGxlYXNlIGxvY2sgaW4gdGhlIHJlcG8ncyBnaXQgZGlyZWN0b3J5LlxuICpcbiAqIFRoZSBzeXN0ZW0gQ0xJIGlzIHVzZWQgcmF0aGVyIHRoYW4gYSBidW5kbGVkIGltcGxlbWVudGF0aW9uIGJlY2F1c2UgaXQgaG9ub3JzIHRoZSByZXBvJ3Mgb3duIGNvbmZpZywgaG9va3NcbiAqIGFuZCBjbGVhbi9zbXVkZ2UgZmlsdGVycywgZ2l0LWFubmV4J3MgYW1vbmcgdGhlbSwgYW5kIGJlY2F1c2UgYGdpdCByZXZlcnRgIGlzIHRoZSB3aG9sZSB1bmRvIHN0b3J5LlxuICpcbiAqIEV2ZXJ5IGNvbW1hbmQgcnVucyB3aXRoIHRoZSB2YXVsdCBmb2xkZXIgYXMgaXRzIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBgLmAgYXMgaXRzIHBhdGhzcGVjLCBzbyB3aGVuIHRoZSB2YXVsdCBpcyBhXG4gKiBzdWJmb2xkZXIgb2YgYSBsYXJnZXIgcmVwbyBvbmx5IHRoZSB2YXVsdCdzIGNoYW5nZXMgYXJlIGNvbW1pdHRlZC5cbiAqXG4gKiBEZXNrdG9wLW9ubHkgKGBub2RlOmNoaWxkX3Byb2Nlc3NgLCBgbm9kZTpmc2AsIGBub2RlOm9zYCksIGJ1dCBpbmVydCB0byBpbXBvcnQgb24gbW9iaWxlOiBub3RoaW5nIGhlcmUgdG91Y2hlcyBhXG4gKiBOb2RlIGJ1aWx0aW4gdW50aWwgYSBmdW5jdGlvbiBpcyBjYWxsZWQuXG4gKi9cblxuaW1wb3J0IHsgc2V0VGltZW91dEFzeW5jIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB7IG5vb3BBc3luYyB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9mdW5jdGlvbic7XG5pbXBvcnQgeyBlc2NhcGVSZWdFeHAgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcmVnLWV4cCc7XG5pbXBvcnQgeyBlbnN1cmVOb25OdWxsYWJsZSB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi90eXBlLWd1YXJkcyc7XG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQge1xuICByZWFkRmlsZSxcbiAgcmVuYW1lLFxuICBzdGF0LFxuICB1bmxpbmssXG4gIHdyaXRlRmlsZVxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIGhvc3RuYW1lLFxuICB1cHRpbWVcbn0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcblxuaW1wb3J0IHR5cGUge1xuICBCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBCdWxrT3BlcmF0aW9uTG9ja1xufSBmcm9tICcuL2J1bGstb3BlcmF0aW9uLnRzJztcblxuaW1wb3J0IHsgcmVnaXN0ZXJCdWxrT3BlcmF0aW9uUHJvZ3Jlc3NMaXN0ZW5lciB9IGZyb20gJy4vYnVsay1vcGVyYXRpb24tcHJvZ3Jlc3MudHMnO1xuaW1wb3J0IHtcbiAgYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0LFxuICBidWlsZE9wZXJhdGlvbkNvbW1pdE1lc3NhZ2UsXG4gIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FLFxuICBnZXROZXh0T3BlcmF0aW9uSWQsXG4gIGlzQnVsa09wZXJhdGlvbkxvY2ssXG4gIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZSxcbiAgcGFyc2VCdWxrT3BlcmF0aW9uQ29tbWl0LFxuICBQTFVHSU5fVFJBSUxFUl9LRVlcbn0gZnJvbSAnLi9idWxrLW9wZXJhdGlvbi50cyc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbnN0cnVjdG9yUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeSwgd2hlcmUgdGhlIGxlYXNlIGxvY2sgbGl2ZXMuXG4gICAqL1xuICByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogSG93IGxvbmcgdG8gd2FpdCBmb3IgYW5vdGhlciBvcGVyYXRpb24ncyBsb2NrIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA2MDBfMDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmb2xkZXIgd2hvc2UgY2hhbmdlcyBhcmUgY29tbWl0dGVkOiB0aGUgdmF1bHQgcm9vdC5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtpbmdEaXJlY3Rvcnk6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb1J1bkJ1bGtPcGVyYXRpb25QYXJhbXM8VD4ge1xuICAvKipcbiAgICogUnVucyB0aGUgYnVsayBvcGVyYXRpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb246ICgpID0+IFByb21pc2U8VD47XG5cbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdhaXRzIGZvciB0aGUgZm9sbG93LXVwcyB0aGUgb3BlcmF0aW9uIHNldCBvZmYgKHJlbmFtZSBoYW5kbGVycywgbGluayB1cGRhdGVzLCB0aGUgbWV0YWRhdGEgY2FjaGUpIHRvIGZpbmlzaCwgc29cbiAgICogdGhlaXIgY2hhbmdlcyBsYW5kIGluIHRoZSBvcGVyYXRpb24ncyBjb21taXQuXG4gICAqL1xuICByZWFkb25seSBzZXR0bGU6ICgpID0+IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIG9wZXJhdGlvbiwgdXNlZCBpbiB0aGUgY29tbWl0IHN1YmplY3QuXG4gICAqL1xuICByZWFkb25seSBzdW1tYXJ5OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB7QGxpbmsgQnVsa09wZXJhdGlvbkdpdFJlcG8ucnVuQnVsa09wZXJhdGlvbn0uXG4gKlxuICogQHR5cGVQYXJhbSBUIC0gVGhlIHR5cGUgb2YgdGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRCdWxrT3BlcmF0aW9uUmVzdWx0PFQ+IHtcbiAgLyoqXG4gICAqIFRoZSBoYXNoIG9mIHRoZSBjb21taXQgcmVjb3JkaW5nIHRoZSBvcGVyYXRpb24sIG9yIGBudWxsYCB3aGVuIHRoZSBvcGVyYXRpb24gY2hhbmdlZCBub3RoaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWl0U2hhOiBudWxsIHwgc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgb3BlcmF0aW9uIGlkLCBzdWNoIGFzIGBPUDEyYC5cbiAgICovXG4gIHJlYWRvbmx5IG9wZXJhdGlvbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIsIHdoZW4gaXRzIGxvY2sgd2FzIHJlY292ZXJlZCBhcyBzdGFsZSB3aGlsZSBpdCByYW4sIG9yIGBudWxsYCBvdGhlcndpc2UuXG4gICAqXG4gICAqIFRoZSBjaGFuZ2VzIG1hZGUgYmVmb3JlIHRoZSByZWNvdmVyeSBhcmUgaW4gdGhlIGA8cmVjb3ZlcmVkT3BlcmF0aW9uSWQ+IGludGVycnVwdGVkYCBjb21taXQsIGFuZCB0aGUgcmVzdCB3ZW50IGludG9cbiAgICogYSBmcmVzaCB7QGxpbmsgb3BlcmF0aW9uSWR9LCBzbyB1bmRvaW5nIHRoZSB3aG9sZSBvcGVyYXRpb24gdGFrZXMgcmV2ZXJ0aW5nIGJvdGguXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyZWRPcGVyYXRpb25JZDogbnVsbCB8IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG9wZXJhdGlvbidzIHJlc3VsdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc3VsdDogVDtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHtAbGluayBCdWxrT3BlcmF0aW9uR2l0UmVwby5yZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHaXRSZXZlcnRSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgcmV2ZXJ0IHN0b3BwZWQgb24gYSBjb25mbGljdCwgbGVhdmluZyB0aGUgcmVwbyBtaWQtcmV2ZXJ0IGZvciB0aGUgdXNlciB0byByZXNvbHZlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNDb25mbGljdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMge1xuICByZWFkb25seSBhbGxvd2VkRXhpdENvZGVzPzogcmVhZG9ubHkgbnVtYmVyW107XG4gIHJlYWRvbmx5IGdpdEFyZ3VtZW50czogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBHaXRDb21tYW5kUmVzdWx0IHtcbiAgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgc3RkZXJyOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHN0ZG91dDogc3RyaW5nO1xufVxuXG5jb25zdCBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDYwMF8wMDA7XG5jb25zdCBIRUFSVEJFQVRfVEhST1RUTEVfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfQ09VTlQgPSAyMDtcbmNvbnN0IElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gNTAwO1xuY29uc3QgTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDEwMDA7XG5jb25zdCBNQVhfQlVGRkVSX0lOX0JZVEVTID0gMjY4XzQzNV80NTY7XG5jb25zdCBNSUxMSVNFQ09ORFNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IEdJVF9GQVRBTF9FWElUX0NPREUgPSAxMjg7XG5jb25zdCBSRVZfUEFSU0VfT1VUUFVUX0xJTkVfQ09VTlQgPSAyO1xuY29uc3QgVU5JVF9TRVBBUkFUT1IgPSAnXFx1ezFGfSc7XG5cbmludGVyZmFjZSBCdWxrT3BlcmF0aW9uR2l0UmVwb0NvbW1pdE9wZXJhdGlvblBhcmFtcyB7XG4gIHJlYWRvbmx5IGlzSW50ZXJydXB0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvcGVyYXRpb25JZDogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzdW1tYXJ5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ29tbWl0TWVzc2FnZSB7XG4gIHJlYWRvbmx5IGJvZHk6IHN0cmluZztcbiAgcmVhZG9ubHkgc3ViamVjdDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgRXhlY0dpdFBhcmFtcyB7XG4gIHJlYWRvbmx5IGN3ZDogc3RyaW5nO1xuICByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEEgZ2l0IHJlcG8gaG9sZGluZyBhIHZhdWx0LCBkcml2ZW4gdG8gd3JhcCBidWxrIG9wZXJhdGlvbnMgaW4gY29tbWl0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ1bGtPcGVyYXRpb25HaXRSZXBvIHtcbiAgLyoqXG4gICAqIFRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXBvJ3MgZ2l0IGRpcmVjdG9yeS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBnaXREaXJlY3Rvcnk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGFic29sdXRlIHBhdGggb2YgdGhlIGZvbGRlciB3aG9zZSBjaGFuZ2VzIGFyZSBjb21taXR0ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgd29ya2luZ0RpcmVjdG9yeTogc3RyaW5nO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja0ZpbGVQYXRoOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9ja1dhaXRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbiAgcHJpdmF0ZSBvd25Mb2NrOiBCdWxrT3BlcmF0aW9uTG9jayB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2Uge0BsaW5rIEJ1bGtPcGVyYXRpb25HaXRSZXBvLm9wZW59IHRvIGZpbmQgdGhlIHJlcG8gb2YgYSBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgY29uc3RydWN0b3IgcGFyYW1ldGVycy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmdpdERpcmVjdG9yeSA9IHBhcmFtcy5naXREaXJlY3Rvcnk7XG4gICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gcGFyYW1zLndvcmtpbmdEaXJlY3Rvcnk7XG4gICAgdGhpcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5sb2NrV2FpdFRpbWVvdXRJbk1pbGxpc2Vjb25kcyA/PyBERUZBVUxUX0xPQ0tfV0FJVF9USU1FT1VUX0lOX01JTExJU0VDT05EUztcbiAgICB0aGlzLmxvY2tGaWxlUGF0aCA9IGpvaW4odGhpcy5naXREaXJlY3RvcnksIEJVTEtfT1BFUkFUSU9OX0xPQ0tfRklMRV9OQU1FKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgZ2l0IHJlcG8gYSBmb2xkZXIgYmVsb25ncyB0by5cbiAgICpcbiAgICogQHBhcmFtIHdvcmtpbmdEaXJlY3RvcnkgLSBUaGUgZm9sZGVyLCBub3JtYWxseSB0aGUgdmF1bHQgcm9vdC5cbiAgICogQHJldHVybnMgVGhlIHJlcG8sIG9yIGBudWxsYCB3aGVuIHRoZSBmb2xkZXIgaXMgbm90IGluc2lkZSBhIGdpdCB3b3JrIHRyZWUgb3IgYGdpdGAgY2Fubm90IGJlIHJ1bi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXN5bmMgb3Blbih3b3JraW5nRGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25HaXRSZXBvIHwgbnVsbD4ge1xuICAgIGxldCByZXN1bHQ6IEdpdENvbW1hbmRSZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IGV4ZWNHaXQoeyBjd2Q6IHdvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnLS1pcy1pbnNpZGUtd29yay10cmVlJywgJy0tYWJzb2x1dGUtZ2l0LWRpciddIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IFtpc0luc2lkZVdvcmtUcmVlLCBnaXREaXJlY3RvcnldID0gcmVzdWx0LnN0ZG91dC5zcGxpdCgvXFxyP1xcbi8sIFJFVl9QQVJTRV9PVVRQVVRfTElORV9DT1VOVCk7XG4gICAgcmV0dXJuIHJlc3VsdC5leGl0Q29kZSAhPT0gMCB8fCBpc0luc2lkZVdvcmtUcmVlICE9PSAndHJ1ZScgfHwgIWdpdERpcmVjdG9yeSA/IG51bGwgOiBuZXcgQnVsa09wZXJhdGlvbkdpdFJlcG8oeyBnaXREaXJlY3RvcnksIHdvcmtpbmdEaXJlY3RvcnkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVmdXNlcyB0byBnbyBvbiB3aGVuIHRoZSByZXBvIHJvdXRlcyBmaWxlcyB0aHJvdWdoIGdpdC1hbm5leCBidXQgYGdpdC1hbm5leGAgY2Fubm90IGJlIHJ1biwgc2luY2UgYVxuICAgKiBwbGFpbiBgZ2l0IGFkZGAgd291bGQgdGhlbiBwdXQgdGhlIGxhcmdlIGZpbGVzIGludG8gZ2l0IGl0c2VsZi5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBhc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFubmV4RmlsdGVycyA9IGF3YWl0IHRoaXMucnVuR2l0KHsgYWxsb3dlZEV4aXRDb2RlczogWzAsIDFdLCBnaXRBcmd1bWVudHM6IFsnY29uZmlnJywgJy0tZ2V0LXJlZ2V4cCcsIFN0cmluZy5yYXdgXmZpbHRlclxcLmFubmV4XFwuYF0gfSk7XG4gICAgaWYgKCFhbm5leEZpbHRlcnMuc3Rkb3V0LnRyaW0oKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbm5leFZlcnNpb24gPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydhbm5leCcsICd2ZXJzaW9uJywgJy0tcmF3J10gfSkuY2F0Y2goKCkgPT4gbnVsbCk7XG4gICAgaWYgKGFubmV4VmVyc2lvbiA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIHZhdWx0IHJlcG9zaXRvcnkgcm91dGVzIGZpbGVzIHRocm91Z2ggZ2l0LWFubmV4LCBidXQgZ2l0LWFubmV4IGlzIG5vdCBvbiBQQVRILiBCdWxrIG9wZXJhdGlvbiBjb21taXRzIGFyZSByZWZ1c2VkLCBiZWNhdXNlIHRoZXkgd291bGQgYWRkIGxhcmdlIGZpbGVzIHRvIGdpdCBpdHNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgdGhlIGJ1bGstb3BlcmF0aW9uIGNvbW1pdHMgYSBwbHVnaW4gbWFkZSBvbiB0aGUgY3VycmVudCBicmFuY2gsIG5ld2VzdCBmaXJzdC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBpZC5cbiAgICogQHJldHVybnMgVGhlIGNvbW1pdHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdEJ1bGtPcGVyYXRpb25Db21taXRzKHBsdWdpbklkOiBzdHJpbmcpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Db21taXRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGFsbG93ZWRFeGl0Q29kZXM6IFswLCBHSVRfRkFUQUxfRVhJVF9DT0RFXSxcbiAgICAgIGdpdEFyZ3VtZW50czogW1xuICAgICAgICAnbG9nJyxcbiAgICAgICAgYC0tZm9ybWF0PSVIJHtVTklUX1NFUEFSQVRPUn0lYUkke1VOSVRfU0VQQVJBVE9SfSVzYCxcbiAgICAgICAgJy0tZXh0ZW5kZWQtcmVnZXhwJyxcbiAgICAgICAgYC0tZ3JlcD1eJHtQTFVHSU5fVFJBSUxFUl9LRVl9OiAke2VzY2FwZVJlZ0V4cChwbHVnaW5JZCl9JGBcbiAgICAgIF1cbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IGNvbW1pdHM6IEJ1bGtPcGVyYXRpb25Db21taXRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQuc3Rkb3V0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICAgIGNvbnN0IFtzaGEgPSAnJywgZGF0ZSA9ICcnLCAuLi5zdWJqZWN0UGFydHNdID0gbGluZS5zcGxpdChVTklUX1NFUEFSQVRPUik7XG4gICAgICBjb25zdCBjb21taXQgPSBwYXJzZUJ1bGtPcGVyYXRpb25Db21taXQoeyBkYXRlLCBzaGEsIHN1YmplY3Q6IHN1YmplY3RQYXJ0cy5qb2luKFVOSVRfU0VQQVJBVE9SKSB9KTtcbiAgICAgIGlmIChjb21taXQpIHtcbiAgICAgICAgY29tbWl0cy5wdXNoKGNvbW1pdCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb21taXRzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbW1pdHMgd2hhdGV2ZXIgYSBzdGFsZSBsb2NrJ3Mgb3BlcmF0aW9uIGxlZnQgYmVoaW5kIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAgYW5kIHJlbW92ZXMgdGhlIGxvY2suXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBpZCBvZiB0aGUgcmVjb3ZlcmVkIG9wZXJhdGlvbiwgb3IgYG51bGxgIHdoZW4gdGhlcmUgd2FzIG5vIHN0YWxlIGxvY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjb3ZlclN0YWxlTG9jaygpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIHJldHVybiAhbG9jayB8fCAhdGhpcy5pc1N0YWxlKGxvY2spID8gbnVsbCA6IChhd2FpdCB0aGlzLnJlY292ZXIobG9jaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldmVydHMgYSBidWxrLW9wZXJhdGlvbiBjb21taXQgd2l0aCBgZ2l0IHJldmVydCAtLW5vLWVkaXRgLlxuICAgKlxuICAgKiBXaGF0ZXZlciBpcyBwZW5kaW5nIGlzIGNvbW1pdHRlZCBmaXJzdCwgc28gdGhlIHJldmVydCBzdGFydHMgZnJvbSBhIGNsZWFuIHRyZWUuIEEgY29uZmxpY3QgaXMgTk9UIGFib3J0ZWQ6IHRoZVxuICAgKiByZXBvIGlzIGxlZnQgbWlkLXJldmVydCBmb3IgdGhlIHVzZXIgdG8gcmVzb2x2ZS5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1pdCAtIFRoZSBjb21taXQgdG8gcmV2ZXJ0LlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSByZXZlcnQgc3RvcHBlZCBvbiBhIGNvbmZsaWN0LCBhbmQgd2hhdCBnaXQgcHJpbnRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXZlcnRCdWxrT3BlcmF0aW9uQ29tbWl0KGNvbW1pdDogQnVsa09wZXJhdGlvbkNvbW1pdCk6IFByb21pc2U8R2l0UmV2ZXJ0UmVzdWx0PiB7XG4gICAgYXdhaXQgdGhpcy5hc3NlcnRDYW5Db21taXRMYXJnZUZpbGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hY3F1aXJlTG9jaygpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYGNob3JlOiBiZWZvcmUgcmV2ZXJ0IG9mICR7Y29tbWl0Lm9wZXJhdGlvbklkfWAgfSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGFsbG93ZWRFeGl0Q29kZXM6IFswLCAxXSwgZ2l0QXJndW1lbnRzOiBbJ3JldmVydCcsICctLW5vLWVkaXQnLCBjb21taXQuc2hhXSB9KTtcbiAgICAgIHJldHVybiB7IGlzQ29uZmxpY3Q6IHJlc3VsdC5leGl0Q29kZSAhPT0gMCwgb3V0cHV0OiBgJHtyZXN1bHQuc3Rkb3V0fSR7cmVzdWx0LnN0ZGVycn1gLnRyaW0oKSB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBidWxrIG9wZXJhdGlvbiBiZXR3ZWVuIHR3byBjb21taXRzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgbGVhc2UgbG9jaywgY29tbWl0cyB3aGF0ZXZlciBpcyBwZW5kaW5nIGFzIGBjaG9yZTogYmVmb3JlIE9QPG4+YCwgcnVucyB0aGUgb3BlcmF0aW9uLCB3YWl0cyBmb3IgaXRzXG4gICAqIGZvbGxvdy11cHMgdG8gc2V0dGxlLCBjb21taXRzIHRoZSByZXN1bHQgYXMgYE9QPG4+OiA8c3VtbWFyeT5gIGFuZCByZWxlYXNlcyB0aGUgbG9jay4gQW4gb3BlcmF0aW9uIHRoYXQgdGhyb3dzXG4gICAqIHN0aWxsIGdldHMgaXRzIHBhcnRpYWwgY2hhbmdlcyBjb21taXR0ZWQsIGFzIGBPUDxuPiBpbnRlcnJ1cHRlZGAsIGJlZm9yZSB0aGUgZXJyb3IgaXMgcmV0aHJvd24uXG4gICAqXG4gICAqIFdoZW4gdGhlIGxvY2sgd2FzIHJlY292ZXJlZCB1bmRlciB0aGUgb3BlcmF0aW9uIChpdCB3ZW50IHN0YWxlLCBhbmQgYW5vdGhlciBvcGVyYXRpb24sIHRoZSBzY2hlZHVsZWQgYXV0b2NvbW1pdCBvclxuICAgKiBhIHJlbG9hZCBjb21taXR0ZWQgYE9QPG4+IGludGVycnVwdGVkYCBhbmQgcmVtb3ZlZCBpdCksIHRoZSByZXN0IGlzIG5ldmVyIGNvbW1pdHRlZCB1bmRlciB0aGUgcmVjb3ZlcmVkIGlkOiB0aGVcbiAgICogbG9jayBpcyB0YWtlbiBhZ2FpbiBhbmQgdGhlIHJlc3QgaXMgY29tbWl0dGVkIGFzIGEgZnJlc2ggYE9QPG0+YCB3aG9zZSBzdW1tYXJ5IG5hbWVzIGBPUDxuPmAuXG4gICAqXG4gICAqIEB0eXBlUGFyYW0gVCAtIFRoZSB0eXBlIG9mIHRoZSBvcGVyYXRpb24ncyByZXN1bHQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcGFyYW1ldGVycy5cbiAgICogQHJldHVybnMgVGhlIG9wZXJhdGlvbidzIHJlc3VsdCwgaXRzIGlkLCB0aGUgaGFzaCBvZiBpdHMgY29tbWl0IGFuZCB0aGUgaWQgaXQgbG9zdCB0byBhIHJlY292ZXJ5LCBpZiBhbnkuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuQnVsa09wZXJhdGlvbjxUPihwYXJhbXM6IEJ1bGtPcGVyYXRpb25HaXRSZXBvUnVuQnVsa09wZXJhdGlvblBhcmFtczxUPik6IFByb21pc2U8R2l0QnVsa09wZXJhdGlvblJlc3VsdDxUPj4ge1xuICAgIGF3YWl0IHRoaXMuYXNzZXJ0Q2FuQ29tbWl0TGFyZ2VGaWxlcygpO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICBsZXQgdW5yZWdpc3RlclByb2dyZXNzTGlzdGVuZXI6ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdGFydE9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBhcmFtcy5wbHVnaW5JZCk7XG4gICAgICBhd2FpdCB0aGlzLmNvbW1pdFBlbmRpbmcoeyBib2R5OiAnJywgc3ViamVjdDogYnVpbGRCZWZvcmVPcGVyYXRpb25Db21taXRTdWJqZWN0KHN0YXJ0T3BlcmF0aW9uSWQpIH0pO1xuXG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lciA9IHJlZ2lzdGVyQnVsa09wZXJhdGlvblByb2dyZXNzTGlzdGVuZXIodGhpcy5jcmVhdGVUaHJvdHRsZWRIZWFydGJlYXQoKSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBwYXJhbXMub3BlcmF0aW9uKCk7XG4gICAgICAgIGF3YWl0IHBhcmFtcy5zZXR0bGUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gYXdhaXQgdGhpcy5yZWNsYWltTG9ja0lmUmVjb3ZlcmVkKHN0YXJ0T3BlcmF0aW9uSWQsIHBhcmFtcy5wbHVnaW5JZCkgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgICAgYXdhaXQgdGhpcy5jb21taXRPcGVyYXRpb24oeyBpc0ludGVycnVwdGVkOiB0cnVlLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCB9KTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc3VtZWRPcGVyYXRpb25JZCA9IGF3YWl0IHRoaXMucmVjbGFpbUxvY2tJZlJlY292ZXJlZChzdGFydE9wZXJhdGlvbklkLCBwYXJhbXMucGx1Z2luSWQpO1xuICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSByZXN1bWVkT3BlcmF0aW9uSWQgPz8gc3RhcnRPcGVyYXRpb25JZDtcbiAgICAgIGNvbnN0IHN1bW1hcnkgPSByZXN1bWVkT3BlcmF0aW9uSWQgPT09IG51bGwgPyBwYXJhbXMuc3VtbWFyeSA6IGAke3BhcmFtcy5zdW1tYXJ5fSAocmVzdW1lZCBhZnRlciAke3N0YXJ0T3BlcmF0aW9uSWR9IHdhcyByZWNvdmVyZWQpYDtcbiAgICAgIGNvbnN0IGNvbW1pdFNoYSA9IGF3YWl0IHRoaXMuY29tbWl0T3BlcmF0aW9uKHsgb3BlcmF0aW9uSWQsIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWQsIHN1bW1hcnkgfSk7XG4gICAgICByZXR1cm4geyBjb21taXRTaGEsIG9wZXJhdGlvbklkLCByZWNvdmVyZWRPcGVyYXRpb25JZDogcmVzdW1lZE9wZXJhdGlvbklkID09PSBudWxsID8gbnVsbCA6IHN0YXJ0T3BlcmF0aW9uSWQsIHJlc3VsdCB9O1xuICAgIH0gZmluYWxseSB7XG4gICAgICB1bnJlZ2lzdGVyUHJvZ3Jlc3NMaXN0ZW5lcj8uKCk7XG4gICAgICBhd2FpdCB0aGlzLnJlbGVhc2VMb2NrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhY3F1aXJlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBkZWFkbGluZSA9IERhdGUubm93KCkgKyB0aGlzLmxvY2tXYWl0VGltZW91dEluTWlsbGlzZWNvbmRzO1xuICAgIGZvciAoOzspIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnRyeUNyZWF0ZUxvY2soKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgICBpZiAoIWxvY2spIHtcbiAgICAgICAgLy8gUmVsZWFzZWQgYmV0d2VlbiB0aGUgdHdvIGNhbGxzOiB0cnkgdG8gdGFrZSBpdCBhZ2FpbiBhdCBvbmNlLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuaXNTdGFsZShsb2NrKSkge1xuICAgICAgICBhd2FpdCB0aGlzLnJlY292ZXIobG9jayk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoRGF0ZS5ub3coKSA+PSBkZWFkbGluZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRpbWVkIG91dCB3YWl0aW5nIGZvciAke2xvY2sub3BlcmF0aW9uSWQgfHwgJ2FuIG9wZXJhdGlvbid9IG9mICR7bG9jay5wbHVnaW5JZH0gb24gJHtsb2NrLmhvc3R9IHRvIHJlbGVhc2UgdGhlIGJ1bGsgb3BlcmF0aW9uIGxvY2sgJHt0aGlzLmxvY2tGaWxlUGF0aH0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBzZXRUaW1lb3V0QXN5bmMoTE9DS19QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkOiBzdHJpbmcsIHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQodXNlZE9wZXJhdGlvbklkKTtcbiAgICBjb25zdCBvd25Mb2NrID0gZW5zdXJlTm9uTnVsbGFibGUodGhpcy5vd25Mb2NrKTtcbiAgICB0aGlzLm93bkxvY2sgPSB7IC4uLm93bkxvY2ssIGhlYXJ0YmVhdEF0OiBEYXRlLm5vdygpLCBvcGVyYXRpb25JZCwgcGx1Z2luSWQgfTtcbiAgICBhd2FpdCB0aGlzLndyaXRlTG9jayh0aGlzLm93bkxvY2spO1xuICAgIHJldHVybiBvcGVyYXRpb25JZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29tbWl0T3BlcmF0aW9uKHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9Db21taXRPcGVyYXRpb25QYXJhbXMpOiBQcm9taXNlPG51bGwgfCBzdHJpbmc+IHtcbiAgICBjb25zdCBjaGFuZ2VkRmlsZUNvdW50ID0gYXdhaXQgdGhpcy5zdGFnZUFsbCgpO1xuICAgIGlmIChjaGFuZ2VkRmlsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZSA9IGJ1aWxkT3BlcmF0aW9uQ29tbWl0TWVzc2FnZSh7IC4uLnBhcmFtcywgY2hhbmdlZEZpbGVDb3VudCwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpIH0pO1xuICAgIGF3YWl0IHRoaXMuY29tbWl0U3RhZ2VkKG1lc3NhZ2UpO1xuICAgIGNvbnN0IGhlYWRSZXN1bHQgPSBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50czogWydyZXYtcGFyc2UnLCAnSEVBRCddIH0pO1xuICAgIHJldHVybiBoZWFkUmVzdWx0LnN0ZG91dC50cmltKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFBlbmRpbmcobWVzc2FnZTogQ29tbWl0TWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChhd2FpdCB0aGlzLnN0YWdlQWxsKCkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5jb21taXRTdGFnZWQobWVzc2FnZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNvbW1pdFN0YWdlZChtZXNzYWdlOiBDb21taXRNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZ2l0QXJndW1lbnRzID0gWydjb21taXQnLCAnLS1xdWlldCcsICctbScsIG1lc3NhZ2Uuc3ViamVjdF07XG4gICAgaWYgKG1lc3NhZ2UuYm9keSkge1xuICAgICAgZ2l0QXJndW1lbnRzLnB1c2goJy1tJywgbWVzc2FnZS5ib2R5KTtcbiAgICB9XG4gICAgZ2l0QXJndW1lbnRzLnB1c2goJy0tJywgJy4nKTtcbiAgICBhd2FpdCB0aGlzLnJ1bkdpdCh7IGdpdEFyZ3VtZW50cyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGhyb3R0bGVkSGVhcnRiZWF0KCk6ICgpID0+IHZvaWQge1xuICAgIGxldCBsYXN0SGVhcnRiZWF0QXQgPSBEYXRlLm5vdygpO1xuICAgIGxldCBwZW5kaW5nSGVhcnRiZWF0OiBQcm9taXNlPHZvaWQ+ID0gbm9vcEFzeW5jKCk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBpZiAobm93IC0gbGFzdEhlYXJ0YmVhdEF0IDwgSEVBUlRCRUFUX1RIUk9UVExFX0lOX01JTExJU0VDT05EUykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsYXN0SGVhcnRiZWF0QXQgPSBub3c7XG4gICAgICBwZW5kaW5nSGVhcnRiZWF0ID0gcGVuZGluZ0hlYXJ0YmVhdC50aGVuKCgpID0+IHRoaXMuaGVhcnRiZWF0KCkpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcmVmcmVzaCB0aGUgYnVsayBvcGVyYXRpb24gbG9jayBoZWFydGJlYXQnLCBlcnJvcik7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kTmV4dE9wZXJhdGlvbklkKHVzZWRPcGVyYXRpb25JZD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgLy8gYC0tYWxsYCBhbHNvIHJlYWRzIGEgcmVwb3NpdG9yeSB3aXRoIG5vIGNvbW1pdCB5ZXQsIHdoZXJlIGEgcGxhaW4gYGdpdCBsb2dgIGZhaWxzLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuR2l0KHtcbiAgICAgIGdpdEFyZ3VtZW50czogWydsb2cnLCAnLS1hbGwnLCAnLS1mb3JtYXQ9JXMnLCAnLS1leHRlbmRlZC1yZWdleHAnLCAnLS1ncmVwPV4oY2hvcmU6IGJlZm9yZSApP09QWzAtOV0rJ11cbiAgICB9KTtcbiAgICAvLyBBIHJlY292ZXJlZCBvcGVyYXRpb24gdGhhdCBjaGFuZ2VkIG5vdGhpbmcgeWV0IGxlZnQgbm8gY29tbWl0IG5hbWluZyBpdHMgaWQsIHNvIGl0IGlzIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICAgIHJldHVybiBnZXROZXh0T3BlcmF0aW9uSWQoWy4uLnJlc3VsdC5zdGRvdXQuc3BsaXQoL1xccj9cXG4vKSwgdXNlZE9wZXJhdGlvbklkID8/ICcnXSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGhlYXJ0YmVhdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGlmICghbG9jayB8fCAhdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy53cml0ZUxvY2soeyAuLi5sb2NrLCBoZWFydGJlYXRBdDogRGF0ZS5ub3coKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNPd25Mb2NrKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMub3duTG9jayAhPT0gbnVsbFxuICAgICAgJiYgbG9jay5ob3N0ID09PSB0aGlzLm93bkxvY2suaG9zdFxuICAgICAgJiYgbG9jay5wcm9jZXNzSWQgPT09IHRoaXMub3duTG9jay5wcm9jZXNzSWRcbiAgICAgICYmIGxvY2suc3RhcnRlZEF0ID09PSB0aGlzLm93bkxvY2suc3RhcnRlZEF0O1xuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YWxlKGxvY2s6IEJ1bGtPcGVyYXRpb25Mb2NrKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzQnVsa09wZXJhdGlvbkxvY2tTdGFsZShsb2NrLCB7XG4gICAgICBib290ZWRBdDogRGF0ZS5ub3coKSAtIHVwdGltZSgpICogTUlMTElTRUNPTkRTX0lOX1NFQ09ORCxcbiAgICAgIGhvc3Q6IGhvc3RuYW1lKCksXG4gICAgICBpc1Byb2Nlc3NBbGl2ZSxcbiAgICAgIG5vdzogRGF0ZS5ub3coKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkTG9jaygpOiBQcm9taXNlPEJ1bGtPcGVyYXRpb25Mb2NrIHwgbnVsbD4ge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHRleHQgPSBhd2FpdCByZWFkRmlsZSh0aGlzLmxvY2tGaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YWx1ZTogdW5rbm93biA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgICBpZiAoaXNCdWxrT3BlcmF0aW9uTG9jayh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gVXBkYXRlcyBhcmUgYXRvbWljLCBidXQgYSBsb2NrIGJlaW5nIGNyZWF0ZWQgY2FuIGJlIHJlYWQgYmVmb3JlIGl0cyBjb250ZW50IGlzIHdyaXR0ZW4uIFRoZSBmaWxlJ3MgYWdlXG4gICAgICAvLyBzdGFuZHMgaW4gZm9yIHRoZSBoZWFydGJlYXQsIHNvIHN1Y2ggYSBsb2NrIHJlYWRzIGFzIGZyZXNoIGFuZCBhIGNvcnJ1cHQgb25lIGdvZXMgc3RhbGUgbGlrZSBhbnkgb3RoZXIuXG4gICAgfVxuICAgIGNvbnN0IGZpbGVTdGF0cyA9IGF3YWl0IHN0YXQodGhpcy5sb2NrRmlsZVBhdGgpO1xuICAgIHJldHVybiB7XG4gICAgICBoZWFydGJlYXRBdDogZmlsZVN0YXRzLm10aW1lTXMsXG4gICAgICBob3N0OiAnJyxcbiAgICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICAgIHBsdWdpbklkOiAnJyxcbiAgICAgIHByb2Nlc3NJZDogMCxcbiAgICAgIHByb2Nlc3NTdGFydGVkQXQ6IDAsXG4gICAgICBzdGFydGVkQXQ6IDBcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZnJlc2hlcyB0aGUgb3BlcmF0aW9uJ3MgbG9jayBiZWZvcmUgaXRzIGNvbW1pdCwgb3IgdGFrZXMgdGhlIGxvY2sgYWdhaW4gd2hlbiBpdCB3YXMgcmVjb3ZlcmVkIHVuZGVyIHRoZVxuICAgKiBvcGVyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZCAtIFRoZSBpZCB0aGUgb3BlcmF0aW9uIHN0YXJ0ZWQgdW5kZXIuXG4gICAqIEBwYXJhbSBwbHVnaW5JZCAtIFRoZSBpZCBvZiB0aGUgcGx1Z2luIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMgYG51bGxgIHdoZW4gdGhlIGxvY2sgaXMgc3RpbGwgdGhlIG9wZXJhdGlvbidzIG93biwgb3RoZXJ3aXNlIHRoZSBmcmVzaCBpZCB0aGUgcmVzdCBpcyBjb21taXR0ZWQgdW5kZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY2xhaW1Mb2NrSWZSZWNvdmVyZWQob3BlcmF0aW9uSWQ6IHN0cmluZywgcGx1Z2luSWQ6IHN0cmluZyk6IFByb21pc2U8bnVsbCB8IHN0cmluZz4ge1xuICAgIGNvbnN0IGxvY2sgPSBhd2FpdCB0aGlzLnJlYWRMb2NrKCk7XG4gICAgaWYgKGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jaykpIHtcbiAgICAgIGF3YWl0IHRoaXMud3JpdGVMb2NrKHsgLi4ubG9jaywgaGVhcnRiZWF0QXQ6IERhdGUubm93KCkgfSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKGBUaGUgYnVsayBvcGVyYXRpb24gbG9jayBvZiAke29wZXJhdGlvbklkfSB3YXMgcmVjb3ZlcmVkIHdoaWxlIGl0IHJhbjsgY29tbWl0dGluZyB0aGUgcmVzdCB1bmRlciBhIGZyZXNoIG9wZXJhdGlvbiBpZC5gKTtcbiAgICB0aGlzLm93bkxvY2sgPSBudWxsO1xuICAgIGF3YWl0IHRoaXMuYWNxdWlyZUxvY2soKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5hbGxvY2F0ZU9wZXJhdGlvbklkKHBsdWdpbklkLCBvcGVyYXRpb25JZCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlY292ZXIobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9wZXJhdGlvbklkID0gbG9jay5vcGVyYXRpb25JZCB8fCBhd2FpdCB0aGlzLmZpbmROZXh0T3BlcmF0aW9uSWQoKTtcbiAgICBhd2FpdCB0aGlzLmNvbW1pdE9wZXJhdGlvbih7IGlzSW50ZXJydXB0ZWQ6IHRydWUsIG9wZXJhdGlvbklkLCBwbHVnaW5JZDogbG9jay5wbHVnaW5JZCB8fCAndW5rbm93bicgfSk7XG4gICAgYXdhaXQgdW5saW5rKHRoaXMubG9ja0ZpbGVQYXRoKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGlmICghaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRU5PRU5UJykpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9wZXJhdGlvbklkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWxlYXNlTG9jaygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBsb2NrID0gYXdhaXQgdGhpcy5yZWFkTG9jaygpO1xuICAgIGNvbnN0IGlzT3duTG9jayA9IGxvY2sgIT09IG51bGwgJiYgdGhpcy5pc093bkxvY2sobG9jayk7XG4gICAgdGhpcy5vd25Mb2NrID0gbnVsbDtcbiAgICBpZiAoIWlzT3duTG9jaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdCB1bmxpbmsodGhpcy5sb2NrRmlsZVBhdGgpLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgaWYgKCFpc0Vycm9yV2l0aENvZGUoZXJyb3IsICdFTk9FTlQnKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuR2l0KHBhcmFtczogQnVsa09wZXJhdGlvbkdpdFJlcG9SdW5HaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgICBjb25zdCBhbGxvd2VkRXhpdENvZGVzID0gcGFyYW1zLmFsbG93ZWRFeGl0Q29kZXMgPz8gWzBdO1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOzsgYXR0ZW1wdCsrKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjR2l0KHsgY3dkOiB0aGlzLndvcmtpbmdEaXJlY3RvcnksIGdpdEFyZ3VtZW50czogcGFyYW1zLmdpdEFyZ3VtZW50cyB9KTtcbiAgICAgIGlmIChhbGxvd2VkRXhpdENvZGVzLmluY2x1ZGVzKHJlc3VsdC5leGl0Q29kZSkpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGlmIChhdHRlbXB0IDwgSU5ERVhfTE9DS19SRVRSWV9DT1VOVCAmJiByZXN1bHQuc3RkZXJyLmluY2x1ZGVzKCdpbmRleC5sb2NrJykpIHtcbiAgICAgICAgYXdhaXQgc2V0VGltZW91dEFzeW5jKElOREVYX0xPQ0tfUkVUUllfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgR2l0Q29tbWFuZEVycm9yKHBhcmFtcy5naXRBcmd1bWVudHMsIHJlc3VsdC5leGl0Q29kZSwgcmVzdWx0LnN0ZGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFnZUFsbCgpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGF3YWl0IHRoaXMucnVuR2l0KHsgZ2l0QXJndW1lbnRzOiBbJ2FkZCcsICctLWFsbCcsICctLScsICcuJ10gfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW5HaXQoeyBnaXRBcmd1bWVudHM6IFsnZGlmZicsICctLWNhY2hlZCcsICctLW5hbWUtb25seScsICcteicsICctLScsICcuJ10gfSk7XG4gICAgcmV0dXJuIHJlc3VsdC5zdGRvdXQuc3BsaXQoJ1xcMCcpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRyeUNyZWF0ZUxvY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9jayA9IGNyZWF0ZUxvY2tSZWNvcmQoKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKHRoaXMubG9ja0ZpbGVQYXRoLCBKU09OLnN0cmluZ2lmeShsb2NrKSwgeyBmbGFnOiAnd3gnIH0pO1xuICAgICAgdGhpcy5vd25Mb2NrID0gbG9jaztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRUVYSVNUJykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUxvY2sobG9jazogQnVsa09wZXJhdGlvbkxvY2spOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBXcml0dGVuIGJlc2lkZSB0aGUgbG9jayBhbmQgcmVuYW1lZCBvdmVyIGl0LCBzbyBhIHJlYWRlciBuZXZlciBzZWVzIGEgaGFsZi13cml0dGVuIGhlYXJ0YmVhdC5cbiAgICBjb25zdCB0ZW1wb3JhcnlQYXRoID0gYCR7dGhpcy5sb2NrRmlsZVBhdGh9LiR7U3RyaW5nKGxvY2sucHJvY2Vzc0lkKX0udG1wYDtcbiAgICBhd2FpdCB3cml0ZUZpbGUodGVtcG9yYXJ5UGF0aCwgSlNPTi5zdHJpbmdpZnkobG9jaykpO1xuICAgIGF3YWl0IHJlbmFtZSh0ZW1wb3JhcnlQYXRoLCB0aGlzLmxvY2tGaWxlUGF0aCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gd2hlbiBhIGBnaXRgIGNvbW1hbmQgZmFpbHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBHaXRDb21tYW5kRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gZ2l0QXJndW1lbnRzIC0gVGhlIGFyZ3VtZW50cyBgZ2l0YCB3YXMgcnVuIHdpdGguXG4gICAqIEBwYXJhbSBleGl0Q29kZSAtIFRoZSBleGl0IGNvZGUuXG4gICAqIEBwYXJhbSBzdGRlcnIgLSBXaGF0IGBnaXRgIHByaW50ZWQgdG8gc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBnaXRBcmd1bWVudHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBwdWJsaWMgcmVhZG9ubHkgZXhpdENvZGU6IG51bWJlciwgcHVibGljIHJlYWRvbmx5IHN0ZGVycjogc3RyaW5nKSB7XG4gICAgc3VwZXIoYGdpdCAke2dpdEFyZ3VtZW50cy5qb2luKCcgJyl9IGZhaWxlZCB3aXRoIGV4aXQgY29kZSAke1N0cmluZyhleGl0Q29kZSl9OiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgdGhpcy5uYW1lID0gJ0dpdENvbW1hbmRFcnJvcic7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlTG9ja1JlY29yZCgpOiBCdWxrT3BlcmF0aW9uTG9jayB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgaGVhcnRiZWF0QXQ6IG5vdyxcbiAgICBob3N0OiBob3N0bmFtZSgpLFxuICAgIG9wZXJhdGlvbklkOiAnJyxcbiAgICBwbHVnaW5JZDogJycsXG4gICAgcHJvY2Vzc0lkOiBwcm9jZXNzLnBpZCxcbiAgICBwcm9jZXNzU3RhcnRlZEF0OiBnZXRQcm9jZXNzU3RhcnRlZEF0KCksXG4gICAgc3RhcnRlZEF0OiBub3dcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY0dpdChwYXJhbXM6IEV4ZWNHaXRQYXJhbXMpOiBQcm9taXNlPEdpdENvbW1hbmRSZXN1bHQ+IHtcbiAgcmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBleGVjRmlsZSgnZ2l0JywgWy4uLnBhcmFtcy5naXRBcmd1bWVudHNdLCB7IGN3ZDogcGFyYW1zLmN3ZCwgbWF4QnVmZmVyOiBNQVhfQlVGRkVSX0lOX0JZVEVTLCB3aW5kb3dzSGlkZTogdHJ1ZSB9LCAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yLmNvZGUgIT09ICdudW1iZXInKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gZ2l0ICR7cGFyYW1zLmdpdEFyZ3VtZW50cy5qb2luKCcgJyl9YCwgeyBjYXVzZTogZXJyb3IgfSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICByZXNvbHZlKHsgZXhpdENvZGU6IHR5cGVvZiBlcnJvcj8uY29kZSA9PT0gJ251bWJlcicgPyBlcnJvci5jb2RlIDogMCwgc3RkZXJyLCBzdGRvdXQgfSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRQcm9jZXNzU3RhcnRlZEF0KCk6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4pO1xufVxuXG5mdW5jdGlvbiBpc0Vycm9yV2l0aENvZGUoZXJyb3I6IHVua25vd24sIGNvZGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiBlcnJvciAhPT0gbnVsbCAmJiAnY29kZScgaW4gZXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gY29kZTtcbn1cblxuZnVuY3Rpb24gaXNQcm9jZXNzQWxpdmUocHJvY2Vzc0lkOiBudW1iZXIpOiBib29sZWFuIHwgbnVsbCB7XG4gIGlmIChwcm9jZXNzSWQgPD0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzSWQsIDApO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiAhaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVNSQ0gnKSAmJiAoaXNFcnJvcldpdGhDb2RlKGVycm9yLCAnRVBFUk0nKSB8fCBudWxsKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFnQkEsbUJBQWdDO0FBQ2hDLHNCQUEwQjtBQUMxQixxQkFBNkI7QUFDN0IseUJBQWtDO0FBQ2xDLGdDQUF5QjtBQUN6QixzQkFNTztBQUNQLHFCQUdPO0FBQ1AsdUJBQXFCO0FBT3JCLHFDQUFzRDtBQUN0RCw0QkFTTztBQThHUCxNQUFNLDRDQUE0QztBQUNsRCxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHlDQUF5QztBQUMvQyxNQUFNLHFDQUFxQztBQUMzQyxNQUFNLHNCQUFzQjtBQUM1QixNQUFNLHlCQUF5QjtBQUMvQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLDhCQUE4QjtBQUNwQyxNQUFNLGlCQUFpQjtBQXNCaEIsTUFBTSxxQkFBcUI7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUloQjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0E7QUFBQSxFQUVDO0FBQUEsRUFDQTtBQUFBLEVBQ1QsVUFBb0M7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPckMsWUFBWSxRQUErQztBQUNoRSxTQUFLLGVBQWUsT0FBTztBQUMzQixTQUFLLG1CQUFtQixPQUFPO0FBQy9CLFNBQUssZ0NBQWdDLE9BQU8saUNBQWlD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
|
|
@@ -74,6 +74,13 @@ export interface GitBulkOperationResult<T> {
|
|
|
74
74
|
* The operation id, such as `OP12`.
|
|
75
75
|
*/
|
|
76
76
|
readonly operationId: string;
|
|
77
|
+
/**
|
|
78
|
+
* The id the operation started under, when its lock was recovered as stale while it ran, or `null` otherwise.
|
|
79
|
+
*
|
|
80
|
+
* The changes made before the recovery are in the `<recoveredOperationId> interrupted` commit, and the rest went into
|
|
81
|
+
* a fresh {@link operationId}, so undoing the whole operation takes reverting both.
|
|
82
|
+
*/
|
|
83
|
+
readonly recoveredOperationId: null | string;
|
|
77
84
|
/**
|
|
78
85
|
* The operation's result.
|
|
79
86
|
*/
|
|
@@ -155,9 +162,13 @@ export declare class BulkOperationGitRepo {
|
|
|
155
162
|
* follow-ups to settle, commits the result as `OP<n>: <summary>` and releases the lock. An operation that throws
|
|
156
163
|
* still gets its partial changes committed, as `OP<n> interrupted`, before the error is rethrown.
|
|
157
164
|
*
|
|
165
|
+
* When the lock was recovered under the operation (it went stale, and another operation, the scheduled autocommit or
|
|
166
|
+
* a reload committed `OP<n> interrupted` and removed it), the rest is never committed under the recovered id: the
|
|
167
|
+
* lock is taken again and the rest is committed as a fresh `OP<m>` whose summary names `OP<n>`.
|
|
168
|
+
*
|
|
158
169
|
* @typeParam T - The type of the operation's result.
|
|
159
170
|
* @param params - The parameters.
|
|
160
|
-
* @returns The operation's result, its id
|
|
171
|
+
* @returns The operation's result, its id, the hash of its commit and the id it lost to a recovery, if any.
|
|
161
172
|
*/
|
|
162
173
|
runBulkOperation<T>(params: BulkOperationGitRepoRunBulkOperationParams<T>): Promise<GitBulkOperationResult<T>>;
|
|
163
174
|
private acquireLock;
|
|
@@ -171,6 +182,15 @@ export declare class BulkOperationGitRepo {
|
|
|
171
182
|
private isOwnLock;
|
|
172
183
|
private isStale;
|
|
173
184
|
private readLock;
|
|
185
|
+
/**
|
|
186
|
+
* Refreshes the operation's lock before its commit, or takes the lock again when it was recovered under the
|
|
187
|
+
* operation.
|
|
188
|
+
*
|
|
189
|
+
* @param operationId - The id the operation started under.
|
|
190
|
+
* @param pluginId - The id of the plugin running the operation.
|
|
191
|
+
* @returns `null` when the lock is still the operation's own, otherwise the fresh id the rest is committed under.
|
|
192
|
+
*/
|
|
193
|
+
private reclaimLockIfRecovered;
|
|
174
194
|
private recover;
|
|
175
195
|
private releaseLock;
|
|
176
196
|
private runGit;
|
|
@@ -91,7 +91,7 @@ __export(generated_during_build_exports, {
|
|
|
91
91
|
LIBRARY_VERSION: () => LIBRARY_VERSION
|
|
92
92
|
});
|
|
93
93
|
module.exports = __toCommonJS(generated_during_build_exports);
|
|
94
|
-
const LIBRARY_VERSION = "10.5.
|
|
94
|
+
const LIBRARY_VERSION = "10.5.1";
|
|
95
95
|
const LIBRARY_STYLES = ".obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component pre, .obsidian-lib.code-highlighter-component code {\n font-family: var(--font-monospace);\n line-height: var(--line-height-normal);\n margin: 0;\n}\n.obsidian-lib.code-highlighter-component textarea, .obsidian-lib.code-highlighter-component code {\n font-size: var(--code-size);\n}\n.obsidian-lib.code-highlighter-component textarea {\n background: transparent;\n color: transparent;\n z-index: 2;\n width: 20em;\n height: 10em;\n}\n.obsidian-lib.code-highlighter-component pre {\n position: absolute;\n pointer-events: none;\n border: var(--input-border-width) solid transparent;\n overflow: auto;\n inset: 0;\n padding: var(--size-4-1) var(--size-4-2);\n z-index: 1;\n}\n.obsidian-lib.code-highlighter-component pre::after {\n content: \"\";\n display: block;\n height: var(--bottom-gap, 0);\n}\n.obsidian-lib.code-highlighter-component pre.is-placeholder {\n opacity: 0.6;\n}\n.obsidian-lib.code-highlighter-component code {\n display: block;\n padding: 0;\n}\n\n.obsidian-lib-lock-indicator {\n display: inline-flex;\n align-items: center;\n color: var(--text-muted);\n}\n.obsidian-lib-lock-indicator .svg-icon {\n width: var(--icon-s);\n height: var(--icon-s);\n}\n\n@keyframes obsidian-lib-lock-indicator-flash {\n 40% {\n color: var(--text-error);\n transform: scale(1.4);\n }\n}\n.obsidian-lib-lock-indicator-flash {\n animation: obsidian-lib-lock-indicator-flash 0.35s ease-in-out;\n}\n\n.obsidian-lib input[type=url] {\n height: var(--input-height);\n}\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=tel],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=url],\n.obsidian-lib input[type=week] {\n -webkit-app-region: no-drag;\n background: var(--background-modifier-form-field);\n border: var(--input-border-width) solid var(--background-modifier-border);\n color: var(--text-normal);\n font-family: inherit;\n padding: var(--size-4-1) var(--size-4-2);\n font-size: var(--font-ui-small);\n border-radius: var(--input-radius);\n outline: none;\n}\n@media (hover: hover) {\n .obsidian-lib input[type=month]:hover,\n .obsidian-lib input[type=tel]:hover,\n .obsidian-lib input[type=time]:hover,\n .obsidian-lib input[type=url]:hover,\n .obsidian-lib input[type=week]:hover {\n border-color: var(--background-modifier-border-hover);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n }\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus {\n border-color: var(--background-modifier-border-focus);\n transition: box-shadow 0.15s ease-in-out, border 0.15s ease-in-out;\n}\n.obsidian-lib input[type=month]:active, .obsidian-lib input[type=month]:focus, .obsidian-lib input[type=month]:focus-visible,\n.obsidian-lib input[type=tel]:active,\n.obsidian-lib input[type=tel]:focus,\n.obsidian-lib input[type=tel]:focus-visible,\n.obsidian-lib input[type=time]:active,\n.obsidian-lib input[type=time]:focus,\n.obsidian-lib input[type=time]:focus-visible,\n.obsidian-lib input[type=url]:active,\n.obsidian-lib input[type=url]:focus,\n.obsidian-lib input[type=url]:focus-visible,\n.obsidian-lib input[type=week]:active,\n.obsidian-lib input[type=week]:focus,\n.obsidian-lib input[type=week]:focus-visible {\n box-shadow: 0 0 0 2px var(--background-modifier-border-focus);\n}\n.obsidian-lib input[type=month]::placeholder,\n.obsidian-lib input[type=tel]::placeholder,\n.obsidian-lib input[type=time]::placeholder,\n.obsidian-lib input[type=url]::placeholder,\n.obsidian-lib input[type=week]::placeholder {\n color: var(--text-faint);\n}\n.mod-rtl input[type=month],\n.mod-rtl input[type=time],\n.mod-rtl input[type=week],\n.is-rtl input[type=month],\n.is-rtl input[type=time],\n.is-rtl input[type=week],\n.rtl input[type=month],\n.rtl input[type=time],\n.rtl input[type=week] {\n direction: rtl;\n}\n.mod-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=month]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl input[type=week]::-webkit-calendar-picker-indicator,\n.rtl input[type=month]::-webkit-calendar-picker-indicator,\n.rtl input[type=time]::-webkit-calendar-picker-indicator,\n.rtl input[type=week]::-webkit-calendar-picker-indicator {\n right: var(--size-4-1);\n left: auto;\n}\n\n.obsidian-lib input[type=month],\n.obsidian-lib input[type=time],\n.obsidian-lib input[type=week] {\n font-variant-numeric: tabular-nums;\n position: relative;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-text,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-text {\n color: var(--text-faint);\n padding-inline-end: 0;\n}\n.obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n position: absolute;\n left: var(--size-4-1);\n right: auto;\n opacity: 0.5;\n}\n.obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-month-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-day-field:focus, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:active, .obsidian-lib input[type=month]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=time]::-webkit-datetime-edit-year-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-month-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-day-field:focus,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:active,\n.obsidian-lib input[type=week]::-webkit-datetime-edit-year-field:focus {\n background-color: var(--text-selection);\n color: var(--text-normal);\n cursor: text;\n}\n.mod-rtl .obsidian-lib input[type=month], .is-rtl .obsidian-lib input[type=month], .rtl .obsidian-lib input[type=month],\n.mod-rtl .obsidian-lib input[type=time],\n.is-rtl .obsidian-lib input[type=time],\n.rtl .obsidian-lib input[type=time],\n.mod-rtl .obsidian-lib input[type=week],\n.is-rtl .obsidian-lib input[type=week],\n.rtl .obsidian-lib input[type=week] {\n direction: rtl;\n}\n.mod-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .is-rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator, .rtl .obsidian-lib input[type=month]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=time]::-webkit-calendar-picker-indicator,\n.mod-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.is-rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator,\n.rtl .obsidian-lib input[type=week]::-webkit-calendar-picker-indicator {\n left: auto;\n right: var(--size-4-1);\n}\n\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=month],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=time],\nbody:not(.is-ios):not(.is-android) .obsidian-lib input[type=week] {\n padding-inline-start: var(--size-4-6);\n}\n\n.obsidian-lib input[type=time]::-webkit-calendar-picker-indicator {\n margin-inline-start: 0;\n}\n\nprogress.obsidian-lib.loop {\n min-width: 200px;\n}\n\n@keyframes obsidian-lib-minimized-modal-bar-pulse {\n 0%, 100% {\n box-shadow: var(--shadow-s);\n }\n 50% {\n box-shadow: 0 0 0 2px var(--interactive-accent);\n }\n}\n@keyframes obsidian-lib-minimized-modal-bar-attention {\n 0% {\n box-shadow: 0 0 0 0 var(--interactive-accent);\n }\n 40% {\n box-shadow: 0 0 0 4px var(--interactive-accent);\n }\n 100% {\n box-shadow: var(--shadow-s);\n }\n}\n.obsidian-lib.minimizable-modal .minimize-button {\n position: absolute;\n top: var(--size-4-2);\n right: calc(var(--size-4-2) + var(--size-4-9));\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimizable-modal .minimize-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n.obsidian-lib.minimized-modal-bar {\n position: fixed;\n right: var(--size-4-4);\n bottom: calc(var(--size-4-4) + var(--size-4-8));\n z-index: var(--layer-modal);\n display: flex;\n align-items: center;\n gap: var(--size-4-2);\n padding: var(--size-4-2) var(--size-4-3);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-m);\n background: var(--background-secondary);\n box-shadow: var(--shadow-s);\n cursor: pointer;\n animation: obsidian-lib-minimized-modal-bar-pulse 2s ease-in-out infinite;\n}\n.obsidian-lib.minimized-modal-bar:hover {\n background-image: linear-gradient(var(--background-modifier-hover), var(--background-modifier-hover));\n}\n.obsidian-lib.minimized-modal-bar.minimized-modal-bar-attention {\n animation: obsidian-lib-minimized-modal-bar-attention 0.35s ease-out;\n}\n.obsidian-lib.minimized-modal-bar .minimized-modal-bar-title {\n font-weight: var(--font-medium);\n}\n.obsidian-lib.minimized-modal-bar .restore-button,\n.obsidian-lib.minimized-modal-bar .cancel-button {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--size-2-2);\n border: none;\n border-radius: var(--radius-s);\n background: transparent;\n color: var(--icon-color);\n cursor: pointer;\n box-shadow: none;\n}\n.obsidian-lib.minimized-modal-bar .restore-button:hover,\n.obsidian-lib.minimized-modal-bar .cancel-button:hover {\n background: var(--background-modifier-hover);\n color: var(--icon-color-hover);\n}\n\n.obsidian-lib.modal-commands {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-2-2);\n padding: var(--size-4-2) var(--size-4-3);\n border-top: 1px solid var(--background-modifier-border);\n}\n.obsidian-lib.modal-command-control {\n margin-inline-start: var(--size-2-2);\n vertical-align: middle;\n}\n.obsidian-lib.modal-command {\n display: inline-flex;\n align-items: baseline;\n gap: var(--size-2-2);\n min-height: var(--size-4-8);\n padding: var(--size-2-1) var(--size-4-2);\n border: 1px solid var(--background-modifier-border);\n border-radius: var(--radius-s);\n background-color: var(--background-secondary);\n color: var(--text-muted);\n font-size: var(--font-ui-smaller);\n white-space: nowrap;\n cursor: pointer;\n}\n.obsidian-lib.modal-command:hover:not(:disabled):not(.is-active) {\n background-color: var(--background-modifier-hover);\n color: var(--text-normal);\n}\n.obsidian-lib.modal-command.is-active {\n border-color: var(--interactive-accent);\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n.obsidian-lib.modal-command:disabled {\n opacity: 0.5;\n cursor: default;\n}\n.obsidian-lib.modal-command-hotkey {\n color: var(--text-faint);\n font-size: var(--font-smallest);\n}\n.modal-command.is-active .obsidian-lib.modal-command-hotkey {\n opacity: 0.7;\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.modal-container .ok-button {\n margin-right: 10px;\n margin-top: 20px;\n}\n\n.obsidian-lib.multiple-dropdown-component select,\n.obsidian-lib.multiple-dropdown-component select:focus,\n.obsidian-lib.multiple-dropdown-component .dropdown {\n height: auto;\n padding-top: 3px;\n}\n.obsidian-lib.multiple-dropdown-component select option:checked,\n.obsidian-lib.multiple-dropdown-component select:focus option:checked,\n.obsidian-lib.multiple-dropdown-component .dropdown option:checked {\n background-color: var(--interactive-accent);\n color: var(--text-on-accent);\n}\n\n.obsidian-lib.plugin-notice-name {\n color: var(--text-accent);\n display: inline-block;\n font-weight: var(--font-bold);\n margin-bottom: var(--size-4-2);\n}\n.obsidian-lib.plugin-notice-name code {\n color: inherit;\n}\n.obsidian-lib.plugin-notice-content {\n padding-right: var(--size-4-5);\n position: relative;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.cancel-button {\n display: block;\n margin-top: var(--size-4-2);\n width: fit-content;\n}\n.obsidian-lib.plugin-notice-content .obsidian-lib.plugin-notice-close-button {\n position: absolute;\n right: var(--size-4-3);\n top: var(--size-4-3);\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice {\n padding: 0;\n}\n.obsidian-lib.plugin-notice-requires-explicit-close.notice .obsidian-lib.plugin-notice-content {\n padding: var(--size-4-3) var(--size-4-4);\n}\n\n.obsidian-lib.plugin-settings-tab a:focus {\n outline: 2px solid var(--link-color);\n}\n\n.obsidian-lib.plugin-suggestion-banner {\n background-color: var(--background-secondary);\n border-left: var(--size-2-1) solid var(--text-accent);\n border-radius: var(--radius-s);\n display: flex;\n flex-direction: column;\n gap: var(--size-4-2);\n margin-bottom: var(--size-4-4);\n padding: var(--size-4-3) var(--size-4-4);\n}\n.obsidian-lib.plugin-suggestion-banner button {\n width: fit-content;\n}\n.obsidian-lib.plugin-suggestion-notice-buttons {\n display: flex;\n flex-wrap: wrap;\n gap: var(--size-4-2);\n margin-top: var(--size-4-2);\n}\n\n.obsidian-lib.popover {\n max-width: min(420px, 90vw);\n min-width: 320px;\n padding: var(--size-4-2) var(--size-4-3);\n position: absolute;\n z-index: var(--layer-menu);\n}\n.obsidian-lib.popover .setting-item {\n align-items: center;\n border-top: none;\n gap: var(--size-4-2);\n padding: var(--size-2-1) 0;\n}\n.obsidian-lib.popover .setting-item-info {\n margin-right: 0;\n}\n.obsidian-lib.popover .setting-item-control {\n flex-grow: 1;\n justify-content: flex-end;\n}\n.obsidian-lib.popover input[type=text] {\n width: 100%;\n}\n\n.obsidian-lib.prompt-modal .text-box {\n width: 100%;\n}\n\n.obsidian-lib button:not(.clickable-icon) {\n color: var(--text-color);\n}\n\n.obsidian-lib.tri-state-checkbox-component input[type=checkbox]:indeterminate {\n appearance: checkbox;\n}\n\n.obsidian-lib :invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib input.metadata-input-text:active:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus-visible:invalid:not(.untouched), .obsidian-lib input.metadata-input-text:focus:invalid:not(.untouched),\n.obsidian-lib input[type=date]:active:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=date]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:active:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=datetime-local]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=email]:active:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=email]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=number]:active:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=number]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=password]:active:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=password]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=search]:active:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=search]:focus:invalid:not(.untouched),\n.obsidian-lib input[type=text]:active:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus-visible:invalid:not(.untouched),\n.obsidian-lib input[type=text]:focus:invalid:not(.untouched),\n.obsidian-lib textarea:active:invalid:not(.untouched),\n.obsidian-lib textarea:focus-visible:invalid:not(.untouched),\n.obsidian-lib textarea:focus:invalid:not(.untouched) {\n box-shadow: 0 0 0 2px var(--text-error);\n}\n.obsidian-lib.setting-component-wrapper {\n position: relative;\n display: inline-flex;\n}\n.obsidian-lib.overlay-validator {\n caret-color: transparent;\n cursor: default;\n position: absolute;\n background-color: transparent;\n border: none;\n outline: none;\n pointer-events: none;\n z-index: 9999;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n}\n.obsidian-lib.tooltip.tooltip-validator {\n position: absolute;\n top: calc(100% + 8px);\n width: max-content;\n}\n\n/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22../src/styles/code-highlighter-component.scss%22,%22../src/styles/editor-lock.scss%22,%22../src/styles/input.scss%22,%22../src/styles/input-time.scss%22,%22../src/styles/loop.scss%22,%22../src/styles/minimizable-modal.scss%22,%22../src/styles/modal-commands.scss%22,%22../src/styles/modal-container.scss%22,%22../src/styles/multiple-dropdown-component.scss%22,%22../src/styles/plugin-notice.scss%22,%22../src/styles/plugin-settings-tab.scss%22,%22../src/styles/plugin-suggestion.scss%22,%22../src/styles/popover.scss%22,%22../src/styles/prompt-modal.scss%22,%22../src/styles/tldraw-button-color-workaround.scss%22,%22../src/styles/tri-state-checkbox-component.scss%22,%22../src/styles/validation.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22AAEI;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;;ACvCN;EACE;EACA;EACA;;AAEA;EACE;EACA;;;AAMJ;EACE;IACE;IACA;;;AAIJ;EACE;;;ACvBA;EACE;;AAGF;AAAA;AAAA;AAAA;AAAA;EAKE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGE;EACE;AAAA;AAAA;AAAA;AAAA;IACE;IACA,YACE;;;AAMR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA,YACE;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAGF;AAAA;AAAA;AAAA;AAAA;EACE;;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGE;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AC7DV;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;AAGF;AAAA;AAAA;EACE;EACA;EACA;EACA;;AAMA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEE;EACA;EACA;;AAIK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGP;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACE;EACA;;;AAKF;AAAA;AAAA;EACE;;;AAMJ;EACE;;;AC/CK;EACP;;;ACJJ;EACE;IAEE;;EAGF;IACE;;;AAIJ;EACE;IACE;;EAGF;IACE;;EAGF;IACE;;;AAOA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AASN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAOA;EACE;;AAOF;EACE;;AAGF;EACE;;AAGF;AAAA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACE;EACA;;;ACpGN;EACE;EACA;EACA;EACA;EACA;;AAOF;EACE;EACA;;AAMF;EACE;EACA;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAKF;EACE;EACA;EACA;;AAKF;EACE;EACA;;AAIJ;EACE;EACA;;AAGA;EACE;EACA;;;ACrEF;EACE;EACA;;;ACCF;AAAA;AAAA;EAGE;EACA;;AAEA;AAAA;AAAA;EACE;EACA;;;ACZN;EACE;EACA;EACA;EACA;;AAGA;EACE;;AAIJ;EACE;EACA;;AAEA;EACE;EACA;EACA;;AAKF;EACE;EACA;EACA;;AAOJ;EACE;;AAEA;EACE;;;ACrCF;EACE;;;ACFJ;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAKJ;EACE;EACA;EACA;EACA;;;ACjBF;EAIE;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;EACA;EACA;;AAGF;EACE;;AAGF;EACE;EACA;;AAGF;EACE;;;AC9BF;EACE;;;ACUN;EACE;;;ACZE;EACE;;;ACKJ;EAPA;;AAuBI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAvBJ;;AA6BA;EACE;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA%22,%22file%22:%22styles.css%22,%22sourcesContent%22:%5B%22.obsidian-lib%20%7B%5Cn%20%20&.code-highlighter-component%20%7B%5Cn%20%20%20%20textarea,%20pre,%20code%20%7B%5Cn%20%20%20%20%20%20font-family:%20var(--font-monospace);%5Cn%20%20%20%20%20%20line-height:%20var(--line-height-normal);%5Cn%20%20%20%20%20%20margin:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea,%20code%20%7B%5Cn%20%20%20%20%20%20font-size:%20var(--code-size);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20textarea%20%7B%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20transparent;%5Cn%20%20%20%20%20%20z-index:%202;%5Cn%20%20%20%20%20%20width:%2020em;%5Cn%20%20%20%20%20%20height:%2010em;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20%20%20border:%20var(--input-border-width)%20solid%20transparent;%5Cn%20%20%20%20%20%20overflow:%20auto;%5Cn%20%20%20%20%20%20inset:%200;%5Cn%20%20%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20%20%20z-index:%201;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre::after%20%7B%5Cn%20%20%20%20%20%20content:%20%5C%22%5C%22;%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20height:%20var(--bottom-gap,%200);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20pre.is-placeholder%20%7B%5Cn%20%20%20%20%20%20opacity:%200.6;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20padding:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20Lock%20indicators%20shown%20in%20the%20tab%20header%20and%20the%20status%20bar%20while%20a%20note%20is%20locked.%20These%20live%20in%5Cn//%20global%20Obsidian%20DOM%20(tab%20header%20/%20status%20bar),%20so%20they%20are%20styled%20with%20a%20global%20class%20rather%20than%5Cn//%20scoped%20under%20%60.obsidian-lib%60.%5Cn.obsidian-lib-lock-indicator%20%7B%5Cn%20%20display:%20inline-flex;%5Cn%20%20align-items:%20center;%5Cn%20%20color:%20var(--text-muted);%5Cn%5Cn%20%20.svg-icon%20%7B%5Cn%20%20%20%20width:%20var(--icon-s);%5Cn%20%20%20%20height:%20var(--icon-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn//%20Flashed%20on%20every%20lock%20indicator%20(tab%20header,%20view%20action,%20status%20bar)%20when%20the%20user%20attempts%20to%5Cn//%20type%20in%20a%20locked%20note,%20to%20make%20clear%20the%20note%20is%20read-only.%20Re-added%20per%20rejected%20keystroke.%5Cn@keyframes%20obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20color:%20var(--text-error);%5Cn%20%20%20%20transform:%20scale(1.4);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib-lock-indicator-flash%20%7B%5Cn%20%20animation:%20obsidian-lib-lock-indicator-flash%200.35s%20ease-in-out;%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='url'%5D%20%7B%5Cn%20%20%20%20height:%20var(--input-height)%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='tel'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='url'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20-webkit-app-region:%20no-drag;%5Cn%20%20%20%20background:%20var(--background-modifier-form-field);%5Cn%20%20%20%20border:%20var(--input-border-width)%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20font-family:%20inherit;%5Cn%20%20%20%20padding:%20var(--size-4-1)%20var(--size-4-2);%5Cn%20%20%20%20font-size:%20var(--font-ui-small);%5Cn%20%20%20%20border-radius:%20var(--input-radius);%5Cn%20%20%20%20outline:%20none;%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20@media%20(hover:%20hover)%20%7B%5Cn%20%20%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20border-color:%20var(--background-modifier-border-hover);%5Cn%20%20%20%20%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%20%20transition:%5Cn%20%20%20%20%20%20%20%20box-shadow%200.15s%20ease-in-out,%5Cn%20%20%20%20%20%20%20%20border%200.15s%20ease-in-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus,%5Cn%20%20%20%20&:focus-visible%20%7B%5Cn%20%20%20%20%20%20box-shadow:%200%200%200%202px%20var(--background-modifier-border-focus);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::placeholder%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20@at-root%20%7B%5Cn%20%20%20%20.mod-rtl,%5Cn%20%20%20%20.is-rtl,%5Cn%20%20%20%20.rtl%20%7B%5Cn%20%20%20%20%20%20&%20%7B%5Cn%20%20%20%20%20%20%20%20input%5Btype='month'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='time'%5D,%5Cn%20%20%20%20%20%20%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%20%20%7D%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20input%5Btype='month'%5D,%5Cn%20%20input%5Btype='time'%5D,%5Cn%20%20input%5Btype='week'%5D%20%7B%5Cn%20%20%20%20font-variant-numeric:%20tabular-nums;%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-text%20%7B%5Cn%20%20%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20%20%20padding-inline-end:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20left:%20var(--size-4-1);%5Cn%20%20%20%20%20%20right:%20auto;%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20&::-webkit-datetime-edit-month-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-day-field,%5Cn%20%20%20%20&::-webkit-datetime-edit-year-field%20%7B%5Cn%20%20%20%20%20%20&:active,%5Cn%20%20%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--text-selection);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%20%20%20%20cursor:%20text;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20.mod-rtl%20&,%5Cn%20%20%20%20%20%20.is-rtl%20&,%5Cn%20%20%20%20%20%20.rtl%20&%20%7B%5Cn%20%20%20%20%20%20direction:%20rtl;%5Cn%5Cn%20%20%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20%20%20left:%20auto;%5Cn%20%20%20%20%20%20%20%20right:%20var(--size-4-1);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20@at-root%20%7B%5Cn%20%20%20%20%20%20body:not(.is-ios):not(.is-android)%20&%20%7B%5Cn%20%20%20%20%20%20%20%20padding-inline-start:%20var(--size-4-6);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20input%5Btype='time'%5D%20%7B%5Cn%20%20%20%20&::-webkit-calendar-picker-indicator%20%7B%5Cn%20%20%20%20%20%20margin-inline-start:%200;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Not%20%60&progress%60:%20that%20APPENDS%20the%20element%20name%20to%20the%20parent%20class,%20producing%20one%20long%20class%20that%20matches%5Cn%20%20//%20nothing.%20The%20element%20type%20has%20to%20lead%20the%20compound%20selector%20instead.%5Cn%20%20@at-root%20progress%23%7B&%7D.loop%20%7B%5Cn%20%20%20%20min-width:%20200px;%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@keyframes%20obsidian-lib-minimized-modal-bar-pulse%20%7B%5Cn%20%200%25,%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%5Cn%20%2050%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%202px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn@keyframes%20obsidian-lib-minimized-modal-bar-attention%20%7B%5Cn%20%200%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%200%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%2040%25%20%7B%5Cn%20%20%20%20box-shadow:%200%200%200%204px%20var(--interactive-accent);%5Cn%20%20%7D%5Cn%5Cn%20%20100%25%20%7B%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%7D%5Cn%7D%5Cn%5Cn.obsidian-lib%20%7B%5Cn%20%20//%20The%20minimize%20button%20lives%20inside%20the%20modal%20container,%20left%20of%20Obsidian's%20close%20button.%5Cn%20%20&.minimizable-modal%20%7B%5Cn%20%20%20%20.minimize-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20right:%20calc(var(--size-4-2)%20+%20var(--size-4-9));%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20The%20minimized%20bar%20is%20appended%20to%20document.body.%20It%20floats%20at%20the%20bottom-right%20while%20minimized,%5Cn%20%20//%20and%20gently%20pulses%20an%20accent%20ring%20so%20the%20user%20does%20not%20forget%20about%20the%20minimized%20operation.%5Cn%20%20//%20It%20floats%20a%20status-bar's%20height%20above%20the%20bottom%20edge%20so%20it%20never%20covers%20the%20bottom-right%5Cn%20%20//%20status-bar%20items%20(e.g.%20the%20editor-lock%20unlock%20indicator,%20which%20lives%20in%20the%20same%20corner).%5Cn%20%20&.minimized-modal-bar%20%7B%5Cn%20%20%20%20position:%20fixed;%5Cn%20%20%20%20right:%20var(--size-4-4);%5Cn%20%20%20%20bottom:%20calc(var(--size-4-4)%20+%20var(--size-4-8));%5Cn%20%20%20%20z-index:%20var(--layer-modal);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20align-items:%20center;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-m);%5Cn%20%20%20%20background:%20var(--background-secondary);%5Cn%20%20%20%20box-shadow:%20var(--shadow-s);%5Cn%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-pulse%202s%20ease-in-out%20infinite;%5Cn%5Cn%20%20%20%20//%20Layer%20the%20translucent%20hover%20tint%20over%20the%20opaque%20%60background%60%20(%60--background-secondary%60)%20via%5Cn%20%20%20%20//%20%60background-image%60%20instead%20of%20replacing%20the%20background-color.%20%60--background-modifier-hover%60%20is%5Cn%20%20%20%20//%20translucent,%20so%20setting%20it%20as%20%60background%60%20would%20let%20the%20editor%20content%20behind%20the%20floating%20bar%5Cn%20%20%20%20//%20bleed%20through%20and%20make%20the%20title%20unreadable.%20A%20gradient%20of%20the%20tint%20composited%20over%20the%20opaque%5Cn%20%20%20%20//%20base%20keeps%20the%20bar%20opaque%20while%20preserving%20the%20subtle%20hover%20highlight.%5Cn%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20background-image:%20linear-gradient(var(--background-modifier-hover),%20var(--background-modifier-hover));%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20one-shot,%20more%20pronounced%20flash%20played%20when%20the%20user%20attempts%20a%20blocked%20action%20(a%20keystroke,%5Cn%20%20%20%20//%20right-click,%20or%20opening%20another%20modal)%20while%20this%20modal%20is%20minimized,%20so%20the%20block%20is%20not%5Cn%20%20%20%20//%20silent.%20Its%20higher%20specificity%20overrides%20the%20gentle%20infinite%20idle%20pulse%20while%20it%20plays;%20the%5Cn%20%20%20%20//%20class%20is%20removed%20on%20%60animationend%60,%20restoring%20the%20idle%20pulse.%5Cn%20%20%20%20&.minimized-modal-bar-attention%20%7B%5Cn%20%20%20%20%20%20animation:%20obsidian-lib-minimized-modal-bar-attention%200.35s%20ease-out;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.minimized-modal-bar-title%20%7B%5Cn%20%20%20%20%20%20font-weight:%20var(--font-medium);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.restore-button,%5Cn%20%20%20%20.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20flex;%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20justify-content:%20center;%5Cn%20%20%20%20%20%20padding:%20var(--size-2-2);%5Cn%20%20%20%20%20%20border:%20none;%5Cn%20%20%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20%20%20background:%20transparent;%5Cn%20%20%20%20%20%20color:%20var(--icon-color);%5Cn%20%20%20%20%20%20cursor:%20pointer;%5Cn%20%20%20%20%20%20box-shadow:%20none;%5Cn%5Cn%20%20%20%20%20%20&:hover%20%7B%5Cn%20%20%20%20%20%20%20%20background:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20%20%20color:%20var(--icon-color-hover);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20The%20strip%20of%20commands%20along%20the%20bottom%20of%20a%20modal.%5Cn%20%20//%5Cn%20%20//%20In%20%60Instructions%60%20render%20mode%20it%20also%20carries%20Obsidian's%20own%20%60.prompt-instructions%60%20%E2%80%94%20whose%20rule%20is%5Cn%20%20//%20unscoped,%20so%20it%20applies%20to%20a%20plain%20%60Modal%60%20too%20%E2%80%94%20and%20this%20one%20only%20re-tunes%20that%20rule's%20%60gap%60%20and%5Cn%20%20//%20%60padding%60%20and%20adds%20the%20separator;%20in%20%60Buttons%60%20mode%20it%20is%20the%20whole%20strip.%5Cn%20%20&.modal-commands%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20border-top:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20control%20the%20%60Instructions%60%20renderer%20injects%20into%20an%20instruction's%20purpose%20text%20%E2%80%94%20a%20checkbox,%20a%5Cn%20%20//%20dropdown.%20Obsidian%20styles%20the%20instruction%20bar%20itself,%20but%20its%20own%20bar%20never%20contains%20a%20control,%20so%5Cn%20%20//%20nothing%20upstream%20separates%20one%20from%20the%20label%20it%20belongs%20to.%20Sits%20on%20the%20control%20rather%20than%20on%20the%5Cn%20%20//%20strip,%20so%20it%20reaches%20a%20%60SuggestModal%60's%20native%20bar%20as%20well%20as%20a%20self-created%20one.%5Cn%20%20&.modal-command-control%20%7B%5Cn%20%20%20%20margin-inline-start:%20var(--size-2-2);%5Cn%20%20%20%20vertical-align:%20middle;%5Cn%20%20%7D%5Cn%5Cn%20%20//%20One%20command%20button.%20Replaces%20the%20instruction%20bar%20rather%20than%20supplementing%20it:%20the%20bar%20can%20only%20ever%5Cn%20%20//%20say%20which%20key%20to%20press,%20and%20on%20a%20phone%20there%20is%20no%20modifier%20key%20to%20press,%20so%20every%20control%20it%20names%5Cn%20%20//%20is%20unreachable%20there.%5Cn%20%20&.modal-command%20%7B%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%20%20align-items:%20baseline;%5Cn%20%20%20%20gap:%20var(--size-2-2);%5Cn%5Cn%20%20%20%20//%20Comfortably%20tappable%20on%20a%20phone,%20where%20this%20strip%20is%20the%20only%20way%20in.%5Cn%20%20%20%20min-height:%20var(--size-4-8);%5Cn%20%20%20%20padding:%20var(--size-2-1)%20var(--size-4-2);%5Cn%20%20%20%20border:%201px%20solid%20var(--background-modifier-border);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20color:%20var(--text-muted);%5Cn%20%20%20%20font-size:%20var(--font-ui-smaller);%5Cn%20%20%20%20white-space:%20nowrap;%5Cn%20%20%20%20cursor:%20pointer;%5Cn%5Cn%20%20%20%20//%20Touch%20can%20leave%20:hover%20latched%20until%20the%20next%20tap.%20Keep%20the%20ON%20fill%20in%20that%20state%20too.%5Cn%20%20%20%20&:hover:not(:disabled):not(.is-active)%20%7B%5Cn%20%20%20%20%20%20background-color:%20var(--background-modifier-hover);%5Cn%20%20%20%20%20%20color:%20var(--text-normal);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20A%20toggle%20that%20is%20ON.%20An%20action%20never%20carries%20it%20%E2%80%94%20it%20does%20something%20and%20is%20done,%20so%20there%20is%20no%5Cn%20%20%20%20//%20state%20for%20it%20to%20show.%5Cn%20%20%20%20&.is-active%20%7B%5Cn%20%20%20%20%20%20border-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20Disabled%20rather%20than%20removed:%20a%20strip%20that%20lost%20buttons%20as%20modes%20change%20would%20reflow%20under%20the%5Cn%20%20%20%20//%20pointer,%20which%20on%20a%20phone%20means%20a%20mis-tap.%5Cn%20%20%20%20&:disabled%20%7B%5Cn%20%20%20%20%20%20opacity:%200.5;%5Cn%20%20%20%20%20%20cursor:%20default;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.modal-command-hotkey%20%7B%5Cn%20%20%20%20color:%20var(--text-faint);%5Cn%20%20%20%20font-size:%20var(--font-smallest);%5Cn%5Cn%20%20%20%20//%20Faint%20against%20the%20surface%20is%20right;%20faint%20against%20the%20accent%20fill%20is%20invisible.%5Cn%20%20%20%20.modal-command.is-active%20&%20%7B%5Cn%20%20%20%20%20%20opacity:%200.7;%5Cn%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.modal-container%20%7B%5Cn%20%20%20%20.ok-button%20%7B%5Cn%20%20%20%20%20%20margin-right:%2010px;%5Cn%20%20%20%20%20%20margin-top:%2020px;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20//%20Compound,%20not%20nested:%20%60addPluginCssClasses%60%20puts%20%60obsidian-lib%60%20and%20%60multiple-dropdown-component%60%20on%20the%5Cn%20%20//%20SAME%20element%20(the%20setting's%20control%20container),%20so%20a%20descendant%20selector%20matched%20nothing%20and%20every%20multiple%5Cn%20%20//%20dropdown%20rendered%20one%20row%20tall%20%E2%80%94%20Obsidian's%20%60.dropdown%60%20height,%20with%20no%20popup%20behind%20it%20to%20pick%20from.%5Cn%20%20&.multiple-dropdown-component%20%7B%5Cn%20%20%20%20select,%5Cn%20%20%20%20select:focus,%5Cn%20%20%20%20.dropdown%20%7B%5Cn%20%20%20%20%20%20height:%20auto;%5Cn%20%20%20%20%20%20padding-top:%203px;%5Cn%5Cn%20%20%20%20%20%20option:checked%20%7B%5Cn%20%20%20%20%20%20%20%20background-color:%20var(--interactive-accent);%5Cn%20%20%20%20%20%20%20%20color:%20var(--text-on-accent);%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-notice-name%20%7B%5Cn%20%20%20%20color:%20var(--text-accent);%5Cn%20%20%20%20display:%20inline-block;%5Cn%20%20%20%20font-weight:%20var(--font-bold);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-2);%5Cn%5Cn%20%20%20%20//%20The%20name%20is%20inline%20code;%20it%20keeps%20the%20code%20background%20and%20font%20but%20takes%20the%20prefix's%20accent%20color.%5Cn%20%20%20%20code%20%7B%5Cn%20%20%20%20%20%20color:%20inherit;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.plugin-notice-content%20%7B%5Cn%20%20%20%20padding-right:%20var(--size-4-5);%5Cn%20%20%20%20position:%20relative;%5Cn%5Cn%20%20%20%20.obsidian-lib.cancel-button%20%7B%5Cn%20%20%20%20%20%20display:%20block;%5Cn%20%20%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20//%20The%20close%20button%20reuses%20Obsidian's%20%60modal-header-button%60%20+%20%60clickable-icon%60%20classes%20so%20it%20matches%5Cn%20%20%20%20//%20The%20native%20modal%20close%20button%20(box%20+%20hover);%20only%20its%20corner%20position%20is%20set%20here.%5Cn%20%20%20%20.obsidian-lib.plugin-notice-close-button%20%7B%5Cn%20%20%20%20%20%20position:%20absolute;%5Cn%20%20%20%20%20%20right:%20var(--size-4-3);%5Cn%20%20%20%20%20%20top:%20var(--size-4-3);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20Move%20the%20notice's%20own%20padding%20onto%20the%20content%20wrapper%20so%20the%20wrapper%20covers%20the%20whole%20clickable%5Cn%20%20//%20Area%20%E2%80%94%20otherwise%20a%20click%20landing%20on%20the%20notice's%20bare%20padding%20(outside%20the%20wrapper)%20would%20bypass%20the%5Cn%20%20//%20Stop-propagation%20guard%20and%20dismiss%20the%20hard-to-close%20notice.%5Cn%20%20&.plugin-notice-requires-explicit-close.notice%20%7B%5Cn%20%20%20%20padding:%200;%5Cn%5Cn%20%20%20%20.obsidian-lib.plugin-notice-content%20%7B%5Cn%20%20%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-settings-tab%20%7B%5Cn%20%20%20%20a:focus%20%7B%5Cn%20%20%20%20%20%20outline:%202px%20solid%20var(--link-color);%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.plugin-suggestion-banner%20%7B%5Cn%20%20%20%20background-color:%20var(--background-secondary);%5Cn%20%20%20%20border-left:%20var(--size-2-1)%20solid%20var(--text-accent);%5Cn%20%20%20%20border-radius:%20var(--radius-s);%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-direction:%20column;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-bottom:%20var(--size-4-4);%5Cn%20%20%20%20padding:%20var(--size-4-3)%20var(--size-4-4);%5Cn%5Cn%20%20%20%20button%20%7B%5Cn%20%20%20%20%20%20width:%20fit-content;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20//%20A%20notice%20lays%20its%20buttons%20out%20inline%20with%20no%20spacing,%20so%20the%20action%20button%20would%20touch%20the%20decline%20button.%5Cn%20%20&.plugin-suggestion-notice-buttons%20%7B%5Cn%20%20%20%20display:%20flex;%5Cn%20%20%20%20flex-wrap:%20wrap;%5Cn%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20margin-top:%20var(--size-4-2);%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20A%20popover%20is%20anchored%20at%20a%20point%20and%20appended%20to%20the%20document%20body,%20outside%20any%20plugin-scoped%5Cn//%20container,%20so%20it%20is%20positioned%20absolutely%20at%20the%20top%20level.%20It%20borrows%20Obsidian's%20%60.menu%60%20look,%5Cn//%20which%20already%20carries%20the%20popup%20background,%20border%20and%20shadow%20%E2%80%94%20only%20layout%20is%20set%20here.%5Cn.obsidian-lib%20%7B%5Cn%20%20&.popover%20%7B%5Cn%20%20%20%20//%20Deliberately%20not%20%60calc(100vw%20-%2016px)%60:%20the%20SCSS%20compiler%20strips%20the%20%60calc(%60%20wrapper%20inside%5Cn%20%20%20%20//%20%60min()%60,%20which%20yields%20invalid%20CSS.%20A%20viewport%20percentage%20keeps%20a%20narrow%20window's%20popover%20on%5Cn%20%20%20%20//%20screen.%5Cn%20%20%20%20max-width:%20min(420px,%2090vw);%5Cn%20%20%20%20min-width:%20320px;%5Cn%20%20%20%20padding:%20var(--size-4-2)%20var(--size-4-3);%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20z-index:%20var(--layer-menu);%5Cn%5Cn%20%20%20%20//%20Setting%20rows%20are%20built%20for%20a%20full-width%20settings%20tab;%20compact%20them%20for%20a%20popover.%5Cn%20%20%20%20.setting-item%20%7B%5Cn%20%20%20%20%20%20align-items:%20center;%5Cn%20%20%20%20%20%20border-top:%20none;%5Cn%20%20%20%20%20%20gap:%20var(--size-4-2);%5Cn%20%20%20%20%20%20padding:%20var(--size-2-1)%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-info%20%7B%5Cn%20%20%20%20%20%20margin-right:%200;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20.setting-item-control%20%7B%5Cn%20%20%20%20%20%20flex-grow:%201;%5Cn%20%20%20%20%20%20justify-content:%20flex-end;%5Cn%20%20%20%20%7D%5Cn%5Cn%20%20%20%20input%5Btype='text'%5D%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.prompt-modal%20%7B%5Cn%20%20%20%20.text-box%20%7B%5Cn%20%20%20%20%20%20width:%20100%25;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22//%20The%20tldraw%20Obsidian%20plugin%20(tldraw/obsidian-plugin)%20ships%20an%20unscoped%20global%20rule%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20currentColor%20%7D%60%20that%20overrides%20Obsidian's%20own%5Cn//%20%60button:not(.clickable-icon)%20%7B%20color:%20var(--text-color)%20%7D%60%20app-wide.%20Obsidian%20sets%5Cn//%20%60--text-color%60%20contextually%20per%20button%20variant%20(%60--text-normal%60%20by%20default,%5Cn//%20%60--text-on-accent%60%20for%20%60.mod-cta%60,%20%60--text-error%60%20for%20%60.mod-warning%60),%20so%20tldraw's%5Cn//%20%60currentColor%60%20discards%20that%20and%20breaks%20button%20contrast%20outside%20tldraw%20%E2%80%94%20e.g.%5Cn//%20White-on-white%20action%20buttons%20inside%20a%20Notice.%20Re-assert%20Obsidian's%20own%20value%20inside%20the%5Cn//%20Library's%20own%20UI%20(specificity%200,2,1),%20which%20wins%20over%20tldraw's%20(0,1,1)%20while%20staying%20correct%5Cn//%20For%20every%20button%20variant%20(it%20reuses%20the%20same%20contextual%20%60--text-color%60).%5Cn//%20It%20MUST%20stay%20scoped%20to%20%60.obsidian-lib%60:%20an%20unscoped%20re-assert%20(it%20was%20%60body%20button%E2%80%A6%60,%5Cn//%200,1,2)%20lands%20on%20every%20button%20in%20the%20app%20and%20beats%20any%20other%20plugin's%20own%20button%20color%5Cn//%20Written%20at%200,1,1,%20which%20Obsidian's%20own%20rule%20used%20to%20lose%20to%20(obsidian-custom-attachment-location%2395).%5Cn//%20Defensive%20workaround%20%E2%80%94%20remove%20once%20the%20upstream%20fix%20ships%20(tldraw/obsidian-plugin%23210).%5Cn.obsidian-lib%20button:not(.clickable-icon)%20%7B%5Cn%20%20color:%20var(--text-color);%5Cn%7D%5Cn%22,%22.obsidian-lib%20%7B%5Cn%20%20&.tri-state-checkbox-component%20%7B%5Cn%20%20%20%20input%5Btype='checkbox'%5D:indeterminate%20%7B%5Cn%20%20%20%20%20%20appearance:%20checkbox;%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%7D%5Cn%22,%22@mixin%20invalid%20%7B%5Cn%20%20box-shadow:%200%200%200%202px%20var(--text-error);%5Cn%7D%5Cn%5Cn//%20An%20input%20the%20user%20has%20not%20interacted%20with%20yet%20carries%20%60.untouched%60%20(set%20by%20%60PromptModal%60),%20so%20a%20modal%20that%5Cn//%20opens%20invalid%20by%20design%20does%20not%20greet%20the%20user%20in%20red.%20Both%20blocks%20below%20must%20be%20gated:%20the%20input%20is%5Cn//%20focused%20on%20open,%20so%20the%20focus%20block%20alone%20would%20keep%20painting%20it.%5Cn.obsidian-lib%20%7B%5Cn%20%20:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20@include%20invalid;%5Cn%20%20%7D%5Cn%5Cn%20%20input.metadata-input-text,%5Cn%20%20input%5Btype='date'%5D,%5Cn%20%20input%5Btype='datetime-local'%5D,%5Cn%20%20input%5Btype='email'%5D,%5Cn%20%20input%5Btype='number'%5D,%5Cn%20%20input%5Btype='password'%5D,%5Cn%20%20input%5Btype='search'%5D,%5Cn%20%20input%5Btype='text'%5D,%5Cn%20%20textarea%20%7B%5Cn%20%20%20%20&:active,%5Cn%20%20%20%20&:focus-visible,%5Cn%20%20%20%20&:focus%20%7B%5Cn%20%20%20%20%20%20&:invalid:not(.untouched)%20%7B%5Cn%20%20%20%20%20%20%20%20@include%20invalid;%5Cn%20%20%20%20%20%20%7D%5Cn%20%20%20%20%7D%5Cn%20%20%7D%5Cn%5Cn%20%20&.setting-component-wrapper%20%7B%5Cn%20%20%20%20position:%20relative;%5Cn%20%20%20%20display:%20inline-flex;%5Cn%20%20%7D%5Cn%5Cn%20%20&.overlay-validator%20%7B%5Cn%20%20%20%20caret-color:%20transparent;%5Cn%20%20%20%20cursor:%20default;%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20background-color:%20transparent;%5Cn%20%20%20%20border:%20none;%5Cn%20%20%20%20outline:%20none;%5Cn%20%20%20%20pointer-events:%20none;%5Cn%20%20%20%20z-index:%209999;%5Cn%20%20%20%20left:%200;%5Cn%20%20%20%20top:%200;%5Cn%20%20%20%20width:%20100%25;%5Cn%20%20%20%20height:%20100%25;%5Cn%20%20%7D%5Cn%5Cn%20%20&.tooltip.tooltip-validator%20%7B%5Cn%20%20%20%20position:%20absolute;%5Cn%20%20%20%20top:%20calc(100%25%20+%208px);%5Cn%20%20%20%20width:%20max-content;%5Cn%20%20%7D%5Cn%7D%5Cn%22%5D%7D */\n";
|
|
96
96
|
// Annotate the CommonJS export names for ESM import in node:
|
|
97
97
|
0 && (module.exports = {
|
|
@@ -103,6 +103,7 @@ const en = {
|
|
|
103
103
|
noOperations: "No bulk operation of this plugin was found in the vault repository.",
|
|
104
104
|
notActive: "Bulk operation commits are off, or the vault is not in a git repository.",
|
|
105
105
|
recoveredInterrupted: "A bulk operation was interrupted. Its changes were committed as {{operationId}} interrupted.",
|
|
106
|
+
resumedAfterRecovery: "The lock of {{recoveredOperationId}} went stale while it ran, so its changes so far were committed as {{recoveredOperationId}} interrupted, and the rest as {{operationId}}. Undoing the whole operation takes reverting both.",
|
|
106
107
|
revertConflict: "Reverting {{operationId}} stopped on a conflict. The vault repository is left mid-revert: resolve the conflicts, then run git revert --continue, or git revert --abort to give up.",
|
|
107
108
|
reverted: "Reverted {{operationId}}.",
|
|
108
109
|
revertFailed: "Failed to revert {{operationId}}: {{error}}",
|
|
@@ -200,4 +201,4 @@ const en = {
|
|
|
200
201
|
0 && (module.exports = {
|
|
201
202
|
en
|
|
202
203
|
});
|
|
203
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pMThuL2xvY2FsZXMvZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5MaWI6IHtcbiAgICBhc3luY1dpdGhOb3RpY2U6IHtcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcy4uLicsXG4gICAgICBvcGVyYXRpb246ICdPcGVyYXRpb24nLFxuICAgICAgcnVubmluZ0ZvcjogJ1J1bm5pbmcgZm9yJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbjogJ1lvdSBjYW4gdGVybWluYXRlIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBiZWxvdywgYnV0IGJlIGF3YXJlIGl0IG1pZ2h0IGxlYXZlIHRoZSB2YXVsdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuJyxcbiAgICAgIHRpbWVkT3V0OiAnVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIge3tkdXJhdGlvbiwgbnVtYmVyfX0gbWlsbGlzZWNvbmRzLidcbiAgICB9LFxuICAgIGJ1bGtPcGVyYXRpb246IHtcbiAgICAgIG5vT3BlcmF0aW9uczogJ05vIGJ1bGsgb3BlcmF0aW9uIG9mIHRoaXMgcGx1Z2luIHdhcyBmb3VuZCBpbiB0aGUgdmF1bHQgcmVwb3NpdG9yeS4nLFxuICAgICAgbm90QWN0aXZlOiAnQnVsayBvcGVyYXRpb24gY29tbWl0cyBhcmUgb2ZmLCBvciB0aGUgdmF1bHQgaXMgbm90IGluIGEgZ2l0IHJlcG9zaXRvcnkuJyxcbiAgICAgIHJlY292ZXJlZEludGVycnVwdGVkOiAnQSBidWxrIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIEl0cyBjaGFuZ2VzIHdlcmUgY29tbWl0dGVkIGFzIHt7b3BlcmF0aW9uSWR9fSBpbnRlcnJ1cHRlZC4nLFxuICAgICAgcmV2ZXJ0Q29uZmxpY3Q6ICdSZXZlcnRpbmcge3tvcGVyYXRpb25JZH19IHN0b3BwZWQgb24gYSBjb25mbGljdC4gVGhlIHZhdWx0IHJlcG9zaXRvcnkgaXMgbGVmdCBtaWQtcmV2ZXJ0OiByZXNvbHZlIHRoZSBjb25mbGljdHMsIHRoZW4gcnVuIGdpdCByZXZlcnQgLS1jb250aW51ZSwgb3IgZ2l0IHJldmVydCAtLWFib3J0IHRvIGdpdmUgdXAuJyxcbiAgICAgIHJldmVydGVkOiAnUmV2ZXJ0ZWQge3tvcGVyYXRpb25JZH19LicsXG4gICAgICByZXZlcnRGYWlsZWQ6ICdGYWlsZWQgdG8gcmV2ZXJ0IHt7b3BlcmF0aW9uSWR9fToge3tlcnJvcn19JyxcbiAgICAgIHNlbGVjdE9wZXJhdGlvbjogJ1NlbGVjdCBhIGJ1bGsgb3BlcmF0aW9uIHRvIHVuZG8nXG4gICAgfSxcbiAgICBidXR0b25zOiB7XG4gICAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICAgICAgb2s6ICdPSydcbiAgICB9LFxuICAgIGNhbGxvdXQ6IHtcbiAgICAgIGxvYWRDb250ZW50OiAnTG9hZCBjb250ZW50IGZvciBjYWxsb3V0J1xuICAgIH0sXG4gICAgZGF0YXZpZXc6IHtcbiAgICAgIGl0ZW1zUGVyUGFnZTogJ0l0ZW1zIHBlciBwYWdlOicsXG4gICAgICBqdW1wVG9QYWdlOiAnSnVtcCB0byBwYWdlOicsXG4gICAgICBwYWdlSGVhZGVyOiAnUGFnZSB7e3BhZ2VOdW1iZXIsIG51bWJlcn19IG9mIHt7dG90YWxQYWdlcywgbnVtYmVyfX0sIFRvdGFsIGl0ZW1zOiB7e3RvdGFsSXRlbXMsIG51bWJlcn19J1xuICAgIH0sXG4gICAgbWVudToge1xuICAgICAgY29weTogJ0NvcHknXG4gICAgfSxcbiAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICBnZXRCYWNrbGlua3NGb3JGaWxlUGF0aDogJ0dldCBiYWNrbGlua3MgZm9yIHt7ZmlsZVBhdGh9fSdcbiAgICB9LFxuICAgIG5vdGljZXM6IHtcbiAgICAgIGF0dGFjaG1lbnRJc1N0aWxsVXNlZDogJ0F0dGFjaG1lbnQge3thdHRhY2htZW50UGF0aH19IGlzIHN0aWxsIHVzZWQgYnkgb3RoZXIgbm90ZXMuIEl0IHdpbGwgbm90IGJlIGRlbGV0ZWQuJyxcbiAgICAgIGF0dGFjaG1lbnRSZXNjdWVkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2FzIG1vdmVkIHRvIHt7bmV3QXR0YWNobWVudFBhdGh9fS4nLFxuICAgICAgY2xvc2VBcmlhTGFiZWw6ICdDbG9zZScsXG4gICAgICBmYWlsZWRUb09wZW5Vcmw6ICdGYWlsZWQgdG8gb3BlbiB7e3VybH19JyxcbiAgICAgIHVuaGFuZGxlZEVycm9yOiAnQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ1xuICAgIH0sXG4gICAgcGF0aFNldHRpbmdzOiB7XG4gICAgICBpbnZhbGlkR2xvYjogJ0ludmFsaWQgZ2xvYiBwYXR0ZXJuOiB7e2dsb2J9fSAoe3tyZWFzb259fSknLFxuICAgICAgaW52YWxpZFJlZ3VsYXJFeHByZXNzaW9uOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IHt7cmVnRXhwfX0gKHt7cmVhc29ufX0pJyxcbiAgICAgIHRyYWlsaW5nRXNjYXBlOiAnaXQgZW5kcyB3aXRoIGFuIHVuZXNjYXBlZCBcXFxcJyxcbiAgICAgIHVuY2xvc2VkQ2hhcmFjdGVyQ2xhc3M6ICdhIFsgY2hhcmFjdGVyIGNsYXNzIGlzIG5ldmVyIGNsb3NlZCB3aXRoIF0nXG4gICAgfSxcbiAgICBwbHVnaW5Db25mbGljdDoge1xuICAgICAgYmxvY2tlZE5vdGljZTogJ3t7cGx1Z2luTmFtZX19IGRvZXMgbm90aGluZyB3aGlsZSB7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19IGlzIGVuYWJsZWQuIFVwZGF0ZSBvciBkaXNhYmxlIGl0IHRvIGNvbnRpbnVlLicsXG4gICAgICBjb25mbGljdEFwcGVhcmVkTm90aWNlOiAne3tjb25mbGljdGluZ1BsdWdpbk5hbWV9fSBpcyBub3cgZW5hYmxlZCwgc28ge3twbHVnaW5OYW1lfX0gaGFzIHN0b3BwZWQgd29ya2luZy4gVXBkYXRlIG9yIGRpc2FibGUgaXQgdG8gcmVzdW1lLicsXG4gICAgICBkaXNhYmxlOiAnRGlzYWJsZSB7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19JyxcbiAgICAgIHNldHRpbmdzSGVhZGluZzogJ0NvbmZsaWN0aW5nIHBsdWdpbicsXG4gICAgICB3YXJuaW5nTm90aWNlOiAne3twbHVnaW5OYW1lfX0gYW5kIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0gb3ZlcmxhcCwgYW5kIGJvdGggYXJlIHJ1bm5pbmcuJ1xuICAgIH0sXG4gICAgcGx1Z2luRGVwZW5kZW5jeToge1xuICAgICAgYWxyZWFkeVVwVG9EYXRlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGFscmVhZHkgYXQgaXRzIGxhdGVzdCByZWxlYXNlLiB7e3BsdWdpbk5hbWV9fSBuZWVkcyBhIHZlcnNpb24gdGhhdCBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LicsXG4gICAgICBibG9ja2VkTm90aWNlOiAne3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nIHVudGlsIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBpcyBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuJyxcbiAgICAgIGRlcGVuZGVuY3lMb3N0Tm90aWNlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIHNvIHt7cGx1Z2luTmFtZX19IGhhcyBzdG9wcGVkIHdvcmtpbmcuIEJyaW5nIGl0IGJhY2sgdG8gcmVzdW1lLicsXG4gICAgICBub1JlYWRhYmxlQXBpTm90aWNlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGVuYWJsZWQgYnV0IHB1Ymxpc2hlcyBubyBBUEkge3twbHVnaW5OYW1lfX0gY2FuIHJlYWQsIHNvIHt7cGx1Z2luTmFtZX19IGRvZXMgbm90aGluZy4gVXBkYXRlIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSB0byByZXN1bWUuJyxcbiAgICAgIG9wZW5EZXBlbmRlbmN5U2V0dGluZ3M6ICdPcGVuIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBzZXR0aW5ncycsXG4gICAgICBzZXR0aW5nc0hlYWRpbmc6ICdSZXF1aXJlZCBwbHVnaW4gbWlzc2luZycsXG4gICAgICB1cGRhdGU6ICdVcGRhdGUge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19JyxcbiAgICAgIHVwZGF0ZWQ6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgdXBkYXRlZC4nLFxuICAgICAgdXBkYXRlRmFpbGVkOiAnRmFpbGVkIHRvIHVwZGF0ZSB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0uIENoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICB2ZXJzaW9uTWlzbWF0Y2hOb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBuZWVkcyBhIG5ld2VyIHZlcnNpb24gb2Yge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19LiBVcGRhdGUgaXQgdG8gcmVzdW1lLidcbiAgICB9LFxuICAgIHBsdWdpblN1Z2dlc3Rpb246IHtcbiAgICAgIGVuYWJsZTogJ0VuYWJsZScsXG4gICAgICBpbnN0YWxsOiAnSW5zdGFsbCBhbmQgZW5hYmxlJyxcbiAgICAgIGluc3RhbGxlZDogJ3t7cGx1Z2luTmFtZX19IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZC4nLFxuICAgICAgaW5zdGFsbEZhaWxlZDogJ0ZhaWxlZCB0byBpbnN0YWxsIHt7cGx1Z2luTmFtZX19LiBDaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgbm90Tm93OiAnTm90IG5vdydcbiAgICB9LFxuICAgIHF1ZXVlOiB7XG4gICAgICBmbHVzaFF1ZXVlOiAnRmx1c2ggcXVldWUnXG4gICAgfSxcbiAgICByZWxlYXNlTm90ZXM6IHtcbiAgICAgIHRpdGxlOiAne3twbHVnaW5OYW1lfX0gcmVsZWFzZSBub3RlcydcbiAgICB9LFxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXI6IHtcbiAgICAgIGhhbmRsZURlbGV0ZTogJ0hhbmRsZSBkZWxldGU6IHt7ZmlsZVBhdGh9fScsXG4gICAgICBoYW5kbGVPcnBoYW5lZFJlbmFtZXM6ICdIYW5kbGUgb3JwaGFuZWQgcmVuYW1lcycsXG4gICAgICBoYW5kbGVSZW5hbWU6ICdIYW5kbGUgcmVuYW1lOiB7e29sZFBhdGh9fSAtPiB7e25ld1BhdGh9fScsXG4gICAgICB1cGRhdGVkTGlua3M6ICdVcGRhdGVkIHt7bGlua3NDb3VudCwgbnVtYmVyfX0gbGlua3MgaW4ge3tmaWxlc0NvdW50LCBudW1iZXJ9fSBmaWxlcy4nXG4gICAgfSxcbiAgICByZXNvdXJjZUxvY2s6IHtcbiAgICAgIGxvY2tlZEJ5VG9vbHRpcDogJ0xvY2tlZCBieScsXG4gICAgICBsb2NrZWROb3RlVG9vbHRpcDogJ1RoaXMgbm90ZSBpcyBsb2NrZWQgd2hpbGUgYW4gb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLicsXG4gICAgICB1bmxvY2tDb25maXJtTWVzc2FnZTogJ1RoaXMgd2lsbCBjYW5jZWwgdGhlIG9wZXJhdGlvbihzKSBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2sgb24gdGhpcyBub3RlIGFuZCBtYXkgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVGhlIG5vdGUgaXMgbG9ja2VkIGJ5OicsXG4gICAgICB1bmxvY2tDb25maXJtVGl0bGU6ICdVbmxvY2sgbm90ZT8nLFxuICAgICAgdW5sb2NrTWVudUl0ZW06ICdVbmxvY2snXG4gICAgfSxcbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBjb250cm9sQ2hhcmFjdGVyOiAne3tuYW1lfX0gY29udGFpbnMgYSBjb250cm9sIGNoYXJhY3Rlci4nLFxuICAgICAgZW1wdHlOYW1lOiAnVGhlIG5hbWUgaXMgZW1wdHkuJyxcbiAgICAgIHRyYWlsaW5nQ2hhcmFjdGVyczogJ3t7bmFtZX19IGVuZHMgd2l0aCBhIGRvdCBvciBhIHNwYWNlLCB3aGljaCBXaW5kb3dzIHJlbW92ZXMuJyxcbiAgICAgIHVuc2FmZUNoYXJhY3RlcnM6ICd7e25hbWV9fSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkOiB7e2NoYXJhY3RlcnN9fScsXG4gICAgICB3aW5kb3dzUmVzZXJ2ZWROYW1lOiAne3tuYW1lfX0gaXMgYSBkZXZpY2UgbmFtZSBXaW5kb3dzIHJlc2VydmVzLCBzbyB0aGUgZmlsZSBjYW5ub3QgZXhpc3Qgb24gV2luZG93cy4nXG4gICAgfSxcbiAgICB2YXVsdDoge1xuICAgICAgcHJvY2Vzc0ZpbGU6ICdQcm9jZXNzIGZpbGUge3tmaWxlUGF0aH19J1xuICAgIH1cbiAgfVxufSBhcyBjb25zdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNPLE1BQU0sS0FBSztBQUFBLEVBQ2hCLGFBQWE7QUFBQSxJQUNYLGlCQUFpQjtBQUFBLE1BQ2YsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osb0JBQW9CO0FBQUEsTUFDcEIsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLHNCQUFzQjtBQUFBLE1BQ3RCLGdCQUFnQjtBQUFBLE1BQ2hCLFVBQVU7QUFBQSxNQUNWLGNBQWM7QUFBQSxNQUNkLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixJQUFJO0FBQUEsSUFDTjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IseUJBQXlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLHVCQUF1QjtBQUFBLE1BQ3ZCLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYiwwQkFBMEI7QUFBQSxNQUMxQixnQkFBZ0I7QUFBQSxNQUNoQix3QkFBd0I7QUFBQSxJQUMxQjtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsTUFDZCxlQUFlO0FBQUEsTUFDZix3QkFBd0I7QUFBQSxNQUN4QixTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixlQUFlO0FBQUEsSUFDakI7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGVBQWU7QUFBQSxNQUNmLHNCQUFzQjtBQUFBLE1BQ3RCLHFCQUFxQjtBQUFBLE1BQ3JCLHdCQUF3QjtBQUFBLE1BQ3hCLGlCQUFpQjtBQUFBLE1BQ2pCLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQSxNQUNkLHVCQUF1QjtBQUFBLElBQ3pCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxNQUNoQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsTUFDWCxlQUFlO0FBQUEsTUFDZixRQUFRO0FBQUEsSUFDVjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxxQkFBcUI7QUFBQSxNQUNuQixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixjQUFjO0FBQUEsTUFDZCxjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLGlCQUFpQjtBQUFBLE1BQ2pCLG1CQUFtQjtBQUFBLE1BQ25CLHNCQUFzQjtBQUFBLE1BQ3RCLG9CQUFvQjtBQUFBLE1BQ3BCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixrQkFBa0I7QUFBQSxNQUNsQixXQUFXO0FBQUEsTUFDWCxvQkFBb0I7QUFBQSxNQUNwQixrQkFBa0I7QUFBQSxNQUNsQixxQkFBcUI7QUFBQSxJQUN2QjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsYUFBYTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9pMThuL2xvY2FsZXMvZW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBFbmdsaXNoIHRyYW5zbGF0aW9ucyBmb3IgdGhlIGBpMThuYCBtb2R1bGUuXG4gKi9cblxuLyoqXG4gKiBUaGUgRW5nbGlzaCB0cmFuc2xhdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBlbiA9IHtcbiAgb2JzaWRpYW5MaWI6IHtcbiAgICBhc3luY1dpdGhOb3RpY2U6IHtcbiAgICAgIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcy4uLicsXG4gICAgICBvcGVyYXRpb246ICdPcGVyYXRpb24nLFxuICAgICAgcnVubmluZ0ZvcjogJ1J1bm5pbmcgZm9yJyxcbiAgICAgIHRlcm1pbmF0ZU9wZXJhdGlvbjogJ1lvdSBjYW4gdGVybWluYXRlIHRoZSBvcGVyYXRpb24gYnkgY2xpY2tpbmcgdGhlIGJ1dHRvbiBiZWxvdywgYnV0IGJlIGF3YXJlIGl0IG1pZ2h0IGxlYXZlIHRoZSB2YXVsdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuJyxcbiAgICAgIHRpbWVkT3V0OiAnVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgYWZ0ZXIge3tkdXJhdGlvbiwgbnVtYmVyfX0gbWlsbGlzZWNvbmRzLidcbiAgICB9LFxuICAgIGJ1bGtPcGVyYXRpb246IHtcbiAgICAgIG5vT3BlcmF0aW9uczogJ05vIGJ1bGsgb3BlcmF0aW9uIG9mIHRoaXMgcGx1Z2luIHdhcyBmb3VuZCBpbiB0aGUgdmF1bHQgcmVwb3NpdG9yeS4nLFxuICAgICAgbm90QWN0aXZlOiAnQnVsayBvcGVyYXRpb24gY29tbWl0cyBhcmUgb2ZmLCBvciB0aGUgdmF1bHQgaXMgbm90IGluIGEgZ2l0IHJlcG9zaXRvcnkuJyxcbiAgICAgIHJlY292ZXJlZEludGVycnVwdGVkOiAnQSBidWxrIG9wZXJhdGlvbiB3YXMgaW50ZXJydXB0ZWQuIEl0cyBjaGFuZ2VzIHdlcmUgY29tbWl0dGVkIGFzIHt7b3BlcmF0aW9uSWR9fSBpbnRlcnJ1cHRlZC4nLFxuICAgICAgcmVzdW1lZEFmdGVyUmVjb3Zlcnk6ICdUaGUgbG9jayBvZiB7e3JlY292ZXJlZE9wZXJhdGlvbklkfX0gd2VudCBzdGFsZSB3aGlsZSBpdCByYW4sIHNvIGl0cyBjaGFuZ2VzIHNvIGZhciB3ZXJlIGNvbW1pdHRlZCBhcyB7e3JlY292ZXJlZE9wZXJhdGlvbklkfX0gaW50ZXJydXB0ZWQsIGFuZCB0aGUgcmVzdCBhcyB7e29wZXJhdGlvbklkfX0uIFVuZG9pbmcgdGhlIHdob2xlIG9wZXJhdGlvbiB0YWtlcyByZXZlcnRpbmcgYm90aC4nLFxuICAgICAgcmV2ZXJ0Q29uZmxpY3Q6ICdSZXZlcnRpbmcge3tvcGVyYXRpb25JZH19IHN0b3BwZWQgb24gYSBjb25mbGljdC4gVGhlIHZhdWx0IHJlcG9zaXRvcnkgaXMgbGVmdCBtaWQtcmV2ZXJ0OiByZXNvbHZlIHRoZSBjb25mbGljdHMsIHRoZW4gcnVuIGdpdCByZXZlcnQgLS1jb250aW51ZSwgb3IgZ2l0IHJldmVydCAtLWFib3J0IHRvIGdpdmUgdXAuJyxcbiAgICAgIHJldmVydGVkOiAnUmV2ZXJ0ZWQge3tvcGVyYXRpb25JZH19LicsXG4gICAgICByZXZlcnRGYWlsZWQ6ICdGYWlsZWQgdG8gcmV2ZXJ0IHt7b3BlcmF0aW9uSWR9fToge3tlcnJvcn19JyxcbiAgICAgIHNlbGVjdE9wZXJhdGlvbjogJ1NlbGVjdCBhIGJ1bGsgb3BlcmF0aW9uIHRvIHVuZG8nXG4gICAgfSxcbiAgICBidXR0b25zOiB7XG4gICAgICBjYW5jZWw6ICdDYW5jZWwnLFxuICAgICAgb2s6ICdPSydcbiAgICB9LFxuICAgIGNhbGxvdXQ6IHtcbiAgICAgIGxvYWRDb250ZW50OiAnTG9hZCBjb250ZW50IGZvciBjYWxsb3V0J1xuICAgIH0sXG4gICAgZGF0YXZpZXc6IHtcbiAgICAgIGl0ZW1zUGVyUGFnZTogJ0l0ZW1zIHBlciBwYWdlOicsXG4gICAgICBqdW1wVG9QYWdlOiAnSnVtcCB0byBwYWdlOicsXG4gICAgICBwYWdlSGVhZGVyOiAnUGFnZSB7e3BhZ2VOdW1iZXIsIG51bWJlcn19IG9mIHt7dG90YWxQYWdlcywgbnVtYmVyfX0sIFRvdGFsIGl0ZW1zOiB7e3RvdGFsSXRlbXMsIG51bWJlcn19J1xuICAgIH0sXG4gICAgbWVudToge1xuICAgICAgY29weTogJ0NvcHknXG4gICAgfSxcbiAgICBtZXRhZGF0YUNhY2hlOiB7XG4gICAgICBnZXRCYWNrbGlua3NGb3JGaWxlUGF0aDogJ0dldCBiYWNrbGlua3MgZm9yIHt7ZmlsZVBhdGh9fSdcbiAgICB9LFxuICAgIG5vdGljZXM6IHtcbiAgICAgIGF0dGFjaG1lbnRJc1N0aWxsVXNlZDogJ0F0dGFjaG1lbnQge3thdHRhY2htZW50UGF0aH19IGlzIHN0aWxsIHVzZWQgYnkgb3RoZXIgbm90ZXMuIEl0IHdpbGwgbm90IGJlIGRlbGV0ZWQuJyxcbiAgICAgIGF0dGFjaG1lbnRSZXNjdWVkOiAnQXR0YWNobWVudCB7e2F0dGFjaG1lbnRQYXRofX0gaXMgc3RpbGwgdXNlZCBieSBvdGhlciBub3Rlcy4gSXQgd2FzIG1vdmVkIHRvIHt7bmV3QXR0YWNobWVudFBhdGh9fS4nLFxuICAgICAgY2xvc2VBcmlhTGFiZWw6ICdDbG9zZScsXG4gICAgICBmYWlsZWRUb09wZW5Vcmw6ICdGYWlsZWQgdG8gb3BlbiB7e3VybH19JyxcbiAgICAgIHVuaGFuZGxlZEVycm9yOiAnQW4gdW5oYW5kbGVkIGVycm9yIG9jY3VycmVkLiBQbGVhc2UgY2hlY2sgdGhlIGNvbnNvbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uJ1xuICAgIH0sXG4gICAgcGF0aFNldHRpbmdzOiB7XG4gICAgICBpbnZhbGlkR2xvYjogJ0ludmFsaWQgZ2xvYiBwYXR0ZXJuOiB7e2dsb2J9fSAoe3tyZWFzb259fSknLFxuICAgICAgaW52YWxpZFJlZ3VsYXJFeHByZXNzaW9uOiAnSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246IHt7cmVnRXhwfX0gKHt7cmVhc29ufX0pJyxcbiAgICAgIHRyYWlsaW5nRXNjYXBlOiAnaXQgZW5kcyB3aXRoIGFuIHVuZXNjYXBlZCBcXFxcJyxcbiAgICAgIHVuY2xvc2VkQ2hhcmFjdGVyQ2xhc3M6ICdhIFsgY2hhcmFjdGVyIGNsYXNzIGlzIG5ldmVyIGNsb3NlZCB3aXRoIF0nXG4gICAgfSxcbiAgICBwbHVnaW5Db25mbGljdDoge1xuICAgICAgYmxvY2tlZE5vdGljZTogJ3t7cGx1Z2luTmFtZX19IGRvZXMgbm90aGluZyB3aGlsZSB7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19IGlzIGVuYWJsZWQuIFVwZGF0ZSBvciBkaXNhYmxlIGl0IHRvIGNvbnRpbnVlLicsXG4gICAgICBjb25mbGljdEFwcGVhcmVkTm90aWNlOiAne3tjb25mbGljdGluZ1BsdWdpbk5hbWV9fSBpcyBub3cgZW5hYmxlZCwgc28ge3twbHVnaW5OYW1lfX0gaGFzIHN0b3BwZWQgd29ya2luZy4gVXBkYXRlIG9yIGRpc2FibGUgaXQgdG8gcmVzdW1lLicsXG4gICAgICBkaXNhYmxlOiAnRGlzYWJsZSB7e2NvbmZsaWN0aW5nUGx1Z2luTmFtZX19JyxcbiAgICAgIHNldHRpbmdzSGVhZGluZzogJ0NvbmZsaWN0aW5nIHBsdWdpbicsXG4gICAgICB3YXJuaW5nTm90aWNlOiAne3twbHVnaW5OYW1lfX0gYW5kIHt7Y29uZmxpY3RpbmdQbHVnaW5OYW1lfX0gb3ZlcmxhcCwgYW5kIGJvdGggYXJlIHJ1bm5pbmcuJ1xuICAgIH0sXG4gICAgcGx1Z2luRGVwZW5kZW5jeToge1xuICAgICAgYWxyZWFkeVVwVG9EYXRlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGFscmVhZHkgYXQgaXRzIGxhdGVzdCByZWxlYXNlLiB7e3BsdWdpbk5hbWV9fSBuZWVkcyBhIHZlcnNpb24gdGhhdCBoYXMgbm90IGJlZW4gcmVsZWFzZWQgeWV0LicsXG4gICAgICBibG9ja2VkTm90aWNlOiAne3twbHVnaW5OYW1lfX0gZG9lcyBub3RoaW5nIHVudGlsIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBpcyBpbnN0YWxsZWQgYW5kIGVuYWJsZWQuJyxcbiAgICAgIGRlcGVuZGVuY3lMb3N0Tm90aWNlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIG5vIGxvbmdlciBhdmFpbGFibGUsIHNvIHt7cGx1Z2luTmFtZX19IGhhcyBzdG9wcGVkIHdvcmtpbmcuIEJyaW5nIGl0IGJhY2sgdG8gcmVzdW1lLicsXG4gICAgICBub1JlYWRhYmxlQXBpTm90aWNlOiAne3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19IGlzIGVuYWJsZWQgYnV0IHB1Ymxpc2hlcyBubyBBUEkge3twbHVnaW5OYW1lfX0gY2FuIHJlYWQsIHNvIHt7cGx1Z2luTmFtZX19IGRvZXMgbm90aGluZy4gVXBkYXRlIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSB0byByZXN1bWUuJyxcbiAgICAgIG9wZW5EZXBlbmRlbmN5U2V0dGluZ3M6ICdPcGVuIHt7ZGVwZW5kZW5jeVBsdWdpbk5hbWV9fSBzZXR0aW5ncycsXG4gICAgICBzZXR0aW5nc0hlYWRpbmc6ICdSZXF1aXJlZCBwbHVnaW4gbWlzc2luZycsXG4gICAgICB1cGRhdGU6ICdVcGRhdGUge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19JyxcbiAgICAgIHVwZGF0ZWQ6ICd7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0gaXMgdXBkYXRlZC4nLFxuICAgICAgdXBkYXRlRmFpbGVkOiAnRmFpbGVkIHRvIHVwZGF0ZSB7e2RlcGVuZGVuY3lQbHVnaW5OYW1lfX0uIENoZWNrIHRoZSBjb25zb2xlIGZvciBtb3JlIGluZm9ybWF0aW9uLicsXG4gICAgICB2ZXJzaW9uTWlzbWF0Y2hOb3RpY2U6ICd7e3BsdWdpbk5hbWV9fSBuZWVkcyBhIG5ld2VyIHZlcnNpb24gb2Yge3tkZXBlbmRlbmN5UGx1Z2luTmFtZX19LiBVcGRhdGUgaXQgdG8gcmVzdW1lLidcbiAgICB9LFxuICAgIHBsdWdpblN1Z2dlc3Rpb246IHtcbiAgICAgIGVuYWJsZTogJ0VuYWJsZScsXG4gICAgICBpbnN0YWxsOiAnSW5zdGFsbCBhbmQgZW5hYmxlJyxcbiAgICAgIGluc3RhbGxlZDogJ3t7cGx1Z2luTmFtZX19IGlzIGluc3RhbGxlZCBhbmQgZW5hYmxlZC4nLFxuICAgICAgaW5zdGFsbEZhaWxlZDogJ0ZhaWxlZCB0byBpbnN0YWxsIHt7cGx1Z2luTmFtZX19LiBDaGVjayB0aGUgY29uc29sZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nLFxuICAgICAgbm90Tm93OiAnTm90IG5vdydcbiAgICB9LFxuICAgIHF1ZXVlOiB7XG4gICAgICBmbHVzaFF1ZXVlOiAnRmx1c2ggcXVldWUnXG4gICAgfSxcbiAgICByZWxlYXNlTm90ZXM6IHtcbiAgICAgIHRpdGxlOiAne3twbHVnaW5OYW1lfX0gcmVsZWFzZSBub3RlcydcbiAgICB9LFxuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXI6IHtcbiAgICAgIGhhbmRsZURlbGV0ZTogJ0hhbmRsZSBkZWxldGU6IHt7ZmlsZVBhdGh9fScsXG4gICAgICBoYW5kbGVPcnBoYW5lZFJlbmFtZXM6ICdIYW5kbGUgb3JwaGFuZWQgcmVuYW1lcycsXG4gICAgICBoYW5kbGVSZW5hbWU6ICdIYW5kbGUgcmVuYW1lOiB7e29sZFBhdGh9fSAtPiB7e25ld1BhdGh9fScsXG4gICAgICB1cGRhdGVkTGlua3M6ICdVcGRhdGVkIHt7bGlua3NDb3VudCwgbnVtYmVyfX0gbGlua3MgaW4ge3tmaWxlc0NvdW50LCBudW1iZXJ9fSBmaWxlcy4nXG4gICAgfSxcbiAgICByZXNvdXJjZUxvY2s6IHtcbiAgICAgIGxvY2tlZEJ5VG9vbHRpcDogJ0xvY2tlZCBieScsXG4gICAgICBsb2NrZWROb3RlVG9vbHRpcDogJ1RoaXMgbm90ZSBpcyBsb2NrZWQgd2hpbGUgYW4gb3BlcmF0aW9uIGlzIGluIHByb2dyZXNzLicsXG4gICAgICB1bmxvY2tDb25maXJtTWVzc2FnZTogJ1RoaXMgd2lsbCBjYW5jZWwgdGhlIG9wZXJhdGlvbihzKSBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2sgb24gdGhpcyBub3RlIGFuZCBtYXkgbGVhdmUgdGhlIHZhdWx0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gVGhlIG5vdGUgaXMgbG9ja2VkIGJ5OicsXG4gICAgICB1bmxvY2tDb25maXJtVGl0bGU6ICdVbmxvY2sgbm90ZT8nLFxuICAgICAgdW5sb2NrTWVudUl0ZW06ICdVbmxvY2snXG4gICAgfSxcbiAgICB2YWxpZGF0aW9uOiB7XG4gICAgICBjb250cm9sQ2hhcmFjdGVyOiAne3tuYW1lfX0gY29udGFpbnMgYSBjb250cm9sIGNoYXJhY3Rlci4nLFxuICAgICAgZW1wdHlOYW1lOiAnVGhlIG5hbWUgaXMgZW1wdHkuJyxcbiAgICAgIHRyYWlsaW5nQ2hhcmFjdGVyczogJ3t7bmFtZX19IGVuZHMgd2l0aCBhIGRvdCBvciBhIHNwYWNlLCB3aGljaCBXaW5kb3dzIHJlbW92ZXMuJyxcbiAgICAgIHVuc2FmZUNoYXJhY3RlcnM6ICd7e25hbWV9fSBjb250YWlucyBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvd2VkOiB7e2NoYXJhY3RlcnN9fScsXG4gICAgICB3aW5kb3dzUmVzZXJ2ZWROYW1lOiAne3tuYW1lfX0gaXMgYSBkZXZpY2UgbmFtZSBXaW5kb3dzIHJlc2VydmVzLCBzbyB0aGUgZmlsZSBjYW5ub3QgZXhpc3Qgb24gV2luZG93cy4nXG4gICAgfSxcbiAgICB2YXVsdDoge1xuICAgICAgcHJvY2Vzc0ZpbGU6ICdQcm9jZXNzIGZpbGUge3tmaWxlUGF0aH19J1xuICAgIH1cbiAgfVxufSBhcyBjb25zdDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVNPLE1BQU0sS0FBSztBQUFBLEVBQ2hCLGFBQWE7QUFBQSxJQUNYLGlCQUFpQjtBQUFBLE1BQ2YsY0FBYztBQUFBLE1BQ2QsV0FBVztBQUFBLE1BQ1gsWUFBWTtBQUFBLE1BQ1osb0JBQW9CO0FBQUEsTUFDcEIsVUFBVTtBQUFBLElBQ1o7QUFBQSxJQUNBLGVBQWU7QUFBQSxNQUNiLGNBQWM7QUFBQSxNQUNkLFdBQVc7QUFBQSxNQUNYLHNCQUFzQjtBQUFBLE1BQ3RCLHNCQUFzQjtBQUFBLE1BQ3RCLGdCQUFnQjtBQUFBLE1BQ2hCLFVBQVU7QUFBQSxNQUNWLGNBQWM7QUFBQSxNQUNkLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFDQSxTQUFTO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixJQUFJO0FBQUEsSUFDTjtBQUFBLElBQ0EsU0FBUztBQUFBLE1BQ1AsYUFBYTtBQUFBLElBQ2Y7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSLGNBQWM7QUFBQSxNQUNkLFlBQVk7QUFBQSxNQUNaLFlBQVk7QUFBQSxJQUNkO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixNQUFNO0FBQUEsSUFDUjtBQUFBLElBQ0EsZUFBZTtBQUFBLE1BQ2IseUJBQXlCO0FBQUEsSUFDM0I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLHVCQUF1QjtBQUFBLE1BQ3ZCLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxjQUFjO0FBQUEsTUFDWixhQUFhO0FBQUEsTUFDYiwwQkFBMEI7QUFBQSxNQUMxQixnQkFBZ0I7QUFBQSxNQUNoQix3QkFBd0I7QUFBQSxJQUMxQjtBQUFBLElBQ0EsZ0JBQWdCO0FBQUEsTUFDZCxlQUFlO0FBQUEsTUFDZix3QkFBd0I7QUFBQSxNQUN4QixTQUFTO0FBQUEsTUFDVCxpQkFBaUI7QUFBQSxNQUNqQixlQUFlO0FBQUEsSUFDakI7QUFBQSxJQUNBLGtCQUFrQjtBQUFBLE1BQ2hCLGlCQUFpQjtBQUFBLE1BQ2pCLGVBQWU7QUFBQSxNQUNmLHNCQUFzQjtBQUFBLE1BQ3RCLHFCQUFxQjtBQUFBLE1BQ3JCLHdCQUF3QjtBQUFBLE1BQ3hCLGlCQUFpQjtBQUFBLE1BQ2pCLFFBQVE7QUFBQSxNQUNSLFNBQVM7QUFBQSxNQUNULGNBQWM7QUFBQSxNQUNkLHVCQUF1QjtBQUFBLElBQ3pCO0FBQUEsSUFDQSxrQkFBa0I7QUFBQSxNQUNoQixRQUFRO0FBQUEsTUFDUixTQUFTO0FBQUEsTUFDVCxXQUFXO0FBQUEsTUFDWCxlQUFlO0FBQUEsTUFDZixRQUFRO0FBQUEsSUFDVjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsWUFBWTtBQUFBLElBQ2Q7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFDQSxxQkFBcUI7QUFBQSxNQUNuQixjQUFjO0FBQUEsTUFDZCx1QkFBdUI7QUFBQSxNQUN2QixjQUFjO0FBQUEsTUFDZCxjQUFjO0FBQUEsSUFDaEI7QUFBQSxJQUNBLGNBQWM7QUFBQSxNQUNaLGlCQUFpQjtBQUFBLE1BQ2pCLG1CQUFtQjtBQUFBLE1BQ25CLHNCQUFzQjtBQUFBLE1BQ3RCLG9CQUFvQjtBQUFBLE1BQ3BCLGdCQUFnQjtBQUFBLElBQ2xCO0FBQUEsSUFDQSxZQUFZO0FBQUEsTUFDVixrQkFBa0I7QUFBQSxNQUNsQixXQUFXO0FBQUEsTUFDWCxvQkFBb0I7QUFBQSxNQUNwQixrQkFBa0I7QUFBQSxNQUNsQixxQkFBcUI7QUFBQSxJQUN2QjtBQUFBLElBQ0EsT0FBTztBQUFBLE1BQ0wsYUFBYTtBQUFBLElBQ2Y7QUFBQSxFQUNGO0FBQ0Y7IiwibmFtZXMiOltdfQ==
|
|
@@ -20,6 +20,7 @@ export declare const en: {
|
|
|
20
20
|
readonly noOperations: "No bulk operation of this plugin was found in the vault repository.";
|
|
21
21
|
readonly notActive: "Bulk operation commits are off, or the vault is not in a git repository.";
|
|
22
22
|
readonly recoveredInterrupted: "A bulk operation was interrupted. Its changes were committed as {{operationId}} interrupted.";
|
|
23
|
+
readonly resumedAfterRecovery: "The lock of {{recoveredOperationId}} went stale while it ran, so its changes so far were committed as {{recoveredOperationId}} interrupted, and the rest as {{operationId}}. Undoing the whole operation takes reverting both.";
|
|
23
24
|
readonly revertConflict: "Reverting {{operationId}} stopped on a conflict. The vault repository is left mid-revert: resolve the conflicts, then run git revert --continue, or git revert --abort to give up.";
|
|
24
25
|
readonly reverted: "Reverted {{operationId}}.";
|
|
25
26
|
readonly revertFailed: "Failed to revert {{operationId}}: {{error}}";
|
|
@@ -23,6 +23,7 @@ declare const translationsMapImpl: {
|
|
|
23
23
|
readonly noOperations: "No bulk operation of this plugin was found in the vault repository.";
|
|
24
24
|
readonly notActive: "Bulk operation commits are off, or the vault is not in a git repository.";
|
|
25
25
|
readonly recoveredInterrupted: "A bulk operation was interrupted. Its changes were committed as {{operationId}} interrupted.";
|
|
26
|
+
readonly resumedAfterRecovery: "The lock of {{recoveredOperationId}} went stale while it ran, so its changes so far were committed as {{recoveredOperationId}} interrupted, and the rest as {{operationId}}. Undoing the whole operation takes reverting both.";
|
|
26
27
|
readonly revertConflict: "Reverting {{operationId}} stopped on a conflict. The vault repository is left mid-revert: resolve the conflicts, then run git revert --continue, or git revert --abort to give up.";
|
|
27
28
|
readonly reverted: "Reverted {{operationId}}.";
|
|
28
29
|
readonly revertFailed: "Failed to revert {{operationId}}: {{error}}";
|
|
@@ -119,6 +119,7 @@ __export(modal_exports, {
|
|
|
119
119
|
});
|
|
120
120
|
module.exports = __toCommonJS(modal_exports);
|
|
121
121
|
var import_obsidian = require('obsidian');
|
|
122
|
+
var import_bulk_operation_progress = require('../bulk-operation-progress.cjs');
|
|
122
123
|
var import_plugin_context = require('../plugin/plugin-context.cjs');
|
|
123
124
|
class ModalBase extends import_obsidian.Modal {
|
|
124
125
|
/**
|
|
@@ -145,14 +146,16 @@ class ModalBase extends import_obsidian.Modal {
|
|
|
145
146
|
}
|
|
146
147
|
}
|
|
147
148
|
async function showModal(modalCreator) {
|
|
148
|
-
return await
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
149
|
+
return await (0, import_bulk_operation_progress.holdBulkOperationWhile)(
|
|
150
|
+
new Promise((resolve) => {
|
|
151
|
+
const modal = modalCreator(resolve);
|
|
152
|
+
modal.open();
|
|
153
|
+
})
|
|
154
|
+
);
|
|
152
155
|
}
|
|
153
156
|
// Annotate the CommonJS export names for ESM import in node:
|
|
154
157
|
0 && (module.exports = {
|
|
155
158
|
ModalBase,
|
|
156
159
|
showModal
|
|
157
160
|
});
|
|
158
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
161
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tb2RhbHMvbW9kYWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgYSBiYXNlIGNsYXNzIGZvciBkaXNwbGF5aW5nIG1vZGFscyBpbiBPYnNpZGlhbi5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFByb21pc2VSZXNvbHZlIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL2FzeW5jJztcbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgaG9sZEJ1bGtPcGVyYXRpb25XaGlsZSB9IGZyb20gJy4uL2J1bGstb3BlcmF0aW9uLXByb2dyZXNzLnRzJztcbmltcG9ydCB7IGFkZFBsdWdpbkNzc0NsYXNzZXMgfSBmcm9tICcuLi9wbHVnaW4vcGx1Z2luLWNvbnRleHQudHMnO1xuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgTW9kYWxCYXNlfS5cbiAqXG4gKiBAdHlwZVBhcmFtIFZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJlc29sdmVkIGJ5IHRoZSBtb2RhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RhbEJhc2VDb25zdHJ1Y3RvclBhcmFtczxWYWx1ZT4gZXh0ZW5kcyBNb2RhbFBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogQSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSB2YWx1ZSBvZiB0aGUgbW9kYWwuXG4gICAqL1xuICByZWFkb25seSBwcm9taXNlUmVzb2x2ZTogUHJvbWlzZVJlc29sdmU8VmFsdWU+O1xufVxuXG4vKipcbiAqIEJhc2Ugb3B0aW9ucyBmb3IgYSBtb2RhbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RhbFBhcmFtc0Jhc2Uge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgLyoqXG4gICAqIEEgQ1NTIGNsYXNzIHRvIGFwcGx5IHRvIHRoZSBtb2RhbC5cbiAgICovXG4gIHJlYWRvbmx5IGNzc0NsYXNzZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIGJhc2UgY2xhc3MgZm9yIGRpc3BsYXlpbmcgbW9kYWxzIGluIE9ic2lkaWFuLlxuICpcbiAqIEB0eXBlUGFyYW0gVmFsdWUgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgcmVzb2x2ZWQgYnkgdGhlIG1vZGFsLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTW9kYWxCYXNlPFZhbHVlPiBleHRlbmRzIE1vZGFsIHtcbiAgLyoqXG4gICAqIEEgZnVuY3Rpb24gdG8gcmVzb2x2ZSB0aGUgdmFsdWUgb2YgdGhlIG1vZGFsLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb21pc2VSZXNvbHZlOiBQcm9taXNlUmVzb2x2ZTxWYWx1ZT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgbW9kYWwuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgb3B0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IE1vZGFsQmFzZUNvbnN0cnVjdG9yUGFyYW1zPFZhbHVlPikge1xuICAgIHN1cGVyKHBhcmFtcy5hcHApO1xuICAgIHRoaXMucHJvbWlzZVJlc29sdmUgPSBwYXJhbXMucHJvbWlzZVJlc29sdmU7XG4gICAgdGhpcy5hZGRDc3NDbGFzc2VzKHBhcmFtcy5jc3NDbGFzc2VzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIENTUyBjbGFzc2VzIHRvIHRoZSBtb2RhbCdzIGNvbnRhaW5lciBlbGVtZW50LlxuICAgKlxuICAgKiBAcGFyYW0gY3NzQ2xhc3NlcyAtIFRoZSBDU1MgY2xhc3NlcyB0byBhZGQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWRkQ3NzQ2xhc3Nlcyhjc3NDbGFzc2VzPzogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBhZGRQbHVnaW5Dc3NDbGFzc2VzKHRoaXMuY29udGFpbmVyRWwsIGNzc0NsYXNzZXMpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheXMgYSBtb2RhbCBpbiBPYnNpZGlhbi5cbiAqXG4gKiBAdHlwZVBhcmFtIFZhbHVlIC0gVGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJlc29sdmVkIGJ5IHRoZSBtb2RhbC5cbiAqIEBwYXJhbSBtb2RhbENyZWF0b3IgLSBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIG1vZGFsLlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBtb2RhbCBpcyBjbG9zZWQuXG4gKlxuICogQHJlbWFya3NcbiAqIFdoaWxlIHRoZSBtb2RhbCBpcyBvcGVuLCBhIGJ1bGsgb3BlcmF0aW9uIHRoYXQgYXdhaXRzIGl0IGtlZXBzIGl0cyBsZWFzZSBsb2NrIGZyZXNoLCB0aHJvdWdoXG4gKiBgaG9sZEJ1bGtPcGVyYXRpb25XaGlsZWAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaG93TW9kYWw8VmFsdWU+KG1vZGFsQ3JlYXRvcjogKHJlc29sdmU6IFByb21pc2VSZXNvbHZlPFZhbHVlPikgPT4gTW9kYWwpOiBQcm9taXNlPFZhbHVlPiB7XG4gIHJldHVybiBhd2FpdCBob2xkQnVsa09wZXJhdGlvbldoaWxlKFxuICAgIG5ldyBQcm9taXNlPFZhbHVlPigocmVzb2x2ZSkgPT4ge1xuICAgICAgY29uc3QgbW9kYWwgPSBtb2RhbENyZWF0b3IocmVzb2x2ZSk7XG4gICAgICBtb2RhbC5vcGVuKCk7XG4gICAgfSlcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBU0Esc0JBQXNCO0FBRXRCLHFDQUF1QztBQUN2Qyw0QkFBb0M7QUFrQzdCLE1BQWUsa0JBQXlCLHNCQUFNO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFJaEM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPWixZQUFZLFFBQTJDO0FBQzVELFVBQU0sT0FBTyxHQUFHO0FBQ2hCLFNBQUssaUJBQWlCLE9BQU87QUFDN0IsU0FBSyxjQUFjLE9BQU8sVUFBVTtBQUFBLEVBQ3RDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1UsY0FBYyxZQUFzQztBQUM1RCxtREFBb0IsS0FBSyxhQUFhLFVBQVU7QUFBQSxFQUNsRDtBQUNGO0FBYUEsZUFBc0IsVUFBaUIsY0FBeUU7QUFDOUcsU0FBTyxVQUFNO0FBQUEsSUFDWCxJQUFJLFFBQWUsQ0FBQyxZQUFZO0FBQzlCLFlBQU0sUUFBUSxhQUFhLE9BQU87QUFDbEMsWUFBTSxLQUFLO0FBQUEsSUFDYixDQUFDO0FBQUEsRUFDSDtBQUNGOyIsIm5hbWVzIjpbXX0=
|
|
@@ -60,5 +60,9 @@ export declare abstract class ModalBase<Value> extends Modal {
|
|
|
60
60
|
* @typeParam Value - The type of the value resolved by the modal.
|
|
61
61
|
* @param modalCreator - A function that creates a modal.
|
|
62
62
|
* @returns A {@link Promise} that resolves when the modal is closed.
|
|
63
|
+
*
|
|
64
|
+
* @remarks
|
|
65
|
+
* While the modal is open, a bulk operation that awaits it keeps its lease lock fresh, through
|
|
66
|
+
* `holdBulkOperationWhile`.
|
|
63
67
|
*/
|
|
64
68
|
export declare function showModal<Value>(modalCreator: (resolve: PromiseResolve<Value>) => Modal): Promise<Value>;
|