@mnaoumov/obsidian-dev-toolkit 2.1.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +5 -1
  2. package/bin/archive-demo-vault.mjs +8 -0
  3. package/bin/generate-coverage-badge.mjs +8 -0
  4. package/bundlers/esbuild-impl/feature-options/package.json +6 -0
  5. package/bundlers/obsidian-cli-reload/package.json +6 -0
  6. package/bundlers/obsidian-plugin-build/package.json +6 -0
  7. package/bundlers/obsidian-plugin-features/package.json +6 -0
  8. package/bundlers/obsidian-plugin-transforms/package.json +6 -0
  9. package/bundlers/obsidian-plugin-webpack-loader/package.json +6 -0
  10. package/bundlers/obsidian-plugins-folder-deployment/package.json +6 -0
  11. package/bundlers/parcel/package.json +6 -0
  12. package/bundlers/rollup/package.json +6 -0
  13. package/bundlers/rollup-compatible/package.json +6 -0
  14. package/bundlers/rollup-compatible-features/package.json +6 -0
  15. package/bundlers/vite/package.json +6 -0
  16. package/bundlers/webpack/package.json +6 -0
  17. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +3 -188
  18. package/dist/lib/cjs/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +2 -18
  19. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.cjs +173 -0
  20. package/dist/lib/cjs/bundlers/esbuild-impl/feature-options.d.cts +60 -0
  21. package/dist/lib/cjs/bundlers/esbuild-impl/index.cjs +4 -1
  22. package/dist/lib/cjs/bundlers/esbuild-impl/index.d.cts +1 -0
  23. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +30 -82
  24. package/dist/lib/cjs/bundlers/esbuild-impl/obsidian-plugin-builder.d.cts +7 -24
  25. package/dist/lib/cjs/bundlers/index.cjs +39 -3
  26. package/dist/lib/cjs/bundlers/index.d.cts +12 -0
  27. package/dist/lib/cjs/bundlers/obsidian-cli-reload.cjs +182 -0
  28. package/dist/lib/cjs/bundlers/obsidian-cli-reload.d.cts +37 -0
  29. package/dist/lib/cjs/bundlers/obsidian-plugin-build.cjs +278 -0
  30. package/dist/lib/cjs/bundlers/obsidian-plugin-build.d.cts +217 -0
  31. package/dist/lib/cjs/bundlers/obsidian-plugin-features.cjs +242 -0
  32. package/dist/lib/cjs/bundlers/obsidian-plugin-features.d.cts +186 -0
  33. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.cjs +306 -0
  34. package/dist/lib/cjs/bundlers/obsidian-plugin-transforms.d.cts +231 -0
  35. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.cjs +182 -0
  36. package/dist/lib/cjs/bundlers/obsidian-plugin-webpack-loader.d.cts +47 -0
  37. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.cjs +320 -0
  38. package/dist/lib/cjs/bundlers/obsidian-plugins-folder-deployment.d.cts +44 -0
  39. package/dist/lib/cjs/bundlers/parcel.cjs +462 -0
  40. package/dist/lib/cjs/bundlers/parcel.d.cts +128 -0
  41. package/dist/lib/cjs/bundlers/rollup-compatible-features.cjs +181 -0
  42. package/dist/lib/cjs/bundlers/rollup-compatible-features.d.cts +128 -0
  43. package/dist/lib/cjs/bundlers/rollup-compatible.cjs +138 -0
  44. package/dist/lib/cjs/bundlers/rollup-compatible.d.cts +84 -0
  45. package/dist/lib/cjs/bundlers/rollup.cjs +218 -0
  46. package/dist/lib/cjs/bundlers/rollup.d.cts +99 -0
  47. package/dist/lib/cjs/bundlers/vite.cjs +229 -0
  48. package/dist/lib/cjs/bundlers/vite.d.cts +105 -0
  49. package/dist/lib/cjs/bundlers/webpack.cjs +354 -0
  50. package/dist/lib/cjs/bundlers/webpack.d.cts +133 -0
  51. package/dist/lib/cjs/demo-vault-cli.cjs +131 -0
  52. package/dist/lib/cjs/demo-vault-cli.d.cts +15 -0
  53. package/dist/lib/cjs/index.cjs +4 -1
  54. package/dist/lib/cjs/index.d.cts +1 -0
  55. package/dist/lib/cjs/test-runners/coverage-badge-cli.cjs +160 -0
  56. package/dist/lib/cjs/test-runners/coverage-badge-cli.d.cts +25 -0
  57. package/dist/lib/cjs/test-runners/coverage-badge.cjs +279 -0
  58. package/dist/lib/cjs/test-runners/coverage-badge.d.cts +143 -0
  59. package/dist/lib/cjs/test-runners/e2e-runner-support.cjs +170 -0
  60. package/dist/lib/cjs/test-runners/e2e-runner-support.d.cts +36 -0
  61. package/dist/lib/cjs/test-runners/index.cjs +18 -3
  62. package/dist/lib/cjs/test-runners/index.d.cts +5 -0
  63. package/dist/lib/cjs/test-runners/obsidian-test-runner.cjs +147 -0
  64. package/dist/lib/cjs/test-runners/obsidian-test-runner.d.cts +42 -0
  65. package/dist/lib/cjs/test-runners/wdio-obsidian.cjs +205 -0
  66. package/dist/lib/cjs/test-runners/wdio-obsidian.d.cts +199 -0
  67. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +2 -18
  68. package/dist/lib/esm/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +3 -192
  69. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.d.mts +60 -0
  70. package/dist/lib/esm/bundlers/esbuild-impl/feature-options.mjs +82 -0
  71. package/dist/lib/esm/bundlers/esbuild-impl/index.d.mts +1 -0
  72. package/dist/lib/esm/bundlers/esbuild-impl/index.mjs +3 -1
  73. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.d.mts +7 -24
  74. package/dist/lib/esm/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +41 -87
  75. package/dist/lib/esm/bundlers/index.d.mts +12 -0
  76. package/dist/lib/esm/bundlers/index.mjs +26 -2
  77. package/dist/lib/esm/bundlers/obsidian-cli-reload.d.mts +37 -0
  78. package/dist/lib/esm/bundlers/obsidian-cli-reload.mjs +83 -0
  79. package/dist/lib/esm/bundlers/obsidian-plugin-build.d.mts +217 -0
  80. package/dist/lib/esm/bundlers/obsidian-plugin-build.mjs +166 -0
  81. package/dist/lib/esm/bundlers/obsidian-plugin-features.d.mts +186 -0
  82. package/dist/lib/esm/bundlers/obsidian-plugin-features.mjs +126 -0
  83. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.d.mts +231 -0
  84. package/dist/lib/esm/bundlers/obsidian-plugin-transforms.mjs +194 -0
  85. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.d.mts +47 -0
  86. package/dist/lib/esm/bundlers/obsidian-plugin-webpack-loader.mjs +89 -0
  87. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.d.mts +44 -0
  88. package/dist/lib/esm/bundlers/obsidian-plugins-folder-deployment.mjs +228 -0
  89. package/dist/lib/esm/bundlers/parcel.d.mts +128 -0
  90. package/dist/lib/esm/bundlers/parcel.mjs +361 -0
  91. package/dist/lib/esm/bundlers/rollup-compatible-features.d.mts +128 -0
  92. package/dist/lib/esm/bundlers/rollup-compatible-features.mjs +93 -0
  93. package/dist/lib/esm/bundlers/rollup-compatible.d.mts +84 -0
  94. package/dist/lib/esm/bundlers/rollup-compatible.mjs +43 -0
  95. package/dist/lib/esm/bundlers/rollup.d.mts +99 -0
  96. package/dist/lib/esm/bundlers/rollup.mjs +130 -0
  97. package/dist/lib/esm/bundlers/vite.d.mts +105 -0
  98. package/dist/lib/esm/bundlers/vite.mjs +144 -0
  99. package/dist/lib/esm/bundlers/webpack.d.mts +133 -0
  100. package/dist/lib/esm/bundlers/webpack.mjs +259 -0
  101. package/dist/lib/esm/demo-vault-cli.d.mts +15 -0
  102. package/dist/lib/esm/demo-vault-cli.mjs +23 -0
  103. package/dist/lib/esm/index.d.mts +1 -0
  104. package/dist/lib/esm/index.mjs +3 -1
  105. package/dist/lib/esm/test-runners/coverage-badge-cli.d.mts +25 -0
  106. package/dist/lib/esm/test-runners/coverage-badge-cli.mjs +51 -0
  107. package/dist/lib/esm/test-runners/coverage-badge.d.mts +143 -0
  108. package/dist/lib/esm/test-runners/coverage-badge.mjs +181 -0
  109. package/dist/lib/esm/test-runners/e2e-runner-support.d.mts +36 -0
  110. package/dist/lib/esm/test-runners/e2e-runner-support.mjs +61 -0
  111. package/dist/lib/esm/test-runners/index.d.mts +5 -0
  112. package/dist/lib/esm/test-runners/index.mjs +12 -2
  113. package/dist/lib/esm/test-runners/obsidian-test-runner.d.mts +42 -0
  114. package/dist/lib/esm/test-runners/obsidian-test-runner.mjs +52 -0
  115. package/dist/lib/esm/test-runners/wdio-obsidian.d.mts +199 -0
  116. package/dist/lib/esm/test-runners/wdio-obsidian.mjs +110 -0
  117. package/package.json +102 -4
  118. package/test-runners/coverage-badge/package.json +6 -0
  119. package/test-runners/coverage-badge-cli/package.json +6 -0
  120. package/test-runners/e2e-runner-support/package.json +6 -0
  121. package/test-runners/obsidian-test-runner/package.json +6 -0
  122. package/test-runners/wdio-obsidian/package.json +6 -0
  123. package/tsconfig/preact.json +7 -0
  124. package/tsconfig/react.json +7 -0
  125. package/tsconfig/solid.json +7 -0
  126. package/tsconfig/svelte.json +7 -0
  127. package/tsconfig/vue.json +7 -0
  128. package/types/styles.d.ts +32 -0
  129. package/types/wasm.d.ts +11 -0
