obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
175 lines (172 loc) • 19.8 kB
JavaScript
/*
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:__name(()=>extractDefault,"__extractDefault"),process:__name(()=>{const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};return browserProcess},"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&&"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")})();
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Debug_exports = {};
__export(Debug_exports, {
enableLibraryDebuggers: () => enableLibraryDebuggers,
getDebugController: () => getDebugController,
getDebugger: () => getDebugger,
getLibDebugger: () => getLibDebugger,
showInitialDebugMessage: () => showInitialDebugMessage
});
module.exports = __toCommonJS(Debug_exports);
var import_debug = __toESM(__extractDefault(require('debug')), 1);
var import_Library = require('./Library.cjs');
var import_App = require('./obsidian/App.cjs');
var import_PluginId = require('./obsidian/Plugin/PluginId.cjs');
const NAMESPACE_SEPARATOR = ",";
const NEGATED_NAMESPACE_PREFIX = "-";
function enableLibraryDebuggers() {
enableNamespaces([import_Library.LIBRARY_NAME, `${import_Library.LIBRARY_NAME}:*`]);
}
function getDebugController() {
return {
disable: disableNamespaces,
enable: enableNamespaces,
get: getNamespaces,
set: setNamespaces
};
}
function getDebugger(namespace, framesToSkip = 0) {
const key = `${namespace}:${String(framesToSkip)}`;
const debuggersMap = (0, import_App.getObsidianDevUtilsState)(null, "debuggers", /* @__PURE__ */ new Map()).value;
let _debugger = debuggersMap.get(key);
if (!_debugger) {
_debugger = getSharedDebugLibInstance()(namespace);
_debugger.log = (message, ...args) => {
logWithCaller(namespace, framesToSkip, message, ...args);
};
_debugger.printStackTrace = (stackTrace, title) => {
printStackTrace(namespace, stackTrace, title);
};
debuggersMap.set(key, _debugger);
}
return _debugger;
}
function getLibDebugger(namespace) {
const pluginId = (0, import_PluginId.getPluginId)();
const prefix = pluginId === import_PluginId.NO_PLUGIN_ID_INITIALIZED ? "" : `${pluginId}:`;
return getDebugger(`${prefix}${import_Library.LIBRARY_NAME}:${namespace}`);
}
function showInitialDebugMessage(pluginId) {
const isEnabled = getSharedDebugLibInstance().enabled(pluginId);
const state = isEnabled ? "enabled" : "disabled";
const changeAction = isEnabled ? "disable" : "enable";
const namespaces = getNamespaces();
setNamespaces(pluginId);
getDebugger(pluginId)(
`Debug messages for plugin ${pluginId} are ${state}. See https://github.com/mnaoumov/obsidian-dev-utils/blob/main/docs/debugging.md how to ${changeAction} them.`
);
setNamespaces(namespaces);
}
function disableNamespaces(namespaces) {
const set = new Set(getNamespaces());
for (const namespace of toArray(namespaces)) {
if (namespace.startsWith(NEGATED_NAMESPACE_PREFIX)) {
continue;
}
const negatedNamespace = NEGATED_NAMESPACE_PREFIX + namespace;
if (set.has(namespace)) {
set.delete(namespace);
}
set.add(negatedNamespace);
}
setNamespaces(Array.from(set));
}
function enableNamespaces(namespaces) {
const set = new Set(getNamespaces());
for (const namespace of toArray(namespaces)) {
if (!namespace.startsWith(NEGATED_NAMESPACE_PREFIX)) {
const negatedNamespace = NEGATED_NAMESPACE_PREFIX + namespace;
if (set.has(negatedNamespace)) {
set.delete(negatedNamespace);
}
}
set.add(namespace);
}
setNamespaces(Array.from(set));
}
function getNamespaces() {
return toArray(getSharedDebugLibInstance().load() ?? "");
}
function getSharedDebugLibInstance() {
if (typeof window === "undefined") {
return import_debug.default;
}
return (0, import_App.getObsidianDevUtilsState)(null, "debug", import_debug.default).value;
}
function isInObsidian() {
return typeof window !== "undefined";
}
function logWithCaller(namespace, framesToSkip, message, ...args) {
if (!getSharedDebugLibInstance().enabled(namespace)) {
return;
}
const CALLER_LINE_INDEX = 4;
const stackLines = new Error().stack?.split("\n") ?? [];
const callerLine = stackLines[CALLER_LINE_INDEX + framesToSkip] ?? "";
console.debug(message, ...args);
if (isInObsidian()) {
printStackTrace(namespace, callerLine, "Debug message caller");
}
}
function printStackTrace(namespace, stackTrace, title) {
const _debugger = getSharedDebugLibInstance()(namespace);
if (!_debugger.enabled) {
return;
}
if (!stackTrace) {
stackTrace = "(unavailable)";
}
if (!(title ?? "")) {
title = "Caller stack trace";
}
_debugger(title);
const prefix = isInObsidian() ? "StackTraceFakeError\n" : "";
console.debug(`${prefix}${stackTrace}`);
}
function setNamespaces(namespaces) {
getSharedDebugLibInstance().enable(toArray(namespaces).join(NAMESPACE_SEPARATOR));
}
function toArray(namespaces) {
return typeof namespaces === "string" ? namespaces.split(NAMESPACE_SEPARATOR).filter(Boolean) : namespaces.flatMap(toArray);
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
enableLibraryDebuggers,
getDebugController,
getDebugger,
getLibDebugger,
showInitialDebugMessage
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL0RlYnVnLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICpcbiAqIENvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBkZWJ1Z2dpbmcuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z2dlciB9IGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcblxuaW1wb3J0IHR5cGUgeyBEZWJ1Z0NvbnRyb2xsZXIgfSBmcm9tICcuL0RlYnVnQ29udHJvbGxlci50cyc7XG5cbmltcG9ydCB7IExJQlJBUllfTkFNRSB9IGZyb20gJy4vTGlicmFyeS50cyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUgfSBmcm9tICcuL29ic2lkaWFuL0FwcC50cyc7XG5pbXBvcnQge1xuICBnZXRQbHVnaW5JZCxcbiAgTk9fUExVR0lOX0lEX0lOSVRJQUxJWkVEXG59IGZyb20gJy4vb2JzaWRpYW4vUGx1Z2luL1BsdWdpbklkLnRzJztcblxuaW50ZXJmYWNlIERlYnVnZ2VyRXggZXh0ZW5kcyBEZWJ1Z2dlciB7XG4gIHByaW50U3RhY2tUcmFjZShzdGFja1RyYWNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdm9pZDtcbn1cblxuY29uc3QgTkFNRVNQQUNFX1NFUEFSQVRPUiA9ICcsJztcbmNvbnN0IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCA9ICctJztcblxuLyoqXG4gKiBFbmFibGVzIHRoZSBkZWJ1Z2dlcnMgZm9yIHRoZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCBsaWJyYXJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlTGlicmFyeURlYnVnZ2VycygpOiB2b2lkIHtcbiAgZW5hYmxlTmFtZXNwYWNlcyhbTElCUkFSWV9OQU1FLCBgJHtMSUJSQVJZX05BTUV9OipgXSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlYnVnIGNvbnRyb2xsZXIuXG4gKlxuICogQHJldHVybnMgQSBkZWJ1ZyBjb250cm9sbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVidWdDb250cm9sbGVyKCk6IERlYnVnQ29udHJvbGxlciB7XG4gIHJldHVybiB7XG4gICAgZGlzYWJsZTogZGlzYWJsZU5hbWVzcGFjZXMsXG4gICAgZW5hYmxlOiBlbmFibGVOYW1lc3BhY2VzLFxuICAgIGdldDogZ2V0TmFtZXNwYWNlcyxcbiAgICBzZXQ6IHNldE5hbWVzcGFjZXNcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZGVidWdnZXIgaW5zdGFuY2Ugd2l0aCBhIGxvZyBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIHRoZSBjYWxsZXIncyBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyLlxuICpcbiAqIEBwYXJhbSBuYW1lc3BhY2UgLSBUaGUgbmFtZXNwYWNlIGZvciB0aGUgZGVidWdnZXIgaW5zdGFuY2UuXG4gKiBAcGFyYW0gZnJhbWVzVG9Ta2lwIC0gVGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcCBpbiB0aGUgc3RhY2sgdHJhY2UuXG4gKiBAcmV0dXJucyBBIGRlYnVnZ2VyIGluc3RhbmNlIHdpdGggYSBsb2cgZnVuY3Rpb24gdGhhdCBpbmNsdWRlcyB0aGUgY2FsbGVyJ3MgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERlYnVnZ2VyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXAgPSAwKTogRGVidWdnZXJFeCB7XG4gIGNvbnN0IGtleSA9IGAke25hbWVzcGFjZX06JHtTdHJpbmcoZnJhbWVzVG9Ta2lwKX1gO1xuICBjb25zdCBkZWJ1Z2dlcnNNYXAgPSBnZXRPYnNpZGlhbkRldlV0aWxzU3RhdGUobnVsbCwgJ2RlYnVnZ2VycycsIG5ldyBNYXA8c3RyaW5nLCBEZWJ1Z2dlckV4PigpKS52YWx1ZTtcbiAgbGV0IF9kZWJ1Z2dlciA9IGRlYnVnZ2Vyc01hcC5nZXQoa2V5KTtcbiAgaWYgKCFfZGVidWdnZXIpIHtcbiAgICBfZGVidWdnZXIgPSBnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkobmFtZXNwYWNlKSBhcyBEZWJ1Z2dlckV4O1xuICAgIF9kZWJ1Z2dlci5sb2cgPSAobWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkID0+IHtcbiAgICAgIGxvZ1dpdGhDYWxsZXIobmFtZXNwYWNlLCBmcmFtZXNUb1NraXAsIG1lc3NhZ2UsIC4uLmFyZ3MpO1xuICAgIH07XG4gICAgX2RlYnVnZ2VyLnByaW50U3RhY2tUcmFjZSA9IChzdGFja1RyYWNlLCB0aXRsZSk6IHZvaWQgPT4ge1xuICAgICAgcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZSwgc3RhY2tUcmFjZSwgdGl0bGUpO1xuICAgIH07XG5cbiAgICBkZWJ1Z2dlcnNNYXAuc2V0KGtleSwgX2RlYnVnZ2VyKTtcbiAgfVxuXG4gIHJldHVybiBfZGVidWdnZXI7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGRlYnVnZ2VyIGluc3RhbmNlIGZvciB0aGUgYG9ic2lkaWFuLWRldi11dGlsc2AgbGlicmFyeS5cbiAqXG4gKiBAcGFyYW0gbmFtZXNwYWNlIC0gVGhlIG5hbWVzcGFjZSBmb3IgdGhlIGRlYnVnZ2VyIGluc3RhbmNlLlxuICogQHJldHVybnMgQSBkZWJ1Z2dlciBpbnN0YW5jZSBmb3IgdGhlIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMaWJEZWJ1Z2dlcihuYW1lc3BhY2U6IHN0cmluZyk6IERlYnVnZ2VyRXgge1xuICBjb25zdCBwbHVnaW5JZCA9IGdldFBsdWdpbklkKCk7XG4gIGNvbnN0IHByZWZpeCA9IHBsdWdpbklkID09PSBOT19QTFVHSU5fSURfSU5JVElBTElaRUQgPyAnJyA6IGAke3BsdWdpbklkfTpgO1xuICByZXR1cm4gZ2V0RGVidWdnZXIoYCR7cHJlZml4fSR7TElCUkFSWV9OQU1FfToke25hbWVzcGFjZX1gKTtcbn1cblxuLyoqXG4gKiBTaG93cyBhbiBpbml0aWFsIGRlYnVnIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIHBsdWdpbiBJRC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNob3dJbml0aWFsRGVidWdNZXNzYWdlKHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgaXNFbmFibGVkID0gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZWQocGx1Z2luSWQpO1xuICBjb25zdCBzdGF0ZSA9IGlzRW5hYmxlZCA/ICdlbmFibGVkJyA6ICdkaXNhYmxlZCc7XG4gIGNvbnN0IGNoYW5nZUFjdGlvbiA9IGlzRW5hYmxlZCA/ICdkaXNhYmxlJyA6ICdlbmFibGUnO1xuICBjb25zdCBuYW1lc3BhY2VzID0gZ2V0TmFtZXNwYWNlcygpO1xuICBzZXROYW1lc3BhY2VzKHBsdWdpbklkKTtcbiAgZ2V0RGVidWdnZXIocGx1Z2luSWQpKFxuICAgIGBEZWJ1ZyBtZXNzYWdlcyBmb3IgcGx1Z2luICR7cGx1Z2luSWR9IGFyZSAke3N0YXRlfS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tbmFvdW1vdi9vYnNpZGlhbi1kZXYtdXRpbHMvYmxvYi9tYWluL2RvY3MvZGVidWdnaW5nLm1kIGhvdyB0byAke2NoYW5nZUFjdGlvbn0gdGhlbS5gXG4gICk7XG4gIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlcyk7XG59XG5cbmZ1bmN0aW9uIGRpc2FibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmIChuYW1lc3BhY2Uuc3RhcnRzV2l0aChORUdBVEVEX05BTUVTUEFDRV9QUkVGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICBpZiAoc2V0LmhhcyhuYW1lc3BhY2UpKSB7XG4gICAgICBzZXQuZGVsZXRlKG5hbWVzcGFjZSk7XG4gICAgfVxuICAgIHNldC5hZGQobmVnYXRlZE5hbWVzcGFjZSk7XG4gIH1cbiAgc2V0TmFtZXNwYWNlcyhBcnJheS5mcm9tKHNldCkpO1xufVxuXG5mdW5jdGlvbiBlbmFibGVOYW1lc3BhY2VzKG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogdm9pZCB7XG4gIGNvbnN0IHNldCA9IG5ldyBTZXQoZ2V0TmFtZXNwYWNlcygpKTtcbiAgZm9yIChjb25zdCBuYW1lc3BhY2Ugb2YgdG9BcnJheShuYW1lc3BhY2VzKSkge1xuICAgIGlmICghbmFtZXNwYWNlLnN0YXJ0c1dpdGgoTkVHQVRFRF9OQU1FU1BBQ0VfUFJFRklYKSkge1xuICAgICAgY29uc3QgbmVnYXRlZE5hbWVzcGFjZSA9IE5FR0FURURfTkFNRVNQQUNFX1BSRUZJWCArIG5hbWVzcGFjZTtcbiAgICAgIGlmIChzZXQuaGFzKG5lZ2F0ZWROYW1lc3BhY2UpKSB7XG4gICAgICAgIHNldC5kZWxldGUobmVnYXRlZE5hbWVzcGFjZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHNldC5hZGQobmFtZXNwYWNlKTtcbiAgfVxuICBzZXROYW1lc3BhY2VzKEFycmF5LmZyb20oc2V0KSk7XG59XG5cbmZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKTogc3RyaW5nW10ge1xuICByZXR1cm4gdG9BcnJheShnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkubG9hZCgpID8/ICcnKTtcbn1cblxuZnVuY3Rpb24gZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpOiB0eXBlb2YgZGVidWcge1xuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZGVidWc7XG4gIH1cbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZShudWxsLCAnZGVidWcnLCBkZWJ1ZykudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGlzSW5PYnNpZGlhbigpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnO1xufVxuXG5mdW5jdGlvbiBsb2dXaXRoQ2FsbGVyKG5hbWVzcGFjZTogc3RyaW5nLCBmcmFtZXNUb1NraXA6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgaWYgKCFnZXRTaGFyZWREZWJ1Z0xpYkluc3RhbmNlKCkuZW5hYmxlZChuYW1lc3BhY2UpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjYWxsZXIgbGluZSBpbmRleCBpcyA0IGJlY2F1c2UgdGhlIGNhbGwgc3RhY2sgaXMgYXMgZm9sbG93czpcbiAgICpcbiAgICogMDogRXJyb3JcbiAgICogMTogICAgIGF0IGxvZ1dpdGhDYWxsZXIgKD86Pzo/KVxuICAgKiAyOiAgICAgYXQgZGVidWdJbnN0YW5jZS5sb2cgKD86Pzo/KVxuICAgKiAzOiAgICAgYXQgZGVidWcgKD86Pzo/KVxuICAgKiA0OiAgICAgYXQgZnVuY3Rpb25OYW1lIChwYXRoL3RvL2NhbGxlci5qczo/Oj8pXG4gICAqL1xuICBjb25zdCBDQUxMRVJfTElORV9JTkRFWCA9IDQ7XG5cbiAgY29uc3Qgc3RhY2tMaW5lcyA9IG5ldyBFcnJvcigpLnN0YWNrPy5zcGxpdCgnXFxuJykgPz8gW107XG4gIGNvbnN0IGNhbGxlckxpbmUgPSBzdGFja0xpbmVzW0NBTExFUl9MSU5FX0lOREVYICsgZnJhbWVzVG9Ta2lwXSA/PyAnJztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgY29uc29sZS5kZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKTtcbiAgaWYgKGlzSW5PYnNpZGlhbigpKSB7XG4gICAgcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZSwgY2FsbGVyTGluZSwgJ0RlYnVnIG1lc3NhZ2UgY2FsbGVyJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcHJpbnRTdGFja1RyYWNlKG5hbWVzcGFjZTogc3RyaW5nLCBzdGFja1RyYWNlOiBzdHJpbmcsIHRpdGxlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IF9kZWJ1Z2dlciA9IGdldFNoYXJlZERlYnVnTGliSW5zdGFuY2UoKShuYW1lc3BhY2UpO1xuXG4gIGlmICghX2RlYnVnZ2VyLmVuYWJsZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIXN0YWNrVHJhY2UpIHtcbiAgICBzdGFja1RyYWNlID0gJyh1bmF2YWlsYWJsZSknO1xuICB9XG4gIGlmICghKHRpdGxlID8/ICcnKSkge1xuICAgIHRpdGxlID0gJ0NhbGxlciBzdGFjayB0cmFjZSc7XG4gIH1cblxuICBfZGVidWdnZXIodGl0bGUpO1xuICBjb25zdCBwcmVmaXggPSBpc0luT2JzaWRpYW4oKSA/ICdTdGFja1RyYWNlRmFrZUVycm9yXFxuJyA6ICcnO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICBjb25zb2xlLmRlYnVnKGAke3ByZWZpeH0ke3N0YWNrVHJhY2V9YCk7XG59XG5cbi8qKlxuICogU2V0cyB0aGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKlxuICogQHBhcmFtIG5hbWVzcGFjZXMgLSBUaGUgbmFtZXNwYWNlcyB0byBlbmFibGUuXG4gKi9cbmZ1bmN0aW9uIHNldE5hbWVzcGFjZXMobmFtZXNwYWNlczogc3RyaW5nIHwgc3RyaW5nW10pOiB2b2lkIHtcbiAgZ2V0U2hhcmVkRGVidWdMaWJJbnN0YW5jZSgpLmVuYWJsZSh0b0FycmF5KG5hbWVzcGFjZXMpLmpvaW4oTkFNRVNQQUNFX1NFUEFSQVRPUikpO1xufVxuXG5mdW5jdGlvbiB0b0FycmF5KG5hbWVzcGFjZXM6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gdHlwZW9mIG5hbWVzcGFjZXMgPT09ICdzdHJpbmcnID8gbmFtZXNwYWNlcy5zcGxpdChOQU1FU1BBQ0VfU0VQQVJBVE9SKS5maWx0ZXIoQm9vbGVhbikgOiBuYW1lc3BhY2VzLmZsYXRNYXAodG9BcnJheSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLG1CQUFrQjtBQUlsQixxQkFBNkI7QUFDN0IsaUJBQXlDO0FBQ3pDLHNCQUdPO0FBTVAsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSwyQkFBMkI7QUFLMUIsU0FBUyx5QkFBK0I7QUFDN0MsbUJBQWlCLENBQUMsNkJBQWMsR0FBRywyQkFBWSxJQUFJLENBQUM7QUFDdEQ7QUFPTyxTQUFTLHFCQUFzQztBQUNwRCxTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsSUFDVCxRQUFRO0FBQUEsSUFDUixLQUFLO0FBQUEsSUFDTCxLQUFLO0FBQUEsRUFDUDtBQUNGO0FBU08sU0FBUyxZQUFZLFdBQW1CLGVBQWUsR0FBZTtBQUMzRSxRQUFNLE1BQU0sR0FBRyxTQUFTLElBQUksT0FBTyxZQUFZLENBQUM7QUFDaEQsUUFBTSxtQkFBZSxxQ0FBeUIsTUFBTSxhQUFhLG9CQUFJLElBQXdCLENBQUMsRUFBRTtBQUNoRyxNQUFJLFlBQVksYUFBYSxJQUFJLEdBQUc7QUFDcEMsTUFBSSxDQUFDLFdBQVc7QUFDZCxnQkFBWSwwQkFBMEIsRUFBRSxTQUFTO0FBQ2pELGNBQVUsTUFBTSxDQUFDLFlBQW9CLFNBQTBCO0FBQzdELG9CQUFjLFdBQVcsY0FBYyxTQUFTLEdBQUcsSUFBSTtBQUFBLElBQ3pEO0FBQ0EsY0FBVSxrQkFBa0IsQ0FBQyxZQUFZLFVBQWdCO0FBQ3ZELHNCQUFnQixXQUFXLFlBQVksS0FBSztBQUFBLElBQzlDO0FBRUEsaUJBQWEsSUFBSSxLQUFLLFNBQVM7QUFBQSxFQUNqQztBQUVBLFNBQU87QUFDVDtBQVFPLFNBQVMsZUFBZSxXQUErQjtBQUM1RCxRQUFNLGVBQVcsNkJBQVk7QUFDN0IsUUFBTSxTQUFTLGFBQWEsMkNBQTJCLEtBQUssR0FBRyxRQUFRO0FBQ3ZFLFNBQU8sWUFBWSxHQUFHLE1BQU0sR0FBRywyQkFBWSxJQUFJLFNBQVMsRUFBRTtBQUM1RDtBQU9PLFNBQVMsd0JBQXdCLFVBQXdCO0FBQzlELFFBQU0sWUFBWSwwQkFBMEIsRUFBRSxRQUFRLFFBQVE7QUFDOUQsUUFBTSxRQUFRLFlBQVksWUFBWTtBQUN0QyxRQUFNLGVBQWUsWUFBWSxZQUFZO0FBQzdDLFFBQU0sYUFBYSxjQUFjO0FBQ2pDLGdCQUFjLFFBQVE7QUFDdEIsY0FBWSxRQUFRO0FBQUEsSUFDbEIsNkJBQTZCLFFBQVEsUUFBUSxLQUFLLDJGQUEyRixZQUFZO0FBQUEsRUFDM0o7QUFDQSxnQkFBYyxVQUFVO0FBQzFCO0FBRUEsU0FBUyxrQkFBa0IsWUFBcUM7QUFDOUQsUUFBTSxNQUFNLElBQUksSUFBSSxjQUFjLENBQUM7QUFDbkMsYUFBVyxhQUFhLFFBQVEsVUFBVSxHQUFHO0FBQzNDLFFBQUksVUFBVSxXQUFXLHdCQUF3QixHQUFHO0FBQ2xEO0FBQUEsSUFDRjtBQUNBLFVBQU0sbUJBQW1CLDJCQUEyQjtBQUNwRCxRQUFJLElBQUksSUFBSSxTQUFTLEdBQUc7QUFDdEIsVUFBSSxPQUFPLFNBQVM7QUFBQSxJQUN0QjtBQUNBLFFBQUksSUFBSSxnQkFBZ0I7QUFBQSxFQUMxQjtBQUNBLGdCQUFjLE1BQU0sS0FBSyxHQUFHLENBQUM7QUFDL0I7QUFFQSxTQUFTLGlCQUFpQixZQUFxQztBQUM3RCxRQUFNLE1BQU0sSUFBSSxJQUFJLGNBQWMsQ0FBQztBQUNuQyxhQUFXLGFBQWEsUUFBUSxVQUFVLEdBQUc7QUFDM0MsUUFBSSxDQUFDLFVBQVUsV0FBVyx3QkFBd0IsR0FBRztBQUNuRCxZQUFNLG1CQUFtQiwyQkFBMkI7QUFDcEQsVUFBSSxJQUFJLElBQUksZ0JBQWdCLEdBQUc7QUFDN0IsWUFBSSxPQUFPLGdCQUFnQjtBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUNBLFFBQUksSUFBSSxTQUFTO0FBQUEsRUFDbkI7QUFDQSxnQkFBYyxNQUFNLEtBQUssR0FBRyxDQUFDO0FBQy9CO0FBRUEsU0FBUyxnQkFBMEI7QUFDakMsU0FBTyxRQUFRLDBCQUEwQixFQUFFLEtBQUssS0FBSyxFQUFFO0FBQ3pEO0FBRUEsU0FBUyw0QkFBMEM7QUFDakQsTUFBSSxPQUFPLFdBQVcsYUFBYTtBQUNqQyxXQUFPLGFBQUFBO0FBQUEsRUFDVDtBQUNBLGFBQU8scUNBQXlCLE1BQU0sU0FBUyxhQUFBQSxPQUFLLEVBQUU7QUFDeEQ7QUFFQSxTQUFTLGVBQXdCO0FBQy9CLFNBQU8sT0FBTyxXQUFXO0FBQzNCO0FBRUEsU0FBUyxjQUFjLFdBQW1CLGNBQXNCLFlBQW9CLE1BQXVCO0FBQ3pHLE1BQUksQ0FBQywwQkFBMEIsRUFBRSxRQUFRLFNBQVMsR0FBRztBQUNuRDtBQUFBLEVBQ0Y7QUFXQSxRQUFNLG9CQUFvQjtBQUUxQixRQUFNLGFBQWEsSUFBSSxNQUFNLEVBQUUsT0FBTyxNQUFNLElBQUksS0FBSyxDQUFDO0FBQ3RELFFBQU0sYUFBYSxXQUFXLG9CQUFvQixZQUFZLEtBQUs7QUFFbkUsVUFBUSxNQUFNLFNBQVMsR0FBRyxJQUFJO0FBQzlCLE1BQUksYUFBYSxHQUFHO0FBQ2xCLG9CQUFnQixXQUFXLFlBQVksc0JBQXNCO0FBQUEsRUFDL0Q7QUFDRjtBQUVBLFNBQVMsZ0JBQWdCLFdBQW1CLFlBQW9CLE9BQXNCO0FBQ3BGLFFBQU0sWUFBWSwwQkFBMEIsRUFBRSxTQUFTO0FBRXZELE1BQUksQ0FBQyxVQUFVLFNBQVM7QUFDdEI7QUFBQSxFQUNGO0FBRUEsTUFBSSxDQUFDLFlBQVk7QUFDZixpQkFBYTtBQUFBLEVBQ2Y7QUFDQSxNQUFJLEVBQUUsU0FBUyxLQUFLO0FBQ2xCLFlBQVE7QUFBQSxFQUNWO0FBRUEsWUFBVSxLQUFLO0FBQ2YsUUFBTSxTQUFTLGFBQWEsSUFBSSwwQkFBMEI7QUFFMUQsVUFBUSxNQUFNLEdBQUcsTUFBTSxHQUFHLFVBQVUsRUFBRTtBQUN4QztBQU9BLFNBQVMsY0FBYyxZQUFxQztBQUMxRCw0QkFBMEIsRUFBRSxPQUFPLFFBQVEsVUFBVSxFQUFFLEtBQUssbUJBQW1CLENBQUM7QUFDbEY7QUFFQSxTQUFTLFFBQVEsWUFBeUM7QUFDeEQsU0FBTyxPQUFPLGVBQWUsV0FBVyxXQUFXLE1BQU0sbUJBQW1CLEVBQUUsT0FBTyxPQUFPLElBQUksV0FBVyxRQUFRLE9BQU87QUFDNUg7IiwKICAibmFtZXMiOiBbImRlYnVnIl0KfQo=