sliftutils 1.7.102 → 1.7.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/index.d.ts +223 -7
  2. package/package.json +2 -2
  3. package/storage/IArchives.d.ts +18 -0
  4. package/storage/IArchives.ts +14 -0
  5. package/storage/StreamingLogs.d.ts +77 -0
  6. package/storage/StreamingLogs.ts +412 -0
  7. package/storage/TransactionFile.d.ts +12 -6
  8. package/storage/TransactionFile.ts +44 -12
  9. package/storage/dist/IArchives.ts.cache +2 -2
  10. package/storage/dist/StreamingLogs.ts.cache +397 -0
  11. package/storage/dist/TransactionFile.ts.cache +41 -9
  12. package/storage/remoteStorage/ArchivesRemote.ts +3 -3
  13. package/storage/remoteStorage/blobStore.d.ts +28 -0
  14. package/storage/remoteStorage/blobStore.ts +117 -11
  15. package/storage/remoteStorage/createArchives.d.ts +40 -1
  16. package/storage/remoteStorage/createArchives.ts +84 -0
  17. package/storage/remoteStorage/dist/ArchivesRemote.ts.cache +5 -5
  18. package/storage/remoteStorage/dist/blobStore.ts.cache +122 -12
  19. package/storage/remoteStorage/dist/createArchives.ts.cache +87 -3
  20. package/storage/remoteStorage/dist/storageController.ts.cache +40 -3
  21. package/storage/remoteStorage/dist/storageLogs.ts.cache +109 -0
  22. package/storage/remoteStorage/dist/storageServerState.ts.cache +18 -4
  23. package/storage/remoteStorage/dist/storeSync.ts.cache +43 -2
  24. package/storage/remoteStorage/spec.md +4 -0
  25. package/storage/remoteStorage/storageController.d.ts +10 -0
  26. package/storage/remoteStorage/storageController.ts +37 -3
  27. package/storage/remoteStorage/storageLogs.d.ts +29 -0
  28. package/storage/remoteStorage/storageLogs.ts +96 -0
  29. package/storage/remoteStorage/storageServerState.ts +16 -2
  30. package/storage/remoteStorage/storeSync.d.ts +1 -0
  31. package/storage/remoteStorage/storeSync.ts +38 -0
  32. package/yarn.lock +4 -4
@@ -13,6 +13,7 @@ const SocketFunction_1 = require("socket-function/SocketFunction");
13
13
  const storageClientController_1 = require("./storageClientController");
14
14
  const storePlan_1 = require("./storePlan");
15
15
  const accessStats_1 = require("./accessStats");
