UNPKG

obsidian-dev-utils

Version:

This is the collection of useful functions that you can use for your Obsidian plugin development

139 lines (136 loc) 22.8 kB
/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ (function initCjs(){const globalThisRecord=globalThis;globalThisRecord["__name"]??=name;const originalRequire=require;if(originalRequire&&!originalRequire.__isPatched){require=Object.assign(id=>requirePatched(id),originalRequire,{__isPatched:true})}const newFuncs={__extractDefault(){return extractDefault},process(){const browserProcess={browser:true,cwd(){return"/"},env:{},platform:"android"};return browserProcess}};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&&"default"in module?module.default:module}__name(extractDefault,"extractDefault");function requirePatched(id){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")})(); "use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var AttachmentPath_exports = {}; __export(AttachmentPath_exports, { AttachmentPathContext: () => AttachmentPathContext, DUMMY_PATH: () => DUMMY_PATH, getAttachmentFilePath: () => getAttachmentFilePath, getAttachmentFolderPath: () => getAttachmentFolderPath, getAvailablePathForAttachments: () => getAvailablePathForAttachments, hasOwnAttachmentFolder: () => hasOwnAttachmentFolder }); module.exports = __toCommonJS(AttachmentPath_exports); var import_implementations = require('obsidian-typings/implementations'); var import_Path = require('../Path.cjs'); var import_String = require('../String.cjs'); var import_FileSystem = require('./FileSystem.cjs'); var AttachmentPathContext = /* @__PURE__ */ ((AttachmentPathContext2) => { AttachmentPathContext2["DeleteNote"] = "DeleteNote"; AttachmentPathContext2["RenameNote"] = "RenameNote"; AttachmentPathContext2["Unknown"] = "Unknown"; return AttachmentPathContext2; })(AttachmentPathContext || {}); const DUMMY_PATH = "__DUMMY__"; async function getAttachmentFilePath(options) { const { app, attachmentPathOrFile, notePathOrFile, shouldSkipDuplicateCheck } = options; const attachmentPath = (0, import_FileSystem.getPath)(app, attachmentPathOrFile); const attachmentFileExtension = (0, import_Path.extname)(attachmentPath); const attachmentFileBaseName = (0, import_Path.basename)(attachmentPath, attachmentFileExtension); const attachmentFile = (0, import_FileSystem.getFileOrNull)(app, attachmentPath); const internalFn = app.vault.getAvailablePathForAttachments; const extendedFn = internalFn.extended; if (extendedFn) { return extendedFn({ attachmentFileBaseName, attachmentFileContent: attachmentFile ? await app.vault.readBinary(attachmentFile) : void 0, attachmentFileExtension: attachmentFileExtension.slice(1), attachmentFileStat: attachmentFile?.stat, context: options.context, notePathOrFile, oldNotePathOrFile: options.oldNotePathOrFile, shouldSkipDuplicateCheck, shouldSkipMissingAttachmentFolderCreation: true }); } return await getAvailablePathForAttachments({ app, attachmentFileBaseName, attachmentFileExtension: attachmentFileExtension.slice(1), notePathOrFile, shouldSkipDuplicateCheck, shouldSkipMissingAttachmentFolderCreation: true }); } async function getAttachmentFolderPath(app, notePathOrFile, context = "Unknown" /* Unknown */) { return (0, import_implementations.parentFolderPath)( await getAttachmentFilePath({ app, attachmentPathOrFile: DUMMY_PATH, context, notePathOrFile, shouldSkipDuplicateCheck: true }) ); } async function getAvailablePathForAttachments(options) { const { app, attachmentFileExtension, notePathOrFile, shouldSkipDuplicateCheck, shouldSkipMissingAttachmentFolderCreation } = options; let attachmentFolderPath = app.vault.getConfig("attachmentFolderPath"); const isCurrentFolder = attachmentFolderPath === "." || attachmentFolderPath === "./"; const relativePath = attachmentFolderPath.startsWith("./") ? (0, import_String.trimStart)(attachmentFolderPath, "./") : null; const noteFileOrNull = (0, import_FileSystem.getFileOrNull)(app, notePathOrFile); if (isCurrentFolder) { attachmentFolderPath = noteFileOrNull ? noteFileOrNull.parent?.path ?? "" : ""; } else if (relativePath) { attachmentFolderPath = (noteFileOrNull ? noteFileOrNull.parent?.getParentPrefix() ?? "" : "") + relativePath; } attachmentFolderPath = (0, import_String.normalize)(normalizeSlashes(attachmentFolderPath)); const attachmentFileBaseName = (0, import_String.normalize)(normalizeSlashes(options.attachmentFileBaseName)); let folder = (0, import_FileSystem.getFolderOrNull)(app, attachmentFolderPath, true); if (!folder && relativePath) { folder = shouldSkipMissingAttachmentFolderCreation ? (0, import_FileSystem.getFolder)(app, attachmentFolderPath, true) : await app.vault.createFolder(attachmentFolderPath); } const prefix = folder?.getParentPrefix() ?? ""; return shouldSkipDuplicateCheck ? (0, import_Path.makeFileName)(prefix + attachmentFileBaseName, attachmentFileExtension) : app.vault.getAvailablePath(prefix + attachmentFileBaseName, attachmentFileExtension); } async function hasOwnAttachmentFolder(app, path, context = "Unknown" /* Unknown */) { const attachmentFolderPath = await getAttachmentFolderPath(app, path, context); const dummyAttachmentFolderPath = await getAttachmentFolderPath(app, (0, import_Path.join)((0, import_Path.dirname)(path), `${DUMMY_PATH}.${import_FileSystem.MARKDOWN_FILE_EXTENSION}`), context); return attachmentFolderPath !== dummyAttachmentFolderPath; } function normalizeSlashes(path) { path = (0, import_String.replaceAll)(path, /(?:[\\/])+/g, "/"); path = (0, import_String.replaceAll)(path, /^\/+|\/+$/g, ""); return path || "/"; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { AttachmentPathContext, DUMMY_PATH, getAttachmentFilePath, getAttachmentFolderPath, getAvailablePathForAttachments, hasOwnAttachmentFolder }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0F0dGFjaG1lbnRQYXRoLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIFByb3ZpZGVzIHV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggYXR0YWNobWVudCBwYXRocy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgRmlsZVN0YXRzLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB7IHBhcmVudEZvbGRlclBhdGggfSBmcm9tICdvYnNpZGlhbi10eXBpbmdzL2ltcGxlbWVudGF0aW9ucyc7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5cbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICBtYWtlRmlsZU5hbWVcbn0gZnJvbSAnLi4vUGF0aC50cyc7XG5pbXBvcnQge1xuICBub3JtYWxpemUsXG4gIHJlcGxhY2VBbGwsXG4gIHRyaW1TdGFydFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZU9yTnVsbCxcbiAgZ2V0Rm9sZGVyLFxuICBnZXRGb2xkZXJPck51bGwsXG4gIGdldFBhdGgsXG4gIE1BUktET1dOX0ZJTEVfRVhURU5TSU9OXG59IGZyb20gJy4vRmlsZVN5c3RlbS50cyc7XG5cbi8qKlxuICogQSBjb250ZXh0IGZvciBhbiBhdHRhY2htZW50IHBhdGguXG4gKi9cbmV4cG9ydCBlbnVtIEF0dGFjaG1lbnRQYXRoQ29udGV4dCB7XG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgZGVsZXRlIG5vdGUuXG4gICAqL1xuICBEZWxldGVOb3RlID0gJ0RlbGV0ZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQgZm9yIGEgcmVuYW1lIG5vdGUuXG4gICAqL1xuICBSZW5hbWVOb3RlID0gJ1JlbmFtZU5vdGUnLFxuXG4gIC8qKlxuICAgKiBBbiB1bmtub3duIGNvbnRleHQuXG4gICAqL1xuICBVbmtub3duID0gJ1Vua25vd24nXG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZXh0ZW5kZWQgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGbk9wdGlvbnMge1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgY29udGVudCBvZiB0aGUgYXR0YWNobWVudCBmaWxlLlxuICAgKi9cbiAgYXR0YWNobWVudEZpbGVDb250ZW50PzogQXJyYXlCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFuIGV4dGVuc2lvbiBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhdHMgb2YgdGhlIGF0dGFjaG1lbnQgZmlsZS5cbiAgICovXG4gIGF0dGFjaG1lbnRGaWxlU3RhdD86IEZpbGVTdGF0cyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQSBjb250ZXh0LlxuICAgKi9cbiAgY29udGV4dDogQXR0YWNobWVudFBhdGhDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZS5cbiAgICovXG4gIG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSBwYXRoIG9yIGZpbGUgb2YgdGhlIG9sZCBub3RlLlxuICAgKi9cbiAgb2xkTm90ZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGR1cGxpY2F0ZSBjaGVjayBiZSBza2lwcGVkLlxuICAgKi9cbiAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU2hvdWxkIHRoZSBnZW5lcmF0ZWQgYXR0YWNobWVudCBmaWxlIG5hbWUgYmUgc2tpcHBlZC5cbiAgICovXG4gIHNob3VsZFNraXBHZW5lcmF0ZWRBdHRhY2htZW50RmlsZU5hbWU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgbWlzc2luZyBhdHRhY2htZW50IGZvbGRlciBjcmVhdGlvbiBiZSBza2lwcGVkLlxuICAgKi9cbiAgc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICoge0BsaW5rIFZhdWx0LmdldEF2YWlsYWJsZVBhdGhGb3JBdHRhY2htZW50c30gZXh0ZW5kZWQgd3JhcHBlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNGbkV4dGVuZGVkIGV4dGVuZHMgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm4ge1xuICAvKipcbiAgICogR2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cyB3aXRoIGFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zIGZvciB0aGUgZ2V0IGF2YWlsYWJsZSBwYXRoIGZvciBhdHRhY2htZW50cy5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICAgKi9cbiAgZXh0ZW5kZWQob3B0aW9uczogR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRXh0ZW5kZWRGbk9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG59XG5cbnR5cGUgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzRm4gPSBWYXVsdFsnZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzJ107XG5cbi8qKlxuICogRHVtbXkgcGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IERVTU1ZX1BBVEggPSAnX19EVU1NWV9fJztcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgZ2V0QXR0YWNobWVudEZpbGVQYXRoIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldEF0dGFjaG1lbnRGaWxlUGF0aE9wdGlvbnMge1xuICAvKipcbiAgICogQW4gT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAgICovXG4gIGF0dGFjaG1lbnRQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIGNvbnRleHQuXG4gICAqL1xuICBjb250ZXh0OiBBdHRhY2htZW50UGF0aENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIEEgcGF0aCBvZiB0aGUgbm90ZS5cbiAgICovXG4gIG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBIHBhdGggb2YgdGhlIG9sZCBub3RlLlxuICAgKi9cbiAgb2xkTm90ZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBTaG91bGQgdGhlIGR1cGxpY2F0ZSBjaGVjayBiZSBza2lwcGVkLlxuICAgKi9cbiAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrOiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHRoZSBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuICAvKipcbiAgICogQSBiYXNlIG5hbWUgb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICBhdHRhY2htZW50RmlsZUJhc2VOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBbiBleHRlbnNpb24gb2YgdGhlIGF0dGFjaG1lbnQuXG4gICAqL1xuICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogc3RyaW5nO1xuICAvKipcbiAgICogQSBmaWxlIHRvIGF0dGFjaCB0by5cbiAgICovXG4gIG5vdGVQYXRoT3JGaWxlOiBudWxsIHwgUGF0aE9yRmlsZTtcbiAgLyoqXG4gICAqIFNob3VsZCB0aGUgZHVwbGljYXRlIGNoZWNrIGJlIHNraXBwZWQuXG4gICAqL1xuICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogU2hvdWxkIG1pc3NpbmcgYXR0YWNobWVudCBmb2xkZXIgY3JlYXRpb24gYmUgc2tpcHBlZC5cbiAgICovXG4gIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGZpbGUgcGF0aCBmb3IgYW4gYXR0YWNobWVudCB3aXRoaW4gYSBub3RlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGdldCBhdHRhY2htZW50IGZpbGUgcGF0aCBmdW5jdGlvbi5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGZpbGUgcGF0aCBvZiB0aGUgYXR0YWNobWVudC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEF0dGFjaG1lbnRGaWxlUGF0aChvcHRpb25zOiBHZXRBdHRhY2htZW50RmlsZVBhdGhPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhdHRhY2htZW50UGF0aE9yRmlsZSxcbiAgICBub3RlUGF0aE9yRmlsZSxcbiAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2tcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGF0dGFjaG1lbnRQYXRoID0gZ2V0UGF0aChhcHAsIGF0dGFjaG1lbnRQYXRoT3JGaWxlKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVFeHRlbnNpb24gPSBleHRuYW1lKGF0dGFjaG1lbnRQYXRoKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IGJhc2VuYW1lKGF0dGFjaG1lbnRQYXRoLCBhdHRhY2htZW50RmlsZUV4dGVuc2lvbik7XG4gIGNvbnN0IGF0dGFjaG1lbnRGaWxlID0gZ2V0RmlsZU9yTnVsbChhcHAsIGF0dGFjaG1lbnRQYXRoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kXG4gIGNvbnN0IGludGVybmFsRm4gPSBhcHAudmF1bHQuZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzO1xuICBjb25zdCBleHRlbmRlZEZuID0gKGludGVybmFsRm4gYXMgUGFydGlhbDxHZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHNGbkV4dGVuZGVkPikuZXh0ZW5kZWQ7XG4gIGlmIChleHRlbmRlZEZuKSB7XG4gICAgcmV0dXJuIGV4dGVuZGVkRm4oe1xuICAgICAgYXR0YWNobWVudEZpbGVCYXNlTmFtZSxcbiAgICAgIGF0dGFjaG1lbnRGaWxlQ29udGVudDogYXR0YWNobWVudEZpbGUgPyBhd2FpdCBhcHAudmF1bHQucmVhZEJpbmFyeShhdHRhY2htZW50RmlsZSkgOiB1bmRlZmluZWQsXG4gICAgICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogYXR0YWNobWVudEZpbGVFeHRlbnNpb24uc2xpY2UoMSksXG4gICAgICBhdHRhY2htZW50RmlsZVN0YXQ6IGF0dGFjaG1lbnRGaWxlPy5zdGF0LFxuICAgICAgY29udGV4dDogb3B0aW9ucy5jb250ZXh0LFxuICAgICAgbm90ZVBhdGhPckZpbGUsXG4gICAgICBvbGROb3RlUGF0aE9yRmlsZTogb3B0aW9ucy5vbGROb3RlUGF0aE9yRmlsZSxcbiAgICAgIHNob3VsZFNraXBEdXBsaWNhdGVDaGVjayxcbiAgICAgIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uOiB0cnVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gYXdhaXQgZ2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzKHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVCYXNlTmFtZSxcbiAgICBhdHRhY2htZW50RmlsZUV4dGVuc2lvbjogYXR0YWNobWVudEZpbGVFeHRlbnNpb24uc2xpY2UoMSksXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrLFxuICAgIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uOiB0cnVlXG4gIH0pO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXR0YWNobWVudCBmb2xkZXIgcGF0aCBmb3IgYSBnaXZlbiBub3RlLlxuICpcbiAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuXG4gKiBAcGFyYW0gbm90ZVBhdGhPckZpbGUgLSBUaGUgcGF0aCBvZiB0aGUgbm90ZS5cbiAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIGNvbnRleHQuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdHRhY2htZW50IGZvbGRlciBwYXRoLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwOiBBcHAsIG5vdGVQYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICByZXR1cm4gcGFyZW50Rm9sZGVyUGF0aChcbiAgICBhd2FpdCBnZXRBdHRhY2htZW50RmlsZVBhdGgoe1xuICAgICAgYXBwLFxuICAgICAgYXR0YWNobWVudFBhdGhPckZpbGU6IERVTU1ZX1BBVEgsXG4gICAgICBjb250ZXh0LFxuICAgICAgbm90ZVBhdGhPckZpbGUsXG4gICAgICBzaG91bGRTa2lwRHVwbGljYXRlQ2hlY2s6IHRydWVcbiAgICB9KVxuICApO1xufVxuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgYXZhaWxhYmxlIHBhdGggZm9yIGF0dGFjaG1lbnRzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9ucyBmb3IgdGhlIGdldCBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMgZnVuY3Rpb24uXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSBhdmFpbGFibGUgcGF0aCBmb3IgYXR0YWNobWVudHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBdmFpbGFibGVQYXRoRm9yQXR0YWNobWVudHMob3B0aW9uczogR2V0QXZhaWxhYmxlUGF0aEZvckF0dGFjaG1lbnRzT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXR0YWNobWVudEZpbGVFeHRlbnNpb24sXG4gICAgbm90ZVBhdGhPckZpbGUsXG4gICAgc2hvdWxkU2tpcER1cGxpY2F0ZUNoZWNrLFxuICAgIHNob3VsZFNraXBNaXNzaW5nQXR0YWNobWVudEZvbGRlckNyZWF0aW9uXG4gIH0gPSBvcHRpb25zO1xuICBsZXQgYXR0YWNobWVudEZvbGRlclBhdGggPSBhcHAudmF1bHQuZ2V0Q29uZmlnKCdhdHRhY2htZW50Rm9sZGVyUGF0aCcpIGFzIHN0cmluZztcbiAgY29uc3QgaXNDdXJyZW50Rm9sZGVyID0gYXR0YWNobWVudEZvbGRlclBhdGggPT09ICcuJyB8fCBhdHRhY2htZW50Rm9sZGVyUGF0aCA9PT0gJy4vJztcbiAgY29uc3QgcmVsYXRpdmVQYXRoID0gYXR0YWNobWVudEZvbGRlclBhdGguc3RhcnRzV2l0aCgnLi8nKSA/IHRyaW1TdGFydChhdHRhY2htZW50Rm9sZGVyUGF0aCwgJy4vJykgOiBudWxsO1xuXG4gIGNvbnN0IG5vdGVGaWxlT3JOdWxsID0gZ2V0RmlsZU9yTnVsbChhcHAsIG5vdGVQYXRoT3JGaWxlKTtcblxuICBpZiAoaXNDdXJyZW50Rm9sZGVyKSB7XG4gICAgYXR0YWNobWVudEZvbGRlclBhdGggPSBub3RlRmlsZU9yTnVsbCA/IG5vdGVGaWxlT3JOdWxsLnBhcmVudD8ucGF0aCA/PyAnJyA6ICcnO1xuICB9IGVsc2UgaWYgKHJlbGF0aXZlUGF0aCkge1xuICAgIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gKG5vdGVGaWxlT3JOdWxsID8gbm90ZUZpbGVPck51bGwucGFyZW50Py5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJyA6ICcnKSArIHJlbGF0aXZlUGF0aDtcbiAgfVxuXG4gIGF0dGFjaG1lbnRGb2xkZXJQYXRoID0gbm9ybWFsaXplKG5vcm1hbGl6ZVNsYXNoZXMoYXR0YWNobWVudEZvbGRlclBhdGgpKTtcbiAgY29uc3QgYXR0YWNobWVudEZpbGVCYXNlTmFtZSA9IG5vcm1hbGl6ZShub3JtYWxpemVTbGFzaGVzKG9wdGlvbnMuYXR0YWNobWVudEZpbGVCYXNlTmFtZSkpO1xuXG4gIGxldCBmb2xkZXIgPSBnZXRGb2xkZXJPck51bGwoYXBwLCBhdHRhY2htZW50Rm9sZGVyUGF0aCwgdHJ1ZSk7XG5cbiAgaWYgKCFmb2xkZXIgJiYgcmVsYXRpdmVQYXRoKSB7XG4gICAgZm9sZGVyID0gc2hvdWxkU2tpcE1pc3NpbmdBdHRhY2htZW50Rm9sZGVyQ3JlYXRpb25cbiAgICAgID8gZ2V0Rm9sZGVyKGFwcCwgYXR0YWNobWVudEZvbGRlclBhdGgsIHRydWUpXG4gICAgICA6IGF3YWl0IGFwcC52YXVsdC5jcmVhdGVGb2xkZXIoYXR0YWNobWVudEZvbGRlclBhdGgpO1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gZm9sZGVyPy5nZXRQYXJlbnRQcmVmaXgoKSA/PyAnJztcbiAgcmV0dXJuIHNob3VsZFNraXBEdXBsaWNhdGVDaGVja1xuICAgID8gbWFrZUZpbGVOYW1lKHByZWZpeCArIGF0dGFjaG1lbnRGaWxlQmFzZU5hbWUsIGF0dGFjaG1lbnRGaWxlRXh0ZW5zaW9uKVxuICAgIDogYXBwLnZhdWx0LmdldEF2YWlsYWJsZVBhdGgocHJlZml4ICsgYXR0YWNobWVudEZpbGVCYXNlTmFtZSwgYXR0YWNobWVudEZpbGVFeHRlbnNpb24pO1xufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIG5vdGUgaGFzIGl0cyBvd24gYXR0YWNobWVudCBmb2xkZXIuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggb2YgdGhlIG5vdGUuXG4gKiBAcGFyYW0gY29udGV4dCAtIFRoZSBjb250ZXh0LlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBub3RlIGhhcyBpdHMgb3duIGF0dGFjaG1lbnQgZm9sZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFzT3duQXR0YWNobWVudEZvbGRlcihhcHA6IEFwcCwgcGF0aDogc3RyaW5nLCBjb250ZXh0ID0gQXR0YWNobWVudFBhdGhDb250ZXh0LlVua25vd24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgYXR0YWNobWVudEZvbGRlclBhdGggPSBhd2FpdCBnZXRBdHRhY2htZW50Rm9sZGVyUGF0aChhcHAsIHBhdGgsIGNvbnRleHQpO1xuICBjb25zdCBkdW1teUF0dGFjaG1lbnRGb2xkZXJQYXRoID0gYXdhaXQgZ2V0QXR0YWNobWVudEZvbGRlclBhdGgoYXBwLCBqb2luKGRpcm5hbWUocGF0aCksIGAke0RVTU1ZX1BBVEh9LiR7TUFSS0RPV05fRklMRV9FWFRFTlNJT059YCksIGNvbnRleHQpO1xuICByZXR1cm4gYXR0YWNobWVudEZvbGRlclBhdGggIT09IGR1bW15QXR0YWNobWVudEZvbGRlclBhdGg7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIHBhdGggYnkgY29tYmluaW5nIG11bHRpcGxlIHNsYXNoZXMgaW50byBhIHNpbmdsZSBzbGFzaCBhbmQgcmVtb3ZpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcy5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFBhdGggdG8gbm9ybWFsaXplLlxuICogQHJldHVybnMgVGhlIG5vcm1hbGl6ZWQgcGF0aC5cbiAqL1xuZnVuY3Rpb24gbm9ybWFsaXplU2xhc2hlcyhwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBwYXRoID0gcmVwbGFjZUFsbChwYXRoLCAvKD86W1xcXFwvXSkrL2csICcvJyk7XG4gIHBhdGggPSByZXBsYWNlQWxsKHBhdGgsIC9eXFwvK3xcXC8rJC9nLCAnJyk7XG4gIHJldHVybiBwYXRoIHx8ICcvJztcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLDZCQUFpQztBQUlqQyxrQkFNTztBQUNQLG9CQUlPO0FBQ1Asd0JBTU87QUFLQSxJQUFLLHdCQUFMLGtCQUFLQSwyQkFBTDtBQUlMLEVBQUFBLHVCQUFBLGdCQUFhO0FBS2IsRUFBQUEsdUJBQUEsZ0JBQWE7QUFLYixFQUFBQSx1QkFBQSxhQUFVO0FBZEEsU0FBQUE7QUFBQSxHQUFBO0FBMEZMLE1BQU0sYUFBYTtBQXdFMUIsZUFBc0Isc0JBQXNCLFNBQXdEO0FBQ2xHLFFBQU07QUFBQSxJQUNKO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRixJQUFJO0FBQ0osUUFBTSxxQkFBaUIsMkJBQVEsS0FBSyxvQkFBb0I7QUFDeEQsUUFBTSw4QkFBMEIscUJBQVEsY0FBYztBQUN0RCxRQUFN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