obsidian-dev-utils 3.30.0 → 3.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/dist/lib/obsidian/Callout.cjs +2 -2
- package/dist/lib/obsidian/ChainedPromise.cjs +5 -5
- package/dist/lib/obsidian/ChainedPromise.d.ts +3 -2
- package/dist/lib/obsidian/FileSystem.cjs +12 -7
- package/dist/lib/obsidian/FileSystem.d.ts +14 -6
- package/dist/lib/obsidian/Link.cjs +5 -3
- package/dist/lib/obsidian/Link.d.ts +2 -2
- package/dist/lib/obsidian/Logger.cjs +1 -9
- package/dist/lib/obsidian/Logger.d.ts +2 -9
- package/dist/lib/obsidian/MetadataCache.cjs +7 -4
- package/dist/lib/obsidian/MetadataCache.d.ts +12 -0
- package/dist/lib/obsidian/Plugin/PluginBase.cjs +2 -2
- package/dist/lib/obsidian/RenameDeleteHandler.cjs +154 -151
- package/dist/lib/obsidian/Vault.cjs +13 -5
- package/dist/lib/obsidian/Vault.d.ts +6 -0
- package/dist/lib/scripts/ESLint/ESLint.cjs +2 -2
- package/package.json +1 -1
@@ -49,8 +49,8 @@ var __process = globalThis["process"] ?? {
|
|
49
49
|
"env": {},
|
50
50
|
"platform": "android"
|
51
51
|
};
|
52
|
-
const specialRenames = [];
|
53
52
|
const deletedMetadataCacheMap = /* @__PURE__ */ new Map();
|
53
|
+
const handledRenames = /* @__PURE__ */ new Set();
|
54
54
|
function registerRenameDeleteHandlers(plugin, settingsBuilder) {
|
55
55
|
const renameDeleteHandlersMap = getRenameDeleteHandlersMap(plugin.app);
|
56
56
|
const pluginId = plugin.manifest.id;
|
@@ -66,7 +66,8 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
|
|
66
66
|
if (!shouldInvokeHandler(app, pluginId, "Delete")) {
|
67
67
|
return;
|
68
68
|
}
|
69
|
-
|
69
|
+
const path = file.path;
|
70
|
+
(0, import_ChainedPromise.chain)(app, () => handleDelete(app, path));
|
70
71
|
})
|
71
72
|
);
|
72
73
|
plugin.registerEvent(
|
@@ -74,7 +75,8 @@ function registerRenameDeleteHandlers(plugin, settingsBuilder) {
|
|
74
75
|
if (!shouldInvokeHandler(app, pluginId, "Rename")) {
|
75
76
|
return;
|
76
77
|
}
|
77
|
-
|
78
|
+
const newPath = file.path;
|
79
|
+
(0, import_ChainedPromise.chain)(app, () => handleRename(app, oldPath, newPath));
|
78
80
|
})
|
79
81
|
);
|
80
82
|
plugin.registerEvent(
|
@@ -99,83 +101,153 @@ function logPluginSettingsOrder(app) {
|
|
99
101
|
const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
|
100
102
|
console.debug(`Rename/delete handlers will use plugin settings in the following order: ${Array.from(renameDeleteHandlersMap.keys()).join(", ")}`);
|
101
103
|
}
|
102
|
-
async function handleRename(app,
|
103
|
-
console.debug(`Handle Rename ${oldPath} -> ${
|
104
|
-
|
105
|
-
|
106
|
-
}
|
107
|
-
const specialRename = specialRenames.find((x) => x.oldPath === file.path);
|
108
|
-
if (specialRename) {
|
109
|
-
const newTempPath = await (0, import_Vault.renameSafe)(app, file, specialRename.tempPath);
|
110
|
-
specialRename.tempPath = newTempPath;
|
104
|
+
async function handleRename(app, oldPath, newPath) {
|
105
|
+
console.debug(`Handle Rename ${oldPath} -> ${newPath}`);
|
106
|
+
const newFile = (0, import_FileSystem.getFileOrNull)(app, newPath);
|
107
|
+
if (!newFile) {
|
111
108
|
return;
|
112
109
|
}
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
newPath: file.path,
|
117
|
-
tempPath: (0, import_Path.join)(file.parent?.path ?? "", "__temp__" + file.name)
|
118
|
-
});
|
119
|
-
await (0, import_Vault.renameSafe)(app, file, oldPath);
|
110
|
+
const key = makeKey(oldPath, newPath);
|
111
|
+
if (handledRenames.has(key)) {
|
112
|
+
handledRenames.delete(key);
|
120
113
|
return;
|
121
114
|
}
|
122
115
|
const updateAllLinks = app.fileManager.updateAllLinks;
|
116
|
+
app.fileManager.updateAllLinks = async () => {
|
117
|
+
};
|
123
118
|
try {
|
124
|
-
app
|
125
|
-
|
126
|
-
const renameMap = /* @__PURE__ */ new Map();
|
127
|
-
await fillRenameMap(app, file, oldPath, renameMap);
|
128
|
-
renameMap.set(oldPath, file.path);
|
129
|
-
for (const [oldPath2, newPath2] of renameMap.entries()) {
|
130
|
-
await processRename(app, oldPath2, newPath2, renameMap);
|
131
|
-
}
|
119
|
+
await renameHandled(app, newPath, oldPath);
|
120
|
+
await processAndRename(app, oldPath, newPath);
|
132
121
|
} finally {
|
133
122
|
app.fileManager.updateAllLinks = updateAllLinks;
|
134
|
-
const
|
135
|
-
|
136
|
-
|
137
|
-
|
123
|
+
const orphanKeys = Array.from(handledRenames);
|
124
|
+
(0, import_ChainedPromise.chain)(app, () => {
|
125
|
+
for (const key2 of orphanKeys) {
|
126
|
+
handledRenames.delete(key2);
|
127
|
+
}
|
128
|
+
});
|
129
|
+
}
|
130
|
+
}
|
131
|
+
async function processAndRename(app, oldPath, newPath) {
|
132
|
+
if (app.vault.adapter.insensitive && newPath.toLowerCase() === oldPath.toLowerCase() && (0, import_Path.dirname)(newPath) === (0, import_Path.dirname)(oldPath)) {
|
133
|
+
const tempPath = (0, import_Path.join)((0, import_Path.dirname)(oldPath), "__temp__" + (0, import_Path.basename)(newPath));
|
134
|
+
await processAndRename(app, oldPath, tempPath);
|
135
|
+
await processAndRename(app, tempPath, newPath);
|
136
|
+
return;
|
137
|
+
}
|
138
|
+
const settings = getSettings(app);
|
139
|
+
const renameMap = /* @__PURE__ */ new Map();
|
140
|
+
await fillRenameMap(app, oldPath, newPath, renameMap);
|
141
|
+
const backlinksMap = /* @__PURE__ */ new Map();
|
142
|
+
for (const oldPath2 of renameMap.keys()) {
|
143
|
+
const currentBacklinksMap = await (0, import_MetadataCache.getBacklinksMap)(app, [oldPath2]);
|
144
|
+
for (const [backlinkPath, links] of currentBacklinksMap.entries()) {
|
145
|
+
const newBacklinkPath = renameMap.get(backlinkPath) ?? backlinkPath;
|
146
|
+
const linkJsonToPathMap = backlinksMap.get(newBacklinkPath) ?? /* @__PURE__ */ new Map();
|
147
|
+
backlinksMap.set(newBacklinkPath, linkJsonToPathMap);
|
148
|
+
for (const link of links) {
|
149
|
+
linkJsonToPathMap.set((0, import_Object.toJson)(link), oldPath2);
|
150
|
+
}
|
151
|
+
}
|
152
|
+
}
|
153
|
+
const parentFolders = /* @__PURE__ */ new Set();
|
154
|
+
for (const entry of renameMap.entries()) {
|
155
|
+
const oldRelatedPath = entry[0];
|
156
|
+
let newRelatedPath = entry[1];
|
157
|
+
newRelatedPath = await renameHandled(app, oldRelatedPath, newRelatedPath);
|
158
|
+
renameMap.set(oldRelatedPath, newRelatedPath);
|
159
|
+
parentFolders.add((0, import_Path.dirname)(oldRelatedPath));
|
160
|
+
}
|
161
|
+
if (settings.shouldDeleteEmptyFolders) {
|
162
|
+
for (const parentFolder of parentFolders) {
|
163
|
+
await (0, import_Vault.deleteEmptyFolderHierarchy)(app, parentFolder);
|
138
164
|
}
|
139
165
|
}
|
166
|
+
for (const [newBacklinkPath, linkJsonToPathMap] of backlinksMap.entries()) {
|
167
|
+
await (0, import_Link.editLinks)(app, newBacklinkPath, (link) => {
|
168
|
+
const oldRelatedPath = linkJsonToPathMap.get((0, import_Object.toJson)(link));
|
169
|
+
if (!oldRelatedPath) {
|
170
|
+
return;
|
171
|
+
}
|
172
|
+
const newRelatedPath = renameMap.get(oldRelatedPath);
|
173
|
+
if (!newRelatedPath) {
|
174
|
+
return;
|
175
|
+
}
|
176
|
+
return (0, import_Link.updateLink)({
|
177
|
+
app,
|
178
|
+
link,
|
179
|
+
pathOrFile: newRelatedPath,
|
180
|
+
oldPathOrFile: oldRelatedPath,
|
181
|
+
sourcePathOrFile: newBacklinkPath,
|
182
|
+
renameMap,
|
183
|
+
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
184
|
+
});
|
185
|
+
});
|
186
|
+
}
|
187
|
+
if ((0, import_FileSystem.isCanvasFile)(newPath)) {
|
188
|
+
await (0, import_Vault.processWithRetry)(app, newPath, (content) => {
|
189
|
+
const canvasData = JSON.parse(content);
|
190
|
+
for (const node of canvasData.nodes) {
|
191
|
+
if (node.type !== "file") {
|
192
|
+
continue;
|
193
|
+
}
|
194
|
+
const newPath2 = renameMap.get(node.file);
|
195
|
+
if (!newPath2) {
|
196
|
+
continue;
|
197
|
+
}
|
198
|
+
node.file = newPath2;
|
199
|
+
}
|
200
|
+
return (0, import_Object.toJson)(canvasData);
|
201
|
+
});
|
202
|
+
} else if ((0, import_FileSystem.isMarkdownFile)(newPath)) {
|
203
|
+
await (0, import_Link.updateLinksInFile)({
|
204
|
+
app,
|
205
|
+
pathOrFile: newPath,
|
206
|
+
oldPathOrFile: oldPath,
|
207
|
+
renameMap,
|
208
|
+
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
209
|
+
});
|
210
|
+
}
|
140
211
|
}
|
141
|
-
async function handleDelete(app,
|
142
|
-
console.debug(`Handle Delete ${
|
143
|
-
if (!(0, import_FileSystem.isNote)(
|
212
|
+
async function handleDelete(app, path) {
|
213
|
+
console.debug(`Handle Delete ${path}`);
|
214
|
+
if (!(0, import_FileSystem.isNote)(path)) {
|
144
215
|
return;
|
145
216
|
}
|
146
217
|
const settings = getSettings(app);
|
147
218
|
if (!settings.shouldDeleteOrphanAttachments) {
|
148
219
|
return;
|
149
220
|
}
|
150
|
-
const cache = deletedMetadataCacheMap.get(
|
151
|
-
deletedMetadataCacheMap.delete(
|
221
|
+
const cache = deletedMetadataCacheMap.get(path);
|
222
|
+
deletedMetadataCacheMap.delete(path);
|
152
223
|
if (cache) {
|
153
224
|
const links = (0, import_MetadataCache.getAllLinks)(cache);
|
154
225
|
for (const link of links) {
|
155
|
-
const attachmentFile = (0, import_Link.extractLinkFile)(app, link,
|
226
|
+
const attachmentFile = (0, import_Link.extractLinkFile)(app, link, path);
|
156
227
|
if (!attachmentFile) {
|
157
228
|
continue;
|
158
229
|
}
|
159
230
|
if ((0, import_FileSystem.isNote)(attachmentFile)) {
|
160
231
|
continue;
|
161
232
|
}
|
162
|
-
await (0, import_Vault.deleteSafe)(app, attachmentFile,
|
233
|
+
await (0, import_Vault.deleteSafe)(app, attachmentFile, path, settings.shouldDeleteEmptyFolders);
|
163
234
|
}
|
164
235
|
}
|
165
|
-
const attachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app,
|
236
|
+
const attachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, path);
|
166
237
|
const attachmentFolder = (0, import_FileSystem.getFolderOrNull)(app, attachmentFolderPath);
|
167
238
|
if (!attachmentFolder) {
|
168
239
|
return;
|
169
240
|
}
|
170
|
-
await (0, import_Vault.deleteSafe)(app, attachmentFolder,
|
241
|
+
await (0, import_Vault.deleteSafe)(app, attachmentFolder, path, false, settings.shouldDeleteEmptyFolders);
|
171
242
|
}
|
172
|
-
async function fillRenameMap(app,
|
173
|
-
|
243
|
+
async function fillRenameMap(app, oldPath, newPath, renameMap) {
|
244
|
+
renameMap.set(oldPath, newPath);
|
245
|
+
if (!(0, import_FileSystem.isNote)(oldPath)) {
|
174
246
|
return;
|
175
247
|
}
|
176
248
|
const settings = getSettings(app);
|
177
249
|
const oldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, oldPath);
|
178
|
-
const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await (0, import_AttachmentPath.getAttachmentFolderPath)(app,
|
250
|
+
const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await (0, import_AttachmentPath.getAttachmentFolderPath)(app, newPath) : oldAttachmentFolderPath;
|
179
251
|
const dummyOldAttachmentFolderPath = await (0, import_AttachmentPath.getAttachmentFolderPath)(app, (0, import_Path.join)((0, import_Path.dirname)(oldPath), "DUMMY_FILE.md"));
|
180
252
|
const oldAttachmentFolder = (0, import_FileSystem.getFolderOrNull)(app, oldAttachmentFolderPath);
|
181
253
|
if (!oldAttachmentFolder) {
|
@@ -184,131 +256,53 @@ async function fillRenameMap(app, file, oldPath, renameMap) {
|
|
184
256
|
if (oldAttachmentFolderPath === newAttachmentFolderPath && !settings.shouldRenameAttachmentFiles) {
|
185
257
|
return;
|
186
258
|
}
|
187
|
-
const
|
259
|
+
const oldAttachmentFiles = [];
|
188
260
|
if (oldAttachmentFolderPath === dummyOldAttachmentFolderPath) {
|
189
|
-
const
|
190
|
-
if (!
|
261
|
+
const oldCache = await (0, import_MetadataCache.getCacheSafe)(app, oldPath);
|
262
|
+
if (!oldCache) {
|
191
263
|
return;
|
192
264
|
}
|
193
|
-
for (const
|
194
|
-
const
|
195
|
-
if (!
|
265
|
+
for (const oldLink of (0, import_MetadataCache.getAllLinks)(oldCache)) {
|
266
|
+
const oldAttachmentFile = (0, import_Link.extractLinkFile)(app, oldLink, oldPath);
|
267
|
+
if (!oldAttachmentFile) {
|
196
268
|
continue;
|
197
269
|
}
|
198
|
-
if (
|
199
|
-
const
|
200
|
-
if (
|
201
|
-
|
270
|
+
if (oldAttachmentFile.path.startsWith(oldAttachmentFolderPath)) {
|
271
|
+
const oldAttachmentBacklinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, oldAttachmentFile);
|
272
|
+
if (oldAttachmentBacklinks.keys().length === 1) {
|
273
|
+
oldAttachmentFiles.push(oldAttachmentFile);
|
202
274
|
}
|
203
275
|
}
|
204
276
|
}
|
205
277
|
} else {
|
206
|
-
import_obsidian.Vault.recurseChildren(oldAttachmentFolder, (
|
207
|
-
if (
|
208
|
-
|
278
|
+
import_obsidian.Vault.recurseChildren(oldAttachmentFolder, (oldAttachmentFile) => {
|
279
|
+
if ((0, import_FileSystem.isFile)(oldAttachmentFile)) {
|
280
|
+
oldAttachmentFiles.push(oldAttachmentFile);
|
209
281
|
}
|
210
282
|
});
|
211
283
|
}
|
212
|
-
const
|
213
|
-
|
214
|
-
|
284
|
+
const oldBasename = (0, import_Path.basename)(oldPath, (0, import_Path.extname)(oldPath));
|
285
|
+
const newBasename = (0, import_Path.basename)(newPath, (0, import_Path.extname)(newPath));
|
286
|
+
for (const oldAttachmentFile of oldAttachmentFiles) {
|
287
|
+
if ((0, import_FileSystem.isNote)(oldAttachmentFile)) {
|
215
288
|
continue;
|
216
289
|
}
|
217
|
-
const relativePath = (0, import_Path.relative)(oldAttachmentFolderPath,
|
290
|
+
const relativePath = (0, import_Path.relative)(oldAttachmentFolderPath, oldAttachmentFile.path);
|
218
291
|
const newDir = (0, import_Path.join)(newAttachmentFolderPath, (0, import_Path.dirname)(relativePath));
|
219
|
-
const newChildBasename = settings.shouldRenameAttachmentFiles ?
|
220
|
-
let newChildPath = (0, import_Path.join)(newDir, (0, import_Path.makeFileName)(newChildBasename,
|
221
|
-
if (
|
222
|
-
if (settings.shouldDeleteConflictingAttachments) {
|
223
|
-
const newChildFile = (0, import_FileSystem.getFileOrNull)(app, newChildPath);
|
224
|
-
if (newChildFile) {
|
225
|
-
await app.fileManager.trashFile(newChildFile);
|
226
|
-
}
|
227
|
-
} else {
|
228
|
-
newChildPath = app.vault.getAvailablePath((0, import_Path.join)(newDir, newChildBasename), child.extension);
|
229
|
-
}
|
230
|
-
renameMap.set(child.path, newChildPath);
|
231
|
-
}
|
232
|
-
}
|
233
|
-
}
|
234
|
-
async function processRename(app, oldPath, newPath, renameMap) {
|
235
|
-
const settings = getSettings(app);
|
236
|
-
let oldFile = (0, import_FileSystem.getFileOrNull)(app, oldPath);
|
237
|
-
if (oldFile) {
|
238
|
-
const oldFolder = oldFile.parent;
|
239
|
-
newPath = await (0, import_Vault.renameSafe)(app, oldFile, newPath);
|
240
|
-
renameMap.set(oldPath, newPath);
|
241
|
-
if (settings.shouldDeleteEmptyFolders) {
|
242
|
-
await (0, import_Vault.deleteEmptyFolderHierarchy)(app, oldFolder);
|
243
|
-
}
|
244
|
-
}
|
245
|
-
oldFile = (0, import_FileSystem.getFile)(app, oldPath, true);
|
246
|
-
const newFile = (0, import_FileSystem.getFileOrNull)(app, newPath);
|
247
|
-
if (!oldFile.deleted || !newFile) {
|
248
|
-
throw new Error(`Could not rename ${oldPath} to ${newPath}`);
|
249
|
-
}
|
250
|
-
if (!settings.shouldUpdateLinks) {
|
251
|
-
return;
|
252
|
-
}
|
253
|
-
const backlinks = await (0, import_MetadataCache.getBacklinksMap)(app, [oldFile, newFile]);
|
254
|
-
for (const parentNotePath of backlinks.keys()) {
|
255
|
-
let parentNote = (0, import_FileSystem.getFileOrNull)(app, parentNotePath);
|
256
|
-
if (!parentNote) {
|
257
|
-
const newParentNotePath = renameMap.get(parentNotePath);
|
258
|
-
if (newParentNotePath) {
|
259
|
-
parentNote = (0, import_FileSystem.getFileOrNull)(app, newParentNotePath);
|
260
|
-
}
|
261
|
-
}
|
262
|
-
if (!parentNote) {
|
263
|
-
console.warn(`Parent note not found: ${parentNotePath}`);
|
292
|
+
const newChildBasename = settings.shouldRenameAttachmentFiles ? oldAttachmentFile.basename.replaceAll(oldBasename, newBasename) : oldAttachmentFile.basename;
|
293
|
+
let newChildPath = (0, import_Path.join)(newDir, (0, import_Path.makeFileName)(newChildBasename, oldAttachmentFile.extension));
|
294
|
+
if (oldAttachmentFile.path === newChildPath) {
|
264
295
|
continue;
|
265
296
|
}
|
266
|
-
|
267
|
-
const
|
268
|
-
|
269
|
-
|
270
|
-
for (const link of links) {
|
271
|
-
changes.push({
|
272
|
-
startIndex: link.position.start.offset,
|
273
|
-
endIndex: link.position.end.offset,
|
274
|
-
oldContent: link.original,
|
275
|
-
newContent: (0, import_Link.updateLink)({
|
276
|
-
app,
|
277
|
-
link,
|
278
|
-
pathOrFile: newFile,
|
279
|
-
oldPathOrFile: oldPath,
|
280
|
-
sourcePathOrFile: parentNote,
|
281
|
-
renameMap,
|
282
|
-
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
283
|
-
})
|
284
|
-
});
|
297
|
+
if (settings.shouldDeleteConflictingAttachments) {
|
298
|
+
const newChildFile = (0, import_FileSystem.getFileOrNull)(app, newChildPath);
|
299
|
+
if (newChildFile) {
|
300
|
+
await app.fileManager.trashFile(newChildFile);
|
285
301
|
}
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
await (0, import_Vault.processWithRetry)(app, newFile, (content) => {
|
291
|
-
const canvasData = JSON.parse(content);
|
292
|
-
for (const node of canvasData.nodes) {
|
293
|
-
if (node.type !== "file") {
|
294
|
-
continue;
|
295
|
-
}
|
296
|
-
const newPath2 = renameMap.get(node.file);
|
297
|
-
if (!newPath2) {
|
298
|
-
continue;
|
299
|
-
}
|
300
|
-
node.file = newPath2;
|
301
|
-
}
|
302
|
-
return (0, import_Object.toJson)(canvasData);
|
303
|
-
});
|
304
|
-
} else if ((0, import_FileSystem.isMarkdownFile)(newFile)) {
|
305
|
-
await (0, import_Link.updateLinksInFile)({
|
306
|
-
app,
|
307
|
-
pathOrFile: newFile,
|
308
|
-
oldPathOrFile: oldPath,
|
309
|
-
renameMap,
|
310
|
-
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
311
|
-
});
|
302
|
+
} else {
|
303
|
+
newChildPath = app.vault.getAvailablePath((0, import_Path.join)(newDir, newChildBasename), oldAttachmentFile.extension);
|
304
|
+
}
|
305
|
+
renameMap.set(oldAttachmentFile.path, newChildPath);
|
312
306
|
}
|
313
307
|
}
|
314
308
|
function getSettings(app) {
|
@@ -328,8 +322,17 @@ function handleMetadataDeleted(file, prevCache) {
|
|
328
322
|
deletedMetadataCacheMap.set(file.path, prevCache);
|
329
323
|
}
|
330
324
|
}
|
325
|
+
function makeKey(oldPath, newPath) {
|
326
|
+
return `${oldPath} -> ${newPath}`;
|
327
|
+
}
|
328
|
+
async function renameHandled(app, oldPath, newPath) {
|
329
|
+
newPath = await (0, import_Vault.renameSafe)(app, (0, import_FileSystem.getFile)(app, oldPath), newPath);
|
330
|
+
const key = makeKey(oldPath, newPath);
|
331
|
+
handledRenames.add(key);
|
332
|
+
return newPath;
|
333
|
+
}
|
331
334
|
// Annotate the CommonJS export names for ESM import in node:
|
332
335
|
0 && (module.exports = {
|
333
336
|
registerRenameDeleteHandlers
|
334
337
|
});
|
335
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/ICgoKT0+e2lmKHR5cGVvZiBfX2ZpbGVuYW1lIT09XCJzdHJpbmdcIil7cmV0dXJuIG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpfXJldHVybiByZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKX0pKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1sncHJvY2VzcyddID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFBsdWdpbixcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBBcHAsXG4gIFRGaWxlLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IENhbnZhc0RhdGEgfSBmcm9tICdvYnNpZGlhbi9jYW52YXMuanMnO1xuXG5pbXBvcnQgeyB0b0pzb24gfSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQgeyBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCB9IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHsgY2hhaW5Bc3luY0ZuIH0gZnJvbSAnLi9DaGFpbmVkUHJvbWlzZS50cyc7XG5pbXBvcnQge1xuICBnZXRGaWxlLFxuICBnZXRGaWxlT3JOdWxsLFxuICBnZXRGb2xkZXJPck51bGwsXG4gIGlzQ2FudmFzRmlsZSxcbiAgaXNNYXJrZG93bkZpbGUsXG4gIGlzTm90ZVxufSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHtcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRCYWNrbGlua3NNYXAsXG4gIGdldENhY2hlU2FmZVxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGRlbGV0ZVNhZmUsXG4gIHByb2Nlc3NXaXRoUmV0cnksXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmNvbnN0IHNwZWNpYWxSZW5hbWVzOiBTcGVjaWFsUmVuYW1lW10gPSBbXTtcbmNvbnN0IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPigpO1xuXG5pbnRlcmZhY2UgU3BlY2lhbFJlbmFtZSB7XG4gIG9sZFBhdGg6IHN0cmluZztcbiAgbmV3UGF0aDogc3RyaW5nO1xuICB0ZW1wUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHRpbmdzIGZvciB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBjb25mbGljdGluZyBhdHRhY2htZW50cy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGVtcHR5IGZvbGRlcnMuXG4gICAqL1xuICBzaG91bGREZWxldGVFbXB0eUZvbGRlcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIG9ycGhhbiBhdHRhY2htZW50cyBhZnRlciBhIGRlbGV0ZS5cbiAgICovXG4gIHNob3VsZERlbGV0ZU9ycGhhbkF0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZpbGVzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgICovXG4gIHNob3VsZFJlbmFtZUF0dGFjaG1lbnRGb2xkZXI6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGZpbGVuYW1lIGFsaWFzZXMgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgbGlua3Mgd2hlbiBhIG5vdGUgb3IgYXR0YWNobWVudCBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlTGlua3M6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSByZW5hbWUvZGVsZXRlIGhhbmRsZXJzLlxuICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gaW5zdGFuY2UuXG4gKiBAcGFyYW0gc2V0dGluZ3NCdWlsZGVyIC0gQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNldHRpbmdzIGZvciB0aGUgcmVuYW1lIGRlbGV0ZSBoYW5kbGVyLlxuICogQHJldHVybnMgdm9pZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJSZW5hbWVEZWxldGVIYW5kbGVycyhwbHVnaW46IFBsdWdpbiwgc2V0dGluZ3NCdWlsZGVyOiAoKSA9PiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4pOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChwbHVnaW4uYXBwKTtcbiAgY29uc3QgcGx1Z2luSWQgPSBwbHVnaW4ubWFuaWZlc3QuaWQ7XG5cbiAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuc2V0KHBsdWdpbklkLCBzZXR0aW5nc0J1aWxkZXIpO1xuICBsb2dQbHVnaW5TZXR0aW5nc09yZGVyKHBsdWdpbi5hcHApO1xuXG4gIHBsdWdpbi5yZWdpc3RlcigoKSA9PiB7XG4gICAgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAuZGVsZXRlKHBsdWdpbklkKTtcbiAgICBsb2dQbHVnaW5TZXR0aW5nc09yZGVyKHBsdWdpbi5hcHApO1xuICB9KTtcblxuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIoYXBwLCBwbHVnaW5JZCwgJ0RlbGV0ZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNoYWluQXN5bmNGbihhcHAsICgpID0+IGhhbmRsZURlbGV0ZShhcHAsIGZpbGUpKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGlmICghc2hvdWxkSW52b2tlSGFuZGxlcihhcHAsIHBsdWdpbklkLCAnUmVuYW1lJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2hhaW5Bc3luY0ZuKGFwcCwgKCkgPT4gaGFuZGxlUmVuYW1lKGFwcCwgZmlsZSwgb2xkUGF0aCkpO1xuICAgIH0pXG4gICk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSwgcHJldkNhY2hlKSA9PiB7XG4gICAgICBoYW5kbGVNZXRhZGF0YURlbGV0ZWQoZmlsZSwgcHJldkNhY2hlKTtcbiAgICB9KVxuICApO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nLCBoYW5kbGVyVHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0gcGx1Z2luSWQpIHtcbiAgICBjb25zb2xlLmRlYnVnKGAke2hhbmRsZXJUeXBlfSBoYW5kbGVyIGZvciBwbHVnaW4gJHtwbHVnaW5JZH0gaXMgc2tpcHBlZCwgYmVjYXVzZSBpdCBpcyBoYW5kbGVkIGJ5IHBsdWdpbiAke21haW5QbHVnaW5JZCA/PyAnKG5vbmUpJ31gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcDogQXBwKTogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbG9nUGx1Z2luU2V0dGluZ3NPcmRlcihhcHA6IEFwcCk6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnNvbGUuZGVidWcoYFJlbmFtZS9kZWxldGUgaGFuZGxlcnMgd2lsbCB1c2UgcGx1Z2luIHNldHRpbmdzIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICR7QXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC5rZXlzKCkpLmpvaW4oJywgJyl9YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgZmlsZTogVEFic3RyYWN0RmlsZSwgb2xkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUuZGVidWcoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke2ZpbGUucGF0aH1gKTtcblxuICBpZiAoIShmaWxlIGluc3RhbmNlb2YgVEZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc3BlY2lhbFJlbmFtZSA9IHNwZWNpYWxSZW5hbWVzLmZpbmQoKHgpID0+IHgub2xkUGF0aCA9PT0gZmlsZS5wYXRoKTtcbiAgaWYgKHNwZWNpYWxSZW5hbWUpIHtcbiAgICBjb25zdCBuZXdUZW1wUGF0aCA9IGF3YWl0IHJlbmFtZVNhZmUoYXBwLCBmaWxlLCBzcGVjaWFsUmVuYW1lLnRlbXBQYXRoKTtcbiAgICBzcGVjaWFsUmVuYW1lLnRlbXBQYXRoID0gbmV3VGVtcFBhdGg7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGFwcC52YXVsdC5hZGFwdGVyLmluc2Vuc2l0aXZlICYmIG9sZFBhdGgudG9Mb3dlckNhc2UoKSA9PT0gZmlsZS5wYXRoLnRvTG93ZXJDYXNlKCkgJiYgZGlybmFtZShvbGRQYXRoKSA9PT0gZGlybmFtZShmaWxlLnBhdGgpKSB7XG4gICAgc3BlY2lhbFJlbmFtZXMucHVzaCh7XG4gICAgICBvbGRQYXRoLFxuICAgICAgbmV3UGF0aDogZmlsZS5wYXRoLFxuICAgICAgdGVtcFBhdGg6IGpvaW4oZmlsZS5wYXJlbnQ/LnBhdGggPz8gJycsICdfX3RlbXBfXycgKyBmaWxlLm5hbWUpXG4gICAgfSk7XG5cbiAgICBhd2FpdCByZW5hbWVTYWZlKGFwcCwgZmlsZSwgb2xkUGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICBjb25zdCB1cGRhdGVBbGxMaW5rcyA9IGFwcC5maWxlTWFuYWdlci51cGRhdGVBbGxMaW5rcztcbiAgdHJ5IHtcbiAgICBhcHAuZmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3MgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfTtcblxuICAgIGNvbnN0IHJlbmFtZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgYXdhaXQgZmlsbFJlbmFtZU1hcChhcHAsIGZpbGUsIG9sZFBhdGgsIHJlbmFtZU1hcCk7XG4gICAgcmVuYW1lTWFwLnNldChvbGRQYXRoLCBmaWxlLnBhdGgpO1xuXG4gICAgZm9yIChjb25zdCBbb2xkUGF0aDIsIG5ld1BhdGgyXSBvZiByZW5hbWVNYXAuZW50cmllcygpKSB7XG4gICAgICBhd2FpdCBwcm9jZXNzUmVuYW1lKGFwcCwgb2xkUGF0aDIsIG5ld1BhdGgyLCByZW5hbWVNYXApO1xuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhcHAuZmlsZU1hbmFnZXIudXBkYXRlQWxsTGlua3MgPSB1cGRhdGVBbGxMaW5rcztcblxuICAgIGNvbnN0IHNwZWNpYWxSZW5hbWUgPSBzcGVjaWFsUmVuYW1lcy5maW5kKCh4KSA9PiB4LnRlbXBQYXRoID09PSBmaWxlLnBhdGgpO1xuICAgIGlmIChzcGVjaWFsUmVuYW1lKSB7XG4gICAgICBhd2FpdCByZW5hbWVTYWZlKGFwcCwgZmlsZSwgc3BlY2lhbFJlbmFtZS5uZXdQYXRoKTtcbiAgICAgIHNwZWNpYWxSZW5hbWVzLnJlbW92ZShzcGVjaWFsUmVuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGVsZXRlKGFwcDogQXBwLCBmaWxlOiBUQWJzdHJhY3RGaWxlKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUuZGVidWcoYEhhbmRsZSBEZWxldGUgJHtmaWxlLnBhdGh9YCk7XG4gIGlmICghaXNOb3RlKGZpbGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZERlbGV0ZU9ycGhhbkF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQoZmlsZS5wYXRoKTtcbiAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZGVsZXRlKGZpbGUucGF0aCk7XG4gIGlmIChjYWNoZSkge1xuICAgIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MoY2FjaGUpO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShhcHAsIGxpbmssIGZpbGUucGF0aCk7XG4gICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKGF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGaWxlLCBmaWxlLnBhdGgsIHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIGZpbGUucGF0aCk7XG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBhdHRhY2htZW50Rm9sZGVyUGF0aCk7XG5cbiAgaWYgKCFhdHRhY2htZW50Rm9sZGVyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGb2xkZXIsIGZpbGUucGF0aCwgZmFsc2UsIHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGxSZW5hbWVNYXAoYXBwOiBBcHAsIGZpbGU6IFRGaWxlLCBvbGRQYXRoOiBzdHJpbmcsIHJlbmFtZU1hcDogTWFwPHN0cmluZywgc3RyaW5nPik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWlzTm90ZShmaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgb2xkUGF0aCk7XG4gIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBmaWxlLnBhdGgpXG4gICAgOiBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aDtcbiAgY29uc3QgZHVtbXlPbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgam9pbihkaXJuYW1lKG9sZFBhdGgpLCAnRFVNTVlfRklMRS5tZCcpKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyID0gZ2V0Rm9sZGVyT3JOdWxsKGFwcCwgb2xkQXR0YWNobWVudEZvbGRlclBhdGgpO1xuXG4gIGlmICghb2xkQXR0YWNobWVudEZvbGRlcikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gbmV3QXR0YWNobWVudEZvbGRlclBhdGggJiYgIXNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlcykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNoaWxkcmVuOiBURmlsZVtdID0gW107XG5cbiAgaWYgKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoID09PSBkdW1teU9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBnZXRDYWNoZVNhZmUoYXBwLCBmaWxlKTtcbiAgICBpZiAoIWNhY2hlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGluayBvZiBnZXRBbGxMaW5rcyhjYWNoZSkpIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgbGluaywgb2xkUGF0aCk7XG4gICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0YWNobWVudEZpbGUucGF0aC5zdGFydHNXaXRoKG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKSkge1xuICAgICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIGF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKGJhY2tsaW5rcy5rZXlzKCkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgY2hpbGRyZW4ucHVzaChhdHRhY2htZW50RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcbiAgICAgICAgY2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvbGROb3RlQmFzZU5hbWUgPSBiYXNlbmFtZShvbGRQYXRoLCBleHRuYW1lKG9sZFBhdGgpKTtcblxuICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNoaWxkcmVuKSB7XG4gICAgaWYgKGlzTm90ZShjaGlsZCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgY2hpbGQucGF0aCk7XG4gICAgY29uc3QgbmV3RGlyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICA/IGNoaWxkLmJhc2VuYW1lLnJlcGxhY2VBbGwob2xkTm90ZUJhc2VOYW1lLCBmaWxlLmJhc2VuYW1lKVxuICAgICAgOiBjaGlsZC5iYXNlbmFtZTtcbiAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdEaXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBjaGlsZC5leHRlbnNpb24pKTtcbiAgICBpZiAoY2hpbGQucGF0aCAhPT0gbmV3Q2hpbGRQYXRoKSB7XG4gICAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50cykge1xuICAgICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3Q2hpbGRQYXRoKTtcbiAgICAgICAgaWYgKG5ld0NoaWxkRmlsZSkge1xuICAgICAgICAgIGF3YWl0IGFwcC5maWxlTWFuYWdlci50cmFzaEZpbGUobmV3Q2hpbGRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3Q2hpbGRQYXRoID0gYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgoam9pbihuZXdEaXIsIG5ld0NoaWxkQmFzZW5hbWUpLCBjaGlsZC5leHRlbnNpb24pO1xuICAgICAgfVxuICAgICAgcmVuYW1lTWFwLnNldChjaGlsZC5wYXRoLCBuZXdDaGlsZFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzUmVuYW1lKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZywgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcbiAgbGV0IG9sZEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgb2xkUGF0aCk7XG5cbiAgaWYgKG9sZEZpbGUpIHtcbiAgICBjb25zdCBvbGRGb2xkZXIgPSBvbGRGaWxlLnBhcmVudDtcbiAgICBuZXdQYXRoID0gYXdhaXQgcmVuYW1lU2FmZShhcHAsIG9sZEZpbGUsIG5ld1BhdGgpO1xuICAgIHJlbmFtZU1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgICBpZiAoc2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzKSB7XG4gICAgICBhd2FpdCBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeShhcHAsIG9sZEZvbGRlcik7XG4gICAgfVxuICB9XG5cbiAgb2xkRmlsZSA9IGdldEZpbGUoYXBwLCBvbGRQYXRoLCB0cnVlKTtcbiAgY29uc3QgbmV3RmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBuZXdQYXRoKTtcblxuICBpZiAoIW9sZEZpbGUuZGVsZXRlZCB8fCAhbmV3RmlsZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlbmFtZSAke29sZFBhdGh9IHRvICR7bmV3UGF0aH1gKTtcbiAgfVxuXG4gIGlmICghc2V0dGluZ3Muc2hvdWxkVXBkYXRlTGlua3MpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NNYXAoYXBwLCBbb2xkRmlsZSwgbmV3RmlsZV0pO1xuXG4gIGZvciAoY29uc3QgcGFyZW50Tm90ZVBhdGggb2YgYmFja2xpbmtzLmtleXMoKSkge1xuICAgIGxldCBwYXJlbnROb3RlID0gZ2V0RmlsZU9yTnVsbChhcHAsIHBhcmVudE5vdGVQYXRoKTtcbiAgICBpZiAoIXBhcmVudE5vdGUpIHtcbiAgICAgIGNvbnN0IG5ld1BhcmVudE5vdGVQYXRoID0gcmVuYW1lTWFwLmdldChwYXJlbnROb3RlUGF0aCk7XG4gICAgICBpZiAobmV3UGFyZW50Tm90ZVBhdGgpIHtcbiAgICAgICAgcGFyZW50Tm90ZSA9IGdldEZpbGVPck51bGwoYXBwLCBuZXdQYXJlbnROb3RlUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnROb3RlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYFBhcmVudCBub3RlIG5vdCBmb3VuZDogJHtwYXJlbnROb3RlUGF0aH1gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGF3YWl0IGFwcGx5RmlsZUNoYW5nZXMoYXBwLCBwYXJlbnROb3RlLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBiYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NNYXAoYXBwLCBbb2xkRmlsZSwgbmV3RmlsZV0pO1xuICAgICAgY29uc3QgbGlua3MgPSBiYWNrbGlua3MuZ2V0KHBhcmVudE5vdGVQYXRoKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICAgIGNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgc3RhcnRJbmRleDogbGluay5wb3NpdGlvbi5zdGFydC5vZmZzZXQsXG4gICAgICAgICAgZW5kSW5kZXg6IGxpbmsucG9zaXRpb24uZW5kLm9mZnNldCxcbiAgICAgICAgICBvbGRDb250ZW50OiBsaW5rLm9yaWdpbmFsLFxuICAgICAgICAgIG5ld0NvbnRlbnQ6IHVwZGF0ZUxpbmsoe1xuICAgICAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgICAgICBsaW5rLFxuICAgICAgICAgICAgcGF0aE9yRmlsZTogbmV3RmlsZSxcbiAgICAgICAgICAgIG9sZFBhdGhPckZpbGU6IG9sZFBhdGgsXG4gICAgICAgICAgICBzb3VyY2VQYXRoT3JGaWxlOiBwYXJlbnROb3RlLFxuICAgICAgICAgICAgcmVuYW1lTWFwLFxuICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjaGFuZ2VzO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGlzQ2FudmFzRmlsZShuZXdGaWxlKSkge1xuICAgIGF3YWl0IHByb2Nlc3NXaXRoUmV0cnkoYXBwLCBuZXdGaWxlLCAoY29udGVudCkgPT4ge1xuICAgICAgY29uc3QgY2FudmFzRGF0YSA9IEpTT04ucGFyc2UoY29udGVudCkgYXMgQ2FudmFzRGF0YTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBjYW52YXNEYXRhLm5vZGVzKSB7XG4gICAgICAgIGlmIChub2RlLnR5cGUgIT09ICdmaWxlJykge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1BhdGggPSByZW5hbWVNYXAuZ2V0KG5vZGUuZmlsZSk7XG4gICAgICAgIGlmICghbmV3UGF0aCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUuZmlsZSA9IG5ld1BhdGg7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9Kc29uKGNhbnZhc0RhdGEpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzTWFya2Rvd25GaWxlKG5ld0ZpbGUpKSB7XG4gICAgYXdhaXQgdXBkYXRlTGlua3NJbkZpbGUoe1xuICAgICAgYXBwOiBhcHAsXG4gICAgICBwYXRoT3JGaWxlOiBuZXdGaWxlLFxuICAgICAgb2xkUGF0aE9yRmlsZTogb2xkUGF0aCxcbiAgICAgIHJlbmFtZU1hcCxcbiAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgIH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFNldHRpbmdzKGFwcDogQXBwKTogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+IHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBzZXR0aW5nc0J1aWxkZXJzID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyc01hcC52YWx1ZXMoKSkucmV2ZXJzZSgpO1xuXG4gIGNvbnN0IHNldHRpbmdzOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4gPSB7fTtcbiAgZm9yIChjb25zdCBzZXR0aW5nc0J1aWxkZXIgb2Ygc2V0dGluZ3NCdWlsZGVycykge1xuICAgIGNvbnN0IG5ld1NldHRpbmdzID0gc2V0dGluZ3NCdWlsZGVyKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobmV3U2V0dGluZ3MpIGFzIFtrZXlvZiBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3MsIGJvb2xlYW5dW10pIHtcbiAgICAgIHNldHRpbmdzW2tleV0gfHw9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGU6IFRBYnN0cmFjdEZpbGUsIHByZXZDYWNoZTogQ2FjaGVkTWV0YWRhdGEgfCBudWxsKTogdm9pZCB7XG4gIGlmIChpc01hcmtkb3duRmlsZShmaWxlKSAmJiBwcmV2Q2FjaGUpIHtcbiAgICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5zZXQoZmlsZS5wYXRoLCBwcmV2Q2FjaGUpO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVdBLHNCQUlPO0FBR1Asb0JBQXVCO0FBQ3ZCLGtCQU9PO0FBQ1AsaUJBQXlDO0FBQ3pDLDRCQUF3QztBQUN4Qyw0QkFBNkI7QUFDN0Isd0JBT087QUFDUCxrQkFJTztBQUNQLDJCQUtPO0FBQ1AsbUJBTU87QUF2RFAsSUFBSSxvQkFBb0IsV0FBVyxpQkFBaUIsTUFBTSxNQUFJO0FBQUMsTUFBRyxPQUFPLGVBQWEsVUFBUztBQUFDLFdBQU8sSUFBSSxJQUFJLE9BQU8sU0FBUyxJQUFJO0FBQUEsRUFBQztBQUFDLFNBQU8sUUFBUSxVQUFVLEVBQUUsY0FBYyxVQUFVO0FBQUMsR0FBRztBQUM1TCxJQUFJLFlBQVksV0FBVyxTQUFTLEtBQUs7QUFBQSxFQUN2QyxPQUFPLE1BQUk7QUFBQSxFQUNYLE9BQU8sQ0FBQztBQUFBLEVBQ1IsWUFBWTtBQUNkO0FBb0RBLE1BQU0saUJBQWtDLENBQUM7QUFDekMsTUFBTSwwQkFBMEIsb0JBQUksSUFBNEI7QUFzRHpELFNBQVMsNkJBQTZCLFFBQWdCLGlCQUFtRTtBQUM5SCxRQUFNLDBCQUEwQiwyQkFBMkIsT0FBTyxHQUFHO0FBQ3JFLFFBQU0sV0FBVyxPQUFPLFNBQVM7QUFFakMsMEJBQXdCLElBQUksVUFBVSxlQUFlO0FBQ3JELHlCQUF1QixPQUFPLEdBQUc7QUFFakMsU0FBTyxTQUFTLE1BQU07QUFDcEIsNEJBQXdCLE9BQU8sUUFBUTtBQUN2QywyQkFBdUIsT0FBTyxHQUFHO0FBQUEsRUFDbkMsQ0FBQztBQUVELFFBQU0sTUFBTSxPQUFPO0FBQ25CLFNBQU87QUFBQSxJQUNMLElBQUksTUFB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
|
338
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbInZhciBfX2ltcG9ydF9tZXRhX3VybCA9IGdsb2JhbFRoaXNbJ2ltcG9ydC5tZXRhLnVybCddID8/ICgoKT0+e2lmKHR5cGVvZiBfX2ZpbGVuYW1lIT09XCJzdHJpbmdcIil7cmV0dXJuIG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpfXJldHVybiByZXF1aXJlKFwibm9kZTp1cmxcIikucGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKX0pKCk7XG52YXIgX19wcm9jZXNzID0gZ2xvYmFsVGhpc1sncHJvY2VzcyddID8/IHtcbiAgXCJjd2RcIjogKCk9PlwiL1wiLFxuICBcImVudlwiOiB7fSxcbiAgXCJwbGF0Zm9ybVwiOiBcImFuZHJvaWRcIlxufTtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVkTWV0YWRhdGEsXG4gIFBsdWdpbixcbiAgVEFic3RyYWN0RmlsZVxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQge1xuICBBcHAsXG4gIFRGaWxlLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IENhbnZhc0RhdGEgfSBmcm9tICdvYnNpZGlhbi9jYW52YXMuanMnO1xuXG5pbXBvcnQgeyB0b0pzb24gfSBmcm9tICcuLi9PYmplY3QudHMnO1xuaW1wb3J0IHtcbiAgYmFzZW5hbWUsXG4gIGRpcm5hbWUsXG4gIGV4dG5hbWUsXG4gIGpvaW4sXG4gIG1ha2VGaWxlTmFtZSxcbiAgcmVsYXRpdmVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQgeyBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCB9IGZyb20gJy4vQXR0YWNobWVudFBhdGgudHMnO1xuaW1wb3J0IHsgY2hhaW4gfSBmcm9tICcuL0NoYWluZWRQcm9taXNlLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc0ZpbGUsXG4gIGlzTWFya2Rvd25GaWxlLFxuICBpc05vdGVcbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGVkaXRMaW5rcyxcbiAgZXh0cmFjdExpbmtGaWxlLFxuICB1cGRhdGVMaW5rLFxuICB1cGRhdGVMaW5rc0luRmlsZVxufSBmcm9tICcuL0xpbmsudHMnO1xuaW1wb3J0IHtcbiAgZ2V0QWxsTGlua3MsXG4gIGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlLFxuICBnZXRCYWNrbGlua3NNYXAsXG4gIGdldENhY2hlU2FmZVxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHksXG4gIGRlbGV0ZVNhZmUsXG4gIHByb2Nlc3NXaXRoUmV0cnksXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5cbmNvbnN0IGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwID0gbmV3IE1hcDxzdHJpbmcsIENhY2hlZE1ldGFkYXRhPigpO1xuY29uc3QgaGFuZGxlZFJlbmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgY29uZmxpY3RpbmcgYXR0YWNobWVudHMuXG4gICAqL1xuICBzaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBlbXB0eSBmb2xkZXJzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRlbGV0ZSBvcnBoYW4gYXR0YWNobWVudHMgYWZ0ZXIgYSBkZWxldGUuXG4gICAqL1xuICBzaG91bGREZWxldGVPcnBoYW5BdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmb2xkZXIgd2hlbiBhIG5vdGUgaXMgcmVuYW1lZC5cbiAgICAqL1xuICBzaG91bGRSZW5hbWVBdHRhY2htZW50Rm9sZGVyOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlbmFtZSBhbGlhc2VzIHdoZW4gYSBub3RlIGlzIHJlbmFtZWQuXG4gICAqL1xuICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gdXBkYXRlIGxpbmtzIHdoZW4gYSBub3RlIG9yIGF0dGFjaG1lbnQgaXMgcmVuYW1lZC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUxpbmtzOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVycy5cbiAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIGluc3RhbmNlLlxuICogQHBhcmFtIHNldHRpbmdzQnVpbGRlciAtIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBzZXR0aW5ncyBmb3IgdGhlIHJlbmFtZSBkZWxldGUgaGFuZGxlci5cbiAqIEByZXR1cm5zIHZvaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUmVuYW1lRGVsZXRlSGFuZGxlcnMocGx1Z2luOiBQbHVnaW4sIHNldHRpbmdzQnVpbGRlcjogKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+KTogdm9pZCB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAocGx1Z2luLmFwcCk7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnNldChwbHVnaW5JZCwgc2V0dGluZ3NCdWlsZGVyKTtcbiAgbG9nUGx1Z2luU2V0dGluZ3NPcmRlcihwbHVnaW4uYXBwKTtcblxuICBwbHVnaW4ucmVnaXN0ZXIoKCkgPT4ge1xuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZShwbHVnaW5JZCk7XG4gICAgbG9nUGx1Z2luU2V0dGluZ3NPcmRlcihwbHVnaW4uYXBwKTtcbiAgfSk7XG5cbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLnZhdWx0Lm9uKCdkZWxldGUnLCAoZmlsZSkgPT4ge1xuICAgICAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKGFwcCwgcGx1Z2luSWQsICdEZWxldGUnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRoID0gZmlsZS5wYXRoO1xuICAgICAgY2hhaW4oYXBwLCAoKSA9PiBoYW5kbGVEZWxldGUoYXBwLCBwYXRoKSk7XG4gICAgfSlcbiAgKTtcblxuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ3JlbmFtZScsIChmaWxlLCBvbGRQYXRoKSA9PiB7XG4gICAgICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIoYXBwLCBwbHVnaW5JZCwgJ1JlbmFtZScpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG5ld1BhdGggPSBmaWxlLnBhdGg7XG4gICAgICBjaGFpbihhcHAsICgpID0+IGhhbmRsZVJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC5tZXRhZGF0YUNhY2hlLm9uKCdkZWxldGVkJywgKGZpbGUsIHByZXZDYWNoZSkgPT4ge1xuICAgICAgaGFuZGxlTWV0YWRhdGFEZWxldGVkKGZpbGUsIHByZXZDYWNoZSk7XG4gICAgfSlcbiAgKTtcbn1cblxuZnVuY3Rpb24gc2hvdWxkSW52b2tlSGFuZGxlcihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZywgaGFuZGxlclR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyUGx1Z2luSWRzID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc3QgbWFpblBsdWdpbklkID0gQXJyYXkuZnJvbShyZW5hbWVEZWxldGVIYW5kbGVyUGx1Z2luSWRzLmtleXMoKSlbMF07XG4gIGlmIChtYWluUGx1Z2luSWQgIT09IHBsdWdpbklkKSB7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHtoYW5kbGVyVHlwZX0gaGFuZGxlciBmb3IgcGx1Z2luICR7cGx1Z2luSWR9IGlzIHNraXBwZWQsIGJlY2F1c2UgaXQgaXMgaGFuZGxlZCBieSBwbHVnaW4gJHttYWluUGx1Z2luSWQgPz8gJyhub25lKSd9YCk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHA6IEFwcCk6IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4ge1xuICByZXR1cm4gZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlKGFwcCwgJ3JlbmFtZURlbGV0ZUhhbmRsZXJzTWFwJywgbmV3IE1hcDxzdHJpbmcsICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPj4oKSkudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxvZ1BsdWdpblNldHRpbmdzT3JkZXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zb2xlLmRlYnVnKGBSZW5hbWUvZGVsZXRlIGhhbmRsZXJzIHdpbGwgdXNlIHBsdWdpbiBzZXR0aW5ncyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiAke0FycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAua2V5cygpKS5qb2luKCcsICcpfWApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVSZW5hbWUoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnNvbGUuZGVidWcoYEhhbmRsZSBSZW5hbWUgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YCk7XG5cbiAgY29uc3QgbmV3RmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBuZXdQYXRoKTtcbiAgaWYgKCFuZXdGaWxlKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaWYgKGhhbmRsZWRSZW5hbWVzLmhhcyhrZXkpKSB7XG4gICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZFxuICBjb25zdCB1cGRhdGVBbGxMaW5rcyA9IGFwcC5maWxlTWFuYWdlci51cGRhdGVBbGxMaW5rcztcbiAgYXBwLmZpbGVNYW5hZ2VyLnVwZGF0ZUFsbExpbmtzID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIC8vIGRvIG5vdGhpbmdcbiAgfTtcbiAgdHJ5IHtcbiAgICBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgbmV3UGF0aCwgb2xkUGF0aCk7XG4gICAgYXdhaXQgcHJvY2Vzc0FuZFJlbmFtZShhcHAsIG9sZFBhdGgsIG5ld1BhdGgpO1xuICB9IGZpbmFsbHkge1xuICAgIGFwcC5maWxlTWFuYWdlci51cGRhdGVBbGxMaW5rcyA9IHVwZGF0ZUFsbExpbmtzO1xuICAgIGNvbnN0IG9ycGhhbktleXMgPSBBcnJheS5mcm9tKGhhbmRsZWRSZW5hbWVzKTtcbiAgICBjaGFpbihhcHAsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG9ycGhhbktleXMpIHtcbiAgICAgICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0FuZFJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGFwcC52YXVsdC5hZGFwdGVyLmluc2Vuc2l0aXZlICYmIG5ld1BhdGgudG9Mb3dlckNhc2UoKSA9PT0gb2xkUGF0aC50b0xvd2VyQ2FzZSgpICYmIGRpcm5hbWUobmV3UGF0aCkgPT09IGRpcm5hbWUob2xkUGF0aCkpIHtcbiAgICBjb25zdCB0ZW1wUGF0aCA9IGpvaW4oZGlybmFtZShvbGRQYXRoKSwgJ19fdGVtcF9fJyArIGJhc2VuYW1lKG5ld1BhdGgpKTtcbiAgICBhd2FpdCBwcm9jZXNzQW5kUmVuYW1lKGFwcCwgb2xkUGF0aCwgdGVtcFBhdGgpO1xuICAgIGF3YWl0IHByb2Nlc3NBbmRSZW5hbWUoYXBwLCB0ZW1wUGF0aCwgbmV3UGF0aCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBhd2FpdCBmaWxsUmVuYW1lTWFwKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgcmVuYW1lTWFwKTtcblxuICBjb25zdCBiYWNrbGlua3NNYXAgPSBuZXcgTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4oKTtcblxuICBmb3IgKGNvbnN0IG9sZFBhdGgyIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICBjb25zdCBjdXJyZW50QmFja2xpbmtzTWFwID0gYXdhaXQgZ2V0QmFja2xpbmtzTWFwKGFwcCwgW29sZFBhdGgyXSk7XG4gICAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2YgY3VycmVudEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHJlbmFtZU1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgICBjb25zdCBsaW5rSnNvblRvUGF0aE1hcCA9IGJhY2tsaW5rc01hcC5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgYmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICAgIGZvciAoY29uc3QgbGluayBvZiBsaW5rcykge1xuICAgICAgICBsaW5rSnNvblRvUGF0aE1hcC5zZXQodG9Kc29uKGxpbmspLCBvbGRQYXRoMik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGFyZW50Rm9sZGVycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgZW50cnkgb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG9sZFJlbGF0ZWRQYXRoID0gZW50cnlbMF07XG4gICAgbGV0IG5ld1JlbGF0ZWRQYXRoID0gZW50cnlbMV07XG4gICAgbmV3UmVsYXRlZFBhdGggPSBhd2FpdCByZW5hbWVIYW5kbGVkKGFwcCwgb2xkUmVsYXRlZFBhdGgsIG5ld1JlbGF0ZWRQYXRoKTtcbiAgICByZW5hbWVNYXAuc2V0KG9sZFJlbGF0ZWRQYXRoLCBuZXdSZWxhdGVkUGF0aCk7XG4gICAgcGFyZW50Rm9sZGVycy5hZGQoZGlybmFtZShvbGRSZWxhdGVkUGF0aCkpO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycykge1xuICAgIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyIG9mIHBhcmVudEZvbGRlcnMpIHtcbiAgICAgIGF3YWl0IGRlbGV0ZUVtcHR5Rm9sZGVySGllcmFyY2h5KGFwcCwgcGFyZW50Rm9sZGVyKTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwXSBvZiBiYWNrbGlua3NNYXAuZW50cmllcygpKSB7XG4gICAgYXdhaXQgZWRpdExpbmtzKGFwcCwgbmV3QmFja2xpbmtQYXRoLCAobGluaykgPT4ge1xuICAgICAgY29uc3Qgb2xkUmVsYXRlZFBhdGggPSBsaW5rSnNvblRvUGF0aE1hcC5nZXQodG9Kc29uKGxpbmspKTtcbiAgICAgIGlmICghb2xkUmVsYXRlZFBhdGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBuZXdSZWxhdGVkUGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkUmVsYXRlZFBhdGgpO1xuICAgICAgaWYgKCFuZXdSZWxhdGVkUGF0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB1cGRhdGVMaW5rKHtcbiAgICAgICAgYXBwOiBhcHAsXG4gICAgICAgIGxpbmssXG4gICAgICAgIHBhdGhPckZpbGU6IG5ld1JlbGF0ZWRQYXRoLFxuICAgICAgICBvbGRQYXRoT3JGaWxlOiBvbGRSZWxhdGVkUGF0aCxcbiAgICAgICAgc291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICByZW5hbWVNYXAsXG4gICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAoaXNDYW52YXNGaWxlKG5ld1BhdGgpKSB7XG4gICAgYXdhaXQgcHJvY2Vzc1dpdGhSZXRyeShhcHAsIG5ld1BhdGgsIChjb250ZW50KSA9PiB7XG4gICAgICBjb25zdCBjYW52YXNEYXRhID0gSlNPTi5wYXJzZShjb250ZW50KSBhcyBDYW52YXNEYXRhO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIGNhbnZhc0RhdGEubm9kZXMpIHtcbiAgICAgICAgaWYgKG5vZGUudHlwZSAhPT0gJ2ZpbGUnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3UGF0aCA9IHJlbmFtZU1hcC5nZXQobm9kZS5maWxlKTtcbiAgICAgICAgaWYgKCFuZXdQYXRoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5maWxlID0gbmV3UGF0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0b0pzb24oY2FudmFzRGF0YSk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoaXNNYXJrZG93bkZpbGUobmV3UGF0aCkpIHtcbiAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZSh7XG4gICAgICBhcHA6IGFwcCxcbiAgICAgIHBhdGhPckZpbGU6IG5ld1BhdGgsXG4gICAgICBvbGRQYXRoT3JGaWxlOiBvbGRQYXRoLFxuICAgICAgcmVuYW1lTWFwLFxuICAgICAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhczogc2V0dGluZ3Muc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlRGVsZXRlKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc29sZS5kZWJ1ZyhgSGFuZGxlIERlbGV0ZSAke3BhdGh9YCk7XG4gIGlmICghaXNOb3RlKHBhdGgpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZERlbGV0ZU9ycGhhbkF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FjaGUgPSBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5nZXQocGF0aCk7XG4gIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLmRlbGV0ZShwYXRoKTtcbiAgaWYgKGNhY2hlKSB7XG4gICAgY29uc3QgbGlua3MgPSBnZXRBbGxMaW5rcyhjYWNoZSk7XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZXh0cmFjdExpbmtGaWxlKGFwcCwgbGluaywgcGF0aCk7XG4gICAgICBpZiAoIWF0dGFjaG1lbnRGaWxlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNOb3RlKGF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGaWxlLCBwYXRoLCBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBwYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBkZWxldGVTYWZlKGFwcCwgYXR0YWNobWVudEZvbGRlciwgcGF0aCwgZmFsc2UsIHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpbGxSZW5hbWVNYXAoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nLCByZW5hbWVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmVuYW1lTWFwLnNldChvbGRQYXRoLCBuZXdQYXRoKTtcblxuICBpZiAoIWlzTm90ZShvbGRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgb2xkUGF0aCk7XG4gIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBuZXdQYXRoKVxuICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG4gIGNvbnN0IGR1bW15T2xkQXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIGpvaW4oZGlybmFtZShvbGRQYXRoKSwgJ0RVTU1ZX0ZJTEUubWQnKSk7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IGR1bW15T2xkQXR0YWNobWVudEZvbGRlclBhdGgpIHtcbiAgICBjb25zdCBvbGRDYWNoZSA9IGF3YWl0IGdldENhY2hlU2FmZShhcHAsIG9sZFBhdGgpO1xuICAgIGlmICghb2xkQ2FjaGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvbGRMaW5rIG9mIGdldEFsbExpbmtzKG9sZENhY2hlKSkge1xuICAgICAgY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgPSBleHRyYWN0TGlua0ZpbGUoYXBwLCBvbGRMaW5rLCBvbGRQYXRoKTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBWYXVsdC5yZWN1cnNlQ2hpbGRyZW4ob2xkQXR0YWNobWVudEZvbGRlciwgKG9sZEF0dGFjaG1lbnRGaWxlKSA9PiB7XG4gICAgICBpZiAoaXNGaWxlKG9sZEF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBvbGRBdHRhY2htZW50RmlsZXMucHVzaChvbGRBdHRhY2htZW50RmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdCBvbGRCYXNlbmFtZSA9IGJhc2VuYW1lKG9sZFBhdGgsIGV4dG5hbWUob2xkUGF0aCkpO1xuICBjb25zdCBuZXdCYXNlbmFtZSA9IGJhc2VuYW1lKG5ld1BhdGgsIGV4dG5hbWUobmV3UGF0aCkpO1xuXG4gIGZvciAoY29uc3Qgb2xkQXR0YWNobWVudEZpbGUgb2Ygb2xkQXR0YWNobWVudEZpbGVzKSB7XG4gICAgaWYgKGlzTm90ZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCwgb2xkQXR0YWNobWVudEZpbGUucGF0aCk7XG4gICAgY29uc3QgbmV3RGlyID0gam9pbihuZXdBdHRhY2htZW50Rm9sZGVyUGF0aCwgZGlybmFtZShyZWxhdGl2ZVBhdGgpKTtcbiAgICBjb25zdCBuZXdDaGlsZEJhc2VuYW1lID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzXG4gICAgICA/IG9sZEF0dGFjaG1lbnRGaWxlLmJhc2VuYW1lLnJlcGxhY2VBbGwob2xkQmFzZW5hbWUsIG5ld0Jhc2VuYW1lKVxuICAgICAgOiBvbGRBdHRhY2htZW50RmlsZS5iYXNlbmFtZTtcbiAgICBsZXQgbmV3Q2hpbGRQYXRoID0gam9pbihuZXdEaXIsIG1ha2VGaWxlTmFtZShuZXdDaGlsZEJhc2VuYW1lLCBvbGRBdHRhY2htZW50RmlsZS5leHRlbnNpb24pKTtcblxuICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoID09PSBuZXdDaGlsZFBhdGgpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzKSB7XG4gICAgICBjb25zdCBuZXdDaGlsZEZpbGUgPSBnZXRGaWxlT3JOdWxsKGFwcCwgbmV3Q2hpbGRQYXRoKTtcbiAgICAgIGlmIChuZXdDaGlsZEZpbGUpIHtcbiAgICAgICAgYXdhaXQgYXBwLmZpbGVNYW5hZ2VyLnRyYXNoRmlsZShuZXdDaGlsZEZpbGUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdDaGlsZFBhdGggPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aChqb2luKG5ld0RpciwgbmV3Q2hpbGRCYXNlbmFtZSksIG9sZEF0dGFjaG1lbnRGaWxlLmV4dGVuc2lvbik7XG4gICAgfVxuICAgIHJlbmFtZU1hcC5zZXQob2xkQXR0YWNobWVudEZpbGUucGF0aCwgbmV3Q2hpbGRQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTZXR0aW5ncyhhcHA6IEFwcCk6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiB7XG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwID0gZ2V0UmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAoYXBwKTtcbiAgY29uc3Qgc2V0dGluZ3NCdWlsZGVycyA9IEFycmF5LmZyb20ocmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAudmFsdWVzKCkpLnJldmVyc2UoKTtcblxuICBjb25zdCBzZXR0aW5nczogUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+ID0ge307XG4gIGZvciAoY29uc3Qgc2V0dGluZ3NCdWlsZGVyIG9mIHNldHRpbmdzQnVpbGRlcnMpIHtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHNldHRpbmdzQnVpbGRlcigpO1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG5ld1NldHRpbmdzKSBhcyBba2V5b2YgUmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzLCBib29sZWFuXVtdKSB7XG4gICAgICBzZXR0aW5nc1trZXldIHx8PSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2V0dGluZ3M7XG59XG5cbmZ1bmN0aW9uIGhhbmRsZU1ldGFkYXRhRGVsZXRlZChmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICBpZiAoaXNNYXJrZG93bkZpbGUoZmlsZSkgJiYgcHJldkNhY2hlKSB7XG4gICAgZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuc2V0KGZpbGUucGF0aCwgcHJldkNhY2hlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBtYWtlS2V5KG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke29sZFBhdGh9IC0+ICR7bmV3UGF0aH1gO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZW5hbWVIYW5kbGVkKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgZ2V0RmlsZShhcHAsIG9sZFBhdGgpLCBuZXdQYXRoKTtcbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFXQSxzQkFJTztBQUdQLG9CQUF1QjtBQUN2QixrQkFPTztBQUNQLGlCQUF5QztBQUN6Qyw0QkFBd0M7QUFDeEMsNEJBQXNCO0FBQ3RCLHdCQVFPO0FBQ1Asa0JBS087QUFDUCwyQkFLTztBQUNQLG1CQUtPO0FBeERQLElBQUksb0JBQW9CLFdBQVcsaUJBQWlCLE1BQU0sTUFBSTtBQUFDLE1BQUcsT0FBTyxlQUFhLFVBQVM7QUFBQyxXQUFPLElBQUksSUFBSSxPQUFPLFNBQVMsSUFBSTtBQUFBLEVBQUM7QUFBQyxTQUFPLFFBQVEsVUFBVSxFQUFFLGNBQWMsVUFBVTtBQUFDLEdBQUc7QUFDNUwsSUFBSSxZQUFZLFdBQVcsU0FBUyxLQUFLO0FBQUEsRUFDdkMsT0FBTyxNQUFJO0FBQUEsRUFDWCxPQUFPLENBQUM7QUFBQSxFQUNSLFlBQVk7QUFDZDtBQXFEQSxNQUFNLDBCQUEwQixvQkFBSSxJQUE0QjtBQUNoRSxNQUFN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UyxxQkFBUSxPQUFPLENBQUM7QUFFdEQsYUFBVyxxQkFBcUIsb0JBQW9CO0FBQ2xELFlBQUksMEJBQU8saUJBQWlCLEdBQUc7QUFDN0I7QUFBQSxJQUNGO0FBQ0EsVUFBTSxtQkFBZSxzQkFBUyx5QkFBeUIsa0JBQWtCLElBQUk7QUFDN0UsVUFBTSxhQUFTLGtCQUFLLDZCQUF5QixxQkFBUSxZQUFZLENBQUM7QUFDbEUsVUFBTSxtQkFBbUIsU0FBUyw4QkFDOUIsa0JBQWtCLFNBQVMsV0FBVyxhQUFhLFdBQVcsSUFDOUQsa0JBQWtCO0FBQ3RCLFFBQUksbUJBQWUsa0JBQUssWUFBUSwwQkFBYSxrQkFBa0Isa0JBQWtCLFNBQVMsQ0FBQztBQUUzRixRQUFJLGtCQUFrQixTQUFTLGNBQWM7QUFDM0M7QUFBQSxJQUNGO0FBRUEsUUFBSSxTQUFTLG9DQUFvQztBQUMvQyxZQUFNLG1CQUFlLGlDQUFjLEtBQUssWUFBWTtBQUNwRCxVQUFJLGNBQWM7QUFDaEIsY0FBTSxJQUFJLFlBQVksVUFBVSxZQUFZO0FBQUEsTUFDOUM7QUFBQSxJQUNGLE9BQU87QUFDTCxxQkFBZSxJQUFJLE1BQU0scUJBQWlCLGtCQUFLLFFBQVEsZ0JBQWdCLEdBQUcsa0JBQWtCLFNBQVM7QUFBQSxJQUN2RztBQUNBLGNBQVUsSUFBSSxrQkFBa0IsTUFBTSxZQUFZO0FBQUEsRUFDcEQ7QUFDRjtBQUVBLFNBQVMsWUFBWSxLQUFnRDtBQUNuRSxRQUFNLDBCQUEwQiwyQkFBMkIsR0FBRztBQUM5RCxRQUFNLG1CQUFtQixNQUFNLEtBQUssd0JBQXdCLE9BQU8sQ0FBQyxFQUFFLFFBQVE7QUFFOUUsUUFBTSxXQUFpRCxDQUFDO0FBQ3hELGFBQVcsbUJBQW1CLGtCQUFrQjtBQUM5QyxVQUFNLGNBQWMsZ0JBQWdCO0FBQ3BDLGVBQVcsQ0FBQyxLQUFLLEtBQUssS0FBSyxPQUFPLFFBQVEsV0FBVyxHQUFxRDtBQUN4RyxlQUFTLEdBQUcsTUFBTTtBQUFBLElBQ3BCO0FBQUEsRUFDRjtBQUVBLFNBQU87QUFDVDtBQUVBLFNBQVMsc0JBQXNCLE1BQXFCLFdBQXdDO0FBQzFGLFVBQUksa0NBQWUsSUFBSSxLQUFLLFdBQVc7QUFDckMsNEJBQXdCLElBQUksS0FBSyxNQUFNLFNBQVM7QUFBQSxFQUNsRDtBQUNGO0FBRUEsU0FBUyxRQUFRLFNBQWlCLFNBQXlCO0FBQ3pELFNBQU8sR0FBRyxPQUFPLE9BQU8sT0FBTztBQUNqQztBQUVBLGVBQWUsY0FBYyxLQUFVLFNBQWlCLFNBQWtDO0FBQ3hGLFlBQVUsVUFBTSx5QkFBVyxTQUFLLDJCQUFRLEtBQUssT0FBTyxHQUFHLE9BQU87QUFDOUQsUUFBTSxNQUFNLFFBQVEsU0FBUyxPQUFPO0FBQ3BDLGlCQUFlLElBQUksR0FBRztBQUN0QixTQUFPO0FBQ1Q7IiwKICAibmFtZXMiOiBbImtleSIsICJuZXdQYXRoIl0KfQo=
|