UNPKG

obsidian-dev-utils

Version:

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

323 lines (309 loc) 26.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) { // eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function. 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; } function extractDefault(module) { return module && module.__esModule && 'default' in module ? module.default : module; } const OBSIDIAN_BUILT_IN_MODULE_NAMES = [ 'obsidian', '@codemirror/autocomplete', '@codemirror/collab', '@codemirror/commands', '@codemirror/language', '@codemirror/lint', '@codemirror/search', '@codemirror/state', '@codemirror/text', '@codemirror/view', '@lezer/common', '@lezer/lr', '@lezer/highlight']; const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [ '@codemirror/closebrackets', '@codemirror/comment', '@codemirror/fold', '@codemirror/gutter', '@codemirror/highlight', '@codemirror/history', '@codemirror/matchbrackets', '@codemirror/panel', '@codemirror/rangeset', '@codemirror/rectangular-selection', '@codemirror/stream-parser', '@codemirror/tooltip']; function requirePatched(id) { if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) { return originalRequire?.(id); } // eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-unnecessary-condition -- We need access to app here which might not be available yet. if (globalThis?.app?.isMobile) { if (id === 'process' || id === 'node:process') { console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`); return globalThis.process; } } else { const module = originalRequire?.(id); if (module) { return extractDefault(module); } } console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`); return {}; } })(); "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 FolderCommandBase_exports = {}; __export(FolderCommandBase_exports, { ArrayDelegatingFolderCommandInvocation: () => ArrayDelegatingFolderCommandInvocation, FolderCommandBase: () => FolderCommandBase, FolderCommandInvocationBase: () => FolderCommandInvocationBase, FoldersCommandInvocationBase: () => FoldersCommandInvocationBase, SequentialFoldersCommandInvocationBase: () => SequentialFoldersCommandInvocationBase }); module.exports = __toCommonJS(FolderCommandBase_exports); var import_obsidian = require('obsidian'); var import_FileSystem = require('../FileSystem.cjs'); var import_AbstractFileCommandBase = require('./AbstractFileCommandBase.cjs'); class FolderCommandInvocationBase extends import_AbstractFileCommandBase.AbstractFileCommandInvocationBase { /** * Gets the folder that the command invocation belongs to. * * @returns The folder that the command invocation belongs to. * @throws If the abstract file is not a folder. */ get folder() { return (0, import_FileSystem.asFolder)(this._abstractFile); } /** * Checks if the command can execute. * * @returns Whether the command can execute. */ canExecute() { return super.canExecute() && !!this.folder; } } class ArrayDelegatingFolderCommandInvocation extends FolderCommandInvocationBase { /** * Creates a new array-delegating folder command invocation. * * @param plugin - The plugin that the command invocation belongs to. * @param folder - The file to invoke the command for. * @param createCommandInvocationForFiles - The function to create a command invocation for files. */ constructor(plugin, folder, createCommandInvocationForFiles) { super(plugin, folder); this.createCommandInvocationForFiles = createCommandInvocationForFiles; } /** * Checks if the command can execute. * * @returns Whether the command can execute. */ canExecute() { return super.canExecute() && this.createCommandInvocationForFiles([this.folder]).invoke(true); } /** * Executes the command. * * @returns A promise that resolves when the command has been executed. */ async execute() { await this.createCommandInvocationForFiles([this.folder]).invokeAsync(false); } } class FolderCommandBase extends import_AbstractFileCommandBase.AbstractFileCommandBase { /** * Creates a new abstract file command invocation. * * @param abstractFile - The abstract file to invoke the command for. * @returns A new abstract file command invocation. */ createCommandInvocation(abstractFile) { const folder = (0, import_FileSystem.asFolderOrNull)(abstractFile ?? null) ?? this.app.workspace.getActiveFile()?.parent ?? null; return this.createCommandInvocationForFolder(folder); } /** * Creates a new abstract file command invocation for an abstract file. * * @param abstractFile - The abstract file to invoke the command for. * @returns A new abstract file command invocation. */ createCommandInvocationForAbstractFile(abstractFile) { return this.createCommandInvocationForFolder((0, import_FileSystem.asFolderOrNull)(abstractFile)); } /** * Creates a new abstract files command invocation for abstract files. * * @param abstractFiles - The abstract files to invoke the command for. * @returns A new abstract files command invocation. */ createCommandInvocationForAbstractFiles(abstractFiles) { return this.createCommandInvocationForFolders((0, import_FileSystem.asArrayOfFolders)(abstractFiles)); } /** * Creates a new folders command invocation for folders. * * @param folders - The folders to invoke the command for. * @returns A new folders command invocation. */ createCommandInvocationForFolders(folders) { return new SequentialFoldersCommandInvocationBase(this.plugin, folders, this.createCommandInvocationForFolder.bind(this)); } /** * Checks if the command should be added to the abstract file menu. * * @param abstractFile - The abstract file to check. * @param source - The source of the abstract file. * @param leaf - The leaf to check. * @returns Whether the command should be added to the abstract file menu. */ shouldAddToAbstractFileMenu(abstractFile, source, leaf) { if (!(0, import_FileSystem.isFolder)(abstractFile)) { return false; } return this.shouldAddToFolderMenu(abstractFile, source, leaf); } /** * Checks if the command should be added to the abstract files menu. * * @param abstractFiles - The abstract files to check. * @param source - The source of the abstract files. * @param leaf - The leaf to check. * @returns Whether the command should be added to the abstract files menu. */ shouldAddToAbstractFilesMenu(abstractFiles, source, leaf) { if (!abstractFiles.every((abstractFile) => (0, import_FileSystem.isFolder)(abstractFile))) { return false; } return this.shouldAddToFoldersMenu((0, import_FileSystem.asArrayOfFolders)(abstractFiles), source, leaf); } /** * Checks if the command should be added to the folder menu. * * @param _folder - The folder to check. * @param _source - The source of the folder. * @param _leaf - The leaf to check. * @returns Whether the command should be added to the folder menu. */ shouldAddToFolderMenu(_folder, _source, _leaf) { return false; } /** * Checks if the command should be added to the folders menu. * * @param _folders - The folders to check. * @param _source - The source of the folders. * @param _leaf - The leaf to check. * @returns Whether the command should be added to the folders menu. */ shouldAddToFoldersMenu(_folders, _source, _leaf) { return false; } } class FoldersCommandInvocationBase extends import_AbstractFileCommandBase.AbstractFilesCommandInvocationBase { /** * Creates a new folders command invocation. * * @param plugin - The plugin that the command invocation belongs to. * @param folders - The folders to invoke the command for. */ constructor(plugin, folders) { super(plugin, folders); this.folders = folders; } } class SequentialFoldersCommandInvocationBase extends FoldersCommandInvocationBase { /** * Creates a new sequential folders command invocation. * * @param plugin - The plugin that the command invocation belongs to. * @param folders - The folders to invoke the command for. * @param createCommandInvocationForFolder - The function to create a command invocation for a folder. */ constructor(plugin, folders, createCommandInvocationForFolder) { super(plugin, folders); this.createCommandInvocationForFolder = createCommandInvocationForFolder; } /** * Checks if the command can execute. * * @returns Whether the command can execute. */ canExecute() { return super.canExecute() && this.folders.length > 0 && this.folders.every((folder) => this.createCommandInvocationForFolder(folder).invoke(true)); } /** * Executes the command. * * @returns A promise that resolves when the command has been executed. */ async execute() { for (const folder of this.folders) { await this.createCommandInvocationForFolder(folder).invokeAsync(false); } } } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { ArrayDelegatingFolderCommandInvocation, FolderCommandBase, FolderCommandInvocationBase, FoldersCommandInvocationBase, SequentialFoldersCommandInvocationBase }); //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0NvbW1hbmRzL0ZvbGRlckNvbW1hbmRCYXNlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIEJhc2UgY2xhc3NlcyBmb3IgZm9sZGVyIGNvbW1hbmRzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgUGx1Z2luLFxuICBUQWJzdHJhY3RGaWxlLFxuICBXb3Jrc3BhY2VMZWFmXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVEZvbGRlciB9IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHtcbiAgYXNBcnJheU9mRm9sZGVycyxcbiAgYXNGb2xkZXIsXG4gIGFzRm9sZGVyT3JOdWxsLFxuICBpc0ZvbGRlclxufSBmcm9tICcuLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIEFic3RyYWN0RmlsZUNvbW1hbmRCYXNlLFxuICBBYnN0cmFjdEZpbGVDb21tYW5kSW52b2NhdGlvbkJhc2UsXG4gIEFic3RyYWN0RmlsZXNDb21tYW5kSW52b2NhdGlvbkJhc2Vcbn0gZnJvbSAnLi9BYnN0cmFjdEZpbGVDb21tYW5kQmFzZS50cyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZm9sZGVyIGNvbW1hbmQgaW52b2NhdGlvbnMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbiBleHRlbmRzIFBsdWdpbj4gZXh0ZW5kcyBBYnN0cmFjdEZpbGVDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogR2V0cyB0aGUgZm9sZGVyIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZm9sZGVyIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKiBAdGhyb3dzIElmIHRoZSBhYnN0cmFjdCBmaWxlIGlzIG5vdCBhIGZvbGRlci5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgZm9sZGVyKCk6IFRGb2xkZXIge1xuICAgIHJldHVybiBhc0ZvbGRlcih0aGlzLl9hYnN0cmFjdEZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjYW5FeGVjdXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgJiYgISF0aGlzLmZvbGRlcjtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFycmF5LWRlbGVnYXRpbmcgZmlsZSBjb21tYW5kIGludm9jYXRpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgY2xhc3MgQXJyYXlEZWxlZ2F0aW5nRm9sZGVyQ29tbWFuZEludm9jYXRpb248VFBsdWdpbiBleHRlbmRzIFBsdWdpbj4gZXh0ZW5kcyBGb2xkZXJDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBhcnJheS1kZWxlZ2F0aW5nIGZvbGRlciBjb21tYW5kIGludm9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBwbHVnaW4gLSBUaGUgcGx1Z2luIHRoYXQgdGhlIGNvbW1hbmQgaW52b2NhdGlvbiBiZWxvbmdzIHRvLlxuICAgKiBAcGFyYW0gZm9sZGVyIC0gVGhlIGZpbGUgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICogQHBhcmFtIGNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRmlsZXMgLSBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29tbWFuZCBpbnZvY2F0aW9uIGZvciBmaWxlcy5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwbHVnaW46IFRQbHVnaW4sXG4gICAgZm9sZGVyOiBudWxsIHwgVEZvbGRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRmlsZXM6IChmb2xkZXJzOiBURm9sZGVyW10pID0+IEZvbGRlcnNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj5cbiAgKSB7XG4gICAgc3VwZXIocGx1Z2luLCBmb2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjYW5FeGVjdXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgJiYgdGhpcy5jcmVhdGVDb21tYW5kSW52b2NhdGlvbkZvckZpbGVzKFt0aGlzLmZvbGRlcl0pLmludm9rZSh0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBleGVjdXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGaWxlcyhbdGhpcy5mb2xkZXJdKS5pbnZva2VBc3luYyhmYWxzZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBmb2xkZXIgY29tbWFuZHMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb2xkZXJDb21tYW5kQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luID0gUGx1Z2luPiBleHRlbmRzIEFic3RyYWN0RmlsZUNvbW1hbmRCYXNlPFRQbHVnaW4+IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYWJzdHJhY3QgZmlsZSBjb21tYW5kIGludm9jYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBhYnN0cmFjdEZpbGUgLSBUaGUgYWJzdHJhY3QgZmlsZSB0byBpbnZva2UgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcmV0dXJucyBBIG5ldyBhYnN0cmFjdCBmaWxlIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjcmVhdGVDb21tYW5kSW52b2NhdGlvbihhYnN0cmFjdEZpbGU/OiBUQWJzdHJhY3RGaWxlKTogQWJzdHJhY3RGaWxlQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+IHtcbiAgICBjb25zdCBmb2xkZXIgPSBhc0ZvbGRlck9yTnVsbChhYnN0cmFjdEZpbGUgPz8gbnVsbCkgPz8gdGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKT8ucGFyZW50ID8/IG51bGw7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGb2xkZXIoZm9sZGVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFic3RyYWN0IGZpbGUgY29tbWFuZCBpbnZvY2F0aW9uIGZvciBhbiBhYnN0cmFjdCBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gYWJzdHJhY3RGaWxlIC0gVGhlIGFic3RyYWN0IGZpbGUgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICogQHJldHVybnMgQSBuZXcgYWJzdHJhY3QgZmlsZSBjb21tYW5kIGludm9jYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JBYnN0cmFjdEZpbGUoYWJzdHJhY3RGaWxlOiBudWxsIHwgVEFic3RyYWN0RmlsZSk6IEFic3RyYWN0RmlsZUNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGb2xkZXIoYXNGb2xkZXJPck51bGwoYWJzdHJhY3RGaWxlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBhYnN0cmFjdCBmaWxlcyBjb21tYW5kIGludm9jYXRpb24gZm9yIGFic3RyYWN0IGZpbGVzLlxuICAgKlxuICAgKiBAcGFyYW0gYWJzdHJhY3RGaWxlcyAtIFRoZSBhYnN0cmFjdCBmaWxlcyB0byBpbnZva2UgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcmV0dXJucyBBIG5ldyBhYnN0cmFjdCBmaWxlcyBjb21tYW5kIGludm9jYXRpb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JBYnN0cmFjdEZpbGVzKGFic3RyYWN0RmlsZXM6IFRBYnN0cmFjdEZpbGVbXSk6IEFic3RyYWN0RmlsZXNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRm9sZGVycyhhc0FycmF5T2ZGb2xkZXJzKGFic3RyYWN0RmlsZXMpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGFic3RyYWN0IGZpbGUgY29tbWFuZCBpbnZvY2F0aW9uIGZvciBhIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIGZvbGRlciAtIFRoZSBmb2xkZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICogQHJldHVybnMgQSBuZXcgZm9sZGVyIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjcmVhdGVDb21tYW5kSW52b2NhdGlvbkZvckZvbGRlcihmb2xkZXI6IG51bGwgfCBURm9sZGVyKTogRm9sZGVyQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGZvbGRlcnMgY29tbWFuZCBpbnZvY2F0aW9uIGZvciBmb2xkZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gZm9sZGVycyAtIFRoZSBmb2xkZXJzIHRvIGludm9rZSB0aGUgY29tbWFuZCBmb3IuXG4gICAqIEByZXR1cm5zIEEgbmV3IGZvbGRlcnMgY29tbWFuZCBpbnZvY2F0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRm9sZGVycyhmb2xkZXJzOiBURm9sZGVyW10pOiBGb2xkZXJzQ29tbWFuZEludm9jYXRpb25CYXNlPFRQbHVnaW4+IHtcbiAgICByZXR1cm4gbmV3IFNlcXVlbnRpYWxGb2xkZXJzQ29tbWFuZEludm9jYXRpb25CYXNlKHRoaXMucGx1Z2luLCBmb2xkZXJzLCB0aGlzLmNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRm9sZGVyLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGUgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIGFic3RyYWN0RmlsZSAtIFRoZSBhYnN0cmFjdCBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSBvZiB0aGUgYWJzdHJhY3QgZmlsZS5cbiAgICogQHBhcmFtIGxlYWYgLSBUaGUgbGVhZiB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGFic3RyYWN0IGZpbGUgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBZGRUb0Fic3RyYWN0RmlsZU1lbnUoYWJzdHJhY3RGaWxlOiBUQWJzdHJhY3RGaWxlLCBzb3VyY2U6IHN0cmluZywgbGVhZj86IFdvcmtzcGFjZUxlYWYpOiBib29sZWFuIHtcbiAgICBpZiAoIWlzRm9sZGVyKGFic3RyYWN0RmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvdWxkQWRkVG9Gb2xkZXJNZW51KGFic3RyYWN0RmlsZSwgc291cmNlLCBsZWFmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBhYnN0cmFjdCBmaWxlcyBtZW51LlxuICAgKlxuICAgKiBAcGFyYW0gYWJzdHJhY3RGaWxlcyAtIFRoZSBhYnN0cmFjdCBmaWxlcyB0byBjaGVjay5cbiAgICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2Ugb2YgdGhlIGFic3RyYWN0IGZpbGVzLlxuICAgKiBAcGFyYW0gbGVhZiAtIFRoZSBsZWFmIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBjb21tYW5kIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgYWJzdHJhY3QgZmlsZXMgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBzaG91bGRBZGRUb0Fic3RyYWN0RmlsZXNNZW51KGFic3RyYWN0RmlsZXM6IFRBYnN0cmFjdEZpbGVbXSwgc291cmNlOiBzdHJpbmcsIGxlYWY/OiBXb3Jrc3BhY2VMZWFmKTogYm9vbGVhbiB7XG4gICAgaWYgKCFhYnN0cmFjdEZpbGVzLmV2ZXJ5KChhYnN0cmFjdEZpbGUpID0+IGlzRm9sZGVyKGFic3RyYWN0RmlsZSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3VsZEFkZFRvRm9sZGVyc01lbnUoYXNBcnJheU9mRm9sZGVycyhhYnN0cmFjdEZpbGVzKSwgc291cmNlLCBsZWFmKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBmb2xkZXIgbWVudS5cbiAgICpcbiAgICogQHBhcmFtIF9mb2xkZXIgLSBUaGUgZm9sZGVyIHRvIGNoZWNrLlxuICAgKiBAcGFyYW0gX3NvdXJjZSAtIFRoZSBzb3VyY2Ugb2YgdGhlIGZvbGRlci5cbiAgICogQHBhcmFtIF9sZWFmIC0gVGhlIGxlYWYgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGNvbW1hbmQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBmb2xkZXIgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBzaG91bGRBZGRUb0ZvbGRlck1lbnUoX2ZvbGRlcjogVEZvbGRlciwgX3NvdXJjZTogc3RyaW5nLCBfbGVhZj86IFdvcmtzcGFjZUxlYWYpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBjb21tYW5kIHNob3VsZCBiZSBhZGRlZCB0byB0aGUgZm9sZGVycyBtZW51LlxuICAgKlxuICAgKiBAcGFyYW0gX2ZvbGRlcnMgLSBUaGUgZm9sZGVycyB0byBjaGVjay5cbiAgICogQHBhcmFtIF9zb3VyY2UgLSBUaGUgc291cmNlIG9mIHRoZSBmb2xkZXJzLlxuICAgKiBAcGFyYW0gX2xlYWYgLSBUaGUgbGVhZiB0byBjaGVjay5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGZvbGRlcnMgbWVudS5cbiAgICovXG4gIHByb3RlY3RlZCBzaG91bGRBZGRUb0ZvbGRlcnNNZW51KF9mb2xkZXJzOiBURm9sZGVyW10sIF9zb3VyY2U6IHN0cmluZywgX2xlYWY/OiBXb3Jrc3BhY2VMZWFmKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgZm9sZGVycyBjb21tYW5kIGludm9jYXRpb25zLlxuICpcbiAqIEB0eXBlUGFyYW0gVFBsdWdpbiAtIFRoZSB0eXBlIG9mIHRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBiZWxvbmdzIHRvLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9sZGVyc0NvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIEFic3RyYWN0RmlsZXNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBmb2xkZXJzIGNvbW1hbmQgaW52b2NhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbiAtIFRoZSBwbHVnaW4gdGhhdCB0aGUgY29tbWFuZCBpbnZvY2F0aW9uIGJlbG9uZ3MgdG8uXG4gICAqIEBwYXJhbSBmb2xkZXJzIC0gVGhlIGZvbGRlcnMgdG8gaW52b2tlIHRoZSBjb21tYW5kIGZvci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwbHVnaW46IFRQbHVnaW4sIHB1YmxpYyByZWFkb25seSBmb2xkZXJzOiBURm9sZGVyW10pIHtcbiAgICBzdXBlcihwbHVnaW4sIGZvbGRlcnMpO1xuICB9XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3Igc2VxdWVudGlhbCBmb2xkZXJzIGNvbW1hbmQgaW52b2NhdGlvbnMuXG4gKlxuICogQHR5cGVQYXJhbSBUUGx1Z2luIC0gVGhlIHR5cGUgb2YgdGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGJlbG9uZ3MgdG8uXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsRm9sZGVyc0NvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luIGV4dGVuZHMgUGx1Z2luPiBleHRlbmRzIEZvbGRlcnNDb21tYW5kSW52b2NhdGlvbkJhc2U8VFBsdWdpbj4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBzZXF1ZW50aWFsIGZvbGRlcnMgY29tbWFuZCBpbnZvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGx1Z2luIC0gVGhlIHBsdWdpbiB0aGF0IHRoZSBjb21tYW5kIGludm9jYXRpb24gYmVsb25ncyB0by5cbiAgICogQHBhcmFtIGZvbGRlcnMgLSBUaGUgZm9sZGVycyB0byBpbnZva2UgdGhlIGNvbW1hbmQgZm9yLlxuICAgKiBAcGFyYW0gY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGb2xkZXIgLSBUaGUgZnVuY3Rpb24gdG8gY3JlYXRlIGEgY29tbWFuZCBpbnZvY2F0aW9uIGZvciBhIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwbHVnaW46IFRQbHVnaW4sXG4gICAgZm9sZGVyczogVEZvbGRlcltdLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGb2xkZXI6IChmb2xkZXI6IFRGb2xkZXIpID0+IEZvbGRlckNvbW1hbmRJbnZvY2F0aW9uQmFzZTxUUGx1Z2luPlxuICApIHtcbiAgICBzdXBlcihwbHVnaW4sIGZvbGRlcnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgY29tbWFuZCBjYW4gZXhlY3V0ZS5cbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBjYW5FeGVjdXRlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5jYW5FeGVjdXRlKCkgJiYgdGhpcy5mb2xkZXJzLmxlbmd0aCA+IDAgJiYgdGhpcy5mb2xkZXJzLmV2ZXJ5KChmb2xkZXIpID0+IHRoaXMuY3JlYXRlQ29tbWFuZEludm9jYXRpb25Gb3JGb2xkZXIoZm9sZGVyKS5pbnZva2UodHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBjb21tYW5kLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCBmb2xkZXIgb2YgdGhpcy5mb2xkZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZUNvbW1hbmRJbnZvY2F0aW9uRm9yRm9sZGVyKGZvbGRlcikuaW52b2tlQXN5bmMoZmFsc2UpO1xuICAgIH1cbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVlBLHNCQUF3QjtBQUV4Qix3QkFLTztBQUNQLHFDQUlPO0FBT0EsTUFBZSxvQ0FBNEQsaUVBQTJDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPM0gsSUFBYyxTQUFrQjtBQUM5QixlQUFPLDRCQUFTLEtBQUssYUFBYTtBQUFBLEVBQ3BDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT21CLGFBQXNCO0FBQ3ZDLFdBQU8sTUFBTSxXQUFXLEtBQUssQ0FBQyxDQUFDLEtBQUs7QUFBQSxFQUN0QztBQUNGO0FBT08sTUFBTSwrQ0FBdUUsNEJBQXFDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFoSCxZQUNMLFFBQ0EsUUFDaUIsaUNBQ2pCO0FBQ0EsVUFBTSxRQUFRLE1BQU07QUFGSDtBQUFBLEVBR25CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT21CLGFBQXNCO0FBQ3ZDLFdBQU8sTUFBTSxXQUFXLEtBQUssS0FBSyxnQ0FBZ0MsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxF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