16
+ const storageLogs_1 = require("./storageLogs");
16
17
  /**
17
18
  * What this server HAS: the stores, by name (getStore) - made once, self-configuring from there -
18
19
  * and the three entry points a request resolves through (findBucketStore, readBucketInternal,
@@ -41,7 +42,11 @@ function getStore(account, bucketName, name, callerNodeId) {
41
42
  createSource: config => (0, storeSources_1.createStoreSource)({ sourceConfig: config.sourceConfig, folder, writeDelay: config.writeDelay }),
42
43
  applySource: (source, sourceConfig, writeDelay) => (0, storeSources_1.applySourceConfig)(source, sourceConfig, writeDelay),
43
44
  onWriteCounted: (kind, bytes) => (0, accessStats_1.countBucketWrite)(`${account}/${bucketName}`, kind, bytes),
44
- onSyncTransfer: (operation, path, bytes) => (0, accessStats_1.trackAccess)({ account, operation, path: `${bucketName}/${path}`, size: bytes }),
45
+ onSyncTransfer: (operation, path, bytes) => {
46
+ (0, accessStats_1.trackAccess)({ account, operation, path: `${bucketName}/${path}`, size: bytes });
47
+ // Every synchronization write is logged per file, exactly like client mutations - the log is the full account of what moved
48
+ (0, storageLogs_1.logMutation)({ op: operation, account, bucketName, store: name, path, size: bytes });
49
+ },
45
50
  resolveSourceUrl: resolveSourceArchives,
46
51
  // The store is the one that knows when a config landed, and a config with upcoming windows is what boundary scans are armed from
47
52
  onRoutingApplied: routing => (0, intermediateManagement_1.scheduleBoundaryWork)(account, bucketName, routing),
@@ -104,6 +109,7 @@ async function readBucketInternal(account, bucketName, config) {
104
109
  exports.readBucketInternal = readBucketInternal;
105
110
  function aggregateArchivesConfig(bucketStores, routing) {
106
111
  let index = { fileCount: 0, byteCount: 0 };
112
+ let markedIndex = { fileCount: 0, byteCount: 0 };
107
113
  let indexSources = [];
108
114
  let syncing = [];
109
115
  let readerDiskLimit;
@@ -111,6 +117,11 @@ function aggregateArchivesConfig(bucketStores, routing) {
111
117
  let progress = store.getSyncProgress();
112
118
  index.fileCount += progress.index.fileCount;
113
119
  index.byteCount += progress.index.byteCount;
120
+ markedIndex.fileCount += progress.marked.fileCount;
121
+ markedIndex.byteCount += progress.marked.byteCount;
122
+ if (progress.marked.oldestDeleteTime !== undefined && (markedIndex.oldestDeleteTime === undefined || progress.marked.oldestDeleteTime < markedIndex.oldestDeleteTime)) {
123
+ markedIndex.oldestDeleteTime = progress.marked.oldestDeleteTime;
124
+ }
114
125
  indexSources.push(...progress.sources);
115
126
  syncing.push(...progress.syncing);
116
127
  readerDiskLimit = readerDiskLimit || progress.readerDiskLimit;
@@ -120,6 +131,7 @@ function aggregateArchivesConfig(bucketStores, routing) {
120
131
  supportsChangesAfter: true,
121
132
  remoteConfig: routing,
122
133
  index,
134
+ markedIndex,
123
135
  indexSources,
124
136
  readerDiskLimit,
125
137
  syncing,
@@ -182,7 +194,9 @@ async function writeRoutingConfig(account, bucketName, name, data, config) {
182
194
  let incoming = (0, remoteConfig_1.parseRoutingData)(data);
183
195
  let current = await (0, bucketDisk_1.readRoutingFromDisk)(account, bucketName);
184
196
  let stored = (0, intermediateManagement_1.reinjectIntermediates)(current, incoming);
185
- await store.set({ path: remoteConfig_1.ROUTING_FILE, data: Buffer.from((0, remoteConfig_1.serializeRemoteConfig)(stored)), lastModified: config === null || config === void 0 ? void 0 : config.lastModified });
197
+ let storedData = Buffer.from((0, remoteConfig_1.serializeRemoteConfig)(stored));
198
+ await store.set({ path: remoteConfig_1.ROUTING_FILE, data: storedData, lastModified: config === null || config === void 0 ? void 0 : config.lastModified });
199
+ (0, storageLogs_1.logMutation)({ op: "routingConfig", account, bucketName, store: name, path: remoteConfig_1.ROUTING_FILE, size: storedData.length, writeTime: config === null || config === void 0 ? void 0 : config.lastModified });
186
200
  (0, storageController_1.broadcastRoutingChanged)();
187
201
  }
188
202
  exports.writeRoutingConfig = writeRoutingConfig;
@@ -269,5 +283,5 @@ async function debugListAccountBuckets(account) {
269
283
  }
270
284
  }
271
285
  exports.debugListAccountBuckets = debugListAccountBuckets;
272
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUl4QyxpREFBd0c7QUFDeEcsaURBQXNFO0FBQ3RFLDJEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsNkNBQXFEO0FBQ3JELDZDQUFrSjtBQUNsSixxRUFBdUY7QUFDdkYsbUVBQWdFO0FBQ2hFLHVFQUFvRTtBQUNwRSwyQ0FBMkM7QUFDM0MsK0NBQXFHO0FBRXJHOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUNILE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFxQixDQUFDO0FBQzVDLCtNQUErTTtBQUMvTSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0MsQ0FBQztBQUUvRCxTQUFnQixRQUFRLENBQUMsT0FBZSxFQUFFLFVBQWtCLEVBQUUsSUFBWSxFQUFFLFlBQXFCO0lBQzdGLDhHQUE4RztJQUM5RyxJQUFBLGtDQUFxQixFQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVCLElBQUksTUFBTSxHQUFHLElBQUEsNEJBQWUsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3hELElBQUksUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxPQUFPLElBQUksVUFBVSxZQUFZLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0csSUFBSSxLQUFLLEdBQUcsSUFBSSxxQkFBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUU7UUFDcEMsbUVBQW1FO1FBQ25FLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUEsd0JBQVks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LEdBQUcsQ0FBQywyQkFBMkIsT0FBTyxVQUFVLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLFVBQVUsS0FBSyxDQUFDLE1BQU0sVUFBVSxDQUFDLENBQUM7SUFDaEgsQ0FBQztBQUNMLENBQUM7QUFyQ0QsMERBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmxvYlN0b3JlIH0gZnJvbSBcIi4vYmxvYlN0b3JlXCI7XG5pbXBvcnQge1xuICAgIFJlbW90ZUNvbmZpZywgU291cmNlQ29uZmlnLCBJQXJjaGl2ZXMsIEFyY2hpdmVzQ29uZmlnLCBBcmNoaXZlc1N5bmNTdGF0dXMsIFN5bmNBY3Rpdml0eSxcbn0gZnJvbSBcIi4uL0lBcmNoaXZlc1wiO1xuaW1wb3J0IHsgUk9VVElOR19GSUxFLCBwYXJzZVJvdXRpbmdEYXRhLCBzZXJpYWxpemVSZW1vdGVDb25maWcsIG5vcm1hbGl6ZVNvdXJjZSB9IGZyb20gXCIuL3JlbW90ZUNvbmZpZ1wiO1xuaW1wb3J0IHsgY3JlYXRlU3RvcmVTb3VyY2UsIGFwcGx5U291cmNlQ29uZmlnIH0gZnJvbSBcIi4vc3RvcmVTb3VyY2VzXCI7XG5pbXBvcnQgeyBicm9hZGNhc3RSb3V0aW5nQ2hhbmdlZCB9IGZyb20gXCIuL3N0b3JhZ2VDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBhc3NlcnRXcml0ZXNBbGxvd2VkIH0gZnJvbSBcIi4vc2VydmVyQ29uZmlnXCI7XG5pbXBvcnQgeyBhc3NlcnRWYWxpZFNvdXJjZU5hbWUgfSBmcm9tIFwiLi92YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBnZXRCdWNrZXRGb2xkZXIsIGxpc3RBY2NvdW50U3RvcmVGb2xkZXJzLCBsaXN0QnVja2V0U3RvcmVGb2xkZXJzLCByZWFkUm91dGluZ0Zyb21EaXNrLCBnZXREaXNrSW5mbywgQnVja2V0RGlza0luZm8gfSBmcm9tIFwiLi9idWNrZXREaXNrXCI7XG5pbXBvcnQgeyBzY2hlZHVsZUJvdW5kYXJ5V29yaywgcmVpbmplY3RJbnRlcm1lZGlhdGVzIH0gZnJvbSBcIi4vaW50ZXJtZWRpYXRlTWFuYWdlbWVudFwiO1xuaW1wb3J0IHsgU29ja2V0RnVuY3Rpb24gfSBmcm9tIFwic29ja2V0LWZ1bmN0aW9uL1NvY2tldEZ1bmN0aW9uXCI7XG5pbXBvcnQgeyBTdG9yYWdlQ2xpZW50Q29udHJvbGxlciB9IGZyb20gXCIuL3N0b3JhZ2VDbGllbnRDb250cm9sbGVyXCI7XG5pbXBvcnQgeyBpc1NlbGZTb3VyY2UgfSBmcm9tIFwiLi9zdG9yZVBsYW5cIjtcbmltcG9ydCB7IGNvdW50QnVja2V0V3JpdGUsIGdldEJ1Y2tldFdyaXRlU3RhdHMsIHRyYWNrQWNjZXNzLCBCdWNrZXRXcml0ZVN0YXRzIH0gZnJvbSBcIi4vYWNjZXNzU3RhdHNcIjtcblxuLyoqXG4gKiBXaGF0IHRoaXMgc2VydmVyIEhBUzogdGhlIHN0b3JlcywgYnkgbmFtZSAoZ2V0U3RvcmUpIC0gbWFkZSBvbmNlLCBzZWxmLWNvbmZpZ3VyaW5nIGZyb20gdGhlcmUgLVxuICogYW5kIHRoZSB0aHJlZSBlbnRyeSBwb2ludHMgYSByZXF1ZXN0IHJlc29sdmVzIHRocm91Z2ggKGZpbmRCdWNrZXRTdG9yZSwgcmVhZEJ1Y2tldEludGVybmFsLFxuICogd3JpdGVSb3V0aW5nQ29uZmlnKS4gVGhlcmUgaXMgbm8gY2FjaGVkIGJ1Y2tldCBzdGF0ZTogYSBidWNrZXQgaXMgbm90aGluZyBidXQgdGhlIHN0b3JlcyB3aG9zZVxuICogZm9sZGVycyBzaGFyZSBpdHMgbmFtZSwgbGlzdGVkIG9mZiB0aGUgZGlzayB3aGVuIHNvbWV0aGluZyBnZW51aW5lbHkgbmVlZHMgYWxsIG9mIHRoZW0uXG4gKi9cblxuLyoqXG4gKiBFdmVyeSBzdG9yZSB0aGlzIHByb2Nlc3MgcnVucywgYnkgZm9sZGVyIC0gd2hpY2ggSVMgdGhlIHN0b3JlJ3MgaWRlbnRpdHk6IGFjY291bnQsIG5hbWUsIGJ1Y2tldC5cbiAqIEEgc3RvcmUgaXMgbWFkZSBvbmNlLCBjb25maWd1cmVzIGl0c2VsZiBmcm9tIHRoZSByb3V0aW5nIGNvbmZpZyBpdCBob2xkcywgYW5kIHN0YXlzOyBub3RoaW5nIGhlcmVcbiAqIGRlY2lkZXMgd2hhdCBpdCBpcywgb25seSB0aGF0IGl0IGV4aXN0cy5cbiAqL1xuY29uc3Qgc3RvcmVzID0gbmV3IE1hcDxzdHJpbmcsIEJsb2JTdG9yZT4oKTtcbi8vIFRoZSBvcGVuZWQgc3RvcmVzIG9mIGVhY2ggYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGJ5IG5hbWUgLSB3aGljaCBidWNrZXRzIGFyZSBBQ1RJVkUgKHNvbWV0aGluZyB0b3VjaGVkIHRoZW0pLCBmb3IgZGVwbG95IGhhbmRvZmZzIGFuZCB0aGUgZGVidWcgcGFnZXMuIFB1cmVseSBhIHJlZ2lzdHJ5IG9mIHdoYXQgZ2V0U3RvcmUgYWxyZWFkeSBtYWRlLlxuY29uc3QgYWN0aXZlU3RvcmVzID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIEJsb2JTdG9yZT4+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdG9yZShhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgbmFtZTogc3RyaW5nLCBjYWxsZXJOb2RlSWQ/OiBzdHJpbmcpOiBCbG9iU3RvcmUge1xuICAgIC8vIFRoZSBvbmUgcGxhY2UgYSBuYW1lIGJlY29tZXMgYSBmb2xkZXIsIHNvIHRoZSBvbmUgcGxhY2UgaXQgaXMgdmFsaWRhdGVkIChpdCBjYW4gY29tZSBzdHJhaWdodCBvZmYgdGhlIHdpcmUpXG4gICAgYXNzZXJ0VmFsaWRTb3VyY2VOYW1lKG5hbWUpO1xuICAgIGxldCBmb2xkZXIgPSBnZXRCdWNrZXRGb2xkZXIobmFtZSwgYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IGV4aXN0aW5nID0gc3RvcmVzLmdldChmb2xkZXIpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnNvbGUubG9nKGBPcGVuaW5nIHN0b3JlICR7SlNPTi5zdHJpbmdpZnkobmFtZSl9IG9mIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX0gKGZvbGRlciAke2ZvbGRlcn0pYCk7XG4gICAgbGV0IHN0b3JlID0gbmV3IEJsb2JTdG9yZShmb2xkZXIsIG5hbWUsIHtcbiAgICAgICAgLy8gV2hpY2ggZW50cmllcyBpbiBJVFMgcm91dGluZyBjb25maWcgYXJlIHRoaXMgc2VydmVyJ3MgY29weSBvZiBpdFxuICAgICAgICBpc1NlbGY6IHNvdXJjZSA9PiBpc1NlbGZTb3VyY2Uoc291cmNlLCBhY2NvdW50LCBidWNrZXROYW1lKSxcbiAgICAgICAgY3JlYXRlU291cmNlOiBjb25maWcgPT4gY3JlYXRlU3RvcmVTb3VyY2UoeyBzb3VyY2VDb25maWc6IGNvbmZpZy5zb3VyY2VDb25maWcsIGZvbGRlciwgd3JpdGVEZWxheTogY29uZmlnLndyaXRlRGVsYXkgfSksXG4gICAgICAgIGFwcGx5U291cmNlOiAoc291cmNlLCBzb3VyY2VDb25maWcsIHdyaXRlRGVsYXkpID0+IGFwcGx5U291cmNlQ29uZmlnKHNvdXJjZSwgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5KSxcbiAgICAgICAgb25Xcml0ZUNvdW50ZWQ6IChraW5kLCBieXRlcykgPT4gY291bnRCdWNrZXRXcml0ZShgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YCwga2luZCwgYnl0ZXMpLFxuICAgICAgICBvblN5bmNUcmFuc2ZlcjogKG9wZXJhdGlvbiwgcGF0aCwgYnl0ZXMpID0+IHRyYWNrQWNjZXNzKHsgYWNjb3VudCwgb3BlcmF0aW9uLCBwYXRoOiBgJHtidWNrZXROYW1lfS8ke3BhdGh9YCwgc2l6ZTogYnl0ZXMgfSksXG4gICAgICAgIHJlc29sdmVTb3VyY2VVcmw6IHJlc29sdmVTb3VyY2VBcmNoaXZlcyxcbiAgICAgICAgLy8gVGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIGEgY29uZmlnIHdpdGggdXBjb21pbmcgd2luZG93cyBpcyB3aGF0IGJvdW5kYXJ5IHNjYW5zIGFyZSBhcm1lZCBmcm9tXG4gICAgICAgIG9uUm91dGluZ0FwcGxpZWQ6IHJvdXRpbmcgPT4gc2NoZWR1bGVCb3VuZGFyeVdvcmsoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyksXG4gICAgICAgIC8vIFRoZSBzdG9yZSB3YXMgY3JlYXRlZCBieSB0aGlzIGNhbGxlcidzIHJlcXVlc3QsIHNvIHRoZSBjYWxsZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3IgdGhpcyBuYW1lIC0gdGhlIHN0b3JlIGFza3MgaXQgd2hlbiBpdHMgb3duIGZvbGRlciBob2xkcyBubyBjb25maWd1cmF0aW9uIChzZWUgQmxvYlN0b3JlLmluaXQpXG4gICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnOiBjYWxsZXJOb2RlSWQgJiYgKGFzeW5jICgpID0+IGF3YWl0IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW2NhbGxlck5vZGVJZF0uZ2V0Um91dGluZ0NvbmZpZ0Zvck5hbWUoeyBhY2NvdW50LCBidWNrZXROYW1lLCBuYW1lIH0pKSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgc3RvcmVzLnNldChmb2xkZXIsIHN0b3JlKTtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGJ5TmFtZSA9IGFjdGl2ZVN0b3Jlcy5nZXQoa2V5KTtcbiAgICBpZiAoIWJ5TmFtZSkge1xuICAgICAgICBieU5hbWUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGFjdGl2ZVN0b3Jlcy5zZXQoa2V5LCBieU5hbWUpO1xuICAgIH1cbiAgICBieU5hbWUuc2V0KG5hbWUsIHN0b3JlKTtcbiAgICAvLyBMYXp5IGluaXQgd291bGQgbGVhdmUgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHNpdHRpbmcgaW5lcnQgLSBubyBpbmRleCBsb2FkZWQsIG5vIGNvbmZpZyBhcHBsaWVkLCBub3RoaW5nIHN5bmNocm9uaXppbmcgLSB3aGlsZSBpdHMgZm9sZGVyIGlzIGZ1bGwgb2YgZmlsZXNcbiAgICB2b2lkIHN0b3JlLmluaXQoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEluaXRpYWxpemluZyBzdG9yZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBvZiBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJldHVybiBzdG9yZTtcbn1cblxuLyoqIFRoZSBzdG9yZSBzZXJ2aW5nIGEgcmVxdWVzdDogdGhlIG9uZSB0aGUgY2xpZW50J3Mgc2VsZWN0ZWQgZW50cnkgTkFNRVMuIEFjY291bnQsIG5hbWUsIGFuZCBidWNrZXQgQVJFIHRoZSBmb2xkZXIsIHNvIHRoaXMgaXMgYSBkaXJlY3QgbG9va3VwLCBuZXZlciBhIHNlYXJjaCBvZiB3aGF0IGV4aXN0cyAtIGFuZCBhIG5hbWUgdGhpcyBzZXJ2ZXIgaGFzIG5ldmVyIHNlZW4gaXMgQ1JFQVRFRCwgbmV2ZXIgcmVqZWN0ZWQsIGJlY2F1c2UgYXNraW5nIGZvciBhIG5hbWUgaXMgdGhlIGluc3RydWN0aW9uIHRvIGhhdmUgdGhhdCBzdG9yZSAob25lIG5hbWUsIG9uZSBmb2xkZXIsIG9uZSBpbmRleDsgaXQgY29uZmlndXJlcyBpdHNlbGYgb25jZSB0aGUgcm91dGluZyBjb25maWcgbGFuZHMgaW4gaXQpLiBOb3RoaW5nIGVsc2UgYWJvdXQgdGhlIHJlcXVlc3QgaXMgY29tcGFyZWQgLSBub3QgdGhlIHdpbmRvdywgbm90IHRoZSByb3V0ZSwgbm90IHRoZSBmbGFncyAtIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBuYW1pbmcgaXQ6IGEgY2xpZW50IGEgY29uZmlnIHZlcnNpb24gYmVoaW5kIG9uIHNvbWUgZmxhZyBzdGlsbCByZWFjaGVzIHRoZSByaWdodCBzdG9yZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnVja2V0U3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkKTogQmxvYlN0b3JlIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbW90ZSBzb3VyY2UgY29uZmlndXJhdGlvbiB3YXMgcHJvdmlkZWQgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IGV2ZXJ5IHJlcXVlc3QgbXVzdCBzYXkgd2hpY2ggY29uZmlndXJlZCBzb3VyY2UgaXQgc2VsZWN0ZWRgKTtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlcidzIGlkLCBzbyBhIHN0b3JlIHRoaXMgcmVxdWVzdCBDUkVBVEVTIGNhbiBhc2sgdGhhdCBjYWxsZXIgZm9yIHRoZSBjb25maWcgaXQgaW50ZW5kZWQgKGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBhbmQgdGhlIHJlcXVlc3RlciBob2xkcyB0aGF0IGNvbmZpZylcbiAgICBsZXQgY2FsbGVyTm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FsbGVyTm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk/Lm5vZGVJZDtcbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBnZXRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBzb3VyY2VDb25maWcubmFtZSwgY2FsbGVyTm9kZUlkKTtcbn1cblxuLyoqIFRoZSBzdG9yZXMgb2YgYSBidWNrZXQgYXMgdGhlIERJU0sgcmVjb3JkcyB0aGVtIChhIGJ1Y2tldCBpcyBub3RoaW5nIG1vcmUgdGhhbiB0aGUgc3RvcmUgZm9sZGVycyBzaGFyaW5nIGl0cyBuYW1lKSwgb3BlbmVkIC0gc28gdGhlIG9uZXMgdGhhdCB3ZXJlbid0IHJ1bm5pbmcgeWV0IHN0YXJ0IHN5bmNocm9uaXppbmcuIEVtcHR5IHdoZW4gdGhlIGJ1Y2tldCBkb2VzIG5vdCBleGlzdCBoZXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHN0b3JlOiBCbG9iU3RvcmUgfVtdPiB7XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QnVja2V0U3RvcmVGb2xkZXJzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiBmb2xkZXJzLm1hcCh4ID0+ICh7IG5hbWU6IHgubmFtZSwgc3RvcmU6IGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHgubmFtZSkgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgc3RvcmU6IEJsb2JTdG9yZSB9W10+IHtcbiAgICBsZXQgbGlzdCA9IGF3YWl0IGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlci4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZHMgc2tpcCBzdG9yZSBzZWxlY3Rpb24gZW50aXJlbHk6IHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSB3aG9zZSBpbmRleCBzYXlzIHRoaXMgTUFDSElORSBob2xkcyB0aGUgYnl0ZXMgLSB0aGUgcGVyc2lzdGVkIGhvbGRlciBpZGVudGl0eSBpcyBqdXN0IGEgVVJMLCB3aGljaCBjYW5ub3QgbmFtZSBhIHN0b3JlLiBXaGljaGV2ZXIgc3RvcmUncyBmb2xkZXIgaGFzIHRoZSBuZXdlc3QgY29weSBhbnN3ZXJzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWNrZXRJbnRlcm5hbChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXQyKHsgcGF0aDogY29uZmlnLnBhdGgsIHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMsIGludGVybmFsOiB0cnVlIH0pKSk7XG4gICAgbGV0IGJlc3Q6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAoIWJlc3QgfHwgcmVzdWx0LndyaXRlVGltZSA+IGJlc3Qud3JpdGVUaW1lKSkge1xuICAgICAgICAgICAgYmVzdCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzOiBCbG9iU3RvcmVbXSwgcm91dGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkKTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBpbmRleCA9IHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfTtcbiAgICBsZXQgaW5kZXhTb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdID0gW107XG4gICAgbGV0IHN5bmNpbmc6IFN5bmNBY3Rpdml0eVtdID0gW107XG4gICAgbGV0IHJlYWRlckRpc2tMaW1pdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGZvciAobGV0IHN0b3JlIG9mIGJ1Y2tldFN0b3Jlcykge1xuICAgICAgICBsZXQgcHJvZ3Jlc3MgPSBzdG9yZS5nZXRTeW5jUHJvZ3Jlc3MoKTtcbiAgICAgICAgaW5kZXguZmlsZUNvdW50ICs9IHByb2dyZXNzLmluZGV4LmZpbGVDb3VudDtcbiAgICAgICAgaW5kZXguYnl0ZUNvdW50ICs9IHByb2dyZXNzLmluZGV4LmJ5dGVDb3VudDtcbiAgICAgICAgaW5kZXhTb3VyY2VzLnB1c2goLi4ucHJvZ3Jlc3Muc291cmNlcyk7XG4gICAgICAgIHN5bmNpbmcucHVzaCguLi5wcm9ncmVzcy5zeW5jaW5nKTtcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0ID0gcmVhZGVyRGlza0xpbWl0IHx8IHByb2dyZXNzLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gRXZlcnkgc3RvcmUgaXMgaW5kZXgtYmFja2VkLCBzbyB0aGUgY2hhbmdlIGZlZWQgaXMgYWx3YXlzIG5hdGl2ZVxuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSxcbiAgICAgICAgcmVtb3RlQ29uZmlnOiByb3V0aW5nLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgaW5kZXhTb3VyY2VzLFxuICAgICAgICByZWFkZXJEaXNrTGltaXQsXG4gICAgICAgIHN5bmNpbmcsXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldEFyY2hpdmVzQ29uZmlnKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcmNoaXZlc0NvbmZpZz4ge1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICByZXR1cm4gYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzLm1hcCh4ID0+IHguc3RvcmUpLCByb3V0aW5nKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1Y2tldFN5bmNTdGF0dXMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPEFyY2hpdmVzU3luY1N0YXR1cz4ge1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBzdGF0dXNlcyA9IGF3YWl0IFByb21pc2UuYWxsKGJ1Y2tldFN0b3Jlcy5tYXAocyA9PiBzLnN0b3JlLmdldFN5bmNTdGF0dXMoKSkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGFsbFNjYW5zQ29tcGxldGU6IHN0YXR1c2VzLmV2ZXJ5KHggPT4geC5hbGxTY2Fuc0NvbXBsZXRlKSxcbiAgICAgICAgaW5kZXhTaXplOiBzdGF0dXNlcy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5pbmRleFNpemUsIDApLFxuICAgICAgICBzb3VyY2VzOiBzdGF0dXNlcy5mbGF0TWFwKHggPT4geC5zb3VyY2VzKSxcbiAgICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVidWdCdWNrZXRJbmRleFRvdGFscyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXI7IHNvdXJjZXM6IHsgZGVidWdOYW1lOiBzdHJpbmc7IGZpbGVDb3VudDogbnVtYmVyOyBieXRlQ291bnQ6IG51bWJlciB9W10gfT4ge1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCB0b3RhbHMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5jb21wdXRlSW5kZXhUb3RhbHMoKSkpO1xuICAgIHJldHVybiB7XG4gICAgICAgIGZpbGVDb3VudDogdG90YWxzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmZpbGVDb3VudCwgMCksXG4gICAgICAgIGJ5dGVDb3VudDogdG90YWxzLnJlZHVjZSgoc3VtLCB4KSA9PiBzdW0gKyB4LmJ5dGVDb3VudCwgMCksXG4gICAgICAgIHNvdXJjZXM6IHRvdGFscy5mbGF0TWFwKHggPT4geC5zb3VyY2VzKSxcbiAgICB9O1xufVxuXG5jb25zdCByZXNvbHZlZFNvdXJjZUFyY2hpdmVzID0gbmV3IE1hcDxzdHJpbmcsIElBcmNoaXZlcz4oKTtcbi8qKiBBIGNhY2hlZCBJQXJjaGl2ZXMgZm9yIGEgcGVyc2lzdGVkIHNvdXJjZSBpZGVudGl0eTogYSByb3V0aW5nIFVSTCAoaG9zdGVkL2JhY2tibGF6ZSkgb3IgYSBkaXNrIGZvbGRlciBwYXRoIC0gdGhlIGZvcm0gQmxvYlN0b3JlJ3Mgc291cmNlcyBsaXN0IHN0b3Jlcy4gQ29uZmlndXJhdGlvbiAodmFsaWQgd2luZG93cywgcm91dGVzKSBkZWNpZGVzIFdIRU4gYSBzb3VyY2Ugc2hvdWxkIGJlIHVzZWQ7IGZvciByZWFkaW5nIGJ5dGVzIHRoZSBpbmRleCBzYXlzIGEgc291cmNlIGhvbGRzLCB0aGUgVVJMIGFsb25lIGlzIGVub3VnaCAtIGV2ZW4gZm9yIHNvdXJjZXMgbm8gbG9uZ2VyIGluIGFueSBjb25maWcuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVNvdXJjZUFyY2hpdmVzKHVybDogc3RyaW5nKTogSUFyY2hpdmVzIHtcbiAgICBsZXQgZXhpc3RpbmcgPSByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLmdldCh1cmwpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGxldCBzb3VyY2VDb25maWc6IFNvdXJjZUNvbmZpZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL1wiKSkge1xuICAgICAgICAvLyBUaGUgY29uZmlnIGlzIGZhYnJpY2F0ZWQgZnJvbSB0aGUgYmFyZSBVUkwgYW5kIGNhbiBuZXZlciBleGFjdC1tYXRjaCBhIHNlcnZlcidzIGVudHJpZXMgLSB3aGljaCBpcyBmaW5lLCBiZWNhdXNlIGhvbGRlciByZWFkcyBhcmUgaW50ZXJuYWwgcmVhZHMsIGFuZCBpbnRlcm5hbCByZWFkcyBuZXZlciBzZWxlY3QgYSBzdG9yZSAoc2VlIHJlYWRCdWNrZXRJbnRlcm5hbClcbiAgICAgICAgc291cmNlQ29uZmlnID0gbm9ybWFsaXplU291cmNlKHVybCk7XG4gICAgfVxuICAgIGxldCBhcmNoaXZlcyA9IGNyZWF0ZVN0b3JlU291cmNlKHsgc291cmNlQ29uZmlnLCBmb2xkZXI6IHVybCB9KTtcbiAgICByZXNvbHZlZFNvdXJjZUFyY2hpdmVzLnNldCh1cmwsIGFyY2hpdmVzKTtcbiAgICByZXR1cm4gYXJjaGl2ZXM7XG59XG5cbi8qKlxuICogV3JpdGluZyB0aGUgcm91dGluZyBjb25maWcgaXMgYSB3cml0ZSBsaWtlIGFueSBvdGhlcjogaXQgZ29lcyBpbnRvIGEgc3RvcmUsIGFuZCB0aGUgc3RvcmUgYXBwbGllc1xuICogaXQgdG8gaXRzZWxmIGFuZCBsZXRzIGl0cyBwZWVycyBwdWxsIGl0LiBUaGUgb25seSB0aGluZyB0aGF0IGhhcHBlbnMgaGVyZSBpcyBwaWNraW5nIFdISUNIIHN0b3JlLFxuICogYmVjYXVzZSB0aGUgd3JpdGVyIG5hbWVzIGEgc291cmNlIGFuZCBhIHNvdXJjZSBuYW1lcyBhIHN0b3JlLlxuICpcbiAqIEluLWZsaWdodCBzd2l0Y2hvdmVyIHdpbmRvd3MgYXJlIHJlLWluamVjdGVkIGZpcnN0IChzZWUgaW50ZXJtZWRpYXRlTWFuYWdlbWVudCk6IGFuIG9wZXJhdG9yJ3NcbiAqIGNvbmZpZyBrbm93cyBub3RoaW5nIGFib3V0IGEgc3dpdGNob3ZlciB0aGF0IGlzIGhhcHBlbmluZyByaWdodCBub3csIGFuZCB3cml0aW5nIGl0IGFzLWlzIHdvdWxkXG4gKiBjYW5jZWwgaXQgbWlkLWZsaWdodC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlUm91dGluZ0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgbmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IHsgbGFzdE1vZGlmaWVkPzogbnVtYmVyIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhc3NlcnRXcml0ZXNBbGxvd2VkKCk7XG4gICAgbGV0IHN0b3JlID0gZ2V0U3RvcmUoYWNjb3VudCwgYnVja2V0TmFtZSwgbmFtZSk7XG4gICAgbGV0IGluY29taW5nID0gcGFyc2VSb3V0aW5nRGF0YShkYXRhKTtcbiAgICBsZXQgY3VycmVudCA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHN0b3JlZCA9IHJlaW5qZWN0SW50ZXJtZWRpYXRlcyhjdXJyZW50LCBpbmNvbWluZyk7XG4gICAgYXdhaXQgc3RvcmUuc2V0KHsgcGF0aDogUk9VVElOR19GSUxFLCBkYXRhOiBCdWZmZXIuZnJvbShzZXJpYWxpemVSZW1vdGVDb25maWcoc3RvcmVkKSksIGxhc3RNb2RpZmllZDogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuLyoqIFdoaWNoIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGN1cnJlbnRseSBoYXMgYWN0aXZlIChzb21lIHN0b3JlIG9mIHRoZWlycyB3YXMgb3BlbmVkKSAtIHdoYXQgYSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciwgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbLi4uYWN0aXZlU3RvcmVzLmtleXMoKV0ubWFwKGtleSA9PiB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgcmV0dXJuIHsgYWNjb3VudDoga2V5LnNsaWNlKDAsIHNsYXNoKSwgYnVja2V0TmFtZToga2V5LnNsaWNlKHNsYXNoICsgMSkgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHRoZSBuZXdlc3QgY29weSBhbW9uZyBpdHMgc3RvcmVzLiBBYnNlbnQgd2hlbiBub25lIG9mIHRoZW0gaGFzIG9uZSB5ZXQuICovXG4gICAgcm91dGluZz86IFJlbW90ZUNvbmZpZztcbiAgICBjb25maWc6IEFyY2hpdmVzQ29uZmlnO1xufTtcblxuLyoqIFRoZSBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJ1Y2tldC4gUmV0dXJucyBhbiBlcnJvciBzdHJpbmcgd2hlbiB0aGUgYnVja2V0IGlzIG5vdCBhY3RpdmUgaGVyZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBidWNrZXQgbm90aGluZyBoYXMgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWJ1Z0dldEFjdGl2ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgb3BlbmVkID0gYWN0aXZlU3RvcmVzLmdldChrZXkpO1xuICAgIGlmICghb3BlbmVkIHx8ICFvcGVuZWQuc2l6ZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gaXMgbm90IGFjdGl2ZSBvbiB0aGlzIHNlcnZlciAoYSBidWNrZXQgYWN0aXZhdGVzIG9uIGZpcnN0IGFjY2VzcylgO1xuICAgIH1cbiAgICBsZXQgYnVja2V0U3RvcmVzID0gWy4uLm9wZW5lZC52YWx1ZXMoKV07XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiB7IGZvbGRlcjogYnVja2V0U3RvcmVzWzBdLmZvbGRlciwgcm91dGluZywgY29uZmlnOiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhidWNrZXRTdG9yZXMsIHJvdXRpbmcpIH07XG59XG5cbi8qKiBMb2FkcyBldmVyeSBzdG9yZSBvZiBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlcidzIGRpc2sgaW50byBtZW1vcnksIHdoaWNoIHN0YXJ0cyB0aGVpciBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIHRoZSBidWNrZXQncyBzdGF0ZS4gTm90aGluZyBpcyB3cml0dGVuIGFuZCBubyBvdGhlciBzZXJ2ZXIgaXMgY29udGFjdGVkIC0gdW5saWtlIGJ1aWxkaW5nIGFuIEFyY2hpdmVzQ2hhaW4gZm9yIGl0LCB3aGljaCB3b3VsZCBwcm9iZSBldmVyeSBzb3VyY2UgYW5kIGNvdWxkIHdyaXRlIHRoZSByb3V0aW5nIGNvbmZpZy4gQWxyZWFkeS1hY3RpdmUgYnVja2V0cyBqdXN0IHJldHVybiB0aGVpciBzdGF0ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgd2FzQWN0aXZlID0gYWN0aXZlU3RvcmVzLmhhcyhrZXkpO1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCBnZXRCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFidWNrZXRTdG9yZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciAoaXQgaGFzIG5vIHN0b3JlIGZvbGRlcnMgdW5kZXIgJHtnZXRCdWNrZXRGb2xkZXIoXCI8bmFtZT5cIiwgYWNjb3VudCwgYnVja2V0TmFtZSl9KWA7XG4gICAgfVxuICAgIC8vIFdhaXQgZm9yIHRoZSBpbmRleGVzIHRvIGxvYWQsIHNvIHRoZSB0b3RhbHMgd2UgcmV0dXJuIGFyZSB0aGUgcmVhbCBvbmVzIHJhdGhlciB0aGFuIHplcm9lcyBmcm9tIHN0b3JlcyB0aGF0IGhhdmUgbm90IHJlYWQgdGhlaXIgaW5kZXggeWV0LiBUaGUgc291cmNlIHNjYW5zIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICBmb3IgKGxldCBzIG9mIGJ1Y2tldFN0b3Jlcykge1xuICAgICAgICBhd2FpdCBzLnN0b3JlLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKCF3YXNBY3RpdmUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFjdGl2YXRlZCBidWNrZXQgJHtrZXl9IG9uIHJlcXVlc3Q6IGl0cyAke2J1Y2tldFN0b3Jlcy5sZW5ndGh9IHN0b3JlKHMpIGFyZSBub3cgbG9hZGVkIGFuZCBzeW5jaHJvbml6aW5nYCk7XG4gICAgfVxuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICByZXR1cm4geyBmb2xkZXI6IGJ1Y2tldFN0b3Jlc1swXS5zdG9yZS5mb2xkZXIsIHJvdXRpbmcsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzLm1hcCh4ID0+IHguc3RvcmUpLCByb3V0aW5nKSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVidWdMaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIC8vIFRoZSBkaXNrIGlzIHRoZSByZWNvcmQ6IGEgYnVja2V0IGV4aXN0cyBoZXJlIHdoZW4gaXQgaGFzIGF0IGxlYXN0IG9uZSBzdG9yZSBmb2xkZXIsIGFuZCBzZXZlcmFsIG5hbWVzIGZvciBvbmUgYnVja2V0IGFyZSBzdGlsbCBvbmUgYnVja2V0XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QWNjb3VudFN0b3JlRm9sZGVycyhhY2NvdW50KTtcbiAgICBsZXQgYnlCdWNrZXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAobGV0IHN0b3JlIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGJ5QnVja2V0LmhhcyhzdG9yZS5idWNrZXROYW1lKSkgY29udGludWU7XG4gICAgICAgIGJ5QnVja2V0LnNldChzdG9yZS5idWNrZXROYW1lLCBzdG9yZS5mb2xkZXIpO1xuICAgIH1cbiAgICBsZXQgbmFtZXMgPSBbLi4uYnlCdWNrZXQua2V5cygpXTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGJ5QnVja2V0LmdldChidWNrZXROYW1lKSB8fCBcIlwiO1xuICAgICAgICAgICAgbGV0IGJhc2U6IFNlcnZlckJ1Y2tldEluZm8gPSB7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogYWN0aXZlU3RvcmVzLmhhcyhrZXkpLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGJhc2UuZGlzayA9IGF3YWl0IGdldERpc2tJbmZvKGZvbGRlcikuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFzZS5kaXNrRXJyb3IgPSBTdHJpbmcoZS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3BlbmVkID0gWy4uLihhY3RpdmVTdG9yZXMuZ2V0KGtleSk/LnZhbHVlcygpIHx8IFtdKV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcob3BlbmVkLCByb3V0aW5nKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IGBObyByb3V0aW5nIGZpbGUgKCR7Uk9VVElOR19GSUxFfSkgaW4gYW55IG9mIGl0cyBzdG9yZXNgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHJvdXRpbmcgfSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cygke2FjY291bnR9KSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIGZvciAke25hbWVzLmxlbmd0aH0gYnVja2V0c2ApO1xuICAgIH1cbn1cbiJdfQ==
273
- /* _JS_SOURCE_HASH = "0610fb205ae2760aa22c409c7d2cacbdf37367c3edc627ca3e9b65151a7e4562"; */
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZVNlcnZlclN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RvcmFnZVNlcnZlclN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF3QztBQUl4QyxpREFBd0c7QUFDeEcsaURBQXNFO0FBQ3RFLDJEQUE4RDtBQUM5RCxpREFBcUQ7QUFDckQsNkNBQXFEO0FBQ3JELDZDQUFrSjtBQUNsSixxRUFBdUY7QUFDdkYsbUVBQWdFO0FBQ2hFLHVFQUFvRTtBQUNwRSwyQ0FBMkM7QUFDM0MsK0NBQXFHO0FBQ3JHLCtDQUE0QztBQUU1Qzs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBcUIsQ0FBQztBQUM1QywrTUFBK007QUFDL00sTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQWtDLENBQUM7QUFFL0QsU0FBZ0IsUUFBUSxDQUFDLE9BQWUsRUFBRSxVQUFrQixFQUFFLElBQVksRUFBRSxZQUFxQjtJQUM3Riw4R0FBOEc7SUFDOUcsSUFBQSxrQ0FBcUIsRUFBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixJQUFJLE1BQU0sR0FBRyxJQUFBLDRCQUFlLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUN4RCxJQUFJLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsT0FBTyxJQUFJLFVBQVUsWUFBWSxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNHLElBQUksS0FBSyxHQUFHLElBQUkscUJBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFO1FBQ3BDLG1FQUFtRTtRQUNuRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FB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Q0FBQyxDQUFDO0lBQ2hILENBQUM7QUFDTCxDQUFDO0FBckNELDBEQXFDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJsb2JTdG9yZSB9IGZyb20gXCIuL2Jsb2JTdG9yZVwiO1xuaW1wb3J0IHtcbiAgICBSZW1vdGVDb25maWcsIFNvdXJjZUNvbmZpZywgSUFyY2hpdmVzLCBBcmNoaXZlc0NvbmZpZywgQXJjaGl2ZXNTeW5jU3RhdHVzLCBTeW5jQWN0aXZpdHksXG59IGZyb20gXCIuLi9JQXJjaGl2ZXNcIjtcbmltcG9ydCB7IFJPVVRJTkdfRklMRSwgcGFyc2VSb3V0aW5nRGF0YSwgc2VyaWFsaXplUmVtb3RlQ29uZmlnLCBub3JtYWxpemVTb3VyY2UgfSBmcm9tIFwiLi9yZW1vdGVDb25maWdcIjtcbmltcG9ydCB7IGNyZWF0ZVN0b3JlU291cmNlLCBhcHBseVNvdXJjZUNvbmZpZyB9IGZyb20gXCIuL3N0b3JlU291cmNlc1wiO1xuaW1wb3J0IHsgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQgfSBmcm9tIFwiLi9zdG9yYWdlQ29udHJvbGxlclwiO1xuaW1wb3J0IHsgYXNzZXJ0V3JpdGVzQWxsb3dlZCB9IGZyb20gXCIuL3NlcnZlckNvbmZpZ1wiO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRTb3VyY2VOYW1lIH0gZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgZ2V0QnVja2V0Rm9sZGVyLCBsaXN0QWNjb3VudFN0b3JlRm9sZGVycywgbGlzdEJ1Y2tldFN0b3JlRm9sZGVycywgcmVhZFJvdXRpbmdGcm9tRGlzaywgZ2V0RGlza0luZm8sIEJ1Y2tldERpc2tJbmZvIH0gZnJvbSBcIi4vYnVja2V0RGlza1wiO1xuaW1wb3J0IHsgc2NoZWR1bGVCb3VuZGFyeVdvcmssIHJlaW5qZWN0SW50ZXJtZWRpYXRlcyB9IGZyb20gXCIuL2ludGVybWVkaWF0ZU1hbmFnZW1lbnRcIjtcbmltcG9ydCB7IFNvY2tldEZ1bmN0aW9uIH0gZnJvbSBcInNvY2tldC1mdW5jdGlvbi9Tb2NrZXRGdW5jdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUNsaWVudENvbnRyb2xsZXIgfSBmcm9tIFwiLi9zdG9yYWdlQ2xpZW50Q29udHJvbGxlclwiO1xuaW1wb3J0IHsgaXNTZWxmU291cmNlIH0gZnJvbSBcIi4vc3RvcmVQbGFuXCI7XG5pbXBvcnQgeyBjb3VudEJ1Y2tldFdyaXRlLCBnZXRCdWNrZXRXcml0ZVN0YXRzLCB0cmFja0FjY2VzcywgQnVja2V0V3JpdGVTdGF0cyB9IGZyb20gXCIuL2FjY2Vzc1N0YXRzXCI7XG5pbXBvcnQgeyBsb2dNdXRhdGlvbiB9IGZyb20gXCIuL3N0b3JhZ2VMb2dzXCI7XG5cbi8qKlxuICogV2hhdCB0aGlzIHNlcnZlciBIQVM6IHRoZSBzdG9yZXMsIGJ5IG5hbWUgKGdldFN0b3JlKSAtIG1hZGUgb25jZSwgc2VsZi1jb25maWd1cmluZyBmcm9tIHRoZXJlIC1cbiAqIGFuZCB0aGUgdGhyZWUgZW50cnkgcG9pbnRzIGEgcmVxdWVzdCByZXNvbHZlcyB0aHJvdWdoIChmaW5kQnVja2V0U3RvcmUsIHJlYWRCdWNrZXRJbnRlcm5hbCxcbiAqIHdyaXRlUm91dGluZ0NvbmZpZykuIFRoZXJlIGlzIG5vIGNhY2hlZCBidWNrZXQgc3RhdGU6IGEgYnVja2V0IGlzIG5vdGhpbmcgYnV0IHRoZSBzdG9yZXMgd2hvc2VcbiAqIGZvbGRlcnMgc2hhcmUgaXRzIG5hbWUsIGxpc3RlZCBvZmYgdGhlIGRpc2sgd2hlbiBzb21ldGhpbmcgZ2VudWluZWx5IG5lZWRzIGFsbCBvZiB0aGVtLlxuICovXG5cbi8qKlxuICogRXZlcnkgc3RvcmUgdGhpcyBwcm9jZXNzIHJ1bnMsIGJ5IGZvbGRlciAtIHdoaWNoIElTIHRoZSBzdG9yZSdzIGlkZW50aXR5OiBhY2NvdW50LCBuYW1lLCBidWNrZXQuXG4gKiBBIHN0b3JlIGlzIG1hZGUgb25jZSwgY29uZmlndXJlcyBpdHNlbGYgZnJvbSB0aGUgcm91dGluZyBjb25maWcgaXQgaG9sZHMsIGFuZCBzdGF5czsgbm90aGluZyBoZXJlXG4gKiBkZWNpZGVzIHdoYXQgaXQgaXMsIG9ubHkgdGhhdCBpdCBleGlzdHMuXG4gKi9cbmNvbnN0IHN0b3JlcyA9IG5ldyBNYXA8c3RyaW5nLCBCbG9iU3RvcmU+KCk7XG4vLyBUaGUgb3BlbmVkIHN0b3JlcyBvZiBlYWNoIGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gLCBieSBuYW1lIC0gd2hpY2ggYnVja2V0cyBhcmUgQUNUSVZFIChzb21ldGhpbmcgdG91Y2hlZCB0aGVtKSwgZm9yIGRlcGxveSBoYW5kb2ZmcyBhbmQgdGhlIGRlYnVnIHBhZ2VzLiBQdXJlbHkgYSByZWdpc3RyeSBvZiB3aGF0IGdldFN0b3JlIGFscmVhZHkgbWFkZS5cbmNvbnN0IGFjdGl2ZVN0b3JlcyA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBCbG9iU3RvcmU+PigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgY2FsbGVyTm9kZUlkPzogc3RyaW5nKTogQmxvYlN0b3JlIHtcbiAgICAvLyBUaGUgb25lIHBsYWNlIGEgbmFtZSBiZWNvbWVzIGEgZm9sZGVyLCBzbyB0aGUgb25lIHBsYWNlIGl0IGlzIHZhbGlkYXRlZCAoaXQgY2FuIGNvbWUgc3RyYWlnaHQgb2ZmIHRoZSB3aXJlKVxuICAgIGFzc2VydFZhbGlkU291cmNlTmFtZShuYW1lKTtcbiAgICBsZXQgZm9sZGVyID0gZ2V0QnVja2V0Rm9sZGVyKG5hbWUsIGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBleGlzdGluZyA9IHN0b3Jlcy5nZXQoZm9sZGVyKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBjb25zb2xlLmxvZyhgT3BlbmluZyBzdG9yZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBvZiBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IChmb2xkZXIgJHtmb2xkZXJ9KWApO1xuICAgIGxldCBzdG9yZSA9IG5ldyBCbG9iU3RvcmUoZm9sZGVyLCBuYW1lLCB7XG4gICAgICAgIC8vIFdoaWNoIGVudHJpZXMgaW4gSVRTIHJvdXRpbmcgY29uZmlnIGFyZSB0aGlzIHNlcnZlcidzIGNvcHkgb2YgaXRcbiAgICAgICAgaXNTZWxmOiBzb3VyY2UgPT4gaXNTZWxmU291cmNlKHNvdXJjZSwgYWNjb3VudCwgYnVja2V0TmFtZSksXG4gICAgICAgIGNyZWF0ZVNvdXJjZTogY29uZmlnID0+IGNyZWF0ZVN0b3JlU291cmNlKHsgc291cmNlQ29uZmlnOiBjb25maWcuc291cmNlQ29uZmlnLCBmb2xkZXIsIHdyaXRlRGVsYXk6IGNvbmZpZy53cml0ZURlbGF5IH0pLFxuICAgICAgICBhcHBseVNvdXJjZTogKHNvdXJjZSwgc291cmNlQ29uZmlnLCB3cml0ZURlbGF5KSA9PiBhcHBseVNvdXJjZUNvbmZpZyhzb3VyY2UsIHNvdXJjZUNvbmZpZywgd3JpdGVEZWxheSksXG4gICAgICAgIG9uV3JpdGVDb3VudGVkOiAoa2luZCwgYnl0ZXMpID0+IGNvdW50QnVja2V0V3JpdGUoYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWAsIGtpbmQsIGJ5dGVzKSxcbiAgICAgICAgb25TeW5jVHJhbnNmZXI6IChvcGVyYXRpb24sIHBhdGgsIGJ5dGVzKSA9PiB7XG4gICAgICAgICAgICB0cmFja0FjY2Vzcyh7IGFjY291bnQsIG9wZXJhdGlvbiwgcGF0aDogYCR7YnVja2V0TmFtZX0vJHtwYXRofWAsIHNpemU6IGJ5dGVzIH0pO1xuICAgICAgICAgICAgLy8gRXZlcnkgc3luY2hyb25pemF0aW9uIHdyaXRlIGlzIGxvZ2dlZCBwZXIgZmlsZSwgZXhhY3RseSBsaWtlIGNsaWVudCBtdXRhdGlvbnMgLSB0aGUgbG9nIGlzIHRoZSBmdWxsIGFjY291bnQgb2Ygd2hhdCBtb3ZlZFxuICAgICAgICAgICAgbG9nTXV0YXRpb24oeyBvcDogb3BlcmF0aW9uLCBhY2NvdW50LCBidWNrZXROYW1lLCBzdG9yZTogbmFtZSwgcGF0aCwgc2l6ZTogYnl0ZXMgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVTb3VyY2VVcmw6IHJlc29sdmVTb3VyY2VBcmNoaXZlcyxcbiAgICAgICAgLy8gVGhlIHN0b3JlIGlzIHRoZSBvbmUgdGhhdCBrbm93cyB3aGVuIGEgY29uZmlnIGxhbmRlZCwgYW5kIGEgY29uZmlnIHdpdGggdXBjb21pbmcgd2luZG93cyBpcyB3aGF0IGJvdW5kYXJ5IHNjYW5zIGFyZSBhcm1lZCBmcm9tXG4gICAgICAgIG9uUm91dGluZ0FwcGxpZWQ6IHJvdXRpbmcgPT4gc2NoZWR1bGVCb3VuZGFyeVdvcmsoYWNjb3VudCwgYnVja2V0TmFtZSwgcm91dGluZyksXG4gICAgICAgIC8vIFRoZSBzdG9yZSB3YXMgY3JlYXRlZCBieSB0aGlzIGNhbGxlcidzIHJlcXVlc3QsIHNvIHRoZSBjYWxsZXIga25vd3MgZXhhY3RseSB3aGF0IGNvbmZpZyBpdCBpbnRlbmRlZCBmb3IgdGhpcyBuYW1lIC0gdGhlIHN0b3JlIGFza3MgaXQgd2hlbiBpdHMgb3duIGZvbGRlciBob2xkcyBubyBjb25maWd1cmF0aW9uIChzZWUgQmxvYlN0b3JlLmluaXQpXG4gICAgICAgIHJlcXVlc3RSb3V0aW5nQ29uZmlnOiBjYWxsZXJOb2RlSWQgJiYgKGFzeW5jICgpID0+IGF3YWl0IFN0b3JhZ2VDbGllbnRDb250cm9sbGVyLm5vZGVzW2NhbGxlck5vZGVJZF0uZ2V0Um91dGluZ0NvbmZpZ0Zvck5hbWUoeyBhY2NvdW50LCBidWNrZXROYW1lLCBuYW1lIH0pKSB8fCB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgc3RvcmVzLnNldChmb2xkZXIsIHN0b3JlKTtcbiAgICBsZXQga2V5ID0gYCR7YWNjb3VudH0vJHtidWNrZXROYW1lfWA7XG4gICAgbGV0IGJ5TmFtZSA9IGFjdGl2ZVN0b3Jlcy5nZXQoa2V5KTtcbiAgICBpZiAoIWJ5TmFtZSkge1xuICAgICAgICBieU5hbWUgPSBuZXcgTWFwKCk7XG4gICAgICAgIGFjdGl2ZVN0b3Jlcy5zZXQoa2V5LCBieU5hbWUpO1xuICAgIH1cbiAgICBieU5hbWUuc2V0KG5hbWUsIHN0b3JlKTtcbiAgICAvLyBMYXp5IGluaXQgd291bGQgbGVhdmUgYSBzdG9yZSBub3RoaW5nIGhhcyB0b3VjaGVkIHNpdHRpbmcgaW5lcnQgLSBubyBpbmRleCBsb2FkZWQsIG5vIGNvbmZpZyBhcHBsaWVkLCBub3RoaW5nIHN5bmNocm9uaXppbmcgLSB3aGlsZSBpdHMgZm9sZGVyIGlzIGZ1bGwgb2YgZmlsZXNcbiAgICB2b2lkIHN0b3JlLmluaXQoKS5jYXRjaCgoZTogRXJyb3IpID0+IGNvbnNvbGUuZXJyb3IoYEluaXRpYWxpemluZyBzdG9yZSAke0pTT04uc3RyaW5naWZ5KG5hbWUpfSBvZiBidWNrZXQgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9IGZhaWxlZDogJHtlLnN0YWNrID8/IGV9YCkpO1xuICAgIHJldHVybiBzdG9yZTtcbn1cblxuLyoqIFRoZSBzdG9yZSBzZXJ2aW5nIGEgcmVxdWVzdDogdGhlIG9uZSB0aGUgY2xpZW50J3Mgc2VsZWN0ZWQgZW50cnkgTkFNRVMuIEFjY291bnQsIG5hbWUsIGFuZCBidWNrZXQgQVJFIHRoZSBmb2xkZXIsIHNvIHRoaXMgaXMgYSBkaXJlY3QgbG9va3VwLCBuZXZlciBhIHNlYXJjaCBvZiB3aGF0IGV4aXN0cyAtIGFuZCBhIG5hbWUgdGhpcyBzZXJ2ZXIgaGFzIG5ldmVyIHNlZW4gaXMgQ1JFQVRFRCwgbmV2ZXIgcmVqZWN0ZWQsIGJlY2F1c2UgYXNraW5nIGZvciBhIG5hbWUgaXMgdGhlIGluc3RydWN0aW9uIHRvIGhhdmUgdGhhdCBzdG9yZSAob25lIG5hbWUsIG9uZSBmb2xkZXIsIG9uZSBpbmRleDsgaXQgY29uZmlndXJlcyBpdHNlbGYgb25jZSB0aGUgcm91dGluZyBjb25maWcgbGFuZHMgaW4gaXQpLiBOb3RoaW5nIGVsc2UgYWJvdXQgdGhlIHJlcXVlc3QgaXMgY29tcGFyZWQgLSBub3QgdGhlIHdpbmRvdywgbm90IHRoZSByb3V0ZSwgbm90IHRoZSBmbGFncyAtIHdoaWNoIGlzIHRoZSB3aG9sZSBwb2ludCBvZiBuYW1pbmcgaXQ6IGEgY2xpZW50IGEgY29uZmlnIHZlcnNpb24gYmVoaW5kIG9uIHNvbWUgZmxhZyBzdGlsbCByZWFjaGVzIHRoZSByaWdodCBzdG9yZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQnVja2V0U3RvcmUoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIHNvdXJjZUNvbmZpZzogU291cmNlQ29uZmlnIHwgdW5kZWZpbmVkKTogQmxvYlN0b3JlIHtcbiAgICBpZiAoIXNvdXJjZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJlbW90ZSBzb3VyY2UgY29uZmlndXJhdGlvbiB3YXMgcHJvdmlkZWQgZm9yIGJ1Y2tldCAke2FjY291bnR9LyR7YnVja2V0TmFtZX06IGV2ZXJ5IHJlcXVlc3QgbXVzdCBzYXkgd2hpY2ggY29uZmlndXJlZCBzb3VyY2UgaXQgc2VsZWN0ZWRgKTtcbiAgICB9XG4gICAgLy8gVGhlIGNhbGxlcidzIGlkLCBzbyBhIHN0b3JlIHRoaXMgcmVxdWVzdCBDUkVBVEVTIGNhbiBhc2sgdGhhdCBjYWxsZXIgZm9yIHRoZSBjb25maWcgaXQgaW50ZW5kZWQgKGEgc3RvcmUgb25seSBldmVyIGV4aXN0cyBiZWNhdXNlIGEgY29uZmlnIG5hbWVzIGl0LCBhbmQgdGhlIHJlcXVlc3RlciBob2xkcyB0aGF0IGNvbmZpZylcbiAgICBsZXQgY2FsbGVyTm9kZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgICAgY2FsbGVyTm9kZUlkID0gU29ja2V0RnVuY3Rpb24uZ2V0Q2FsbGVyKCk/Lm5vZGVJZDtcbiAgICB9IGNhdGNoIHsgfVxuICAgIHJldHVybiBnZXRTdG9yZShhY2NvdW50LCBidWNrZXROYW1lLCBzb3VyY2VDb25maWcubmFtZSwgY2FsbGVyTm9kZUlkKTtcbn1cblxuLyoqIFRoZSBzdG9yZXMgb2YgYSBidWNrZXQgYXMgdGhlIERJU0sgcmVjb3JkcyB0aGVtIChhIGJ1Y2tldCBpcyBub3RoaW5nIG1vcmUgdGhhbiB0aGUgc3RvcmUgZm9sZGVycyBzaGFyaW5nIGl0cyBuYW1lKSwgb3BlbmVkIC0gc28gdGhlIG9uZXMgdGhhdCB3ZXJlbid0IHJ1bm5pbmcgeWV0IHN0YXJ0IHN5bmNocm9uaXppbmcuIEVtcHR5IHdoZW4gdGhlIGJ1Y2tldCBkb2VzIG5vdCBleGlzdCBoZXJlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8eyBuYW1lOiBzdHJpbmc7IHN0b3JlOiBCbG9iU3RvcmUgfVtdPiB7XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QnVja2V0U3RvcmVGb2xkZXJzKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiBmb2xkZXJzLm1hcCh4ID0+ICh7IG5hbWU6IHgubmFtZSwgc3RvcmU6IGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIHgubmFtZSkgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1aXJlQnVja2V0U3RvcmVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IG5hbWU6IHN0cmluZzsgc3RvcmU6IEJsb2JTdG9yZSB9W10+IHtcbiAgICBsZXQgbGlzdCA9IGF3YWl0IGdldEJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBpZiAoIWxpc3QubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQnVja2V0ICR7YWNjb3VudH0vJHtidWNrZXROYW1lfSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlci4gV3JpdGUgaXRzIHJvdXRpbmcgY29uZmlnIHRvICR7SlNPTi5zdHJpbmdpZnkoUk9VVElOR19GSUxFKX0gdG8gY3JlYXRlIGl0LmApO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLyoqIEludGVybmFsIChzdG9yZS10by1zdG9yZSkgcmVhZHMgc2tpcCBzdG9yZSBzZWxlY3Rpb24gZW50aXJlbHk6IHRoZSBjYWxsZXIgaXMgYW5vdGhlciBzdG9yZSB3aG9zZSBpbmRleCBzYXlzIHRoaXMgTUFDSElORSBob2xkcyB0aGUgYnl0ZXMgLSB0aGUgcGVyc2lzdGVkIGhvbGRlciBpZGVudGl0eSBpcyBqdXN0IGEgVVJMLCB3aGljaCBjYW5ub3QgbmFtZSBhIHN0b3JlLiBXaGljaGV2ZXIgc3RvcmUncyBmb2xkZXIgaGFzIHRoZSBuZXdlc3QgY29weSBhbnN3ZXJzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRCdWNrZXRJbnRlcm5hbChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZywgY29uZmlnOiB7IHBhdGg6IHN0cmluZzsgcmFuZ2U/OiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH07IGluY2x1ZGVUb21ic3RvbmVzPzogYm9vbGVhbiB9KTogUHJvbWlzZTx7IGRhdGE6IEJ1ZmZlcjsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGJ1Y2tldFN0b3JlcyA9IGF3YWl0IHJlcXVpcmVCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgbGV0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXQyKHsgcGF0aDogY29uZmlnLnBhdGgsIHJhbmdlOiBjb25maWcucmFuZ2UsIGluY2x1ZGVUb21ic3RvbmVzOiBjb25maWcuaW5jbHVkZVRvbWJzdG9uZXMsIGludGVybmFsOiB0cnVlIH0pKSk7XG4gICAgbGV0IGJlc3Q6IHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChsZXQgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgaWYgKHJlc3VsdCAmJiAoIWJlc3QgfHwgcmVzdWx0LndyaXRlVGltZSA+IGJlc3Qud3JpdGVUaW1lKSkge1xuICAgICAgICAgICAgYmVzdCA9IHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmVzdDtcbn1cblxuZnVuY3Rpb24gYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzOiBCbG9iU3RvcmVbXSwgcm91dGluZzogUmVtb3RlQ29uZmlnIHwgdW5kZWZpbmVkKTogQXJjaGl2ZXNDb25maWcge1xuICAgIGxldCBpbmRleCA9IHsgZmlsZUNvdW50OiAwLCBieXRlQ291bnQ6IDAgfTtcbiAgICBsZXQgbWFya2VkSW5kZXg6IHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBvbGRlc3REZWxldGVUaW1lPzogbnVtYmVyIH0gPSB7IGZpbGVDb3VudDogMCwgYnl0ZUNvdW50OiAwIH07XG4gICAgbGV0IGluZGV4U291cmNlczogeyBkZWJ1Z05hbWU6IHN0cmluZzsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyIH1bXSA9IFtdO1xuICAgIGxldCBzeW5jaW5nOiBTeW5jQWN0aXZpdHlbXSA9IFtdO1xuICAgIGxldCByZWFkZXJEaXNrTGltaXQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGxldCBzdG9yZSBvZiBidWNrZXRTdG9yZXMpIHtcbiAgICAgICAgbGV0IHByb2dyZXNzID0gc3RvcmUuZ2V0U3luY1Byb2dyZXNzKCk7XG4gICAgICAgIGluZGV4LmZpbGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5maWxlQ291bnQ7XG4gICAgICAgIGluZGV4LmJ5dGVDb3VudCArPSBwcm9ncmVzcy5pbmRleC5ieXRlQ291bnQ7XG4gICAgICAgIG1hcmtlZEluZGV4LmZpbGVDb3VudCArPSBwcm9ncmVzcy5tYXJrZWQuZmlsZUNvdW50O1xuICAgICAgICBtYXJrZWRJbmRleC5ieXRlQ291bnQgKz0gcHJvZ3Jlc3MubWFya2VkLmJ5dGVDb3VudDtcbiAgICAgICAgaWYgKHByb2dyZXNzLm1hcmtlZC5vbGRlc3REZWxldGVUaW1lICE9PSB1bmRlZmluZWQgJiYgKG1hcmtlZEluZGV4Lm9sZGVzdERlbGV0ZVRpbWUgPT09IHVuZGVmaW5lZCB8fCBwcm9ncmVzcy5tYXJrZWQub2xkZXN0RGVsZXRlVGltZSA8IG1hcmtlZEluZGV4Lm9sZGVzdERlbGV0ZVRpbWUpKSB7XG4gICAgICAgICAgICBtYXJrZWRJbmRleC5vbGRlc3REZWxldGVUaW1lID0gcHJvZ3Jlc3MubWFya2VkLm9sZGVzdERlbGV0ZVRpbWU7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXhTb3VyY2VzLnB1c2goLi4ucHJvZ3Jlc3Muc291cmNlcyk7XG4gICAgICAgIHN5bmNpbmcucHVzaCguLi5wcm9ncmVzcy5zeW5jaW5nKTtcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0ID0gcmVhZGVyRGlza0xpbWl0IHx8IHByb2dyZXNzLnJlYWRlckRpc2tMaW1pdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgLy8gRXZlcnkgc3RvcmUgaXMgaW5kZXgtYmFja2VkLCBzbyB0aGUgY2hhbmdlIGZlZWQgaXMgYWx3YXlzIG5hdGl2ZVxuICAgICAgICBzdXBwb3J0c0NoYW5nZXNBZnRlcjogdHJ1ZSxcbiAgICAgICAgcmVtb3RlQ29uZmlnOiByb3V0aW5nLFxuICAgICAgICBpbmRleCxcbiAgICAgICAgbWFya2VkSW5kZXgsXG4gICAgICAgIGluZGV4U291cmNlcyxcbiAgICAgICAgcmVhZGVyRGlza0xpbWl0LFxuICAgICAgICBzeW5jaW5nLFxuICAgIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRCdWNrZXRBcmNoaXZlc0NvbmZpZyhhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgcm91dGluZyA9IGF3YWl0IHJlYWRSb3V0aW5nRnJvbURpc2soYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUFyY2hpdmVzQ29uZmlnKGJ1Y2tldFN0b3Jlcy5tYXAoeCA9PiB4LnN0b3JlKSwgcm91dGluZyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWNrZXRTeW5jU3RhdHVzKGFjY291bnQ6IHN0cmluZywgYnVja2V0TmFtZTogc3RyaW5nKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgc3RhdHVzZXMgPSBhd2FpdCBQcm9taXNlLmFsbChidWNrZXRTdG9yZXMubWFwKHMgPT4gcy5zdG9yZS5nZXRTeW5jU3RhdHVzKCkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxTY2Fuc0NvbXBsZXRlOiBzdGF0dXNlcy5ldmVyeSh4ID0+IHguYWxsU2NhbnNDb21wbGV0ZSksXG4gICAgICAgIGluZGV4U2l6ZTogc3RhdHVzZXMucmVkdWNlKChzdW0sIHgpID0+IHN1bSArIHguaW5kZXhTaXplLCAwKSxcbiAgICAgICAgc291cmNlczogc3RhdHVzZXMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlYnVnQnVja2V0SW5kZXhUb3RhbHMoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHsgZmlsZUNvdW50OiBudW1iZXI7IGJ5dGVDb3VudDogbnVtYmVyOyBzb3VyY2VzOiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdIH0+IHtcbiAgICBsZXQgYnVja2V0U3RvcmVzID0gYXdhaXQgcmVxdWlyZUJ1Y2tldFN0b3JlcyhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICBsZXQgdG90YWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoYnVja2V0U3RvcmVzLm1hcChzID0+IHMuc3RvcmUuY29tcHV0ZUluZGV4VG90YWxzKCkpKTtcbiAgICByZXR1cm4ge1xuICAgICAgICBmaWxlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5maWxlQ291bnQsIDApLFxuICAgICAgICBieXRlQ291bnQ6IHRvdGFscy5yZWR1Y2UoKHN1bSwgeCkgPT4gc3VtICsgeC5ieXRlQ291bnQsIDApLFxuICAgICAgICBzb3VyY2VzOiB0b3RhbHMuZmxhdE1hcCh4ID0+IHguc291cmNlcyksXG4gICAgfTtcbn1cblxuY29uc3QgcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcyA9IG5ldyBNYXA8c3RyaW5nLCBJQXJjaGl2ZXM+KCk7XG4vKiogQSBjYWNoZWQgSUFyY2hpdmVzIGZvciBhIHBlcnNpc3RlZCBzb3VyY2UgaWRlbnRpdHk6IGEgcm91dGluZyBVUkwgKGhvc3RlZC9iYWNrYmxhemUpIG9yIGEgZGlzayBmb2xkZXIgcGF0aCAtIHRoZSBmb3JtIEJsb2JTdG9yZSdzIHNvdXJjZXMgbGlzdCBzdG9yZXMuIENvbmZpZ3VyYXRpb24gKHZhbGlkIHdpbmRvd3MsIHJvdXRlcykgZGVjaWRlcyBXSEVOIGEgc291cmNlIHNob3VsZCBiZSB1c2VkOyBmb3IgcmVhZGluZyBieXRlcyB0aGUgaW5kZXggc2F5cyBhIHNvdXJjZSBob2xkcywgdGhlIFVSTCBhbG9uZSBpcyBlbm91Z2ggLSBldmVuIGZvciBzb3VyY2VzIG5vIGxvbmdlciBpbiBhbnkgY29uZmlnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTb3VyY2VBcmNoaXZlcyh1cmw6IHN0cmluZyk6IElBcmNoaXZlcyB7XG4gICAgbGV0IGV4aXN0aW5nID0gcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcy5nZXQodXJsKTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBsZXQgc291cmNlQ29uZmlnOiBTb3VyY2VDb25maWcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIikpIHtcbiAgICAgICAgLy8gVGhlIGNvbmZpZyBpcyBmYWJyaWNhdGVkIGZyb20gdGhlIGJhcmUgVVJMIGFuZCBjYW4gbmV2ZXIgZXhhY3QtbWF0Y2ggYSBzZXJ2ZXIncyBlbnRyaWVzIC0gd2hpY2ggaXMgZmluZSwgYmVjYXVzZSBob2xkZXIgcmVhZHMgYXJlIGludGVybmFsIHJlYWRzLCBhbmQgaW50ZXJuYWwgcmVhZHMgbmV2ZXIgc2VsZWN0IGEgc3RvcmUgKHNlZSByZWFkQnVja2V0SW50ZXJuYWwpXG4gICAgICAgIHNvdXJjZUNvbmZpZyA9IG5vcm1hbGl6ZVNvdXJjZSh1cmwpO1xuICAgIH1cbiAgICBsZXQgYXJjaGl2ZXMgPSBjcmVhdGVTdG9yZVNvdXJjZSh7IHNvdXJjZUNvbmZpZywgZm9sZGVyOiB1cmwgfSk7XG4gICAgcmVzb2x2ZWRTb3VyY2VBcmNoaXZlcy5zZXQodXJsLCBhcmNoaXZlcyk7XG4gICAgcmV0dXJuIGFyY2hpdmVzO1xufVxuXG4vKipcbiAqIFdyaXRpbmcgdGhlIHJvdXRpbmcgY29uZmlnIGlzIGEgd3JpdGUgbGlrZSBhbnkgb3RoZXI6IGl0IGdvZXMgaW50byBhIHN0b3JlLCBhbmQgdGhlIHN0b3JlIGFwcGxpZXNcbiAqIGl0IHRvIGl0c2VsZiBhbmQgbGV0cyBpdHMgcGVlcnMgcHVsbCBpdC4gVGhlIG9ubHkgdGhpbmcgdGhhdCBoYXBwZW5zIGhlcmUgaXMgcGlja2luZyBXSElDSCBzdG9yZSxcbiAqIGJlY2F1c2UgdGhlIHdyaXRlciBuYW1lcyBhIHNvdXJjZSBhbmQgYSBzb3VyY2UgbmFtZXMgYSBzdG9yZS5cbiAqXG4gKiBJbi1mbGlnaHQgc3dpdGNob3ZlciB3aW5kb3dzIGFyZSByZS1pbmplY3RlZCBmaXJzdCAoc2VlIGludGVybWVkaWF0ZU1hbmFnZW1lbnQpOiBhbiBvcGVyYXRvcidzXG4gKiBjb25maWcga25vd3Mgbm90aGluZyBhYm91dCBhIHN3aXRjaG92ZXIgdGhhdCBpcyBoYXBwZW5pbmcgcmlnaHQgbm93LCBhbmQgd3JpdGluZyBpdCBhcy1pcyB3b3VsZFxuICogY2FuY2VsIGl0IG1pZC1mbGlnaHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZVJvdXRpbmdDb25maWcoYWNjb3VudDogc3RyaW5nLCBidWNrZXROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgZGF0YTogQnVmZmVyLCBjb25maWc/OiB7IGxhc3RNb2RpZmllZD86IG51bWJlciB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXNzZXJ0V3JpdGVzQWxsb3dlZCgpO1xuICAgIGxldCBzdG9yZSA9IGdldFN0b3JlKGFjY291bnQsIGJ1Y2tldE5hbWUsIG5hbWUpO1xuICAgIGxldCBpbmNvbWluZyA9IHBhcnNlUm91dGluZ0RhdGEoZGF0YSk7XG4gICAgbGV0IGN1cnJlbnQgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIGxldCBzdG9yZWQgPSByZWluamVjdEludGVybWVkaWF0ZXMoY3VycmVudCwgaW5jb21pbmcpO1xuICAgIGxldCBzdG9yZWREYXRhID0gQnVmZmVyLmZyb20oc2VyaWFsaXplUmVtb3RlQ29uZmlnKHN0b3JlZCkpO1xuICAgIGF3YWl0IHN0b3JlLnNldCh7IHBhdGg6IFJPVVRJTkdfRklMRSwgZGF0YTogc3RvcmVkRGF0YSwgbGFzdE1vZGlmaWVkOiBjb25maWc/Lmxhc3RNb2RpZmllZCB9KTtcbiAgICBsb2dNdXRhdGlvbih7IG9wOiBcInJvdXRpbmdDb25maWdcIiwgYWNjb3VudCwgYnVja2V0TmFtZSwgc3RvcmU6IG5hbWUsIHBhdGg6IFJPVVRJTkdfRklMRSwgc2l6ZTogc3RvcmVkRGF0YS5sZW5ndGgsIHdyaXRlVGltZTogY29uZmlnPy5sYXN0TW9kaWZpZWQgfSk7XG4gICAgYnJvYWRjYXN0Um91dGluZ0NoYW5nZWQoKTtcbn1cblxuLyoqIFdoaWNoIGJ1Y2tldHMgdGhpcyBwcm9jZXNzIGN1cnJlbnRseSBoYXMgYWN0aXZlIChzb21lIHN0b3JlIG9mIHRoZWlycyB3YXMgb3BlbmVkKSAtIHdoYXQgYSBkZXBsb3kgc3VjY2Vzc29yIGFza3MgaXRzIHByZWRlY2Vzc29yIGZvciwgc28gaXQgYWN0aXZhdGVzIGV4YWN0bHkgdGhlIGJ1Y2tldHMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2ZUJ1Y2tldEtleXMoKTogeyBhY2NvdW50OiBzdHJpbmc7IGJ1Y2tldE5hbWU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiBbLi4uYWN0aXZlU3RvcmVzLmtleXMoKV0ubWFwKGtleSA9PiB7XG4gICAgICAgIGxldCBzbGFzaCA9IGtleS5pbmRleE9mKFwiL1wiKTtcbiAgICAgICAgcmV0dXJuIHsgYWNjb3VudDoga2V5LnNsaWNlKDAsIHNsYXNoKSwgYnVja2V0TmFtZToga2V5LnNsaWNlKHNsYXNoICsgMSkgfTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IHR5cGUgU2VydmVyQnVja2V0SW5mbyA9IHtcbiAgICBidWNrZXROYW1lOiBzdHJpbmc7XG4gICAgYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKiBXaGVyZSB0aGUgYnVja2V0J3MgZGF0YSBsaXZlcyBvbiB0aGlzIHNlcnZlciAqL1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgZHJpdmUgdGhhdCBmb2xkZXIgaXMgb24uIEJ1Y2tldHMgc2hhcmluZyBhIGRyaXZlIHJlcG9ydCB0aGUgc2FtZSBudW1iZXJzLiAqL1xuICAgIGRpc2s/OiBCdWNrZXREaXNrSW5mbztcbiAgICBkaXNrRXJyb3I/OiBzdHJpbmc7XG4gICAgd3JpdGVTdGF0cz86IEJ1Y2tldFdyaXRlU3RhdHM7XG4gICAgY29uZmlnPzogQXJjaGl2ZXNDb25maWc7XG4gICAgZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBBY3RpdmVCdWNrZXRJbmZvID0ge1xuICAgIGZvbGRlcjogc3RyaW5nO1xuICAgIC8qKiBUaGUgYnVja2V0J3Mgcm91dGluZyBjb25maWcsIHRoZSBuZXdlc3QgY29weSBhbW9uZyBpdHMgc3RvcmVzLiBBYnNlbnQgd2hlbiBub25lIG9mIHRoZW0gaGFzIG9uZSB5ZXQuICovXG4gICAgcm91dGluZz86IFJlbW90ZUNvbmZpZztcbiAgICBjb25maWc6IEFyY2hpdmVzQ29uZmlnO1xufTtcblxuLyoqIFRoZSBzdGF0ZSBvZiBPTkUgYWN0aXZlIGJ1Y2tldC4gUmV0dXJucyBhbiBlcnJvciBzdHJpbmcgd2hlbiB0aGUgYnVja2V0IGlzIG5vdCBhY3RpdmUgaGVyZSwgd2hpY2ggaXMgdGhlIG5vcm1hbCBzdGF0ZSBmb3IgYSBidWNrZXQgbm90aGluZyBoYXMgYWNjZXNzZWQgc2luY2Ugc3RhcnR1cC4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWJ1Z0dldEFjdGl2ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgb3BlbmVkID0gYWN0aXZlU3RvcmVzLmdldChrZXkpO1xuICAgIGlmICghb3BlbmVkIHx8ICFvcGVuZWQuc2l6ZSkge1xuICAgICAgICByZXR1cm4gYEJ1Y2tldCAke2tleX0gaXMgbm90IGFjdGl2ZSBvbiB0aGlzIHNlcnZlciAoYSBidWNrZXQgYWN0aXZhdGVzIG9uIGZpcnN0IGFjY2VzcylgO1xuICAgIH1cbiAgICBsZXQgYnVja2V0U3RvcmVzID0gWy4uLm9wZW5lZC52YWx1ZXMoKV07XG4gICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgIHJldHVybiB7IGZvbGRlcjogYnVja2V0U3RvcmVzWzBdLmZvbGRlciwgcm91dGluZywgY29uZmlnOiBhZ2dyZWdhdGVBcmNoaXZlc0NvbmZpZyhidWNrZXRTdG9yZXMsIHJvdXRpbmcpIH07XG59XG5cbi8qKiBMb2FkcyBldmVyeSBzdG9yZSBvZiBhIGJ1Y2tldCB0aGF0IGV4aXN0cyBvbiB0aGlzIHNlcnZlcidzIGRpc2sgaW50byBtZW1vcnksIHdoaWNoIHN0YXJ0cyB0aGVpciBzeW5jaHJvbml6YXRpb24gYW5kIHdpbmRvdyB0aW1lcnMsIGFuZCByZXR1cm5zIHRoZSBidWNrZXQncyBzdGF0ZS4gTm90aGluZyBpcyB3cml0dGVuIGFuZCBubyBvdGhlciBzZXJ2ZXIgaXMgY29udGFjdGVkIC0gdW5saWtlIGJ1aWxkaW5nIGFuIEFyY2hpdmVzQ2hhaW4gZm9yIGl0LCB3aGljaCB3b3VsZCBwcm9iZSBldmVyeSBzb3VyY2UgYW5kIGNvdWxkIHdyaXRlIHRoZSByb3V0aW5nIGNvbmZpZy4gQWxyZWFkeS1hY3RpdmUgYnVja2V0cyBqdXN0IHJldHVybiB0aGVpciBzdGF0ZS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBhY3RpdmF0ZUJ1Y2tldChhY2NvdW50OiBzdHJpbmcsIGJ1Y2tldE5hbWU6IHN0cmluZyk6IFByb21pc2U8QWN0aXZlQnVja2V0SW5mbyB8IHN0cmluZz4ge1xuICAgIGxldCBrZXkgPSBgJHthY2NvdW50fS8ke2J1Y2tldE5hbWV9YDtcbiAgICBsZXQgd2FzQWN0aXZlID0gYWN0aXZlU3RvcmVzLmhhcyhrZXkpO1xuICAgIGxldCBidWNrZXRTdG9yZXMgPSBhd2FpdCBnZXRCdWNrZXRTdG9yZXMoYWNjb3VudCwgYnVja2V0TmFtZSk7XG4gICAgaWYgKCFidWNrZXRTdG9yZXMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBgQnVja2V0ICR7a2V5fSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHNlcnZlciAoaXQgaGFzIG5vIHN0b3JlIGZvbGRlcnMgdW5kZXIgJHtnZXRCdWNrZXRGb2xkZXIoXCI8bmFtZT5cIiwgYWNjb3VudCwgYnVja2V0TmFtZSl9KWA7XG4gICAgfVxuICAgIC8vIFdhaXQgZm9yIHRoZSBpbmRleGVzIHRvIGxvYWQsIHNvIHRoZSB0b3RhbHMgd2UgcmV0dXJuIGFyZSB0aGUgcmVhbCBvbmVzIHJhdGhlciB0aGFuIHplcm9lcyBmcm9tIHN0b3JlcyB0aGF0IGhhdmUgbm90IHJlYWQgdGhlaXIgaW5kZXggeWV0LiBUaGUgc291cmNlIHNjYW5zIGtlZXAgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZC5cbiAgICBmb3IgKGxldCBzIG9mIGJ1Y2tldFN0b3Jlcykge1xuICAgICAgICBhd2FpdCBzLnN0b3JlLmluaXQoKTtcbiAgICB9XG4gICAgaWYgKCF3YXNBY3RpdmUpIHtcbiAgICAgICAgY29uc29sZS5sb2coYEFjdGl2YXRlZCBidWNrZXQgJHtrZXl9IG9uIHJlcXVlc3Q6IGl0cyAke2J1Y2tldFN0b3Jlcy5sZW5ndGh9IHN0b3JlKHMpIGFyZSBub3cgbG9hZGVkIGFuZCBzeW5jaHJvbml6aW5nYCk7XG4gICAgfVxuICAgIGxldCByb3V0aW5nID0gYXdhaXQgcmVhZFJvdXRpbmdGcm9tRGlzayhhY2NvdW50LCBidWNrZXROYW1lKTtcbiAgICByZXR1cm4geyBmb2xkZXI6IGJ1Y2tldFN0b3Jlc1swXS5zdG9yZS5mb2xkZXIsIHJvdXRpbmcsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcoYnVja2V0U3RvcmVzLm1hcCh4ID0+IHguc3RvcmUpLCByb3V0aW5nKSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZGVidWdMaXN0QWNjb3VudEJ1Y2tldHMoYWNjb3VudDogc3RyaW5nKTogUHJvbWlzZTxTZXJ2ZXJCdWNrZXRJbmZvW10+IHtcbiAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIC8vIFRoZSBkaXNrIGlzIHRoZSByZWNvcmQ6IGEgYnVja2V0IGV4aXN0cyBoZXJlIHdoZW4gaXQgaGFzIGF0IGxlYXN0IG9uZSBzdG9yZSBmb2xkZXIsIGFuZCBzZXZlcmFsIG5hbWVzIGZvciBvbmUgYnVja2V0IGFyZSBzdGlsbCBvbmUgYnVja2V0XG4gICAgbGV0IGZvbGRlcnMgPSBhd2FpdCBsaXN0QWNjb3VudFN0b3JlRm9sZGVycyhhY2NvdW50KTtcbiAgICBsZXQgYnlCdWNrZXQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGZvciAobGV0IHN0b3JlIG9mIGZvbGRlcnMpIHtcbiAgICAgICAgaWYgKGJ5QnVja2V0LmhhcyhzdG9yZS5idWNrZXROYW1lKSkgY29udGludWU7XG4gICAgICAgIGJ5QnVja2V0LnNldChzdG9yZS5idWNrZXROYW1lLCBzdG9yZS5mb2xkZXIpO1xuICAgIH1cbiAgICBsZXQgbmFtZXMgPSBbLi4uYnlCdWNrZXQua2V5cygpXTtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobmFtZXMubWFwKGFzeW5jIGJ1Y2tldE5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGtleSA9IGAke2FjY291bnR9LyR7YnVja2V0TmFtZX1gO1xuICAgICAgICAgICAgbGV0IGZvbGRlciA9IGJ5QnVja2V0LmdldChidWNrZXROYW1lKSB8fCBcIlwiO1xuICAgICAgICAgICAgbGV0IGJhc2U6IFNlcnZlckJ1Y2tldEluZm8gPSB7IGJ1Y2tldE5hbWUsIGFjdGl2ZTogYWN0aXZlU3RvcmVzLmhhcyhrZXkpLCBmb2xkZXIgfTtcbiAgICAgICAgICAgIGJhc2UuZGlzayA9IGF3YWl0IGdldERpc2tJbmZvKGZvbGRlcikuY2F0Y2goKGU6IEVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYmFzZS5kaXNrRXJyb3IgPSBTdHJpbmcoZS5zdGFjayA/PyBlKS5zbGljZSgwLCA1MDApO1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJhc2Uud3JpdGVTdGF0cyA9IGdldEJ1Y2tldFdyaXRlU3RhdHMoa2V5KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvdXRpbmcgPSBhd2FpdCByZWFkUm91dGluZ0Zyb21EaXNrKGFjY291bnQsIGJ1Y2tldE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChiYXNlLmFjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3BlbmVkID0gWy4uLihhY3RpdmVTdG9yZXMuZ2V0KGtleSk/LnZhbHVlcygpIHx8IFtdKV07XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogYWdncmVnYXRlQXJjaGl2ZXNDb25maWcob3BlbmVkLCByb3V0aW5nKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJvdXRpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uYmFzZSwgZXJyb3I6IGBObyByb3V0aW5nIGZpbGUgKCR7Uk9VVElOR19GSUxFfSkgaW4gYW55IG9mIGl0cyBzdG9yZXNgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGNvbmZpZzogeyByZW1vdGVDb25maWc6IHJvdXRpbmcgfSB9O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmJhc2UsIGVycm9yOiBTdHJpbmcoKGUgYXMgRXJyb3IpLnN0YWNrID8/IGUpLnNsaWNlKDAsIDUwMCkgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBkZWJ1Z0xpc3RBY2NvdW50QnVja2V0cygke2FjY291bnR9KSB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0fW1zIGZvciAke25hbWVzLmxlbmd0aH0gYnVja2V0c2ApO1xuICAgIH1cbn1cbiJdfQ==
287
+ /* _JS_SOURCE_HASH = "4780233bf85591c2df919e65b044197cb174983fee7b57bcc2e6730e3e2379f5"; */