@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,218 @@
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
+ (function patchObsidianRequire() {
33
+ const originalRequire = require;
34
+ if (!originalRequire || originalRequire.__isPatched) {
35
+ return;
36
+ }
37
+
38
+ require = Object.assign(
39
+ (id) => requirePatched(id),
40
+ originalRequire,
41
+ {
42
+ __isPatched: true
43
+ }
44
+ );
45
+
46
+ function extractDefault(module) {
47
+ return module && module.__esModule && 'default' in module ? module.default : module;
48
+ }
49
+
50
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
51
+ '@codemirror/autocomplete',
52
+ '@codemirror/collab',
53
+ '@codemirror/commands',
54
+ '@codemirror/language',
55
+ '@codemirror/lint',
56
+ '@codemirror/search',
57
+ '@codemirror/state',
58
+ '@codemirror/text',
59
+ '@codemirror/view',
60
+ '@lezer/common',
61
+ '@lezer/highlight',
62
+ '@lezer/lr',
63
+ 'obsidian']
64
+ );
65
+
66
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
67
+ '@codemirror/closebrackets',
68
+ '@codemirror/comment',
69
+ '@codemirror/fold',
70
+ '@codemirror/gutter',
71
+ '@codemirror/highlight',
72
+ '@codemirror/history',
73
+ '@codemirror/matchbrackets',
74
+ '@codemirror/panel',
75
+ '@codemirror/rangeset',
76
+ '@codemirror/rectangular-selection',
77
+ '@codemirror/stream-parser',
78
+ '@codemirror/tooltip']
79
+ );
80
+
81
+ function requirePatched(id) {
82
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
83
+ return originalRequire?.(id);
84
+ }
85
+
86
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
87
+ if (globalThis.app.isMobile) {
88
+ if (id === 'process' || id === 'node:process') {
89
+ // eslint-disable-next-line no-console -- Valid usage.
90
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
91
+
92
+ return process;
93
+ }
94
+ } else {
95
+ const module = originalRequire?.(id);
96
+ if (module) {
97
+ return extractDefault(module);
98
+ }
99
+ }
100
+
101
+ // eslint-disable-next-line no-console -- Valid usage.
102
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
103
+ return {};
104
+ }
105
+ })();
106
+
107
+ "use strict";
108
+ var __defProp = Object.defineProperty;
109
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
110
+ var __getOwnPropNames = Object.getOwnPropertyNames;
111
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
112
+ var __export = (target, all) => {
113
+ for (var name in all)
114
+ __defProp(target, name, { get: all[name], enumerable: true });
115
+ };
116
+ var __copyProps = (to, from, except, desc) => {
117
+ if (from && typeof from === "object" || typeof from === "function") {
118
+ for (let key of __getOwnPropNames(from))
119
+ if (!__hasOwnProp.call(to, key) && key !== except)
120
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
121
+ }
122
+ return to;
123
+ };
124
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
125
+ var rollup_exports = {};
126
+ __export(rollup_exports, {
127
+ applyRollupInputDefaults: () => applyRollupInputDefaults,
128
+ applyRollupOutputDefaults: () => applyRollupOutputDefaults,
129
+ obsidianPluginRollup: () => obsidianPluginRollup
130
+ });
131
+ module.exports = __toCommonJS(rollup_exports);
132
+ var import_path = require('@mnaoumov/typescript-lib/path');
133
+ var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
134
+ var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
135
+ var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
136
+ var import_rollup_compatible_features = require('./rollup-compatible-features.cjs');
137
+ var import_rollup_compatible = require('./rollup-compatible.cjs');
138
+ function applyRollupInputDefaults(params) {
139
+ const { buildContext, inputOptions } = params;
140
+ const jsxImportSource = (0, import_obsidian_plugin_features.getJsxImportSource)(params.features?.framework);
141
+ return {
142
+ ...inputOptions,
143
+ external: (0, import_rollup_compatible.combineExternal)(inputOptions.external),
144
+ input: inputOptions.input ?? buildContext.entryPoint,
145
+ ...jsxImportSource !== void 0 && inputOptions.jsx === void 0 && { jsx: { jsxImportSource, mode: "automatic" } }
146
+ };
147
+ }
148
+ function applyRollupOutputDefaults(params) {
149
+ const { buildContext, outputOptions } = params;
150
+ const hasOutputLocation = outputOptions.file !== void 0 || outputOptions.dir !== void 0;
151
+ return {
152
+ ...outputOptions,
153
+ banner: outputOptions.banner ?? (0, import_obsidian_plugin_build.getObsidianPluginBanner)("rollup"),
154
+ format: outputOptions.format ?? "cjs",
155
+ ...!hasOutputLocation && { file: buildContext.mainJsPath },
156
+ // An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
157
+ inlineDynamicImports: outputOptions.inlineDynamicImports ?? true,
158
+ sourcemap: outputOptions.sourcemap ?? (!buildContext.isProductionBuild && "inline")
159
+ };
160
+ }
161
+ function obsidianPluginRollup(options = {}) {
162
+ const state = {
163
+ buildContext: void 0,
164
+ isDistFolderCleaned: false
165
+ };
166
+ function getBuildContext() {
167
+ if (!state.buildContext) {
168
+ throw new Error("The obsidian-plugin rollup plugin has not resolved its build context: its `options` hook did not run.");
169
+ }
170
+ return state.buildContext;
171
+ }
172
+ const featurePlugin = (0, import_rollup_compatible_features.createRollupCompatibleFeaturePlugin)({
173
+ features: options,
174
+ isProductionBuild: () => getBuildContext().isProductionBuild,
175
+ shouldCompileStylesheets: true,
176
+ shouldReplaceDefines: true
177
+ });
178
+ const plugin = {
179
+ generateBundle: {
180
+ handler(_outputOptions, bundle) {
181
+ (0, import_rollup_compatible.renameCssAssets)(this, bundle);
182
+ },
183
+ order: "post"
184
+ },
185
+ name: "obsidian-plugin",
186
+ async options(inputOptions) {
187
+ const mode = options.mode ?? (this.meta.watchMode ? import_obsidian_plugin_build.BuildMode.Development : import_obsidian_plugin_build.BuildMode.Production);
188
+ state.buildContext = await (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)({ ...options, mode });
189
+ return applyRollupInputDefaults({ buildContext: state.buildContext, features: options, inputOptions });
190
+ },
191
+ outputOptions(outputOptions) {
192
+ return applyRollupOutputDefaults({ buildContext: getBuildContext(), outputOptions });
193
+ },
194
+ async renderStart(outputOptions) {
195
+ if (state.isDistFolderCleaned) {
196
+ return;
197
+ }
198
+ state.isDistFolderCleaned = true;
199
+ await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(getOutputFolder(outputOptions));
200
+ },
201
+ async writeBundle(outputOptions) {
202
+ const buildContext = { ...getBuildContext(), distFolder: getOutputFolder(outputOptions) };
203
+ await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(buildContext);
204
+ await (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(buildContext);
205
+ }
206
+ };
207
+ return [plugin, featurePlugin, (0, import_rollup_compatible_features.createUnpluginVuePlugin)({ bundler: "rollup", features: options })];
208
+ }
209
+ function getOutputFolder(outputOptions) {
210
+ return outputOptions.dir ?? (0, import_path.dirname)(outputOptions.file ?? "");
211
+ }
212
+ // Annotate the CommonJS export names for ESM import in node:
213
+ 0 && (module.exports = {
214
+ applyRollupInputDefaults,
215
+ applyRollupOutputDefaults,
216
+ obsidianPluginRollup
217
+ });
218
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy9yb2xsdXAudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4gd2l0aCByb2xsdXA6IGEgcm9sbHVwIHBsdWdpbiB0aGF0IGdpdmVzIGEgYnVpbGQgdGhlIHNhbWUgYG1haW4uanNgICtcbiAqIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlciBwcm9kdWNlcywgZGVwbG95cyBhIHdhdGNoIGJ1aWxkIGludG8gdGhlIHZhdWx0LFxuICogYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlIGNvbnN1bWVyJ3Mgb3duIGByb2xsdXAuY29uZmlnYCBsZWF2ZXMgdW5zZXQuXG4gKlxuICogYHJvbGx1cGAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBJbnB1dE9wdGlvbnMsXG4gIElucHV0UGx1Z2luT3B0aW9uLFxuICBOb3JtYWxpemVkT3V0cHV0T3B0aW9ucyxcbiAgT3V0cHV0T3B0aW9ucyxcbiAgUGx1Z2luXG59IGZyb20gJ3JvbGx1cCc7XG5cbmltcG9ydCB7IGRpcm5hbWUgfSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvcGF0aCc7XG5cbmltcG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQsXG4gIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnNcbn0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tYnVpbGQudHMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tZmVhdHVyZXMudHMnO1xuXG5pbXBvcnQge1xuICBCdWlsZE1vZGUsXG4gIGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBjb21wbGV0ZU9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcixcbiAgZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIsXG4gIHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dFxufSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1idWlsZC50cyc7XG5pbXBvcnQgeyBnZXRKc3hJbXBvcnRTb3VyY2UgfSBmcm9tICcuL29ic2lkaWFuLXBsdWdpbi1mZWF0dXJlcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXBwbHlSb2xsdXBJbnB1dERlZmF1bHRzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBseVJvbGx1cElucHV0RGVmYXVsdHNQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIGNvbnRleHQuXG4gICAqL1xuICByZWFkb25seSBidWlsZENvbnRleHQ6IE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0O1xuXG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgZmVhdHVyZXMuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlcz86IE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnM7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIGlucHV0IG9wdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBpbnB1dE9wdGlvbnM6IElucHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0c30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0c1BhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYnVpbGQgY29udGV4dC5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdW1lcidzIG91dHB1dCBvcHRpb25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0T3B0aW9uczogT3V0cHV0T3B0aW9ucztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgb2JzaWRpYW5QbHVnaW5Sb2xsdXB9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luUm9sbHVwT3B0aW9ucyBleHRlbmRzIE9ic2lkaWFuUGx1Z2luRGVwbG95bWVudE9wdGlvbnMsIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1aWxkIG1vZGUuIERlZmF1bHRzIHRvIHtAbGluayBCdWlsZE1vZGUuRGV2ZWxvcG1lbnR9IGluIHdhdGNoIG1vZGUgKGByb2xsdXAgLS13YXRjaGApIGFuZFxuICAgKiB7QGxpbmsgQnVpbGRNb2RlLlByb2R1Y3Rpb259IG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBCdWlsZE1vZGU7XG59XG5cbi8qKlxuICogVGhlIHN0YXRlIG9uZSB7QGxpbmsgb2JzaWRpYW5QbHVnaW5Sb2xsdXB9IGluc3RhbmNlIGtlZXBzIGFjcm9zcyB0aGUgaG9va3Mgb2YgYSBidWlsZCwgYW5kIGFjcm9zcyB0aGVcbiAqIHJlYnVpbGRzIG9mIGEgd2F0Y2guXG4gKi9cbmludGVyZmFjZSBPYnNpZGlhblBsdWdpblJvbGx1cFN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBGaWxscyBpbiB0aGUgcm9sbHVwIGlucHV0IG9wdGlvbnMgdGhlIGNvbnN1bWVyIGxlZnQgdW5zZXQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQXBwbHlSb2xsdXBJbnB1dERlZmF1bHRzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBpbnB1dCBvcHRpb25zIHdpdGggdGhlIHBsdWdpbidzIGRlZmF1bHRzIGFwcGxpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVJvbGx1cElucHV0RGVmYXVsdHMocGFyYW1zOiBBcHBseVJvbGx1cElucHV0RGVmYXVsdHNQYXJhbXMpOiBJbnB1dE9wdGlvbnMge1xuICBjb25zdCB7IGJ1aWxkQ29udGV4dCwgaW5wdXRPcHRpb25zIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGpzeEltcG9ydFNvdXJjZSA9IGdldEpzeEltcG9ydFNvdXJjZShwYXJhbXMuZmVhdHVyZXM/LmZyYW1ld29yayk7XG4gIHJldHVybiB7XG4gICAgLi4uaW5wdXRPcHRpb25zLFxuICAgIGV4dGVybmFsOiBjb21iaW5lRXh0ZXJuYWwoaW5wdXRPcHRpb25zLmV4dGVybmFsKSxcbiAgICBpbnB1dDogaW5wdXRPcHRpb25zLmlucHV0ID8/IGJ1aWxkQ29udGV4dC5lbnRyeVBvaW50LFxuICAgIC4uLihqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBpbnB1dE9wdGlvbnMuanN4ID09PSB1bmRlZmluZWQgJiYgeyBqc3g6IHsganN4SW1wb3J0U291cmNlLCBtb2RlOiAnYXV0b21hdGljJyB9IH0pXG4gIH07XG59XG5cbi8qKlxuICogRmlsbHMgaW4gdGhlIHJvbGx1cCBvdXRwdXQgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBBcHBseVJvbGx1cE91dHB1dERlZmF1bHRzUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgb3B0aW9ucyB3aXRoIHRoZSBwbHVnaW4ncyBkZWZhdWx0cyBhcHBsaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0cyhwYXJhbXM6IEFwcGx5Um9sbHVwT3V0cHV0RGVmYXVsdHNQYXJhbXMpOiBPdXRwdXRPcHRpb25zIHtcbiAgY29uc3QgeyBidWlsZENvbnRleHQsIG91dHB1dE9wdGlvbnMgfSA9IHBhcmFtcztcbiAgY29uc3QgaGFzT3V0cHV0TG9jYXRpb24gPSBvdXRwdXRPcHRpb25zLmZpbGUgIT09IHVuZGVmaW5lZCB8fCBvdXRwdXRPcHRpb25zLmRpciAhPT0gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIC4uLm91dHB1dE9wdGlvbnMsXG4gICAgYmFubmVyOiBvdXRwdXRPcHRpb25zLmJhbm5lciA/PyBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcigncm9sbHVwJyksXG4gICAgZm9ybWF0OiBvdXRwdXRPcHRpb25zLmZvcm1hdCA/PyAnY2pzJyxcbiAgICAuLi4oIWhhc091dHB1dExvY2F0aW9uICYmIHsgZmlsZTogYnVpbGRDb250ZXh0Lm1haW5Kc1BhdGggfSksXG4gICAgLy8gQW4gT2JzaWRpYW4gcGx1Z2luIGlzIG9uZSBmaWxlOiB0aGUgbWFuaWZlc3QgbmFtZXMgYG1haW4uanNgIGFuZCBub3RoaW5nIGxvYWRzIGEgc2Vjb25kIGNodW5rLlxuICAgIGlubGluZUR5bmFtaWNJbXBvcnRzOiBvdXRwdXRPcHRpb25zLmlubGluZUR5bmFtaWNJbXBvcnRzID8/IHRydWUsXG4gICAgc291cmNlbWFwOiBvdXRwdXRPcHRpb25zLnNvdXJjZW1hcCA/PyAoIWJ1aWxkQ29udGV4dC5pc1Byb2R1Y3Rpb25CdWlsZCAmJiAnaW5saW5lJylcbiAgfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcm9sbHVwIHBsdWdpbiB0aGF0IGJ1aWxkcyBhbiBPYnNpZGlhbiBwbHVnaW4uXG4gKlxuICogV2hhdCBpdCBkb2VzLCBlYWNoIG9ubHkgd2hlbiB0aGUgY29uc3VtZXIncyBjb25maWcgaGFzIG5vdCBzYWlkIG90aGVyd2lzZTpcbiAqXG4gKiAtIGBpbnB1dGAgaXMgYHNyYy9tYWluLnRzYC5cbiAqIC0gVGhlIG91dHB1dCBpcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgIGluIGBkaXN0L2J1aWxkYCAoYGRpc3QvZGV2YCBpbiB3YXRjaCBtb2RlKSwgd2l0aCBkeW5hbWljIGltcG9ydHNcbiAqICAgaW5saW5lZCwgdGhlIGdlbmVyYXRlZC1maWxlIGJhbm5lciwgYW5kIGFuIGlubGluZSBzb3VyY2UgbWFwIGluIGRldmVsb3BtZW50LlxuICpcbiAqIEFuZCBhbHdheXM6IE9ic2lkaWFuJ3Mgb3duIG1vZHVsZXMgKGBvYnNpZGlhbmAsIGBlbGVjdHJvbmAsIENvZGVNaXJyb3IsIExlemVyKSBhbmQgdGhlIE5vZGUgYnVpbHRpbnMgYXJlXG4gKiBleHRlcm5hbCBiZXNpZGUgdGhlIGNvbnN1bWVyJ3Mgb3duIGBleHRlcm5hbGAsIHRoZSBvdXRwdXQgZm9sZGVyIGlzIGVtcHRpZWQgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSxcbiAqIGV2ZXJ5IGVtaXR0ZWQgQ1NTIGZpbGUgZW5kcyB1cCBpbiBgc3R5bGVzLmNzc2AsIGBtYW5pZmVzdC5qc29uYCAoYW5kIGluIGRldmVsb3BtZW50IGAuaG90cmVsb2FkYCkgaXNcbiAqIGNvcGllZCBiZXNpZGUgaXQsIGFuZCBhIGRldmVsb3BtZW50IGJ1aWxkIGlzIGRlcGxveWVkIGludG8gdGhlIHZhdWx0IG5hbWVkIGJ5IGBPQlNJRElBTl9DT05GSUdfRk9MREVSYC5cbiAqXG4gKiBUeXBlU2NyaXB0LCBkZXBlbmRlbmN5IHJlc29sdXRpb24gYW5kIG1pbmlmaWNhdGlvbiBzdGF5IHRoZSBjb25zdW1lcidzIGNob2ljZSBvZiByb2xsdXAgcGx1Z2lucywgYXMgdGhleSB3b3VsZCBiZVxuICogd2l0aG91dCB0aGlzIG9uZS4gVGhlIGJ1aWxkIGZlYXR1cmVzICh7QGxpbmsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9uc30pIGFyZSB0aGUgcGx1Z2luJ3M6XG4gKlxuICogLSBgZnJhbWV3b3JrOiAncmVhY3QnIHwgJ3ByZWFjdCdgIHNldHMgcm9sbHVwJ3MgYGpzeGAgb3B0aW9uIHRvIHRoZSBhdXRvbWF0aWMgcnVudGltZSAodW5sZXNzIHNldCksIGFuZCB0aGVcbiAqICAgVHlwZVNjcmlwdCBwbHVnaW4gcmVhZHMgdGhlIHNhbWUgZnJvbSB0aGUgdG9vbGtpdCdzIHRzY29uZmlnIHByZXNldC5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgcmVwbGFjZXMgYHByb2Nlc3MuZW52Lk5PREVfRU5WYCAoYW5kIFZ1ZSdzIGZlYXR1cmUgZmxhZ3MpIGluIHRoZSBidW5kbGVkIGNvZGUuXG4gKiAtIGBzdHlsZXNgIGNvbXBpbGVzIGV2ZXJ5IHN0eWxlc2hlZXQgaXRzZWxmIChQb3N0Q1NTLCBUYWlsd2luZCwgQ1NTIG1vZHVsZXMpLCBzbyByb2xsdXAgbmVlZHMgbm8gQ1NTIHBsdWdpbjsgbGVhdmVcbiAqICAgaXQgb3V0LiBgc3R5bGVzOiB7fWAgY29tcGlsZXMgcGxhaW4gQ1NTLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5Sb2xsdXBPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByb2xsdXAgcGx1Z2lucywgd2hpY2ggcm9sbHVwIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5Sb2xsdXAob3B0aW9uczogT2JzaWRpYW5QbHVnaW5Sb2xsdXBPcHRpb25zID0ge30pOiBJbnB1dFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luUm9sbHVwU3RhdGUgPSB7XG4gICAgYnVpbGRDb250ZXh0OiB1bmRlZmluZWQsXG4gICAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogZmFsc2VcbiAgfTtcblxuICAvKiB2OCBpZ25vcmUgc3RhcnQgLS0gUm9sbHVwIGhvb2tzOyBleGVyY2lzZWQgYnkgdGhlIGJ1bmRsZXIgaW50ZWdyYXRpb24gdGVzdCBhZ2FpbnN0IGEgcmVhbCByb2xsdXAgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiByb2xsdXAgcGx1Z2luIGhhcyBub3QgcmVzb2x2ZWQgaXRzIGJ1aWxkIGNvbnRleHQ6IGl0cyBgb3B0aW9uc2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogdHJ1ZSxcbiAgICBzaG91bGRSZXBsYWNlRGVmaW5lczogdHJ1ZVxuICB9KTtcblxuICBjb25zdCBwbHVnaW46IFBsdWdpbiA9IHtcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcihfb3V0cHV0T3B0aW9ucywgYnVuZGxlKTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIG9wdGlvbnMoaW5wdXRPcHRpb25zKTogUHJvbWlzZTxJbnB1dE9wdGlvbnM+IHtcbiAgICAgIGNvbnN0IG1vZGUgPSBvcHRpb25zLm1vZGUgPz8gKHRoaXMubWV0YS53YXRjaE1vZGUgPyBCdWlsZE1vZGUuRGV2ZWxvcG1lbnQgOiBCdWlsZE1vZGUuUHJvZHVjdGlvbik7XG4gICAgICBzdGF0ZS5idWlsZENvbnRleHQgPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQoeyAuLi5vcHRpb25zLCBtb2RlIH0pO1xuICAgICAgcmV0dXJuIGFwcGx5Um9sbHVwSW5wdXREZWZhdWx0cyh7IGJ1aWxkQ29udGV4dDogc3RhdGUuYnVpbGRDb250ZXh0LCBmZWF0dXJlczogb3B0aW9ucywgaW5wdXRPcHRpb25zIH0pO1xuICAgIH0sXG4gICAgb3V0cHV0T3B0aW9ucyhvdXRwdXRPcHRpb25zKTogT3V0cHV0T3B0aW9ucyB7XG4gICAgICByZXR1cm4gYXBwbHlSb2xsdXBPdXRwdXREZWZhdWx0cyh7IGJ1aWxkQ29udGV4dDogZ2V0QnVpbGRDb250ZXh0KCksIG91dHB1dE9wdGlvbnMgfSk7XG4gICAgfSxcbiAgICBhc3luYyByZW5kZXJTdGFydChvdXRwdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBpZiAoc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdGF0ZS5pc0Rpc3RGb2xkZXJDbGVhbmVkID0gdHJ1ZTtcbiAgICAgIGF3YWl0IGNsZWFuT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGdldE91dHB1dEZvbGRlcihvdXRwdXRPcHRpb25zKSk7XG4gICAgfSxcbiAgICBhc3luYyB3cml0ZUJ1bmRsZShvdXRwdXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCBidWlsZENvbnRleHQgPSB7IC4uLmdldEJ1aWxkQ29udGV4dCgpLCBkaXN0Rm9sZGVyOiBnZXRPdXRwdXRGb2xkZXIob3V0cHV0T3B0aW9ucykgfTtcbiAgICAgIGF3YWl0IGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyKGJ1aWxkQ29udGV4dCk7XG4gICAgICBhd2FpdCBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlcihidWlsZENvbnRleHQpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIFtwbHVnaW4sIGZlYXR1cmVQbHVnaW4gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICdyb2xsdXAnLCBmZWF0dXJlczogb3B0aW9ucyB9KSBhcyBQcm9taXNlPG51bGwgfCBQbHVnaW4+XTtcbiAgLyogdjggaWdub3JlIHN0b3AgKi9cbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIFBhcnQgb2YgdGhlIHJvbGx1cCBob29rcyBhYm92ZS4gKi9cbmZ1bmN0aW9uIGdldE91dHB1dEZvbGRlcihvdXRwdXRPcHRpb25zOiBOb3JtYWxpemVkT3V0cHV0T3B0aW9ucyk6IHN0cmluZyB7XG4gIHJldHVybiBvdXRwdXRPcHRpb25zLmRpciA/PyBkaXJuYW1lKG91dHB1dE9wdGlvbnMuZmlsZSA/PyAnJyk7XG59XG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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
@@ -0,0 +1,99 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Builds an Obsidian plugin with rollup: a rollup 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 `rollup.config` leaves unset.
8
+ *
9
+ * `rollup` is an optional peer dependency and this module only imports its types, so a plugin built with
10
+ * esbuild installs nothing extra.
11
+ */
12
+ import type { InputOptions, InputPluginOption, OutputOptions } from 'rollup' with { 'resolution-mode': 'import' };
13
+ import type { ObsidianPluginBuildContext, ObsidianPluginDeploymentOptions } from './obsidian-plugin-build.cjs';
14
+ import type { ObsidianPluginFeatureOptions } from './obsidian-plugin-features.cjs';
15
+ import { BuildMode } from './obsidian-plugin-build.cjs';
16
+ /**
17
+ * Parameters for {@link applyRollupInputDefaults}.
18
+ */
19
+ export interface ApplyRollupInputDefaultsParams {
20
+ /**
21
+ * The build context.
22
+ */
23
+ readonly buildContext: ObsidianPluginBuildContext;
24
+ /**
25
+ * The build features.
26
+ */
27
+ readonly features?: ObsidianPluginFeatureOptions;
28
+ /**
29
+ * The consumer's input options.
30
+ */
31
+ readonly inputOptions: InputOptions;
32
+ }
33
+ /**
34
+ * Parameters for {@link applyRollupOutputDefaults}.
35
+ */
36
+ export interface ApplyRollupOutputDefaultsParams {
37
+ /**
38
+ * The build context.
39
+ */
40
+ readonly buildContext: ObsidianPluginBuildContext;
41
+ /**
42
+ * The consumer's output options.
43
+ */
44
+ readonly outputOptions: OutputOptions;
45
+ }
46
+ /**
47
+ * Options for {@link obsidianPluginRollup}.
48
+ */
49
+ export interface ObsidianPluginRollupOptions extends ObsidianPluginDeploymentOptions, ObsidianPluginFeatureOptions {
50
+ /**
51
+ * The build mode. Defaults to {@link BuildMode.Development} in watch mode (`rollup --watch`) and
52
+ * {@link BuildMode.Production} otherwise.
53
+ */
54
+ readonly mode?: BuildMode;
55
+ }
56
+ /**
57
+ * Fills in the rollup input options the consumer left unset.
58
+ *
59
+ * @param params - The {@link ApplyRollupInputDefaultsParams}.
60
+ * @returns The input options with the plugin's defaults applied.
61
+ */
62
+ export declare function applyRollupInputDefaults(params: ApplyRollupInputDefaultsParams): InputOptions;
63
+ /**
64
+ * Fills in the rollup output options the consumer left unset.
65
+ *
66
+ * @param params - The {@link ApplyRollupOutputDefaultsParams}.
67
+ * @returns The output options with the plugin's defaults applied.
68
+ */
69
+ export declare function applyRollupOutputDefaults(params: ApplyRollupOutputDefaultsParams): OutputOptions;
70
+ /**
71
+ * Creates a rollup plugin that builds an Obsidian plugin.
72
+ *
73
+ * What it does, each only when the consumer's config has not said otherwise:
74
+ *
75
+ * - `input` is `src/main.ts`.
76
+ * - The output is one CommonJS `main.js` in `dist/build` (`dist/dev` in watch mode), with dynamic imports
77
+ * inlined, the generated-file banner, and an inline source map in development.
78
+ *
79
+ * And always: Obsidian's own modules (`obsidian`, `electron`, CodeMirror, Lezer) and the Node builtins are
80
+ * external beside the consumer's own `external`, the output folder is emptied before the first write,
81
+ * every emitted CSS file ends up in `styles.css`, `manifest.json` (and in development `.hotreload`) is
82
+ * copied beside it, and a development build is deployed into the vault named by `OBSIDIAN_CONFIG_FOLDER`.
83
+ *
84
+ * TypeScript, dependency resolution and minification stay the consumer's choice of rollup plugins, as they would be
85
+ * without this one. The build features ({@link ObsidianPluginFeatureOptions}) are the plugin's:
86
+ *
87
+ * - `framework: 'react' | 'preact'` sets rollup's `jsx` option to the automatic runtime (unless set), and the
88
+ * TypeScript plugin reads the same from the toolkit's tsconfig preset.
89
+ * - `framework: 'solid' | 'svelte'` compiles the components with the toolkit's shared transforms, and `'vue'` adds
90
+ * `unplugin-vue`.
91
+ * - Any framework replaces `process.env.NODE_ENV` (and Vue's feature flags) in the bundled code.
92
+ * - `styles` compiles every stylesheet itself (PostCSS, Tailwind, CSS modules), so rollup needs no CSS plugin; leave
93
+ * it out. `styles: {}` compiles plain CSS.
94
+ * - `wasm` imports a `.wasm` module as its bytes.
95
+ *
96
+ * @param options - The {@link ObsidianPluginRollupOptions}.
97
+ * @returns The rollup plugins, which rollup takes as one entry of its `plugins`.
98
+ */
99
+ export declare function obsidianPluginRollup(options?: ObsidianPluginRollupOptions): InputPluginOption[];
@@ -0,0 +1,229 @@
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 patchObsidianRequire() {
6
+ const originalRequire = require;
7
+ if (!originalRequire || originalRequire.__isPatched) {
8
+ return;
9
+ }
10
+
11
+ require = Object.assign(
12
+ (id) => requirePatched(id),
13
+ originalRequire,
14
+ {
15
+ __isPatched: true
16
+ }
17
+ );
18
+
19
+ function extractDefault(module) {
20
+ return module && module.__esModule && 'default' in module ? module.default : module;
21
+ }
22
+
23
+ const OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
24
+ '@codemirror/autocomplete',
25
+ '@codemirror/collab',
26
+ '@codemirror/commands',
27
+ '@codemirror/language',
28
+ '@codemirror/lint',
29
+ '@codemirror/search',
30
+ '@codemirror/state',
31
+ '@codemirror/text',
32
+ '@codemirror/view',
33
+ '@lezer/common',
34
+ '@lezer/highlight',
35
+ '@lezer/lr',
36
+ 'obsidian']
37
+ );
38
+
39
+ const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = new Set([
40
+ '@codemirror/closebrackets',
41
+ '@codemirror/comment',
42
+ '@codemirror/fold',
43
+ '@codemirror/gutter',
44
+ '@codemirror/highlight',
45
+ '@codemirror/history',
46
+ '@codemirror/matchbrackets',
47
+ '@codemirror/panel',
48
+ '@codemirror/rangeset',
49
+ '@codemirror/rectangular-selection',
50
+ '@codemirror/stream-parser',
51
+ '@codemirror/tooltip']
52
+ );
53
+
54
+ function requirePatched(id) {
55
+ if (OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.has(id)) {
56
+ return originalRequire?.(id);
57
+ }
58
+
59
+ // eslint-disable-next-line @typescript-eslint/no-deprecated, obsidianmd/no-global-this -- Need access to app. Actively use globalThis.
60
+ if (globalThis.app.isMobile) {
61
+ if (id === 'process' || id === 'node:process') {
62
+ // eslint-disable-next-line no-console -- Valid usage.
63
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
64
+
65
+ return process;
66
+ }
67
+ } else {
68
+ const module = originalRequire?.(id);
69
+ if (module) {
70
+ return extractDefault(module);
71
+ }
72
+ }
73
+
74
+ // eslint-disable-next-line no-console -- Valid usage.
75
+ console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
76
+ return {};
77
+ }
78
+ })();
79
+
80
+ "use strict";
81
+ var __defProp = Object.defineProperty;
82
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
83
+ var __getOwnPropNames = Object.getOwnPropertyNames;
84
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
85
+ var __export = (target, all) => {
86
+ for (var name in all)
87
+ __defProp(target, name, { get: all[name], enumerable: true });
88
+ };
89
+ var __copyProps = (to, from, except, desc) => {
90
+ if (from && typeof from === "object" || typeof from === "function") {
91
+ for (let key of __getOwnPropNames(from))
92
+ if (!__hasOwnProp.call(to, key) && key !== except)
93
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
94
+ }
95
+ return to;
96
+ };
97
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
98
+ var vite_exports = {};
99
+ __export(vite_exports, {
100
+ getViteBuildMode: () => getViteBuildMode,
101
+ getViteConfigDefaults: () => getViteConfigDefaults,
102
+ getViteFeatureConfig: () => getViteFeatureConfig,
103
+ obsidianPluginVite: () => obsidianPluginVite
104
+ });
105
+ module.exports = __toCommonJS(vite_exports);
106
+ var import_obsidian_plugin_build = require('./obsidian-plugin-build.cjs');
107
+ var import_obsidian_plugin_features = require('./obsidian-plugin-features.cjs');
108
+ var import_obsidian_plugin_transforms = require('./obsidian-plugin-transforms.cjs');
109
+ var import_obsidian_plugins_folder_deployment = require('./obsidian-plugins-folder-deployment.cjs');
110
+ var import_rollup_compatible_features = require('./rollup-compatible-features.cjs');
111
+ var import_rollup_compatible = require('./rollup-compatible.cjs');
112
+ function getViteBuildMode(userConfig, env) {
113
+ return userConfig.build?.watch || env.mode === "development" ? import_obsidian_plugin_build.BuildMode.Development : import_obsidian_plugin_build.BuildMode.Production;
114
+ }
115
+ function getViteConfigDefaults(userConfig, buildContext) {
116
+ const build = userConfig.build ?? {};
117
+ const rolldownOptions = build.rolldownOptions ?? build.rollupOptions ?? {};
118
+ const output = Array.isArray(rolldownOptions.output) ? void 0 : rolldownOptions.output ?? {};
119
+ return {
120
+ build: {
121
+ // An Obsidian release ships `main.js` and `styles.css` and nothing else, so any asset emitted beside
122
+ // the bundle is a file the installed plugin looks for and does not find.
123
+ assetsInlineLimit: build.assetsInlineLimit ?? Number.MAX_SAFE_INTEGER,
124
+ // eslint-disable-next-line unicorn/name-replacements -- `emptyOutDir` is the name vite's config reads.
125
+ emptyOutDir: false,
126
+ lib: build.lib ?? {
127
+ cssFileName: "styles",
128
+ entry: buildContext.entryPoint,
129
+ fileName: () => "main.js",
130
+ formats: ["cjs"]
131
+ },
132
+ minify: build.minify ?? buildContext.isProductionBuild,
133
+ // eslint-disable-next-line unicorn/name-replacements -- `outDir` is the name vite's config reads.
134
+ outDir: buildContext.distFolder,
135
+ rolldownOptions: {
136
+ external: (0, import_rollup_compatible.combineExternal)(rolldownOptions.external),
137
+ ...output !== void 0 && {
138
+ output: {
139
+ // `postBanner` rather than `banner`: it is added after minification, which strips an ordinary comment.
140
+ ...output.banner === void 0 && output.postBanner === void 0 && { postBanner: (0, import_obsidian_plugin_build.getObsidianPluginBanner)("vite") },
141
+ // An Obsidian plugin is one file: the manifest names `main.js` and nothing loads a second chunk.
142
+ // eslint-disable-next-line @typescript-eslint/no-deprecated -- A consumer's config may still set the deprecated option, which then wins.
143
+ ...output.codeSplitting === void 0 && output.inlineDynamicImports === void 0 && { codeSplitting: false }
144
+ }
145
+ }
146
+ },
147
+ sourcemap: build.sourcemap ?? (!buildContext.isProductionBuild && "inline")
148
+ }
149
+ };
150
+ }
151
+ function getViteFeatureConfig(params) {
152
+ const { features, isProductionBuild, postcssConfig, userConfig } = params;
153
+ const config = {};
154
+ const userDefine = userConfig.define ?? {};
155
+ const define = Object.fromEntries(
156
+ Object.entries((0, import_obsidian_plugin_features.getFrameworkDefines)({ framework: features.framework, isProductionBuild })).filter(([expression]) => !Object.hasOwn(userDefine, expression))
157
+ );
158
+ if (Object.keys(define).length > 0) {
159
+ config.define = define;
160
+ }
161
+ const jsxImportSource = (0, import_obsidian_plugin_features.getJsxImportSource)(features.framework);
162
+ if (jsxImportSource !== void 0 && userConfig.oxc !== false && userConfig.oxc?.jsx === void 0) {
163
+ config.oxc = { jsx: { development: !isProductionBuild, importSource: jsxImportSource, runtime: "automatic" } };
164
+ }
165
+ if (postcssConfig && postcssConfig.plugins.length > 0 && userConfig.css?.postcss === void 0) {
166
+ config.css = { postcss: { plugins: [...postcssConfig.plugins] } };
167
+ }
168
+ return config;
169
+ }
170
+ function obsidianPluginVite(options = {}) {
171
+ const state = {
172
+ buildContext: void 0,
173
+ isDistFolderCleaned: false
174
+ };
175
+ function getBuildContext() {
176
+ if (!state.buildContext) {
177
+ throw new Error("The obsidian-plugin vite plugin has not resolved its build context: its `config` hook did not run.");
178
+ }
179
+ return state.buildContext;
180
+ }
181
+ const featurePlugin = (0, import_rollup_compatible_features.createRollupCompatibleFeaturePlugin)({
182
+ features: options,
183
+ isProductionBuild: () => getBuildContext().isProductionBuild,
184
+ shouldCompileStylesheets: false,
185
+ shouldReplaceDefines: false
186
+ });
187
+ const plugin = {
188
+ apply: "build",
189
+ async config(userConfig, env) {
190
+ state.buildContext = await (0, import_obsidian_plugin_build.resolveObsidianPluginBuildContext)({
191
+ ...options,
192
+ ...userConfig.build?.outDir !== void 0 && { distFolder: userConfig.build.outDir },
193
+ mode: options.mode ?? getViteBuildMode(userConfig, env)
194
+ });
195
+ const { isProductionBuild } = state.buildContext;
196
+ const postcssConfig = (0, import_obsidian_plugin_features.isPostcssNeeded)(options.styles) ? await (0, import_obsidian_plugin_transforms.loadPostcssConfig)({ isProductionBuild, styles: options.styles ?? {} }) : void 0;
197
+ const featureConfig = getViteFeatureConfig({ features: options, isProductionBuild, postcssConfig, userConfig });
198
+ const config = getViteConfigDefaults(userConfig, state.buildContext);
199
+ return { ...featureConfig, ...config };
200
+ },
201
+ generateBundle: {
202
+ handler(_outputOptions, bundle) {
203
+ (0, import_rollup_compatible.renameCssAssets)(this, bundle);
204
+ },
205
+ order: "post"
206
+ },
207
+ name: "obsidian-plugin",
208
+ async renderStart() {
209
+ if (state.isDistFolderCleaned) {
210
+ return;
211
+ }
212
+ state.isDistFolderCleaned = true;
213
+ await (0, import_obsidian_plugin_build.cleanObsidianPluginDistFolder)(getBuildContext().distFolder);
214
+ },
215
+ async writeBundle() {
216
+ await (0, import_obsidian_plugin_build.completeObsidianPluginDistFolder)(getBuildContext());
217
+ await (0, import_obsidian_plugins_folder_deployment.deployToObsidianPluginsFolder)(getBuildContext());
218
+ }
219
+ };
220
+ return [plugin, { ...featurePlugin, apply: "build" }, (0, import_rollup_compatible_features.createUnpluginVuePlugin)({ bundler: "vite", features: options })];
221
+ }
222
+ // Annotate the CommonJS export names for ESM import in node:
223
+ 0 && (module.exports = {
224
+ getViteBuildMode,
225
+ getViteConfigDefaults,
226
+ getViteFeatureConfig,
227
+ obsidianPluginVite
228
+ });
229
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9idW5kbGVycy92aXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCdWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luIHdpdGggdml0ZTogYSB2aXRlIHBsdWdpbiB0aGF0IHR1cm5zIGB2aXRlIGJ1aWxkYCBpbnRvIGEgbGlicmFyeSBidWlsZCBvZlxuICogYHNyYy9tYWluLnRzYCB3aXRoIHRoZSBzYW1lIGBtYWluLmpzYCArIGBzdHlsZXMuY3NzYCArIGBtYW5pZmVzdC5qc29uYCBsYXlvdXQgdGhlIGVzYnVpbGQgYnVpbGRlclxuICogcHJvZHVjZXMsIGRlcGxveXMgYSBgdml0ZSBidWlsZCAtLXdhdGNoYCBidWlsZCBpbnRvIHRoZSB2YXVsdCwgYW5kIGZpbGxzIGluIG9ubHkgdGhlIG9wdGlvbnMgdGhlXG4gKiBjb25zdW1lcidzIG93biBgdml0ZS5jb25maWdgIGxlYXZlcyB1bnNldC5cbiAqXG4gKiBgdml0ZWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5IGFuZCB0aGlzIG1vZHVsZSBvbmx5IGltcG9ydHMgaXRzIHR5cGVzLCBzbyBhIHBsdWdpbiBidWlsdCB3aXRoXG4gKiBlc2J1aWxkIGluc3RhbGxzIG5vdGhpbmcgZXh0cmEuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDb25maWdFbnYsXG4gIFBsdWdpbixcbiAgUGx1Z2luT3B0aW9uLFxuICBVc2VyQ29uZmlnXG59IGZyb20gJ3ZpdGUnO1xuXG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0LFxuICBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5QbHVnaW5GZWF0dXJlT3B0aW9ucyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB0eXBlIHsgUG9zdGNzc0NvbmZpZyB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLXRyYW5zZm9ybXMudHMnO1xuaW1wb3J0IHR5cGUge1xuICBBc3NldEVtaXR0ZXIsXG4gIEJ1bmRsZU91dHB1dExpa2Vcbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS50cyc7XG5cbmltcG9ydCB7XG4gIEJ1aWxkTW9kZSxcbiAgY2xlYW5PYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIsXG4gIGNvbXBsZXRlT2JzaWRpYW5QbHVnaW5EaXN0Rm9sZGVyLFxuICBnZXRPYnNpZGlhblBsdWdpbkJhbm5lcixcbiAgcmVzb2x2ZU9ic2lkaWFuUGx1Z2luQnVpbGRDb250ZXh0XG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWJ1aWxkLnRzJztcbmltcG9ydCB7XG4gIGdldEZyYW1ld29ya0RlZmluZXMsXG4gIGdldEpzeEltcG9ydFNvdXJjZSxcbiAgaXNQb3N0Y3NzTmVlZGVkXG59IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2luLWZlYXR1cmVzLnRzJztcbmltcG9ydCB7IGxvYWRQb3N0Y3NzQ29uZmlnIH0gZnJvbSAnLi9vYnNpZGlhbi1wbHVnaW4tdHJhbnNmb3Jtcy50cyc7XG5pbXBvcnQgeyBkZXBsb3lUb09ic2lkaWFuUGx1Z2luc0ZvbGRlciB9IGZyb20gJy4vb2JzaWRpYW4tcGx1Z2lucy1mb2xkZXItZGVwbG95bWVudC50cyc7XG5pbXBvcnQge1xuICBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbixcbiAgY3JlYXRlVW5wbHVnaW5WdWVQbHVnaW5cbn0gZnJvbSAnLi9yb2xsdXAtY29tcGF0aWJsZS1mZWF0dXJlcy50cyc7XG5pbXBvcnQge1xuICBjb21iaW5lRXh0ZXJuYWwsXG4gIHJlbmFtZUNzc0Fzc2V0c1xufSBmcm9tICcuL3JvbGx1cC1jb21wYXRpYmxlLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0Vml0ZUZlYXR1cmVDb25maWd9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFZpdGVGZWF0dXJlQ29uZmlnUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBmZWF0dXJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGZlYXR1cmVzOiBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgYSBwcm9kdWN0aW9uIGJ1aWxkLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcm9kdWN0aW9uQnVpbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBuZWVkcyBub25lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9zdGNzc0NvbmZpZzogUG9zdGNzc0NvbmZpZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGNvbnN1bWVyJ3Mgdml0ZSBjb25maWcuXG4gICAqL1xuICByZWFkb25seSB1c2VyQ29uZmlnOiBVc2VyQ29uZmlnO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBvYnNpZGlhblBsdWdpblZpdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgZXh0ZW5kcyBPYnNpZGlhblBsdWdpbkRlcGxveW1lbnRPcHRpb25zLCBPYnNpZGlhblBsdWdpbkZlYXR1cmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBidWlsZCBtb2RlLiBEZWZhdWx0cyB0byB7QGxpbmsgQnVpbGRNb2RlLkRldmVsb3BtZW50fSBmb3IgYHZpdGUgYnVpbGQgLS13YXRjaGAgKG9yXG4gICAqIGAtLW1vZGUgZGV2ZWxvcG1lbnRgKSBhbmQge0BsaW5rIEJ1aWxkTW9kZS5Qcm9kdWN0aW9ufSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogQnVpbGRNb2RlO1xufVxuXG4vKipcbiAqIFRoZSBzdGF0ZSBvbmUge0BsaW5rIG9ic2lkaWFuUGx1Z2luVml0ZX0gaW5zdGFuY2Uga2VlcHMgYWNyb3NzIHRoZSBob29rcyBvZiBhIGJ1aWxkLCBhbmQgYWNyb3NzIHRoZVxuICogcmVidWlsZHMgb2YgYSB3YXRjaC5cbiAqL1xuaW50ZXJmYWNlIE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlIHtcbiAgYnVpbGRDb250ZXh0OiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB8IHVuZGVmaW5lZDtcbiAgaXNEaXN0Rm9sZGVyQ2xlYW5lZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHRoZSBidWlsZCBtb2RlIG9mIGEgdml0ZSBidWlsZCBmcm9tIHRoZSBjb25zdW1lcidzIGNvbmZpZzogZGV2ZWxvcG1lbnQgZm9yIGEgd2F0Y2ggYnVpbGQgb3IgZm9yXG4gKiBgLS1tb2RlIGRldmVsb3BtZW50YCwgcHJvZHVjdGlvbiBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHVzZXJDb25maWcgLSBUaGUgY29uc3VtZXIncyB2aXRlIGNvbmZpZy5cbiAqIEBwYXJhbSBlbnYgLSBUaGUgdml0ZSBjb25maWcgZW52aXJvbm1lbnQuXG4gKiBAcmV0dXJucyBUaGUgYnVpbGQgbW9kZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZpdGVCdWlsZE1vZGUodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBQaWNrPENvbmZpZ0VudiwgJ21vZGUnPik6IEJ1aWxkTW9kZSB7XG4gIHJldHVybiB1c2VyQ29uZmlnLmJ1aWxkPy53YXRjaCB8fCBlbnYubW9kZSA9PT0gJ2RldmVsb3BtZW50JyA/IEJ1aWxkTW9kZS5EZXZlbG9wbWVudCA6IEJ1aWxkTW9kZS5Qcm9kdWN0aW9uO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGFydCBvZiB0aGUgdml0ZSBjb25maWcgdGhlIHBsdWdpbiBjb250cmlidXRlczogb25seSB0aGUgb3B0aW9ucyB0aGUgY29uc3VtZXIgbGVmdCB1bnNldC5cbiAqXG4gKiBAcGFyYW0gdXNlckNvbmZpZyAtIFRoZSBjb25zdW1lcidzIHZpdGUgY29uZmlnLlxuICogQHBhcmFtIGJ1aWxkQ29udGV4dCAtIFRoZSBidWlsZCBjb250ZXh0LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUNvbmZpZ0RlZmF1bHRzKHVzZXJDb25maWc6IFVzZXJDb25maWcsIGJ1aWxkQ29udGV4dDogT2JzaWRpYW5QbHVnaW5CdWlsZENvbnRleHQpOiBVc2VyQ29uZmlnIHtcbiAgY29uc3QgYnVpbGQgPSB1c2VyQ29uZmlnLmJ1aWxkID8/IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gQSBjb25zdW1lcidzIGNvbmZpZyBtYXkgc3RpbGwgdXNlIHRoZSBkZXByZWNhdGVkIGFsaWFzLCBhbmQgdml0ZSBzdGlsbCBob25vcnMgaXQuXG4gIGNvbnN0IHJvbGxkb3duT3B0aW9ucyA9IGJ1aWxkLnJvbGxkb3duT3B0aW9ucyA/PyBidWlsZC5yb2xsdXBPcHRpb25zID8/IHt9O1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHJvbGxkb3duT3B0aW9ucy5vdXRwdXQpID8gdW5kZWZpbmVkIDogcm9sbGRvd25PcHRpb25zLm91dHB1dCA/PyB7fTtcblxuICByZXR1cm4ge1xuICAgIGJ1aWxkOiB7XG4gICAgICAvLyBBbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UsIHNvIGFueSBhc3NldCBlbWl0dGVkIGJlc2lkZVxuICAgICAgLy8gdGhlIGJ1bmRsZSBpcyBhIGZpbGUgdGhlIGluc3RhbGxlZCBwbHVnaW4gbG9va3MgZm9yIGFuZCBkb2VzIG5vdCBmaW5kLlxuICAgICAgYXNzZXRzSW5saW5lTGltaXQ6IGJ1aWxkLmFzc2V0c0lubGluZUxpbWl0ID8/IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYGVtcHR5T3V0RGlyYCBpcyB0aGUgbmFtZSB2aXRlJ3MgY29uZmlnIHJlYWRzLlxuICAgICAgZW1wdHlPdXREaXI6IGZhbHNlLFxuICAgICAgbGliOiBidWlsZC5saWIgPz8ge1xuICAgICAgICBjc3NGaWxlTmFtZTogJ3N0eWxlcycsXG4gICAgICAgIGVudHJ5OiBidWlsZENvbnRleHQuZW50cnlQb2ludCxcbiAgICAgICAgZmlsZU5hbWU6ICgpOiBzdHJpbmcgPT4gJ21haW4uanMnLFxuICAgICAgICBmb3JtYXRzOiBbJ2NqcyddXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBidWlsZC5taW5pZnkgPz8gYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gYG91dERpcmAgaXMgdGhlIG5hbWUgdml0ZSdzIGNvbmZpZyByZWFkcy5cbiAgICAgIG91dERpcjogYnVpbGRDb250ZXh0LmRpc3RGb2xkZXIsXG4gICAgICByb2xsZG93bk9wdGlvbnM6IHtcbiAgICAgICAgZXh0ZXJuYWw6IGNvbWJpbmVFeHRlcm5hbChyb2xsZG93bk9wdGlvbnMuZXh0ZXJuYWwpLFxuICAgICAgICAuLi4ob3V0cHV0ICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICAgIG91dHB1dDoge1xuICAgICAgICAgICAgLy8gYHBvc3RCYW5uZXJgIHJhdGhlciB0aGFuIGBiYW5uZXJgOiBpdCBpcyBhZGRlZCBhZnRlciBtaW5pZmljYXRpb24sIHdoaWNoIHN0cmlwcyBhbiBvcmRpbmFyeSBjb21tZW50LlxuICAgICAgICAgICAgLi4uKG91dHB1dC5iYW5uZXIgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQucG9zdEJhbm5lciA9PT0gdW5kZWZpbmVkICYmIHsgcG9zdEJhbm5lcjogZ2V0T2JzaWRpYW5QbHVnaW5CYW5uZXIoJ3ZpdGUnKSB9KSxcbiAgICAgICAgICAgIC8vIEFuIE9ic2lkaWFuIHBsdWdpbiBpcyBvbmUgZmlsZTogdGhlIG1hbmlmZXN0IG5hbWVzIGBtYWluLmpzYCBhbmQgbm90aGluZyBsb2FkcyBhIHNlY29uZCBjaHVuay5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZGVwcmVjYXRlZCAtLSBBIGNvbnN1bWVyJ3MgY29uZmlnIG1heSBzdGlsbCBzZXQgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uLCB3aGljaCB0aGVuIHdpbnMuXG4gICAgICAgICAgICAuLi4ob3V0cHV0LmNvZGVTcGxpdHRpbmcgPT09IHVuZGVmaW5lZCAmJiBvdXRwdXQuaW5saW5lRHluYW1pY0ltcG9ydHMgPT09IHVuZGVmaW5lZCAmJiB7IGNvZGVTcGxpdHRpbmc6IGZhbHNlIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSxcbiAgICAgIHNvdXJjZW1hcDogYnVpbGQuc291cmNlbWFwID8/ICghYnVpbGRDb250ZXh0LmlzUHJvZHVjdGlvbkJ1aWxkICYmICdpbmxpbmUnKVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBhcnQgb2YgdGhlIHZpdGUgY29uZmlnIHRoZSBidWlsZCBmZWF0dXJlcyBjb250cmlidXRlLCBlYWNoIG9ubHkgd2hlcmUgdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGxlZnQgaXRcbiAqIHVuc2V0OiB0aGUgZnJhbWV3b3JrJ3MgY29tcGlsZS10aW1lIGNvbnN0YW50cyAoYGRlZmluZWApLCB0aGUgYXV0b21hdGljIEpTWCBydW50aW1lIGZvciBSZWFjdCBhbmQgUHJlYWN0XG4gKiAoYG94Yy5qc3hgKSwgYW5kIHRoZSBQb3N0Q1NTIHBsdWdpbnMgb2YgdGhlIGBzdHlsZXNgIG9wdGlvbiAoYGNzcy5wb3N0Y3NzYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgR2V0Vml0ZUZlYXR1cmVDb25maWdQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGNvbmZpZyB2aXRlIG1lcmdlcyBpbnRvIHRoZSBjb25zdW1lcidzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vml0ZUZlYXR1cmVDb25maWcocGFyYW1zOiBHZXRWaXRlRmVhdHVyZUNvbmZpZ1BhcmFtcyk6IFVzZXJDb25maWcge1xuICBjb25zdCB7IGZlYXR1cmVzLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9ID0gcGFyYW1zO1xuICBjb25zdCBjb25maWc6IFVzZXJDb25maWcgPSB7fTtcblxuICBjb25zdCB1c2VyRGVmaW5lID0gdXNlckNvbmZpZy5kZWZpbmUgPz8ge307XG4gIGNvbnN0IGRlZmluZSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhnZXRGcmFtZXdvcmtEZWZpbmVzKHsgZnJhbWV3b3JrOiBmZWF0dXJlcy5mcmFtZXdvcmssIGlzUHJvZHVjdGlvbkJ1aWxkIH0pKS5maWx0ZXIoKFtleHByZXNzaW9uXSkgPT4gIU9iamVjdC5oYXNPd24odXNlckRlZmluZSwgZXhwcmVzc2lvbikpXG4gICk7XG4gIGlmIChPYmplY3Qua2V5cyhkZWZpbmUpLmxlbmd0aCA+IDApIHtcbiAgICBjb25maWcuZGVmaW5lID0gZGVmaW5lO1xuICB9XG5cbiAgY29uc3QganN4SW1wb3J0U291cmNlID0gZ2V0SnN4SW1wb3J0U291cmNlKGZlYXR1cmVzLmZyYW1ld29yayk7XG4gIGlmIChqc3hJbXBvcnRTb3VyY2UgIT09IHVuZGVmaW5lZCAmJiB1c2VyQ29uZmlnLm94YyAhPT0gZmFsc2UgJiYgdXNlckNvbmZpZy5veGM/LmpzeCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLm94YyA9IHsganN4OiB7IGRldmVsb3BtZW50OiAhaXNQcm9kdWN0aW9uQnVpbGQsIGltcG9ydFNvdXJjZToganN4SW1wb3J0U291cmNlLCBydW50aW1lOiAnYXV0b21hdGljJyB9IH07XG4gIH1cblxuICBpZiAocG9zdGNzc0NvbmZpZyAmJiBwb3N0Y3NzQ29uZmlnLnBsdWdpbnMubGVuZ3RoID4gMCAmJiB1c2VyQ29uZmlnLmNzcz8ucG9zdGNzcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uZmlnLmNzcyA9IHsgcG9zdGNzczogeyBwbHVnaW5zOiBbLi4ucG9zdGNzc0NvbmZpZy5wbHVnaW5zXSB9IH07XG4gIH1cbiAgcmV0dXJuIGNvbmZpZztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgdml0ZSBwbHVnaW4gdGhhdCBidWlsZHMgYW4gT2JzaWRpYW4gcGx1Z2luLlxuICpcbiAqIFdoYXQgaXQgZG9lcywgZWFjaCBvbmx5IHdoZW4gdGhlIGNvbnN1bWVyJ3MgY29uZmlnIGhhcyBub3Qgc2FpZCBvdGhlcndpc2U6XG4gKlxuICogLSBgYnVpbGQubGliYCBidWlsZHMgYHNyYy9tYWluLnRzYCBhcyBvbmUgQ29tbW9uSlMgYG1haW4uanNgLCB3aXRoIGl0cyBDU1MgaW4gYHN0eWxlcy5jc3NgLlxuICogLSBgYnVpbGQub3V0RGlyYCBpcyBgZGlzdC9idWlsZGAgKGBkaXN0L2RldmAgaW4gZGV2ZWxvcG1lbnQpLlxuICogLSBgYnVpbGQubWluaWZ5YCBpcyBvbiBpbiBwcm9kdWN0aW9uIG9ubHksIGFuZCBgYnVpbGQuc291cmNlbWFwYCBpcyBpbmxpbmUgaW4gZGV2ZWxvcG1lbnQgb25seS5cbiAqIC0gRXZlcnkgYXNzZXQgaXMgaW5saW5lZCwgYmVjYXVzZSBhbiBPYnNpZGlhbiByZWxlYXNlIHNoaXBzIGBtYWluLmpzYCBhbmQgYHN0eWxlcy5jc3NgIGFuZCBub3RoaW5nIGVsc2UuXG4gKiAtIER5bmFtaWMgaW1wb3J0cyBhcmUgaW5saW5lZCBpbnRvIGBtYWluLmpzYCwgYW5kIHRoZSBnZW5lcmF0ZWQtZmlsZSBiYW5uZXIgaGVhZHMgaXQuXG4gKlxuICogQW5kIGFsd2F5czogT2JzaWRpYW4ncyBvd24gbW9kdWxlcyAoYG9ic2lkaWFuYCwgYGVsZWN0cm9uYCwgQ29kZU1pcnJvciwgTGV6ZXIpIGFuZCB0aGUgTm9kZSBidWlsdGlucyBhcmVcbiAqIGV4dGVybmFsIGJlc2lkZSB0aGUgY29uc3VtZXIncyBvd24gYGV4dGVybmFsYCwgdGhlIG91dHB1dCBmb2xkZXIgaXMgZW1wdGllZCBvbmNlIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVcbiAqIChgYnVpbGQuZW1wdHlPdXREaXJgIGlzIHR1cm5lZCBvZmYsIHNpbmNlIHRoaXMgcGx1Z2luIGRvZXMgaXQpLCBldmVyeSBlbWl0dGVkIENTUyBmaWxlIGVuZHMgdXAgaW5cbiAqIGBzdHlsZXMuY3NzYCwgYG1hbmlmZXN0Lmpzb25gIChhbmQgaW4gZGV2ZWxvcG1lbnQgYC5ob3RyZWxvYWRgKSBpcyBjb3BpZWQgYmVzaWRlIGl0LCBhbmQgYSBkZXZlbG9wbWVudFxuICogYnVpbGQgaXMgZGVwbG95ZWQgaW50byB0aGUgdmF1bHQgbmFtZWQgYnkgYE9CU0lESUFOX0NPTkZJR19GT0xERVJgLlxuICpcbiAqIFRoZSBidWlsZCBmZWF0dXJlcyAoe0BsaW5rIE9ic2lkaWFuUGx1Z2luRmVhdHVyZU9wdGlvbnN9KTpcbiAqXG4gKiAtIGBmcmFtZXdvcms6ICdyZWFjdCcgfCAncHJlYWN0J2Agc2V0cyBgb3hjLmpzeGAgdG8gdGhlIGF1dG9tYXRpYyBydW50aW1lICh1bmxlc3Mgc2V0KS5cbiAqIC0gYGZyYW1ld29yazogJ3NvbGlkJyB8ICdzdmVsdGUnYCBjb21waWxlcyB0aGUgY29tcG9uZW50cyB3aXRoIHRoZSB0b29sa2l0J3Mgc2hhcmVkIHRyYW5zZm9ybXMsIGFuZCBgJ3Z1ZSdgIGFkZHNcbiAqICAgYHVucGx1Z2luLXZ1ZWAuXG4gKiAtIEFueSBmcmFtZXdvcmsgZGVmaW5lcyBgcHJvY2Vzcy5lbnYuTk9ERV9FTlZgIChhbmQgVnVlJ3MgZmVhdHVyZSBmbGFncyksIHdoaWNoIGEgbGlicmFyeSBidWlsZCBsZWF2ZXMgYWxvbmUuXG4gKiAtIGBzdHlsZXMucG9zdGNzc2AgYW5kIGBzdHlsZXMudGFpbHdpbmRgIHNldCBgY3NzLnBvc3Rjc3NgICh1bmxlc3Mgc2V0KTsgdml0ZSBzY29wZXMgYCoubW9kdWxlLmNzc2AgaXRzZWxmLCBzb1xuICogICBgc3R5bGVzLmNzc01vZHVsZXNgIGNoYW5nZXMgbm90aGluZyBoZXJlLlxuICogLSBgd2FzbWAgaW1wb3J0cyBhIGAud2FzbWAgbW9kdWxlIGFzIGl0cyBieXRlcy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgT2JzaWRpYW5QbHVnaW5WaXRlT3B0aW9uc30uXG4gKiBAcmV0dXJucyBUaGUgdml0ZSBwbHVnaW5zLCB3aGljaCB2aXRlIHRha2VzIGFzIG9uZSBlbnRyeSBvZiBpdHMgYHBsdWdpbnNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb2JzaWRpYW5QbHVnaW5WaXRlKG9wdGlvbnM6IE9ic2lkaWFuUGx1Z2luVml0ZU9wdGlvbnMgPSB7fSk6IFBsdWdpbk9wdGlvbltdIHtcbiAgY29uc3Qgc3RhdGU6IE9ic2lkaWFuUGx1Z2luVml0ZVN0YXRlID0ge1xuICAgIGJ1aWxkQ29udGV4dDogdW5kZWZpbmVkLFxuICAgIGlzRGlzdEZvbGRlckNsZWFuZWQ6IGZhbHNlXG4gIH07XG5cbiAgLyogdjggaWdub3JlIHN0YXJ0IC0tIFZpdGUgaG9va3M7IGV4ZXJjaXNlZCBieSB0aGUgYnVuZGxlciBpbnRlZ3JhdGlvbiB0ZXN0IGFnYWluc3QgYSByZWFsIHZpdGUgYnVpbGQuICovXG4gIGZ1bmN0aW9uIGdldEJ1aWxkQ29udGV4dCgpOiBPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCB7XG4gICAgaWYgKCFzdGF0ZS5idWlsZENvbnRleHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIG9ic2lkaWFuLXBsdWdpbiB2aXRlIHBsdWdpbiBoYXMgbm90IHJlc29sdmVkIGl0cyBidWlsZCBjb250ZXh0OiBpdHMgYGNvbmZpZ2AgaG9vayBkaWQgbm90IHJ1bi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgfVxuXG4gIGNvbnN0IGZlYXR1cmVQbHVnaW4gPSBjcmVhdGVSb2xsdXBDb21wYXRpYmxlRmVhdHVyZVBsdWdpbih7XG4gICAgZmVhdHVyZXM6IG9wdGlvbnMsXG4gICAgaXNQcm9kdWN0aW9uQnVpbGQ6ICgpID0+IGdldEJ1aWxkQ29udGV4dCgpLmlzUHJvZHVjdGlvbkJ1aWxkLFxuICAgIHNob3VsZENvbXBpbGVTdHlsZXNoZWV0czogZmFsc2UsXG4gICAgc2hvdWxkUmVwbGFjZURlZmluZXM6IGZhbHNlXG4gIH0pO1xuXG4gIGNvbnN0IHBsdWdpbiA9IHtcbiAgICBhcHBseTogJ2J1aWxkJyxcbiAgICBhc3luYyBjb25maWcodXNlckNvbmZpZzogVXNlckNvbmZpZywgZW52OiBDb25maWdFbnYpOiBQcm9taXNlPFVzZXJDb25maWc+IHtcbiAgICAgIHN0YXRlLmJ1aWxkQ29udGV4dCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhblBsdWdpbkJ1aWxkQ29udGV4dCh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIC4uLih1c2VyQ29uZmlnLmJ1aWxkPy5vdXREaXIgIT09IHVuZGVmaW5lZCAmJiB7IGRpc3RGb2xkZXI6IHVzZXJDb25maWcuYnVpbGQub3V0RGlyIH0pLFxuICAgICAgICBtb2RlOiBvcHRpb25zLm1vZGUgPz8gZ2V0Vml0ZUJ1aWxkTW9kZSh1c2VyQ29uZmlnLCBlbnYpXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHsgaXNQcm9kdWN0aW9uQnVpbGQgfSA9IHN0YXRlLmJ1aWxkQ29udGV4dDtcbiAgICAgIGNvbnN0IHBvc3Rjc3NDb25maWcgPSBpc1Bvc3Rjc3NOZWVkZWQob3B0aW9ucy5zdHlsZXMpXG4gICAgICAgID8gYXdhaXQgbG9hZFBvc3Rjc3NDb25maWcoeyBpc1Byb2R1Y3Rpb25CdWlsZCwgc3R5bGVzOiBvcHRpb25zLnN0eWxlcyA/PyB7fSB9KVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGZlYXR1cmVDb25maWcgPSBnZXRWaXRlRmVhdHVyZUNvbmZpZyh7IGZlYXR1cmVzOiBvcHRpb25zLCBpc1Byb2R1Y3Rpb25CdWlsZCwgcG9zdGNzc0NvbmZpZywgdXNlckNvbmZpZyB9KTtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGdldFZpdGVDb25maWdEZWZhdWx0cyh1c2VyQ29uZmlnLCBzdGF0ZS5idWlsZENvbnRleHQpO1xuICAgICAgcmV0dXJuIHsgLi4uZmVhdHVyZUNvbmZpZywgLi4uY29uZmlnIH07XG4gICAgfSxcbiAgICBnZW5lcmF0ZUJ1bmRsZToge1xuICAgICAgaGFuZGxlcih0aGlzOiBBc3NldEVtaXR0ZXIsIF9vdXRwdXRPcHRpb25zOiB1bmtub3duLCBidW5kbGU6IFJlY29yZDxzdHJpbmcsIEJ1bmRsZU91dHB1dExpa2U+KTogdm9pZCB7XG4gICAgICAgIHJlbmFtZUNzc0Fzc2V0cyh0aGlzLCBidW5kbGUpO1xuICAgICAgfSxcbiAgICAgIG9yZGVyOiAncG9zdCdcbiAgICB9LFxuICAgIG5hbWU6ICdvYnNpZGlhbi1wbHVnaW4nLFxuICAgIGFzeW5jIHJlbmRlclN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgaWYgKHN0YXRlLmlzRGlzdEZvbGRlckNsZWFuZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3RhdGUuaXNEaXN0Rm9sZGVyQ2xlYW5lZCA9IHRydWU7XG4gICAgICBhd2FpdCBjbGVhbk9ic2lkaWFuUGx1Z2luRGlzdEZvbGRlcihnZXRCdWlsZENvbnRleHQoKS5kaXN0Rm9sZGVyKTtcbiAgICB9LFxuICAgIGFzeW5jIHdyaXRlQnVuZGxlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgY29tcGxldGVPYnNpZGlhblBsdWdpbkRpc3RGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgICAgYXdhaXQgZGVwbG95VG9PYnNpZGlhblBsdWdpbnNGb2xkZXIoZ2V0QnVpbGRDb250ZXh0KCkpO1xuICAgIH1cbiAgfSBhcyBQbHVnaW47XG4gIHJldHVybiBbcGx1Z2luLCB7IC4uLmZlYXR1cmVQbHVnaW4sIGFwcGx5OiAnYnVpbGQnIH0gYXMgUGx1Z2luLCBjcmVhdGVVbnBsdWdpblZ1ZVBsdWdpbih7IGJ1bmRsZXI6ICd2aXRlJywgZmVhdHVyZXM6IG9wdGlvbnMgfSkgYXMgUHJvbWlzZTxudWxsIHwgUGx1Z2luPl07XG4gIC8qIHY4IGlnbm9yZSBzdG9wICovXG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBOEJBLG1DQU1PO0FBQ1Asc0NBSU87QUFDUCx3Q0FBa0M7QUFDbEMsZ0RBQThDO0FBQzlDLHdDQUdPO0FBQ1AsK0JBR087QUF1REEsU0FBUyxpQkFBaUIsWUFBd0IsS0FBeUM7QUFDaEcsU0FBTyxXQUFXLE9BQU8sU0FBUyxJQUFJLFNBQVMsZ0JBQWdCLHVDQUFVLGNBQWMsdUNBQVU7QUFDbkc7QUFTTyxTQUFTLHNCQUFzQixZQUF3QixjQUFzRDtBQUNsSCxRQUFNLFFBQVEsV0FBVyxTQUFTLENBQUM7QUFFbkMsUUFBTSxrQkFBa0IsTUFBTSxtQkFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RSxRQUFNLFNBQVMsTUFBTSxRQUFRLGdCQUFnQixNQUFNLElBQUksU0FBWSxnQkFBZ0IsVUFBVSxDQUFDO0FBRTlGLFNBQU87QUFBQSxJQUNMLE9BQU87QUFBQTtBQUFBO0FBQUEsTUFHTCxtQkFBbUIsTUFBTSxxQkFBcUIsT0FBTztBQUFBO0FBQUEsTUFFckQsYUFBYTtBQUFBLE1BQ2IsS0FBSyxNQUFNLE9BQU87QUFBQSxRQUNoQixhQUFhO0FBQUEsUUFDYixPQUFPLGFBQWE7QUFBQSxRQUNwQixVQUFVLE1BQWM7QUFBQSxRQUN4QixTQUFTLENBQUMsS0FBSztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxRQUFRLE1BQU0sVUFBVSxhQUFhO0FBQUE7QUFBQSxNQUVyQyxRQUFRLGFBQWE7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