obsidian-dev-utils 17.10.1 → 17.10.2-beta.10
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 +58 -0
- package/dist/lib/Async.cjs +1 -1
- package/dist/lib/Async.mjs +154 -0
- package/dist/lib/Blob.cjs +1 -1
- package/dist/lib/Blob.mjs +81 -0
- package/dist/lib/CssClass.cjs +1 -1
- package/dist/lib/CssClass.mjs +32 -0
- package/dist/lib/Debug.cjs +1 -1
- package/dist/lib/Debug.mjs +137 -0
- package/dist/lib/DebugController.cjs +1 -1
- package/dist/lib/DebugController.mjs +8 -0
- package/dist/lib/Enum.cjs +1 -1
- package/dist/lib/Enum.mjs +26 -0
- package/dist/lib/Error.cjs +1 -1
- package/dist/lib/Error.mjs +82 -0
- package/dist/lib/Function.cjs +1 -1
- package/dist/lib/Function.mjs +28 -0
- package/dist/lib/HTMLElement.cjs +1 -1
- package/dist/lib/HTMLElement.mjs +65 -0
- package/dist/lib/Library.cjs +3 -3
- package/dist/lib/Library.mjs +16 -0
- package/dist/lib/Object.cjs +2 -2
- package/dist/lib/Object.d.ts +16 -0
- package/dist/lib/Object.mjs +273 -0
- package/dist/lib/Path.cjs +1 -1
- package/dist/lib/Path.mjs +76 -0
- package/dist/lib/RegExp.cjs +1 -1
- package/dist/lib/RegExp.mjs +23 -0
- package/dist/lib/String.cjs +1 -1
- package/dist/lib/String.mjs +119 -0
- package/dist/lib/Transformers/DateTransformer.cjs +71 -0
- package/dist/lib/Transformers/DateTransformer.d.ts +35 -0
- package/dist/lib/Transformers/DateTransformer.mjs +47 -0
- package/dist/lib/Transformers/DurationTransformer.cjs +71 -0
- package/dist/lib/Transformers/DurationTransformer.d.ts +34 -0
- package/dist/lib/Transformers/DurationTransformer.mjs +47 -0
- package/dist/lib/Transformers/GroupTransformer.cjs +118 -0
- package/dist/lib/Transformers/GroupTransformer.d.ts +65 -0
- package/dist/lib/Transformers/GroupTransformer.mjs +94 -0
- package/dist/lib/Transformers/SkipPrivatePropertyTransformer.cjs +69 -0
- package/dist/lib/Transformers/SkipPrivatePropertyTransformer.d.ts +32 -0
- package/dist/lib/Transformers/SkipPrivatePropertyTransformer.mjs +45 -0
- package/dist/lib/Transformers/Transformer.cjs +107 -0
- package/dist/lib/Transformers/Transformer.d.ts +67 -0
- package/dist/lib/Transformers/Transformer.mjs +83 -0
- package/dist/lib/Transformers/TypedTransformer.cjs +38 -0
- package/dist/lib/Transformers/TypedTransformer.d.ts +37 -0
- package/dist/lib/Transformers/TypedTransformer.mjs +14 -0
- package/dist/lib/ValueProvider.cjs +1 -1
- package/dist/lib/ValueProvider.mjs +20 -0
- package/dist/lib/codemirror/StateFieldSpec.cjs +1 -1
- package/dist/lib/codemirror/StateFieldSpec.mjs +8 -0
- package/dist/lib/index.cjs +2 -14
- package/dist/lib/index.d.ts +0 -4
- package/dist/lib/index.mjs +42 -0
- package/dist/lib/obsidian/App.cjs +1 -1
- package/dist/lib/obsidian/App.mjs +33 -0
- package/dist/lib/obsidian/AttachmentPath.cjs +1 -1
- package/dist/lib/obsidian/AttachmentPath.mjs +82 -0
- package/dist/lib/obsidian/Backlink.cjs +1 -1
- package/dist/lib/obsidian/Backlink.mjs +88 -0
- package/dist/lib/obsidian/Callout.cjs +1 -1
- package/dist/lib/obsidian/Callout.mjs +71 -0
- package/dist/lib/obsidian/Components/DateComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/DateComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/DateComponent.mjs +43 -0
- package/dist/lib/obsidian/Components/DateTimeComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/DateTimeComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/DateTimeComponent.mjs +43 -0
- package/dist/lib/obsidian/Components/EmailComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/EmailComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/EmailComponent.mjs +32 -0
- package/dist/lib/obsidian/Components/FileComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/FileComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/FileComponent.mjs +48 -0
- package/dist/lib/obsidian/Components/MonthComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/MonthComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/MonthComponent.mjs +51 -0
- package/dist/lib/obsidian/Components/MultipleDropdownComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/MultipleDropdownComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/MultipleDropdownComponent.mjs +88 -0
- package/dist/lib/obsidian/Components/MultipleEmailComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/MultipleEmailComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/MultipleEmailComponent.mjs +42 -0
- package/dist/lib/obsidian/Components/MultipleFileComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/MultipleFileComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/MultipleFileComponent.mjs +49 -0
- package/dist/lib/obsidian/Components/NumberComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/NumberComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/NumberComponent.mjs +32 -0
- package/dist/lib/obsidian/Components/TimeComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/TimeComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/TimeComponent.mjs +53 -0
- package/dist/lib/obsidian/Components/TypedRangeTextComponent.cjs +1 -1
- package/dist/lib/obsidian/Components/TypedRangeTextComponent.mjs +44 -0
- package/dist/lib/obsidian/Components/TypedTextComponent.cjs +1 -1
- package/dist/lib/obsidian/Components/TypedTextComponent.mjs +107 -0
- package/dist/lib/obsidian/Components/UrlComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/UrlComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/UrlComponent.mjs +32 -0
- package/dist/lib/obsidian/Components/ValidatorComponent.cjs +1 -1
- package/dist/lib/obsidian/Components/ValidatorComponent.mjs +52 -0
- package/dist/lib/obsidian/Components/ValueComponentWithChangeTracking.cjs +1 -1
- package/dist/lib/obsidian/Components/ValueComponentWithChangeTracking.mjs +9 -0
- package/dist/lib/obsidian/Components/WeekComponent.cjs +2 -2
- package/dist/lib/obsidian/Components/WeekComponent.d.ts +1 -1
- package/dist/lib/obsidian/Components/WeekComponent.mjs +51 -0
- package/dist/lib/obsidian/Dataview.cjs +1 -1
- package/dist/lib/obsidian/Dataview.mjs +232 -0
- package/dist/lib/obsidian/DataviewLink.cjs +1 -1
- package/dist/lib/obsidian/DataviewLink.mjs +27 -0
- package/dist/lib/obsidian/FileChange.cjs +1 -1
- package/dist/lib/obsidian/FileChange.mjs +123 -0
- package/dist/lib/obsidian/FileManager.cjs +1 -1
- package/dist/lib/obsidian/FileManager.mjs +66 -0
- package/dist/lib/obsidian/FileSystem.cjs +1 -1
- package/dist/lib/obsidian/FileSystem.mjs +197 -0
- package/dist/lib/obsidian/Frontmatter.cjs +1 -1
- package/dist/lib/obsidian/Frontmatter.mjs +32 -0
- package/dist/lib/obsidian/Link.cjs +1 -1
- package/dist/lib/obsidian/Link.mjs +415 -0
- package/dist/lib/obsidian/Logger.cjs +1 -1
- package/dist/lib/obsidian/Logger.mjs +45 -0
- package/dist/lib/obsidian/Loop.cjs +1 -1
- package/dist/lib/obsidian/Loop.mjs +39 -0
- package/dist/lib/obsidian/Markdown.cjs +1 -1
- package/dist/lib/obsidian/Markdown.mjs +40 -0
- package/dist/lib/obsidian/MarkdownCodeBlockProcessor.cjs +1 -1
- package/dist/lib/obsidian/MarkdownCodeBlockProcessor.mjs +44 -0
- package/dist/lib/obsidian/MarkdownView.cjs +1 -1
- package/dist/lib/obsidian/MarkdownView.mjs +21 -0
- package/dist/lib/obsidian/MetadataCache.cjs +1 -1
- package/dist/lib/obsidian/MetadataCache.mjs +219 -0
- package/dist/lib/obsidian/Modals/Alert.cjs +1 -1
- package/dist/lib/obsidian/Modals/Alert.mjs +52 -0
- package/dist/lib/obsidian/Modals/Confirm.cjs +1 -1
- package/dist/lib/obsidian/Modals/Confirm.mjs +65 -0
- package/dist/lib/obsidian/Modals/Prompt.cjs +1 -1
- package/dist/lib/obsidian/Modals/Prompt.mjs +98 -0
- package/dist/lib/obsidian/Modals/SelectItem.cjs +1 -1
- package/dist/lib/obsidian/Modals/SelectItem.mjs +51 -0
- package/dist/lib/obsidian/ObsidianSettings.cjs +1 -1
- package/dist/lib/obsidian/ObsidianSettings.mjs +18 -0
- package/dist/lib/obsidian/Pdf.cjs +1 -1
- package/dist/lib/obsidian/Pdf.mjs +42 -0
- package/dist/lib/obsidian/Plugin/EmptySettings.cjs +1 -1
- package/dist/lib/obsidian/Plugin/EmptySettings.mjs +14 -0
- package/dist/lib/obsidian/Plugin/ObsidianPluginRepoPaths.cjs +3 -2
- package/dist/lib/obsidian/Plugin/ObsidianPluginRepoPaths.d.ts +2 -0
- package/dist/lib/obsidian/Plugin/ObsidianPluginRepoPaths.mjs +36 -0
- package/dist/lib/obsidian/Plugin/Plugin.cjs +1 -1
- package/dist/lib/obsidian/Plugin/Plugin.mjs +28 -0
- package/dist/lib/obsidian/Plugin/PluginBase.cjs +1 -1
- package/dist/lib/obsidian/Plugin/PluginBase.mjs +148 -0
- package/dist/lib/obsidian/Plugin/PluginContext.cjs +1 -1
- package/dist/lib/obsidian/Plugin/PluginContext.mjs +45 -0
- package/dist/lib/obsidian/Plugin/PluginId.cjs +1 -1
- package/dist/lib/obsidian/Plugin/PluginId.mjs +23 -0
- package/dist/lib/obsidian/Plugin/PluginSettingsBase.cjs +20 -10
- package/dist/lib/obsidian/Plugin/PluginSettingsBase.d.ts +2 -0
- package/dist/lib/obsidian/Plugin/PluginSettingsBase.mjs +69 -0
- package/dist/lib/obsidian/Plugin/PluginSettingsTabBase.cjs +2 -2
- package/dist/lib/obsidian/Plugin/PluginSettingsTabBase.d.ts +1 -1
- package/dist/lib/obsidian/Plugin/PluginSettingsTabBase.mjs +101 -0
- package/dist/lib/obsidian/Queue.cjs +1 -1
- package/dist/lib/obsidian/Queue.mjs +50 -0
- package/dist/lib/obsidian/Reference.cjs +1 -1
- package/dist/lib/obsidian/Reference.mjs +45 -0
- package/dist/lib/obsidian/RenameDeleteHandler.cjs +1 -1
- package/dist/lib/obsidian/RenameDeleteHandler.mjs +436 -0
- package/dist/lib/obsidian/ResourceUrl.cjs +1 -1
- package/dist/lib/obsidian/ResourceUrl.mjs +19 -0
- package/dist/lib/obsidian/SettingEx.cjs +1 -1
- package/dist/lib/obsidian/SettingEx.mjs +148 -0
- package/dist/lib/obsidian/Vault.cjs +1 -1
- package/dist/lib/obsidian/Vault.mjs +248 -0
- package/dist/lib/obsidian/VaultEx.cjs +1 -1
- package/dist/lib/obsidian/VaultEx.mjs +71 -0
- package/dist/lib/scripts/CliUtils.cjs +1 -1
- package/dist/lib/scripts/CliUtils.mjs +135 -0
- package/dist/lib/scripts/CodeGenerator.cjs +1 -1
- package/dist/lib/scripts/CodeGenerator.mjs +19 -0
- package/dist/lib/scripts/ESLint/ESLint.cjs +4 -3
- package/dist/lib/scripts/ESLint/ESLint.mjs +68 -0
- package/dist/lib/scripts/ESLint/eslint.config.cjs +1 -1
- package/dist/lib/scripts/ESLint/eslint.config.mjs +287 -0
- package/dist/lib/scripts/Exec.cjs +1 -1
- package/dist/lib/scripts/Exec.mjs +98 -0
- package/dist/lib/scripts/Fs.cjs +1 -1
- package/dist/lib/scripts/Fs.mjs +64 -0
- package/dist/lib/scripts/JSON.cjs +1 -1
- package/dist/lib/scripts/JSON.mjs +60 -0
- package/dist/lib/scripts/NodeModules.cjs +1 -1
- package/dist/lib/scripts/NodeModules.mjs +62 -0
- package/dist/lib/scripts/Npm.cjs +1 -1
- package/dist/lib/scripts/Npm.mjs +106 -0
- package/dist/lib/scripts/NpmPublish.cjs +1 -1
- package/dist/lib/scripts/NpmPublish.mjs +21 -0
- package/dist/lib/scripts/ObsidianDevUtilsRepoPaths.cjs +9 -2
- package/dist/lib/scripts/ObsidianDevUtilsRepoPaths.d.ts +14 -0
- package/dist/lib/scripts/ObsidianDevUtilsRepoPaths.mjs +47 -0
- package/dist/lib/scripts/Root.cjs +1 -1
- package/dist/lib/scripts/Root.mjs +66 -0
- package/dist/lib/scripts/build.cjs +1 -1
- package/dist/lib/scripts/build.mjs +60 -0
- package/dist/lib/scripts/cli.cjs +4 -3
- package/dist/lib/scripts/cli.mjs +65 -0
- package/dist/lib/scripts/esbuild/Dependency.cjs +4 -3
- package/dist/lib/scripts/esbuild/Dependency.mjs +95 -0
- package/dist/lib/scripts/esbuild/ObsidianPluginBuilder.cjs +1 -1
- package/dist/lib/scripts/esbuild/ObsidianPluginBuilder.mjs +149 -0
- package/dist/lib/scripts/esbuild/changeExtensionPlugin.cjs +67 -0
- package/dist/lib/scripts/esbuild/changeExtensionPlugin.d.ts +12 -0
- package/dist/lib/scripts/esbuild/changeExtensionPlugin.mjs +43 -0
- package/dist/lib/scripts/esbuild/copyToObsidianPluginsFolderPlugin.cjs +1 -1
- package/dist/lib/scripts/esbuild/copyToObsidianPluginsFolderPlugin.mjs +50 -0
- package/dist/lib/scripts/esbuild/fixEsmPlugin.cjs +1 -1
- package/dist/lib/scripts/esbuild/fixEsmPlugin.mjs +25 -0
- package/dist/lib/scripts/esbuild/fixSourceMapsPlugin.cjs +1 -1
- package/dist/lib/scripts/esbuild/fixSourceMapsPlugin.mjs +55 -0
- package/dist/lib/scripts/esbuild/preprocessPlugin.cjs +7 -6
- package/dist/lib/scripts/esbuild/preprocessPlugin.d.ts +2 -1
- package/dist/lib/scripts/esbuild/preprocessPlugin.mjs +113 -0
- package/dist/lib/scripts/esbuild/renameCssPlugin.cjs +1 -1
- package/dist/lib/scripts/esbuild/renameCssPlugin.mjs +31 -0
- package/dist/lib/scripts/esbuild/svelteWrapperPlugin.cjs +1 -1
- package/dist/lib/scripts/esbuild/svelteWrapperPlugin.mjs +41 -0
- package/dist/lib/scripts/format.cjs +4 -3
- package/dist/lib/scripts/format.mjs +41 -0
- package/dist/lib/scripts/spellcheck.cjs +1 -1
- package/dist/lib/scripts/spellcheck.mjs +15 -0
- package/dist/lib/scripts/version.cjs +7 -3
- package/dist/lib/scripts/version.mjs +365 -0
- package/dist/lib/url.cjs +1 -1
- package/dist/lib/url.mjs +25 -0
- package/dist/styles.css +6 -38
- package/package.json +163 -174
- package/dist/lib/@types.cjs +0 -24
- package/dist/lib/@types.d.ts +0 -20
- package/dist/lib/codemirror/index.cjs +0 -46
- package/dist/lib/codemirror/index.d.ts +0 -1
- package/dist/lib/obsidian/Components/index.cjs +0 -91
- package/dist/lib/obsidian/Components/index.d.ts +0 -16
- package/dist/lib/obsidian/Modals/index.cjs +0 -55
- package/dist/lib/obsidian/Modals/index.d.ts +0 -4
- package/dist/lib/obsidian/Plugin/index.cjs +0 -67
- package/dist/lib/obsidian/Plugin/index.d.ts +0 -8
- package/dist/lib/obsidian/index.cjs +0 -130
- package/dist/lib/obsidian/index.d.ts +0 -29
- package/dist/lib/scripts/ESLint/index.cjs +0 -49
- package/dist/lib/scripts/ESLint/index.d.ts +0 -2
- package/dist/lib/scripts/esbuild/index.cjs +0 -70
- package/dist/lib/scripts/esbuild/index.d.ts +0 -9
- package/dist/lib/scripts/esbuild/renameToCjsPlugin.cjs +0 -60
- package/dist/lib/scripts/esbuild/renameToCjsPlugin.d.ts +0 -14
- package/dist/lib/scripts/index.cjs +0 -94
- package/dist/lib/scripts/index.d.ts +0 -17
@@ -0,0 +1,436 @@
|
|
1
|
+
/*
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
|
7
|
+
|
8
|
+
import { around } from "monkey-around";
|
9
|
+
import {
|
10
|
+
App,
|
11
|
+
TFile,
|
12
|
+
Vault
|
13
|
+
} from "obsidian";
|
14
|
+
import { getLibDebugger } from "../Debug.mjs";
|
15
|
+
import { noopAsync } from "../Function.mjs";
|
16
|
+
import {
|
17
|
+
normalizeOptionalProperties,
|
18
|
+
toJson
|
19
|
+
} from "../Object.mjs";
|
20
|
+
import {
|
21
|
+
basename,
|
22
|
+
dirname,
|
23
|
+
extname,
|
24
|
+
join,
|
25
|
+
makeFileName,
|
26
|
+
relative
|
27
|
+
} from "../Path.mjs";
|
28
|
+
import { replaceAll } from "../String.mjs";
|
29
|
+
import { getObsidianDevUtilsState } from "./App.mjs";
|
30
|
+
import {
|
31
|
+
getAttachmentFolderPath,
|
32
|
+
hasOwnAttachmentFolder
|
33
|
+
} from "./AttachmentPath.mjs";
|
34
|
+
import {
|
35
|
+
getFile,
|
36
|
+
getFileOrNull,
|
37
|
+
getFolderOrNull,
|
38
|
+
isFile,
|
39
|
+
isMarkdownFile,
|
40
|
+
isNote
|
41
|
+
} from "./FileSystem.mjs";
|
42
|
+
import {
|
43
|
+
editLinks,
|
44
|
+
extractLinkFile,
|
45
|
+
updateLink,
|
46
|
+
updateLinksInFile
|
47
|
+
} from "./Link.mjs";
|
48
|
+
import {
|
49
|
+
getAllLinks,
|
50
|
+
getBacklinksForFileOrPath,
|
51
|
+
getBacklinksForFileSafe
|
52
|
+
} from "./MetadataCache.mjs";
|
53
|
+
import { addToQueue } from "./Queue.mjs";
|
54
|
+
import {
|
55
|
+
getSafeRenamePath,
|
56
|
+
renameSafe
|
57
|
+
} from "./Vault.mjs";
|
58
|
+
import {
|
59
|
+
deleteEmptyFolderHierarchy,
|
60
|
+
deleteSafe
|
61
|
+
} from "./VaultEx.mjs";
|
62
|
+
const deletedMetadataCacheMap = /* @__PURE__ */ new Map();
|
63
|
+
const handledRenames = /* @__PURE__ */ new Set();
|
64
|
+
const interruptedRenamesMap = /* @__PURE__ */ new Map();
|
65
|
+
function registerRenameDeleteHandlers(plugin, settingsBuilder) {
|
66
|
+
const renameDeleteHandlersMap = getRenameDeleteHandlersMap(plugin.app);
|
67
|
+
const pluginId = plugin.manifest.id;
|
68
|
+
renameDeleteHandlersMap.set(pluginId, settingsBuilder);
|
69
|
+
logRegisteredHandlers(plugin.app);
|
70
|
+
plugin.register(() => {
|
71
|
+
renameDeleteHandlersMap.delete(pluginId);
|
72
|
+
logRegisteredHandlers(plugin.app);
|
73
|
+
});
|
74
|
+
const app = plugin.app;
|
75
|
+
plugin.registerEvent(
|
76
|
+
app.vault.on("delete", (file) => {
|
77
|
+
handleDeleteIfEnabled(plugin, file);
|
78
|
+
})
|
79
|
+
);
|
80
|
+
plugin.registerEvent(
|
81
|
+
app.vault.on("rename", (file, oldPath) => {
|
82
|
+
handleRenameIfEnabled(plugin, file, oldPath);
|
83
|
+
})
|
84
|
+
);
|
85
|
+
plugin.registerEvent(
|
86
|
+
app.metadataCache.on("deleted", (file, prevCache) => {
|
87
|
+
handleMetadataDeletedIfEnabled(plugin, file, prevCache);
|
88
|
+
})
|
89
|
+
);
|
90
|
+
}
|
91
|
+
async function continueInterruptedRenames(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
|
92
|
+
const interruptedRenames = interruptedRenamesMap.get(oldPath);
|
93
|
+
if (interruptedRenames) {
|
94
|
+
interruptedRenamesMap.delete(oldPath);
|
95
|
+
for (const interruptedRename of interruptedRenames) {
|
96
|
+
await handleRenameAsync(app, interruptedRename.oldPath, newPath, oldPathBacklinksMap, oldPathLinks, interruptedRename.combinedBacklinksMap);
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
async function fillRenameMap(app, oldPath, newPath, renameMap, oldPathLinks) {
|
101
|
+
renameMap.set(oldPath, newPath);
|
102
|
+
if (!isNote(app, oldPath)) {
|
103
|
+
return;
|
104
|
+
}
|
105
|
+
const settings = getSettings(app);
|
106
|
+
const oldAttachmentFolderPath = await getAttachmentFolderPath(app, oldPath);
|
107
|
+
const newAttachmentFolderPath = settings.shouldRenameAttachmentFolder ? await getAttachmentFolderPath(app, newPath) : oldAttachmentFolderPath;
|
108
|
+
const oldAttachmentFolder = getFolderOrNull(app, oldAttachmentFolderPath);
|
109
|
+
if (!oldAttachmentFolder) {
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
if (oldAttachmentFolderPath === newAttachmentFolderPath && !settings.shouldRenameAttachmentFiles) {
|
113
|
+
return;
|
114
|
+
}
|
115
|
+
const oldAttachmentFiles = [];
|
116
|
+
if (await hasOwnAttachmentFolder(app, oldPath)) {
|
117
|
+
Vault.recurseChildren(oldAttachmentFolder, (oldAttachmentFile) => {
|
118
|
+
if (isFile(oldAttachmentFile)) {
|
119
|
+
oldAttachmentFiles.push(oldAttachmentFile);
|
120
|
+
}
|
121
|
+
});
|
122
|
+
} else {
|
123
|
+
for (const oldPathLink of oldPathLinks) {
|
124
|
+
const oldAttachmentFile = extractLinkFile(app, oldPathLink, oldPath);
|
125
|
+
if (!oldAttachmentFile) {
|
126
|
+
continue;
|
127
|
+
}
|
128
|
+
if (oldAttachmentFile.path.startsWith(oldAttachmentFolderPath)) {
|
129
|
+
const oldAttachmentBacklinks = await getBacklinksForFileSafe(app, oldAttachmentFile);
|
130
|
+
if (oldAttachmentBacklinks.keys().length === 1) {
|
131
|
+
oldAttachmentFiles.push(oldAttachmentFile);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
const oldBasename = basename(oldPath, extname(oldPath));
|
137
|
+
const newBasename = basename(newPath, extname(newPath));
|
138
|
+
for (const oldAttachmentFile of oldAttachmentFiles) {
|
139
|
+
if (isNote(app, oldAttachmentFile)) {
|
140
|
+
continue;
|
141
|
+
}
|
142
|
+
const relativePath = relative(oldAttachmentFolderPath, oldAttachmentFile.path);
|
143
|
+
const newDir = join(newAttachmentFolderPath, dirname(relativePath));
|
144
|
+
const newChildBasename = settings.shouldRenameAttachmentFiles ? replaceAll(oldAttachmentFile.basename, oldBasename, newBasename) : oldAttachmentFile.basename;
|
145
|
+
let newChildPath = join(newDir, makeFileName(newChildBasename, oldAttachmentFile.extension));
|
146
|
+
if (oldAttachmentFile.path === newChildPath) {
|
147
|
+
continue;
|
148
|
+
}
|
149
|
+
if (settings.shouldDeleteConflictingAttachments) {
|
150
|
+
const newChildFile = getFileOrNull(app, newChildPath);
|
151
|
+
if (newChildFile) {
|
152
|
+
await app.fileManager.trashFile(newChildFile);
|
153
|
+
}
|
154
|
+
} else {
|
155
|
+
newChildPath = app.vault.getAvailablePath(join(newDir, newChildBasename), oldAttachmentFile.extension);
|
156
|
+
}
|
157
|
+
renameMap.set(oldAttachmentFile.path, newChildPath);
|
158
|
+
}
|
159
|
+
}
|
160
|
+
function getRenameDeleteHandlersMap(app) {
|
161
|
+
return getObsidianDevUtilsState(app, "renameDeleteHandlersMap", /* @__PURE__ */ new Map()).value;
|
162
|
+
}
|
163
|
+
function getSettings(app) {
|
164
|
+
const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
|
165
|
+
const settingsBuilders = Array.from(renameDeleteHandlersMap.values()).reverse();
|
166
|
+
const settings = {};
|
167
|
+
for (const settingsBuilder of settingsBuilders) {
|
168
|
+
const newSettings = settingsBuilder();
|
169
|
+
settings.shouldDeleteConflictingAttachments ||= newSettings.shouldDeleteConflictingAttachments ?? false;
|
170
|
+
settings.shouldDeleteEmptyFolders ||= newSettings.shouldDeleteEmptyFolders ?? false;
|
171
|
+
settings.shouldHandleDeletions ||= newSettings.shouldHandleDeletions ?? false;
|
172
|
+
settings.shouldHandleRenames ||= newSettings.shouldHandleRenames ?? false;
|
173
|
+
settings.shouldRenameAttachmentFiles ||= newSettings.shouldRenameAttachmentFiles ?? false;
|
174
|
+
settings.shouldRenameAttachmentFolder ||= newSettings.shouldRenameAttachmentFolder ?? false;
|
175
|
+
settings.shouldUpdateFilenameAliases ||= newSettings.shouldUpdateFilenameAliases ?? false;
|
176
|
+
const isPathIgnored = settings.isPathIgnored;
|
177
|
+
settings.isPathIgnored = (path) => isPathIgnored?.(path) ?? newSettings.isPathIgnored?.(path) ?? false;
|
178
|
+
}
|
179
|
+
return settings;
|
180
|
+
}
|
181
|
+
async function handleCaseCollision(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
|
182
|
+
if (!app.vault.adapter.insensitive || oldPath.toLowerCase() !== newPath.toLowerCase()) {
|
183
|
+
return false;
|
184
|
+
}
|
185
|
+
const tempPath = join(dirname(newPath), `__temp__${basename(newPath)}`);
|
186
|
+
await renameHandled(app, newPath, tempPath);
|
187
|
+
await handleRenameAsync(app, oldPath, tempPath, oldPathBacklinksMap, oldPathLinks);
|
188
|
+
await app.vault.rename(getFile(app, tempPath), newPath);
|
189
|
+
return true;
|
190
|
+
}
|
191
|
+
async function handleDelete(app, path) {
|
192
|
+
getLibDebugger("RenameDeleteHandler:handleDelete")(`Handle Delete ${path}`);
|
193
|
+
if (!isNote(app, path)) {
|
194
|
+
return;
|
195
|
+
}
|
196
|
+
const settings = getSettings(app);
|
197
|
+
if (!settings.shouldHandleDeletions) {
|
198
|
+
return;
|
199
|
+
}
|
200
|
+
if (settings.isPathIgnored?.(path)) {
|
201
|
+
return;
|
202
|
+
}
|
203
|
+
const cache = deletedMetadataCacheMap.get(path);
|
204
|
+
deletedMetadataCacheMap.delete(path);
|
205
|
+
if (cache) {
|
206
|
+
const links = getAllLinks(cache);
|
207
|
+
for (const link of links) {
|
208
|
+
const attachmentFile = extractLinkFile(app, link, path);
|
209
|
+
if (!attachmentFile) {
|
210
|
+
continue;
|
211
|
+
}
|
212
|
+
if (isNote(app, attachmentFile)) {
|
213
|
+
continue;
|
214
|
+
}
|
215
|
+
await deleteSafe(app, attachmentFile, path, settings.shouldDeleteEmptyFolders);
|
216
|
+
}
|
217
|
+
}
|
218
|
+
const attachmentFolderPath = await getAttachmentFolderPath(app, path);
|
219
|
+
const attachmentFolder = getFolderOrNull(app, attachmentFolderPath);
|
220
|
+
if (!attachmentFolder) {
|
221
|
+
return;
|
222
|
+
}
|
223
|
+
if (!await hasOwnAttachmentFolder(app, path)) {
|
224
|
+
return;
|
225
|
+
}
|
226
|
+
await deleteSafe(app, attachmentFolder, path, false, settings.shouldDeleteEmptyFolders);
|
227
|
+
}
|
228
|
+
function handleDeleteIfEnabled(plugin, file) {
|
229
|
+
const app = plugin.app;
|
230
|
+
if (!shouldInvokeHandler(plugin)) {
|
231
|
+
return;
|
232
|
+
}
|
233
|
+
const path = file.path;
|
234
|
+
addToQueue(app, () => handleDelete(app, path));
|
235
|
+
}
|
236
|
+
function handleMetadataDeleted(app, file, prevCache) {
|
237
|
+
const settings = getSettings(app);
|
238
|
+
if (settings.isPathIgnored?.(file.path)) {
|
239
|
+
return;
|
240
|
+
}
|
241
|
+
if (!settings.shouldHandleDeletions) {
|
242
|
+
return;
|
243
|
+
}
|
244
|
+
if (isMarkdownFile(app, file) && prevCache) {
|
245
|
+
deletedMetadataCacheMap.set(file.path, prevCache);
|
246
|
+
}
|
247
|
+
}
|
248
|
+
function handleMetadataDeletedIfEnabled(plugin, file, prevCache) {
|
249
|
+
if (!shouldInvokeHandler(plugin)) {
|
250
|
+
return;
|
251
|
+
}
|
252
|
+
handleMetadataDeleted(plugin.app, file, prevCache);
|
253
|
+
}
|
254
|
+
function handleRename(app, oldPath, newPath) {
|
255
|
+
const key = makeKey(oldPath, newPath);
|
256
|
+
getLibDebugger("RenameDeleteHandler:handleRename")(`Handle Rename ${key}`);
|
257
|
+
if (handledRenames.has(key)) {
|
258
|
+
handledRenames.delete(key);
|
259
|
+
return;
|
260
|
+
}
|
261
|
+
const settings = getSettings(app);
|
262
|
+
if (!settings.shouldHandleRenames || settings.isPathIgnored?.(oldPath) || settings.isPathIgnored?.(newPath)) {
|
263
|
+
return;
|
264
|
+
}
|
265
|
+
const cache = app.metadataCache.getCache(oldPath) ?? app.metadataCache.getCache(newPath);
|
266
|
+
const oldPathLinks = cache ? getAllLinks(cache) : [];
|
267
|
+
const oldPathBacklinksMap = getBacklinksForFileOrPath(app, oldPath).data;
|
268
|
+
addToQueue(app, () => handleRenameAsync(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks));
|
269
|
+
}
|
270
|
+
async function handleRenameAsync(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks, interruptedCombinedBacklinksMap) {
|
271
|
+
await continueInterruptedRenames(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks);
|
272
|
+
refreshLinks(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks);
|
273
|
+
if (await handleCaseCollision(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks)) {
|
274
|
+
return;
|
275
|
+
}
|
276
|
+
const restoreUpdateAllLinks = around(app.fileManager, {
|
277
|
+
updateAllLinks: () => noopAsync
|
278
|
+
});
|
279
|
+
try {
|
280
|
+
const renameMap = /* @__PURE__ */ new Map();
|
281
|
+
await fillRenameMap(app, oldPath, newPath, renameMap, oldPathLinks);
|
282
|
+
const combinedBacklinksMap = /* @__PURE__ */ new Map();
|
283
|
+
initBacklinksMap(oldPathBacklinksMap, renameMap, combinedBacklinksMap, oldPath);
|
284
|
+
for (const attachmentOldPath of renameMap.keys()) {
|
285
|
+
if (attachmentOldPath === oldPath) {
|
286
|
+
continue;
|
287
|
+
}
|
288
|
+
const attachmentOldPathBacklinksMap = (await getBacklinksForFileSafe(app, attachmentOldPath)).data;
|
289
|
+
initBacklinksMap(attachmentOldPathBacklinksMap, renameMap, combinedBacklinksMap, attachmentOldPath);
|
290
|
+
}
|
291
|
+
const parentFolders = /* @__PURE__ */ new Set();
|
292
|
+
for (const [oldAttachmentPath, newAttachmentPath] of renameMap.entries()) {
|
293
|
+
if (oldAttachmentPath === oldPath) {
|
294
|
+
continue;
|
295
|
+
}
|
296
|
+
const fixedNewAttachmentPath = await renameHandled(app, oldAttachmentPath, newAttachmentPath);
|
297
|
+
renameMap.set(oldAttachmentPath, fixedNewAttachmentPath);
|
298
|
+
parentFolders.add(dirname(oldAttachmentPath));
|
299
|
+
}
|
300
|
+
const settings = getSettings(app);
|
301
|
+
if (settings.shouldDeleteEmptyFolders) {
|
302
|
+
for (const parentFolder of parentFolders) {
|
303
|
+
await deleteEmptyFolderHierarchy(app, parentFolder);
|
304
|
+
}
|
305
|
+
}
|
306
|
+
for (const [newBacklinkPath, linkJsonToPathMap] of Array.from(combinedBacklinksMap.entries()).concat(
|
307
|
+
Array.from(interruptedCombinedBacklinksMap?.entries() ?? [])
|
308
|
+
)) {
|
309
|
+
await editLinks(app, newBacklinkPath, (link) => {
|
310
|
+
const oldAttachmentPath = linkJsonToPathMap.get(toJson(link));
|
311
|
+
if (!oldAttachmentPath) {
|
312
|
+
return;
|
313
|
+
}
|
314
|
+
const newAttachmentPath = renameMap.get(oldAttachmentPath);
|
315
|
+
if (!newAttachmentPath) {
|
316
|
+
return;
|
317
|
+
}
|
318
|
+
return updateLink(normalizeOptionalProperties({
|
319
|
+
app,
|
320
|
+
link,
|
321
|
+
newSourcePathOrFile: newBacklinkPath,
|
322
|
+
newTargetPathOrFile: newAttachmentPath,
|
323
|
+
oldTargetPathOrFile: oldAttachmentPath,
|
324
|
+
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
325
|
+
}));
|
326
|
+
}, {
|
327
|
+
shouldFailOnMissingFile: false
|
328
|
+
});
|
329
|
+
}
|
330
|
+
if (isNote(app, newPath)) {
|
331
|
+
await updateLinksInFile(normalizeOptionalProperties({
|
332
|
+
app,
|
333
|
+
newSourcePathOrFile: newPath,
|
334
|
+
oldSourcePathOrFile: oldPath,
|
335
|
+
shouldFailOnMissingFile: false,
|
336
|
+
shouldUpdateFilenameAlias: settings.shouldUpdateFilenameAliases
|
337
|
+
}));
|
338
|
+
}
|
339
|
+
if (!getFileOrNull(app, newPath)) {
|
340
|
+
let interruptedRenames = interruptedRenamesMap.get(newPath);
|
341
|
+
if (!interruptedRenames) {
|
342
|
+
interruptedRenames = [];
|
343
|
+
interruptedRenamesMap.set(newPath, interruptedRenames);
|
344
|
+
}
|
345
|
+
interruptedRenames.push({
|
346
|
+
combinedBacklinksMap,
|
347
|
+
oldPath
|
348
|
+
});
|
349
|
+
}
|
350
|
+
} finally {
|
351
|
+
restoreUpdateAllLinks();
|
352
|
+
const orphanKeys = Array.from(handledRenames);
|
353
|
+
addToQueue(app, () => {
|
354
|
+
for (const key of orphanKeys) {
|
355
|
+
handledRenames.delete(key);
|
356
|
+
}
|
357
|
+
});
|
358
|
+
}
|
359
|
+
}
|
360
|
+
function handleRenameIfEnabled(plugin, file, oldPath) {
|
361
|
+
if (!shouldInvokeHandler(plugin)) {
|
362
|
+
return;
|
363
|
+
}
|
364
|
+
if (!isFile(file)) {
|
365
|
+
return;
|
366
|
+
}
|
367
|
+
const newPath = file.path;
|
368
|
+
handleRename(plugin.app, oldPath, newPath);
|
369
|
+
}
|
370
|
+
function initBacklinksMap(singleBacklinksMap, renameMap, combinedBacklinksMap, path) {
|
371
|
+
for (const [backlinkPath, links] of singleBacklinksMap.entries()) {
|
372
|
+
const newBacklinkPath = renameMap.get(backlinkPath) ?? backlinkPath;
|
373
|
+
const linkJsonToPathMap = combinedBacklinksMap.get(newBacklinkPath) ?? /* @__PURE__ */ new Map();
|
374
|
+
combinedBacklinksMap.set(newBacklinkPath, linkJsonToPathMap);
|
375
|
+
for (const link of links) {
|
376
|
+
linkJsonToPathMap.set(toJson(link), path);
|
377
|
+
}
|
378
|
+
}
|
379
|
+
}
|
380
|
+
function logRegisteredHandlers(app) {
|
381
|
+
const renameDeleteHandlersMap = getRenameDeleteHandlersMap(app);
|
382
|
+
getLibDebugger("RenameDeleteHandler:logRegisteredHandlers")(
|
383
|
+
`Plugins with registered rename/delete handlers: ${JSON.stringify(Array.from(renameDeleteHandlersMap.keys()))}`
|
384
|
+
);
|
385
|
+
}
|
386
|
+
function makeKey(oldPath, newPath) {
|
387
|
+
return `${oldPath} -> ${newPath}`;
|
388
|
+
}
|
389
|
+
function refreshLinks(app, oldPath, newPath, oldPathBacklinksMap, oldPathLinks) {
|
390
|
+
const cache = app.metadataCache.getCache(oldPath) ?? app.metadataCache.getCache(newPath);
|
391
|
+
const oldPathLinksRefreshed = cache ? getAllLinks(cache) : [];
|
392
|
+
const oldPathBacklinksMapRefreshed = getBacklinksForFileOrPath(app, oldPath).data;
|
393
|
+
for (const link of oldPathLinksRefreshed) {
|
394
|
+
if (oldPathLinks.includes(link)) {
|
395
|
+
continue;
|
396
|
+
}
|
397
|
+
oldPathLinks.push(link);
|
398
|
+
}
|
399
|
+
for (const [backlinkPath, refreshedLinks] of oldPathBacklinksMapRefreshed.entries()) {
|
400
|
+
let oldLinks = oldPathBacklinksMap.get(backlinkPath);
|
401
|
+
if (!oldLinks) {
|
402
|
+
oldLinks = [];
|
403
|
+
oldPathBacklinksMap.set(backlinkPath, oldLinks);
|
404
|
+
}
|
405
|
+
for (const link of refreshedLinks) {
|
406
|
+
if (oldLinks.includes(link)) {
|
407
|
+
continue;
|
408
|
+
}
|
409
|
+
oldLinks.push(link);
|
410
|
+
}
|
411
|
+
}
|
412
|
+
}
|
413
|
+
async function renameHandled(app, oldPath, newPath) {
|
414
|
+
newPath = getSafeRenamePath(app, oldPath, newPath);
|
415
|
+
if (oldPath === newPath) {
|
416
|
+
return newPath;
|
417
|
+
}
|
418
|
+
const key = makeKey(oldPath, newPath);
|
419
|
+
handledRenames.add(key);
|
420
|
+
newPath = await renameSafe(app, oldPath, newPath);
|
421
|
+
return newPath;
|
422
|
+
}
|
423
|
+
function shouldInvokeHandler(plugin) {
|
424
|
+
const app = plugin.app;
|
425
|
+
const pluginId = plugin.manifest.id;
|
426
|
+
const renameDeleteHandlerPluginIds = getRenameDeleteHandlersMap(app);
|
427
|
+
const mainPluginId = Array.from(renameDeleteHandlerPluginIds.keys())[0];
|
428
|
+
if (mainPluginId !== pluginId) {
|
429
|
+
return false;
|
430
|
+
}
|
431
|
+
return true;
|
432
|
+
}
|
433
|
+
export {
|
434
|
+
registerRenameDeleteHandlers
|
435
|
+
};
|
436
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1JlbmFtZURlbGV0ZUhhbmRsZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uIFJlbmFtZURlbGV0ZUhhbmRsZXJcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBoYW5kbGluZyByZW5hbWUgYW5kIGRlbGV0ZSBldmVudHMgaW4gT2JzaWRpYW4uXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDYWNoZWRNZXRhZGF0YSxcbiAgUGx1Z2luLFxuICBSZWZlcmVuY2UsXG4gIFRBYnN0cmFjdEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBhcm91bmQgfSBmcm9tICdtb25rZXktYXJvdW5kJztcbmltcG9ydCB7XG4gIEFwcCxcbiAgVEZpbGUsXG4gIFZhdWx0XG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBVcGRhdGVMaW5rT3B0aW9ucyxcbiAgVXBkYXRlTGlua3NJbkZpbGVPcHRpb25zXG59IGZyb20gJy4vTGluay50cyc7XG5cbmltcG9ydCB7IGdldExpYkRlYnVnZ2VyIH0gZnJvbSAnLi4vRGVidWcudHMnO1xuaW1wb3J0IHsgbm9vcEFzeW5jIH0gZnJvbSAnLi4vRnVuY3Rpb24udHMnO1xuaW1wb3J0IHtcbiAgbm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzLFxuICB0b0pzb25cbn0gZnJvbSAnLi4vT2JqZWN0LnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICBtYWtlRmlsZU5hbWUsXG4gIHJlbGF0aXZlXG59IGZyb20gJy4uL1BhdGgudHMnO1xuaW1wb3J0IHsgcmVwbGFjZUFsbCB9IGZyb20gJy4uL1N0cmluZy50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL0FwcC50cyc7XG5pbXBvcnQge1xuICBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aCxcbiAgaGFzT3duQXR0YWNobWVudEZvbGRlclxufSBmcm9tICcuL0F0dGFjaG1lbnRQYXRoLnRzJztcbmltcG9ydCB7XG4gIGdldEZpbGUsXG4gIGdldEZpbGVPck51bGwsXG4gIGdldEZvbGRlck9yTnVsbCxcbiAgaXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgaXNOb3RlXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5pbXBvcnQge1xuICBlZGl0TGlua3MsXG4gIGV4dHJhY3RMaW5rRmlsZSxcbiAgdXBkYXRlTGluayxcbiAgdXBkYXRlTGlua3NJbkZpbGVcbn0gZnJvbSAnLi9MaW5rLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZVxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHsgYWRkVG9RdWV1ZSB9IGZyb20gJy4vUXVldWUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0U2FmZVJlbmFtZVBhdGgsXG4gIHJlbmFtZVNhZmVcbn0gZnJvbSAnLi9WYXVsdC50cyc7XG5pbXBvcnQge1xuICBkZWxldGVFbXB0eUZvbGRlckhpZXJhcmNoeSxcbiAgZGVsZXRlU2FmZVxufSBmcm9tICcuL1ZhdWx0RXgudHMnO1xuXG5jb25zdCBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcCA9IG5ldyBNYXA8c3RyaW5nLCBDYWNoZWRNZXRhZGF0YT4oKTtcbmNvbnN0IGhhbmRsZWRSZW5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5jb25zdCBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgSW50ZXJydXB0ZWRSZW5hbWVbXT4oKTtcblxuLyoqXG4gKiBTZXR0aW5ncyBmb3IgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3Mge1xuICAvKipcbiAgICogV2hldGhlciB0byBpZ25vcmUgdGhlIHBhdGguXG4gICAqL1xuICBpc1BhdGhJZ25vcmVkKHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgc2hvdWxkRGVsZXRlQ29uZmxpY3RpbmdBdHRhY2htZW50czogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgZW1wdHkgZm9sZGVycy5cbiAgICovXG4gIHNob3VsZERlbGV0ZUVtcHR5Rm9sZGVyczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBoYW5kbGUgZGVsZXRpb25zLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlRGVsZXRpb25zOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGhhbmRsZSByZW5hbWVzLlxuICAgKi9cbiAgc2hvdWxkSGFuZGxlUmVuYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZW5hbWUgYXR0YWNobWVudCBmaWxlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHJlbmFtZSBhdHRhY2htZW50IGZvbGRlciB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlcjogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byB1cGRhdGUgZmlsZW5hbWUgYWxpYXNlcyB3aGVuIGEgbm90ZSBpcyByZW5hbWVkLlxuICAgKi9cbiAgc2hvdWxkVXBkYXRlRmlsZW5hbWVBbGlhc2VzOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSW50ZXJydXB0ZWRSZW5hbWUge1xuICBjb21iaW5lZEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj47XG4gIG9sZFBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIHJlbmFtZS9kZWxldGUgaGFuZGxlcnMuXG4gKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBzZXR0aW5nc0J1aWxkZXIgLSBBIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2V0dGluZ3MgZm9yIHRoZSByZW5hbWUgZGVsZXRlIGhhbmRsZXIuXG4gKiBAcmV0dXJucyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclJlbmFtZURlbGV0ZUhhbmRsZXJzKHBsdWdpbjogUGx1Z2luLCBzZXR0aW5nc0J1aWxkZXI6ICgpID0+IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPik6IHZvaWQge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKHBsdWdpbi5hcHApO1xuICBjb25zdCBwbHVnaW5JZCA9IHBsdWdpbi5tYW5pZmVzdC5pZDtcblxuICByZW5hbWVEZWxldGVIYW5kbGVyc01hcC5zZXQocGx1Z2luSWQsIHNldHRpbmdzQnVpbGRlcik7XG4gIGxvZ1JlZ2lzdGVyZWRIYW5kbGVycyhwbHVnaW4uYXBwKTtcblxuICBwbHVnaW4ucmVnaXN0ZXIoKCkgPT4ge1xuICAgIHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmRlbGV0ZShwbHVnaW5JZCk7XG4gICAgbG9nUmVnaXN0ZXJlZEhhbmRsZXJzKHBsdWdpbi5hcHApO1xuICB9KTtcblxuICBjb25zdCBhcHAgPSBwbHVnaW4uYXBwO1xuICBwbHVnaW4ucmVnaXN0ZXJFdmVudChcbiAgICBhcHAudmF1bHQub24oJ2RlbGV0ZScsIChmaWxlKSA9PiB7XG4gICAgICBoYW5kbGVEZWxldGVJZkVuYWJsZWQocGx1Z2luLCBmaWxlKTtcbiAgICB9KVxuICApO1xuXG4gIHBsdWdpbi5yZWdpc3RlckV2ZW50KFxuICAgIGFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpID0+IHtcbiAgICAgIGhhbmRsZVJlbmFtZUlmRW5hYmxlZChwbHVnaW4sIGZpbGUsIG9sZFBhdGgpO1xuICAgIH0pXG4gICk7XG5cbiAgcGx1Z2luLnJlZ2lzdGVyRXZlbnQoXG4gICAgYXBwLm1ldGFkYXRhQ2FjaGUub24oJ2RlbGV0ZWQnLCAoZmlsZSwgcHJldkNhY2hlKSA9PiB7XG4gICAgICBoYW5kbGVNZXRhZGF0YURlbGV0ZWRJZkVuYWJsZWQocGx1Z2luLCBmaWxlLCBwcmV2Q2FjaGUpO1xuICAgIH0pXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnRpbnVlSW50ZXJydXB0ZWRSZW5hbWVzKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQob2xkUGF0aCk7XG4gIGlmIChpbnRlcnJ1cHRlZFJlbmFtZXMpIHtcbiAgICBpbnRlcnJ1cHRlZFJlbmFtZXNNYXAuZGVsZXRlKG9sZFBhdGgpO1xuICAgIGZvciAoY29uc3QgaW50ZXJydXB0ZWRSZW5hbWUgb2YgaW50ZXJydXB0ZWRSZW5hbWVzKSB7XG4gICAgICBhd2FpdCBoYW5kbGVSZW5hbWVBc3luYyhhcHAsIGludGVycnVwdGVkUmVuYW1lLm9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcywgaW50ZXJydXB0ZWRSZW5hbWUuY29tYmluZWRCYWNrbGlua3NNYXApO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBmaWxsUmVuYW1lTWFwKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZywgcmVuYW1lTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmc+LCBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJlbmFtZU1hcC5zZXQob2xkUGF0aCwgbmV3UGF0aCk7XG5cbiAgaWYgKCFpc05vdGUoYXBwLCBvbGRQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNldHRpbmdzID0gZ2V0U2V0dGluZ3MoYXBwKTtcblxuICBjb25zdCBvbGRBdHRhY2htZW50Rm9sZGVyUGF0aCA9IGF3YWl0IGdldEF0dGFjaG1lbnRGb2xkZXJQYXRoKGFwcCwgb2xkUGF0aCk7XG4gIGNvbnN0IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoID0gc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlclxuICAgID8gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBuZXdQYXRoKVxuICAgIDogb2xkQXR0YWNobWVudEZvbGRlclBhdGg7XG5cbiAgY29uc3Qgb2xkQXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIG9sZEF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIW9sZEF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAob2xkQXR0YWNobWVudEZvbGRlclBhdGggPT09IG5ld0F0dGFjaG1lbnRGb2xkZXJQYXRoICYmICFzZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvbGRBdHRhY2htZW50RmlsZXM6IFRGaWxlW10gPSBbXTtcblxuICBpZiAoYXdhaXQgaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHAsIG9sZFBhdGgpKSB7XG4gICAgVmF1bHQucmVjdXJzZUNoaWxkcmVuKG9sZEF0dGFjaG1lbnRGb2xkZXIsIChvbGRBdHRhY2htZW50RmlsZSkgPT4ge1xuICAgICAgaWYgKGlzRmlsZShvbGRBdHRhY2htZW50RmlsZSkpIHtcbiAgICAgICAgb2xkQXR0YWNobWVudEZpbGVzLnB1c2gob2xkQXR0YWNobWVudEZpbGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGZvciAoY29uc3Qgb2xkUGF0aExpbmsgb2Ygb2xkUGF0aExpbmtzKSB7XG4gICAgICBjb25zdCBvbGRBdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShhcHAsIG9sZFBhdGhMaW5rLCBvbGRQYXRoKTtcbiAgICAgIGlmICghb2xkQXR0YWNobWVudEZpbGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRBdHRhY2htZW50RmlsZS5wYXRoLnN0YXJ0c1dpdGgob2xkQXR0YWNobWVudEZvbGRlclBhdGgpKSB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRCYWNrbGlua3MgPSBhd2FpdCBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZShhcHAsIG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgaWYgKG9sZEF0dGFjaG1lbnRCYWNrbGlua3Mua2V5cygpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG9sZEF0dGFjaG1lbnRGaWxlcy5wdXNoKG9sZEF0dGFjaG1lbnRGaWxlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG9sZEJhc2VuYW1lID0gYmFzZW5hbWUob2xkUGF0aCwgZXh0bmFtZShvbGRQYXRoKSk7XG4gIGNvbnN0IG5ld0Jhc2VuYW1lID0gYmFzZW5hbWUobmV3UGF0aCwgZXh0bmFtZShuZXdQYXRoKSk7XG5cbiAgZm9yIChjb25zdCBvbGRBdHRhY2htZW50RmlsZSBvZiBvbGRBdHRhY2htZW50RmlsZXMpIHtcbiAgICBpZiAoaXNOb3RlKGFwcCwgb2xkQXR0YWNobWVudEZpbGUpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUob2xkQXR0YWNobWVudEZvbGRlclBhdGgsIG9sZEF0dGFjaG1lbnRGaWxlLnBhdGgpO1xuICAgIGNvbnN0IG5ld0RpciA9IGpvaW4obmV3QXR0YWNobWVudEZvbGRlclBhdGgsIGRpcm5hbWUocmVsYXRpdmVQYXRoKSk7XG4gICAgY29uc3QgbmV3Q2hpbGRCYXNlbmFtZSA9IHNldHRpbmdzLnNob3VsZFJlbmFtZUF0dGFjaG1lbnRGaWxlc1xuICAgICAgPyByZXBsYWNlQWxsKG9sZEF0dGFjaG1lbnRGaWxlLmJhc2VuYW1lLCBvbGRCYXNlbmFtZSwgbmV3QmFzZW5hbWUpXG4gICAgICA6IG9sZEF0dGFjaG1lbnRGaWxlLmJhc2VuYW1lO1xuICAgIGxldCBuZXdDaGlsZFBhdGggPSBqb2luKG5ld0RpciwgbWFrZUZpbGVOYW1lKG5ld0NoaWxkQmFzZW5hbWUsIG9sZEF0dGFjaG1lbnRGaWxlLmV4dGVuc2lvbikpO1xuXG4gICAgaWYgKG9sZEF0dGFjaG1lbnRGaWxlLnBhdGggPT09IG5ld0NoaWxkUGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHNldHRpbmdzLnNob3VsZERlbGV0ZUNvbmZsaWN0aW5nQXR0YWNobWVudHMpIHtcbiAgICAgIGNvbnN0IG5ld0NoaWxkRmlsZSA9IGdldEZpbGVPck51bGwoYXBwLCBuZXdDaGlsZFBhdGgpO1xuICAgICAgaWYgKG5ld0NoaWxkRmlsZSkge1xuICAgICAgICBhd2FpdCBhcHAuZmlsZU1hbmFnZXIudHJhc2hGaWxlKG5ld0NoaWxkRmlsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0NoaWxkUGF0aCA9IGFwcC52YXVsdC5nZXRBdmFpbGFibGVQYXRoKGpvaW4obmV3RGlyLCBuZXdDaGlsZEJhc2VuYW1lKSwgb2xkQXR0YWNobWVudEZpbGUuZXh0ZW5zaW9uKTtcbiAgICB9XG4gICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50RmlsZS5wYXRoLCBuZXdDaGlsZFBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcDogQXBwKTogTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PiB7XG4gIHJldHVybiBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUoYXBwLCAncmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAnLCBuZXcgTWFwPHN0cmluZywgKCkgPT4gUGFydGlhbDxSZW5hbWVEZWxldGVIYW5kbGVyU2V0dGluZ3M+PigpKS52YWx1ZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2V0dGluZ3MoYXBwOiBBcHApOiBQYXJ0aWFsPFJlbmFtZURlbGV0ZUhhbmRsZXJTZXR0aW5ncz4ge1xuICBjb25zdCByZW5hbWVEZWxldGVIYW5kbGVyc01hcCA9IGdldFJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwKGFwcCk7XG4gIGNvbnN0IHNldHRpbmdzQnVpbGRlcnMgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLnZhbHVlcygpKS5yZXZlcnNlKCk7XG5cbiAgY29uc3Qgc2V0dGluZ3M6IFBhcnRpYWw8UmVuYW1lRGVsZXRlSGFuZGxlclNldHRpbmdzPiA9IHt9O1xuICBmb3IgKGNvbnN0IHNldHRpbmdzQnVpbGRlciBvZiBzZXR0aW5nc0J1aWxkZXJzKSB7XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSBzZXR0aW5nc0J1aWxkZXIoKTtcbiAgICBzZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGREZWxldGVDb25mbGljdGluZ0F0dGFjaG1lbnRzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZERlbGV0ZUVtcHR5Rm9sZGVycyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkRGVsZXRlRW1wdHlGb2xkZXJzID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZURlbGV0aW9ucyB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zID8/IGZhbHNlO1xuICAgIHNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZpbGVzIHx8PSBuZXdTZXR0aW5ncy5zaG91bGRSZW5hbWVBdHRhY2htZW50RmlsZXMgPz8gZmFsc2U7XG4gICAgc2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciB8fD0gbmV3U2V0dGluZ3Muc2hvdWxkUmVuYW1lQXR0YWNobWVudEZvbGRlciA/PyBmYWxzZTtcbiAgICBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXMgfHw9IG5ld1NldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlcyA/PyBmYWxzZTtcbiAgICBjb25zdCBpc1BhdGhJZ25vcmVkID0gc2V0dGluZ3MuaXNQYXRoSWdub3JlZDtcbiAgICBzZXR0aW5ncy5pc1BhdGhJZ25vcmVkID0gKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4gPT4gaXNQYXRoSWdub3JlZD8uKHBhdGgpID8/IG5ld1NldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSA/PyBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBzZXR0aW5ncztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQ2FzZUNvbGxpc2lvbihcbiAgYXBwOiBBcHAsXG4gIG9sZFBhdGg6IHN0cmluZyxcbiAgbmV3UGF0aDogc3RyaW5nLFxuICBvbGRQYXRoQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBSZWZlcmVuY2VbXT4sXG4gIG9sZFBhdGhMaW5rczogUmVmZXJlbmNlW11cbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoIWFwcC52YXVsdC5hZGFwdGVyLmluc2Vuc2l0aXZlIHx8IG9sZFBhdGgudG9Mb3dlckNhc2UoKSAhPT0gbmV3UGF0aC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdGVtcFBhdGggPSBqb2luKGRpcm5hbWUobmV3UGF0aCksIGBfX3RlbXBfXyR7YmFzZW5hbWUobmV3UGF0aCl9YCk7XG4gIGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBuZXdQYXRoLCB0ZW1wUGF0aCk7XG4gIGF3YWl0IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgdGVtcFBhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcyk7XG4gIGF3YWl0IGFwcC52YXVsdC5yZW5hbWUoZ2V0RmlsZShhcHAsIHRlbXBQYXRoKSwgbmV3UGF0aCk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVEZWxldGUoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVEZWxldGUnKShgSGFuZGxlIERlbGV0ZSAke3BhdGh9YCk7XG4gIGlmICghaXNOb3RlKGFwcCwgcGF0aCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihwYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gZGVsZXRlZE1ldGFkYXRhQ2FjaGVNYXAuZ2V0KHBhdGgpO1xuICBkZWxldGVkTWV0YWRhdGFDYWNoZU1hcC5kZWxldGUocGF0aCk7XG4gIGlmIChjYWNoZSkge1xuICAgIGNvbnN0IGxpbmtzID0gZ2V0QWxsTGlua3MoY2FjaGUpO1xuXG4gICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSB7XG4gICAgICBjb25zdCBhdHRhY2htZW50RmlsZSA9IGV4dHJhY3RMaW5rRmlsZShhcHAsIGxpbmssIHBhdGgpO1xuICAgICAgaWYgKCFhdHRhY2htZW50RmlsZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzTm90ZShhcHAsIGF0dGFjaG1lbnRGaWxlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGaWxlLCBwYXRoLCBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBwYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlciA9IGdldEZvbGRlck9yTnVsbChhcHAsIGF0dGFjaG1lbnRGb2xkZXJQYXRoKTtcblxuICBpZiAoIWF0dGFjaG1lbnRGb2xkZXIpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIShhd2FpdCBoYXNPd25BdHRhY2htZW50Rm9sZGVyKGFwcCwgcGF0aCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgZGVsZXRlU2FmZShhcHAsIGF0dGFjaG1lbnRGb2xkZXIsIHBhdGgsIGZhbHNlLCBzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpO1xufVxuXG5mdW5jdGlvbiBoYW5kbGVEZWxldGVJZkVuYWJsZWQocGx1Z2luOiBQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUpOiB2b2lkIHtcbiAgY29uc3QgYXBwID0gcGx1Z2luLmFwcDtcbiAgaWYgKCFzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcGF0aCA9IGZpbGUucGF0aDtcbiAgYWRkVG9RdWV1ZShhcHAsICgpID0+IGhhbmRsZURlbGV0ZShhcHAsIHBhdGgpKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlTWV0YWRhdGFEZWxldGVkKGFwcDogQXBwLCBmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICBjb25zdCBzZXR0aW5ncyA9IGdldFNldHRpbmdzKGFwcCk7XG4gIGlmIChzZXR0aW5ncy5pc1BhdGhJZ25vcmVkPy4oZmlsZS5wYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghc2V0dGluZ3Muc2hvdWxkSGFuZGxlRGVsZXRpb25zKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc01hcmtkb3duRmlsZShhcHAsIGZpbGUpICYmIHByZXZDYWNoZSkge1xuICAgIGRlbGV0ZWRNZXRhZGF0YUNhY2hlTWFwLnNldChmaWxlLnBhdGgsIHByZXZDYWNoZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaGFuZGxlTWV0YWRhdGFEZWxldGVkSWZFbmFibGVkKHBsdWdpbjogUGx1Z2luLCBmaWxlOiBUQWJzdHJhY3RGaWxlLCBwcmV2Q2FjaGU6IENhY2hlZE1ldGFkYXRhIHwgbnVsbCk6IHZvaWQge1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBoYW5kbGVNZXRhZGF0YURlbGV0ZWQocGx1Z2luLmFwcCwgZmlsZSwgcHJldkNhY2hlKTtcbn1cblxuZnVuY3Rpb24gaGFuZGxlUmVuYW1lKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBrZXkgPSBtYWtlS2V5KG9sZFBhdGgsIG5ld1BhdGgpO1xuICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpoYW5kbGVSZW5hbWUnKShgSGFuZGxlIFJlbmFtZSAke2tleX1gKTtcbiAgaWYgKGhhbmRsZWRSZW5hbWVzLmhhcyhrZXkpKSB7XG4gICAgaGFuZGxlZFJlbmFtZXMuZGVsZXRlKGtleSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICBpZiAoIXNldHRpbmdzLnNob3VsZEhhbmRsZVJlbmFtZXMgfHwgc2V0dGluZ3MuaXNQYXRoSWdub3JlZD8uKG9sZFBhdGgpIHx8IHNldHRpbmdzLmlzUGF0aElnbm9yZWQ/LihuZXdQYXRoKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gIGNvbnN0IG9sZFBhdGhMaW5rcyA9IGNhY2hlID8gZ2V0QWxsTGlua3MoY2FjaGUpIDogW107XG4gIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXAgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgb2xkUGF0aCkuZGF0YTtcbiAgYWRkVG9RdWV1ZShhcHAsICgpID0+IGhhbmRsZVJlbmFtZUFzeW5jKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCwgb2xkUGF0aEJhY2tsaW5rc01hcCwgb2xkUGF0aExpbmtzKSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVJlbmFtZUFzeW5jKFxuICBhcHA6IEFwcCxcbiAgb2xkUGF0aDogc3RyaW5nLFxuICBuZXdQYXRoOiBzdHJpbmcsXG4gIG9sZFBhdGhCYWNrbGlua3NNYXA6IE1hcDxzdHJpbmcsIFJlZmVyZW5jZVtdPixcbiAgb2xkUGF0aExpbmtzOiBSZWZlcmVuY2VbXSxcbiAgaW50ZXJydXB0ZWRDb21iaW5lZEJhY2tsaW5rc01hcD86IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIHN0cmluZz4+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgY29udGludWVJbnRlcnJ1cHRlZFJlbmFtZXMoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpO1xuICByZWZyZXNoTGlua3MoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCBvbGRQYXRoQmFja2xpbmtzTWFwLCBvbGRQYXRoTGlua3MpO1xuICBpZiAoYXdhaXQgaGFuZGxlQ2FzZUNvbGxpc2lvbihhcHAsIG9sZFBhdGgsIG5ld1BhdGgsIG9sZFBhdGhCYWNrbGlua3NNYXAsIG9sZFBhdGhMaW5rcykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXN0b3JlVXBkYXRlQWxsTGlua3MgPSBhcm91bmQoYXBwLmZpbGVNYW5hZ2VyLCB7XG4gICAgdXBkYXRlQWxsTGlua3M6ICgpID0+IG5vb3BBc3luY1xuICB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCByZW5hbWVNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGF3YWl0IGZpbGxSZW5hbWVNYXAoYXBwLCBvbGRQYXRoLCBuZXdQYXRoLCByZW5hbWVNYXAsIG9sZFBhdGhMaW5rcyk7XG5cbiAgICBjb25zdCBjb21iaW5lZEJhY2tsaW5rc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PigpO1xuICAgIGluaXRCYWNrbGlua3NNYXAob2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgb2xkUGF0aCk7XG5cbiAgICBmb3IgKGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoIG9mIHJlbmFtZU1hcC5rZXlzKCkpIHtcbiAgICAgIGlmIChhdHRhY2htZW50T2xkUGF0aCA9PT0gb2xkUGF0aCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGF0dGFjaG1lbnRPbGRQYXRoQmFja2xpbmtzTWFwID0gKGF3YWl0IGdldEJhY2tsaW5rc0ZvckZpbGVTYWZlKGFwcCwgYXR0YWNobWVudE9sZFBhdGgpKS5kYXRhO1xuICAgICAgaW5pdEJhY2tsaW5rc01hcChhdHRhY2htZW50T2xkUGF0aEJhY2tsaW5rc01hcCwgcmVuYW1lTWFwLCBjb21iaW5lZEJhY2tsaW5rc01hcCwgYXR0YWNobWVudE9sZFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmVudEZvbGRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGZvciAoY29uc3QgW29sZEF0dGFjaG1lbnRQYXRoLCBuZXdBdHRhY2htZW50UGF0aF0gb2YgcmVuYW1lTWFwLmVudHJpZXMoKSkge1xuICAgICAgaWYgKG9sZEF0dGFjaG1lbnRQYXRoID09PSBvbGRQYXRoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgZml4ZWROZXdBdHRhY2htZW50UGF0aCA9IGF3YWl0IHJlbmFtZUhhbmRsZWQoYXBwLCBvbGRBdHRhY2htZW50UGF0aCwgbmV3QXR0YWNobWVudFBhdGgpO1xuICAgICAgcmVuYW1lTWFwLnNldChvbGRBdHRhY2htZW50UGF0aCwgZml4ZWROZXdBdHRhY2htZW50UGF0aCk7XG4gICAgICBwYXJlbnRGb2xkZXJzLmFkZChkaXJuYW1lKG9sZEF0dGFjaG1lbnRQYXRoKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3MgPSBnZXRTZXR0aW5ncyhhcHApO1xuICAgIGlmIChzZXR0aW5ncy5zaG91bGREZWxldGVFbXB0eUZvbGRlcnMpIHtcbiAgICAgIGZvciAoY29uc3QgcGFyZW50Rm9sZGVyIG9mIHBhcmVudEZvbGRlcnMpIHtcbiAgICAgICAgYXdhaXQgZGVsZXRlRW1wdHlGb2xkZXJIaWVyYXJjaHkoYXBwLCBwYXJlbnRGb2xkZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoXG4gICAgICBjb25zdCBbbmV3QmFja2xpbmtQYXRoLCBsaW5rSnNvblRvUGF0aE1hcF0gb2YgQXJyYXkuZnJvbShjb21iaW5lZEJhY2tsaW5rc01hcC5lbnRyaWVzKCkpLmNvbmNhdChcbiAgICAgICAgQXJyYXkuZnJvbShpbnRlcnJ1cHRlZENvbWJpbmVkQmFja2xpbmtzTWFwPy5lbnRyaWVzKCkgPz8gW10pXG4gICAgICApXG4gICAgKSB7XG4gICAgICBhd2FpdCBlZGl0TGlua3MoYXBwLCBuZXdCYWNrbGlua1BhdGgsIChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IG9sZEF0dGFjaG1lbnRQYXRoID0gbGlua0pzb25Ub1BhdGhNYXAuZ2V0KHRvSnNvbihsaW5rKSk7XG4gICAgICAgIGlmICghb2xkQXR0YWNobWVudFBhdGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdBdHRhY2htZW50UGF0aCA9IHJlbmFtZU1hcC5nZXQob2xkQXR0YWNobWVudFBhdGgpO1xuICAgICAgICBpZiAoIW5ld0F0dGFjaG1lbnRQYXRoKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZUxpbmsobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPFVwZGF0ZUxpbmtPcHRpb25zPih7XG4gICAgICAgICAgYXBwLFxuICAgICAgICAgIGxpbmssXG4gICAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3QmFja2xpbmtQYXRoLFxuICAgICAgICAgIG5ld1RhcmdldFBhdGhPckZpbGU6IG5ld0F0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIG9sZFRhcmdldFBhdGhPckZpbGU6IG9sZEF0dGFjaG1lbnRQYXRoLFxuICAgICAgICAgIHNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXM6IHNldHRpbmdzLnNob3VsZFVwZGF0ZUZpbGVuYW1lQWxpYXNlc1xuICAgICAgICB9KSk7XG4gICAgICB9LCB7XG4gICAgICAgIHNob3VsZEZhaWxPbk1pc3NpbmdGaWxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTm90ZShhcHAsIG5ld1BhdGgpKSB7XG4gICAgICBhd2FpdCB1cGRhdGVMaW5rc0luRmlsZShub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8VXBkYXRlTGlua3NJbkZpbGVPcHRpb25zPih7XG4gICAgICAgIGFwcCxcbiAgICAgICAgbmV3U291cmNlUGF0aE9yRmlsZTogbmV3UGF0aCxcbiAgICAgICAgb2xkU291cmNlUGF0aE9yRmlsZTogb2xkUGF0aCxcbiAgICAgICAgc2hvdWxkRmFpbE9uTWlzc2luZ0ZpbGU6IGZhbHNlLFxuICAgICAgICBzaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzOiBzZXR0aW5ncy5zaG91bGRVcGRhdGVGaWxlbmFtZUFsaWFzZXNcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBpZiAoIWdldEZpbGVPck51bGwoYXBwLCBuZXdQYXRoKSkge1xuICAgICAgbGV0IGludGVycnVwdGVkUmVuYW1lcyA9IGludGVycnVwdGVkUmVuYW1lc01hcC5nZXQobmV3UGF0aCk7XG4gICAgICBpZiAoIWludGVycnVwdGVkUmVuYW1lcykge1xuICAgICAgICBpbnRlcnJ1cHRlZFJlbmFtZXMgPSBbXTtcbiAgICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzTWFwLnNldChuZXdQYXRoLCBpbnRlcnJ1cHRlZFJlbmFtZXMpO1xuICAgICAgfVxuICAgICAgaW50ZXJydXB0ZWRSZW5hbWVzLnB1c2goe1xuICAgICAgICBjb21iaW5lZEJhY2tsaW5rc01hcCxcbiAgICAgICAgb2xkUGF0aFxuICAgICAgfSk7XG4gICAgfVxuICB9IGZpbmFsbHkge1xuICAgIHJlc3RvcmVVcGRhdGVBbGxMaW5rcygpO1xuICAgIGNvbnN0IG9ycGhhbktleXMgPSBBcnJheS5mcm9tKGhhbmRsZWRSZW5hbWVzKTtcbiAgICBhZGRUb1F1ZXVlKGFwcCwgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3JwaGFuS2V5cykge1xuICAgICAgICBoYW5kbGVkUmVuYW1lcy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYW5kbGVSZW5hbWVJZkVuYWJsZWQocGx1Z2luOiBQbHVnaW4sIGZpbGU6IFRBYnN0cmFjdEZpbGUsIG9sZFBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIXNob3VsZEludm9rZUhhbmRsZXIocGx1Z2luKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIWlzRmlsZShmaWxlKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuZXdQYXRoID0gZmlsZS5wYXRoO1xuICBoYW5kbGVSZW5hbWUocGx1Z2luLmFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGluaXRCYWNrbGlua3NNYXAoXG4gIHNpbmdsZUJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LFxuICByZW5hbWVNYXA6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gIGNvbWJpbmVkQmFja2xpbmtzTWFwOiBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PixcbiAgcGF0aDogc3RyaW5nXG4pOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCBsaW5rc10gb2Ygc2luZ2xlQmFja2xpbmtzTWFwLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5ld0JhY2tsaW5rUGF0aCA9IHJlbmFtZU1hcC5nZXQoYmFja2xpbmtQYXRoKSA/PyBiYWNrbGlua1BhdGg7XG4gICAgY29uc3QgbGlua0pzb25Ub1BhdGhNYXAgPSBjb21iaW5lZEJhY2tsaW5rc01hcC5nZXQobmV3QmFja2xpbmtQYXRoKSA/PyBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgIGNvbWJpbmVkQmFja2xpbmtzTWFwLnNldChuZXdCYWNrbGlua1BhdGgsIGxpbmtKc29uVG9QYXRoTWFwKTtcbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgbGlua3MpIHtcbiAgICAgIGxpbmtKc29uVG9QYXRoTWFwLnNldCh0b0pzb24obGluayksIHBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBsb2dSZWdpc3RlcmVkSGFuZGxlcnMoYXBwOiBBcHApOiB2b2lkIHtcbiAgY29uc3QgcmVuYW1lRGVsZXRlSGFuZGxlcnNNYXAgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBnZXRMaWJEZWJ1Z2dlcignUmVuYW1lRGVsZXRlSGFuZGxlcjpsb2dSZWdpc3RlcmVkSGFuZGxlcnMnKShcbiAgICBgUGx1Z2lucyB3aXRoIHJlZ2lzdGVyZWQgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyczogJHtKU09OLnN0cmluZ2lmeShBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJzTWFwLmtleXMoKSkpfWBcbiAgKTtcbn1cblxuZnVuY3Rpb24gbWFrZUtleShvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtvbGRQYXRofSAtPiAke25ld1BhdGh9YDtcbn1cblxuZnVuY3Rpb24gcmVmcmVzaExpbmtzKGFwcDogQXBwLCBvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZywgb2xkUGF0aEJhY2tsaW5rc01hcDogTWFwPHN0cmluZywgUmVmZXJlbmNlW10+LCBvbGRQYXRoTGlua3M6IFJlZmVyZW5jZVtdKTogdm9pZCB7XG4gIGNvbnN0IGNhY2hlID0gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUob2xkUGF0aCkgPz8gYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Q2FjaGUobmV3UGF0aCk7XG4gIGNvbnN0IG9sZFBhdGhMaW5rc1JlZnJlc2hlZCA9IGNhY2hlID8gZ2V0QWxsTGlua3MoY2FjaGUpIDogW107XG4gIGNvbnN0IG9sZFBhdGhCYWNrbGlua3NNYXBSZWZyZXNoZWQgPSBnZXRCYWNrbGlua3NGb3JGaWxlT3JQYXRoKGFwcCwgb2xkUGF0aCkuZGF0YTtcblxuICBmb3IgKGNvbnN0IGxpbmsgb2Ygb2xkUGF0aExpbmtzUmVmcmVzaGVkKSB7XG4gICAgaWYgKG9sZFBhdGhMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG9sZFBhdGhMaW5rcy5wdXNoKGxpbmspO1xuICB9XG5cbiAgZm9yIChjb25zdCBbYmFja2xpbmtQYXRoLCByZWZyZXNoZWRMaW5rc10gb2Ygb2xkUGF0aEJhY2tsaW5rc01hcFJlZnJlc2hlZC5lbnRyaWVzKCkpIHtcbiAgICBsZXQgb2xkTGlua3MgPSBvbGRQYXRoQmFja2xpbmtzTWFwLmdldChiYWNrbGlua1BhdGgpO1xuICAgIGlmICghb2xkTGlua3MpIHtcbiAgICAgIG9sZExpbmtzID0gW107XG4gICAgICBvbGRQYXRoQmFja2xpbmtzTWFwLnNldChiYWNrbGlua1BhdGgsIG9sZExpbmtzKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgcmVmcmVzaGVkTGlua3MpIHtcbiAgICAgIGlmIChvbGRMaW5rcy5pbmNsdWRlcyhsaW5rKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG9sZExpbmtzLnB1c2gobGluayk7XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlbmFtZUhhbmRsZWQoYXBwOiBBcHAsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgbmV3UGF0aCA9IGdldFNhZmVSZW5hbWVQYXRoKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIGlmIChvbGRQYXRoID09PSBuZXdQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgY29uc3Qga2V5ID0gbWFrZUtleShvbGRQYXRoLCBuZXdQYXRoKTtcbiAgaGFuZGxlZFJlbmFtZXMuYWRkKGtleSk7XG4gIG5ld1BhdGggPSBhd2FpdCByZW5hbWVTYWZlKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gIHJldHVybiBuZXdQYXRoO1xufVxuXG5mdW5jdGlvbiBzaG91bGRJbnZva2VIYW5kbGVyKHBsdWdpbjogUGx1Z2luKTogYm9vbGVhbiB7XG4gIGNvbnN0IGFwcCA9IHBsdWdpbi5hcHA7XG4gIGNvbnN0IHBsdWdpbklkID0gcGx1Z2luLm1hbmlmZXN0LmlkO1xuXG4gIGNvbnN0IHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMgPSBnZXRSZW5hbWVEZWxldGVIYW5kbGVyc01hcChhcHApO1xuICBjb25zdCBtYWluUGx1Z2luSWQgPSBBcnJheS5mcm9tKHJlbmFtZURlbGV0ZUhhbmRsZXJQbHVnaW5JZHMua2V5cygpKVswXTtcbiAgaWYgKG1haW5QbHVnaW5JZCAhPT0g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
|
@@ -3,7 +3,7 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
4
4
|
*/
|
5
5
|
|
6
|
-
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})()
|
6
|
+
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
|
7
7
|
|
8
8
|
"use strict";
|
9
9
|
var __defProp = Object.defineProperty;
|
@@ -0,0 +1,19 @@
|
|
1
|
+
/*
|
2
|
+
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
3
|
+
if you want to view the source, please visit the github repository of this plugin
|
4
|
+
*/
|
5
|
+
|
6
|
+
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
|
7
|
+
|
8
|
+
import { Platform } from "obsidian";
|
9
|
+
import { toPosixPath } from "../Path.mjs";
|
10
|
+
function relativePathToResourceUrl(app, relativePath, notePath) {
|
11
|
+
const noteFullPath = toPosixPath(app.vault.adapter.getFullRealPath(notePath));
|
12
|
+
const noteUrl = `${Platform.resourcePathPrefix}${noteFullPath}`;
|
13
|
+
const relativeUrl = new URL(relativePath, noteUrl);
|
14
|
+
return relativeUrl.toString();
|
15
|
+
}
|
16
|
+
export {
|
17
|
+
relativePathToResourceUrl
|
18
|
+
};
|
19
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL29ic2lkaWFuL1Jlc291cmNlVXJsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvbiBSZXNvdXJjZVVybFxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aCByZXNvdXJjZSBVUkxzIGluIE9ic2lkaWFuLlxuICovXG5cbmltcG9ydCB0eXBlIHsgQXBwIH0gZnJvbSAnb2JzaWRpYW4nO1xuXG5pbXBvcnQgeyBQbGF0Zm9ybSB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgdG9Qb3NpeFBhdGggfSBmcm9tICcuLi9QYXRoLnRzJztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHJlbGF0aXZlIHBhdGggdG8gYSByZXNvdXJjZSBVUkwuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggLSBUaGUgcmVsYXRpdmUgcGF0aCB0byB0aGUgcmVzb3VyY2UuXG4gKiBAcGFyYW0gbm90ZVBhdGggLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEByZXR1cm5zIFRoZSByZXNvdXJjZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGl2ZVBhdGhUb1Jlc291cmNlVXJsKGFwcDogQXBwLCByZWxhdGl2ZVBhdGg6IHN0cmluZywgbm90ZVBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vdGVGdWxsUGF0aCA9IHRvUG9zaXhQYXRoKGFwcC52YXVsdC5hZGFwdGVyLmdldEZ1bGxSZWFsUGF0aChub3RlUGF0aCkpO1xuICBjb25zdCBub3RlVXJsID0gYCR7UGxhdGZvcm0ucmVzb3VyY2VQYXRoUHJlZml4fSR7bm90ZUZ1bGxQYXRofWA7XG4gIGNvbnN0IHJlbGF0aXZlVXJsID0gbmV3IFVSTChyZWxhdGl2ZVBhdGgsIG5vdGVVcmwpO1xuICByZXR1cm4gcmVsYXRpdmVVcmwudG9TdHJpbmcoKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7QUFPQSxTQUFTLGdCQUFnQjtBQUV6QixTQUFTLG1CQUFtQjtBQVVyQixTQUFTLDBCQUEwQixLQUFVLGNBQXNCLFVBQTBCO0FBQ2xHLFFBQU0sZUFBZSxZQUFZLElBQUksTUFBTSxRQUFRLGdCQUFnQixRQUFRLENBQUM7QUFDNUUsUUFBTSxVQUFVLEdBQUcsU0FBUyxrQkFBa0IsR0FBRyxZQUFZO0FBQzdELFFBQU0sY0FBYyxJQUFJLElBQUksY0FBYyxPQUFPO0FBQ2pELFNBQU8sWUFBWSxTQUFTO0FBQzlCOyIsCiAgIm5hbWVzIjogW10KfQo=
|
@@ -3,7 +3,7 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
3
3
|
if you want to view the source, please visit the github repository of this plugin
|
4
4
|
*/
|
5
5
|
|
6
|
-
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})()
|
6
|
+
(function init(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;if(!require.__isPatched){const originalRequire=require;require=Object.assign(id=>requirePatched(id,originalRequire),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>({browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"}),"process")};for(const key of Object.keys(newFuncs)){globalThisRecord[key]??=newFuncs[key]?.()}function name(obj){return obj}__name(name,"name");function extractDefault(module){return module&&module.__esModule&&module.default?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id,originalRequire){const module=originalRequire(id);if(module){return extractDefault(module)}if(id==="process"||id==="node:process"){console.error(`Module not found: ${id}. Fake process object is returned instead.`);return globalThis.process}console.error(`Module not found: ${id}. Empty object is returned instead.`);return{}}__name(requirePatched,"requirePatched")})();
|
7
7
|
|
8
8
|
"use strict";
|
9
9
|
var __defProp = Object.defineProperty;
|