@adhese/sdk 0.8.1 → 0.9.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.
package/dist/index.cjs CHANGED
@@ -125,7 +125,7 @@ function createSafeFrame({
125
125
  }
126
126
  const name = "@adhese/sdk";
127
127
  const type = "module";
128
- const version = "0.8.1";
128
+ const version = "0.9.0";
129
129
  const description = "Adhese SDK";
130
130
  const license = "GPL-3.0";
131
131
  const repository = {
@@ -255,7 +255,7 @@ const hookMap = /* @__PURE__ */ new Map();
255
255
  function clearAllHooks() {
256
256
  hookMap.clear();
257
257
  }
258
- function createHook(name2, {
258
+ function createAsyncHook(name2, {
259
259
  onRun,
260
260
  onAdd
261
261
  } = {}) {
@@ -267,19 +267,45 @@ function createHook(name2, {
267
267
  onRun == null ? void 0 : onRun(hookMap.get(name2));
268
268
  return latestResult;
269
269
  };
270
- function add(callback) {
271
- const hookSet = hookMap.get(name2);
272
- if (hookSet)
273
- hookSet.add(callback);
274
- else
275
- hookMap.set(name2, /* @__PURE__ */ new Set([callback]));
276
- onAdd == null ? void 0 : onAdd(hookSet);
277
- return () => {
278
- var _a;
279
- (_a = hookMap.get(name2)) == null ? void 0 : _a.delete(callback);
280
- };
281
- }
282
- return [run, add];
270
+ return [run, (callback) => add(callback, { name: name2, onAdd })];
271
+ }
272
+ function createSyncHook(name2, {
273
+ onRun,
274
+ onAdd
275
+ } = {}) {
276
+ hookMap.set(name2, /* @__PURE__ */ new Set());
277
+ const run = (arg) => {
278
+ let latestResult = arg;
279
+ const promisedCallbacks = [];
280
+ for (const callback of hookMap.get(name2) ?? []) {
281
+ if (isCallbackAsync(callback))
282
+ promisedCallbacks.push(callback);
283
+ else
284
+ latestResult = callback(latestResult) ?? latestResult;
285
+ }
286
+ Promise.allSettled(promisedCallbacks.map((callback) => callback(latestResult))).catch(console.trace);
287
+ onRun == null ? void 0 : onRun(hookMap.get(name2));
288
+ return latestResult;
289
+ };
290
+ return [run, (callback) => add(callback, { name: name2, onAdd })];
291
+ }
292
+ function add(callback, {
293
+ name: name2,
294
+ onAdd
295
+ }) {
296
+ const hookSet = hookMap.get(name2);
297
+ if (hookSet)
298
+ hookSet.add(callback);
299
+ else
300
+ hookMap.set(name2, /* @__PURE__ */ new Set([callback]));
301
+ onAdd == null ? void 0 : onAdd(hookSet);
302
+ return () => {
303
+ var _a;
304
+ (_a = hookMap.get(name2)) == null ? void 0 : _a.delete(callback);
305
+ };
306
+ }
307
+ function isCallbackAsync(callback) {
308
+ return callback.constructor.name === "AsyncFunction";
283
309
  }
284
310
  let resolveOnInitPromise = () => {
285
311
  };
@@ -287,7 +313,7 @@ let isInit = false;
287
313
  const waitOnInit = new Promise((resolve) => {
288
314
  resolveOnInitPromise = resolve;
289
315
  });
290
- const [runOnInit, onInit] = createHook("onInit", {
316
+ const [runOnInit, onInit] = createSyncHook("onInit", {
291
317
  onRun(callbacks) {
292
318
  isInit = true;
293
319
  resolveOnInitPromise();
@@ -295,7 +321,7 @@ const [runOnInit, onInit] = createHook("onInit", {
295
321
  },
296
322
  onAdd() {
297
323
  if (isInit)
298
- runOnInit().catch(console.error);
324
+ runOnInit();
299
325
  }
300
326
  });
301
327
  const defaultLogLevels = ["trace", "debug", "info", "warn", "error"];
@@ -371,8 +397,8 @@ function createLogger({
371
397
  const logger = createLogger({
372
398
  scope: "Adhese SDK"
373
399
  });
374
- const [runOnRequest, onRequest] = createHook("onRequest");
375
- const [runOnResponse, onResponse] = createHook("onResponse");
400
+ const [runOnRequest, onRequest] = createAsyncHook("onRequest");
401
+ const [runOnResponse, onResponse] = createAsyncHook("onResponse");
376
402
  const numberLike = zod.union([zod.coerce.string().regex(/^\d+$/), zod.literal("")]).transform((value) => value === "" ? void 0 : Number(value));
377
403
  const booleanLike = zod.union([zod.coerce.boolean(), zod.literal("")]);
378
404
  const urlLike = zod.union([zod.coerce.string(), zod.literal("")]).transform((value) => {
@@ -665,7 +691,8 @@ async function requestAd({
665
691
  });
666
692
  return ad;
667
693
  }
668
- const [runOnRender, onRender] = createHook("onRender");
694
+ const [runOnRender, onRender] = createAsyncHook("onRender");
695
+ const [runOnSlotCreate, onSlotCreate] = createSyncHook("onSlotCreate");
669
696
  function useViewabilityObserver({ context, ad, name: name2, element }) {
670
697
  let timeoutId = null;
671
698
  const {
@@ -756,9 +783,10 @@ const renderFunctions = {
756
783
  iframe: renderIframe,
757
784
  inline: renderInline
758
785
  };
759
- function createSlot(options) {
786
+ function createSlot(slotOptions) {
760
787
  const scope = runtimeCore.effectScope();
761
788
  return scope.run(() => {
789
+ const options = runOnSlotCreate(slotOptions);
762
790
  const {
763
791
  containingElement,
764
792
  slot,
@@ -874,6 +902,7 @@ function createSlot(options) {
874
902
  containingElement
875
903
  });
876
904
  (_b = options.onRender) == null ? void 0 : _b.call(options, element.value);
905
+ ad.value = renderAd;
877
906
  disposeRenderIntersectionObserver();
878
907
  return element.value;
879
908
  }
@@ -956,7 +985,7 @@ function createSlotManager({
956
985
  function getAll() {
957
986
  return Array.from(slots).map(([, slot]) => slot);
958
987
  }
959
- function add(options) {
988
+ function add2(options) {
960
989
  var _a;
961
990
  const slot = createSlot({
962
991
  ...options,
@@ -1002,14 +1031,14 @@ function createSlotManager({
1002
1031
  scope.stop();
1003
1032
  }
1004
1033
  for (const options of initialSlots) {
1005
- add({
1034
+ add2({
1006
1035
  ...options,
1007
1036
  lazyLoading: false
1008
1037
  });
1009
1038
  }
1010
1039
  return {
1011
1040
  getAll,
1012
- add,
1041
+ add: add2,
1013
1042
  findDomSlots: findDomSlots$1,
1014
1043
  get,
1015
1044
  dispose
@@ -1053,14 +1082,14 @@ function isPreviewMode() {
1053
1082
  return window.location.search.includes("adhesePreviewCreativeId");
1054
1083
  }
1055
1084
  let isDisposed = false;
1056
- const [runOnDispose, onDispose] = createHook("onDispose", {
1085
+ const [runOnDispose, onDispose] = createSyncHook("onDispose", {
1057
1086
  onRun(callbacks) {
1058
1087
  isDisposed = true;
1059
1088
  callbacks == null ? void 0 : callbacks.clear();
1060
1089
  },
1061
1090
  onAdd() {
1062
1091
  if (isDisposed)
1063
- runOnDispose().catch(console.error);
1092
+ runOnDispose();
1064
1093
  }
1065
1094
  });
1066
1095
  function createAdhese(options) {
@@ -1102,7 +1131,8 @@ function createAdhese(options) {
1102
1131
  onDispose,
1103
1132
  onRender,
1104
1133
  onRequest,
1105
- onResponse
1134
+ onResponse,
1135
+ onSlotCreate
1106
1136
  });
1107
1137
  }
1108
1138
  context.events = createEventManager();
@@ -1231,7 +1261,7 @@ function createAdhese(options) {
1231
1261
  logger.resetLogs();
1232
1262
  (_b = context.events) == null ? void 0 : _b.dispose();
1233
1263
  logger.info("Adhese instance disposed");
1234
- runOnDispose().catch(logger.error);
1264
+ runOnDispose();
1235
1265
  clearAllHooks();
1236
1266
  scope.stop();
1237
1267
  }
@@ -1246,7 +1276,7 @@ function createAdhese(options) {
1246
1276
  if (!scope.active)
1247
1277
  dispose();
1248
1278
  });
1249
- runOnInit().catch(logger.error);
1279
+ runOnInit();
1250
1280
  return {
1251
1281
  parameters: context.parameters,
1252
1282
  events: context.events,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../utils/src/uniqueId/uniqueId.ts","../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../../logger/src/createLogger/createLogger.ts","../src/logger/logger.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.schema.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onRender.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","const savedIds = new Set<string>();\n\nexport function uniqueId(): string {\n let id: string;\n\n do\n id = Math.random().toString(36).slice(2);\n while (savedIds.has(id));\n\n savedIds.add(id);\n\n return id;\n}\n","import { uniqueId } from '@utils';\nimport type { Ad, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@adhese/sdk';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { debounce } from 'remeda';\nimport { logger } from '@adhese/sdk';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n function add(callback: Callback): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n }\n\n return [run, add];\n}\n","import { createHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit().catch(console.error);\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createEventManager, uniqueId } from '@utils';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import type { AdRequestOptions } from '@adhese/sdk';\nimport { createHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createHook<AdRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { Ad } from '@adhese/sdk';\nimport { createHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createHook<ReadonlyArray<Ad>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { logger } from '@adhese/sdk';\nimport { type Ad, adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@vue/runtime-core';\nimport { type AdRequestOptions, logger } from '@adhese/sdk';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import type { MaybeRef } from '@vue/runtime-core';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(requestOptions: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n","import type { Ad } from '@adhese/sdk';\nimport { createHook } from './createHook';\n\nconst [runOnRender, onRender] = createHook<Ad>('onRender');\n\nexport { runOnRender, onRender };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { type Ad, type AdheseContext, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport { type Ad, type AdheseSlotOptions, logger } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ ad, options, element, render }: {\n ad: Ref<Ad | null>;\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n render(adToRender?: Ad): Promise<HTMLElement>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport.value) {\n (async (): Promise<void> => {\n if (!ad.value && options.lazyLoading)\n await render();\n\n await render(ad.value ?? undefined);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport type { Ad } from '../../requestAds/requestAds.schema';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { logger } from '../../logger/logger';\nimport { runOnRender } from '../../hooks/onRender';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(options: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n ad,\n options,\n element,\n render,\n });\n\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if (!newAd || (oldAd && isDeepEqual(newAd, oldAd)))\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (renderAd)\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n disposeRenderIntersectionObserver();\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\nimport type { AdheseContext } from '../../main.types';\nimport type { AdheseSlot } from '../createSlot/createSlot.types';\nimport { createSlot } from '../createSlot/createSlot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose().catch(console.error);\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { createEventManager } from '@utils';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport packageJson from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport { requestAds } from './requestAds/requestAds';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRender } from './hooks/onRender';\nimport { onRequest } from './hooks/onRequest';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n addSlot,\n } satisfies AdheseContext) as AdheseContext;\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version: packageJson.version,\n onInit,\n onDispose,\n onRender,\n onRequest,\n onResponse,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n if (!slotManager)\n throw new Error('Slot manager not initialized');\n\n return slotManager.add(slotOptions);\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose().catch(logger.error);\n\n clearAllHooks();\n\n scope.stop();\n }\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit().catch(logger.error);\n\n return {\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n get: slotManager.get,\n getAll: slotManager.getAll,\n context,\n options: mergedOptions,\n } satisfies Adhese;\n })!;\n}\n"],"names":["debounce","name","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue","ref","computed","round","watch","effectScope","reactive","requestAd","isDeepEqual","extRequestAd","shallowReactive","watchEffect","onDispose","_a","findDomSlots","extFindDomSlots"],"mappings":";;;;;AAAA,eAAsB,iBAAgC;AAC7C,SAAA,IAAI,QAAQ,CAAC,YAAY;AAC9B,aAAS,YAAkB;AACjB;AACD,aAAA,oBAAoB,oBAAoB,SAAS;AAAA,IAC1D;AAEA,QAAI,SAAS,eAAe;AACjB,eAAA,iBAAiB,oBAAoB,SAAS;AAAA;AAE/C;EAAA,CACX;AACH;AC+BO,SAAS,qBAGU;AAClB,QAAA,kCAAkB;AAExB,WAAS,UAAgB;AACvB,eAAW,cAAc;AACZ;EACf;AAEA,SAAO,IAAI,MAA4B;AAAA,IACrC;AAAA,EAAA,GACyB;AAAA;AAAA,IAEzB,IAAI,QAAQ,KAAK,UAAU;AACzB,UAAI,EAAE,OAAO,WAAW,OAAO,QAAQ,UAAU;AAC/C,cAAM,QAAQ;AAEd,oBAAY,IAAI,MAAM;AACpB,gBAAM,UAAU;QAAM,CACvB;AAED,gBAAQ,IAAI,QAAQ,KAAK,OAAO,QAAQ;AAAA,MAC1C;AAEA,aAAO,QAAQ,IAAI,QAAQ,KAAK,QAAQ;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAEA,SAAS,cAA2B;AAC5B,QAAA,gCAAgB;AAEtB,WAAS,SAAS,MAAe;AAC/B,eAAW,YAAY;AAErB,WAAK,SAAS,IAAI;AAAA,EACtB;AAEA,iBAAe,cAAc,MAAwB;AACnD,UAAM,QAAQ;AAAA,MACZ,MAAM,KAAK,SAAS,EAAE,IAAI,CAAY,aAAA,SAAS,IAAI,CAAC;AAAA,IAAA;AAAA,EAExD;AAEA,WAAS,YAAY,UAAmD;AACtE,cAAU,IAAI,QAAQ;AAAA,EACxB;AAEA,WAAS,eAAe,UAAmD;AACzE,cAAU,OAAO,QAAQ;AAAA,EAC3B;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACxGA,MAAM,+BAAe;AAEd,SAAS,WAAmB;AAC7B,MAAA;AAEJ;AACE,SAAK,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,CAAC;AAAA,SAClC,SAAS,IAAI,EAAE;AAEtB,WAAS,IAAI,EAAE;AAER,SAAA;AACT;ACIO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AACF,GAAgC;AAC9B,QAAM,YAAY,OAAO;AAEzB,MAAI,CAAC;AACG,UAAA,IAAI,MAAM,qBAAqB;AAEjC,QAAA,sCAAsB;AAE5B,QAAM,SAAS,IAAI,UAAU,KAAK,OAAO;AAAA,IACvC,MAAM;AAAA,IACN,OAAO,QAAQ;AAAA,IACf;AAAA,EAAA,CACD;AAEQ,WAAA,YAAY,IAAQ,SAAgC;;AAC3D,QAAI,CAAC;AACG,YAAA,IAAI,MAAM,qBAAqB;AAEjC,UAAA,OAAQ,GAAG,QAAQ,QAAQ,GAAG,OAAQ,GAAG,OAAO,GAAG;AAEzD,QAAI,OAAO,SAAS;AACZ,YAAA,IAAI,MAAM,wBAAwB;AAEpC,UAAA,YAAY,QAAQ,MAAM,MAAM,GAAG,EAAE,IAAI,SAAU,CAAA;AAEzD,YAAQ,KAAK;AAEb,UAAM,WAAW,IAAI,UAAU,KAAK,SAAS;AAAA,MAC3C,IAAI;AAAA,MACJ;AAAA,MACA,KAAK,GAAG,QAAQ,QAAO,QAAG,WAAH,mBAAW,OAAO;AAAA,MACzC,QAAQ,IAAI,UAAU,KAAK,UAAU;AAAA,QACnC,IAAI;AAAA,QACJ,GAAG,OAAO,GAAG,KAAK;AAAA,QAClB,GAAG,OAAO,GAAG,MAAM;AAAA,QACnB,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC;AAAA,QAC9C,KAAK,KAAK,SAAS,gBAAgB,IAAI,UAAU;AAAA,QACjD,MAAM;AAAA,MAAA,CACP;AAAA,IAAA,CACF;AAED,oBAAgB,IAAI,QAAQ;AAErB,WAAA;AAAA,EACT;AAEA,iBAAe,OAAO,UAAmC;AACvD,QAAI,CAAC;AACG,YAAA,IAAI,MAAM,qBAAqB;AAE7B,cAAA,KAAK,OAAO,QAAQ;AAAA,EAChC;AAEA,WAAS,UAAgB;AAAA,EACzB;AAEO,SAAA;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/EgB,SAAA,aAAa,IAAQ,SAA4B;AACzD,QAAA,SAAS,SAAS,cAAc,QAAQ;AAE9C,SAAO,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAaN,OAAO,GAAG,GAAG,CAAC;AAAA;AAAA,QAElB,WAAW,QAAQ,GAAG,EAAE,KAAK;AAEnC,SAAO,MAAM,SAAS;AACtB,SAAO,MAAM,QAAQ,GAAG,QAAQ,GAAG,GAAG,KAAK,OAAO;AAClD,SAAO,MAAM,SAAS,GAAG,SAAS,GAAG,GAAG,MAAM,OAAO;AACrD,UAAQ,gBAAgB,MAAM;AAChC;AAEgB,SAAA,aAAa,IAAQ,SAA4B;AACvD,UAAA,YAAY,OAAO,GAAG,GAAG;AACnC;AAEgB,SAAA,aACd,UACA,QACA,MACQ;AACD,SAAA,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,KAAK,EAAE,IAAI,MAAM;AACtD;AChCO,SAAS,iBAAiB,KAAqC;AAC9D,QAAA,MAAM,SAAS,cAAc,KAAK;AAEpC,MAAA,MAAM,IAAI;AACd,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,QAAQ;AAClB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,SAAS;AACnB,MAAI,MAAM,WAAW;AACrB,MAAI,MAAM,MAAM;AAET,SAAA,SAAS,KAAK,YAAY,GAAG;AACtC;ACYO,SAAS,oBACd;AAAA,EACE;AAAA,EACA,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,EACX;AACF,IAA2B,IACZ;AACf,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,QAAQ,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,OAAO,WAAW,KAAK,CAAC,CAAC;AAAA,EAAA;AAG/E,WAAS,WAAmB;AAC1B,eAAW,CAAC,QAAQ,KAAK,KAAK,OAAO,QAAQ,OAAO,GAAG;AACjD,UAAA,OAAO,WAAW,KAAK,EAAE;AACpB,eAAA;AAAA,IACX;AAEO,WAAA;AAAA,EACT;AAEM,QAAA,iBAAiBA,OAAAA,SAAS,MAAY;AAErC,UAAA,qCAAW;AAEhB,WAAO,MAAM,iBAAiB,SAAU,CAAA,EAAE;AAAA,EAAA,GACzC;AAAA,IACD,QAAQ;AAAA,EAAA,CACT;AAED,MAAI,UAAU;AACD,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,iBAAiB,UAAU,eAAe,IAAI;AAAA,EACxD;AAEA,WAAS,UAAgB;AACZ,eAAA,SAAS,SAAS,OAAO;AAC5B,YAAA,oBAAoB,UAAU,eAAe,IAAI;AAAA,EAC3D;AAEO,SAAA;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EAAA;AAEJ;AC7EA,MAAM,8BAAc;AAEb,SAAS,gBAAsB;AACpC,UAAQ,MAAM;AAChB;AAEO,SAAS,WAMdC,OACA;AAAA,EACE;AAAA,EACA;AACF,IAGI,IAIF;AACF,UAAQ,IAAIA,OAAU,oBAAA,IAAe,CAAA;AAE/B,QAAA,MAAO,OAAO,QAAQ;AAC1B,QAAI,eAAyB;AAE7B,eAAW,YAAY,QAAQ,IAAIA,KAAI,KAAK,CAAC;AAE3B,qBAAA,MAAM,SAAS,YAAY,KAAkB;AAEvD,mCAAA,QAAQ,IAAIA,KAAI;AAEjB,WAAA;AAAA,EAAA;AAGT,WAAS,IAAI,UAAgC;AACrC,UAAA,UAAU,QAAQ,IAAIA,KAAI;AAE5B,QAAA;AACF,cAAQ,IAAI,QAAQ;AAAA;AAEpB,cAAQ,IAAIA,OAAM,oBAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;AAEvC,mCAAQ;AAER,WAAO,MAAM;;AACX,oBAAQ,IAAIA,KAAI,MAAhB,mBAAmB,OAAO;AAAA,IAAQ;AAAA,EAEtC;AAEO,SAAA,CAAC,KAAK,GAAG;AAClB;ACpDA,IAAI,uBAAuB,MAAY;AAAC;AACxC,IAAI,SAAS;AACb,MAAM,aAAa,IAAI,QAAc,CAAC,YAAY;AACzB,yBAAA;AACzB,CAAC;AAED,MAAM,CAAC,WAAW,MAAM,IAAI,WAAW,UAAU;AAAA,EAC/C,MAAM,WAAW;AACN,aAAA;AAEY;AAErB,2CAAW;AAAA,EACb;AAAA,EACA,QAAQ;AACF,QAAA;AACQ,kBAAE,MAAM,QAAQ,KAAK;AAAA,EACnC;AACF,CAAC;ACiED,MAAM,mBAAmB,CAAC,SAAS,SAAS,QAAQ,QAAQ,OAAO;AAK5D,SAAS,aAAkF;AAAA,EAChG;AAAA,EACA,YAAY;AAAA,EACZ,uBAAuB,UAAU,CAAC;AACpC,GAAmC;AAC3B,QAAA,2BAAW;AACjB,MAAI,8BAAiC;AACrC,QAAM,SAAS;AAKf,QAAM,eAAe,OAAO,YAAY,UAAU,IAAI,CAAC,OAAO,UAAU;AAChE,UAAA,cAA2B,CAAC,SAAS,eAAe;AACxD,WAAK,IAAI;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,IAAI,SAAS;AAAA,MAAA,CACd;AAED,aAAO,IAAI,SAAS;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,WAAW,KAAK,IAAI;AAAA,QACpB,IAAI,SAAS;AAAA,MAAA,CACd;AAED,UAAI,SAAS,UAAU,QAAQ,2BAA2B,GAAG;AAC3D,YAAK,CAAC,QAAQ,SAAS,OAAO,EAA4B,SAAS,KAAK,GAAG;AAEjE,kBAAA,KAAwC,EAAE,GAAG;AAAA,YACnD,KAAK,KAAK;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,OAAO,OAAO,CAAC;AAAA,QAAA,OAEd;AAEH,kBAAQ,IAAI,GAAG;AAAA,YACb,KAAK,KAAK,MAAM,MAAM,YAAa,CAAA;AAAA,YACnC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UAAA,EACA,OAAO,OAAO,CAAC;AAAA,QACnB;AAAA,MACF;AAAA,IAAA;AAGK,WAAA,CAAC,OAAO,WAAW;AAAA,EAC3B,CAAA,CAAC;AAIK,SAAA;AAAA,IACL,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,wBAAwB,OAAgB;AACR,oCAAA;AAAA,IAChC;AAAA,IACA,4BAAkC;AACF,oCAAA;AAAA,IAChC;AAAA,IACA,0BAA6B;AACpB,aAAA;AAAA,IACT;AAAA,IACA,UAAiC;AACxB,aAAA,MAAM,KAAK,IAAI;AAAA,IACxB;AAAA,IACA,YAAkB;AAChB,aAAO,MAAM;AACb,WAAK,MAAM;AAAA,IACb;AAAA,EAAA;AAEJ;ACzKO,MAAM,SAAS,aAAa;AAAA,EACjC,OAAO;AACT,CAAC;ACDD,MAAM,CAAC,cAAc,SAAS,IAAI,WAA6B,WAAW;ACA1E,MAAM,CAAC,eAAe,UAAU,IAAI,WAA8B,YAAY;ACYjE,MAAA,aAAaC,IAAAA,MAAM,CAACC,WAAO,OAAS,EAAA,MAAM,OAAO,GAAGC,IAAAA,QAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAA,UAAS,UAAU,KAAK,SAAY,OAAO,KAAK,CAAC;AAC7H,MAAA,cAAcF,IAAAA,MAAM,CAACC,WAAO,QAAW,GAAAC,YAAQ,EAAE,CAAC,CAAC;AACzD,MAAM,UAAUF,IAAA,MAAM,CAACC,IAAA,OAAO,OAAO,GAAGC,YAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU;AAC5E,MAAA;AACK,WAAA,IAAI,IAAI,KAAK;AAAA,EAAA,QAEhB;AACG,WAAA;AAAA,EACT;AACF,CAAC;AACM,MAAM,WAAWF,IAAA,MAAM,CAACC,IAAA,OAAO,OAAO,GAAGC,YAAQ,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU;AACjF,MAAI,UAAU;AACL,WAAA;AAEH,QAAA,OAAO,IAAI,KAAK,WAAW,UAAU,KAAK,EAAE,UAAU,OAAO,KAAK,IAAI,KAAK;AAEjF,MAAI,OAAO,MAAM,KAAK,QAAA,CAAS;AACtB,WAAA;AAEF,SAAA;AACT,CAAC;AAEM,MAAM,eACTF,IAAAA,MAAM,CAACC,WAAO,OAAU,GAAAC,IAAA,QAAQ,EAAE,GAAGC,YAAQ,CAAC,EAAE,UAA8B,CAAC,UAAU;AACzF,MAAI,UAAU,MAAM,UAAU,KAAK,UAAU;AACpC,WAAA;AAEL,MAAA,WAAW,MAAM,KAAK;AACxB,WAAO,GAAG,WAAW,MAAM,KAAK,CAAC;AAEnC,SAAO,OAAO,KAAK;AACrB,CAAC;AAEU,MAAA,SAASC,aAAS,UAAU,CAAC,OAAO,EAAE,eAAe;AAC5D,MAAA;AACF,WAAO,KAAK,MAAM,MAAM,WAAW,KAAM,GAAG,CAAC;AAAA,WAExC,OAAO;AACH,aAAA;AAAA,MACP,MAAMC,IAAa,aAAA;AAAA,MACnB,SAAS,iBAAkB,MAAgB,OAAO;AAAA,IAAA,CACnD;AAEM,WAAAC;EACT;AACF,CAAC;AAEY,MAAA,eAAeF,aAAS,UAAU,CAAC,OAAO,EAAE,eAAe;;AAChE,QAAA,aAAa,IAAI;AAEnB,MAAA;AACF,UAAM,OAAO,WAAW,gBAAgB,OAAO,WAAW;AAEtD,UAAA,UAAK,SAAL,mBAAW,SAAS,YAAW;AAC3B,YAAA,IAAI,MAAM,cAAc;AAEzB,WAAA;AAAA,WAEF,OAAO;AACH,aAAA;AAAA,MACP,MAAMC,IAAa,aAAA;AAAA,MACnB,SAAU,MAAgB;AAAA,IAAA,CAC3B;AAEM,WAAAC;EACT;AACF,CAAC;AAEM,MAAM,qBAAqBN,IAAAA,MAAM,CAAC,QAAQ,YAAY,CAAC;AAEjD,MAAA,6BAA6BA,IAAAA,MAAM,CAACC,IAAAA,OAAO,OAAA,GAAU,kBAAkB,CAAC,EAAE,UAAU,CAAC,UAAU;AAC1G,MAAI,UAAU;AACL,WAAA;AAEF,SAAA;AACT,CAAC,EAAE,SAAS;AAEZ,MAAM,aAAaM,IAAAA,OAAO;AAAA,EACxB,YAAY,WAAW,SAAS;AAAA,EAChC,UAAUH,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC5B,QAAQA,IAAAA,OAAO;AAAA,EACf,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,2BAA2BA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7C,YAAY,SAAS,SAAS;AAAA,EAC9B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,YAAYA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC9B,cAAc,SAAS,SAAS;AAAA,EAChC,cAAcA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAChC,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,aAAa,YAAY,SAAS;AAAA,EAClC,MAAM;AAAA,EACN,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,cAAcA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAChC,iBAAiBA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACnC,mBAAmBA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACrC,KAAKA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACvB,WAAWG,IAAAA,OAAO;AAAA,IAChB,WAAWH,IAAAA,OAAO;AAAA,IAClB,QAAQI,IAAAA,QAAQ,EAAE,SAAS;AAAA,EAC5B,CAAA,EAAE,SAAS;AAAA,EACZ,QAAQ,WAAW,SAAS;AAAA,EAC5B,IAAIJ,IAAAA,OAAO;AAAA,EACX,mBAAmB,QAAQ,SAAS;AAAA,EACpC,OAAOA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACzB,SAASA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC3B,WAAWA,IAAAA,OAAO,EAAE,SAAS;AAAA,EAC7B,eAAeA,IAAAA,OAAO,EAAE,SAAS;AAAA,EACjC,QAAQJ,UAAM,CAACE,IAAA,QAAQ,UAAU,GAAGA,IAAA,QAAQ,MAAM,CAAC,CAAC;AAAA,EACpD,YAAYM,IAAAA,QAAQ,EAAE,SAAS;AAAA,EAC/B,gBAAgBJ,IAAAA,OAAO,EAAE,SAAS;AAAA,EAClC,UAAU,QAAQ,SAAS;AAAA,EAC3B,SAAS,YAAY,SAAS;AAAA,EAC9B,UAAU,WAAW,SAAS;AAAA,EAC9B,OAAO,QAAQ,SAAS;AAAA,EACxB,OAAOA,IAAAA,OAAO,EAAE,SAAS;AAAA;AAAA,EAEzB,QAAQA,IAAAA,OAAO;AAAA,EACf,UAAUA,IAAAA,OAAO;AAAA,EACjB,QAAQ,QAAQ,SAAS;AAAA,EACzB,KAAK;AAAA,EACL,QAAQ,QAAQ,SAAS;AAAA,EACzB,WAAW,SAAS,SAAS;AAAA,EAC7B,0BAA0B,QAAQ,SAAS;AAAA,EAC3C,SAAS,QAAQ,SAAS;AAAA,EAC1B,aAAa,QAAQ,SAAS;AAAA,EAC9B,KAAK,QAAQ,SAAS;AAAA,EACtB,2BAA2B,QAAQ,SAAS;AAAA,EAC5C,OAAO,WAAW,SAAS;AAAA,EAC3B,YAAY,aAAa,SAAS;AACpC,CAAC;AAEM,MAAM,iBAAiBG,IAAAA,OAAO;AAAA,EACnC,QAAQL,YAAQ,UAAU;AAAA,EAC1B,KAAK;AACP,CAAC,EAAE,YAAY;AAER,MAAM,aAAaK,IAAAA,OAAO;AAAA,EAC/B,QAAQL,YAAQ,MAAM;AAAA,EACtB,MAAM;AACR,CAAC,EAAE,cAAc,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY;AAAA,EACjD,GAAG;AAAA,EACH,KAAK;AACP,EAAE;AAMF,MAAM,mBAAwC,WAAW,OAAO;AAAA,EAC9D,qBAAqBO,IAAA,KAAK,MAAMT,IAAA,MAAM,CAAC,iBAAiB,MAAM,GAAGI,WAAQ,CAAA,CAAC,EAAE,UAAU;AACxF,CAAC;AAUY,MAAA,WAAiC,iBAAiB,UAAU,CAAC;AAAA,EACxE;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,gBAAgB,OAAO;AAAA,IAC3B,OAAO,QAAQ,IAAI,EAChB,OAAO,CAAC,GAAG,KAAK,MACf,QAAQ,KAAK,KACV,KAAK,UAAU,KAAK,MAAM,QAC1B,KAAK,UAAU,KAAK,MAAM,IAAI;AAAA,EAAA;AAG/B,SAAA;AAAA,IACN,GAAG;AAAA,IACH,qBAAqB,MAAM,QAAQ,mBAAmB,IAAI,oBAAoB,IAAI,CAAA,aAAY,SAAS,MAAM,QAAQ,CAAC,IAAI;AAAA,EAAA;AAE9H,CAAC;AAEM,SAAS,cAAc,UAAsC;AAClE,QAAM,YAAY;AAAA;AAAA,IAEhB,UAAU;AAAA,IACV,MAAM;AAAA;AAAA,EAAA;AAIR,QAAM,YAAY,iBAAiB,MAAM,EAAE,MAAM,QAAQ;AAElD,SAAA,UAAU,IAAI,CAAC,SAAS;AACvB,UAAA,SAAS,UAAU,KAAK,MAAM;AAEpC,QAAI,CAAC;AACI,aAAA,SAAS,MAAM,IAAI;AAErB,WAAA,OAAO,MAAM,IAAI;AAAA,EAAA,CACzB;AACH;ACjNA,eAAsB,gBAAgB,SAA6C;AACjF,QAAM,iBAAiB;AAEvB,QAAM,QAAQ,MAAM,QAAQ,WAAW,eACpC,OAAO,CAAiB,kBAAA,6BAA6B,aAAa,EAClE,IAAI,OAAO,kBAAkB;AAC5B,UAAM,WAAW,IAAI,IAAI,WAAW,OAAO,mDAAmD;AAC9F,aAAS,aAAa;AAAA,MACpB;AAAA,MACA,cAAc;AAAA,IAAA;AAGhB,UAAM,WAAW,MAAM,MAAM,SAAS,MAAM;AAAA,MAC1C,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IAAA,CACD;AAED,QAAI,CAAC,SAAS;AACL,aAAA,QAAQ,OAAO,IAAI,MAAM,yCAAyC,cAAc,uBAAuB,EAAE,CAAC;AAE5G,WAAA,MAAM,SAAS;EAAK,CAC5B,CAAC,GACD,OAAO,CAAC,aAAyF;AAC5F,QAAA,SAAS,WAAW,YAAY;AAC3B,aAAA,MAAM,SAAS,MAAgB;AAC/B,aAAA;AAAA,IACT;AACA,WAAO,SAAS,WAAW;AAAA,EAAA,CAC5B,EACA,IAAI,cAAY,SAAS,MAAM,IAAI,CAAS,UAAA;AAAA,IAC3C,GAAG;AAAA,IACH,SAAS;AAAA,IACT,CAAC;AAEL,SAAO,SAAS,MAAM,EAAE,MAAM,KAAK,MAAM;AAC3C;AAEA,SAAS,oBAA2D;AAClE,QAAM,aAAa,IAAI,IAAI,OAAO,SAAS,IAAI;AAE/C,QAAM,iBAAgD,CAAA;AACtD,MAAI,gBAAwC,CAAA;AAE5C,aAAW,CAAC,KAAK,KAAK,KAAK,WAAW,aAAa,WAAW;AAC5D,QAAI,QAAQ,6BAA6B,OAAO,KAAK,aAAa,EAAE,SAAS,GAAG;AAC9E,qBAAe,KAAK,aAAa;AACjC,sBAAgB,CAAA;AAAA,IAClB;AAEA,kBAAc,GAAG,IAAI;AAAA,EACvB;AAEA,MAAI,OAAO,KAAK,aAAa,EAAE,SAAS;AACtC,mBAAe,KAAK,aAAa;AAE5B,SAAA;AACT;AClDO,SAAS,gBAAgB;AAAA,EAC9B,SAAS,EAAE,SAAS,EAAE,KAAA,GAAQ,WAAW;AAAA,EACzC,GAAG;AACL,GAAwD;AACtD,QAAM,UAAU;AAAA,IACd,GAAG;AAAA,IACH,OAAO,QAAQ,MAAM,IAAI,CAAS,UAAA;AAAA,MAChC,UAAUM,YAAAA,QAAQ,KAAK,IAAI;AAAA,MAC3B,YAAY,gBAAgB,KAAK,UAAU;AAAA,IAAA,EAC3C;AAAA,IACF,YAAY,cAAc,gBAAgB,UAAU;AAAA,EAAA;AAGtD,SAAO,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,QAAQ;AAAA,IACxC,QAAQ;AAAA,IACR,MAAM,KAAK,UAAU,OAAO;AAAA,IAC5B,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEA,eAAsB,eAAe,EAAE,SAAS,SAA8D;AACrG,SAAA,MAAM,IAAI,IAAI,GAAG,QAAQ,QAAQ,IAAI,WAAW,MAAM,IAAI,UAAQA,YAAAA,QAAQ,KAAK,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,GAAG;AAAA,IAC3G,QAAQ;AAAA,IACR,SAAS;AAAA;AAAA,MAEP,gBAAgB;AAAA,IAClB;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAA0D,YAA+C;AACvH,SAAO,OAAO,YAAY,MAAM,KAAK,WAAW,QAAA,CAAS,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM;AAC3E,QAAI,IAAI,WAAW;AACV,aAAA;AAEF,WAAA,KAAK,0BAA0B,GAAG,iEAAiE;AACnG,WAAA;AAAA,EACR,CAAA,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAmB;AACpC,QAAI,OAAO,UAAU;AACnB,aAAO,CAAC,KAAK,mBAAmB,KAAK,CAAM;AAE7C,WAAO,CAAC,KAAK,MAAM,IAAI,kBAAkB,CAAiB;AAAA,EAC3D,CAAA,CAAC;AACJ;AAEA,SAAS,mBAAmB,OAAuB;AACjD,QAAM,eAAe;AAEd,SAAA,MAAM,WAAW,cAAc,GAAG;AAC3C;ACxCA,eAAsB,WAAW,gBAA8D;;AACvF,QAAA,UAAU,MAAM,aAAa,cAAc;AAE3C,QAAA,EAAE,QAAY,IAAA;AAEhB,MAAA;AACM,kBAAA,WAAA,mBAAQ,UAAU,SAAS;AAAA,MACjC,GAAG;AAAA,MACH;AAAA,IAAA;AAGI,UAAA,CAAC,UAAU,QAAQ,IAAI,MAAM,QAAQ,IAAI,GAAC,aAAQ,QAAQ,gBAAhB,mBAA6B,mBAAkB,SAC3F,gBAAgB,OAAO,IACvB,eAAe,OAAO,GAAG,gBAAgB,QAAQ,QAAQ,OAAO,CAAC,CAAC;AAE/D,WAAA,MAAM,qBAAqB,QAAQ;AAE1C,QAAI,CAAC,SAAS;AACN,YAAA,IAAI,MAAM,yBAAyB,SAAS,MAAM,IAAI,SAAS,UAAU,EAAE;AAEnF,UAAM,SAAS,cAAe,MAAM,SAAS,KAAkB,CAAA;AACxD,WAAA,MAAM,aAAa,MAAM;AAEhC,QAAI,SAAS,SAAS;AACb,aAAA,KAAK,SAAS,SAAS,MAAM,IAAI,SAAS,WAAW,IAAI,YAAY,UAAU,kDAAkD,QAAQ;AAE5I,UAAA,kBAAkB,SAAS,IAAI,CAAC,EAAE,UAAU,GAAG,cAAc;AACjE,YAAM,YAAY,OAAO,KAAK,QAAM,GAAG,UAAU,QAAQ,KAAK;AAEtD,aAAA;AAAA,QACN,UAAU,IAAG,uCAAW,aAAY,QAAQ;AAAA,QAC5C,GAAG;AAAA,MAAA;AAAA,IACL,CACD;AAED,QAAI,gBAAgB,SAAS;AACnB,oBAAA,WAAA,mBAAQ,gBAAgB,SAAS;AAErC,UAAA,eAAe,MAAM,cAAc;AAAA,MACvC,GAAG,OAAO,OAAO,CAAA,OAAM,CAAC,SAAS,KAAK,CAAA,YAAW,QAAQ,UAAU,GAAG,KAAK,CAAC;AAAA,MAC5E,GAAG;AAAA,IAAA,CACJ;AAED,QAAI,aAAa,WAAW;AACpB,YAAA,IAAI,MAAM,cAAc;AAExB,kBAAA,WAAA,mBAAQ,iBAAiB,SAAS;AAEnC,WAAA;AAAA,WAEF,OAAO;AACL,WAAA,MAAM,OAAO,KAAK,CAAC;AAClB,kBAAA,WAAA,mBAAQ,aAAa,SAAS;AAEhC,UAAA;AAAA,EACR;AACF;AAKA,eAAsB,UAAU;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAEgB;AACd,QAAM,CAAC,EAAE,IAAI,MAAM,WAAW;AAAA,IAC5B,OAAO,CAAC,IAAI;AAAA,IACZ,GAAG;AAAA,EAAA,CACJ;AAEM,SAAA;AACT;AC7FA,MAAM,CAAC,aAAa,QAAQ,IAAI,WAAe,UAAU;ACElD,SAAS,uBACd,EAAE,SAAS,IAAI,MAAAX,OAAM,WASnB;AACF,MAAI,YAA2B;AACzB,QAAA;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAAA,IACF,WAAW;AAAA,IACX,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,GAAG,QAAQ,QAAQ;AAAA,EAAA;AAGf,QAAA,gBAAgBY,gBAA6B,IAAI;AAEvD,QAAM,YAAYC,YAAAA,SAAS,MAAM,QAAQ,cAAc,KAAK,CAAC;AAE7D,QAAM,sBAAsB,IAAI,qBAAqB,CAAC,CAAC,KAAK,MAAM;AAChE,QAAI,QAAQ,QAAQ,uBAAuB,CAAC,cAAc,SAAS,IAAI;AACrE,YAAM,QAAQC,OAAA,MAAM,MAAM,mBAAmB,CAAC;AAE1C,UAAA,SAAS,aAAa,CAAC,WAAW;AAEpC,oBAAY,WAAW,MAAM;;AACf,sBAAA;AAER,eAAA,QAAG,UAAH,mBAAU,2BAA2B;AACvC,0BAAc,QAAQ,iBAAiB,GAAG,MAAM,yBAAyB;AAEzE,mBAAO,MAAM,wCAAwCd,MAAK,KAAK,EAAE;AAEzD,0BAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,OAAK,aAAQ,WAAR,qCAAsB,CAAE,CAAA;AAAA,UAC1E;AAAA,WACC,QAAQ;AAAA,MAAA,WAEJ,QAAQ,aAAa,WAAW;AACvC,qBAAa,SAAS;AACV,oBAAA;AAAA,MACd;AAAA,IACF;AAAA,EAAA,GACC;AAAA,IACD;AAAA,IACA,WAAW,MAAM,KAAK,EAAE,QAAQ,MAAM,CAAC,GAAG,MAAM,IAAI,GAAG;AAAA,EAAA,CACxD;AAEQ,WAAA,QAAQ,YAAgC,YAA6C;AACxF,QAAA;AACF,0BAAoB,UAAU,UAAU;AAEtC,QAAA,cAAc,QAAQ,QAAQ;AAChC,0BAAoB,QAAQ,UAAU;AAExC,WAAO,MAAM;AACP,UAAA;AACF,4BAAoB,UAAU,UAAU;AAAA,IAAA;AAAA,EAE9C;AAEAe,oBAAM,SAAS,OAAO;AACtB,UAAQ,QAAQ,KAAK;AAEd,SAAA,CAAC,WAAW,MAAY;;AAC7B,wBAAc,UAAd,mBAAqB;AACrB,wBAAoB,WAAW;AAAA,EAAA,CAChC;AACH;AC7EO,SAAS,8BAA8B,EAAE,IAAI,SAAS,SAAS,UAQlE;;AACI,QAAA,eAAeH,gBAAI,KAAK;AAE9B,QAAM,6BAA6B,IAAI,qBAAqB,CAAC,YAAY;AACvE,iBAAa,QAAQ,QAAQ,KAAK,CAAA,UAAS,MAAM,cAAc;AAE/D,QAAI,aAAa,OAAO;AACtB,OAAC,YAA2B;AACtB,YAAA,CAAC,GAAG,SAAS,QAAQ;AACvB,gBAAM,OAAO;AAET,cAAA,OAAO,GAAG,SAAS,MAAS;AAAA,MACjC,GAAA,EAAE,MAAM,OAAO,KAAK;AAAA,IACzB;AAAA,EAAA,GACC;AAAA,IACD,cAAY,aAAQ,uBAAR,mBAA4B,eAAc;AAAA,IACtD,WAAW;AAAA,EAAA,CACZ;AAEQ,WAAA,QAAQ,YAAgC,YAA6C;AACxF,QAAA;AACF,iCAA2B,UAAU,UAAU;AAE7C,QAAA;AACF,iCAA2B,QAAQ,UAAU;AAE/C,WAAO,MAAM;AACP,UAAA;AACF,mCAA2B,UAAU,UAAU;AAAA,IAAA;AAAA,EAErD;AAEAG,oBAAM,SAAS,OAAO;AACtB,UAAQ,QAAQ,KAAK;AAEd,SAAA,CAAC,cAAc,MAAY;AAChC,+BAA2B,WAAW;AAAA,EAAA,CACvC;AACH;AClCA,MAAM,kBAA8E;AAAA,EAClF,QAAQ;AAAA,EACR,QAAQ;AACV;AAKO,SAAS,WAAW,SAAkD;AAC3E,QAAM,QAAQC,YAAAA;AAEP,SAAA,MAAM,IAAI,MAAM;AACf,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACX,IAAA;AACE,UAAA,aAAaC,YAAAA,SAAS,IAAI,IAAI,OAAO,QAAQ,QAAQ,cAAc,EAAE,CAAC,CAAC;AAC7E,QAAI,gBAAsC;AAEtC,QAAA,OAAO,QAAQ,WAAW,UAAU;AACtC,sBAAgB,oBAAoB;AAAA,QAClC,UAAU;AAAA,QACV,SAAS,OAAO,YAAY,QAAQ,OAAO,IAAI,CAAQ,SAAA,CAAC,KAAK,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,MAAA,CAClF;AAAA,IACH;AAEA,UAAM,SAASL,YAAI,IAAA,gBAAgB,cAAc,aAAa,QAAQ,MAAgB;AACtF,aAAS,cAAc,WAAyB;AAC9C,aAAO,QAAQ;AAAA,IACjB;AAEM,UAAA,KAAKA,gBAAe,IAAI;AACxB,UAAA,aAAaA,YAAAA,IAAI,GAAG,KAAK;AAEzB,UAAAZ,QAAOa,qBAAS,MAAM,aAAa,QAAQ,UAAU,OAAO,OAAO,IAAI,CAAC;AACxEE,gBAAAA,MAAAf,OAAM,OAAO,SAAS,YAAY;;AACtC,UAAI,YAAY;AACd;AAEM,oBAAA,iBAAA,iCAAe,SAAS;AAE1B,YAAA,QAAQ,MAAMkB;AAEP;AAEb,SAAG,QAAQ;AACX,iBAAW,QAAQ;AAAA,IAAA,CACpB;AAED,UAAM,cAAc;AAEpB,UAAM,UAAUL,YAAA;AAAA,MAAS,MAAM;AAC7B,YAAI,EAAE,OAAO,sBAAsB,YAAY,CAAC;AACvC,iBAAA;AAET,YAAI,CAAC,YAAY;AACR,iBAAA;AAET,eAAO,SAAS,cAA2B,wBAAwB,OAAO,KAAK,MAAM,iBAAiB,GAAG,OAAO,eAAe,IAAI,OAAO,EAAE,EAAE;AAAA,MAChJ;AAAA,IAAA;AAGA,aAAS,aAAiC;;AACxC,UAAI,eAAe;AACjB,iBAAO,aAAQ,UAAR,mBAAe,cAAc,cAAa;AAEnD,eAAO,aAAQ,UAAR,mBAAe,aAAa,QAAQ,MAAM,oBAAoC;AAAA,IACvF;AAEA,UAAM,CAAC,cAAc,iCAAiC,IAAI,8BAA8B;AAAA,MACtF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAEKE,sBAAA,CAAC,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,eAAe,GAAG,CAAC,KAAK,MAAM;;AACrE,UAAI,CAAC,SAAU,SAASI,OAAAA,YAAY,OAAO,KAAK;AAC9C;AAEE,UAAA,mBAAmB,QAAQ,QAAQ;AACrC,cAAM,OAAO,KAAK;AAEZ,oBAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,OAAK,aAAQ,WAAR,qCAAsB,CAAE,CAAA;AAAA,IAAC,CAC1E;AAEK,UAAA;AAAA,MACJ;AAAA,MACA;AAAA,QACE,uBAAuB;AAAA,MACzB;AAAA,MACA;AAAA,MACA,MAAAnB;AAAA,MACA;AAAA,IAAA,CACD;AAEK,UAAA,iCAAiCY,gBAA6B,IAAI;AACxE,UAAM,sBAAsBC,YAAAA,SAAS,MAAM,QAAQ,+BAA+B,KAAK,CAAC;AAExF,mBAAeK,cAAyB;AAChC,YAAA,WAAW,MAAME,UAAa;AAAA,QAClC,MAAM;AAAA,UACJ,MAAMpB,MAAK;AAAA,UACX;AAAA,QACF;AAAA,QACA;AAAA,MAAA,CACD;AAED,iBAAW,QAAQ;AAEZ,aAAA;AAAA,IACT;AAEA,mBAAe,OAAO,YAAuC;;AAC3D,YAAM,eAAe;AACf,YAAA;AAEN,UAAI,WAAW,cAAc,GAAG,SAAS,WAAW,SAAS,MAAMkB;AAE/D,UAAA;AACS,qBAAA,aAAQ,mBAAR,iCAAyB,cAAa;AAExC,iBAAA,MAAM,YAAY,QAAQ;AAEjC,UAAA,CAAC,QAAQ,OAAO;AACZ,cAAA,QAAQ,oCAAoC,OAAO,KAAK;AACvD,eAAA,MAAM,OAAO,OAAO;AACrB,cAAA,IAAI,MAAM,KAAK;AAAA,MACvB;AAEA,UAAI,QAAQ;AACF,gBAAA,MAAM,MAAM,WAAW;AAEjC,UAAI,QAAQ,aAAa,YAAY,eAAe,UAAU;AAC5D,cAAM,WAAW,QAAQ,UAAU,YAAY,UAAU,QAAQ,KAAK;AAEhE,cAAA,QAAQ,UAAU,OAAO,QAAQ;AAAA,MAAA,OAEpC;AACH,wBAAgB,UAAU,EAAE,UAAU,QAAQ,KAAK;AAAA,MACrD;AAEA,UAAI,SAAS,qBAAqB,CAAC,+BAA+B,OAAO;AACxC,uCAAA,QAAQ,iBAAiB,SAAS,iBAAiB;AAElF,eAAO,MAAM,uCAAuClB,MAAK,KAAK,EAAE;AAAA,MAClE;AAEA,aAAO,MAAM,iBAAiB;AAAA,QAC5B,iBAAiB;AAAA,QACjB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,MAAA,CACD;AAEO,oBAAA,aAAA,iCAAW,QAAQ;AAEO;AAElC,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS,eAAqB;AAC5B,UAAI,CAAC,QAAQ;AACX;AAEF,cAAQ,MAAM,YAAY;AAClB,cAAA,MAAM,MAAM,WAAW;AACvB,cAAA,MAAM,MAAM,QAAQ;AACpB,cAAA,MAAM,MAAM,SAAS;AAAA,IAC/B;AAEA,aAAS,UAAgB;;AACV;AAEb,2CAA+B,UAA/B,mBAAsC;AAEtC,SAAG,QAAQ;AAEuB;AACP;AAE3B,oBAAQ,cAAR;AAEA,qDAAe;AAEf,YAAM,KAAK;AAAA,IACb;AAEO,WAAA;AAAA,MACL,UAAU,QAAQ;AAAA,MAClB,aAAa,QAAQ,eAAe;AAAA,MACpC;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CACD;AACH;AAEA,SAAS,eAAuC;AACxC,QAAA,cAAcY,gBAAI,KAAK;AAE7B,SAAO,YAAY;AACjB,UAAM,eAAe;AAErB,gBAAY,QAAQ;AAAA,EAAA,CACrB;AACM,SAAA;AACT;AC/NA,eAAsB,aACpB,SACoC;AACpC,QAAM,eAAe;AAEd,SAAA,MAAM,KAAK,SAAS,iBAA8B,SAAS,CAAC,EAChE,OAAO,CAAC,YAAY;;AACf,QAAA,CAAC,QAAQ,QAAQ;AACZ,aAAA;AAET,UAAMZ,QAAO;AAAA,MACX,QAAQ;AAAA,MACR,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,IAAA;AAGX,WAAA,GAAC,aAAQ,WAAR,iCAAmB,KAAK,CAAc,eAAA,WAAW,KAAK,UAAUA;AAAA,EACzE,CAAA,EACA,IAAI,CAAA,YAAW,WAAW;AAAA,IACzB,QAAQ,QAAQ,QAAQ;AAAA,IACxB,mBAAmB;AAAA,IACnB,MAAM,QAAQ,QAAQ;AAAA,IACtB;AAAA,EAAA,CACD,CAAC,EACD,OAAO,CAAA,SAAQ;;AAAA,cAAC,aAAQ,WAAR,iCAAmB,KAAK,gBAAc,WAAW,KAAK,UAAU,KAAK,KAAK;AAAA,GAAM;AACrG;ACOO,SAAS,kBAAkB;AAAA,EAChC,eAAe,CAAC;AAAA,EAChB;AACF,GAA8C;AAC5C,QAAM,QAAQgB,YAAAA;AAEP,SAAA,MAAM,IAAI,MAAM;AACrB,UAAM,QAAQK,YAAAA,gBAA6C,oBAAA,IAAyB,CAAA;AAEpFC,gBAAAA,YAAY,MAAM;;AACR,oBAAA,WAAA,mBAAQ,YAAY,SAAS,MAAM,KAAK,MAAM,OAAQ,CAAA;AAAA,IAAC,CAChE;AAED,aAAS,SAAoC;AACpC,aAAA,MAAM,KAAK,KAAK,EAAE,IAAI,CAAC,CAAG,EAAA,IAAI,MAAM,IAAI;AAAA,IACjD;AAEA,aAAS,IAAI,SAAkG;;AAC7G,YAAM,OAAO,WAAW;AAAA,QACtB,GAAG;AAAA,QACH,WAAAC;AAAA,QACA;AAAA,MAAA,CACD;AAED,eAASA,aAAkB;;AACnB,cAAA,OAAO,KAAK,KAAK,KAAK;AAC5B,eAAO,MAAM,gBAAgB;AAAA,UAC3B;AAAA,UACA,OAAO,MAAM,KAAK,KAAK;AAAA,QAAA,CACxB;AACO,SAAAC,MAAA,QAAA,WAAA,gBAAAA,IAAQ,WAAW,SAAS;AAAA,MACtC;AAEA,YAAM,IAAI,KAAK,KAAK,OAAO,IAAI;AAE/BT,kBAAAA,MAAM,KAAK,MAAM,CAAC,SAAS,iBAAiB;AACpC,cAAA,IAAI,SAAS,IAAI;AACvB,cAAM,OAAO,YAAY;AAAA,MAAA,CAC1B;AAED,aAAO,MAAM,cAAc;AAAA,QACzB;AAAA,QACA,OAAO,MAAM,KAAK,MAAM,QAAQ;AAAA,MAAA,CACjC;AAEO,oBAAA,WAAA,mBAAQ,QAAQ,SAAS;AAE1B,aAAA;AAAA,IACT;AAEA,mBAAeU,iBAAmD;AAChE,YAAM,WAAW,MAAMC;AAAAA,QACrB;AAAA,MAAA;AAGF,iBAAW,QAAQ;AACjB,cAAM,IAAI,KAAK,KAAK,OAAO,IAAI;AAE1B,aAAA;AAAA,IACT;AAEA,aAAS,IAAI1B,OAAsC;AAC1C,aAAA,MAAM,IAAIA,KAAI;AAAA,IACvB;AAEA,aAAS,UAAgB;AACZ,iBAAA,QAAQ,MAAM,OAAO;AAC9B,aAAK,QAAQ;AAEf,YAAM,MAAM;AACZ,YAAM,KAAK;AAAA,IACb;AAEA,eAAW,WAAW,cAAc;AAC9B,UAAA;AAAA,QACF,GAAG;AAAA,QACH,aAAa;AAAA,MAAA,CACd;AAAA,IACH;AAEO,WAAA;AAAA,MACL;AAAA,MACA;AAAA,MAAA,cACAyB;AAAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CACD;AACH;ACzHO,SAAS,mBAAmB,UAAmE;;AAC7F,eAAA,aAAA,gCAAW,oBAAoB,GAAG;AAEzC,SAAO,MAAA;;AAAM,YAAAD,MAAA,OAAO,aAAP,gBAAAA,IAAA,aAAkB,uBAAuB,GAAG;AAAA;AAC3D;ACPgB,SAAA,iBACd,SACA,eAC6C;AACvC,QAAA,iCAAiB;AAEvB,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE9C,MAAI,QAAQ;AACV,eAAW,IAAI,MAAM,KAAK,OAAO,SAAS,IAAI,CAAC;AAEjD,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ;AAAA,IACxC,GAAG,QAAQ,cAAc,CAAC;AAAA,IAC1B,IAAI,QAAQ,UAAU,QAAQ;AAAA,IAC9B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAI,cAAc,SAAS;AAAA,IAC3B,IAAI,KAAK,MAAM,KAAK,WAAW,GAAM,EAAE,SAAS;AAAA,EAAA,CACjD;AACY,eAAA,IAAI,KAAK,KAAK;AAEpB,SAAA;AACT;AAEO,SAAS,aAAa,eAA+C;AAC1E,MAAI,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,GAAG;AAC/E,WAAO,wBAAwB,OAAO;AACtC,WAAO,MAAM,uBAAuB;AAAA,EACtC;AAEA,SAAO,MAAM,+BAA+B;AAAA,IAC1C;AAAA,EAAA,CACD;AACH;AAEO,SAAS,gBAAyB;AACvC,SAAO,OAAO,SAAS,OAAO,SAAS,yBAAyB;AAClE;ACxCA,IAAI,aAAa;AAEjB,MAAM,CAAC,cAAc,SAAS,IAAI,WAAW,aAAa;AAAA,EACxD,MAAM,WAAW;AACF,iBAAA;AAEb,2CAAW;AAAA,EACb;AAAA,EACA,QAAQ;AACF,QAAA;AACW,qBAAE,MAAM,QAAQ,KAAK;AAAA,EACtC;AACF,CAAC;AC2BM,SAAS,aAAa,SAA0C;AACrE,QAAM,QAAQR,YAAAA;AAEP,SAAA,MAAM,IAAI,MAAM;AACrB,UAAM,gBAAgB;AAAA,MACpB,MAAM,eAAe,QAAQ,OAAO;AAAA,MACpC,UAAU,gBAAgB,QAAQ,OAAO;AAAA,MACzC,UAAU;AAAA,MACV,aAAa;AAAA,MACb,OAAO;AAAA,MACP,cAAc,CAAC;AAAA,MACf,oBAAoB;AAAA,MACpB,SAAS;AAAA,MACT,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,qBAAqB;AAAA,MACrB,SAAS,CAAC;AAAA,MACV,GAAG;AAAA,IAAA;AAEL,iBAAa,aAAa;AAE1B,UAAM,UAAUC,YAAAA,SAAS;AAAA,MACvB,UAAU,cAAc;AAAA,MACxB,SAAS,cAAc;AAAA,MACvB,OAAO,cAAc;AAAA,MACrB;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IAAA,CACuB;AAEzB,eAAW,CAAC,OAAO,MAAM,KAAK,cAAc,QAAQ,WAAW;AAC7D,aAAO,SAAS;AAAA,QACd;AAAA,QACA,SAAS,YAAY;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IACH;AAEA,YAAQ,SAAS;AAET,YAAA,YAAY,QAAQ,YACxB,gBAAgB;AAAA,MAChB,YAAY,GAAG,cAAc,QAAQ;AAAA,MACrC;AAAA,IAAA,CACD,IACC;AAEJ,aAAS,cAAuC;AAC9C,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS,YAAY,aAA2B;;AAC9C,cAAQ,WAAW;AACX,oBAAA,WAAA,mBAAQ,eAAe,SAAS;AAAA,IAC1C;AAEA,UAAM,gBAAgB,oBAAoB;AAAA,MACxC,UAAU;AAAA,MACV,SAAS,cAAc;AAAA,IAAA,CACxB;AAEO,YAAA,aAAa,iBAAiB,eAAe,aAAa;AAElEF,gBAAA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,WAAW;AAAA,MACb;AAAA,IAAA;AAGF,aAAS,qBAA2B;;AAClC,UAAI,QAAQ;AACV,sBAAQ,WAAR,mBAAgB,iBAAiB,SAAS,QAAQ;AAAA,IACtD;AAEA,mBAAe,gBAA+B;;AACtC,YAAA,QAAQ,cAAc;AACpB,oBAAA,eAAA,mBAAY,IAAI,MAAM;AACtB,oBAAA,eAAA,mBAAY,IAAI,MAAM;AAE9B,YAAM,uBAAuB;AAAA,IAC/B;AAEA,aAAS,aAAqC;AAC5C,aAAO,QAAQ;AAAA,IACjB;AAEA,aAAS,WAAW,YAA2B;;AAC7C,oBAAQ,eAAR,mBAAoB,IAAI,MAAM,aAAa,QAAQ;AACnD,cAAQ,UAAU;AAEV,oBAAA,WAAA,mBAAQ,cAAc,SAAS;AAAA,IACzC;AAEA,UAAM,cAAc,kBAAkB;AAAA,MACpC,cAAc,cAAc;AAAA,MAC5B;AAAA,IAAA,CACD;AACD,aAAS,SAAoC;AACpC,aAAA,YAAY,OAAO,KAAK;IACjC;AAEA,aAAS,IAAIf,OAAsC;AAC1C,aAAA,YAAY,IAAIA,KAAI;AAAA,IAC7B;AAEA,aAAS,QAAQ,aAAsD;AACrE,UAAI,CAAC;AACG,cAAA,IAAI,MAAM,8BAA8B;AAEzC,aAAA,YAAY,IAAI,WAAW;AAAA,IACpC;AAEA,mBAAeyB,gBAAmD;AAC1D,YAAA,YAAY,MAAM,YAAY,aAAa,KAAK,CAAA,GAAI,OAAO,CAAA,SAAQ,CAAC,KAAK,WAAW;AAE1F,UAAI,SAAS,UAAU;AACrB,eAAO;AAEH,YAAA,MAAM,MAAM,WAAW;AAAA,QAC3B,OAAO;AAAA,QACP;AAAA,MAAA,CACD;AAED,iBAAW,MAAM,KAAK;AACpB,cAAM,OAAO,YAAY,IAAI,GAAG,QAAQ;AAEpC,YAAA;AACF,eAAK,GAAG,QAAQ;AAAA,MACpB;AAEO,aAAA;AAAA,IACT;AAEA,mBAAe,cAAgC;;AACrC,cAAA,QAAQ,CAAC,QAAQ;AAEzB,UAAI,QAAQ,OAAO;AACjB,eAAO,wBAAwB,OAAO;AACtC,eAAO,MAAM,oBAAoB;AACzB,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,MAAI,OAEtC;AACH,eAAO,MAAM,qBAAqB;AAClC,eAAO,wBAAwB,MAAM;AAC7B,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAAA,MACvC;AAEA,aAAO,QAAQ;AAAA,IACjB;AAEA,mBAAe,yBAAwC;AAC/C,YAAA,SAAS,YAAY,YAAY,CAAA,GAAI,OAAO,CAAA,SAAQ,CAAC,KAAK,WAAW;AAE3E,UAAI,MAAM,WAAW;AACnB;AAEI,YAAA,MAAM,MAAM,WAAW;AAAA,QAC3B;AAAA,QACA;AAAA,MAAA,CACD;AAED,iBAAW,MAAM,KAAK;AACpB,cAAM,OAAO,YAAY,IAAI,GAAG,QAAQ;AAEpC,YAAA;AACF,eAAK,GAAG,QAAQ;AAAA,MACpB;AAAA,IACF;AAEM,UAAA,4BAA4B,mBAAmB,OAAO,SAAS;;AACnE,UAAI,CAAC,KAAK;AACR;AAEF,aAAO,MAAM,gCAAgC;AAAA,QAC3C;AAAA,MAAA,CACD;AAED,oBAAQ,eAAR,mBAAoB,IAAI,MAAM,KAAK;AAC3B,oBAAA,eAAA,mBAAY,OAAO;AAE3B,YAAM,uBAAuB;AAAA,IAAA,CAC9B;AAED,aAAS,UAAgB;;AACvB,oBAAc,QAAQ;AACtB,kBAAY,QAAQ;AACpB,oBAAc,QAAQ;AACI;AAC1B,oBAAQ,eAAR,mBAAoB;AACpB,aAAO,UAAU;AACjB,oBAAQ,WAAR,mBAAgB;AAChB,aAAO,KAAK,0BAA0B;AAEzB,qBAAE,MAAM,OAAO,KAAK;AAEnB;AAEd,YAAM,KAAK;AAAA,IACb;AAEA,WAAO,YAAY;;AACjB,WAAK,YAAY,OAAS,EAAA,UAAU,KAAK;AACvC,cAAM,uBAAuB,EAAE,MAAM,OAAO,KAAK;AAEnD,UAAI,cAAc;AAChB,cAAMA,cAAa;AAEjB,UAAA,cAAc,SAAS,OAAO,SAAS,OAAO,SAAS,mBAAmB,KAAK,cAAc;AACvF,sBAAA,WAAA,mBAAQ,YAAY,SAAS;AAEvC,UAAI,CAAC,MAAM;AACD;IAAA,CACX;AAES,gBAAE,MAAM,OAAO,KAAK;AAEvB,WAAA;AAAA,MACL,YAAY,QAAQ;AAAA,MACpB,QAAQ,QAAQ;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA,KAAK,YAAY;AAAA,MACjB,QAAQ,YAAY;AAAA,MACpB;AAAA,MACA,SAAS;AAAA,IAAA;AAAA,EACX,CACD;AACH;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../utils/src/waitForDomLoad/waitForDomLoad.ts","../../utils/src/eventManager/eventManager.ts","../../utils/src/uniqueId/uniqueId.ts","../../safeframe/src/main.ts","../src/slot/createSlot/createSlot.utils.ts","../src/impressionTracking/impressionTracking.ts","../src/queryDetector/queryDetector.ts","../src/hooks/createHook.ts","../src/hooks/onInit.ts","../../logger/src/createLogger/createLogger.ts","../src/logger/logger.ts","../src/hooks/onRequest.ts","../src/hooks/onResponse.ts","../src/requestAds/requestAds.schema.ts","../src/requestAds/requestAds.preview.ts","../src/requestAds/requestAds.utils.ts","../src/requestAds/requestAds.ts","../src/hooks/onRender.ts","../src/hooks/onSlotCreate.ts","../src/slot/createSlot/useViewabilityObserver.ts","../src/slot/createSlot/useRenderIntersectionObserver.ts","../src/slot/createSlot/createSlot.ts","../src/slot/findDomSlots/findDomSlots.ts","../src/slot/slotManager/slotManager.ts","../src/consent/tcfConsent.ts","../src/main.utils.ts","../src/hooks/onDispose.ts","../src/main.ts"],"sourcesContent":["export async function waitForDomLoad(): Promise<void> {\n return new Promise((resolve) => {\n function onDomLoad(): void {\n resolve();\n window.removeEventListener('DOMContentLoaded', onDomLoad);\n }\n\n if (document.readyState === 'loading')\n document.addEventListener('DOMContentLoaded', onDomLoad);\n else\n resolve();\n });\n}\n","type Event<T> = {\n /**\n * The listeners for this event. This is a set of functions that will be called when the event is dispatched.\n */\n listeners: Set<(data: T) => void | Promise<void>>;\n /**\n * Dispatches the event to all listeners. This is a synchronous operation.\n * @param data\n */\n dispatch(data: T): void;\n /**\n * Dispatches the event to all listeners. This is an asynchronous operation.\n * @param data\n */\n dispatchAsync(data: T): Promise<void>;\n /**\n * Adds a listener to the event.\n * @param listener\n */\n addListener(listener: (data: T) => void | Promise<void>): void;\n /**\n * Removes a listener from the event.\n * @param listener\n */\n removeListener(listener: (data: T) => void | Promise<void>): void;\n};\n\ntype EventManagerGroup<Events extends Record<string, unknown>> = {\n [Key in keyof Events]: Readonly<Event<Events[Key]>>;\n};\n\nexport type EventManager<Events extends Record<string, unknown>> = {\n /**\n * Disposes of all listeners and clears the event manager. After calling this method, the event manager is no longer usable.\n */\n dispose(): void;\n} & EventManagerGroup<Events>;\n\n/**\n * Creates a new event manager with the given event names.\n *\n * @typeParam Events The events that the event manager will handle and their data types.\n */\nexport function createEventManager<\n Events extends Record<Name, unknown>,\n Name extends Readonly<string | number | symbol> = keyof Events,\n>(): EventManager<Events> {\n const disposables = new Set<() => void>();\n\n function dispose(): void {\n for (const disposable of disposables)\n disposable();\n }\n\n return new Proxy<EventManager<Events>>({\n dispose,\n } as EventManager<Events>, {\n // eslint-disable-next-line ts/explicit-function-return-type\n get(target, key, receiver) {\n if (!(key in target) && typeof key === 'string') {\n const event = createEvent<Events[Name]>();\n\n disposables.add(() => {\n event.listeners.clear();\n });\n\n Reflect.set(target, key, event, receiver);\n }\n\n return Reflect.get(target, key, receiver);\n },\n });\n}\n\nfunction createEvent<T>(): Event<T> {\n const listeners = new Set<(data: T) => void | Promise<void>>();\n\n function dispatch(data: T): void {\n for (const listener of listeners)\n // eslint-disable-next-line no-void\n void listener(data);\n }\n\n async function dispatchAsync(data: T): Promise<void> {\n await Promise.allSettled(\n Array.from(listeners).map(listener => listener(data)),\n );\n }\n\n function addListener(listener: (data: T) => void | Promise<void>): void {\n listeners.add(listener);\n }\n\n function removeListener(listener: (data: T) => void | Promise<void>): void {\n listeners.delete(listener);\n }\n\n return {\n listeners,\n dispatch,\n dispatchAsync,\n addListener,\n removeListener,\n };\n}\n","const savedIds = new Set<string>();\n\nexport function uniqueId(): string {\n let id: string;\n\n do\n id = Math.random().toString(36).slice(2);\n while (savedIds.has(id));\n\n savedIds.add(id);\n\n return id;\n}\n","import { uniqueId } from '@utils';\nimport type { Ad, AdheseContext } from '@adhese/sdk';\nimport type { Config, Position } from './main.types';\n\nexport type SafeFrame = {\n config: Config;\n addPosition(positions: Ad, element: HTMLElement): Position;\n render(position: Position): Promise<void>;\n dispose(): void;\n};\n\nexport type SafeFrameOptions = {\n renderFile: string;\n context: AdheseContext;\n};\n\nexport function createSafeFrame({\n renderFile,\n context,\n}: SafeFrameOptions): SafeFrame {\n const safeFrame = window.$sf;\n\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const adhesePositions = new Set<Position>();\n\n const config = new safeFrame.host.Config({\n auto: false,\n debug: context.debug,\n renderFile,\n });\n\n function addPosition(ad: Ad, element: HTMLElement): Position {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n const html = (ad.ext === 'js' && ad.body) ? ad.body : ad.tag;\n\n if (typeof html !== 'string')\n throw new Error('Ad tag is not a string');\n\n const elementId = element.id || `ad-${ad.id}-${uniqueId()}`;\n\n element.id = elementId;\n\n const position = new safeFrame.host.Position({\n id: elementId,\n html,\n src: ad.ext === 'js' ? ad.swfSrc?.href : undefined,\n config: new safeFrame.host.PosConfig({\n id: elementId,\n w: Number(ad.width),\n h: Number(ad.height),\n size: `${Number(ad.width)}x${Number(ad.height)}`,\n tgt: html.includes('target=\"_self\"') ? '_self' : '_blank',\n dest: elementId,\n }),\n });\n\n adhesePositions.add(position);\n\n return position;\n }\n\n async function render(position: Position): Promise<void> {\n if (!safeFrame)\n throw new Error('SafeFrame not found');\n\n safeFrame.host.render(position);\n }\n\n function dispose(): void {\n }\n\n return {\n config,\n addPosition,\n render,\n dispose,\n };\n}\n","import type { Ad } from '@adhese/sdk';\n\nexport function renderIframe(ad: Ad, element: HTMLElement): void {\n const iframe = document.createElement('iframe');\n\n iframe.srcdoc = `\n <!DOCTYPE html>\n <html>\n <head>\n <style>\n body {\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n </style>\n </head>\n <body>\n ${String(ad.tag)}\n </body>\n `.replaceAll(/\\s+/g, ' ').trim();\n\n iframe.style.border = 'none';\n iframe.style.width = ad.width ? `${ad.width}px` : 'auto';\n iframe.style.height = ad.height ? `${ad.height}px` : 'auto';\n element.replaceChildren(iframe);\n}\n\nexport function renderInline(ad: Ad, element: HTMLElement): void {\n element.innerHTML = String(ad.tag);\n}\n\nexport function generateName(\n location: string,\n format: string,\n slot: string | undefined,\n): string {\n return `${location}${slot ? `${slot}` : ''}-${format}`;\n}\n","/**\n * Add a tracking pixel to the page to track impressions of the ad.\n * @param url The URL of the tracking pixel. The URL is part of the ad response.\n *\n * @returns The tracking pixel element.\n */\nexport function addTrackingPixel(url: URL | string): HTMLImageElement {\n const img = document.createElement('img');\n\n img.src = url.toString();\n img.style.height = '1px';\n img.style.width = '1px';\n img.style.margin = '-1px';\n img.style.border = '0';\n img.style.position = 'absolute';\n img.style.top = '0';\n\n return document.body.appendChild(img);\n}\n","import { debounce } from 'remeda';\nimport { logger } from '@adhese/sdk';\n\nexport type DeviceDetectorOptions = {\n queries?: Record<string, string>;\n onChange?(device: string): void | Promise<void>;\n};\n\nexport type QueryDetector = {\n /**\n * Map of passed media queries\n */\n queries: Map<string, MediaQueryList>;\n /**\n * Get the current active query\n */\n getQuery(): string;\n /**\n * Clean up all event listeners. After this the instance will no longer react to changes\n */\n dispose(): void;\n};\n\n/**\n * Create a query detector that will match a list of media queries and keeps track of the current matching query\n *\n * @param options\n * @param options.onChange - Callback to fire when the device changes\n * @param options.queries Map of devices, and it's media query to match\n */\nexport function createQueryDetector(\n {\n onChange,\n queries = {\n mobile: '(max-width: 768px) and (pointer: coarse)',\n tablet: '(min-width: 769px) and (max-width: 1024px) and (pointer: coarse)',\n desktop: '(min-width: 1025px) and (pointer: fine)',\n },\n }: DeviceDetectorOptions = {},\n): QueryDetector {\n const mediaMap = new Map(\n Object.entries(queries).map(([key, query]) => [key, window.matchMedia(query)]),\n );\n\n function getQuery(): string {\n for (const [device, query] of Object.entries(queries)) {\n if (window.matchMedia(query).matches)\n return device;\n }\n\n return 'unknown';\n }\n\n const handleOnChange = debounce((): void => {\n // eslint-disable-next-line no-void\n void onChange?.(getQuery());\n\n logger.debug(`Change device ${getQuery()}`);\n }, {\n waitMs: 50,\n });\n\n if (onChange) {\n for (const query of mediaMap.values())\n query.addEventListener('change', handleOnChange.call);\n }\n\n function dispose(): void {\n for (const query of mediaMap.values())\n query.removeEventListener('change', handleOnChange.call);\n }\n\n return {\n queries: mediaMap,\n getQuery,\n dispose,\n };\n}\n","const hookMap = new Map<string, Set<Function>>();\n\nexport function clearAllHooks(): void {\n hookMap.clear();\n}\n\nexport function createAsyncHook<\n Argument = void,\n Callback extends (() => void | Promise<void>) | ((arg: Argument) => Argument | void | Promise<Argument | void>) = Argument extends void ?\n () => void | Promise<void> :\n (arg: Argument) => Argument | void | Promise<Argument | void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = (async (arg) => {\n let latestResult: Argument = arg;\n\n for (const callback of hookMap.get(name) ?? [])\n // eslint-disable-next-line no-await-in-loop\n latestResult = (await callback(latestResult) as Argument) ?? latestResult;\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as Argument extends void ? () => Promise<void> : (arg: Argument) => Promise<Argument>;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nexport function createSyncHook<\n Argument = void,\n Callback extends (arg: Argument) => Argument | void | Promise<void> = (arg: Argument) => Argument | void | Promise<void>,\n>(\n name: string,\n {\n onRun,\n onAdd,\n }: {\n onRun?(callbacks?: Set<Callback>): void;\n onAdd?(callbacks?: Set<Callback>): void;\n } = {},\n): [\n run: (arg: Argument) => Argument,\n add: (callback: Callback) => () => void,\n ] {\n hookMap.set(name, new Set<Callback>());\n\n const run = ((arg) => {\n let latestResult: Argument = arg;\n\n const promisedCallbacks: Array<Callback> = [];\n\n for (const callback of hookMap.get(name) ?? []) {\n if (isCallbackAsync(callback))\n promisedCallbacks.push(callback as Callback);\n else\n latestResult = callback(latestResult) as Argument ?? latestResult;\n }\n\n // eslint-disable-next-line no-console\n Promise.allSettled(promisedCallbacks.map(callback => callback(latestResult) as Argument)).catch(console.trace);\n\n onRun?.(hookMap.get(name) as Set<Callback>);\n\n return latestResult;\n }) as (arg: Argument) => Argument;\n\n return [run, (callback): () => void => add<Callback>(callback, { name, onAdd })];\n}\n\nfunction add<Callback extends Function>(callback: Callback, {\n name,\n onAdd,\n}: {\n name: string;\n onAdd?(hookSet: Set<Callback>): void;\n}): () => void {\n const hookSet = hookMap.get(name);\n\n if (hookSet)\n hookSet.add(callback);\n else\n hookMap.set(name, new Set([callback]));\n\n onAdd?.(hookSet as Set<Callback>);\n\n return () => {\n hookMap.get(name)?.delete(callback);\n };\n}\n\nfunction isCallbackAsync(callback: Function): boolean {\n return callback.constructor.name === 'AsyncFunction';\n}\n","import { createSyncHook } from './createHook';\n\nlet resolveOnInitPromise = (): void => {};\nlet isInit = false;\nconst waitOnInit = new Promise<void>((resolve) => {\n resolveOnInitPromise = resolve;\n});\n\nconst [runOnInit, onInit] = createSyncHook('onInit', {\n onRun(callbacks) {\n isInit = true;\n\n resolveOnInitPromise();\n\n callbacks?.clear();\n },\n onAdd() {\n if (isInit)\n runOnInit();\n },\n});\n\nexport {\n onInit,\n runOnInit,\n waitOnInit,\n};\n","import { createEventManager, uniqueId } from '@utils';\n\n/**\n * A log entry saved by the logger\n */\nexport type Log<T extends string> = {\n /**\n * The scope of the logger that created this log entry\n */\n scope: string;\n /**\n * The log level of this log entry\n */\n level: T;\n /**\n * The message of this log entry\n */\n message: string;\n /**\n * The attributes of this log entry\n */\n attributes?: unknown;\n /**\n * The timestamp of this log entry\n */\n timestamp: number;\n id: string;\n};\n\nexport type LogFunction = (message: string, attributes?: unknown) => void;\nexport type Logger<T extends string> = {\n [key in T]: LogFunction;\n} & {\n /**\n * The scope of the logger\n */\n readonly scope: string;\n /**\n * The event manager of the logger\n */\n events: ReturnType<typeof createEventManager<{\n log: Log<T>;\n reset: void;\n }>>;\n /**\n * Set the minimum log level threshold\n */\n setMinLogLevelThreshold(level: T): void;\n /**\n * Reset the minimum log level threshold to the default value\n */\n resetMinLogLevelThreshold(): void;\n /**\n * Get the current minimum log level threshold\n */\n getMinLogLevelThreshold(): T;\n /**\n * Get the logs that were created by this logger\n */\n getLogs(): ReadonlyArray<Log<T>>;\n /**\n * Reset the logs that were created by this logger\n */\n resetLogs(): void;\n};\n\nexport type LoggerOptions<T extends string, U extends T = T> = {\n /**\n * The scope of the logger\n */\n scope: string;\n /**\n * The log levels of the logger in order of priority\n *\n * @default ['trace', 'debug', 'info', 'warn', 'error']\n */\n logLevels?: ReadonlyArray<T>;\n /**\n * The minimum log level threshold of the logger. Needs to be one of the log levels in the `logLevels` array\n *\n * @default 'info' or the third log level in the `logLevels` array\n */\n minLogLevelThreshold?: U;\n};\n\nconst defaultLogLevels = ['trace', 'debug', 'info', 'warn', 'error'] as const;\n\n/**\n * Create a logger instance with the given options\n */\nexport function createLogger<T extends string = typeof defaultLogLevels[number], U extends T = T>({\n scope,\n logLevels = defaultLogLevels as unknown as ReadonlyArray<T>,\n minLogLevelThreshold = logLevels[2] as U,\n}: LoggerOptions<T, U>): Logger<T> {\n const logs = new Set<Log<T>>();\n let currentMinLogLevelThreshold: T = minLogLevelThreshold;\n const events = createEventManager<{\n log: Log<T>;\n reset: void;\n }>();\n\n const logFunctions = Object.fromEntries(logLevels.map((level, index) => {\n const logFunction: LogFunction = (message, attributes) => {\n logs.add({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n events.log.dispatch({\n scope,\n level,\n message,\n attributes,\n timestamp: Date.now(),\n id: uniqueId(),\n });\n\n if (index >= logLevels.indexOf(currentMinLogLevelThreshold)) {\n if ((['warn', 'error', 'trace'] as ReadonlyArray<string>).includes(level)) {\n // eslint-disable-next-line no-console\n console[level as typeof defaultLogLevels[number]](...[\n `%c${scope}`,\n 'color: red; font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n else {\n // eslint-disable-next-line no-console\n console.log(...[\n `%c${scope} %c${level.toUpperCase()}`,\n 'color: red; font-weight: bold;',\n 'font-weight: bold;',\n message,\n attributes,\n ].filter(Boolean));\n }\n }\n };\n\n return [level, logFunction];\n })) as {\n [key in T]: LogFunction;\n };\n\n return {\n ...logFunctions,\n scope,\n events,\n setMinLogLevelThreshold(level: T): void {\n currentMinLogLevelThreshold = level;\n },\n resetMinLogLevelThreshold(): void {\n currentMinLogLevelThreshold = minLogLevelThreshold;\n },\n getMinLogLevelThreshold(): T {\n return currentMinLogLevelThreshold;\n },\n getLogs(): ReadonlyArray<Log<T>> {\n return Array.from(logs) as ReadonlyArray<Log<T>>;\n },\n resetLogs(): void {\n events.reset.dispatch();\n logs.clear();\n },\n };\n}\n","import { createLogger } from '@logger';\n\nexport const logger = createLogger({\n scope: 'Adhese SDK',\n});\n","import type { AdRequestOptions } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRequest, onRequest] = createAsyncHook<AdRequestOptions>('onRequest');\n\nexport { runOnRequest, onRequest };\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnResponse, onResponse] = createAsyncHook<ReadonlyArray<Ad>>('onResponse');\n\nexport { runOnResponse, onResponse };\n","import {\n NEVER,\n type TypeOf,\n ZodIssueCode,\n type ZodType,\n coerce,\n lazy,\n literal,\n number,\n object,\n string,\n union,\n unknown,\n} from 'zod';\n\nexport const numberLike = union([coerce.string().regex(/^\\d+$/), literal('')]).transform(value => value === '' ? undefined : Number(value));\nexport const booleanLike = union([coerce.boolean(), literal('')]);\nexport const urlLike = union([coerce.string(), literal('')]).transform((value) => {\n try {\n return new URL(value);\n }\n catch {\n return undefined;\n }\n});\nexport const dateLike = union([coerce.string(), literal('')]).transform((value) => {\n if (value === '')\n return undefined;\n\n const date = new Date(numberLike.safeParse(value).success ? Number(value) : value);\n\n if (Number.isNaN(date.getTime()))\n return undefined;\n\n return date;\n});\n\nexport const cssValueLike\n = union([coerce.string(), literal(''), number()]).transform<string | undefined>((value) => {\n if (value === '' || value === 0 || value === '0')\n return undefined;\n\n if (numberLike.parse(value))\n return `${numberLike.parse(value)}px`;\n\n return String(value);\n });\n\nexport const isJson = string().transform((value, { addIssue }) => {\n try {\n return JSON.parse(value.replaceAll('\\'', '\"')) as Record<string, unknown> | ReadonlyArray<unknown>;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: `Invalid JSON: ${(error as Error).message}`,\n });\n\n return NEVER;\n }\n});\n\nexport const isHtmlString = string().transform((value, { addIssue }) => {\n const htmlParser = new DOMParser();\n\n try {\n const html = htmlParser.parseFromString(value, 'text/html');\n\n if (html.body?.children.length === 0)\n throw new Error('Invalid HTML');\n\n return value;\n }\n catch (error) {\n addIssue({\n code: ZodIssueCode.custom,\n message: (error as Error).message,\n });\n\n return NEVER;\n }\n});\n\nexport const isJsonOrHtmlString = union([isJson, isHtmlString]);\n\nexport const isJsonOrHtmlOptionalString = union([coerce.string(), isJsonOrHtmlString]).transform((value) => {\n if (value === '')\n return undefined;\n\n return value;\n}).optional();\n\nconst baseSchema = object({\n adDuration: numberLike.optional(),\n adFormat: string().optional(),\n adType: string(),\n additionalCreativeTracker: urlLike.optional(),\n additionalViewableTracker: string().optional(),\n adspaceEnd: dateLike.optional(),\n adspaceId: string().optional(),\n adspaceKey: string().optional(),\n adspaceStart: dateLike.optional(),\n advertiserId: string().optional(),\n altText: string().optional(),\n auctionable: booleanLike.optional(),\n body: isJsonOrHtmlOptionalString,\n clickTag: urlLike.optional(),\n comment: string().optional(),\n creativeName: string().optional(),\n deliveryGroupId: string().optional(),\n deliveryMultiples: string().optional(),\n ext: string().optional(),\n extension: object({\n mediaType: string(),\n prebid: unknown().optional(),\n }).optional(),\n height: numberLike.optional(),\n id: string(),\n impressionCounter: urlLike.optional(),\n libId: string().optional(),\n orderId: string().optional(),\n orderName: string().optional(),\n orderProperty: string().optional(),\n origin: union([literal('JERLICIA'), literal('DALE')]),\n originData: unknown().optional(),\n originInstance: string().optional(),\n poolPath: urlLike.optional(),\n preview: booleanLike.optional(),\n priority: numberLike.optional(),\n sfSrc: urlLike.optional(),\n share: string().optional(),\n // eslint-disable-next-line ts/naming-convention\n slotID: string(),\n slotName: string(),\n swfSrc: urlLike.optional(),\n tag: isJsonOrHtmlOptionalString,\n tagUrl: urlLike.optional(),\n timeStamp: dateLike.optional(),\n trackedImpressionCounter: urlLike.optional(),\n tracker: urlLike.optional(),\n trackingUrl: urlLike.optional(),\n url: urlLike.optional(),\n viewableImpressionCounter: urlLike.optional(),\n width: numberLike.optional(),\n widthLarge: cssValueLike.optional(),\n});\n\nexport const jerliciaSchema = object({\n origin: literal('JERLICIA'),\n tag: isJsonOrHtmlString,\n}).passthrough();\n\nexport const daleSchema = object({\n origin: literal('DALE'),\n body: isJsonOrHtmlString,\n}).passthrough().transform(({ body, ...data }) => ({\n ...data,\n tag: body,\n}));\n\nexport type AdResponse = (TypeOf<typeof baseSchema> & {\n additionalCreatives?: ReadonlyArray<AdResponse> | string;\n});\n\nconst adResponseSchema: ZodType<AdResponse> = baseSchema.extend({\n additionalCreatives: lazy(() => union([adResponseSchema.array(), string()]).optional()),\n}) as ZodType<AdResponse>;\n\nexport type PreParsedAd = TypeOf<typeof adResponseSchema> & {\n additionalCreatives?: ReadonlyArray<PreParsedAd> | string;\n};\n\nexport type Ad<T = string | Record<string, unknown> | ReadonlyArray<unknown>> = Omit<PreParsedAd, 'tag'> & {\n tag: T | string;\n};\n\nexport const adSchema: ZodType<PreParsedAd> = adResponseSchema.transform(({\n additionalCreatives,\n ...data\n}) => {\n const filteredValue = Object.fromEntries(\n Object.entries(data)\n .filter(([, value]) =>\n Boolean(value)\n && JSON.stringify(value) !== '{}'\n && JSON.stringify(value) !== '[]'),\n ) as typeof data;\n\n return ({\n ...filteredValue,\n additionalCreatives: Array.isArray(additionalCreatives) ? additionalCreatives.map(creative => adSchema.parse(creative)) : additionalCreatives,\n });\n});\n\nexport function parseResponse(response: unknown): ReadonlyArray<Ad> {\n const schemaMap = {\n /* eslint-disable ts/naming-convention */\n JERLICIA: jerliciaSchema,\n DALE: daleSchema,\n /* eslint-enable ts/naming-convention */\n };\n\n const preParsed = adResponseSchema.array().parse(response);\n\n return preParsed.map((item) => {\n const schema = schemaMap[item.origin];\n\n if (!schema)\n return adSchema.parse(item);\n\n return schema.parse(item);\n }) as ReadonlyArray<Ad>;\n}\n","import { logger } from '@adhese/sdk';\nimport { type Ad, adSchema } from './requestAds.schema';\n\nexport async function requestPreviews(account: string): Promise<ReadonlyArray<Ad>> {\n const previewObjects = getPreviewObjects();\n\n const list = (await Promise.allSettled(previewObjects\n .filter(previewObject => 'adhesePreviewCreativeId' in previewObject)\n .map(async (previewObject) => {\n const endpoint = new URL(`https://${account}-preview.adhese.org/creatives/preview/json/tag.do`);\n endpoint.searchParams.set(\n 'id',\n previewObject.adhesePreviewCreativeId,\n );\n\n const response = await fetch(endpoint.href, {\n method: 'GET',\n headers: {\n accept: 'application/json',\n },\n });\n\n if (!response.ok)\n return Promise.reject(new Error(`Failed to request preview ad with ID: ${previewObject.adhesePreviewCreativeId}`));\n\n return await response.json() as unknown;\n })))\n .filter((response): response is PromiseFulfilledResult<ReadonlyArray<Record<string, unknown>>> => {\n if (response.status === 'rejected') {\n logger.error(response.reason as string);\n return false;\n }\n return response.status === 'fulfilled';\n })\n .map(response => response.value.map(item => ({\n ...item,\n preview: true,\n })));\n\n return adSchema.array().parse(list.flat()) as ReadonlyArray<Ad>;\n}\n\nfunction getPreviewObjects(): ReadonlyArray<Record<string, string>> {\n const currentUrl = new URL(window.location.href);\n\n const previewObjects: Array<Record<string, string>> = [];\n let currentObject: Record<string, string> = {};\n\n for (const [key, value] of currentUrl.searchParams.entries()) {\n if (key === 'adhesePreviewCreativeId' && Object.keys(currentObject).length > 0) {\n previewObjects.push(currentObject);\n currentObject = {};\n }\n\n currentObject[key] = value;\n }\n\n if (Object.keys(currentObject).length > 0)\n previewObjects.push(currentObject);\n\n return previewObjects;\n}\n","import { toValue } from '@vue/runtime-core';\nimport { type AdRequestOptions, logger } from '@adhese/sdk';\n\ntype AdPostPayload = {\n slots: ReadonlyArray<{\n slotname: string;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n }>;\n parameters?: Record<string, ReadonlyArray<string> | string>;\n};\n\nexport function requestWithPost({\n context: { options: { host }, parameters },\n ...options\n}: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n const payload = {\n ...options,\n slots: options.slots.map(slot => ({\n slotname: toValue(slot.name),\n parameters: parseParameters(slot.parameters),\n })),\n parameters: parameters && parseParameters(parameters),\n } satisfies AdPostPayload;\n\n return fetch(`${new URL(host).href}json`, {\n method: 'POST',\n body: JSON.stringify(payload),\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport async function requestWithGet({ context, slots }: Omit<AdRequestOptions, 'method'>): Promise<Response> {\n return fetch(new URL(`${context.options.host}/json/sl${slots.map(slot => toValue(slot.name)).join('/sl')}`), {\n method: 'GET',\n headers: {\n // eslint-disable-next-line ts/naming-convention\n 'Content-Type': 'application/json',\n },\n });\n}\n\nexport function parseParameters<T extends string | ReadonlyArray<string>>(parameters: Map<string, T>): Record<string, T> {\n return Object.fromEntries(Array.from(parameters.entries()).filter(([key]) => {\n if (key.length === 2)\n return true;\n\n logger.warn(`Invalid parameter key: ${key}. Key should be exactly 2 characters long. Key will be ignored.`);\n return false;\n }).map(([key, value]): [string, T] => {\n if (typeof value === 'string')\n return [key, filterSpecialChars(value) as T];\n\n return [key, value.map(filterSpecialChars) as unknown as T];\n }));\n}\n\nfunction filterSpecialChars(value: string): string {\n const specialRegex = /[^\\p{L}\\p{N}_]/gu;\n\n return value.replaceAll(specialRegex, '_');\n}\n","import type { MaybeRef } from '@vue/runtime-core';\nimport type { AdheseContext } from '../main.types';\nimport { logger } from '../logger/logger';\nimport { runOnRequest } from '../hooks/onRequest';\nimport { runOnResponse } from '../hooks/onResponse';\nimport { type Ad, parseResponse } from './requestAds.schema';\nimport { requestPreviews } from './requestAds.preview';\nimport { requestWithGet, requestWithPost } from './requestAds.utils';\n\nexport type AdRequestOptions = {\n /**\n * List of slots you want to fetch the ad for\n */\n slots: ReadonlyArray<{\n name: MaybeRef<string>;\n parameters: Map<string, ReadonlyArray<string> | string>;\n }>;\n context: AdheseContext;\n};\n\n/**\n * Request multiple ads at once from the API\n */\nexport async function requestAds(requestOptions: AdRequestOptions): Promise<ReadonlyArray<Ad>> {\n const options = await runOnRequest(requestOptions);\n\n const { context } = options;\n\n try {\n context.events?.requestAd.dispatch({\n ...options,\n context,\n });\n\n const [response, previews] = await Promise.all([context.options.requestType?.toUpperCase() === 'POST'\n ? requestWithPost(options)\n : requestWithGet(options), requestPreviews(context.options.account)]);\n\n logger.debug('Received response', response);\n\n if (!response.ok)\n throw new Error(`Failed to request ad: ${response.status} ${response.statusText}`);\n\n const result = parseResponse((await response.json() as unknown));\n logger.debug('Parsed ad', result);\n\n if (previews.length > 0)\n logger.info(`Found ${previews.length} ${previews.length === 1 ? 'preview' : 'previews'}. Replacing ads in response with preview items`, previews);\n\n const matchedPreviews = previews.map(({ slotName, ...preview }) => {\n const partnerAd = result.find(ad => ad.libId === preview.libId);\n\n return ({\n slotName: `${partnerAd?.slotName ?? slotName}`,\n ...preview,\n });\n });\n\n if (matchedPreviews.length > 0)\n context.events?.previewReceived.dispatch(matchedPreviews);\n\n const mergedResult = await runOnResponse([\n ...result.filter(ad => !previews.some(preview => preview.libId === ad.libId)),\n ...matchedPreviews,\n ]);\n\n if (mergedResult.length === 0)\n throw new Error('No ads found');\n\n context.events?.responseReceived.dispatch(mergedResult);\n\n return mergedResult;\n }\n catch (error) {\n logger.error(String(error));\n context.events?.requestError.dispatch(error as Error);\n\n throw error;\n }\n}\n\n/**\n * Request a single ad from the API. If you need to fetch multiple ads at once use the `requestAds` function.\n */\nexport async function requestAd({\n slot,\n ...options\n}: Omit<AdRequestOptions, 'slots'> & {\n slot: AdRequestOptions['slots'][number];\n}): Promise<Ad> {\n const [ad] = await requestAds({\n slots: [slot],\n ...options,\n });\n\n return ad;\n}\n","import type { Ad } from '@adhese/sdk';\nimport { createAsyncHook } from './createHook';\n\nconst [runOnRender, onRender] = createAsyncHook<Ad>('onRender');\n\nexport { runOnRender, onRender };\n","import type { AdheseSlotOptions } from '@adhese/sdk';\nimport { createSyncHook } from './createHook';\n\nconst [runOnSlotCreate, onSlotCreate] = createSyncHook<AdheseSlotOptions>('onSlotCreate');\n\nexport { runOnSlotCreate, onSlotCreate };\n","import { type ComputedRef, type Ref, computed, ref, watch } from '@vue/runtime-core';\nimport { round } from 'remeda';\nimport { type Ad, type AdheseContext, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\n\nexport function useViewabilityObserver(\n { context, ad, name, element }: {\n context: AdheseContext;\n ad: Ref<Ad | null>;\n name: ComputedRef<string>;\n element: ComputedRef<HTMLElement | null>;\n },\n): [\n ComputedRef,\n IntersectionObserver['disconnect'],\n ] {\n let timeoutId: number | null = null;\n const {\n threshold,\n duration,\n rootMargin,\n } = {\n threshold: 0.2,\n duration: 1000,\n rootMargin: '0px',\n ...context.options.viewabilityTrackingOptions,\n } satisfies Required<typeof context.options.viewabilityTrackingOptions>;\n\n const trackingPixel = ref<HTMLImageElement | null>(null);\n\n const isTracked = computed(() => Boolean(trackingPixel.value));\n\n const viewabilityObserver = new IntersectionObserver(([entry]) => {\n if (context.options.viewabilityTracking && !trackingPixel.value && ad) {\n const ratio = round(entry.intersectionRatio, 1);\n\n if (ratio >= threshold && !timeoutId) {\n // @ts-expect-error The is misfiring to the Node type\n timeoutId = setTimeout(() => {\n timeoutId = null;\n\n if (ad.value?.viewableImpressionCounter) {\n trackingPixel.value = addTrackingPixel(ad.value.viewableImpressionCounter);\n\n logger.debug(`Viewability tracking pixel fired for ${name.value}`);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n }\n }, duration);\n }\n else if (ratio < threshold && timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = null;\n }\n }\n }, {\n rootMargin,\n threshold: Array.from({ length: 11 }, (_, i) => i * 0.1),\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n viewabilityObserver.unobserve(oldElement);\n\n if (newElement && context.options.viewabilityTracking)\n viewabilityObserver.observe(newElement);\n\n return () => {\n if (newElement)\n viewabilityObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isTracked, (): void => {\n trackingPixel.value?.remove();\n viewabilityObserver.disconnect();\n }];\n}\n","import { type Ref, ref, watch } from '@vue/runtime-core';\nimport { type Ad, type AdheseSlotOptions, logger } from '@adhese/sdk';\n\nexport function useRenderIntersectionObserver({ ad, options, element, render }: {\n ad: Ref<Ad | null>;\n options: AdheseSlotOptions;\n element: Ref<HTMLElement | null>;\n render(adToRender?: Ad): Promise<HTMLElement>;\n}): [\n Ref<boolean>,\n () => void,\n ] {\n const isInViewport = ref(false);\n\n const renderIntersectionObserver = new IntersectionObserver((entries) => {\n isInViewport.value = entries.some(entry => entry.isIntersecting);\n\n if (isInViewport.value) {\n (async (): Promise<void> => {\n if (!ad.value && options.lazyLoading)\n await render();\n\n await render(ad.value ?? undefined);\n })().catch(logger.error);\n }\n }, {\n rootMargin: options.lazyLoadingOptions?.rootMargin ?? '200px',\n threshold: 0,\n });\n\n function observe(newElement: HTMLElement | null, oldElement?: HTMLElement | null): () => void {\n if (oldElement)\n renderIntersectionObserver.unobserve(oldElement);\n\n if (newElement)\n renderIntersectionObserver.observe(newElement);\n\n return () => {\n if (newElement)\n renderIntersectionObserver.unobserve(newElement);\n };\n }\n\n watch(element, observe);\n observe(element.value);\n\n return [isInViewport, (): void => {\n renderIntersectionObserver.disconnect();\n }];\n}\n","import { waitForDomLoad } from '@utils';\nimport { type Ref, computed, effectScope, reactive, ref, watch } from '@vue/runtime-core';\nimport { isDeepEqual } from 'remeda';\nimport { type Ad, logger } from '@adhese/sdk';\nimport { addTrackingPixel } from '../../impressionTracking/impressionTracking';\nimport { type QueryDetector, createQueryDetector } from '../../queryDetector/queryDetector';\nimport { onInit, waitOnInit } from '../../hooks/onInit';\nimport { requestAd as extRequestAd } from '../../requestAds/requestAds';\nimport { runOnRender } from '../../hooks/onRender';\nimport { runOnSlotCreate } from '../../hooks/onSlotCreate';\nimport type { AdheseSlot, AdheseSlotOptions, RenderMode } from './createSlot.types';\nimport { generateName, renderIframe, renderInline } from './createSlot.utils';\nimport { useViewabilityObserver } from './useViewabilityObserver';\nimport { useRenderIntersectionObserver } from './useRenderIntersectionObserver';\n\nconst renderFunctions: Record<RenderMode, (ad: Ad, element: HTMLElement) => void> = {\n iframe: renderIframe,\n inline: renderInline,\n};\n\n/**\n * Create a new slot instance.\n */\nexport function createSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n const scope = effectScope();\n\n return scope.run(() => {\n const options = runOnSlotCreate(slotOptions);\n\n const {\n containingElement,\n slot,\n context,\n renderMode = 'iframe',\n } = options;\n const parameters = reactive(new Map(Object.entries(options.parameters ?? {})));\n let queryDetector: QueryDetector | null = null;\n\n if (typeof options.format !== 'string') {\n queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: Object.fromEntries(options.format.map(item => [item.format, item.query])),\n });\n }\n\n const format = ref(queryDetector ? queryDetector.getQuery() : options.format as string);\n function onQueryChange(newFormat: string): void {\n format.value = newFormat;\n }\n\n const ad = ref<Ad | null>(null);\n const originalAd = ref(ad.value);\n\n const name = computed(() => generateName(context.location, format.value, slot));\n watch(name, async (newName, oldName) => {\n if (newName === oldName)\n return;\n\n options.onNameChange?.(newName, oldName);\n\n const newAd = await requestAd();\n\n cleanElement();\n\n ad.value = newAd;\n originalAd.value = newAd;\n });\n\n const isDomLoaded = useDomLoaded();\n\n const element = computed(() => {\n if (!(typeof containingElement === 'string' || !containingElement))\n return containingElement;\n\n if (!isDomLoaded.value)\n return null;\n\n return document.querySelector<HTMLElement>(`.adunit[data-format=\"${format.value}\"]#${containingElement}${slot ? `[data-slot=\"${slot}\"]` : ''}`);\n },\n );\n\n function getElement(): HTMLElement | null {\n if (renderMode === 'iframe')\n return element.value?.querySelector('iframe') ?? null;\n\n return element.value?.innerHTML ? (element.value.firstElementChild as HTMLElement) : null;\n }\n\n const [isInViewport, disposeRenderIntersectionObserver] = useRenderIntersectionObserver({\n ad,\n options,\n element,\n render,\n });\n\n watch([ad, isInViewport], async ([newAd, newIsInViewport], [oldAd]) => {\n if (!newAd || (oldAd && isDeepEqual(newAd, oldAd)))\n return;\n\n if (newIsInViewport || context.options.eagerRendering)\n await render(newAd);\n\n context.events?.changeSlots.dispatch(Array.from(context.getAll?.() ?? []));\n });\n\n const [\n isViewabilityTracked,\n disposeViewabilityObserver,\n ] = useViewabilityObserver({\n context,\n ad,\n name,\n element,\n });\n\n const impressionTrackingPixelElement = ref<HTMLImageElement | null>(null);\n const isImpressionTracked = computed(() => Boolean(impressionTrackingPixelElement.value));\n\n async function requestAd(): Promise<Ad> {\n const response = await extRequestAd({\n slot: {\n name: name.value,\n parameters,\n },\n context,\n });\n\n originalAd.value = response;\n\n return response;\n }\n\n async function render(adToRender?: Ad): Promise<HTMLElement> {\n await waitForDomLoad();\n await waitOnInit;\n\n let renderAd = adToRender ?? ad.value ?? originalAd.value ?? await requestAd();\n\n if (renderAd)\n renderAd = options.onBeforeRender?.(renderAd) ?? renderAd;\n\n renderAd = await runOnRender(renderAd);\n\n if (!element.value) {\n const error = `Could not create slot for format ${format.value}. No element found.`;\n logger.error(error, options);\n throw new Error(error);\n }\n\n if (context.debug)\n element.value.style.position = 'relative';\n\n if (context.safeFrame && renderAd && renderMode === 'iframe') {\n const position = context.safeFrame.addPosition(renderAd, element.value);\n\n await context.safeFrame.render(position);\n }\n else {\n renderFunctions[renderMode](renderAd, element.value);\n }\n\n if (renderAd.impressionCounter && !impressionTrackingPixelElement.value) {\n impressionTrackingPixelElement.value = addTrackingPixel(renderAd.impressionCounter);\n\n logger.debug(`Impression tracking pixel fired for ${name.value}`);\n }\n\n logger.debug('Slot rendered', {\n renderedElement: element,\n location: context.location,\n format,\n containingElement,\n });\n\n options.onRender?.(element.value);\n\n // eslint-disable-next-line require-atomic-updates\n ad.value = renderAd;\n\n disposeRenderIntersectionObserver();\n\n return element.value;\n }\n\n function cleanElement(): void {\n if (!element.value)\n return;\n\n element.value.innerHTML = '';\n element.value.style.position = '';\n element.value.style.width = '';\n element.value.style.height = '';\n }\n\n function dispose(): void {\n cleanElement();\n\n impressionTrackingPixelElement.value?.remove();\n\n ad.value = null;\n\n disposeRenderIntersectionObserver();\n disposeViewabilityObserver();\n\n options.onDispose?.();\n\n queryDetector?.dispose();\n\n scope.stop();\n }\n\n return {\n location: context.location,\n lazyLoading: options.lazyLoading ?? false,\n slot,\n parameters,\n format,\n name,\n ad,\n isViewabilityTracked,\n isImpressionTracked,\n render,\n getElement,\n dispose,\n };\n })!;\n}\n\nfunction useDomLoaded(): Readonly<Ref<boolean>> {\n const isDomLoaded = ref(false);\n\n onInit(async () => {\n await waitForDomLoad();\n\n isDomLoaded.value = true;\n });\n return isDomLoaded;\n}\n","import { waitForDomLoad } from '@utils';\nimport { generateName } from '../createSlot/createSlot.utils';\nimport type { AdheseContext } from '../../main.types';\nimport type { AdheseSlot } from '../createSlot/createSlot.types';\nimport { createSlot } from '../createSlot/createSlot';\n\n/**\n * Find all slots in the DOM and render them. Ignore slots that are already active.\n */\nexport async function findDomSlots(\n context: AdheseContext,\n): Promise<ReadonlyArray<AdheseSlot>> {\n await waitForDomLoad();\n\n return Array.from(document.querySelectorAll<HTMLElement>('.adunit'))\n .filter((element) => {\n if (!element.dataset.format)\n return false;\n\n const name = generateName(\n context.location,\n element.dataset.format,\n element.dataset.slot,\n );\n\n return !context.getAll?.().some(activeSlot => activeSlot.name.value === name);\n })\n .map(element => createSlot({\n format: element.dataset.format as string,\n containingElement: element,\n slot: element.dataset.slot,\n context,\n }))\n .filter(slot => !context.getAll?.().some(activeSlot => activeSlot.name.value === slot.name.value));\n}\n","import type { Merge } from '@utils';\nimport { effectScope, shallowReactive, watch, watchEffect } from '@vue/runtime-core';\nimport { findDomSlots as extFindDomSlots } from '../findDomSlots/findDomSlots';\nimport type { AdheseSlot, AdheseSlotOptions } from '../createSlot/createSlot.types';\nimport type { AdheseContext } from '../../main.types';\nimport { createSlot } from '../createSlot/createSlot';\nimport { logger } from '../../logger/logger';\n\nexport type SlotManager = {\n /**\n * Returns all slots that are currently registered and rendered.\n */\n getAll(): ReadonlyArray<AdheseSlot>;\n /**\n * Adds a new slot to the Adhese instance and renders it.\n */\n add(slot: Omit<AdheseSlotOptions, 'context'>): Readonly<AdheseSlot>;\n /**\n * Finds all slots in the DOM and adds them to the Adhese instance.\n */\n findDomSlots(): Promise<ReadonlyArray<AdheseSlot>>;\n /**\n * Returns the slot with the given name.\n */\n get(name: string): AdheseSlot | undefined;\n /**\n * Removes all slots from the Adhese instance and cleans up the slot manager.\n */\n dispose(): void;\n};\n\nexport type SlotManagerOptions = {\n /**\n * List of initial slots to add to the slot manager.\n */\n initialSlots?: ReadonlyArray<Merge<Omit<AdheseSlotOptions, 'containingElement' | 'context' | 'lazy'>, {\n containingElement: string;\n }>>;\n context: AdheseContext;\n};\n\nexport function createSlotManager({\n initialSlots = [],\n context,\n}: SlotManagerOptions): Readonly<SlotManager> {\n const scope = effectScope();\n\n return scope.run(() => {\n const slots = shallowReactive<Map<string, AdheseSlot>>(new Map<string, AdheseSlot>());\n\n watchEffect(() => {\n context.events?.changeSlots.dispatch(Array.from(slots.values()));\n });\n\n function getAll(): ReadonlyArray<AdheseSlot> {\n return Array.from(slots).map(([, slot]) => slot);\n }\n\n function add(options: Omit<AdheseSlotOptions, 'context' | 'onDispose' | 'onNameChange'>): Readonly<AdheseSlot> {\n const slot = createSlot({\n ...options as AdheseSlotOptions,\n onDispose,\n context,\n });\n\n function onDispose(): void {\n slots.delete(slot.name.value);\n logger.debug('Slot removed', {\n slot,\n slots: Array.from(slots),\n });\n context.events?.removeSlot.dispatch(slot);\n }\n\n slots.set(slot.name.value, slot);\n\n watch(slot.name, (newName, previousName) => {\n slots.set(newName, slot);\n slots.delete(previousName);\n });\n\n logger.debug('Slot added', {\n slot,\n slots: Array.from(slots.values()),\n });\n\n context.events?.addSlot.dispatch(slot);\n\n return slot;\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = await extFindDomSlots(\n context,\n );\n\n for (const slot of domSlots)\n slots.set(slot.name.value, slot);\n\n return domSlots;\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slots.get(name);\n }\n\n function dispose(): void {\n for (const slot of slots.values())\n slot.dispose();\n\n slots.clear();\n scope.stop();\n }\n\n for (const options of initialSlots) {\n add({\n ...options,\n lazyLoading: false,\n });\n }\n\n return {\n getAll,\n add,\n findDomSlots,\n get,\n dispose,\n };\n })!;\n}\n","import type { ConsentData } from '../types';\n\n/**\n * Listen for TCF consent changes\n * @param callback - Callback function to be called when consent changes occur\n *\n * @returns Function to remove the listener\n */\nexport function onTcfConsentChange(callback: (data: ConsentData) => Promise<void> | void): () => void {\n window.__tcfapi?.('addEventListener', 2, callback);\n\n return () => window.__tcfapi?.('removeEventListener', 2, callback);\n}\n","import { logger } from './logger/logger';\nimport type { QueryDetector } from './queryDetector/queryDetector';\n\nimport type { AdheseContext, AdheseOptions } from './main.types';\n\nexport function createParameters(\n options: Pick<AdheseOptions, 'parameters' | 'consent' | 'logUrl' | 'logReferrer'>,\n queryDetector: QueryDetector,\n): Map<string, string | ReadonlyArray<string>> {\n const parameters = new Map<string, string | ReadonlyArray<string>>();\n\n if (options.logReferrer)\n parameters.set('re', btoa(document.referrer));\n\n if (options.logUrl)\n parameters.set('ur', btoa(window.location.href));\n\n for (const [key, value] of Object.entries({\n ...options.parameters ?? {},\n tl: options.consent ? 'all' : 'none',\n dt: queryDetector.getQuery(),\n br: queryDetector.getQuery(),\n rn: Math.round(Math.random() * 10_000).toString(),\n }))\n parameters.set(key, value);\n\n return parameters;\n}\n\nexport function setupLogging(mergedOptions: AdheseContext['options']): void {\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true')) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug logging enabled');\n }\n\n logger.debug('Created Adhese SDK instance', {\n mergedOptions,\n });\n}\n\nexport function isPreviewMode(): boolean {\n return window.location.search.includes('adhesePreviewCreativeId');\n}\n","import { createSyncHook } from './createHook';\n\nlet isDisposed = false;\n\nconst [runOnDispose, onDispose] = createSyncHook('onDispose', {\n onRun(callbacks) {\n isDisposed = true;\n\n callbacks?.clear();\n },\n onAdd() {\n if (isDisposed)\n runOnDispose();\n },\n});\n\nexport {\n onDispose,\n runOnDispose,\n};\n","import { createEventManager } from '@utils';\nimport { effectScope, reactive, watch } from '@vue/runtime-core';\nimport { createSafeFrame } from '@safeframe';\nimport packageJson from '../package.json';\nimport { createSlotManager } from './slot/slotManager/slotManager';\nimport { onTcfConsentChange } from './consent/tcfConsent';\nimport { createQueryDetector } from './queryDetector/queryDetector';\nimport { createParameters, isPreviewMode, setupLogging } from './main.utils';\nimport type { Adhese, AdheseContext, AdheseOptions, MergedOptions } from './main.types';\nimport { onInit, runOnInit } from './hooks/onInit';\nimport { onDispose, runOnDispose } from './hooks/onDispose';\nimport { logger } from './logger/logger';\nimport { requestAds } from './requestAds/requestAds';\nimport type { AdheseSlot, AdheseSlotOptions } from './slot/createSlot/createSlot.types';\nimport { clearAllHooks } from './hooks/createHook';\nimport { onResponse } from './hooks/onResponse';\nimport { onRender } from './hooks/onRender';\nimport { onRequest } from './hooks/onRequest';\nimport { onSlotCreate } from './hooks/onSlotCreate';\n\n/**\n * Creates an Adhese instance. This instance is your main entry point to the Adhese API.\n *\n * @param options\n * @param options.account The Adhese account name.\n * @param options.host The url that is used to connect to the Adhese ad server. Pass a custom URL if you want to use\n * your own domain for the connection.\n * @param options.poolHost The url that is used to connect to the Adhese pool server. Pass a custom URL if you want to\n * use your own domain for the connection.\n * @param options.location The page location. This is used to determine the current page location identifier.\n * @param options.requestType The requestAds type to use for the Adhese API requests. This can be either `GET` or\n * `POST`. `POST` is the default and offers the most options. `GET` is more limited as it needs pass its data as search\n * parameters but can be used in environments where `POST` requests are not allowed.\n * @param options.debug Enable debug logging.\n * @param options.initialSlots The initial slots to add to the Adhese instance.\n * @param options.findDomSlotsOnLoad Find all slots in the DOM and add them to the Adhese instance during\n * initialization.\n * @param options.parameters Base parameters that are used for all ads.\n * @param options.consent The consent type to use for the Adhese API requests. This can be either `all` or `none`.\n *\n * @return Promise<Adhese> The Adhese instance.\n */\nexport function createAdhese(options: AdheseOptions): Readonly<Adhese> {\n const scope = effectScope();\n\n return scope.run(() => {\n const mergedOptions = {\n host: `https://ads-${options.account}.adhese.com`,\n poolHost: `https://pool-${options.account}.adhese.com`,\n location: 'homepage',\n requestType: 'POST',\n debug: false,\n initialSlots: [],\n findDomSlotsOnLoad: false,\n consent: false,\n logReferrer: true,\n logUrl: true,\n safeFrame: false,\n eagerRendering: false,\n viewabilityTracking: true,\n plugins: [],\n ...options,\n } satisfies MergedOptions;\n setupLogging(mergedOptions);\n\n const context = reactive({\n location: mergedOptions.location,\n consent: mergedOptions.consent,\n debug: mergedOptions.debug,\n getAll,\n get,\n options: mergedOptions,\n logger,\n addSlot,\n } satisfies AdheseContext) as AdheseContext;\n\n for (const [index, plugin] of mergedOptions.plugins.entries()) {\n plugin(context, {\n index,\n version: packageJson.version,\n onInit,\n onDispose,\n onRender,\n onRequest,\n onResponse,\n onSlotCreate,\n });\n }\n\n context.events = createEventManager();\n\n context.safeFrame = options.safeFrame\n ? createSafeFrame({\n renderFile: `${mergedOptions.poolHost}/sf/r.html`,\n context,\n })\n : undefined;\n\n function getLocation(): typeof context.location {\n return context.location;\n }\n\n function setLocation(newLocation: string): void {\n context.location = newLocation;\n context.events?.locationChange.dispatch(newLocation);\n }\n\n const queryDetector = createQueryDetector({\n onChange: onQueryChange,\n queries: mergedOptions.queries,\n });\n\n context.parameters = createParameters(mergedOptions, queryDetector);\n\n watch(\n context.parameters,\n onParametersChange,\n {\n deep: true,\n immediate: true,\n },\n );\n\n function onParametersChange(): void {\n if (context.parameters)\n context.events?.parametersChange.dispatch(context.parameters);\n }\n\n async function onQueryChange(): Promise<void> {\n const query = queryDetector.getQuery();\n context.parameters?.set('dt', query);\n context.parameters?.set('br', query);\n\n await fetchAndRenderAllSlots();\n }\n\n function getConsent(): typeof context.consent {\n return context.consent;\n }\n\n function setConsent(newConsent: boolean): void {\n context.parameters?.set('tl', newConsent ? 'all' : 'none');\n context.consent = newConsent;\n\n context.events?.consentChange.dispatch(newConsent);\n }\n\n const slotManager = createSlotManager({\n initialSlots: mergedOptions.initialSlots,\n context,\n });\n function getAll(): ReadonlyArray<AdheseSlot> {\n return slotManager.getAll() ?? [];\n }\n\n function get(name: string): AdheseSlot | undefined {\n return slotManager.get(name);\n }\n\n function addSlot(slotOptions: AdheseSlotOptions): Readonly<AdheseSlot> {\n if (!slotManager)\n throw new Error('Slot manager not initialized');\n\n return slotManager.add(slotOptions);\n }\n\n async function findDomSlots(): Promise<ReadonlyArray<AdheseSlot>> {\n const domSlots = (await slotManager.findDomSlots() ?? []).filter(slot => !slot.lazyLoading);\n\n if (domSlots.length <= 0)\n return [];\n\n const ads = await requestAds({\n slots: domSlots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n\n return domSlots;\n }\n\n async function toggleDebug(): Promise<boolean> {\n context.debug = !context.debug;\n\n if (context.debug) {\n logger.setMinLogLevelThreshold('debug');\n logger.debug('Debug mode enabled');\n context.events?.debugChange.dispatch(true);\n }\n else {\n logger.debug('Debug mode disabled');\n logger.setMinLogLevelThreshold('info');\n context.events?.debugChange.dispatch(false);\n }\n\n return context.debug;\n }\n\n async function fetchAndRenderAllSlots(): Promise<void> {\n const slots = (slotManager.getAll() ?? []).filter(slot => !slot.lazyLoading);\n\n if (slots.length === 0)\n return;\n\n const ads = await requestAds({\n slots,\n context,\n });\n\n for (const ad of ads) {\n const slot = slotManager.get(ad.slotName);\n\n if (slot)\n slot.ad.value = ad;\n }\n }\n\n const disposeOnTcfConsentChange = onTcfConsentChange(async (data) => {\n if (!data.tcString)\n return;\n\n logger.debug('TCF v2 consent data received', {\n data,\n });\n\n context.parameters?.set('xt', data.tcString);\n context.parameters?.delete('tl');\n\n await fetchAndRenderAllSlots();\n });\n\n function dispose(): void {\n queryDetector.dispose();\n slotManager.dispose();\n queryDetector.dispose();\n disposeOnTcfConsentChange();\n context.parameters?.clear();\n logger.resetLogs();\n context.events?.dispose();\n logger.info('Adhese instance disposed');\n\n runOnDispose();\n\n clearAllHooks();\n\n scope.stop();\n }\n\n onInit(async () => {\n if ((slotManager.getAll().length ?? 0) > 0)\n await fetchAndRenderAllSlots().catch(logger.error);\n\n if (mergedOptions.findDomSlotsOnLoad)\n await findDomSlots();\n\n if (mergedOptions.debug || window.location.search.includes('adhese_debug=true') || isPreviewMode())\n context.events?.debugChange.dispatch(true);\n\n if (!scope.active)\n dispose();\n });\n\n runOnInit();\n\n return {\n parameters: context.parameters,\n events: context.events,\n getLocation,\n setLocation,\n getConsent,\n setConsent,\n addSlot,\n findDomSlots,\n dispose,\n toggleDebug,\n get: slotManager.get,\n getAll: slotManager.getAll,\n context,\n options: mergedOptions,\n } satisfies Adhese;\n })!;\n}\n"],"names":["debounce","name","union","coerce","literal","number","string","ZodIssueCode","NEVER","object","unknown","lazy","toValue","ref","computed","round","watch","effectScope","reactive","requestAd","isDeepEqual","extRequestAd","shallowReactive","watchEffect","add","onDispose","_a","findDomSlots","extFindDomSlots"],"mappings":"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"}