wxt 0.7.0 → 0.7.1-alpha1

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.
package/dist/client.d.ts CHANGED
@@ -10,8 +10,9 @@ import { Manifest } from 'webextension-polyfill';
10
10
  declare class ContentScriptContext extends AbortController {
11
11
  #private;
12
12
  private readonly contentScriptName;
13
+ readonly options?: Omit<ContentScriptDefinition, "main"> | undefined;
13
14
  static SCRIPT_STARTED_MESSAGE_TYPE: string;
14
- constructor(contentScriptName: string);
15
+ constructor(contentScriptName: string, options?: Omit<ContentScriptDefinition, "main"> | undefined);
15
16
  get isInvalid(): boolean;
16
17
  get isValid(): boolean;
17
18
  /**
@@ -130,7 +131,7 @@ interface ContentScriptDefinition extends ExcludableEntrypoint {
130
131
  *
131
132
  * @default "manifest"
132
133
  */
133
- cssInjectionMode?: 'manifest' | 'manual';
134
+ cssInjectionMode?: 'manifest' | 'manual' | 'ui';
134
135
  /**
135
136
  * Main function executed when the content script is loaded.
136
137
  */
@@ -162,6 +163,133 @@ declare function defineContentScript(definition: ContentScriptDefinition): Conte
162
163
  declare function defineBackground(main: () => void): BackgroundScriptDefintition;
163
164
  declare function defineBackground(definition: BackgroundScriptDefintition): BackgroundScriptDefintition;
164
165
 
165
- declare function mountContentScriptUi(): void;
166
+ /**
167
+ * Utility for mounting content script UI's with isolated styles. Automatically removed from the DOM
168
+ * when the content script's context is invalidated.
169
+ *
170
+ * See <https://wxt.dev/guide/content-scripts.html#ui> for full documentation.
171
+ *
172
+ * @example
173
+ * // entrypoints/example-ui.content/index.ts
174
+ * import "./style.css"
175
+ *
176
+ * export default defineContentScript({
177
+ * matches: ["*://*.google.com/*"],
178
+ * cssInjectionMode: "ui",
179
+ *
180
+ * async main(ctx) {
181
+ * const ui = await createContentScriptUi(ctx, {
182
+ * name: "example-overlay",
183
+ * type: "modal",
184
+ * mount(container) {
185
+ * const app = document.createElement("div");
186
+ * app.textContent = "Content Script UI";
187
+ * container.append(app);
188
+ * }
189
+ * })
190
+ * ui.mount();
191
+ * }
192
+ * })
193
+ */
194
+ declare function createContentScriptUi<T>(ctx: ContentScriptContext, options: ContentScriptUiOptions<T>): Promise<ContentScriptUi<T>>;
195
+ interface ContentScriptUi<T> {
196
+ /**
197
+ * The `HTMLElement` hosting the shadow root used to isolate the UI's styles. This is the element
198
+ * that get's added to the DOM. This element's style is not isolated from the webpage.
199
+ */
200
+ shadowHost: HTMLElement;
201
+ /**
202
+ * The container element inside the `ShadowRoot` whose styles are isolated. The UI is mounted
203
+ * inside this `HTMLElement`.
204
+ */
205
+ uiContainer: HTMLElement;
206
+ /**
207
+ * The shadow root performing the isolation.
208
+ */
209
+ shadow: ShadowRoot;
210
+ /**
211
+ * Custom data returned from the `options.mount` function.
212
+ */
213
+ mounted: T;
214
+ /**
215
+ * Function that mounts or remounts the UI on the page.
216
+ */
217
+ mount: () => void;
218
+ /**
219
+ * Function that removes the UI from the webpage.
220
+ */
221
+ remove: () => void;
222
+ }
223
+ interface BaseContentScriptUiOptions<T> {
224
+ /**
225
+ * The name of the custom component used to host the ShadowRoot. Must be kebab-case.
226
+ */
227
+ name: string;
228
+ /**
229
+ * In combination with `anchor`, decide how to add the UI to the DOM.
230
+ *
231
+ * - `"last"` (default) - Add the UI as the last child of the `anchor` element
232
+ * - `"first"` - Add the UI as the last child of the `anchor` element
233
+ * - `"replace"` - Replace the `anchor` element with the UI.
234
+ * - `"before"` - Add the UI as the sibling before the `anchor` element
235
+ * - `"after"` - Add the UI as the sibling after the `anchor` element
236
+ * - `(anchor, ui) => void` - Customizable function that let's you add the UI to the DOM
237
+ */
238
+ append?: ContentScriptAppendMode | ((anchor: Element, ui: Element) => void);
239
+ /**
240
+ * A CSS selector, element, or function that returns one of the two. Along with `append`, the
241
+ * `anchor` dictates where in the page the UI will be added.
242
+ */
243
+ anchor?: string | Element | null | undefined | (() => string | Element | null | undefined);
244
+ /**
245
+ * Callback executed when mounting the UI. This function should create and append the UI to the
246
+ * `container` element. It is called every time `ui.mount()` is called
247
+ *
248
+ * Optionally return a value that can be accessed at `ui.mounted` or in the `onRemove` callback.
249
+ */
250
+ mount: (container: Element) => T;
251
+ /**
252
+ * Callback called when the UI is removed from the webpage. Use to cleanup your UI, like
253
+ * unmounting your vue or react apps.
254
+ */
255
+ onRemove?: (mounted: T) => void;
256
+ /**
257
+ * Custom CSS text to apply to the UI. If your content script imports/generates CSS and you've
258
+ * set `cssInjectionMode: "ui"`, the imported CSS will be included automatically. You do not need
259
+ * to pass those styles in here. This is for any additional styles not in the imported CSS.
260
+ *
261
+ * See <https://wxt.dev/guide/content-scripts.html#ui> for more info.
262
+ */
263
+ css?: string;
264
+ }
265
+ type OverlayContentScriptUiOptions<T> = BaseContentScriptUiOptions<T> & {
266
+ type: 'overlay';
267
+ /**
268
+ * When using `type: "overlay"`, the mounted element is 0px by 0px in size. Alignment specifies
269
+ * which corner is aligned with that 0x0 pixel space.
270
+ *
271
+ * @default "top-left"
272
+ */
273
+ alignment?: ContentScriptUiOverlayAlignment;
274
+ /**
275
+ * The `z-index` used on the `shadowHost`. Set to a positive number to show your UI over website
276
+ * content.
277
+ */
278
+ zIndex?: number;
279
+ };
280
+ type ModalContentScriptUiOptions<T> = BaseContentScriptUiOptions<T> & {
281
+ type: 'modal';
282
+ /**
283
+ * The `z-index` used on the `shadowHost`. Set to a positive number to show your UI over website
284
+ * content.
285
+ */
286
+ zIndex?: number;
287
+ };
288
+ type InlineContentScriptUiOptions<T> = BaseContentScriptUiOptions<T> & {
289
+ type: 'inline';
290
+ };
291
+ type ContentScriptUiOverlayAlignment = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
292
+ type ContentScriptAppendMode = 'last' | 'first' | 'replace' | 'before' | 'after';
293
+ type ContentScriptUiOptions<T> = OverlayContentScriptUiOptions<T> | ModalContentScriptUiOptions<T> | InlineContentScriptUiOptions<T>;
166
294
 
167
- export { ContentScriptContext, defineBackground, defineContentScript, mountContentScriptUi };
295
+ export { ContentScriptAppendMode, ContentScriptContext, ContentScriptUi, ContentScriptUiOptions, ContentScriptUiOverlayAlignment, InlineContentScriptUiOptions, ModalContentScriptUiOptions, OverlayContentScriptUiOptions, createContentScriptUi, defineBackground, defineContentScript };
package/dist/client.js CHANGED
@@ -10,10 +10,8 @@ function defineBackground(arg) {
10
10
  return arg;
11
11
  }
12
12
 
13
- // src/client/mountContentScriptUi.ts
14
- function mountContentScriptUi() {
15
- throw Error("Not implemented: mountContentScriptUi");
16
- }
13
+ // src/client/createContentScriptUi.ts
14
+ import { createIsolatedElement } from "@webext-core/isolated-element";
17
15
 
18
16
  // src/client/browser.ts
19
17
  import originalBrowser from "webextension-polyfill";
@@ -37,11 +35,129 @@ var logger = {
37
35
  error: (...args) => print(console.error, ...args)
38
36
  };
39
37
 
38
+ // src/client/createContentScriptUi.ts
39
+ async function createContentScriptUi(ctx, options) {
40
+ const css = [options.css ?? ""];
41
+ if (ctx.options?.cssInjectionMode === "ui") {
42
+ css.push(await loadCss());
43
+ }
44
+ const {
45
+ isolatedElement: uiContainer,
46
+ parentElement: shadowHost,
47
+ shadow
48
+ } = await createIsolatedElement({
49
+ name: options.name,
50
+ css: {
51
+ textContent: css.join("\n").trim()
52
+ },
53
+ mode: "open"
54
+ });
55
+ const getAnchor = () => {
56
+ if (options.anchor == null)
57
+ return document.body;
58
+ let resolved = typeof options.anchor === "function" ? options.anchor() : options.anchor;
59
+ if (typeof resolved === "string")
60
+ return document.querySelector(resolved) ?? void 0;
61
+ return resolved ?? void 0;
62
+ };
63
+ let mounted;
64
+ const mount = () => {
65
+ const anchor = getAnchor();
66
+ if (anchor == null)
67
+ throw Error(
68
+ "Failed to mount content script ui: could not find anchor element"
69
+ );
70
+ mounted = options.mount(uiContainer);
71
+ switch (options.append) {
72
+ case void 0:
73
+ case "last":
74
+ anchor.append(shadowHost);
75
+ break;
76
+ case "first":
77
+ if (anchor.firstChild) {
78
+ anchor.insertBefore(shadowHost, anchor.firstChild);
79
+ } else {
80
+ anchor.append(shadowHost);
81
+ }
82
+ break;
83
+ case "replace":
84
+ anchor.replaceWith(shadowHost);
85
+ break;
86
+ case "after":
87
+ anchor.replaceWith(anchor, shadowHost);
88
+ break;
89
+ case "before":
90
+ anchor.replaceWith(shadowHost, anchor);
91
+ break;
92
+ default:
93
+ options.append(anchor, shadowHost);
94
+ break;
95
+ }
96
+ if (options.type !== "inline") {
97
+ if (options.zIndex != null)
98
+ shadowHost.style.zIndex = String(options.zIndex);
99
+ shadowHost.style.overflow = "visible";
100
+ shadowHost.style.position = "relative";
101
+ shadowHost.style.width = "0";
102
+ shadowHost.style.height = "0";
103
+ shadowHost.style.display = "block";
104
+ const html = shadow.querySelector("html");
105
+ if (options.type === "overlay") {
106
+ html.style.position = "absolute";
107
+ if (options.alignment?.startsWith("bottom-"))
108
+ html.style.bottom = "0";
109
+ else
110
+ html.style.top = "0";
111
+ if (options.alignment?.endsWith("-right"))
112
+ html.style.right = "0";
113
+ else
114
+ html.style.left = "0";
115
+ } else {
116
+ html.style.position = "fixed";
117
+ html.style.top = "0";
118
+ html.style.bottom = "0";
119
+ html.style.left = "0";
120
+ html.style.right = "0";
121
+ }
122
+ }
123
+ };
124
+ const remove = () => {
125
+ shadowHost.remove();
126
+ options.onRemove?.(mounted);
127
+ while (uiContainer.lastChild)
128
+ uiContainer.removeChild(uiContainer.lastChild);
129
+ };
130
+ ctx.onInvalidated(remove);
131
+ return {
132
+ shadow,
133
+ shadowHost,
134
+ uiContainer,
135
+ mount,
136
+ remove,
137
+ mounted
138
+ };
139
+ }
140
+ async function loadCss() {
141
+ const url = browser.runtime.getURL(`/content-scripts/${__ENTRYPOINT__}.css`);
142
+ try {
143
+ const res = await fetch(url);
144
+ const css = await res.text();
145
+ return css.replaceAll(":root", ":host");
146
+ } catch (err) {
147
+ logger.warn(
148
+ `Failed to load styles @ ${url}. Did you forget to import the stylesheet in your entrypoint?`,
149
+ err
150
+ );
151
+ return "";
152
+ }
153
+ }
154
+
40
155
  // src/client/utils/ContentScriptContext.ts
41
156
  var ContentScriptContext = class _ContentScriptContext extends AbortController {
42
- constructor(contentScriptName) {
157
+ constructor(contentScriptName, options) {
43
158
  super();
44
159
  this.contentScriptName = contentScriptName;
160
+ this.options = options;
45
161
  if (this.#isTopFrame) {
46
162
  this.#stopOldScripts();
47
163
  }
@@ -165,10 +281,13 @@ var ContentScriptContext = class _ContentScriptContext extends AbortController {
165
281
  );
166
282
  }
167
283
  #stopOldScripts() {
168
- window.postMessage({
169
- event: _ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,
170
- contentScriptName: this.contentScriptName
171
- });
284
+ window.postMessage(
285
+ {
286
+ event: _ContentScriptContext.SCRIPT_STARTED_MESSAGE_TYPE,
287
+ contentScriptName: this.contentScriptName
288
+ },
289
+ "*"
290
+ );
172
291
  }
173
292
  #listenForNewerScripts() {
174
293
  const cb = (event) => {
@@ -182,8 +301,8 @@ var ContentScriptContext = class _ContentScriptContext extends AbortController {
182
301
  };
183
302
  export {
184
303
  ContentScriptContext,
304
+ createContentScriptUi,
185
305
  defineBackground,
186
- defineContentScript,
187
- mountContentScriptUi
306
+ defineContentScript
188
307
  };
189
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC9kZWZpbmVDb250ZW50U2NyaXB0LnRzIiwgIi4uL3NyYy9jbGllbnQvZGVmaW5lQmFja2dyb3VuZC50cyIsICIuLi9zcmMvY2xpZW50L21vdW50Q29udGVudFNjcmlwdFVpLnRzIiwgIi4uL3NyYy9jbGllbnQvYnJvd3Nlci50cyIsICIuLi9zcmMvY2xpZW50L3V0aWxzL2xvZ2dlci50cyIsICIuLi9zcmMvY2xpZW50L3V0aWxzL0NvbnRlbnRTY3JpcHRDb250ZXh0LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB9IGZyb20gJy4uL2NvcmUvdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQ29udGVudFNjcmlwdChcbiAgZGVmaW5pdGlvbjogQ29udGVudFNjcmlwdERlZmluaXRpb24sXG4pOiBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB7XG4gIHJldHVybiBkZWZpbml0aW9uO1xufVxuIiwgImltcG9ydCB7IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbiB9IGZyb20gJy4uJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUJhY2tncm91bmQobWFpbjogKCkgPT4gdm9pZCk6IEJhY2tncm91bmRTY3JpcHREZWZpbnRpdGlvbjtcbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCYWNrZ3JvdW5kKFxuICBkZWZpbml0aW9uOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb247XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQmFja2dyb3VuZChcbiAgYXJnOiAoKCkgPT4gdm9pZCkgfCBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24sXG4pOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24ge1xuICBpZiAodHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHsgbWFpbjogYXJnIH07XG4gIHJldHVybiBhcmc7XG59XG4iLCAiZXhwb3J0IGZ1bmN0aW9uIG1vdW50Q29udGVudFNjcmlwdFVpKCkge1xuICB0aHJvdyBFcnJvcignTm90IGltcGxlbWVudGVkOiBtb3VudENvbnRlbnRTY3JpcHRVaScpO1xufVxuIiwgImltcG9ydCBvcmlnaW5hbEJyb3dzZXIsIHsgQnJvd3NlciwgUnVudGltZSwgSTE4biB9IGZyb20gJ3dlYmV4dGVuc2lvbi1wb2x5ZmlsbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXVnbWVudGVkQnJvd3NlciBleHRlbmRzIEJyb3dzZXIge1xuICBydW50aW1lOiBXeHRSdW50aW1lO1xuICBpMThuOiBXeHRJMThuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFd4dFJ1bnRpbWUgZXh0ZW5kcyBSdW50aW1lLlN0YXRpYyB7XG4gIC8vIE92ZXJyaWRlbiBwZXItcHJvamVjdFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFd4dEkxOG4gZXh0ZW5kcyBJMThuLlN0YXRpYyB7XG4gIC8vIE92ZXJyaWRlbiBwZXItcHJvamVjdFxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlcjogQXVnbWVudGVkQnJvd3NlciA9IG9yaWdpbmFsQnJvd3NlcjtcbiIsICJmdW5jdGlvbiBwcmludChtZXRob2Q6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZCwgLi4uYXJnczogYW55W10pIHtcbiAgaWYgKGltcG9ydC5tZXRhLmVudi5NT0RFID09PSAncHJvZHVjdGlvbicpIHJldHVybjtcblxuICBpZiAodHlwZW9mIGFyZ3NbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IGFyZ3Muc2hpZnQoKTtcbiAgICBtZXRob2QoYFt3eHRdICR7bWVzc2FnZX1gLCAuLi5hcmdzKTtcbiAgfSBlbHNlIHtcbiAgICBtZXRob2QoJ1t3eHRdJywgLi4uYXJncyk7XG4gIH1cbn1cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBgY29uc29sZWAgd2l0aCBhIFwiW3d4dF1cIiBwcmVmaXhcbiAqL1xuZXhwb3J0IGNvbnN0IGxvZ2dlciA9IHtcbiAgZGVidWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gcHJpbnQoY29uc29sZS5kZWJ1ZywgLi4uYXJncyksXG4gIGxvZzogKC4uLmFyZ3M6IGFueVtdKSA9PiBwcmludChjb25zb2xlLmxvZywgLi4uYXJncyksXG4gIHdhcm46ICguLi5hcmdzOiBhbnlbXSkgPT4gcHJpbnQoY29uc29sZS53YXJuLCAuLi5hcmdzKSxcbiAgZXJyb3I6ICguLi5hcmdzOiBhbnlbXSkgPT4gcHJpbnQoY29uc29sZS5lcnJvciwgLi4uYXJncyksXG59O1xuIiwgImltcG9ydCB7IGJyb3dzZXIgfSBmcm9tICcuLi9icm93c2VyJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyJztcblxuLyoqXG4gKiBFeHRlbmRzIFtgQWJvcnRDb250cm9sbGVyYF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0Fib3J0Q29udHJvbGxlcikuXG4gKiBVc2VkIHRvIGRldGVjdCBhbmQgc3RvcCBjb250ZW50IHNjcmlwdCBjb2RlIHdoZW4gdGhlIHNjcmlwdCBpcyBpbnZhbGlkYXRlZC5cbiAqXG4gKiBJdCBhbHNvIHByb3ZpZGVzIHNldmVyYWwgdXRpbGl0aWVzIGxpa2UgYGN0eC5zZXRUaW1lb3V0YCBhbmQgYGN0eC5zZXRJbnRlcnZhbGAgdGhhdCBzaG91bGQgYmUgdXNlZCBpblxuICogY29udGVudCBzY3JpcHRzIGluc3RlYWQgb2YgYHdpbmRvdy5zZXRUaW1lb3V0YCBvciBgd2luZG93LnNldEludGVydmFsYC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRlbnRTY3JpcHRDb250ZXh0IGV4dGVuZHMgQWJvcnRDb250cm9sbGVyIHtcbiAgc3RhdGljIFNDUklQVF9TVEFSVEVEX01FU1NBR0VfVFlQRSA9ICd3eHQ6Y29udGVudC1zY3JpcHQtc3RhcnRlZCc7XG5cbiAgI2lzVG9wRnJhbWUgPSB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRTY3JpcHROYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHRoaXMuI2lzVG9wRnJhbWUpIHtcbiAgICAgIHRoaXMuI3N0b3BPbGRTY3JpcHRzKCk7XG4gICAgfVxuICAgIHRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAvLyBSdW4gb24gbmV4dCB0aWNrIHNvIHRoZSBsaXN0ZW5lciBpdCBhZGRzIGlzbid0IHRyaWdnZXJlZCBieSBzdG9wT2xkU2NyaXB0XG4gICAgICB0aGlzLiNsaXN0ZW5Gb3JOZXdlclNjcmlwdHMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpc0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKGJyb3dzZXIucnVudGltZS5pZCA9PSBudWxsKSB7XG4gICAgICB0aGlzLm5vdGlmeUludmFsaWRhdGVkKCk7IC8vIFNldHMgYHNpZ25hbC5hYm9ydGVkYCB0byB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNpZ25hbC5hYm9ydGVkO1xuICB9XG5cbiAgZ2V0IGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzSW52YWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBsaXN0ZW5lciB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IHNjcmlwdCdzIGNvbnRleHQgaXMgaW52YWxpZGF0ZWQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcmVtb3ZlIHRoZSBsaXN0ZW5lci5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYnJvd3Nlci5ydW50aW1lLm9uTWVzc2FnZS5hZGRMaXN0ZW5lcihjYik7XG4gICAqIGNvbnN0IHJlbW92ZUludmFsaWRhdGVkTGlzdGVuZXIgPSBjdHgub25JbnZhbGlkYXRlZCgoKSA9PiB7XG4gICAqICAgYnJvd3Nlci5ydW50aW1lLm9uTWVzc2FnZS5yZW1vdmVMaXN0ZW5lcihjYik7XG4gICAqIH0pXG4gICAqIC8vIC4uLlxuICAgKiByZW1vdmVJbnZhbGlkYXRlZExpc3RlbmVyKCk7XG4gICAqL1xuICBvbkludmFsaWRhdGVkKGNiOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYik7XG4gICAgcmV0dXJuICgpID0+IHRoaXMuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgY2IpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHByb21pc2UgdGhhdCBuZXZlciByZXNvbHZlcy4gVXNlZnVsIGlmIHlvdSBoYXZlIGFuIGFzeW5jIGZ1bmN0aW9uIHRoYXQgc2hvdWxkbid0IHJ1blxuICAgKiBhZnRlciB0aGUgY29udGV4dCBpcyBleHBpcmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBnZXRWYWx1ZUZyb21TdG9yYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgKiAgIGlmIChjdHguaXNJbnZhbGlkKSByZXR1cm4gY3R4LmJsb2NrKCk7XG4gICAqXG4gICAqICAgLy8gLi4uXG4gICAqIH1cbiAgICovXG4gIGJsb2NrPFQ+KCk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgoKSA9PiB7XG4gICAgICAvLyBub29wXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5zZXRJbnRlcnZhbGAgdGhhdCBhdXRvbWF0aWNhbGx5IGNsZWFycyB0aGUgaW50ZXJ2YWwgd2hlbiBpbnZhbGlkYXRlZC5cbiAgICovXG4gIHNldEludGVydmFsKGhhbmRsZXI6ICgpID0+IHZvaWQsIHRpbWVvdXQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkgaGFuZGxlcigpO1xuICAgIH0sIHRpbWVvdXQpIGFzIHVua25vd24gYXMgbnVtYmVyO1xuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiBjbGVhckludGVydmFsKGlkKSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgYXJvdW5kIGB3aW5kb3cuc2V0VGltZW91dGAgdGhhdCBhdXRvbWF0aWNhbGx5IGNsZWFycyB0aGUgaW50ZXJ2YWwgd2hlbiBpbnZhbGlkYXRlZC5cbiAgICovXG4gIHNldFRpbWVvdXQoaGFuZGxlcjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWQpIGhhbmRsZXIoKTtcbiAgICB9LCB0aW1lb3V0KSBhcyB1bmtub3duIGFzIG51bWJlcjtcbiAgICB0aGlzLm9uSW52YWxpZGF0ZWQoKCkgPT4gY2xlYXJUaW1lb3V0KGlkKSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgYXJvdW5kIGB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyB0aGUgcmVxdWVzdCB3aGVuXG4gICAqIGludmFsaWRhdGVkLlxuICAgKi9cbiAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrOiBGcmFtZVJlcXVlc3RDYWxsYmFjayk6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICh0aGlzLmlzVmFsaWQpIGNhbGxiYWNrKC4uLmFyZ3MpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5vbkludmFsaWRhdGVkKCgpID0+IGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyYXBwZXIgYXJvdW5kIGB3aW5kb3cucmVxdWVzdElkbGVDYWxsYmFja2AgdGhhdCBhdXRvbWF0aWNhbGx5IGNhbmNlbHMgdGhlIHJlcXVlc3Qgd2hlblxuICAgKiBpbnZhbGlkYXRlZC5cbiAgICovXG4gIHJlcXVlc3RJZGxlQ2FsbGJhY2soXG4gICAgY2FsbGJhY2s6IElkbGVSZXF1ZXN0Q2FsbGJhY2ssXG4gICAgb3B0aW9ucz86IElkbGVSZXF1ZXN0T3B0aW9ucyxcbiAgKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHJlcXVlc3RJZGxlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICAgIGlmICghdGhpcy5zaWduYWwuYWJvcnRlZCkgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgfSwgb3B0aW9ucyk7XG5cbiAgICB0aGlzLm9uSW52YWxpZGF0ZWQoKCkgPT4gY2FuY2VsSWRsZUNhbGxiYWNrKGlkKSk7XG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgYHRhcmdldC5hZGRFdmVudExpc3RlbmVyYCBhbmQgcmVtb3ZlIHRoZSBldmVudCBsaXN0ZW5lciB3aGVuIHRoZSBjb250ZXh0IGlzIGludmFsaWRhdGVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjdHguYWRkRXZlbnRMaXN0ZW5lcih3aW5kb3csIFwibW91c2Vtb3ZlXCIsICgpID0+IHtcbiAgICogICAvLyAuLi5cbiAgICogfSk7XG4gICAqIGN0eC5hZGRFdmVudExpc3RlbmVyKGRvY3VtZW50LCBcInZpc2liaWxpdHljaGFuZ2VcIiwgKCkgPT4ge1xuICAgKiAgIC8vIC4uLlxuICAgKiB9KTtcbiAgICovXG4gIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgdGFyZ2V0OiBhbnksXG4gICAgdHlwZTogc3RyaW5nLFxuICAgIGhhbmRsZXI6IChldmVudDogRXZlbnQpID0+IHZvaWQsXG4gICAgb3B0aW9ucz86IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zLFxuICApIHtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcj8uKHR5cGUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgIHRoaXMub25JbnZhbGlkYXRlZChcbiAgICAgICgpID0+IHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyPy4odHlwZSwgaGFuZGxlciwgb3B0aW9ucyksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydCB0aGUgYWJvcnQgY29udHJvbGxlciBhbmQgZXhlY3V0ZSBhbGwgYG9uSW52YWxpZGF0ZWRgIGxpc3RlbmVycy5cbiAgICovXG4gIG5vdGlmeUludmFsaWRhdGVkKCkge1xuICAgIHRoaXMuYWJvcnQoJ0NvbnRlbnQgc2NyaXB0IGNvbnRleHQgaW52YWxpZGF0ZWQnKTtcbiAgICBsb2dnZXIuZGVidWcoXG4gICAgICBgQ29udGVudCBzY3JpcHQgXCIke3RoaXMuY29udGVudFNjcmlwdE5hbWV9XCIgY29udGV4dCBpbnZhbGlkYXRlZGAsXG4gICAgKTtcbiAgfVxuXG4gICNzdG9wT2xkU2NyaXB0cygpIHtcbiAgICAvLyBVc2UgcG9zdE1lc3NhZ2Ugc28gaXQgZ2V0J3Mgc2VudCB0byBhbGwgdGhlIGZyYW1lcyBvZiB0aGUgcGFnZS5cbiAgICB3aW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgZXZlbnQ6IENvbnRlbnRTY3JpcHRDb250ZXh0LlNDUklQVF9TVEFSVEVEX01FU1NBR0VfVFlQRSxcbiAgICAgIGNvbnRlbnRTY3JpcHROYW1lOiB0aGlzLmNvbnRlbnRTY3JpcHROYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgI2xpc3RlbkZvck5ld2VyU2NyaXB0cygpIHtcbiAgICBjb25zdCBjYiA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50LmRhdGE/LnR5cGUgPT09IENvbnRlbnRTY3JpcHRDb250ZXh0LlNDUklQVF9TVEFSVEVEX01FU1NBR0VfVFlQRSAmJlxuICAgICAgICBldmVudC5kYXRhPy5jb250ZW50U2NyaXB0TmFtZSA9PT0gdGhpcy5jb250ZW50U2NyaXB0TmFtZVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubm90aWZ5SW52YWxpZGF0ZWQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNiKTtcbiAgICB0aGlzLm9uSW52YWxpZGF0ZWQoKCkgPT4gcmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGNiKSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFTyxTQUFTLG9CQUNkLFlBQ3lCO0FBQ3pCLFNBQU87QUFDVDs7O0FDQU8sU0FBUyxpQkFDZCxLQUM2QjtBQUM3QixNQUFJLE9BQU8sUUFBUTtBQUFZLFdBQU8sRUFBRSxNQUFNLElBQUk7QUFDbEQsU0FBTztBQUNUOzs7QUNYTyxTQUFTLHVCQUF1QjtBQUNyQyxRQUFNLE1BQU0sdUNBQXVDO0FBQ3JEOzs7QUNGQSxPQUFPLHFCQUFpRDtBQWVqRCxJQUFNLFVBQTRCOzs7QUNmekMsU0FBUyxNQUFNLFdBQXFDLE1BQWE7QUFDL0QsTUFBSSxZQUFZLElBQUksU0FBUztBQUFjO0FBRTNDLE1BQUksT0FBTyxLQUFLLENBQUMsTUFBTSxVQUFVO0FBQy9CLFVBQU0sVUFBVSxLQUFLLE1BQU07QUFDM0IsV0FBTyxTQUFTLE9BQU8sSUFBSSxHQUFHLElBQUk7QUFBQSxFQUNwQyxPQUFPO0FBQ0wsV0FBTyxTQUFTLEdBQUcsSUFBSTtBQUFBLEVBQ3pCO0FBQ0Y7QUFLTyxJQUFNLFNBQVM7QUFBQSxFQUNwQixPQUFPLElBQUksU0FBZ0IsTUFBTSxRQUFRLE9BQU8sR0FBRyxJQUFJO0FBQUEsRUFDdkQsS0FBSyxJQUFJLFNBQWdCLE1BQU0sUUFBUSxLQUFLLEdBQUcsSUFBSTtBQUFBLEVBQ25ELE1BQU0sSUFBSSxTQUFnQixNQUFNLFFBQVEsTUFBTSxHQUFHLElBQUk7QUFBQSxFQUNyRCxPQUFPLElBQUksU0FBZ0IsTUFBTSxRQUFRLE9BQU8sR0FBRyxJQUFJO0FBQ3pEOzs7QUNUTyxJQUFNLHVCQUFOLE1BQU0sOEJBQTZCLGdCQUFnQjtBQUFBLEVBS3hELFlBQTZCLG1CQUEyQjtBQUN0RCxVQUFNO0FBRHFCO0FBRzNCLFFBQUksS0FBSyxhQUFhO0FBQ3BCLFdBQUssZ0JBQWdCO0FBQUEsSUFDdkI7QUFDQSxTQUFLLFdBQVcsTUFBTTtBQUVwQixXQUFLLHVCQUF1QjtBQUFBLElBQzlCLENBQUM7QUFBQSxFQUNIO0FBQUEsRUFkQSxPQUFPLDhCQUE4QjtBQUFBLEVBRXJDLGNBQWMsT0FBTyxTQUFTLE9BQU87QUFBQSxFQWNyQyxJQUFJLFlBQXFCO0FBQ3ZCLFFBQUksUUFBUSxRQUFRLE1BQU0sTUFBTTtBQUM5QixXQUFLLGtCQUFrQjtBQUFBLElBQ3pCO0FBQ0EsV0FBTyxLQUFLLE9BQU87QUFBQSxFQUNyQjtBQUFBLEVBRUEsSUFBSSxVQUFtQjtBQUNyQixXQUFPLENBQUMsS0FBSztBQUFBLEVBQ2Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBZUEsY0FBYyxJQUE0QjtBQUN4QyxTQUFLLE9BQU8saUJBQWlCLFNBQVMsRUFBRTtBQUN4QyxXQUFPLE1BQU0sS0FBSyxPQUFPLG9CQUFvQixTQUFTLEVBQUU7QUFBQSxFQUMxRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFBLFFBQXVCO0FBQ3JCLFdBQU8sSUFBSSxRQUFRLE1BQU07QUFBQSxJQUV6QixDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsWUFBWSxTQUFxQixTQUEwQjtBQUN6RCxVQUFNLEtBQUssWUFBWSxNQUFNO0FBQzNCLFVBQUksS0FBSztBQUFTLGdCQUFRO0FBQUEsSUFDNUIsR0FBRyxPQUFPO0FBQ1YsU0FBSyxjQUFjLE1BQU0sY0FBYyxFQUFFLENBQUM7QUFDMUMsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQUtBLFdBQVcsU0FBcUIsU0FBMEI7QUFDeEQsVUFBTSxLQUFLLFdBQVcsTUFBTTtBQUMxQixVQUFJLEtBQUs7QUFBUyxnQkFBUTtBQUFBLElBQzVCLEdBQUcsT0FBTztBQUNWLFNBQUssY0FBYyxNQUFNLGFBQWEsRUFBRSxDQUFDO0FBQ3pDLFdBQU87QUFBQSxFQUNUO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU1BLHNCQUFzQixVQUF3QztBQUM1RCxVQUFNLEtBQUssc0JBQXNCLElBQUksU0FBUztBQUM1QyxVQUFJLEtBQUs7QUFBUyxpQkFBUyxHQUFHLElBQUk7QUFBQSxJQUNwQyxDQUFDO0FBRUQsU0FBSyxjQUFjLE1BQU0scUJBQXFCLEVBQUUsQ0FBQztBQUNqRCxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxvQkFDRSxVQUNBLFNBQ1E7QUFDUixVQUFNLEtBQUssb0JBQW9CLElBQUksU0FBUztBQUMxQyxVQUFJLENBQUMsS0FBSyxPQUFPO0FBQVMsaUJBQVMsR0FBRyxJQUFJO0FBQUEsSUFDNUMsR0FBRyxPQUFPO0FBRVYsU0FBSyxjQUFjLE1BQU0sbUJBQW1CLEVBQUUsQ0FBQztBQUMvQyxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFBLGlCQUNFLFFBQ0EsTUFDQSxTQUNBLFNBQ0E7QUFDQSxXQUFPLG1CQUFtQixNQUFNLFNBQVMsT0FBTztBQUNoRCxTQUFLO0FBQUEsTUFDSCxNQUFNLE9BQU8sc0JBQXNCLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDM0Q7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFLQSxvQkFBb0I7QUFDbEIsU0FBSyxNQUFNLG9DQUFvQztBQUMvQyxXQUFPO0FBQUEsTUFDTCxtQkFBbUIsS0FBSyxpQkFBaUI7QUFBQSxJQUMzQztBQUFBLEVBQ0Y7QUFBQSxFQUVBLGtCQUFrQjtBQUVoQixXQUFPLFlBQVk7QUFBQSxNQUNqQixPQUFPLHNCQUFxQjtBQUFBLE1BQzVCLG1CQUFtQixLQUFLO0FBQUEsSUFDMUIsQ0FBQztBQUFBLEVBQ0g7QUFBQSxFQUVBLHlCQUF5QjtBQUN2QixVQUFNLEtBQUssQ0FBQyxVQUF3QjtBQUNsQyxVQUNFLE1BQU0sTUFBTSxTQUFTLHNCQUFxQiwrQkFDMUMsTUFBTSxNQUFNLHNCQUFzQixLQUFLLG1CQUN2QztBQUNBLGFBQUssa0JBQWtCO0FBQUEsTUFDekI7QUFBQSxJQUNGO0FBRUEscUJBQWlCLFdBQVcsRUFBRTtBQUM5QixTQUFLLGNBQWMsTUFBTSxvQkFBb0IsV0FBVyxFQUFFLENBQUM7QUFBQSxFQUM3RDtBQUNGOyIsCiAgIm5hbWVzIjogW10KfQo=
308
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC9kZWZpbmVDb250ZW50U2NyaXB0LnRzIiwgIi4uL3NyYy9jbGllbnQvZGVmaW5lQmFja2dyb3VuZC50cyIsICIuLi9zcmMvY2xpZW50L2NyZWF0ZUNvbnRlbnRTY3JpcHRVaS50cyIsICIuLi9zcmMvY2xpZW50L2Jyb3dzZXIudHMiLCAiLi4vc3JjL2NsaWVudC91dGlscy9sb2dnZXIudHMiLCAiLi4vc3JjL2NsaWVudC91dGlscy9Db250ZW50U2NyaXB0Q29udGV4dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQ29udGVudFNjcmlwdERlZmluaXRpb24gfSBmcm9tICcuLi9jb3JlL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUNvbnRlbnRTY3JpcHQoXG4gIGRlZmluaXRpb246IENvbnRlbnRTY3JpcHREZWZpbml0aW9uLFxuKTogQ29udGVudFNjcmlwdERlZmluaXRpb24ge1xuICByZXR1cm4gZGVmaW5pdGlvbjtcbn1cbiIsICJpbXBvcnQgeyBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb24gfSBmcm9tICcuLic7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVCYWNrZ3JvdW5kKG1haW46ICgpID0+IHZvaWQpOiBCYWNrZ3JvdW5kU2NyaXB0RGVmaW50aXRpb247XG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lQmFja2dyb3VuZChcbiAgZGVmaW5pdGlvbjogQmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uLFxuKTogQmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZUJhY2tncm91bmQoXG4gIGFyZzogKCgpID0+IHZvaWQpIHwgQmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uLFxuKTogQmFja2dyb3VuZFNjcmlwdERlZmludGl0aW9uIHtcbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbicpIHJldHVybiB7IG1haW46IGFyZyB9O1xuICByZXR1cm4gYXJnO1xufVxuIiwgImltcG9ydCB7IGNyZWF0ZUlzb2xhdGVkRWxlbWVudCB9IGZyb20gJ0B3ZWJleHQtY29yZS9pc29sYXRlZC1lbGVtZW50JztcbmltcG9ydCB7IGJyb3dzZXIgfSBmcm9tICcuL2Jyb3dzZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IHsgQ29udGVudFNjcmlwdENvbnRleHQgfSBmcm9tICcuJztcblxuLyoqXG4gKiBVdGlsaXR5IGZvciBtb3VudGluZyBjb250ZW50IHNjcmlwdCBVSSdzIHdpdGggaXNvbGF0ZWQgc3R5bGVzLiBBdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgRE9NXG4gKiB3aGVuIHRoZSBjb250ZW50IHNjcmlwdCdzIGNvbnRleHQgaXMgaW52YWxpZGF0ZWQuXG4gKlxuICogU2VlIDxodHRwczovL3d4dC5kZXYvZ3VpZGUvY29udGVudC1zY3JpcHRzLmh0bWwjdWk+IGZvciBmdWxsIGRvY3VtZW50YXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIGVudHJ5cG9pbnRzL2V4YW1wbGUtdWkuY29udGVudC9pbmRleC50c1xuICogaW1wb3J0IFwiLi9zdHlsZS5jc3NcIlxuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbnRlbnRTY3JpcHQoe1xuICogICBtYXRjaGVzOiBbXCIqOi8vKi5nb29nbGUuY29tLypcIl0sXG4gKiAgIGNzc0luamVjdGlvbk1vZGU6IFwidWlcIixcbiAqXG4gKiAgIGFzeW5jIG1haW4oY3R4KSB7XG4gKiAgICAgY29uc3QgdWkgPSBhd2FpdCBjcmVhdGVDb250ZW50U2NyaXB0VWkoY3R4LCB7XG4gKiAgICAgICBuYW1lOiBcImV4YW1wbGUtb3ZlcmxheVwiLFxuICogICAgICAgdHlwZTogXCJtb2RhbFwiLFxuICogICAgICAgbW91bnQoY29udGFpbmVyKSB7XG4gKiAgICAgICAgIGNvbnN0IGFwcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gKiAgICAgICAgIGFwcC50ZXh0Q29udGVudCA9IFwiQ29udGVudCBTY3JpcHQgVUlcIjtcbiAqICAgICAgICAgY29udGFpbmVyLmFwcGVuZChhcHApO1xuICogICAgICAgfVxuICogICAgIH0pXG4gKiAgICAgdWkubW91bnQoKTtcbiAqICAgfVxuICogfSlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUNvbnRlbnRTY3JpcHRVaTxUPihcbiAgY3R4OiBDb250ZW50U2NyaXB0Q29udGV4dCxcbiAgb3B0aW9uczogQ29udGVudFNjcmlwdFVpT3B0aW9uczxUPixcbik6IFByb21pc2U8Q29udGVudFNjcmlwdFVpPFQ+PiB7XG4gIGNvbnN0IGNzcyA9IFtvcHRpb25zLmNzcyA/PyAnJ107XG4gIGlmIChjdHgub3B0aW9ucz8uY3NzSW5qZWN0aW9uTW9kZSA9PT0gJ3VpJykge1xuICAgIGNzcy5wdXNoKGF3YWl0IGxvYWRDc3MoKSk7XG4gIH1cblxuICBjb25zdCB7XG4gICAgaXNvbGF0ZWRFbGVtZW50OiB1aUNvbnRhaW5lcixcbiAgICBwYXJlbnRFbGVtZW50OiBzaGFkb3dIb3N0LFxuICAgIHNoYWRvdyxcbiAgfSA9IGF3YWl0IGNyZWF0ZUlzb2xhdGVkRWxlbWVudCh7XG4gICAgbmFtZTogb3B0aW9ucy5uYW1lLFxuICAgIGNzczoge1xuICAgICAgdGV4dENvbnRlbnQ6IGNzcy5qb2luKCdcXG4nKS50cmltKCksXG4gICAgfSxcbiAgICBtb2RlOiAnb3BlbicsXG4gIH0pO1xuXG4gIGNvbnN0IGdldEFuY2hvciA9ICgpOiBFbGVtZW50IHwgdW5kZWZpbmVkID0+IHtcbiAgICBpZiAob3B0aW9ucy5hbmNob3IgPT0gbnVsbCkgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG5cbiAgICBsZXQgcmVzb2x2ZWQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuYW5jaG9yID09PSAnZnVuY3Rpb24nID8gb3B0aW9ucy5hbmNob3IoKSA6IG9wdGlvbnMuYW5jaG9yO1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnKVxuICAgICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8RWxlbWVudD4ocmVzb2x2ZWQpID8/IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVzb2x2ZWQgPz8gdW5kZWZpbmVkO1xuICB9O1xuXG4gIGxldCBtb3VudGVkOiBUO1xuXG4gIGNvbnN0IG1vdW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IGFuY2hvciA9IGdldEFuY2hvcigpO1xuICAgIGlmIChhbmNob3IgPT0gbnVsbClcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAnRmFpbGVkIHRvIG1vdW50IGNvbnRlbnQgc2NyaXB0IHVpOiBjb3VsZCBub3QgZmluZCBhbmNob3IgZWxlbWVudCcsXG4gICAgICApO1xuXG4gICAgLy8gTW91bnQgVUkgaW5zaWRlIHNoYWRvdyByb290XG4gICAgbW91bnRlZCA9IG9wdGlvbnMubW91bnQodWlDb250YWluZXIpO1xuXG4gICAgLy8gQWRkIHNoYWRvdyByb290IGVsZW1lbnQgdG8gRE9NXG4gICAgc3dpdGNoIChvcHRpb25zLmFwcGVuZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICBjYXNlICdsYXN0JzpcbiAgICAgICAgYW5jaG9yLmFwcGVuZChzaGFkb3dIb3N0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdmaXJzdCc6XG4gICAgICAgIGlmIChhbmNob3IuZmlyc3RDaGlsZCkge1xuICAgICAgICAgIGFuY2hvci5pbnNlcnRCZWZvcmUoc2hhZG93SG9zdCwgYW5jaG9yLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFuY2hvci5hcHBlbmQoc2hhZG93SG9zdCk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZXBsYWNlJzpcbiAgICAgICAgYW5jaG9yLnJlcGxhY2VXaXRoKHNoYWRvd0hvc3QpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2FmdGVyJzpcbiAgICAgICAgYW5jaG9yLnJlcGxhY2VXaXRoKGFuY2hvciwgc2hhZG93SG9zdCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYmVmb3JlJzpcbiAgICAgICAgYW5jaG9yLnJlcGxhY2VXaXRoKHNoYWRvd0hvc3QsIGFuY2hvcik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgb3B0aW9ucy5hcHBlbmQoYW5jaG9yLCBzaGFkb3dIb3N0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gQXBwbHkgdHlwZXNcbiAgICBpZiAob3B0aW9ucy50eXBlICE9PSAnaW5saW5lJykge1xuICAgICAgaWYgKG9wdGlvbnMuekluZGV4ICE9IG51bGwpXG4gICAgICAgIHNoYWRvd0hvc3Quc3R5bGUuekluZGV4ID0gU3RyaW5nKG9wdGlvbnMuekluZGV4KTtcblxuICAgICAgc2hhZG93SG9zdC5zdHlsZS5vdmVyZmxvdyA9ICd2aXNpYmxlJztcbiAgICAgIHNoYWRvd0hvc3Quc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgc2hhZG93SG9zdC5zdHlsZS53aWR0aCA9ICcwJztcbiAgICAgIHNoYWRvd0hvc3Quc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgc2hhZG93SG9zdC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgY29uc3QgaHRtbCA9IHNoYWRvdy5xdWVyeVNlbGVjdG9yKCdodG1sJykhO1xuICAgICAgLy8gSFRNTCBkb2Vzbid0IGV4aXN0IGluIHRlc3RzXG4gICAgICBpZiAob3B0aW9ucy50eXBlID09PSAnb3ZlcmxheScpIHtcbiAgICAgICAgaHRtbC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIGlmIChvcHRpb25zLmFsaWdubWVudD8uc3RhcnRzV2l0aCgnYm90dG9tLScpKSBodG1sLnN0eWxlLmJvdHRvbSA9ICcwJztcbiAgICAgICAgZWxzZSBodG1sLnN0eWxlLnRvcCA9ICcwJztcblxuICAgICAgICBpZiAob3B0aW9ucy5hbGlnbm1lbnQ/LmVuZHNXaXRoKCctcmlnaHQnKSkgaHRtbC5zdHlsZS5yaWdodCA9ICcwJztcbiAgICAgICAgZWxzZSBodG1sLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgICAgaHRtbC5zdHlsZS50b3AgPSAnMCc7XG4gICAgICAgIGh0bWwuc3R5bGUuYm90dG9tID0gJzAnO1xuICAgICAgICBodG1sLnN0eWxlLmxlZnQgPSAnMCc7XG4gICAgICAgIGh0bWwuc3R5bGUucmlnaHQgPSAnMCc7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlbW92ZSA9ICgpID0+IHtcbiAgICAvLyBEZXRhdGNoIHNoYWRvdyByb290IGZyb20gRE9NXG4gICAgc2hhZG93SG9zdC5yZW1vdmUoKTtcbiAgICAvLyBDbGVhbnVwIG1vdW50ZWQgc3RhdGVcbiAgICBvcHRpb25zLm9uUmVtb3ZlPy4obW91bnRlZCk7XG4gICAgLy8gUmVtb3ZlIGNoaWxkcmVuIGZyb20gdWlDb250YWluZXJcbiAgICB3aGlsZSAodWlDb250YWluZXIubGFzdENoaWxkKVxuICAgICAgdWlDb250YWluZXIucmVtb3ZlQ2hpbGQodWlDb250YWluZXIubGFzdENoaWxkKTtcbiAgfTtcblxuICBjdHgub25JbnZhbGlkYXRlZChyZW1vdmUpO1xuXG4gIHJldHVybiB7XG4gICAgc2hhZG93LFxuICAgIHNoYWRvd0hvc3QsXG4gICAgdWlDb250YWluZXIsXG4gICAgbW91bnQsXG4gICAgcmVtb3ZlLFxuICAgIG1vdW50ZWQ6IG1vdW50ZWQhLFxuICB9O1xufVxuXG4vKipcbiAqIExvYWQgdGhlIENTUyBmb3IgdGhlIGN1cnJlbnQgZW50cnlwb2ludC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZENzcygpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBicm93c2VyLnJ1bnRpbWUuZ2V0VVJMKGAvY29udGVudC1zY3JpcHRzLyR7X19FTlRSWVBPSU5UX199LmNzc2ApO1xuICB0cnkge1xuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgY29uc3QgY3NzID0gYXdhaXQgcmVzLnRleHQoKTtcblxuICAgIC8vIFJlcGxhY2UgOnJvb3Qgc2VsZWN0b3JzIHdpdGggOmhvc3Qgc2luY2Ugd2UncmUgaW4gYSBzaGFkb3cgcm9vdFxuICAgIHJldHVybiBjc3MucmVwbGFjZUFsbCgnOnJvb3QnLCAnOmhvc3QnKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXG4gICAgICBgRmFpbGVkIHRvIGxvYWQgc3R5bGVzIEAgJHt1cmx9LiBEaWQgeW91IGZvcmdldCB0byBpbXBvcnQgdGhlIHN0eWxlc2hlZXQgaW4geW91ciBlbnRyeXBvaW50P2AsXG4gICAgICBlcnIsXG4gICAgKTtcbiAgICByZXR1cm4gJyc7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb250ZW50U2NyaXB0VWk8VD4ge1xuICAvKipcbiAgICogVGhlIGBIVE1MRWxlbWVudGAgaG9zdGluZyB0aGUgc2hhZG93IHJvb3QgdXNlZCB0byBpc29sYXRlIHRoZSBVSSdzIHN0eWxlcy4gVGhpcyBpcyB0aGUgZWxlbWVudFxuICAgKiB0aGF0IGdldCdzIGFkZGVkIHRvIHRoZSBET00uIFRoaXMgZWxlbWVudCdzIHN0eWxlIGlzIG5vdCBpc29sYXRlZCBmcm9tIHRoZSB3ZWJwYWdlLlxuICAgKi9cbiAgc2hhZG93SG9zdDogSFRNTEVsZW1lbnQ7XG4gIC8qKlxuICAgKiBUaGUgY29udGFpbmVyIGVsZW1lbnQgaW5zaWRlIHRoZSBgU2hhZG93Um9vdGAgd2hvc2Ugc3R5bGVzIGFyZSBpc29sYXRlZC4gVGhlIFVJIGlzIG1vdW50ZWRcbiAgICogaW5zaWRlIHRoaXMgYEhUTUxFbGVtZW50YC5cbiAgICovXG4gIHVpQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgLyoqXG4gICAqIFRoZSBzaGFkb3cgcm9vdCBwZXJmb3JtaW5nIHRoZSBpc29sYXRpb24uXG4gICAqL1xuICBzaGFkb3c6IFNoYWRvd1Jvb3Q7XG4gIC8qKlxuICAgKiBDdXN0b20gZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBgb3B0aW9ucy5tb3VudGAgZnVuY3Rpb24uXG4gICAqL1xuICBtb3VudGVkOiBUO1xuICAvKipcbiAgICogRnVuY3Rpb24gdGhhdCBtb3VudHMgb3IgcmVtb3VudHMgdGhlIFVJIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgbW91bnQ6ICgpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBGdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIFVJIGZyb20gdGhlIHdlYnBhZ2UuXG4gICAqL1xuICByZW1vdmU6ICgpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBCYXNlQ29udGVudFNjcmlwdFVpT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgY3VzdG9tIGNvbXBvbmVudCB1c2VkIHRvIGhvc3QgdGhlIFNoYWRvd1Jvb3QuIE11c3QgYmUga2ViYWItY2FzZS5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEluIGNvbWJpbmF0aW9uIHdpdGggYGFuY2hvcmAsIGRlY2lkZSBob3cgdG8gYWRkIHRoZSBVSSB0byB0aGUgRE9NLlxuICAgKlxuICAgKiAtIGBcImxhc3RcImAgKGRlZmF1bHQpIC0gQWRkIHRoZSBVSSBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgYGFuY2hvcmAgZWxlbWVudFxuICAgKiAtIGBcImZpcnN0XCJgIC0gQWRkIHRoZSBVSSBhcyB0aGUgbGFzdCBjaGlsZCBvZiB0aGUgYGFuY2hvcmAgZWxlbWVudFxuICAgKiAtIGBcInJlcGxhY2VcImAgLSBSZXBsYWNlIHRoZSBgYW5jaG9yYCBlbGVtZW50IHdpdGggdGhlIFVJLlxuICAgKiAtIGBcImJlZm9yZVwiYCAtIEFkZCB0aGUgVUkgYXMgdGhlIHNpYmxpbmcgYmVmb3JlIHRoZSBgYW5jaG9yYCBlbGVtZW50XG4gICAqIC0gYFwiYWZ0ZXJcImAgLSBBZGQgdGhlIFVJIGFzIHRoZSBzaWJsaW5nIGFmdGVyIHRoZSBgYW5jaG9yYCBlbGVtZW50XG4gICAqIC0gYChhbmNob3IsIHVpKSA9PiB2b2lkYCAtIEN1c3RvbWl6YWJsZSBmdW5jdGlvbiB0aGF0IGxldCdzIHlvdSBhZGQgdGhlIFVJIHRvIHRoZSBET01cbiAgICovXG4gIGFwcGVuZD86IENvbnRlbnRTY3JpcHRBcHBlbmRNb2RlIHwgKChhbmNob3I6IEVsZW1lbnQsIHVpOiBFbGVtZW50KSA9PiB2b2lkKTtcbiAgLyoqXG4gICAqIEEgQ1NTIHNlbGVjdG9yLCBlbGVtZW50LCBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgb25lIG9mIHRoZSB0d28uIEFsb25nIHdpdGggYGFwcGVuZGAsIHRoZVxuICAgKiBgYW5jaG9yYCBkaWN0YXRlcyB3aGVyZSBpbiB0aGUgcGFnZSB0aGUgVUkgd2lsbCBiZSBhZGRlZC5cbiAgICovXG4gIGFuY2hvcj86XG4gICAgfCBzdHJpbmdcbiAgICB8IEVsZW1lbnRcbiAgICB8IG51bGxcbiAgICB8IHVuZGVmaW5lZFxuICAgIHwgKCgpID0+IHN0cmluZyB8IEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkKTtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGV4ZWN1dGVkIHdoZW4gbW91bnRpbmcgdGhlIFVJLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBjcmVhdGUgYW5kIGFwcGVuZCB0aGUgVUkgdG8gdGhlXG4gICAqIGBjb250YWluZXJgIGVsZW1lbnQuIEl0IGlzIGNhbGxlZCBldmVyeSB0aW1lIGB1aS5tb3VudCgpYCBpcyBjYWxsZWRcbiAgICpcbiAgICogT3B0aW9uYWxseSByZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCBhdCBgdWkubW91bnRlZGAgb3IgaW4gdGhlIGBvblJlbW92ZWAgY2FsbGJhY2suXG4gICAqL1xuICBtb3VudDogKGNvbnRhaW5lcjogRWxlbWVudCkgPT4gVDtcbiAgLyoqXG4gICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIHRoZSBVSSBpcyByZW1vdmVkIGZyb20gdGhlIHdlYnBhZ2UuIFVzZSB0byBjbGVhbnVwIHlvdXIgVUksIGxpa2VcbiAgICogdW5tb3VudGluZyB5b3VyIHZ1ZSBvciByZWFjdCBhcHBzLlxuICAgKi9cbiAgb25SZW1vdmU/OiAobW91bnRlZDogVCkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBDU1MgdGV4dCB0byBhcHBseSB0byB0aGUgVUkuIElmIHlvdXIgY29udGVudCBzY3JpcHQgaW1wb3J0cy9nZW5lcmF0ZXMgQ1NTIGFuZCB5b3UndmVcbiAgICogc2V0IGBjc3NJbmplY3Rpb25Nb2RlOiBcInVpXCJgLCB0aGUgaW1wb3J0ZWQgQ1NTIHdpbGwgYmUgaW5jbHVkZWQgYXV0b21hdGljYWxseS4gWW91IGRvIG5vdCBuZWVkXG4gICAqIHRvIHBhc3MgdGhvc2Ugc3R5bGVzIGluIGhlcmUuIFRoaXMgaXMgZm9yIGFueSBhZGRpdGlvbmFsIHN0eWxlcyBub3QgaW4gdGhlIGltcG9ydGVkIENTUy5cbiAgICpcbiAgICogU2VlIDxodHRwczovL3d4dC5kZXYvZ3VpZGUvY29udGVudC1zY3JpcHRzLmh0bWwjdWk+IGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBjc3M/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE92ZXJsYXlDb250ZW50U2NyaXB0VWlPcHRpb25zPFQ+ID0gQmFzZUNvbnRlbnRTY3JpcHRVaU9wdGlvbnM8VD4gJiB7XG4gIHR5cGU6ICdvdmVybGF5JztcbiAgLyoqXG4gICAqIFdoZW4gdXNpbmcgYHR5cGU6IFwib3ZlcmxheVwiYCwgdGhlIG1vdW50ZWQgZWxlbWVudCBpcyAwcHggYnkgMHB4IGluIHNpemUuIEFsaWdubWVudCBzcGVjaWZpZXNcbiAgICogd2hpY2ggY29ybmVyIGlzIGFsaWduZWQgd2l0aCB0aGF0IDB4MCBwaXhlbCBzcGFjZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJ0b3AtbGVmdFwiXG4gICAqL1xuICBhbGlnbm1lbnQ/OiBDb250ZW50U2NyaXB0VWlPdmVybGF5QWxpZ25tZW50O1xuICAvKipcbiAgICogVGhlIGB6LWluZGV4YCB1c2VkIG9uIHRoZSBgc2hhZG93SG9zdGAuIFNldCB0byBhIHBvc2l0aXZlIG51bWJlciB0byBzaG93IHlvdXIgVUkgb3ZlciB3ZWJzaXRlXG4gICAqIGNvbnRlbnQuXG4gICAqL1xuICB6SW5kZXg/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBNb2RhbENvbnRlbnRTY3JpcHRVaU9wdGlvbnM8VD4gPSBCYXNlQ29udGVudFNjcmlwdFVpT3B0aW9uczxUPiAmIHtcbiAgdHlwZTogJ21vZGFsJztcbiAgLyoqXG4gICAqIFRoZSBgei1pbmRleGAgdXNlZCBvbiB0aGUgYHNoYWRvd0hvc3RgLiBTZXQgdG8gYSBwb3NpdGl2ZSBudW1iZXIgdG8gc2hvdyB5b3VyIFVJIG92ZXIgd2Vic2l0ZVxuICAgKiBjb250ZW50LlxuICAgKi9cbiAgekluZGV4PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgSW5saW5lQ29udGVudFNjcmlwdFVpT3B0aW9uczxUPiA9IEJhc2VDb250ZW50U2NyaXB0VWlPcHRpb25zPFQ+ICYge1xuICB0eXBlOiAnaW5saW5lJztcbn07XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRTY3JpcHRVaU92ZXJsYXlBbGlnbm1lbnQgPVxuICB8ICd0b3AtbGVmdCdcbiAgfCAndG9wLXJpZ2h0J1xuICB8ICdib3R0b20tbGVmdCdcbiAgfCAnYm90dG9tLXJpZ2h0JztcblxuZXhwb3J0IHR5cGUgQ29udGVudFNjcmlwdEFwcGVuZE1vZGUgPVxuICB8ICdsYXN0J1xuICB8ICdmaXJzdCdcbiAgfCAncmVwbGFjZSdcbiAgfCAnYmVmb3JlJ1xuICB8ICdhZnRlcic7XG5cbmV4cG9ydCB0eXBlIENvbnRlbnRTY3JpcHRVaU9wdGlvbnM8VD4gPVxuICB8IE92ZXJsYXlDb250ZW50U2NyaXB0VWlPcHRpb25zPFQ+XG4gIHwgTW9kYWxDb250ZW50U2NyaXB0VWlPcHRpb25zPFQ+XG4gIHwgSW5saW5lQ29udGVudFNjcmlwdFVpT3B0aW9uczxUPjtcbiIsICJpbXBvcnQgb3JpZ2luYWxCcm93c2VyLCB7IEJyb3dzZXIsIFJ1bnRpbWUsIEkxOG4gfSBmcm9tICd3ZWJleHRlbnNpb24tcG9seWZpbGwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1Z21lbnRlZEJyb3dzZXIgZXh0ZW5kcyBCcm93c2VyIHtcbiAgcnVudGltZTogV3h0UnVudGltZTtcbiAgaTE4bjogV3h0STE4bjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXeHRSdW50aW1lIGV4dGVuZHMgUnVudGltZS5TdGF0aWMge1xuICAvLyBPdmVycmlkZW4gcGVyLXByb2plY3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXeHRJMThuIGV4dGVuZHMgSTE4bi5TdGF0aWMge1xuICAvLyBPdmVycmlkZW4gcGVyLXByb2plY3Rcbn1cblxuZXhwb3J0IGNvbnN0IGJyb3dzZXI6IEF1Z21lbnRlZEJyb3dzZXIgPSBvcmlnaW5hbEJyb3dzZXI7XG4iLCAiZnVuY3Rpb24gcHJpbnQobWV0aG9kOiAoLi4uYXJnczogYW55W10pID0+IHZvaWQsIC4uLmFyZ3M6IGFueVtdKSB7XG4gIGlmIChpbXBvcnQubWV0YS5lbnYuTU9ERSA9PT0gJ3Byb2R1Y3Rpb24nKSByZXR1cm47XG5cbiAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBhcmdzLnNoaWZ0KCk7XG4gICAgbWV0aG9kKGBbd3h0XSAke21lc3NhZ2V9YCwgLi4uYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgbWV0aG9kKCdbd3h0XScsIC4uLmFyZ3MpO1xuICB9XG59XG5cbi8qKlxuICogV3JhcHBlciBhcm91bmQgYGNvbnNvbGVgIHdpdGggYSBcIlt3eHRdXCIgcHJlZml4XG4gKi9cbmV4cG9ydCBjb25zdCBsb2dnZXIgPSB7XG4gIGRlYnVnOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUuZGVidWcsIC4uLmFyZ3MpLFxuICBsb2c6ICguLi5hcmdzOiBhbnlbXSkgPT4gcHJpbnQoY29uc29sZS5sb2csIC4uLmFyZ3MpLFxuICB3YXJuOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUud2FybiwgLi4uYXJncyksXG4gIGVycm9yOiAoLi4uYXJnczogYW55W10pID0+IHByaW50KGNvbnNvbGUuZXJyb3IsIC4uLmFyZ3MpLFxufTtcbiIsICJpbXBvcnQgeyBDb250ZW50U2NyaXB0RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgYnJvd3NlciB9IGZyb20gJy4uL2Jyb3dzZXInO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG4vKipcbiAqIEV4dGVuZHMgW2BBYm9ydENvbnRyb2xsZXJgXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQWJvcnRDb250cm9sbGVyKS5cbiAqIFVzZWQgdG8gZGV0ZWN0IGFuZCBzdG9wIGNvbnRlbnQgc2NyaXB0IGNvZGUgd2hlbiB0aGUgc2NyaXB0IGlzIGludmFsaWRhdGVkLlxuICpcbiAqIEl0IGFsc28gcHJvdmlkZXMgc2V2ZXJhbCB1dGlsaXRpZXMgbGlrZSBgY3R4LnNldFRpbWVvdXRgIGFuZCBgY3R4LnNldEludGVydmFsYCB0aGF0IHNob3VsZCBiZSB1c2VkIGluXG4gKiBjb250ZW50IHNjcmlwdHMgaW5zdGVhZCBvZiBgd2luZG93LnNldFRpbWVvdXRgIG9yIGB3aW5kb3cuc2V0SW50ZXJ2YWxgLlxuICovXG5leHBvcnQgY2xhc3MgQ29udGVudFNjcmlwdENvbnRleHQgZXh0ZW5kcyBBYm9ydENvbnRyb2xsZXIge1xuICBzdGF0aWMgU0NSSVBUX1NUQVJURURfTUVTU0FHRV9UWVBFID0gJ3d4dDpjb250ZW50LXNjcmlwdC1zdGFydGVkJztcblxuICAjaXNUb3BGcmFtZSA9IHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udGVudFNjcmlwdE5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3B0aW9ucz86IE9taXQ8Q29udGVudFNjcmlwdERlZmluaXRpb24sICdtYWluJz4sXG4gICkge1xuICAgIHN1cGVyKCk7XG5cbiAgICBpZiAodGhpcy4jaXNUb3BGcmFtZSkge1xuICAgICAgdGhpcy4jc3RvcE9sZFNjcmlwdHMoKTtcbiAgICB9XG4gICAgdGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIC8vIFJ1biBvbiBuZXh0IHRpY2sgc28gdGhlIGxpc3RlbmVyIGl0IGFkZHMgaXNuJ3QgdHJpZ2dlcmVkIGJ5IHN0b3BPbGRTY3JpcHRcbiAgICAgIHRoaXMuI2xpc3RlbkZvck5ld2VyU2NyaXB0cygpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGlzSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICBpZiAoYnJvd3Nlci5ydW50aW1lLmlkID09IG51bGwpIHtcbiAgICAgIHRoaXMubm90aWZ5SW52YWxpZGF0ZWQoKTsgLy8gU2V0cyBgc2lnbmFsLmFib3J0ZWRgIHRvIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2lnbmFsLmFib3J0ZWQ7XG4gIH1cblxuICBnZXQgaXNWYWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNJbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbnRlbnQgc2NyaXB0J3MgY29udGV4dCBpcyBpbnZhbGlkYXRlZC5cbiAgICpcbiAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0byByZW1vdmUgdGhlIGxpc3RlbmVyLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBicm93c2VyLnJ1bnRpbWUub25NZXNzYWdlLmFkZExpc3RlbmVyKGNiKTtcbiAgICogY29uc3QgcmVtb3ZlSW52YWxpZGF0ZWRMaXN0ZW5lciA9IGN0eC5vbkludmFsaWRhdGVkKCgpID0+IHtcbiAgICogICBicm93c2VyLnJ1bnRpbWUub25NZXNzYWdlLnJlbW92ZUxpc3RlbmVyKGNiKTtcbiAgICogfSlcbiAgICogLy8gLi4uXG4gICAqIHJlbW92ZUludmFsaWRhdGVkTGlzdGVuZXIoKTtcbiAgICovXG4gIG9uSW52YWxpZGF0ZWQoY2I6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCdhYm9ydCcsIGNiKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYWJvcnQnLCBjYik7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGEgcHJvbWlzZSB0aGF0IG5ldmVyIHJlc29sdmVzLiBVc2VmdWwgaWYgeW91IGhhdmUgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCBzaG91bGRuJ3QgcnVuXG4gICAqIGFmdGVyIHRoZSBjb250ZXh0IGlzIGV4cGlyZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGdldFZhbHVlRnJvbVN0b3JhZ2UgPSBhc3luYyAoKSA9PiB7XG4gICAqICAgaWYgKGN0eC5pc0ludmFsaWQpIHJldHVybiBjdHguYmxvY2soKTtcbiAgICpcbiAgICogICAvLyAuLi5cbiAgICogfVxuICAgKi9cbiAgYmxvY2s8VD4oKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKCgpID0+IHtcbiAgICAgIC8vIG5vb3BcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXcmFwcGVyIGFyb3VuZCBgd2luZG93LnNldEludGVydmFsYCB0aGF0IGF1dG9tYXRpY2FsbHkgY2xlYXJzIHRoZSBpbnRlcnZhbCB3aGVuIGludmFsaWRhdGVkLlxuICAgKi9cbiAgc2V0SW50ZXJ2YWwoaGFuZGxlcjogKCkgPT4gdm9pZCwgdGltZW91dD86IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1ZhbGlkKSBoYW5kbGVyKCk7XG4gICAgfSwgdGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgdGhpcy5vbkludmFsaWRhdGVkKCgpID0+IGNsZWFySW50ZXJ2YWwoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5zZXRUaW1lb3V0YCB0aGF0IGF1dG9tYXRpY2FsbHkgY2xlYXJzIHRoZSBpbnRlcnZhbCB3aGVuIGludmFsaWRhdGVkLlxuICAgKi9cbiAgc2V0VGltZW91dChoYW5kbGVyOiAoKSA9PiB2b2lkLCB0aW1lb3V0PzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkgaGFuZGxlcigpO1xuICAgIH0sIHRpbWVvdXQpIGFzIHVua25vd24gYXMgbnVtYmVyO1xuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiBjbGVhclRpbWVvdXQoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRoYXQgYXV0b21hdGljYWxseSBjYW5jZWxzIHRoZSByZXF1ZXN0IHdoZW5cbiAgICogaW52YWxpZGF0ZWQuXG4gICAqL1xuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2s6IEZyYW1lUmVxdWVzdENhbGxiYWNrKTogbnVtYmVyIHtcbiAgICBjb25zdCBpZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNWYWxpZCkgY2FsbGJhY2soLi4uYXJncyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLm9uSW52YWxpZGF0ZWQoKCkgPT4gY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogV3JhcHBlciBhcm91bmQgYHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrYCB0aGF0IGF1dG9tYXRpY2FsbHkgY2FuY2VscyB0aGUgcmVxdWVzdCB3aGVuXG4gICAqIGludmFsaWRhdGVkLlxuICAgKi9cbiAgcmVxdWVzdElkbGVDYWxsYmFjayhcbiAgICBjYWxsYmFjazogSWRsZVJlcXVlc3RDYWxsYmFjayxcbiAgICBvcHRpb25zPzogSWRsZVJlcXVlc3RPcHRpb25zLFxuICApOiBudW1iZXIge1xuICAgIGNvbnN0IGlkID0gcmVxdWVzdElkbGVDYWxsYmFjaygoLi4uYXJncykgPT4ge1xuICAgICAgaWYgKCF0aGlzLnNpZ25hbC5hYm9ydGVkKSBjYWxsYmFjayguLi5hcmdzKTtcbiAgICB9LCBvcHRpb25zKTtcblxuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiBjYW5jZWxJZGxlQ2FsbGJhY2soaWQpKTtcbiAgICByZXR1cm4gaWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCBgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXJgIGFuZCByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gdGhlIGNvbnRleHQgaXMgaW52YWxpZGF0ZWQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGN0eC5hZGRFdmVudExpc3RlbmVyKHdpbmRvdywgXCJtb3VzZW1vdmVcIiwgKCkgPT4ge1xuICAgKiAgIC8vIC4uLlxuICAgKiB9KTtcbiAgICogY3R4LmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsIFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG4gICAqICAgLy8gLi4uXG4gICAqIH0pO1xuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcihcbiAgICB0YXJnZXQ6IGFueSxcbiAgICB0eXBlOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogKGV2ZW50OiBFdmVudCkgPT4gdm9pZCxcbiAgICBvcHRpb25zPzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMsXG4gICkge1xuICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyPy4odHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgdGhpcy5vbkludmFsaWRhdGVkKFxuICAgICAgKCkgPT4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXI/Lih0eXBlLCBoYW5kbGVyLCBvcHRpb25zKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0IHRoZSBhYm9ydCBjb250cm9sbGVyIGFuZCBleGVjdXRlIGFsbCBgb25JbnZhbGlkYXRlZGAgbGlzdGVuZXJzLlxuICAgKi9cbiAgbm90aWZ5SW52YWxpZGF0ZWQoKSB7XG4gICAgdGhpcy5hYm9ydCgnQ29udGVudCBzY3JpcHQgY29udGV4dCBpbnZhbGlkYXRlZCcpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcbiAgICAgIGBDb250ZW50IHNjcmlwdCBcIiR7dGhpcy5jb250ZW50U2NyaXB0TmFtZX1cIiBjb250ZXh0IGludmFsaWRhdGVkYCxcbiAgICApO1xuICB9XG5cbiAgI3N0b3BPbGRTY3JpcHRzKCkge1xuICAgIC8vIFVzZSBwb3N0TWVzc2FnZSBzbyBpdCBnZXQncyBzZW50IHRvIGFsbCB0aGUgZnJhbWVzIG9mIHRoZSBwYWdlLlxuICAgIHdpbmRvdy5wb3N0TWVzc2FnZShcbiAgICAgIHtcbiAgICAgICAgZXZlbnQ6IENvbnRlbnRTY3JpcHRDb250ZXh0LlNDUklQVF9TVEFSVEVEX01FU1NBR0VfVFlQRSxcbiAgICAgICAgY29udGVudFNjcmlwdE5hbWU6IHRoaXMuY29udGVudFNjcmlwdE5hbWUsXG4gICAgICB9LFxuICAgICAgJyonLFxuICAgICk7XG4gIH1cblxuICAjbGlzdGVuRm9yTmV3ZXJTY3JpcHRzKCkge1xuICAgIGNvbnN0IGNiID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQuZGF0YT8udHlwZSA9PT0gQ29udGVudFNjcmlwdENvbnRleHQuU0NSSVBUX1NUQVJURURfTUVTU0FHRV9UWVBFICYmXG4gICAgICAgIGV2ZW50LmRhdGE/LmNvbnRlbnRTY3JpcHROYW1lID09PSB0aGlzLmNvbnRlbnRTY3JpcHROYW1lXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5ub3RpZnlJbnZhbGlkYXRlZCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBhZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgY2IpO1xuICAgIHRoaXMub25JbnZhbGlkYXRlZCgoKSA9PiByZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgY2IpKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUVPLFNBQVMsb0JBQ2QsWUFDeUI7QUFDekIsU0FBTztBQUNUOzs7QUNBTyxTQUFTLGlCQUNkLEtBQzZCO0FBQzdCLE1BQUksT0FBTyxRQUFRO0FBQVksV0FBTyxFQUFFLE1BQU0sSUFBSTtBQUNsRCxTQUFPO0FBQ1Q7OztBQ1hBLFNBQVMsNkJBQTZCOzs7QUNBdEMsT0FBTyxxQkFBaUQ7QUFlakQsSUFBTSxVQUE0Qjs7O0FDZnpDLFNBQVMsTUFBTSxXQUFxQyxNQUFhO0FBQy9ELE1BQUksWUFBWSxJQUFJLFNBQVM7QUFBYztBQUUzQyxNQUFJLE9BQU8sS0FBSyxDQUFDLE1BQU0sVUFBVTtBQUMvQixVQUFNLFVBQVUsS0FBSyxNQUFNO0FBQzNCLFdBQU8sU0FBUyxPQUFPLElBQUksR0FBRyxJQUFJO0FBQUEsRUFDcEMsT0FBTztBQUNMLFdBQU8sU0FBUyxHQUFHLElBQUk7QUFBQSxFQUN6QjtBQUNGO0FBS08sSUFBTSxTQUFTO0FBQUEsRUFDcEIsT0FBTyxJQUFJLFNBQWdCLE1BQU0sUUFBUSxPQUFPLEdBQUcsSUFBSTtBQUFBLEVBQ3ZELEtBQUssSUFBSSxTQUFnQixNQUFNLFFBQVEsS0FBSyxHQUFHLElBQUk7QUFBQSxFQUNuRCxNQUFNLElBQUksU0FBZ0IsTUFBTSxRQUFRLE1BQU0sR0FBRyxJQUFJO0FBQUEsRUFDckQsT0FBTyxJQUFJLFNBQWdCLE1BQU0sUUFBUSxPQUFPLEdBQUcsSUFBSTtBQUN6RDs7O0FGY0EsZUFBc0Isc0JBQ3BCLEtBQ0EsU0FDNkI7QUFDN0IsUUFBTSxNQUFNLENBQUMsUUFBUSxPQUFPLEVBQUU7QUFDOUIsTUFB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
package/dist/index.cjs CHANGED
@@ -2471,6 +2471,7 @@ async function getPackageJson(config) {
2471
2471
 
2472
2472
  // src/core/utils/manifest.ts
2473
2473
  var import_immer = require("immer");
2474
+ var vite4 = __toESM(require("vite"), 1);
2474
2475
  async function writeManifest(manifest, output, config) {
2475
2476
  const str = config.mode === "production" ? JSON.stringify(manifest) : JSON.stringify(manifest, null, 2);
2476
2477
  await import_fs_extra12.default.ensureDir(config.outDir);
@@ -2485,18 +2486,20 @@ async function writeManifest(manifest, output, config) {
2485
2486
  }
2486
2487
  async function generateMainfest(entrypoints, buildOutput, config) {
2487
2488
  const pkg = await getPackageJson(config);
2488
- const manifest = Object.assign(
2489
- {
2490
- manifest_version: config.manifestVersion,
2491
- name: pkg?.name,
2492
- description: pkg?.description,
2493
- version: pkg?.version && simplifyVersion(pkg.version),
2494
- // Only add the version name to chromium and if the user hasn't specified a custom version.
2495
- version_name: config.browser !== "firefox" && !config.manifest.version ? pkg?.version : void 0,
2496
- short_name: pkg?.shortName,
2497
- icons: discoverIcons(buildOutput)
2498
- },
2499
- config.manifest
2489
+ const baseManifest = {
2490
+ manifest_version: config.manifestVersion,
2491
+ name: pkg?.name,
2492
+ description: pkg?.description,
2493
+ version: pkg?.version && simplifyVersion(pkg.version),
2494
+ // Only add the version name to chromium and if the user hasn't specified a custom version.
2495
+ version_name: config.browser !== "firefox" && !config.manifest.version ? pkg?.version : void 0,
2496
+ short_name: pkg?.shortName,
2497
+ icons: discoverIcons(buildOutput)
2498
+ };
2499
+ const userManifest = config.manifest;
2500
+ const manifest = vite4.mergeConfig(
2501
+ baseManifest,
2502
+ userManifest
2500
2503
  );
2501
2504
  addEntrypoints(manifest, entrypoints, buildOutput, config);
2502
2505
  if (config.command === "serve")
@@ -2666,6 +2669,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
2666
2669
  }
2667
2670
  }
2668
2671
  if (contentScripts?.length) {
2672
+ const cssMap = getContentScriptsCssMap(buildOutput, contentScripts);
2669
2673
  if (config.command === "serve" && config.manifestVersion === 3) {
2670
2674
  const hostPermissions = new Set(manifest.host_permissions ?? []);
2671
2675
  contentScripts.forEach((script) => {
@@ -2690,7 +2694,7 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
2690
2694
  ...mapWxtOptionsToContentScript(scripts[0].options),
2691
2695
  // TOOD: Sorting css and js arrays here so we get consistent test results... but we
2692
2696
  // shouldn't have to. Where is the inconsistency coming from?
2693
- css: getContentScriptCssFiles(scripts, buildOutput)?.sort(),
2697
+ css: getContentScriptCssFiles(scripts, cssMap)?.sort(),
2694
2698
  js: scripts.map(
2695
2699
  (entry) => getEntrypointBundlePath(entry, config.outDir, ".js")
2696
2700
  ).sort()
@@ -2701,6 +2705,15 @@ function addEntrypoints(manifest, entrypoints, buildOutput, config) {
2701
2705
  manifest.content_scripts.push(...newContentScripts);
2702
2706
  }
2703
2707
  }
2708
+ const contentScriptCssResources = getContentScriptCssWebAccessibleResources(
2709
+ config,
2710
+ contentScripts,
2711
+ cssMap
2712
+ );
2713
+ if (contentScriptCssResources.length > 0) {
2714
+ manifest.web_accessible_resources ??= [];
2715
+ manifest.web_accessible_resources.push(...contentScriptCssResources);
2716
+ }
2704
2717
  }
2705
2718
  }
2706
2719
  function discoverIcons(buildOutput) {
@@ -2765,22 +2778,52 @@ function addDevModePermissions(manifest, config) {
2765
2778
  if (config.manifestVersion === 3)
2766
2779
  addPermission(manifest, "scripting");
2767
2780
  }
2768
- function getContentScriptCssFiles(contentScripts, buildOutput) {
2781
+ function getContentScriptCssFiles(contentScripts, contentScriptCssMap) {
2769
2782
  const css = [];
2770
- const allChunks = buildOutput.steps.flatMap((step) => step.chunks);
2771
2783
  contentScripts.forEach((script) => {
2772
- if (script.options.cssInjectionMode === "manual")
2784
+ if (script.options.cssInjectionMode === "manual" || script.options.cssInjectionMode === "ui")
2773
2785
  return;
2774
- const relatedCss = allChunks.find(
2775
- (chunk) => chunk.fileName === `content-scripts/${script.name}.css`
2776
- );
2777
- if (relatedCss)
2778
- css.push(relatedCss.fileName);
2786
+ const cssFile = contentScriptCssMap[script.name];
2787
+ if (cssFile == null)
2788
+ return;
2789
+ if (cssFile)
2790
+ css.push(cssFile);
2779
2791
  });
2780
2792
  if (css.length > 0)
2781
2793
  return css;
2782
2794
  return void 0;
2783
2795
  }
2796
+ function getContentScriptCssWebAccessibleResources(config, contentScripts, contentScriptCssMap) {
2797
+ const resources = [];
2798
+ contentScripts.forEach((script) => {
2799
+ if (script.options.cssInjectionMode !== "ui")
2800
+ return;
2801
+ const cssFile = contentScriptCssMap[script.name];
2802
+ if (cssFile == null)
2803
+ return;
2804
+ if (config.manifestVersion === 2) {
2805
+ resources.push(cssFile);
2806
+ } else {
2807
+ resources.push({
2808
+ resources: [cssFile],
2809
+ matches: script.options.matches
2810
+ });
2811
+ }
2812
+ });
2813
+ return resources;
2814
+ }
2815
+ function getContentScriptsCssMap(buildOutput, scripts) {
2816
+ const map = {};
2817
+ const allChunks = buildOutput.steps.flatMap((step) => step.chunks);
2818
+ scripts.forEach((script) => {
2819
+ const relatedCss = allChunks.find(
2820
+ (chunk) => chunk.fileName === `content-scripts/${script.name}.css`
2821
+ );
2822
+ if (relatedCss != null)
2823
+ map[script.name] = relatedCss.fileName;
2824
+ });
2825
+ return map;
2826
+ }
2784
2827
  function addPermission(manifest, permission) {
2785
2828
  manifest.permissions ??= [];
2786
2829
  if (manifest.permissions.includes(permission))
@@ -2796,7 +2839,7 @@ function addHostPermission(manifest, hostPermission) {
2796
2839
 
2797
2840
  // src/core/build.ts
2798
2841
  var import_picocolors3 = __toESM(require("picocolors"), 1);
2799
- var vite4 = __toESM(require("vite"), 1);
2842
+ var vite5 = __toESM(require("vite"), 1);
2800
2843
  var import_fs_extra14 = __toESM(require("fs-extra"), 1);
2801
2844
 
2802
2845
  // src/core/utils/groupEntrypoints.ts
@@ -4100,7 +4143,7 @@ async function buildInternal(config) {
4100
4143
  const target = `${config.browser}-mv${config.manifestVersion}`;
4101
4144
  config.logger.info(
4102
4145
  `${verb} ${import_picocolors3.default.cyan(target)} for ${import_picocolors3.default.cyan(config.mode)} with ${import_picocolors3.default.green(
4103
- `Vite ${vite4.version}`
4146
+ `Vite ${vite5.version}`
4104
4147
  )}`
4105
4148
  );
4106
4149
  const startTime = Date.now();
@@ -4178,7 +4221,7 @@ async function combineAnalysisStats(config) {
4178
4221
  }
4179
4222
 
4180
4223
  // src/core/server.ts
4181
- var vite5 = __toESM(require("vite"), 1);
4224
+ var vite6 = __toESM(require("vite"), 1);
4182
4225
 
4183
4226
  // src/core/runners/wsl.ts
4184
4227
  var import_node_path10 = require("path");
@@ -4323,8 +4366,8 @@ async function getServerInfo() {
4323
4366
  }
4324
4367
  async function setupServer(serverInfo, config) {
4325
4368
  const runner = await createExtensionRunner(config);
4326
- const viteServer = await vite5.createServer(
4327
- vite5.mergeConfig(serverInfo, await config.vite(config.env))
4369
+ const viteServer = await vite6.createServer(
4370
+ vite6.mergeConfig(serverInfo, await config.vite(config.env))
4328
4371
  );
4329
4372
  const start = async () => {
4330
4373
  await viteServer.listen(server.port);
@@ -4369,7 +4412,8 @@ function reloadContentScripts(steps, config, server) {
4369
4412
  if (Array.isArray(entry) || entry.type !== "content-script")
4370
4413
  return;
4371
4414
  const js = [getEntrypointBundlePath(entry, config.outDir, ".js")];
4372
- const css = getContentScriptCssFiles([entry], server.currentOutput);
4415
+ const cssMap = getContentScriptsCssMap(server.currentOutput, [entry]);
4416
+ const css = getContentScriptCssFiles([entry], cssMap);
4373
4417
  server.reloadContentScript({
4374
4418
  allFrames: entry.options.allFrames,
4375
4419
  excludeMatches: entry.options.excludeMatches,
@@ -4428,7 +4472,7 @@ async function clean(root = process.cwd()) {
4428
4472
  }
4429
4473
 
4430
4474
  // package.json
4431
- var version2 = "0.7.0";
4475
+ var version2 = "0.7.1-alpha1";
4432
4476
 
4433
4477
  // src/core/utils/defineConfig.ts
4434
4478
  function defineConfig(config) {