@@ -0,0 +1,144 @@
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
+ import {
7
+ BuildMode,
8
+ cleanObsidianPluginDistFolder,
9
+ completeObsidianPluginDistFolder,
10
+ getObsidianPluginBanner,
11
+ resolveObsidianPluginBuildContext
12
+ } from "./obsidian-plugin-build.mjs";
13
+ import {
14
+ getFrameworkDefines,
15
+ getJsxImportSource,
16
+ isPostcssNeeded
17
+ } from "./obsidian-plugin-features.mjs";
18
+ import { loadPostcssConfig } from "./obsidian-plugin-transforms.mjs";
19
+ import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
20
+ import {
21
+ createRollupCompatibleFeaturePlugin,
22
+ createUnpluginVuePlugin
23
+ } from "./rollup-compatible-features.mjs";
24
+ import {
25
+ combineExternal,
26
+ renameCssAssets
27
+ } from "./rollup-compatible.mjs";
28
+ function getViteBuildMode(userConfig, env) {
29
+ return userConfig.build?.watch || env.mode === "development" ? BuildMode.Development : BuildMode.Production;
30
+ }
31
+ function getViteConfigDefaults(userConfig, buildContext) {
32
+ const build = userConfig.build ?? {};
33
+ const rolldownOptions = build.rolldownOptions ?? build.rollupOptions ?? {};
34
+ const output = Array.isArray(rolldownOptions.output) ? void 0 : rolldownOptions.output ?? {};
35
+ return {
36
+ build: {
37
+ // An Obsidian release ships `main.js` and `styles.css` and nothing else, so any asset emitted beside
38
+ // the bundle is a file the installed plugin looks for and does not find.
39
+ assetsInlineLimit: build.assetsInlineLimit ?? Number.MAX_SAFE_INTEGER,
40
+ // eslint-disable-next-line unicorn/name-replacements -- `emptyOutDir` is the name vite's config reads.
41
+ emptyOutDir: false,
42
+ lib: build.lib ?? {
43
+ cssFileName: "styles",
44
+ entry: buildContext.entryPoint,
45
+ fileName: () => "main.js",
46
+ formats: ["cjs"]
47
+ },
48
+ minify: build.minify ?? buildContext.isProductionBuild,
49
+ // eslint-disable-next-line unicorn/name-replacements -- `outDir` is the name vite's config reads.
50
+ outDir: buildContext.distFolder,
51
+ rolldownOptions: {
52
+ external: combineExternal(rolldownOptions.external),
53
+ ...output !== void 0 && {
54
+ output: {
55
+ // `postBanner` rather than `banner`: it is added after minification, which strips an ordinary comment.
56
+ ...output.banner === void 0 && output.postBanner === void 0 && { postBanner: getObsidianPluginBanner("vite") },
57
+ // An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
58
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- A consumer's config may still set the deprecated option, which then wins.
59
+ ...output.codeSplitting === void 0 && output.inlineDynamicImports === void 0 && { codeSplitting: false }
60
+ }
61
+ }
62
+ },
63
+ sourcemap: build.sourcemap ?? (!buildContext.isProductionBuild && "inline")
64
+ }
65
+ };
66
+ }
67
+ function getViteFeatureConfig(params) {
68
+ const { features, isProductionBuild, postcssConfig, userConfig } = params;
69
+ const config = {};
70
+ const userDefine = userConfig.define ?? {};
71
+ const define = Object.fromEntries(
72
+ Object.entries(getFrameworkDefines({ framework: features.framework, isProductionBuild })).filter(([expression]) => !Object.hasOwn(userDefine, expression))
73
+ );
74
+ if (Object.keys(define).length > 0) {
75
+ config.define = define;
76
+ }
77
+ const jsxImportSource = getJsxImportSource(features.framework);
78
+ if (jsxImportSource !== void 0 && userConfig.oxc !== false && userConfig.oxc?.jsx === void 0) {
79
+ config.oxc = { jsx: { development: !isProductionBuild, importSource: jsxImportSource, runtime: "automatic" } };
80
+ }
81
+ if (postcssConfig && postcssConfig.plugins.length > 0 && userConfig.css?.postcss === void 0) {
82
+ config.css = { postcss: { plugins: [...postcssConfig.plugins] } };
83
+ }
84
+ return config;
85
+ }
86
+ function obsidianPluginVite(options = {}) {
87
+ const state = {
88
+ buildContext: void 0,
89
+ isDistFolderCleaned: false
90
+ };
91
+ function getBuildContext() {
92
+ if (!state.buildContext) {
93
+ throw new Error("The obsidian-plugin vite plugin has not resolved its build context: its `config` hook did not run.");
94
+ }
95
+ return state.buildContext;
96
+ }
97
+ const featurePlugin = createRollupCompatibleFeaturePlugin({
98
+ features: options,
99
+ isProductionBuild: () => getBuildContext().isProductionBuild,
100
+ shouldCompileStylesheets: false,
101
+ shouldReplaceDefines: false
102
+ });
103
+ const plugin = {
104
+ apply: "build",
105
+ async config(userConfig, env) {
106
+ state.buildContext = await resolveObsidianPluginBuildContext({
107
+ ...options,
108
+ ...userConfig.build?.outDir !== void 0 && { distFolder: userConfig.build.outDir },
109
+ mode: options.mode ?? getViteBuildMode(userConfig, env)
110
+ });
111
+ const { isProductionBuild } = state.buildContext;
112
+ const postcssConfig = isPostcssNeeded(options.styles) ? await loadPostcssConfig({ isProductionBuild, styles: options.styles ?? {} }) : void 0;
113
+ const featureConfig = getViteFeatureConfig({ features: options, isProductionBuild, postcssConfig, userConfig });
114
+ const config = getViteConfigDefaults(userConfig, state.buildContext);
115
+ return { ...featureConfig, ...config };
116
+ },
117
+ generateBundle: {
118
+ handler(_outputOptions, bundle) {
119
+ renameCssAssets(this, bundle);
120
+ },
121
+ order: "post"
122
+ },
123
+ name: "obsidian-plugin",
124
+ async renderStart() {
125
+ if (state.isDistFolderCleaned) {
126
+ return;
127
+ }
128
+ state.isDistFolderCleaned = true;
129
+ await cleanObsidianPluginDistFolder(getBuildContext().distFolder);
130
+ },
131
+ async writeBundle() {
132
+ await completeObsidianPluginDistFolder(getBuildContext());
133
+ await deployToObsidianPluginsFolder(getBuildContext());
134
+ }
135
+ };
136
+ return [plugin, { ...featurePlugin, apply: "build" }, createUnpluginVuePlugin({ bundler: "vite", features: options })];
137
+ }
138
+ export {
139
+ getViteBuildMode,
140
+ getViteConfigDefaults,
141
+ getViteFeatureConfig,
142
+ obsidianPluginVite
143
+ };
144
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2J1bmRsZXJzL3ZpdGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggdml0ZTogYSB2aXRlIHBsdWdpbiB0aGF0IHR1cm5zIGB2aXRlIGJ1aWxkYCBpbnRvIGEgbGlicmFyeSBidWlsZCBvZlxuICogYHNyYy9tYWluLnRzYCB3aXRoIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlclxuICogcHJvZHVjZXMsIGRlcGxveXMgYSBgdml0ZSBidWlsZCAtLXdhdGNoYCBidWlsZCBpbnRvIHRoZSB2YXVsdCwgYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlXG4gKiBjb25zdW1lcidzIG93biBgdml0ZS5jb25maWdgIGxlYXZlcyB1bnNldC5cbiAqXG4gKiBgdml0ZWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgUGx1Z2luT3B0aW9uLFxuICBVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB0eXBlIHsgUG9zdGNzc0NvbmZpZyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBBc3NldEVtaXR0ZXIsXG4gIEJ1bmRsZU91dHB1dExpa2Vcbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS50cyc7XG5cbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGxvYWRQb3N0Y3NzQ29uZmlnIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0Vml0ZUZlYXR1cmVDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZpdGVGZWF0dXJlQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZWVkcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdGNzc0NvbmZpZzogUG9zdGNzc0NvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3Mgdml0ZSBjb25maWcuXG4gICAqL1xuICByZWFkb25seSB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYnNpZGlhblBsdWdpblZpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBtb2RlLiBEZWZhdWx0cyB0byB7QGxpbmsgQnVpbGRNb2RlLkRldmVsb3BtZW50fSBmb3IgYHZpdGUgYnVpbGQgLS13YXRjaGAgKG9yXG4gICAqIGAtLW1vZGUgZGV2ZWxvcG1lbnRgKSBhbmQge0BsaW5rIEJ1aWxkTW9kZS5Qcm9kdWN0aW9ufSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIFRoZSBzdGF0ZSBvbmUge0BsaW5rIG9ic2lkaWFuUGx1Z2luVml0ZX0gaW5zdGFuY2Uga2VlcHMgYWNyb3NzIHRoZSBob29rcyBvZiBhIGJ1aWxkLCBhbmQgYWNyb3NzIHRoZVxuICogcmVidWlsZHMgb2YgYSB3YXRjaC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHRoZSBidWlsZCBtb2RlIG9mIGEgdml0ZSBidWlsZCBmcm9tIHRoZSBjb25zdW1lcidzIGNvbmZpZzogZGV2ZWxvcG1lbnQgZm9yIGEgd2F0Y2ggYnVpbGQgb3IgZm9yXG4gKiBgLS1tb2RlIGRldmVsb3BtZW50YCwgcHJvZHVjdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHVzZXJDb25maWcgLSBUaGUgY29uc3VtZXIncyB2aXRlIGNvbmZpZy5cbiAqIEBwYXJhbSBlbnYgLSBUaGUgdml0ZSBjb25maWcgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpdGVCdWlsZE1vZGUodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBQaWNrPENvbmZpZ0VudiwgJ21vZGUnPik6IEJ1aWxkTW9kZSB7XG4gIHJldHVybiB1c2VyQ29uZmlnLmJ1aWxkPy53YXRjaCB8fCBlbnYubW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCA6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFydCBvZiB0aGUgdml0ZSBjb25maWcgdGhlIHBsdWdpbiBjb250cmlidXRlczogb25seSB0aGUgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gdXNlckNvbmZpZyAtIFRoZSBjb25zdW1lcidzIHZpdGUgY29uZmlnLlxuICogQHBhcmFtIGJ1aWxkQ29udGV4dCAtIFRoZSBidWlsZCBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUNvbmZpZ0RlZmF1bHRzKHVzZXJDb25maWc6IFVzZXJDb25maWcsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiBVc2VyQ29uZmlnIHtcbiAgY29uc3QgYnVpbGQgPSB1c2VyQ29uZmlnLmJ1aWxkID8/IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gQSBjb25zdW1lcidzIGNvbmZpZyBtYXkgc3RpbGwgdXNlIHRoZSBkZXByZWNhdGVkIGFsaWFzLCBhbmQgdml0ZSBzdGlsbCBob25vcnMgaXQuXG4gIGNvbnN0IHJvbGxkb3duT3B0aW9ucyA9IGJ1aWxkLnJvbGxkb3duT3B0aW9ucyA/PyBidWlsZC5yb2xsdXBPcHRpb25zID8/IHt9O1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHJvbGxkb3duT3B0aW9ucy5vdXRwdXQpID8gdW5kZWZpbmVkIDogcm9sbGRvd25PcHRpb25zLm91dHB1dCA/PyB7fTtcblxuICByZXR1cm4ge1xuICAgIGJ1aWxkOiB7XG4gICAgICAvLyBBbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UsIHNvIGFueSBhc3NldCBlbWl0dGVkIGJlc2lkZVxuICAgICAgLy8gdGhlIGJ1bmRsZSBpcyBhIGZpbGUgdGhlIGluc3RhbGxlZCBwbHVnaW4gbG9va3MgZm9yIGFuZCBkb2VzIG5vdCBmaW5kLlxuICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IGJ1aWxkLmFzc2V0c0lubGluZUxpbWl0ID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGVtcHR5T3V0RGlyYCBpcyB0aGUgbmFtZSB2aXRlJ3MgY29uZmlnIHJlYWRzLlxuICAgICAgZW1wdHlPdXREaXI6IGZhbHNlLFxuICAgICAgbGliOiBidWlsZC5saWIgPz8ge1xuICAgICAgICBjc3NGaWxlTmFtZTogJ3N0eWxlcycsXG4gICAgICAgIGVudHJ5OiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICAgICAgZmlsZU5hbWU6ICgpOiBzdHJpbmcgPT4gJ21haW4uanMnLFxuICAgICAgICBmb3JtYXRzOiBbJ2NqcyddXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBidWlsZC5taW5pZnkgPz8gYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG91dERpcmAgaXMgdGhlIG5hbWUgdml0ZSdzIGNvbmZpZyByZWFkcy5cbiAgICAgIG91dERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgZXh0ZXJuYWw6IGNvbWJpbmVFeHRlcm5hbChyb2xsZG93bk9wdGlvbnMuZXh0ZXJuYWwpLFxuICAgICAgICAuLi4ob3V0cHV0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgIG91dHB1dDoge1xuICAgICAgICAgICAgLy8gYHBvc3RCYW5uZXJgIHJhdGhlciB0aGFuIGBiYW5uZXJgOiBpdCBpcyBhZGRlZCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHN0cmlwcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICAgICAgICAgICAgLi4uKG91dHB1dC5iYW5uZXIgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQucG9zdEJhbm5lciA9PT0gdW5kZWZpbmVkICYmIHsgcG9zdEJhbm5lcjogZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3ZpdGUnKSB9KSxcbiAgICAgICAgICAgIC8vIEFuIE9ic2lkaWFuIHBsdWdpbiBpcyBvbmUgZmlsZTogdGhlIG1hbmlmZXN0IG5hbWVzIGBtYWluLmpzYCBhbmQgbm90aGluZyBsb2FkcyBhIHNlY29uZCBjaHVuay5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBBIGNvbnN1bWVyJ3MgY29uZmlnIG1heSBzdGlsbCBzZXQgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uLCB3aGljaCB0aGVuIHdpbnMuXG4gICAgICAgICAgICAuLi4ob3V0cHV0LmNvZGVTcGxpdHRpbmcgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQuaW5saW5lRHluYW1pY0ltcG9ydHMgPT09IHVuZGVmaW5lZCAmJiB7IGNvZGVTcGxpdHRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogYnVpbGQuc291cmNlbWFwID8/ICghYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUnKVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBhcnQgb2YgdGhlIHZpdGUgY29uZmlnIHRoZSBidWlsZCBmZWF0dXJlcyBjb250cmlidXRlLCBlYWNoIG9ubHkgd2hlcmUgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGxlZnQgaXRcbiAqIHVuc2V0OiB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoYGRlZmluZWApLCB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lIGZvciBSZWFjdCBhbmQgUHJlYWN0XG4gKiAoYG94Yy5qc3hgKSwgYW5kIHRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiAoYGNzcy5wb3N0Y3NzYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0Vml0ZUZlYXR1cmVDb25maWdQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUZlYXR1cmVDb25maWcocGFyYW1zOiBHZXRWaXRlRmVhdHVyZUNvbmZpZ1BhcmFtcyk6IFVzZXJDb25maWcge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9ID0gcGFyYW1zO1xuICBjb25zdCBjb25maWc6IFVzZXJDb25maWcgPSB7fTtcblxuICBjb25zdCB1c2VyRGVmaW5lID0gdXNlckNvbmZpZy5kZWZpbmUgPz8ge307XG4gIGNvbnN0IGRlZmluZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkIH0pKS5maWx0ZXIoKFtleHByZXNzaW9uXSkgPT4gIU9iamVjdC5oYXNPd24odXNlckRlZmluZSwgZXhwcmVzc2lvbikpXG4gICk7XG4gIGlmIChPYmplY3Qua2V5cyhkZWZpbmUpLmxlbmd0aCA+IDApIHtcbiAgICBjb25maWcuZGVmaW5lID0gZGVmaW5lO1xuICB9XG5cbiAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yayk7XG4gIGlmIChqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiB1c2VyQ29uZmlnLm94YyAhPT0gZmFsc2UgJiYgdXNlckNvbmZpZy5veGM/LmpzeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLm94YyA9IHsganN4OiB7IGRldmVsb3BtZW50OiAhaXNQcm9kdWN0aW9uQnVpbGQsIGltcG9ydFNvdXJjZToganN4SW1wb3J0U291cmNlLCBydW50aW1lOiAnYXV0b21hdGljJyB9IH07XG4gIH1cblxuICBpZiAocG9zdGNzc0NvbmZpZyAmJiBwb3N0Y3NzQ29uZmlnLnBsdWdpbnMubGVuZ3RoID4gMCAmJiB1c2VyQ29uZmlnLmNzcz8ucG9zdGNzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLmNzcyA9IHsgcG9zdGNzczogeyBwbHVnaW5zOiBbLi4ucG9zdGNzc0NvbmZpZy5wbHVnaW5zXSB9IH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdml0ZSBwbHVnaW4gdGhhdCBidWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIFdoYXQgaXQgZG9lcywgZWFjaCBvbmx5IHdoZW4gdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGhhcyBub3Qgc2FpZCBvdGhlcndpc2U6XG4gKlxuICogLSBgYnVpbGQubGliYCBidWlsZHMgYHNyYy9tYWluLnRzYCBhcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgLCB3aXRoIGl0cyBDU1MgaW4gYHN0eWxlcy5jc3NgLlxuICogLSBgYnVpbGQub3V0RGlyYCBpcyBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLlxuICogLSBgYnVpbGQubWluaWZ5YCBpcyBvbiBpbiBwcm9kdWN0aW9uIG9ubHksIGFuZCBgYnVpbGQuc291cmNlbWFwYCBpcyBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgb25seS5cbiAqIC0gRXZlcnkgYXNzZXQgaXMgaW5saW5lZCwgYmVjYXVzZSBhbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UuXG4gKiAtIER5bmFtaWMgaW1wb3J0cyBhcmUgaW5saW5lZCBpbnRvIGBtYWluLmpzYCwgYW5kIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgaXQuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsYCwgdGhlIG91dHB1dCBmb2xkZXIgaXMgZW1wdGllZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVcbiAqIChgYnVpbGQuZW1wdHlPdXREaXJgIGlzIHR1cm5lZCBvZmYsIHNpbmNlIHRoaXMgcGx1Z2luIGRvZXMgaXQpLCBldmVyeSBlbWl0dGVkIENTUyBmaWxlIGVuZHMgdXAgaW5cbiAqIGBzdHlsZXMuY3NzYCwgYG1hbmlmZXN0Lmpzb25gIChhbmQgaW4gZGV2ZWxvcG1lbnQgYC5ob3RyZWxvYWRgKSBpcyBjb3BpZWQgYmVzaWRlIGl0LCBhbmQgYSBkZXZlbG9wbWVudFxuICogYnVpbGQgaXMgZGVwbG95ZWQgaW50byB0aGUgdmF1bHQgbmFtZWQgYnkgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyAoe0BsaW5rIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnN9KTpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2Agc2V0cyBgb3hjLmpzeGAgdG8gdGhlIGF1dG9tYXRpYyBydW50aW1lICh1bmxlc3Mgc2V0KS5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgZGVmaW5lcyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIChhbmQgVnVlJ3MgZmVhdHVyZSBmbGFncyksIHdoaWNoIGEgbGlicmFyeSBidWlsZCBsZWF2ZXMgYWxvbmUuXG4gKiAtIGBzdHlsZXMucG9zdGNzc2AgYW5kIGBzdHlsZXMudGFpbHdpbmRgIHNldCBgY3NzLnBvc3Rjc3NgICh1bmxlc3Mgc2V0KTsgdml0ZSBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzb1xuICogICBgc3R5bGVzLmNzc01vZHVsZXNgIGNoYW5nZXMgbm90aGluZyBoZXJlLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5WaXRlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBUaGUgdml0ZSBwbHVnaW5zLCB3aGljaCB2aXRlIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5WaXRlKG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgPSB7fSk6IFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlID0ge1xuICAgIGJ1aWxkQ29udGV4dDogdW5kZWZpbmVkLFxuICAgIGlzRGlzdEZvbGRlckNsZWFuZWQ6IGZhbHNlXG4gIH07XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFZpdGUgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHZpdGUgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiB2aXRlIHBsdWdpbiBoYXMgbm90IHJlc29sdmVkIGl0cyBidWlsZCBjb250ZXh0OiBpdHMgYGNvbmZpZ2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogZmFsc2UsXG4gICAgc2hvdWxkUmVwbGFjZURlZmluZXM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0IHBsdWdpbiA9IHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBhc3luYyBjb25maWcodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBDb25maWdFbnYpOiBQcm9taXNlPFVzZXJDb25maWc+IHtcbiAgICAgIHN0YXRlLmJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLih1c2VyQ29uZmlnLmJ1aWxkPy5vdXREaXIgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3RGb2xkZXI6IHVzZXJDb25maWcuYnVpbGQub3V0RGlyIH0pLFxuICAgICAgICBtb2RlOiBvcHRpb25zLm1vZGUgPz8gZ2V0Vml0ZUJ1aWxkTW9kZSh1c2VyQ29uZmlnLCBlbnYpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgICAgIGNvbnN0IHBvc3Rjc3NDb25maWcgPSBpc1Bvc3Rjc3NOZWVkZWQob3B0aW9ucy5zdHlsZXMpXG4gICAgICAgID8gYXdhaXQgbG9hZFBvc3Rjc3NDb25maWcoeyBpc1Byb2R1Y3Rpb25CdWlsZCwgc3R5bGVzOiBvcHRpb25zLnN0eWxlcyA/PyB7fSB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZlYXR1cmVDb25maWcgPSBnZXRWaXRlRmVhdHVyZUNvbmZpZyh7IGZlYXR1cmVzOiBvcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9KTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGdldFZpdGVDb25maWdEZWZhdWx0cyh1c2VyQ29uZmlnLCBzdGF0ZS5idWlsZENvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgLi4uZmVhdHVyZUNvbmZpZywgLi4uY29uZmlnIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcih0aGlzOiBBc3NldEVtaXR0ZXIsIF9vdXRwdXRPcHRpb25zOiB1bmtub3duLCBidW5kbGU6IFJlY29yZDxzdHJpbmcsIEJ1bmRsZU91dHB1dExpa2U+KTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIHJlbmRlclN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKHN0YXRlLmlzRGlzdEZvbGRlckNsZWFuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IHRydWU7XG4gICAgICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihnZXRCdWlsZENvbnRleHQoKS5kaXN0Rm9sZGVyKTtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgIH1cbiAgfSBhcyBQbHVnaW47XG4gIHJldHVybiBbcGx1Z2luLCB7IC4uLmZlYXR1cmVQbHVnaW4sIGFwcGx5OiAnYnVpbGQnIH0gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICd2aXRlJywgZmVhdHVyZXM6IG9wdGlvbnMgfSkgYXMgUHJvbWlzZTxudWxsIHwgUGx1Z2luPl07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQThCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMscUNBQXFDO0FBQzlDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUF1REEsU0FBUyxpQkFBaUIsWUFBd0IsS0FBeUM7QUFDaEcsU0FBTyxXQUFXLE9BQU8sU0FBUyxJQUFJLFNBQVMsZ0JBQWdCLFVBQVUsY0FBYyxVQUFVO0FBQ25HO0FBU08sU0FBUyxzQkFBc0IsWUFBd0IsY0FBc0Q7QUFDbEgsUUFBTSxRQUFRLFdBQVcsU0FBUyxDQUFDO0FBRW5DLFFBQU0sa0JBQWtCLE1BQU0sbUJBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDekUsUUFBTSxTQUFTLE1BQU0sUUFBUSxnQkFBZ0IsTUFBTSxJQUFJLFNBQVksZ0JBQWdCLFVBQVUsQ0FBQztBQUU5RixTQUFPO0FBQUEsSUFDTCxPQUFPO0FBQUE7QUFBQTtBQUFBLE1BR0wsbUJBQW1CLE1BQU0scUJBQXFCLE9BQU87QUFBQTtBQUFBLE1BRXJELGFBQWE7QUFBQSxNQUNiLEtBQUssTUFBTSxPQUFPO0FBQUEsUUFDaEIsYUFBYTtBQUFBLFFBQ2IsT0FBTyxhQUFhO0FBQUEsUUFDcEIsVUFBVSxNQUFjO0FBQUEsUUFDeEIsU0FBUyxDQUFDLEtBQUs7QUFBQSxNQUNqQjtBQUFBLE1BQ0EsUUFBUSxNQUFNLFVBQVUsYUFB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
@@ -0,0 +1,133 @@
1
+ /// <reference path="../library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Builds an Obsidian plugin with webpack: a webpack plugin that gives a build the same `main.js` +
6
+ * `styles.css` + `manifest.json` layout the esbuild builder produces, deploys a watch build into the vault,
7
+ * and fills in only the options the consumer's own `webpack.config` leaves unset.
8
+ *
9
+ * `webpack` is an optional peer dependency. This module only imports its types and reaches webpack's
10
+ * classes through `compiler.webpack`, so a plugin built with esbuild installs nothing extra.
11
+ */
12
+ import type { Compiler, RuleSetRule, WebpackOptionsNormalized, WebpackPluginInstance } from 'webpack';
13
+ import type { ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.mjs';
14
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.mjs';
15
+ import { BuildMode } from './obsidian-plugin-build.mjs';
16
+ /**
17
+ * Parameters for {@link getWebpackFeatureRules}.
18
+ */
19
+ export interface GetWebpackFeatureRulesParams {
20
+ /**
21
+ * The path of `css-loader`, for the stylesheet rule.
22
+ */
23
+ readonly cssLoaderPath: string;
24
+ /**
25
+ * The build features.
26
+ */
27
+ readonly features: ObsidianPluginFeatureOptions;
28
+ /**
29
+ * Whether this is a production build.
30
+ */
31
+ readonly isProductionBuild: boolean;
32
+ /**
33
+ * The path of the toolkit's own loader.
34
+ */
35
+ readonly loaderPath: string;
36
+ /**
37
+ * The path of `mini-css-extract-plugin`'s loader, for the stylesheet rule.
38
+ */
39
+ readonly miniCssExtractLoaderPath: string;
40
+ }
41
+ /**
42
+ * Options for {@link ObsidianPluginWebpackPlugin}.
43
+ */
44
+ export interface ObsidianPluginWebpackPluginOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
45
+ /**
46
+ * The build mode. Defaults to {@link BuildMode.Development} when webpack watches (`webpack --watch`) or
47
+ * its `mode` is `development`, and {@link BuildMode.Production} otherwise.
48
+ */
49
+ readonly mode?: BuildMode;
50
+ }
51
+ /**
52
+ * The callback webpack's function form of `externals` takes.
53
+ */
54
+ type ExternalsCallback = (error?: Error | null, result?: string) => void;
55
+ /**
56
+ * The argument webpack's function form of `externals` receives.
57
+ */
58
+ interface ExternalsData {
59
+ readonly request?: string;
60
+ }
61
+ /**
62
+ * A webpack plugin that builds an Obsidian plugin.
63
+ *
64
+ * What it does, each only when the consumer's config has not said otherwise:
65
+ *
66
+ * - `entry` is `src/main.ts`, and `mode` follows the build mode.
67
+ * - The output is one CommonJS (`commonjs2`) `main.js` in `dist/build` (`dist/dev` in development), with no
68
+ * async chunks, so a dynamic import cannot become a sibling file.
69
+ * - `target` is `node`, which is what Obsidian's renderer runs, so Node builtins resolve, while the export
70
+ * conditions are the browser's (`browser`, `webpack`, the mode, `module`, `import`, `require`, and never `node`),
71
+ * so packages hand over their browser builds, as on mobile they must.
72
+ * - `devtool` is an inline source map in development only.
73
+ *
74
+ * And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
75
+ * external beside the consumer's own `externals`, the generated-file banner heads `main.js`, license
76
+ * comments a minimizer extracted into `main.js.LICENSE.txt` (which no Obsidian release ships) are put back
77
+ * into `main.js`, the output folder is emptied before the first build, every emitted CSS file ends up in
78
+ * `styles.css`, `manifest.json` (and in development `.hotreload`) is copied beside it, and a development
79
+ * build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
80
+ *
81
+ * TypeScript stays the consumer's choice of loader, as it would be without this plugin. The build features
82
+ * ({@link ObsidianPluginFeatureOptions}) are the plugin's:
83
+ *
84
+ * - `framework: 'react' | 'preact'` needs nothing here: the TypeScript loader reads the automatic JSX runtime from the
85
+ * toolkit's tsconfig preset, and webpack's `mode` defines `process.env.NODE_ENV`.
86
+ * - `framework: 'solid' | 'svelte'` adds rules that compile the components with the toolkit's shared transforms, and
87
+ * `'vue'` applies `unplugin-vue` and defines Vue's feature flags.
88
+ * - `styles` adds the one rule every stylesheet goes through (PostCSS and Tailwind, then `css-loader`, scoping
89
+ * `*.module.css` only with `cssModules`, then `mini-css-extract-plugin`), and applies `mini-css-extract-plugin`
90
+ * unless the config already does; leave your own `.css` rule out. `styles: {}` compiles plain CSS.
91
+ * - `wasm` imports a `.wasm` module as its bytes.
92
+ */
93
+ export declare class ObsidianPluginWebpackPlugin implements WebpackPluginInstance {
94
+ private readonly options;
95
+ /**
96
+ * Creates the plugin.
97
+ *
98
+ * @param options - The {@link ObsidianPluginWebpackPluginOptions}.
99
+ */
100
+ constructor(options?: ObsidianPluginWebpackPluginOptions);
101
+ /**
102
+ * Applies the plugin to a webpack compiler.
103
+ *
104
+ * @param compiler - The webpack compiler.
105
+ */
106
+ apply(compiler: Compiler): void;
107
+ }
108
+ /**
109
+ * Decides the build mode of a webpack build from the consumer's config: development when webpack watches
110
+ * or its `mode` is `development`, production otherwise.
111
+ *
112
+ * @param options - The normalized webpack options.
113
+ * @returns The build mode.
114
+ */
115
+ export declare function getWebpackBuildMode(options: Pick<WebpackOptionsNormalized, 'mode' | 'watch'>): BuildMode;
116
+ /**
117
+ * Builds the module rules the build features add, each running the toolkit's own loader: Solid's JSX before the
118
+ * project's TypeScript loader, Svelte components and modules, `.wasm` modules as JavaScript, and with `styles` the
119
+ * stylesheet rule.
120
+ *
121
+ * @param params - The {@link GetWebpackFeatureRulesParams}.
122
+ * @returns The rules, empty when no feature needs one.
123
+ */
124
+ export declare function getWebpackFeatureRules(params: GetWebpackFeatureRulesParams): RuleSetRule[];
125
+ /**
126
+ * Tells webpack's function form of `externals` to leave Obsidian's modules and the Node builtins to
127
+ * `require()`.
128
+ *
129
+ * @param data - The request webpack is resolving.
130
+ * @param callback - The callback to answer through.
131
+ */
132
+ export declare function obsidianPluginWebpackExternals(data: ExternalsData, callback: ExternalsCallback): void;
133
+ export {};
@@ -0,0 +1,259 @@
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
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return "/";
11
+ },
12
+ env: {},
13
+ platform: "android"
14
+ };
15
+ const existingProcess = globalThis.process;
16
+ if (!existingProcess) {
17
+ globalThis.process = browserProcess;
18
+ return;
19
+ }
20
+ if (existingProcess.versions?.node) {
21
+ return;
22
+ }
23
+ const existingProcessRecord = existingProcess;
24
+ for (const [key, value] of Object.entries(browserProcess)) {
25
+ existingProcessRecord[key] ??= value;
26
+ }
27
+ existingProcessRecord["browser"] = true;
28
+ }
29
+
30
+ ensureBrowserProcess();
31
+ })();
32
+
33
+ import { extractDefaultExportInterop } from "@mnaoumov/typescript-lib/object-utils";
34
+ import { extname } from "@mnaoumov/typescript-lib/path";
35
+ import { fileURLToPath } from "node:url";
36
+ import { ObsidianPluginRepoPaths } from "../obsidian-plugin-repo-paths.mjs";
37
+ import {
38
+ BuildMode,
39
+ cleanObsidianPluginDistFolder,
40
+ completeObsidianPluginDistFolder,
41
+ getObsidianPluginBanner,
42
+ getObsidianPluginDistFolder,
43
+ getObsidianPluginEntryPoint,
44
+ isCssFileName,
45
+ isObsidianPluginExternal,
46
+ mergeCssAssets,
47
+ resolveObsidianPluginBuildContext
48
+ } from "./obsidian-plugin-build.mjs";
49
+ import {
50
+ getFrameworkDefines,
51
+ isPostcssNeeded,
52
+ requireOptionalPeer,
53
+ resolveOptionalPeer
54
+ } from "./obsidian-plugin-features.mjs";
55
+ import { deployToObsidianPluginsFolder } from "./obsidian-plugins-folder-deployment.mjs";
56
+ const PLUGIN_NAME = "ObsidianPluginWebpackPlugin";
57
+ const MINI_CSS_EXTRACT_PLUGIN = "mini-css-extract-plugin";
58
+ class ObsidianPluginWebpackPlugin {
59
+ /**
60
+ * Creates the plugin.
61
+ *
62
+ * @param options - The {@link ObsidianPluginWebpackPluginOptions}.
63
+ */
64
+ constructor(options = {}) {
65
+ this.options = options;
66
+ }
67
+ options;
68
+ /* v8 ignore start -- Webpack hooks; exercised by the bundler integration test against a real webpack build. */
69
+ /**
70
+ * Applies the plugin to a webpack compiler.
71
+ *
72
+ * @param compiler - The webpack compiler.
73
+ */
74
+ apply(compiler) {
75
+ const mode = this.options.mode ?? getWebpackBuildMode(compiler.options);
76
+ applyWebpackOptionDefaults(compiler.options, mode);
77
+ applyWebpackFeatures(compiler, this.options, mode === BuildMode.Production);
78
+ new compiler.webpack.BannerPlugin({
79
+ banner: getObsidianPluginBanner("webpack"),
80
+ raw: true,
81
+ stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_REPORT,
82
+ test: /\.js$/u
83
+ }).apply(compiler);
84
+ const buildContextPromise = resolveObsidianPluginBuildContext({
85
+ ...this.options,
86
+ ...compiler.options.output.path !== void 0 && { distFolder: compiler.options.output.path },
87
+ mode
88
+ });
89
+ let isDistFolderCleaned = false;
90
+ async function prepare() {
91
+ const buildContext = await buildContextPromise;
92
+ if (isDistFolderCleaned) {
93
+ return;
94
+ }
95
+ isDistFolderCleaned = true;
96
+ await cleanObsidianPluginDistFolder(buildContext.distFolder);
97
+ }
98
+ compiler.hooks.beforeRun.tapPromise(PLUGIN_NAME, prepare);
99
+ compiler.hooks.watchRun.tapPromise(PLUGIN_NAME, prepare);
100
+ compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
101
+ compilation.hooks.processAssets.tap(
102
+ { name: PLUGIN_NAME, stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE },
103
+ () => {
104
+ renameWebpackCssAssets(compilation, compiler);
105
+ inlineExtractedLicenses(compilation, compiler);
106
+ }
107
+ );
108
+ });
109
+ compiler.hooks.afterEmit.tapPromise(PLUGIN_NAME, async (compilation) => {
110
+ if (compilation.getStats().hasErrors()) {
111
+ return;
112
+ }
113
+ const buildContext = await buildContextPromise;
114
+ await completeObsidianPluginDistFolder(buildContext);
115
+ await deployToObsidianPluginsFolder(buildContext);
116
+ });
117
+ }
118
+ /* v8 ignore stop */
119
+ }
120
+ function getWebpackBuildMode(options) {
121
+ return options.watch || options.mode === "development" ? BuildMode.Development : BuildMode.Production;
122
+ }
123
+ function getWebpackFeatureRules(params) {
124
+ const { cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath } = params;
125
+ const rules = [];
126
+ function featureLoader(kind, styles) {
127
+ const options = { isProductionBuild, kind, ...styles && { styles } };
128
+ return [{ loader: loaderPath, options }];
129
+ }
130
+ switch (features.framework) {
131
+ case "solid": {
132
+ rules.push({ enforce: "pre", test: /\.[jt]sx$/iu, use: featureLoader("jsx") });
133
+ break;
134
+ }
135
+ case "svelte": {
136
+ rules.push(
137
+ { test: /\.svelte$/iu, use: featureLoader("svelte") },
138
+ { enforce: "pre", test: /\.svelte\.[cm]?[jt]s$/iu, use: featureLoader("svelte") }
139
+ );
140
+ break;
141
+ }
142
+ case "vue": {
143
+ rules.push({ enforce: "post", test: /\.vue(?:\?|%3F).*lang\.ts$/iu, use: featureLoader("typescript") });
144
+ break;
145
+ }
146
+ default: {
147
+ break;
148
+ }
149
+ }
150
+ if (features.wasm) {
151
+ rules.push({ test: /\.wasm$/iu, type: "javascript/auto", use: featureLoader("wasm") });
152
+ }
153
+ if (features.styles) {
154
+ rules.push({
155
+ test: /\.p?css$/iu,
156
+ use: [
157
+ miniCssExtractLoaderPath,
158
+ {
159
+ loader: cssLoaderPath,
160
+ options: {
161
+ importLoaders: 1,
162
+ modules: features.styles.cssModules ? { auto: true, namedExport: false } : false
163
+ }
164
+ },
165
+ ...isPostcssNeeded(features.styles) ? featureLoader("stylesheet", features.styles) : []
166
+ ]
167
+ });
168
+ }
169
+ return rules;
170
+ }
171
+ function obsidianPluginWebpackExternals(data, callback) {
172
+ if (data.request !== void 0 && isObsidianPluginExternal(data.request)) {
173
+ callback(null, `commonjs2 ${data.request}`);
174
+ return;
175
+ }
176
+ callback();
177
+ }
178
+ function applyWebpackFeatures(compiler, features, isProductionBuild) {
179
+ let miniCssExtractLoaderPath = "";
180
+ let cssLoaderPath = "";
181
+ if (features.styles) {
182
+ const stylesFeature = "styles";
183
+ cssLoaderPath = resolveOptionalPeer({ feature: stylesFeature, packageName: "css-loader" });
184
+ const MiniCssExtractPlugin = extractDefaultExportInterop(
185
+ requireOptionalPeer({ feature: stylesFeature, packageName: MINI_CSS_EXTRACT_PLUGIN })
186
+ );
187
+ miniCssExtractLoaderPath = MiniCssExtractPlugin.loader;
188
+ const hasMiniCssExtractPlugin = compiler.options.plugins.some((plugin) => plugin.constructor.name === "MiniCssExtractPlugin");
189
+ if (!hasMiniCssExtractPlugin) {
190
+ new MiniCssExtractPlugin().apply(compiler);
191
+ }
192
+ }
193
+ const loaderPath = fileURLToPath(new URL(`obsidian-plugin-webpack-loader${extname(fileURLToPath(import.meta.url))}`, import.meta.url));
194
+ compiler.options.module.rules.push(...getWebpackFeatureRules({ cssLoaderPath, features, isProductionBuild, loaderPath, miniCssExtractLoaderPath }));
195
+ if (features.framework !== "vue") {
196
+ return;
197
+ }
198
+ const unpluginVue = extractDefaultExportInterop(
199
+ requireOptionalPeer({ feature: "framework: 'vue'", packageName: "unplugin-vue", specifier: "unplugin-vue/webpack" })
200
+ );
201
+ unpluginVue().apply(compiler);
202
+ const { "process.env.NODE_ENV": _nodeEnv, ...vueFlags } = getFrameworkDefines({ framework: features.framework, isProductionBuild });
203
+ new compiler.webpack.DefinePlugin(vueFlags).apply(compiler);
204
+ }
205
+ function applyWebpackOptionDefaults(options, mode) {
206
+ const isProductionBuild = mode === BuildMode.Production;
207
+ options.mode ??= isProductionBuild ? "production" : "development";
208
+ options.target ??= "node";
209
+ options.devtool ??= !isProductionBuild && "inline-source-map";
210
+ if (typeof options.entry === "object" && Object.keys(options.entry).length === 1 && options.entry["main"]?.import === void 0) {
211
+ options.entry = { main: { import: [getObsidianPluginEntryPoint()] } };
212
+ }
213
+ options.output.path ??= getObsidianPluginDistFolder(mode);
214
+ options.output.filename ??= ObsidianPluginRepoPaths.MainJs;
215
+ options.output.library ??= { type: "commonjs2" };
216
+ options.output.asyncChunks ??= false;
217
+ options.resolve.conditionNames ??= ["browser", "webpack", isProductionBuild ? "production" : "development", "module", "import", "require"];
218
+ const userExternals = options.externals;
219
+ options.externals = [obsidianPluginWebpackExternals, ...Array.isArray(userExternals) ? userExternals : [userExternals]];
220
+ }
221
+ function inlineExtractedLicenses(compilation, compiler) {
222
+ const LICENSE_SUFFIX = ".LICENSE.txt";
223
+ for (const licenseAsset of compilation.getAssets()) {
224
+ if (!licenseAsset.name.endsWith(LICENSE_SUFFIX)) {
225
+ continue;
226
+ }
227
+ const sourceFileName = licenseAsset.name.slice(0, -LICENSE_SUFFIX.length);
228
+ const sourceAsset = compilation.getAsset(sourceFileName);
229
+ if (!sourceAsset) {
230
+ continue;
231
+ }
232
+ const licenseFileName = licenseAsset.name.split("/").at(-1) ?? licenseAsset.name;
233
+ const reference = `/*! For license information please see ${licenseFileName} */`;
234
+ const source = sourceAsset.source.source().toString();
235
+ const licenses = licenseAsset.source.source().toString().trimEnd();
236
+ const updatedSource = source.includes(reference) ? source.replace(reference, () => licenses) : `${licenses}
237
+ ${source}`;
238
+ compilation.updateAsset(sourceFileName, new compiler.webpack.sources.RawSource(updatedSource));
239
+ compilation.deleteAsset(licenseAsset.name);
240
+ }
241
+ }
242
+ function renameWebpackCssAssets(compilation, compiler) {
243
+ const cssAssets = compilation.getAssets().filter((asset) => isCssFileName(asset.name)).map((asset) => ({ fileName: asset.name, source: asset.source.source().toString() }));
244
+ const { fileNamesToRemove, stylesCss } = mergeCssAssets(cssAssets);
245
+ if (stylesCss === void 0) {
246
+ return;
247
+ }
248
+ for (const fileName of fileNamesToRemove) {
249
+ compilation.deleteAsset(fileName);
250
+ }
251
+ compilation.emitAsset(ObsidianPluginRepoPaths.StylesCss, new compiler.webpack.sources.RawSource(stylesCss));
252
+ }
253
+ export {
254
+ ObsidianPluginWebpackPlugin,
255
+ getWebpackBuildMode,
256
+ getWebpackFeatureRules,
257
+ obsidianPluginWebpackExternals
258
+ };
259
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy93ZWJwYWNrLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggd2VicGFjazogYSB3ZWJwYWNrIHBsdWdpbiB0aGF0IGdpdmVzIGEgYnVpbGQgdGhlIHNhbWUgYG1haW4uanNgICtcbiAqIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlciBwcm9kdWNlcywgZGVwbG95cyBhIHdhdGNoIGJ1aWxkIGludG8gdGhlIHZhdWx0LFxuICogYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlIGNvbnN1bWVyJ3Mgb3duIGB3ZWJwYWNrLmNvbmZpZ2AgbGVhdmVzIHVuc2V0LlxuICpcbiAqIGB3ZWJwYWNrYCBpcyBhbiBvcHRpb25hbCBwZWVyIGRlcGVuZGVuY3kuIFRoaXMgbW9kdWxlIG9ubHkgaW1wb3J0cyBpdHMgdHlwZXMgYW5kIHJlYWNoZXMgd2VicGFjaydzXG4gKiBjbGFzc2VzIHRocm91Z2ggYGNvbXBpbGVyLndlYnBhY2tgLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoIGVzYnVpbGQgaW5zdGFsbHMgbm90aGluZyBleHRyYS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIENvbXBpbGF0aW9uLFxuICBDb21waWxlcixcbiAgUnVsZVNldFJ1bGUsXG4gIFJ1bGVTZXRVc2VJdGVtLFxuICBXZWJwYWNrT3B0aW9uc05vcm1hbGl6ZWQsXG4gIFdlYnBhY2tQbHVnaW5JbnN0YW5jZVxufSBmcm9tICd3ZWJwYWNrJztcblxuaW1wb3J0IHsgZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL29iamVjdC11dGlscyc7XG5pbXBvcnQgeyBleHRuYW1lIH0gZnJvbSAnQG1uYW91bW92L3R5cGVzY3JpcHQtbGliL3BhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zLFxuICBPYnNpZGlhblBsdWdpblN0eWxlc09wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIudHMnO1xuXG5pbXBvcnQgeyBPYnNpZGlhblBsdWdpblJlcG9QYXRocyB9IGZyb20gJy4uL29ic2lkaWFuLXBsdWdpbi1yZXBvLXBhdGhzLnRzJztcbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkVudHJ5UG9pbnQsXG4gIGlzQ3NzRmlsZU5hbWUsXG4gIGlzT2JzaWRpYW5QbHVnaW5FeHRlcm5hbCxcbiAgbWVyZ2VDc3NBc3NldHMsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQge1xuICBnZXRGcmFtZXdvcmtEZWZpbmVzLFxuICBpc1Bvc3Rjc3NOZWVkZWQsXG4gIHJlcXVpcmVPcHRpb25hbFBlZXIsXG4gIHJlc29sdmVPcHRpb25hbFBlZXJcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuaW1wb3J0IHsgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbnMtZm9sZGVyLWRlcGxveW1lbnQudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBnZXRXZWJwYWNrRmVhdHVyZVJ1bGVzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRXZWJwYWNrRmVhdHVyZVJ1bGVzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIGBjc3MtbG9hZGVyYCwgZm9yIHRoZSBzdHlsZXNoZWV0IHJ1bGUuXG4gICAqL1xuICByZWFkb25seSBjc3NMb2FkZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSB0b29sa2l0J3Mgb3duIGxvYWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxvYWRlclBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhdGggb2YgYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYCdzIGxvYWRlciwgZm9yIHRoZSBzdHlsZXNoZWV0IHJ1bGUuXG4gICAqL1xuICByZWFkb25seSBtaW5pQ3NzRXh0cmFjdExvYWRlclBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2lufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW5PcHRpb25zIGV4dGVuZHMgT2JzaWRpYW5QbHVnaW5EZXBsb3ltZW50T3B0aW9ucywgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgbW9kZS4gRGVmYXVsdHMgdG8ge0BsaW5rIEJ1aWxkTW9kZS5EZXZlbG9wbWVudH0gd2hlbiB3ZWJwYWNrIHdhdGNoZXMgKGB3ZWJwYWNrIC0td2F0Y2hgKSBvclxuICAgKiBpdHMgYG1vZGVgIGlzIGBkZXZlbG9wbWVudGAsIGFuZCB7QGxpbmsgQnVpbGRNb2RlLlByb2R1Y3Rpb259IG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBCdWlsZE1vZGU7XG59XG5cbi8qKlxuICogVGhlIGNhbGxiYWNrIHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHRha2VzLlxuICovXG50eXBlIEV4dGVybmFsc0NhbGxiYWNrID0gKGVycm9yPzogRXJyb3IgfCBudWxsLCByZXN1bHQ/OiBzdHJpbmcpID0+IHZvaWQ7XG5cbi8qKlxuICogVGhlIGFyZ3VtZW50IHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHJlY2VpdmVzLlxuICovXG5pbnRlcmZhY2UgRXh0ZXJuYWxzRGF0YSB7XG4gIHJlYWRvbmx5IHJlcXVlc3Q/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmAgY2xhc3MuXG4gKi9cbmludGVyZmFjZSBNaW5pQ3NzRXh0cmFjdFBsdWdpbkNsYXNzIHtcbiAgcmVhZG9ubHkgbG9hZGVyOiBzdHJpbmc7XG4gIG5ldyAoKTogV2VicGFja1BsdWdpbkluc3RhbmNlO1xufVxuXG4vKipcbiAqIFRoZSBwYXJ0IG9mIGBtaW5pLWNzcy1leHRyYWN0LXBsdWdpbmAgdGhlIGFkYXB0ZXIgdXNlcy5cbiAqL1xuaW50ZXJmYWNlIE1pbmlDc3NFeHRyYWN0UGx1Z2luTW9kdWxlIHtcbiAgcmVhZG9ubHkgZGVmYXVsdDogTWluaUNzc0V4dHJhY3RQbHVnaW5DbGFzcztcbn1cblxuLyoqXG4gKiBUaGUgcGFydCBvZiBgdW5wbHVnaW4tdnVlL3dlYnBhY2tgIHRoZSBhZGFwdGVyIHVzZXMuXG4gKi9cbmludGVyZmFjZSBVbnBsdWdpblZ1ZVdlYnBhY2tNb2R1bGUge1xuICByZWFkb25seSBkZWZhdWx0OiAoKSA9PiBXZWJwYWNrUGx1Z2luSW5zdGFuY2U7XG59XG5cbmNvbnN0IFBMVUdJTl9OQU1FID0gJ09ic2lkaWFuUGx1Z2luV2VicGFja1BsdWdpbic7XG5jb25zdCBNSU5JX0NTU19FWFRSQUNUX1BMVUdJTiA9ICdtaW5pLWNzcy1leHRyYWN0LXBsdWdpbic7XG5cbi8qKlxuICogQSB3ZWJwYWNrIHBsdWdpbiB0aGF0IGJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKlxuICogV2hhdCBpdCBkb2VzLCBlYWNoIG9ubHkgd2hlbiB0aGUgY29uc3VtZXIncyBjb25maWcgaGFzIG5vdCBzYWlkIG90aGVyd2lzZTpcbiAqXG4gKiAtIGBlbnRyeWAgaXMgYHNyYy9tYWluLnRzYCwgYW5kIGBtb2RlYCBmb2xsb3dzIHRoZSBidWlsZCBtb2RlLlxuICogLSBUaGUgb3V0cHV0IGlzIG9uZSBDb21tb25KUyAoYGNvbW1vbmpzMmApIGBtYWluLmpzYCBpbiBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLCB3aXRoIG5vXG4gKiAgIGFzeW5jIGNodW5rcywgc28gYSBkeW5hbWljIGltcG9ydCBjYW5ub3QgYmVjb21lIGEgc2libGluZyBmaWxlLlxuICogLSBgdGFyZ2V0YCBpcyBgbm9kZWAsIHdoaWNoIGlzIHdoYXQgT2JzaWRpYW4ncyByZW5kZXJlciBydW5zLCBzbyBOb2RlIGJ1aWx0aW5zIHJlc29sdmUsIHdoaWxlIHRoZSBleHBvcnRcbiAqICAgY29uZGl0aW9ucyBhcmUgdGhlIGJyb3dzZXIncyAoYGJyb3dzZXJgLCBgd2VicGFja2AsIHRoZSBtb2RlLCBgbW9kdWxlYCwgYGltcG9ydGAsIGByZXF1aXJlYCwgYW5kIG5ldmVyIGBub2RlYCksXG4gKiAgIHNvIHBhY2thZ2VzIGhhbmQgb3ZlciB0aGVpciBicm93c2VyIGJ1aWxkcywgYXMgb24gbW9iaWxlIHRoZXkgbXVzdC5cbiAqIC0gYGRldnRvb2xgIGlzIGFuIGlubGluZSBzb3VyY2UgbWFwIGluIGRldmVsb3BtZW50IG9ubHkuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsc2AsIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgYG1haW4uanNgLCBsaWNlbnNlXG4gKiBjb21tZW50cyBhIG1pbmltaXplciBleHRyYWN0ZWQgaW50byBgbWFpbi5qcy5MSUNFTlNFLnR4dGAgKHdoaWNoIG5vIE9ic2lkaWFuIHJlbGVhc2Ugc2hpcHMpIGFyZSBwdXQgYmFja1xuICogaW50byBgbWFpbi5qc2AsIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGVtcHRpZWQgYmVmb3JlIHRoZSBmaXJzdCBidWlsZCwgZXZlcnkgZW1pdHRlZCBDU1MgZmlsZSBlbmRzIHVwIGluXG4gKiBgc3R5bGVzLmNzc2AsIGBtYW5pZmVzdC5qc29uYCAoYW5kIGluIGRldmVsb3BtZW50IGAuaG90cmVsb2FkYCkgaXMgY29waWVkIGJlc2lkZSBpdCwgYW5kIGEgZGV2ZWxvcG1lbnRcbiAqIGJ1aWxkIGlzIGRlcGxveWVkIGludG8gdGhlIHZhdWx0IG5hbWVkIGJ5IGBPQlNJRElBTl9DT05GSUdfRk9MREVSYC5cbiAqXG4gKiBUeXBlU2NyaXB0IHN0YXlzIHRoZSBjb25zdW1lcidzIGNob2ljZSBvZiBsb2FkZXIsIGFzIGl0IHdvdWxkIGJlIHdpdGhvdXQgdGhpcyBwbHVnaW4uIFRoZSBidWlsZCBmZWF0dXJlc1xuICogKHtAbGluayBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zfSkgYXJlIHRoZSBwbHVnaW4nczpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2AgbmVlZHMgbm90aGluZyBoZXJlOiB0aGUgVHlwZVNjcmlwdCBsb2FkZXIgcmVhZHMgdGhlIGF1dG9tYXRpYyBKU1ggcnVudGltZSBmcm9tIHRoZVxuICogICB0b29sa2l0J3MgdHNjb25maWcgcHJlc2V0LCBhbmQgd2VicGFjaydzIGBtb2RlYCBkZWZpbmVzIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAuXG4gKiAtIGBmcmFtZXdvcms6ICdzb2xpZCcgfCAnc3ZlbHRlJ2AgYWRkcyBydWxlcyB0aGF0IGNvbXBpbGUgdGhlIGNvbXBvbmVudHMgd2l0aCB0aGUgdG9vbGtpdCdzIHNoYXJlZCB0cmFuc2Zvcm1zLCBhbmRcbiAqICAgYCd2dWUnYCBhcHBsaWVzIGB1bnBsdWdpbi12dWVgIGFuZCBkZWZpbmVzIFZ1ZSdzIGZlYXR1cmUgZmxhZ3MuXG4gKiAtIGBzdHlsZXNgIGFkZHMgdGhlIG9uZSBydWxlIGV2ZXJ5IHN0eWxlc2hlZXQgZ29lcyB0aHJvdWdoIChQb3N0Q1NTIGFuZCBUYWlsd2luZCwgdGhlbiBgY3NzLWxvYWRlcmAsIHNjb3BpbmdcbiAqICAgYCoubW9kdWxlLmNzc2Agb25seSB3aXRoIGBjc3NNb2R1bGVzYCwgdGhlbiBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gKSwgYW5kIGFwcGxpZXMgYG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luYFxuICogICB1bmxlc3MgdGhlIGNvbmZpZyBhbHJlYWR5IGRvZXM7IGxlYXZlIHlvdXIgb3duIGAuY3NzYCBydWxlIG91dC4gYHN0eWxlczoge31gIGNvbXBpbGVzIHBsYWluIENTUy5cbiAqIC0gYHdhc21gIGltcG9ydHMgYSBgLndhc21gIG1vZHVsZSBhcyBpdHMgYnl0ZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW4gaW1wbGVtZW50cyBXZWJwYWNrUGx1Z2luSW5zdGFuY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgcGx1Z2luLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5XZWJwYWNrUGx1Z2luT3B0aW9uc30uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBPYnNpZGlhblBsdWdpbldlYnBhY2tQbHVnaW5PcHRpb25zID0ge30pIHt9XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFdlYnBhY2sgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHdlYnBhY2sgYnVpbGQuICovXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSBwbHVnaW4gdG8gYSB3ZWJwYWNrIGNvbXBpbGVyLlxuICAgKlxuICAgKiBAcGFyYW0gY29tcGlsZXIgLSBUaGUgd2VicGFjayBjb21waWxlci5cbiAgICovXG4gIHB1YmxpYyBhcHBseShjb21waWxlcjogQ29tcGlsZXIpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5vcHRpb25zLm1vZGUgPz8gZ2V0V2VicGFja0J1aWxkTW9kZShjb21waWxlci5vcHRpb25zKTtcbiAgICBhcHBseVdlYnBhY2tPcHRpb25EZWZhdWx0cyhjb21waWxlci5vcHRpb25zLCBtb2RlKTtcbiAgICBhcHBseVdlYnBhY2tGZWF0dXJlcyhjb21waWxlciwgdGhpcy5vcHRpb25zLCBtb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbik7XG4gICAgLy8gQWRkZWQgYXQgdGhlIHJlcG9ydCBzdGFnZSwgYWZ0ZXIgbWluaWZpY2F0aW9uLCB3aGljaCB3b3VsZCBvdGhlcndpc2Ugc3RyaXAgaXQgYXMgYW4gb3JkaW5hcnkgY29tbWVudC5cbiAgICBuZXcgY29tcGlsZXIud2VicGFjay5CYW5uZXJQbHVnaW4oe1xuICAgICAgYmFubmVyOiBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcignd2VicGFjaycpLFxuICAgICAgcmF3OiB0cnVlLFxuICAgICAgc3RhZ2U6IGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24uUFJPQ0VTU19BU1NFVFNfU1RBR0VfUkVQT1JULFxuICAgICAgdGVzdDogL1xcLmpzJC91XG4gICAgfSkuYXBwbHkoY29tcGlsZXIpO1xuXG4gICAgY29uc3QgYnVpbGRDb250ZXh0UHJvbWlzZSA9IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAuLi50aGlzLm9wdGlvbnMsXG4gICAgICAuLi4oY29tcGlsZXIub3B0aW9ucy5vdXRwdXQucGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgZGlzdEZvbGRlcjogY29tcGlsZXIub3B0aW9ucy5vdXRwdXQucGF0aCB9KSxcbiAgICAgIG1vZGVcbiAgICB9KTtcbiAgICBsZXQgaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IGZhbHNlO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gcHJlcGFyZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGJ1aWxkQ29udGV4dFByb21pc2U7XG4gICAgICBpZiAoaXNEaXN0Rm9sZGVyQ2xlYW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpc0Rpc3RGb2xkZXJDbGVhbmVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dC5kaXN0Rm9sZGVyKTtcbiAgICB9XG4gICAgY29tcGlsZXIuaG9va3MuYmVmb3JlUnVuLnRhcFByb21pc2UoUExVR0lOX05BTUUsIHByZXBhcmUpO1xuICAgIGNvbXBpbGVyLmhvb2tzLndhdGNoUnVuLnRhcFByb21pc2UoUExVR0lOX05BTUUsIHByZXBhcmUpO1xuXG4gICAgY29tcGlsZXIuaG9va3MudGhpc0NvbXBpbGF0aW9uLnRhcChQTFVHSU5fTkFNRSwgKGNvbXBpbGF0aW9uKSA9PiB7XG4gICAgICBjb21waWxhdGlvbi5ob29rcy5wcm9jZXNzQXNzZXRzLnRhcChcbiAgICAgICAgeyBuYW1lOiBQTFVHSU5fTkFNRSwgc3RhZ2U6IGNvbXBpbGVyLndlYnBhY2suQ29tcGlsYXRpb24uUFJPQ0VTU19BU1NFVFNfU1RBR0VfU1VNTUFSSVpFIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICByZW5hbWVXZWJwYWNrQ3NzQXNzZXRzKGNvbXBpbGF0aW9uLCBjb21waWxlcik7XG4gICAgICAgICAgaW5saW5lRXh0cmFjdGVkTGljZW5zZXMoY29tcGlsYXRpb24sIGNvbXBpbGVyKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbXBpbGVyLmhvb2tzLmFmdGVyRW1pdC50YXBQcm9taXNlKFBMVUdJTl9OQU1FLCBhc3luYyAoY29tcGlsYXRpb24pID0+IHtcbiAgICAgIGlmIChjb21waWxhdGlvbi5nZXRTdGF0cygpLmhhc0Vycm9ycygpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJ1aWxkQ29udGV4dCA9IGF3YWl0IGJ1aWxkQ29udGV4dFByb21pc2U7XG4gICAgICBhd2FpdCBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihidWlsZENvbnRleHQpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoYnVpbGRDb250ZXh0KTtcbiAgICB9KTtcbiAgfVxuICAvKiB2OCBpZ25vcmUgc3RvcCAqL1xufVxuXG4vKipcbiAqIERlY2lkZXMgdGhlIGJ1aWxkIG1vZGUgb2YgYSB3ZWJwYWNrIGJ1aWxkIGZyb20gdGhlIGNvbnN1bWVyJ3MgY29uZmlnOiBkZXZlbG9wbWVudCB3aGVuIHdlYnBhY2sgd2F0Y2hlc1xuICogb3IgaXRzIGBtb2RlYCBpcyBgZGV2ZWxvcG1lbnRgLCBwcm9kdWN0aW9uIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBub3JtYWxpemVkIHdlYnBhY2sgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSBidWlsZCBtb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2VicGFja0J1aWxkTW9kZShvcHRpb25zOiBQaWNrPFdlYnBhY2tPcHRpb25zTm9ybWFsaXplZCwgJ21vZGUnIHwgJ3dhdGNoJz4pOiBCdWlsZE1vZGUge1xuICByZXR1cm4gb3B0aW9ucy53YXRjaCB8fCBvcHRpb25zLm1vZGUgPT09ICdkZXZlbG9wbWVudCcgPyBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgOiBCdWlsZE1vZGUuUHJvZHVjdGlvbjtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIG1vZHVsZSBydWxlcyB0aGUgYnVpbGQgZmVhdHVyZXMgYWRkLCBlYWNoIHJ1bm5pbmcgdGhlIHRvb2xraXQncyBvd24gbG9hZGVyOiBTb2xpZCdzIEpTWCBiZWZvcmUgdGhlXG4gKiBwcm9qZWN0J3MgVHlwZVNjcmlwdCBsb2FkZXIsIFN2ZWx0ZSBjb21wb25lbnRzIGFuZCBtb2R1bGVzLCBgLndhc21gIG1vZHVsZXMgYXMgSmF2YVNjcmlwdCwgYW5kIHdpdGggYHN0eWxlc2AgdGhlXG4gKiBzdHlsZXNoZWV0IHJ1bGUuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0V2VicGFja0ZlYXR1cmVSdWxlc1BhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgcnVsZXMsIGVtcHR5IHdoZW4gbm8gZmVhdHVyZSBuZWVkcyBvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJwYWNrRmVhdHVyZVJ1bGVzKHBhcmFtczogR2V0V2VicGFja0ZlYXR1cmVSdWxlc1BhcmFtcyk6IFJ1bGVTZXRSdWxlW10ge1xuICBjb25zdCB7IGNzc0xvYWRlclBhdGgsIGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgbG9hZGVyUGF0aCwgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJ1bGVzOiBSdWxlU2V0UnVsZVtdID0gW107XG5cbiAgZnVuY3Rpb24gZmVhdHVyZUxvYWRlcihraW5kOiBPYnNpZGlhblBsdWdpbldlYnBhY2tMb2FkZXJPcHRpb25zWydraW5kJ10sIHN0eWxlcz86IE9ic2lkaWFuUGx1Z2luU3R5bGVzT3B0aW9ucyk6IFJ1bGVTZXRVc2VJdGVtW10ge1xuICAgIGNvbnN0IG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luV2VicGFja0xvYWRlck9wdGlvbnMgPSB7IGlzUHJvZHVjdGlvbkJ1aWxkLCBraW5kLCAuLi4oc3R5bGVzICYmIHsgc3R5bGVzIH0pIH07XG4gICAgcmV0dXJuIFt7IGxvYWRlcjogbG9hZGVyUGF0aCwgb3B0aW9ucyB9XTtcbiAgfVxuXG4gIHN3aXRjaCAoZmVhdHVyZXMuZnJhbWV3b3JrKSB7XG4gICAgY2FzZSAnc29saWQnOiB7XG4gICAgICBydWxlcy5wdXNoKHsgZW5mb3JjZTogJ3ByZScsIHRlc3Q6IC9cXC5banRdc3gkL2l1LCB1c2U6IGZlYXR1cmVMb2FkZXIoJ2pzeCcpIH0pO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3N2ZWx0ZSc6IHtcbiAgICAgIHJ1bGVzLnB1c2goXG4gICAgICAgIHsgdGVzdDogL1xcLnN2ZWx0ZSQvaXUsIHVzZTogZmVhdHVyZUxvYWRlcignc3ZlbHRlJykgfSxcbiAgICAgICAgeyBlbmZvcmNlOiAncHJlJywgdGVzdDogL1xcLnN2ZWx0ZVxcLltjbV0/W2p0XXMkL2l1LCB1c2U6IGZlYXR1cmVMb2FkZXIoJ3N2ZWx0ZScpIH1cbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAndnVlJzoge1xuICAgICAgLy8gYHVucGx1Z2luLXZ1ZWAgaGFuZHMgYSBgPHNjcmlwdCBsYW5nPVwidHNcIj5gIGJsb2NrIG9uIGFzIGEgbW9kdWxlIG9mIGl0cyBvd24gYWZ0ZXIgdGhlIHByb2plY3QncyBUeXBlU2NyaXB0XG4gICAgICAvLyBMb2FkZXIgcmFuLCBzbyBhIHBvc3QgbG9hZGVyIHN0cmlwcyBpdHMgdHlwZXMuIEl0cyBpZCBuYW1lcyB0aGUgY29tcG9uZW50IGFuZCB0aGUgYmxvY2sncyBsYW5ndWFnZS5cbiAgICAgIHJ1bGVzLnB1c2goeyBlbmZvcmNlOiAncG9zdCcsIHRlc3Q6IC9cXC52dWUoPzpcXD98JTNGKS4qbGFuZ1xcLnRzJC9pdSwgdXNlOiBmZWF0dXJlTG9hZGVyKCd0eXBlc2NyaXB0JykgfSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGlmIChmZWF0dXJlcy53YXNtKSB7XG4gICAgcnVsZXMucHVzaCh7IHRlc3Q6IC9cXC53YXNtJC9pdSwgdHlwZTogJ2phdmFzY3JpcHQvYXV0bycsIHVzZTogZmVhdHVyZUxvYWRlcignd2FzbScpIH0pO1xuICB9XG4gIGlmIChmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICBydWxlcy5wdXNoKHtcbiAgICAgIHRlc3Q6IC9cXC5wP2NzcyQvaXUsXG4gICAgICB1c2U6IFtcbiAgICAgICAgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoLFxuICAgICAgICB7XG4gICAgICAgICAgbG9hZGVyOiBjc3NMb2FkZXJQYXRoLFxuICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgIGltcG9ydExvYWRlcnM6IDEsXG4gICAgICAgICAgICBtb2R1bGVzOiBmZWF0dXJlcy5zdHlsZXMuY3NzTW9kdWxlcyA/IHsgYXV0bzogdHJ1ZSwgbmFtZWRFeHBvcnQ6IGZhbHNlIH0gOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLi4uaXNQb3N0Y3NzTmVlZGVkKGZlYXR1cmVzLnN0eWxlcykgPyBmZWF0dXJlTG9hZGVyKCdzdHlsZXNoZWV0JywgZmVhdHVyZXMuc3R5bGVzKSA6IFtdXG4gICAgICBdXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHJ1bGVzO1xufVxuXG4vKipcbiAqIFRlbGxzIHdlYnBhY2sncyBmdW5jdGlvbiBmb3JtIG9mIGBleHRlcm5hbHNgIHRvIGxlYXZlIE9ic2lkaWFuJ3MgbW9kdWxlcyBhbmQgdGhlIE5vZGUgYnVpbHRpbnMgdG9cbiAqIGByZXF1aXJlKClgLlxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHJlcXVlc3Qgd2VicGFjayBpcyByZXNvbHZpbmcuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgdG8gYW5zd2VyIHRocm91Z2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvYnNpZGlhblBsdWdpbldlYnBhY2tFeHRlcm5hbHMoZGF0YTogRXh0ZXJuYWxzRGF0YSwgY2FsbGJhY2s6IEV4dGVybmFsc0NhbGxiYWNrKTogdm9pZCB7XG4gIGlmIChkYXRhLnJlcXVlc3QgIT09IHVuZGVmaW5lZCAmJiBpc09ic2lkaWFuUGx1Z2luRXh0ZXJuYWwoZGF0YS5yZXF1ZXN0KSkge1xuICAgIGNhbGxiYWNrKG51bGwsIGBjb21tb25qczIgJHtkYXRhLnJlcXVlc3R9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNhbGxiYWNrKCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBQYXJ0IG9mIHRoZSB3ZWJwYWNrIGhvb2tzIGFib3ZlLiAqL1xuLyoqXG4gKiBBcHBsaWVzIHRoZSBidWlsZCBmZWF0dXJlcyB0byBhIGNvbXBpbGVyOiB0aGUgcnVsZXMgb2Yge0BsaW5rIGdldFdlYnBhY2tGZWF0dXJlUnVsZXN9LCBgbWluaS1jc3MtZXh0cmFjdC1wbHVnaW5gXG4gKiBmb3IgYHN0eWxlc2AgdW5sZXNzIHRoZSBjb25maWcgYWxyZWFkeSBhcHBsaWVzIGl0LCBhbmQgYHVucGx1Z2luLXZ1ZWAgd2l0aCBWdWUncyBmZWF0dXJlIGZsYWdzIGZvciBWdWUuXG4gKlxuICogQHBhcmFtIGNvbXBpbGVyIC0gVGhlIHdlYnBhY2sgY29tcGlsZXIuXG4gKiBAcGFyYW0gZmVhdHVyZXMgLSBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gKiBAcGFyYW0gaXNQcm9kdWN0aW9uQnVpbGQgLSBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICovXG5mdW5jdGlvbiBhcHBseVdlYnBhY2tGZWF0dXJlcyhjb21waWxlcjogQ29tcGlsZXIsIGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZDogYm9vbGVhbik6IHZvaWQge1xuICBsZXQgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoID0gJyc7XG4gIGxldCBjc3NMb2FkZXJQYXRoID0gJyc7XG4gIGlmIChmZWF0dXJlcy5zdHlsZXMpIHtcbiAgICBjb25zdCBzdHlsZXNGZWF0dXJlID0gJ3N0eWxlcyc7XG4gICAgY3NzTG9hZGVyUGF0aCA9IHJlc29sdmVPcHRpb25hbFBlZXIoeyBmZWF0dXJlOiBzdHlsZXNGZWF0dXJlLCBwYWNrYWdlTmFtZTogJ2Nzcy1sb2FkZXInIH0pO1xuICAgIGNvbnN0IE1pbmlDc3NFeHRyYWN0UGx1Z2luID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKFxuICAgICAgcmVxdWlyZU9wdGlvbmFsUGVlcih7IGZlYXR1cmU6IHN0eWxlc0ZlYXR1cmUsIHBhY2thZ2VOYW1lOiBNSU5JX0NTU19FWFRSQUNUX1BMVUdJTiB9KSBhcyBNaW5pQ3NzRXh0cmFjdFBsdWdpbk1vZHVsZVxuICAgICk7XG4gICAgbWluaUNzc0V4dHJhY3RMb2FkZXJQYXRoID0gTWluaUNzc0V4dHJhY3RQbHVnaW4ubG9hZGVyO1xuICAgIGNvbnN0IGhhc01pbmlDc3NFeHRyYWN0UGx1Z2luID0gY29tcGlsZXIub3B0aW9ucy5wbHVnaW5zLnNvbWUoKHBsdWdpbikgPT4gcGx1Z2luLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdNaW5pQ3NzRXh0cmFjdFBsdWdpbicpO1xuICAgIGlmICghaGFzTWluaUNzc0V4dHJhY3RQbHVnaW4pIHtcbiAgICAgIG5ldyBNaW5pQ3NzRXh0cmFjdFBsdWdpbigpLmFwcGx5KGNvbXBpbGVyKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBsb2FkZXJQYXRoID0gZmlsZVVSTFRvUGF0aChuZXcgVVJMKGBvYnNpZGlhbi1wbHVnaW4td2VicGFjay1sb2FkZXIke2V4dG5hbWUoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKX1gLCBpbXBvcnQubWV0YS51cmwpKTtcbiAgY29tcGlsZXIub3B0aW9ucy5tb2R1bGUucnVsZXMucHVzaCguLi5nZXRXZWJwYWNrRmVhdHVyZVJ1bGVzKHsgY3NzTG9hZGVyUGF0aCwgZmVhdHVyZXMsIGlzUHJvZHVjdGlvbkJ1aWxkLCBsb2FkZXJQYXRoLCBtaW5pQ3NzRXh0cmFjdExvYWRlclBhdGggfSkpO1xuXG4gIGlmIChmZWF0dXJlcy5mcmFtZXdvcmsgIT09ICd2dWUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHVucGx1Z2luVnVlID0gZXh0cmFjdERlZmF1bHRFeHBvcnRJbnRlcm9wKFxuICAgIHJlcXVpcmVPcHRpb25hbFBlZXIoeyBmZWF0dXJlOiAnZnJhbWV3b3JrOiBcXCd2dWVcXCcnLCBwYWNrYWdlTmFtZTogJ3VucGx1Z2luLXZ1ZScsIHNwZWNpZmllcjogJ3VucGx1Z2luLXZ1ZS93ZWJwYWNrJyB9KSBhcyBVbnBsdWdpblZ1ZVdlYnBhY2tNb2R1bGVcbiAgKTtcbiAgdW5wbHVnaW5WdWUoKS5hcHBseShjb21waWxlcik7XG4gIC8vIGBwcm9jZXNzLmVudi5OT0RFX0VOVmAgaXMgbGVmdCBvdXQ6IHdlYnBhY2sncyBgbW9kZWAgZGVmaW5lcyBpdCwgYW5kIGEgc2Vjb25kIGRlZmluaXRpb24gY29uZmxpY3RzLlxuICBjb25zdCB7ICdwcm9jZXNzLmVudi5OT0RFX0VOVic6IF9ub2RlRW52LCAuLi52dWVGbGFncyB9ID0gZ2V0RnJhbWV3b3JrRGVmaW5lcyh7IGZyYW1ld29yazogZmVhdHVyZXMuZnJhbWV3b3JrLCBpc1Byb2R1Y3Rpb25CdWlsZCB9KTtcbiAgbmV3IGNvbXBpbGVyLndlYnBhY2suRGVmaW5lUGx1Z2luKHZ1ZUZsYWdzKS5hcHBseShjb21waWxlcik7XG59XG5cbi8qKlxuICogRmlsbHMgaW4gdGhlIG5vcm1hbGl6ZWQgd2VicGFjayBvcHRpb25zIHRoZSBjb25zdW1lciBsZWZ0IHVuc2V0LlxuICpcbiAqIFJ1bnMgd2hpbGUgdGhlIHBsdWdpbiBpcyBhcHBsaWVkLCB3aGljaCB3ZWJwYWNrIGRvZXMgYWZ0ZXIgbm9ybWFsaXppbmcgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGFuZCBiZWZvcmVcbiAqIGFwcGx5aW5nIGl0cyBvd24gZGVmYXVsdHMsIHNvIGFuIHVuc2V0IG9wdGlvbiBzdGlsbCByZWFkcyBgdW5kZWZpbmVkYCBoZXJlLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG5vcm1hbGl6ZWQgd2VicGFjayBvcHRpb25zLCBjaGFuZ2VkIGluIHBsYWNlLlxuICogQHBhcmFtIG1vZGUgLSBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZnVuY3Rpb24gYXBwbHlXZWJwYWNrT3B0aW9uRGVmYXVsdHMob3B0aW9uczogV2VicGFja09wdGlvbnNOb3JtYWxpemVkLCBtb2RlOiBCdWlsZE1vZGUpOiB2b2lkIHtcbiAgY29uc3QgaXNQcm9kdWN0aW9uQnVpbGQgPSBtb2RlID09PSBCdWlsZE1vZGUuUHJvZHVjdGlvbjtcbiAgb3B0aW9ucy5tb2RlID8/PSBpc1Byb2R1Y3Rpb25CdWlsZCA/ICdwcm9kdWN0aW9uJyA6ICdkZXZlbG9wbWVudCc7XG4gIG9wdGlvbnMudGFyZ2V0ID8/PSAnbm9kZSc7XG4gIG9wdGlvbnMuZGV2dG9vbCA/Pz0gIWlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUtc291cmNlLW1hcCc7XG5cbiAgaWYgKHR5cGVvZiBvcHRpb25zLmVudHJ5ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudHJ5KS5sZW5ndGggPT09IDEgJiYgb3B0aW9ucy5lbnRyeVsnbWFpbiddPy5pbXBvcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIG9wdGlvbnMuZW50cnkgPSB7IG1haW46IHsgaW1wb3J0OiBbZ2V0T2JzaWRpYW5QbHVnaW5FbnRyeVBvaW50KCldIH0gfTtcbiAgfVxuXG4gIG9wdGlvbnMub3V0cHV0LnBhdGggPz89IGdldE9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihtb2RlKTtcbiAgb3B0aW9ucy5vdXRwdXQuZmlsZW5hbWUgPz89IE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLk1haW5KcztcbiAgb3B0aW9ucy5vdXRwdXQubGlicmFyeSA/Pz0geyB0eXBlOiAnY29tbW9uanMyJyB9O1xuICBvcHRpb25zLm91dHB1dC5hc3luY0NodW5rcyA/Pz0gZmFsc2U7XG5cbiAgLy8gTGlzdGVkIGluIGZ1bGwgcmF0aGVyIHRoYW4gd2l0aCBgJy4uLidgLCB3aGljaCB3b3VsZCBicmluZyBpbiB0aGUgYG5vZGVgIGNvbmRpdGlvbiBvZiBgdGFyZ2V0OiAnbm9kZSdgOiBleHBvcnRcbiAgLy8gTWFwcyBhcmUgbWF0Y2hlZCBpbiB0aGUgcGFja2FnZSdzIGtleSBvcmRlciwgbm90IHRoaXMgb25lJ3MsIHNvIGEgcGFja2FnZSBsaXN0aW5nIGBub2RlYCBiZWZvcmUgYGJyb3dzZXJgIChWdWUsXG4gIC8vIGBmZmxhdGVgKSB3b3VsZCBoYW5kIG92ZXIgaXRzIE5vZGUgYnVpbGQsIHdoaWNoIGRvZXMgbm90IGxvYWQgb24gbW9iaWxlLlxuICBvcHRpb25zLnJlc29sdmUuY29uZGl0aW9uTmFtZXMgPz89IFsnYnJvd3NlcicsICd3ZWJwYWNrJywgaXNQcm9kdWN0aW9uQnVpbGQgPyAncHJvZHVjdGlvbicgOiAnZGV2ZWxvcG1lbnQnLCAnbW9kdWxlJywgJ2ltcG9ydCcsICdyZXF1aXJlJ107XG5cbiAgY29uc3QgdXNlckV4dGVybmFscyA9IG9wdGlvbnMuZXh0ZXJuYWxzO1xuICBvcHRpb25zLmV4dGVybmFscyA9IFtvYnNpZGlhblBsdWdpbldlYnBhY2tFeHRlcm5hbHMsIC4uLihBcnJheS5pc0FycmF5KHVzZXJFeHRlcm5hbHMpID8gdXNlckV4dGVybmFscyA6IFt1c2VyRXh0ZXJuYWxzXSldO1xufVxuXG4vKipcbiAqIFB1dHMgbGljZW5zZSBjb21tZW50cyBhIG1pbmltaXplciBleHRyYWN0ZWQgaW50byBhIGA8ZmlsZT4uTElDRU5TRS50eHRgIGJhY2sgaW50byB0aGUgZmlsZSB0aGV5IGNhbWUgZnJvbS5cbiAqXG4gKiBXZWJwYWNrJ3MgZGVmYXVsdCBtaW5pbWl6ZXIgbW92ZXMgZXZlcnkgYnVuZGxlZCBkZXBlbmRlbmN5J3MgbGljZW5zZSBjb21tZW50IGludG8gYVxuICogYG1haW4uanMuTElDRU5TRS50eHRgIGJlc2lkZSBgbWFpbi5qc2AsIHdoaWNoIG5vIE9ic2lkaWFuIHJlbGVhc2Ugc2hpcHMsIHNvIHRoZSBpbnN0YWxsZWQgcGx1Z2luIHdvdWxkXG4gKiBjYXJyeSBjb2RlIHdpdGhvdXQgdGhlIG5vdGljZXMgaXQgaXMgbGljZW5zZWQgdW5kZXIuIERvbmUgYWZ0ZXIgbWluaWZpY2F0aW9uIHJhdGhlciB0aGFuIGJ5IHJlcGxhY2luZ1xuICogdGhlIG1pbmltaXplciwgc28gaXQgaG9sZHMgd2hpY2hldmVyIG1pbmltaXplciB0aGUgY29uc3VtZXIgb3Igd2VicGFjayBwaWNrZWQuXG4gKlxuICogQHBhcmFtIGNvbXBpbGF0aW9uIC0gVGhlIGNvbXBpbGF0aW9uLlxuICogQHBhcmFtIGNvbXBpbGVyIC0gVGhlIGNvbXBpbGVyLCBmb3Igd2VicGFjaydzIGBzb3VyY2VzYCBjbGFzc2VzLlxuICovXG5mdW5jdGlvbiBpbmxpbmVFeHRyYWN0ZWRMaWNlbnNlcyhjb21waWxhdGlvbjogQ29tcGlsYXRpb24sIGNvbXBpbGVyOiBDb21waWxlcik6IHZvaWQge1xuICBjb25zdCBMSUNFTlNFX1NVRkZJWCA9ICcuTElDRU5TRS50eHQnO1xuICBmb3IgKGNvbnN0IGxpY2Vuc2VBc3NldCBvZiBjb21waWxhdGlvbi5nZXRBc3NldHMoKSkge1xuICAgIGlmICghbGljZW5zZUFzc2V0Lm5hbWUuZW5kc1dpdGgoTElDRU5TRV9TVUZGSVgpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3Qgc291cmNlRmlsZU5hbWUgPSBsaWNlbnNlQXNzZXQubmFtZS5zbGljZSgwLCAtTElDRU5TRV9TVUZGSVgubGVuZ3RoKTtcbiAgICBjb25zdCBzb3VyY2VBc3NldCA9IGNvbXBpbGF0aW9uLmdldEFzc2V0KHNvdXJjZUZpbGVOYW1lKTtcbiAgICBpZiAoIXNvdXJjZUFzc2V0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgbGljZW5zZUZpbGVOYW1lID0gbGljZW5zZUFzc2V0Lm5hbWUuc3BsaXQoJy8nKS5hdCgtMSkgPz8gbGljZW5zZUFzc2V0Lm5hbWU7XG4gICAgY29uc3QgcmVmZXJlbmNlID0gYC8qISBGb3IgbGljZW5zZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlICR7bGljZW5zZUZpbGVOYW1lfSAqL2A7XG4gICAgY29uc3Qgc291cmNlID0gc291cmNlQXNzZXQuc291cmNlLnNvdXJjZSgpLnRvU3RyaW5nKCk7XG4gICAgY29uc3QgbGljZW5zZXMgPSBsaWNlbnNlQXNzZXQuc291cmNlLnNvdXJjZSgpLnRvU3RyaW5nKCkudHJpbUVuZCgpO1xuICAgIGNvbnN0IHVwZGF0ZWRTb3VyY2UgPSBzb3VyY2UuaW5jbHVkZXMocmVmZXJlbmNlKSA/IHNvdXJjZS5yZXBsYWNlKHJlZmVyZW5jZSwgKCkgPT4gbGljZW5zZXMpIDogYCR7bGljZW5zZXN9XFxuJHtzb3VyY2V9YDtcbiAgICBjb21waWxhdGlvbi51cGRhdGVBc3NldChzb3VyY2VGaWxlTmFtZSwgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2UodXBkYXRlZFNvdXJjZSkpO1xuICAgIGNvbXBpbGF0aW9uLmRlbGV0ZUFzc2V0KGxpY2Vuc2VBc3NldC5uYW1lKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vdmVzIGV2ZXJ5IENTUyBhc3NldCBvZiBhIGNvbXBpbGF0aW9uIGludG8gYHN0eWxlcy5jc3NgLlxuICpcbiAqIEBwYXJhbSBjb21waWxhdGlvbiAtIFRoZSBjb21waWxhdGlvbi5cbiAqIEBwYXJhbSBjb21waWxlciAtIFRoZSBjb21waWxlciwgZm9yIHdlYnBhY2sncyBgc291cmNlc2AgY2xhc3Nlcy5cbiAqL1xuZnVuY3Rpb24gcmVuYW1lV2VicGFja0Nzc0Fzc2V0cyhjb21waWxhdGlvbjogQ29tcGlsYXRpb24sIGNvbXBpbGVyOiBDb21waWxlcik6IHZvaWQge1xuICBjb25zdCBjc3NBc3NldHMgPSBjb21waWxhdGlvbi5nZXRBc3NldHMoKVxuICAgIC5maWx0ZXIoKGFzc2V0KSA9PiBpc0Nzc0ZpbGVOYW1lKGFzc2V0Lm5hbWUpKVxuICAgIC5tYXAoKGFzc2V0KSA9PiAoeyBmaWxlTmFtZTogYXNzZXQubmFtZSwgc291cmNlOiBhc3NldC5zb3VyY2Uuc291cmNlKCkudG9TdHJpbmcoKSB9KSk7XG4gIGNvbnN0IHsgZmlsZU5hbWVzVG9SZW1vdmUsIHN0eWxlc0NzcyB9ID0gbWVyZ2VDc3NBc3NldHMoY3NzQXNzZXRzKTtcbiAgaWYgKHN0eWxlc0NzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3QgZmlsZU5hbWUgb2YgZmlsZU5hbWVzVG9SZW1vdmUpIHtcbiAgICBjb21waWxhdGlvbi5kZWxldGVBc3NldChmaWxlTmFtZSk7XG4gIH1cbiAgY29tcGlsYXRpb24uZW1pdEFzc2V0KE9ic2lkaWFuUGx1Z2luUmVwb1BhdGhzLlN0eWxlc0NzcywgbmV3IGNvbXBpbGVyLndlYnBhY2suc291cmNlcy5SYXdTb3VyY2Uoc3R5bGVzQ3NzKSk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9CQSxTQUFTLG1DQUFtQztBQUM1QyxTQUFTLGVBQWU7QUFDeEIsU0FBUyxxQkFBcUI7QUFTOUIsU0FBUywrQkFBK0I7QUFDeEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLHFDQUFxQztBQTZFOUMsTUFBTSxjQUFjO0FBQ3BCLE1BQU0sMEJBQTBCO0FBa0N6QixNQUFNLDRCQUE2RDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1qRSxZQUE2QixVQUE4QyxDQUFDLEdBQUc7QUFBbEQ7QUFBQSxFQUFtRDtBQUFBLEVBQW5EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRN0IsTUFBTSxVQUEwQjtBQUNyQyxVQUFNLE9BQU8sS0FBSyxRQUFRLFFBQVEsb0JBQW9CLFNBQVMsT0FBTztBQUN0RSwrQkFBMkIsU0FBUyxTQUFTLElBQUk7QUFDakQseUJBQXFCLFVBQVUsS0FBSyxTQUFTLFNBQVMsVUFBVSxVQUFVO0FBRTFFLFFBQUksU0FBUyxRQUFRLGFBQWE7QUFBQSxNQUNoQyxRQUFRLHdCQUF3QixTQUFTO0FBQUEsTUFDekMsS0FBSztBQUFBLE1BQ0wsT0FBTyxTQUFTLFFBQVEsWUFBWTtBQUFBLE1BQ3BDLE1BQU07QUFBQSxJQUNSLENBQUMsRUFBRSxNQUFNLFFBQVE7QUFFakIsVUFBTSxzQkFBc0Isa0NBQWtDO0FBQUEsTUFDNUQsR0FBRyxLQUFLO0FBQUEsTUFDUixHQUFJLFNBQVMsUUFBUSxPQUFPLFNBQVMsVUFBYSxFQUFFLFlBQVksU0FBUyxRQUFRLE9BQU8sS0FBSztBQUFBLE1BQzdGO0FBQUEsSUFDRixDQUFDO0FBQ0QsUUFBSSxzQkFBc0I7QUFFMUIsbUJBQWUsVUFBeUI7QUFDdEMsWUFBTSxlQUFlLE1BQU07QUFDM0IsVUFBSSxxQkFBcUI7QUFDdkI7QUFBQSxNQUNGO0FBQ0EsNEJBQXNCO0FBQ3RCLFlBQU0sOEJBQThCLGFBQWEsVUFBVTtBQUFBLElBQzdEO0FBQ0EsYUFBUyxNQUFNLFVBQVUsV0FBVyxhQUFhLE9BQU87QUFDeEQsYUFBUyxNQUFNLFNBQVMsV0FBVyxhQUFhLE9BQU87QUFFdkQsYUFBUyxNQUFNLGdCQUFnQixJQUFJLGFBQWEsQ0FBQyxnQkFBZ0I7QUFDL0Qsa0JBQVksTUFBTSxjQUFjO0FBQUEsUUFDOUIsRUFBRSxNQUFNLGFBQWEsT0FBTyxTQUFTLFFBQVEsWUFBWSwrQkFBK0I7QUFBQSxRQUN4RixNQUFNO0FBQ0osaUNBQXVCLGFBQWEsUUFBUTtBQUM1QyxrQ0FBd0IsYUFBYSxRQUFRO0FBQUEsUUFDL0M7QUFBQSxNQUNGO0FBQUEsSUFDRixDQUFDO0FBRUQsYUFBUyxNQUFNLFVBQVUsV0FBVyxhQUFhLE9BQU8sZ0JBQWdCO0FBQ3RFLFVBQUksWUFBWSxTQUFTLEVBQUUsVUFBVSxHQUFHO0FBQ3RDO0FBQUEsTUFDRjtBQUNBLFlBQU0sZUFBZSxNQUFNO0FBQzNCLFlBQU0saUNBQWlDLFlBQVk7QUFDbkQsWUFBTSw4QkFBOEIsWUFBWTtBQUFBLElBQ2xELENBQUM7QUFBQSxFQUNIO0FBQUE7QUFFRjtBQVNPLFNBQVMsb0JBQW9CLFNBQXNFO0FBQ3hHLFNBQU8sUUFBUSxTQUFTLFFBQVEsU0FBUyxnQkFBZ0IsVUFBVSxjQUFjLFVBQVU7QUFDN0Y7QUFVTyxTQUFTLHVCQUF1QixRQUFxRDtBQUMxRixRQUFNLEVBQUUsZUFBZSxVQUFVLG1CQUFtQixZQUFZLHlCQUF5QixJQUFJO0FBQzdGLFFBQU0sUUFBdUIsQ0FBQztBQUU5QixXQUFTLGNBQWMsTUFBa0QsUUFBd0Q7QUFDL0gsVUFBTSxVQUE4QyxFQUFFLG1CQUFtQixNQUFNLEdBQUksVUFBVSxFQUFFLE9BQU8sRUFBRztBQUN6RyxXQUFPLENBQUMsRUFBRSxRQUFRLFlBQVksUUFBUSxDQUFDO0FBQUEsRUFDekM7QUFFQSxVQUFRLFNBQVMsV0FBVztBQUFBLElBQzFCLEtBQUssU0FBUztBQUNaLFlBQU0sS0FBSyxFQUFFLFNBQVMsT0FBTyxNQUFNLGVBQWUsS0FBSyxjQUFjLEtBQUssRUFBRSxDQUFDO0FBQzdFO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQ2IsWUFBTTtBQUFBLFFBQ0osRUFBRSxNQUFNLGVBQWUsS0FBSyxjQUFjLFFBQVEsRUFBRTtBQUFBLFFBQ3BELEVBQUUsU0FBUyxPQUFPLE1BQU0sMkJBQTJCLEtBQUssY0FBYyxRQUFRLEVBQUU7QUFBQSxNQUNsRjtBQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsS0FBSyxPQUFPO0FBR1YsWUFBTSxLQUFLLEVBQUUsU0FBUyxRQUFRLE1BQU0sZ0NBQWdDLEtBQUssY0FBYyxZQUFZLEVBQUUsQ0FBQztBQUN0RztBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFDUDtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsTUFBSSxTQUFTLE1BQU07QUFDakIsVUFBTSxLQUFLLEVBQUUsTUFBTSxhQUFhLE1BQU0sbUJBQW1CLEtBQUssY0FBYyxNQUFNLEVBQUUsQ0FBQztBQUFBLEVBQ3ZGO0FBQ0EsTUFBSSxTQUFTLFFBQVE7QUFDbkIsVUFBTSxLQUFLO0FBQUEsTUFDVCxNQUFNO0FBQUEsTUFDTixLQUFLO0FBQUEsUUFDSDtBQUFBLFFBQ0E7QUFBQSxVQUNFLFFBQVE7QUFBQSxVQUNSLFNBQVM7QUFBQSxZQUNQLGVBQWU7QUFBQSxZQUNmLFNBQVMsU0FBUyxPQUFPLGFBQWEsRUFBRSxNQUFNLE1BQU0sYUFBYSxNQUFNLElBQUk7QUFBQSxVQUM3RTtBQUFBLFFBQ0Y7QUFBQSxRQUNBLEdBQUcsZ0JBQWdCLFNBQVMsTUFBTSxJQUFJLGNBQWMsY0FBYyxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQUEsTUFDeEY7QUFBQSxJQUNGLENBQUM7QUFBQSxFQUNIO0FBQ0EsU0FBTztBQUNUO0FBU08sU0FBUywrQkFBK0IsTUFBcUIsVUFBbUM7QUFDckcsTUFBSSxLQUFLLFlBQVksVUFBYSx5QkFBeUIsS0FBSyxPQUFPLEdBQUc7QUFDeEUsYUFBUyxNQUFNLGFBQWEsS0FBSyxPQUFPLEVBQUU7QUFDMUM7QUFBQSxFQUNGO0FBQ0EsV0FBUztBQUNYO0FBV0EsU0FBUyxxQkFBcUIsVUFBb0IsVUFBd0MsbUJBQWtDO0FBQzFILE1BQUksMkJBQTJCO0FBQy9CLE1BQUksZ0JBQWdCO0FBQ3BCLE1BQUksU0FBUyxRQUFRO0FBQ25CLFVBQU0sZ0JBQWdCO0FBQ3RCLG9CQUFnQixvQkFBb0IsRUFBRSxTQUFTLGVBQWUsYUFBYSxhQUFhLENBQUM7QUFDekYsVUFBTSx1QkFBdUI7QUFBQSxNQUMzQixvQkFBb0IsRUFBRSxTQUFTLGVBQWUsYUFBYSx3QkFBd0IsQ0FBQztBQUFBLElBQ3RGO0FBQ0EsK0JBQTJCLHFCQUFxQjtBQUNoRCxVQUFNLDBCQUEwQixTQUFTLFFBQVEsUUFBUSxLQUFLLENBQUMsV0FBVyxPQUFPLFlBQVksU0FBUyxzQkFBc0I7QUFDNUgsUUFBSSxDQUFDLHlCQUF5QjtBQUM1QixVQUFJLHFCQUFxQixFQUFFLE1BQU0sUUFBUTtBQUFBLElBQzNDO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxjQUFjLElBQUksSUFBSSxpQ0FBaUMsUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxZQUFZLEdBQUcsQ0FBQztBQUNySSxXQUFTLFFBQVEsT0FBTyxNQUFNLEtBQUssR0FBRyx1QkFBdUIsRUFBRSxlQUFlLFVBQVUsbUJBQW1CLFlBQVkseUJBQXlCLENBQUMsQ0FBQztBQUVsSixNQUFJLFNBQVMsY0FBYyxPQUFPO0FBQ2hDO0FBQUEsRUFDRjtBQUNBLFFBQU0sY0FBYztBQUFBLElBQ2xCLG9CQUFvQixFQUFFLFNBQVMsb0JBQXNCLGFBQWEsZ0JBQWdCLFdBQVcsdUJBQXVCLENBQUM7QUFBQSxFQUN2SDtBQUNBLGNBQVksRUFBRSxNQUFNLFFBQVE7QUFFNUIsUUFBTSxFQUFFLHdCQUF3QixVQUFVLEdBQUcsU0FBUyxJQUFJLG9CQUFvQixFQUFFLFdBQVcsU0FBUyxXQUFXLGtCQUFrQixDQUFDO0FBQ2xJLE1BQUksU0FBUyxRQUFRLGFBQWEsUUFBUSxFQUFFLE1BQU0sUUFBUTtBQUM1RDtBQVdBLFNBQVMsMkJBQTJCLFNBQW1DLE1BQXVCO0FBQzVGLFFBQU0sb0JBQW9CLFNBQVMsVUFBVTtBQUM3QyxVQUFRLFNBQVMsb0JBQW9CLGVBQWU7QUFDcEQsVUFBUSxXQUFXO0FBQ25CLFVBQVEsWUFBWSxDQUFDLHFCQUFxQjtBQUUxQyxNQUFJLE9BQU8sUUFBUSxVQUFVLFlBQVksT0FBTyxLQUFLLFFBQVEsS0FBSyxFQUFFLFdBQVcsS0FBSyxRQUFRLE1BQU0sTUFBTSxHQUFHLFdBQVcsUUFBVztBQUMvSCxZQUFRLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLDRCQUE0QixDQUFDLEVBQUUsRUFBRTtBQUFBLEVBQ3RFO0FBRUEsVUFBUSxPQUFPLFNBQVMsNEJBQTRCLElBQUk7QUFDeEQsVUFBUSxPQUFPLGFBQWEsd0JBQXdCO0FBQ3BELFVBQVEsT0FBTyxZQUFZLEVBQUUsTUFBTSxZQUFZO0FBQy9DLFVBQVEsT0FBTyxnQkFBZ0I7QUFLL0IsVUFBUSxRQUFRLG1CQUFtQixDQUFDLFdBQVcsV0FBVyxvQkFBb0IsZUFBZSxlQUFlLFVBQVUsVUFBVSxTQUFTO0FBRXpJLFFBQU0sZ0JBQWdCLFFBQVE7QUFDOUIsVUFBUSxZQUFZLENBQUMsZ0NBQWdDLEdBQUksTUFBTSxRQUFRLGFBQWEsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUU7QUFDMUg7QUFhQSxTQUFTLHdCQUF3QixhQUEwQixVQUEwQjtBQUNuRixRQUFNLGlCQUFpQjtBQUN2QixhQUFXLGdCQUFnQixZQUFZLFVBQVUsR0FBRztBQUNsRCxRQUFJLENBQUMsYUFBYSxLQUFLLFNBQVMsY0FBYyxHQUFHO0FBQy9DO0FBQUEsSUFDRjtBQUNBLFVBQU0saUJBQWlCLGFBQWEsS0FBSyxNQUFNLEdBQUcsQ0FBQyxlQUFlLE1BQU07QUFDeEUsVUFBTSxjQUFjLFlBQVksU0FBUyxjQUFjO0FBQ3ZELFFBQUksQ0FBQyxhQUFhO0FBQ2hCO0FBQUEsSUFDRjtBQUNBLFVBQU0sa0JBQWtCLGFBQWEsS0FBSyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxhQUFhO0FBQzVFLFVBQU0sWUFBWSwwQ0FBMEMsZUFBZTtBQUMzRSxVQUFNLFNBQVMsWUFBWSxPQUFPLE9BQU8sRUFBRSxTQUFTO0FBQ3BELFVBQU0sV0FBVyxhQUFhLE9BQU8sT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRO0FBQ2pFLFVBQU0sZ0JBQWdCLE9BQU8sU0FBUyxTQUFTLElBQUksT0FBTyxRQUFRLFdBQVcsTUFBTSxRQUFRLElBQUksR0FBRyxRQUFRO0FBQUEsRUFBSyxNQUFNO0FBQ3JILGdCQUFZLFlBQVksZ0JBQWdCLElBQUksU0FBUyxRQUFRLFFBQVEsVUFBVSxhQUFhLENBQUM7QUFDN0YsZ0JBQVksWUFBWSxhQUFhLElBQUk7QUFBQSxFQUMzQztBQUNGO0FBUUEsU0FBUyx1QkFBdUIsYUFBMEIsVUFBMEI7QUFDbEYsUUFBTSxZQUFZLFlBQVksVUFBVSxFQUNyQyxPQUFPLENBQUMsVUFBVSxjQUFjLE1BQU0sSUFBSSxDQUFDLEVBQzNDLElBQUksQ0FBQyxXQUFXLEVBQUUsVUFBVSxNQUFNLE1BQU0sUUFBUSxNQUFNLE9BQU8sT0FBTyxFQUFFLFNBQVMsRUFBRSxFQUFFO0FBQ3RGLFFBQU0sRUFBRSxtQkFBbUIsVUFBVSxJQUFJLGVBQWUsU0FBUztBQUNqRSxNQUFJLGNBQWMsUUFBVztBQUMzQjtBQUFBLEVBQ0Y7QUFDQSxhQUFXLFlBQVksbUJBQW1CO0FBQ3hDLGdCQUFZLFlBQVksUUFBUTtBQUFBLEVBQ2xDO0FBQ0EsY0FBWSxVQUFVLHdCQUF3QixXQUFXLElBQUksU0FBUyxRQUFRLFFBQVEsVUFBVSxTQUFTLENBQUM7QUFDNUc7IiwibmFtZXMiOltdfQ==
@@ -0,0 +1,15 @@
1
+ /// <reference path="./library-references.d.mts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * The `archive-demo-vault` command: runs {@link archivePluginDemoVault} on the built plugin and turns the result into
6
+ * an exit code. The `obsidian-plugin-release.yml` reusable workflow runs it after the build, so a release made in CI
7
+ * carries the same demo vault archive as one made with `npm run version`.
8
+ */
9
+ /**
10
+ * Runs `archive-demo-vault`. A plugin without a `demo-vault/` folder is not a failure: there is nothing to archive.
11
+ *
12
+ * @returns A {@link Promise} that resolves to the exit code: `0` once the archive is written or when there is no demo
13
+ * vault, `1` on any failure, which is printed to stderr.
14
+ */
15
+ export declare function runArchiveDemoVaultCli(): Promise<number>;