fg-tracker-browser 0.13.0 → 0.14.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/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog — fg-tracker-browser
2
2
 
3
+ ## 0.14.0
4
+
5
+ Sucede a 0.13.0 (helper de ErrorBoundary, T72).
6
+
7
+ - **Eventos de navegação e engajamento (TG-02):** nova opção `events` (default `false`; `true` ou objeto por tipo), com `analytics: true`: `page_engagement` (tempo ativo em ms: página visível, em foco e com interação nos últimos 30 s; ocioso, oculto e sem foco não contam), `scroll` (marcos 25/50/75/90% uma vez por visualização), `navigation` (`soft` na navegação SPA, com a rota de origem saneada; `restore` na volta do bfcache), `outbound_click` (só o host), `file_download` (só a extensão), ações declaradas com `data-fg-event` (até 5 `data-fg-prop-*`) e `form_start`/`form_submit` de `<form data-fg-form>`, sem ler valores nem campos. Detalhes em `docs/trafego-eventos.md`.
8
+ - **API pública:** `tracker.track(name, props?, { value?, id? })` e `tracker.conversion(name, { value?, currency?, id?, props? })`, que funcionam com `analytics` mesmo sem `events`. A conversão é o sinal explícito de sucesso da aplicação; `form_submit` não a substitui. `id` gera o mesmo `event_id` para a mesma ocorrência (sem enviar o id cru), e a API grava uma vez. Novos tipos exportados (`TrafficEvent`, `EventsOptions`, `TrackOptions`, `ConversionOptions`, `EventProps`…) e limites (`MAX_EVENT_NAMES`, `ENGAGEMENT_IDLE_MS`, `SCROLL_MILESTONES`…).
9
+ - Eventos vão em `analytics[]` (`type: 'event'`) com `pageview_id` (a visualização), `view_id` dos Web Vitals quando medidos, sessão e visitante da analytics, serviço, ambiente e release. Nunca criam pageview nem sessão. Mesmo consentimento, Do Not Track e fila `pending` dos pageviews. A revogação descarta também os eventos ainda não enviados (fila, lotes à espera e retry); pageviews e `identify` seguem a regra da 0.12.1.
10
+ - Limites: 50 nomes próprios distintos por documento, 120 automáticos e 100 chamadas de `track`/`conversion` por minuto, tetos por visualização, gesto repetido em 1 s conta uma vez, até 10 atributos (1 KiB) limpos antes da fila (chaves de dado pessoal descartadas; e-mail, JWT, cartão/CPF/telefone e URL com query viram `[Filtered]`). Listeners passivos delegados, removidos no `close()`; sem timers próprios.
11
+ - `init()` repetido na mesma URL continua a visualização em vez de registrar outro pageview; `close()` reporta o tempo ativo pendente e envia.
12
+ - Filas cheias (`pending` ou sem rede, 200 itens): saem primeiro os eventos mais antigos; eventos nunca expulsam pageviews.
13
+ - Revogação também vale para o que estava em voo: se o lote voltar (falha, 413), os eventos não são reenviados, nem depois de uma nova concessão; uma inicialização depois de revogar e conceder de novo não continua a visualização anterior.
14
+ - Rolagem rápida até o fim (End, flick) conta os marcos finais num passe atrasado; sem pageviews automáticos, a visualização acompanha a rota na navegação. Eventos de uma visualização anterior levam a `view_id` dos Web Vitals dela.
15
+ - Requer a API com a TG-02 para gravar os eventos; uma API anterior os recusa (`analytics.rejected`) sem afetar erros, spans, pageviews e Web Vitals do mesmo lote.
16
+
3
17
  ## 0.13.0
4
18
 
5
19
  Sucede a 0.12.1 (revogação de analytics, T83).
package/README.md CHANGED
@@ -201,6 +201,25 @@ tracker.setConsent('granted'); // quando o banner de cookies for aceito (se
201
201
  - **Correlação de erros (C11/T79, desde a 0.11.0):** após um pageview/identify sob consentimento `granted`, erros e avisos incluem em `attributes` o mesmo `visitor_id`/`session_id` do analytics e `analytics.consent: 'granted'`. Falhas HTTP amostradas incluem o par na raiz e no filho com erro, ao fechar a chamada. Esses campos são reservados à correlação do SDK; atributos do chamador não substituem o consentimento. A captura apenas lê o contexto em memória: não cria nem renova IDs, cookies ou storage. Sem analytics, com DNT, `pending`/`denied`, após `close()`, sem par ativo ou depois de 30 min de inatividade, os campos são omitidos. Revogar ou voltar a `pending` invalida a elegibilidade; conceder novamente exige nova atividade sob o grant vigente (liberar a fila antiga não basta). Erros anteriores não são enriquecidos retroativamente. `beforeSend` e `scrubFields` podem remover a correlação; uma revogação no callback também é respeitada. Sucessos HTTP e mensagens `info` não recebem esses campos.
202
202
  - Instalação em Next.js App Router: <https://tracker-site.fortground.com.br/docs/browser/#nextjs>.
203
203
 
204
+ ### Eventos de navegação e engajamento (0.14.0)
205
+
206
+ ```ts
207
+ const tracker = init({ apiKey: 'stk_...', endpoint: 'https://tracker-api.fortground.com.br', serviceName: 'loja-web', analytics: true, consent: 'pending', events: true });
208
+ tracker.track('video_play', { video: 'intro' }, { value: 12 });
209
+ // Só depois do sucesso confirmado da operação (pagamento aprovado, cadastro criado):
210
+ tracker.conversion('purchase', { value: 129.9, currency: 'BRL', id: pedido.id });
211
+ ```
212
+
213
+ ```html
214
+ <button data-fg-event="cta_signup" data-fg-prop-plan="pro">Assinar</button>
215
+ <form data-fg-form="checkout">…</form>
216
+ ```
217
+
218
+ - `events: true` liga `page_engagement` (tempo ativo em ms: visível, em foco e com interação nos últimos 30 s), `scroll` (25/50/75/90% por visualização), `navigation` (SPA com a rota de origem; volta do bfcache), `outbound_click` (só o host), `file_download` (só a extensão), cliques em `data-fg-event` e `form_start`/`form_submit` de `<form data-fg-form>` (sem valores nem campos). Um objeto desliga partes: `events: { scroll: false, downloads: { extensions: ['pdf'] } }`.
219
+ - Mesmo consentimento, Do Not Track e ids dos pageviews; nunca criam pageview nem sessão. `denied` descarta também os eventos ainda não enviados. Atributos limpos antes da fila (até 10; chaves de dado pessoal descartadas; e-mail, JWT, cartão, CPF e URL com query viram `[Filtered]`). Limites por visualização e por minuto, 50 nomes próprios por documento.
220
+ - `form_submit` é tentativa; `conversion()` é o sucesso, chamado pela aplicação. `id` torna a conversão idempotente sem enviar o id cru.
221
+ - Nomes, unidades, limites, ingestão e leituras (`/traffic/events`, `/summary`, `/daily`): `docs/trafego-eventos.md`.
222
+
204
223
  ## Web Vitals
205
224
 
206
225
  ```ts
@@ -225,15 +244,17 @@ Painel: **Web Vitals** (p75, faixas bom/a melhorar/ruim, série, tabela por rota
225
244
 
226
245
  ## Source maps
227
246
 
228
- Suba os `.map` da release no deploy (e apague-os do bundle público):
247
+ Suba os `.map` da release no mesmo pipeline do build (e tire-os do que vai para o ar). Receitas completas para Vite, Next.js, GitHub Actions, AWS CodeBuild/CodePipeline e outros CIs: <https://tracker-site.fortground.com.br/docs/browser/#sourcemaps> (o painel, em **Source maps → Configurar source maps**, gera as mesmas com o projeto preenchido).
229
248
 
230
249
  ```sh
231
- # chave de servidor (no modo restrito a pública recebe 403); rode no CI, nunca no navegador
250
+ # Vite (dist/assets/…): chave de servidor (no modo restrito a pública recebe 403); rode no CI, nunca no navegador
232
251
  FG_TRACKER_KEY=fgsk_... FG_TRACKER_URL=https://tracker-api.fortground.com.br \
233
- npx -p fg-tracker-sdk fg-tracker-sourcemaps --dir dist --release "checkout-web@$GITHUB_SHA" --url-prefix "~/assets"
252
+ npx -p fg-tracker-sdk fg-tracker-sourcemaps --dir dist --release "checkout-web@$GITHUB_SHA" --url-prefix "~"
234
253
  find dist -name '*.map' -delete
235
254
  ```
236
255
 
256
+ `--url-prefix` é o caminho público de `--dir`: cada mapa vira `<prefixo>/<caminho relativo, sem .map>` e precisa ser igual ao caminho da URL do JS no stack. No Next.js 16 (Turbopack) o mapa de cada chunk tem outro nome; use a receita do Next da documentação.
257
+
237
258
  A ingestão traduz `app-3f2a1c.js:1:48213` para `src/checkout/Cart.tsx:42:11`: o culpado da issue e os commits suspeitos passam a apontar para o código-fonte.
238
259
 
239
260
  O `endpoint` é obrigatório: use a URL da API mostrada no painel em **Conectar**. O endereço de produção da API é `https://tracker-api.fortground.com.br` (o antigo `track-api.fortground.com.br` continua respondendo). O SDK envia a chave no header `x-fg-tracker-key` (e em `?key=` no `sendBeacon`).
@@ -1,8 +1,10 @@
1
- import type { AnalyticsEvent, BrowserEnv, Consent, PageviewEvent } from './types.js';
1
+ import type { AnalyticsEvent, BrowserEnv, Consent, EventProps, PageviewEvent, TrafficEventKind } from './types.js';
2
2
  /**
3
3
  * Pageviews e visitantes anônimos (CONTRATO.md §25): ids aleatórios em cookies
4
4
  * first-party (`fgt_vid` 1 ano, `fgt_sid` 30 min de inatividade), sem PII.
5
- * Só é criado quando `analytics`/`trackPageviews` estão ligados.
5
+ * Só é criado quando `analytics`/`trackPageviews` estão ligados. Os eventos de navegação e
6
+ * engajamento (docs/trafego-eventos.md) passam por aqui: mesmo consentimento, mesmos ids, ligados à
7
+ * visualização do pageview.
6
8
  */
7
9
  export declare const VISITOR_COOKIE = "fgt_vid";
8
10
  export declare const SESSION_COOKIE = "fgt_sid";
@@ -10,6 +12,14 @@ export declare const VISITOR_TTL_SECONDS: number;
10
12
  export declare const SESSION_IDLE_MS: number;
11
13
  declare const UTM_KEYS: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content"];
12
14
  type UtmKey = (typeof UTM_KEYS)[number];
15
+ /**
16
+ * Corta `queue` em `max` itens: saem primeiro os eventos de navegação/engajamento mais antigos
17
+ * (`type: 'event'`), e só depois o resto, do mais antigo. Eventos nunca empurram pageviews para fora.
18
+ * Devolve quantos saíram.
19
+ */
20
+ export declare function trimQueue<T extends {
21
+ type: string;
22
+ }>(queue: T[], max: number): number;
13
23
  export declare function randomId(env: BrowserEnv): string;
14
24
  /** `Do Not Track` ligado no navegador (`navigator.doNotTrack === '1'`, com as variantes antigas). */
15
25
  export declare function doNotTrackEnabled(env: BrowserEnv): boolean;
@@ -21,11 +31,43 @@ export declare function referrerOrigin(referrer: string | undefined | null, curr
21
31
  export declare function utmParams(search: string | undefined | null): Partial<Record<UtmKey, string>>;
22
32
  /** Caminho + só os `utm_*` da query (hash e demais parâmetros descartados). */
23
33
  export declare function pageUrl(path: string, utm: Partial<Record<UtmKey, string>>): string;
34
+ /** Visualização: o que um pageview registrou (ou a rota atual, sem pageview). Eventos pertencem a ela. */
35
+ export interface AnalyticsView {
36
+ /** `event_id` do pageview (ou aleatório, numa visualização sem pageview). */
37
+ id: string;
38
+ route: string;
39
+ /** Sessão em que a visualização começou: eventos dela não abrem sessão nova depois que esta expira. */
40
+ sessionId: string | null;
41
+ /** Criada sem pageview (`trackPageviews: false` e sem `page()`): troca quando a rota muda. */
42
+ implicit: boolean;
43
+ /** View dos Web Vitals de quando a visualização começou (eventos dela depois que a rota mudou). */
44
+ vitalsViewId?: string | null;
45
+ }
46
+ export interface TrafficEventInput {
47
+ kind: TrafficEventKind;
48
+ name: string;
49
+ value?: number;
50
+ currency?: string;
51
+ props?: EventProps;
52
+ /** Id derivado (`track(..., { id })`); senão aleatório. */
53
+ eventId?: string;
54
+ /** Visualização dona (default: a atual). */
55
+ view?: AnalyticsView;
56
+ }
24
57
  export interface AnalyticsOptions {
25
58
  consent: Consent;
26
59
  cookieDomain?: string;
27
60
  sanitizePath: (path: string) => string | null;
28
61
  onEvent: (event: AnalyticsEvent) => void;
62
+ /** A visualização mudou (pageview novo, rota recusada ou consentimento negado), antes do pageview sair. */
63
+ onViewChange?: (previous: AnalyticsView | null, next: AnalyticsView | null) => void;
64
+ /** Campos fixos dos eventos (`service`, `environment`, `release`) e a view dos Web Vitals. */
65
+ eventContext?: () => {
66
+ service?: string;
67
+ environment?: string;
68
+ release?: string;
69
+ view_id?: string | null;
70
+ };
29
71
  }
30
72
  export interface Analytics {
31
73
  /** Registra um pageview (dedupe: mesma URL da última vez é ignorada, exceto `force`). */
@@ -37,9 +79,22 @@ export interface Analytics {
37
79
  visitor_id: string;
38
80
  session_id: string;
39
81
  } | null;
82
+ /** Evento ligado à visualização (atual ou `input.view`); `false` quando não sai (negado, rota recusada). */
83
+ event(input: TrafficEventInput): boolean;
84
+ /** A visualização atual, criando uma sem pageview quando não houve nenhum (`null`: rota recusada ou negado). */
85
+ ensureView(): AnalyticsView | null;
86
+ /** Continua a visualização de outra instância (inicialização repetida) sem registrar o pageview de novo. */
87
+ resume(state: {
88
+ url: string;
89
+ view: AnalyticsView;
90
+ visitorId: string;
91
+ }): void;
40
92
  /** Eventos retidos enquanto `consent === 'pending'`. */
41
93
  readonly pending: readonly AnalyticsEvent[];
42
94
  readonly consent: Consent;
95
+ readonly view: AnalyticsView | null;
96
+ /** URL (caminho + `utm_*`) do último pageview registrado. */
97
+ readonly lastUrl: string | null;
43
98
  }
44
99
  export declare function createAnalytics(env: BrowserEnv, options: AnalyticsOptions): Analytics;
45
100
  export {};
package/dist/analytics.js CHANGED
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * Pageviews e visitantes anônimos (CONTRATO.md §25): ids aleatórios em cookies
3
3
  * first-party (`fgt_vid` 1 ano, `fgt_sid` 30 min de inatividade), sem PII.
4
- * Só é criado quando `analytics`/`trackPageviews` estão ligados.
4
+ * Só é criado quando `analytics`/`trackPageviews` estão ligados. Os eventos de navegação e
5
+ * engajamento (docs/trafego-eventos.md) passam por aqui: mesmo consentimento, mesmos ids, ligados à
6
+ * visualização do pageview.
5
7
  */
6
8
  export const VISITOR_COOKIE = 'fgt_vid';
7
9
  export const SESSION_COOKIE = 'fgt_sid';
@@ -9,6 +11,28 @@ export const VISITOR_TTL_SECONDS = 365 * 24 * 60 * 60;
9
11
  export const SESSION_IDLE_MS = 30 * 60 * 1000;
10
12
  const MAX_ANALYTICS_QUEUE = 200;
11
13
  const UTM_KEYS = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];
14
+ /**
15
+ * Corta `queue` em `max` itens: saem primeiro os eventos de navegação/engajamento mais antigos
16
+ * (`type: 'event'`), e só depois o resto, do mais antigo. Eventos nunca empurram pageviews para fora.
17
+ * Devolve quantos saíram.
18
+ */
19
+ export function trimQueue(queue, max) {
20
+ let excess = queue.length - max;
21
+ if (excess <= 0)
22
+ return 0;
23
+ const removed = excess;
24
+ for (let i = 0; i < queue.length && excess > 0;) {
25
+ if (queue[i].type === 'event') {
26
+ queue.splice(i, 1);
27
+ excess -= 1;
28
+ }
29
+ else
30
+ i += 1;
31
+ }
32
+ if (excess > 0)
33
+ queue.splice(0, excess);
34
+ return removed;
35
+ }
12
36
  export function randomId(env) {
13
37
  const cryptoImpl = (env.window?.crypto ?? globalThis.crypto);
14
38
  const out = new Uint8Array(16);
@@ -166,6 +190,15 @@ export function createAnalytics(env, options) {
166
190
  let lastUrl = null;
167
191
  let firstPage = true;
168
192
  let eligible = null;
193
+ let view = null;
194
+ /** A rota atual foi recusada por `sanitizePath`: seus eventos também não saem. */
195
+ let excluded = false;
196
+ const changeView = (next) => {
197
+ const previous = view;
198
+ view = next;
199
+ if (previous !== next)
200
+ options.onViewChange?.(previous, next);
201
+ };
169
202
  const visitorId = () => {
170
203
  if (consent === 'granted') {
171
204
  const stored = storage.get(VISITOR_COOKIE);
@@ -198,8 +231,7 @@ export function createAnalytics(env, options) {
198
231
  return;
199
232
  if (consent === 'pending') {
200
233
  pending.push(event);
201
- if (pending.length > MAX_ANALYTICS_QUEUE)
202
- pending.splice(0, pending.length - MAX_ANALYTICS_QUEUE);
234
+ trimQueue(pending, MAX_ANALYTICS_QUEUE);
203
235
  return;
204
236
  }
205
237
  eligible = doNotTrackEnabled(env) ? null : { visitor_id: event.visitor_id, session_id: event.session_id, at: Date.now() };
@@ -214,8 +246,15 @@ export function createAnalytics(env, options) {
214
246
  const [pathOnly, query] = rawPath.split('?');
215
247
  const sanitized = options.sanitizePath(pathOnly || '/');
216
248
  // O callback pode revogar o consentimento durante o saneamento.
217
- if (sanitized === null || consent === 'denied')
249
+ if (consent === 'denied')
250
+ return;
251
+ if (sanitized === null) {
252
+ // Página recusada: a visualização anterior termina e nada desta sai.
253
+ excluded = true;
254
+ lastUrl = null;
255
+ changeView(null);
218
256
  return;
257
+ }
219
258
  const utm = utmParams(path !== undefined ? query : loc?.search);
220
259
  const url = pageUrl(sanitized, utm);
221
260
  if (!force && url === lastUrl)
@@ -241,6 +280,8 @@ export function createAnalytics(env, options) {
241
280
  if (userId)
242
281
  event.user_id = userId;
243
282
  firstPage = false;
283
+ excluded = false;
284
+ changeView({ id: event.event_id, route: sanitized, sessionId: event.session_id, implicit: false, vitalsViewId: options.eventContext?.().view_id ?? null });
244
285
  emit(event);
245
286
  },
246
287
  identify(next) {
@@ -259,6 +300,8 @@ export function createAnalytics(env, options) {
259
300
  memoryVisitor = null;
260
301
  memorySession = null;
261
302
  lastUrl = null;
303
+ excluded = false;
304
+ changeView(null);
262
305
  storage.remove(VISITOR_COOKIE);
263
306
  storage.remove(SESSION_COOKIE);
264
307
  return;
@@ -281,9 +324,104 @@ export function createAnalytics(env, options) {
281
324
  return null;
282
325
  return { visitor_id: eligible.visitor_id, session_id: eligible.session_id };
283
326
  },
327
+ ensureView() {
328
+ if (consent === 'denied')
329
+ return null;
330
+ if (view && !view.implicit)
331
+ return view;
332
+ if (excluded)
333
+ return null;
334
+ const loc = env.location ?? env.window?.location;
335
+ let route;
336
+ try {
337
+ route = options.sanitizePath((loc?.pathname ?? '/').split(/[?#]/)[0] || '/');
338
+ }
339
+ catch {
340
+ route = null;
341
+ }
342
+ if (consent === 'denied' || route === null)
343
+ return null;
344
+ if (view?.route === route)
345
+ return view;
346
+ changeView({ id: randomId(env), route, sessionId: null, implicit: true, vitalsViewId: options.eventContext?.().view_id ?? null });
347
+ return view;
348
+ },
349
+ event(input) {
350
+ if (consent === 'denied')
351
+ return false;
352
+ const target = input.view ?? this.ensureView();
353
+ if (!target || consent === 'denied')
354
+ return false;
355
+ const at = Date.now();
356
+ // Evento de uma visualização cuja sessão já expirou fica nela: não abre sessão sem pageview.
357
+ const live = !target.sessionId || (memorySession !== null && memorySession.id === target.sessionId && at - memorySession.last <= SESSION_IDLE_MS);
358
+ const session = live ? sessionId(at) : target.sessionId;
359
+ target.sessionId ?? (target.sessionId = session);
360
+ const context = options.eventContext?.() ?? {};
361
+ const event = {
362
+ type: 'event',
363
+ event_id: input.eventId ?? randomId(env),
364
+ kind: input.kind,
365
+ name: input.name,
366
+ url: target.route,
367
+ pageview_id: target.id,
368
+ screen: screenBucket(env.window?.screen?.width ?? env.window?.innerWidth),
369
+ visitor_id: visitorId(),
370
+ session_id: session,
371
+ ts: new Date(at).toISOString(),
372
+ };
373
+ // A view dos Web Vitals atual só vale para a visualização atual; a anterior usa a de quando começou.
374
+ const vitalsViewId = target === view ? context.view_id : target.vitalsViewId;
375
+ if (vitalsViewId)
376
+ event.view_id = vitalsViewId;
377
+ if (input.value !== undefined)
378
+ event.value = input.value;
379
+ if (input.currency !== undefined)
380
+ event.currency = input.currency;
381
+ if (input.props && Object.keys(input.props).length > 0)
382
+ event.props = input.props;
383
+ if (userId)
384
+ event.user_id = userId;
385
+ if (context.service)
386
+ event.service = context.service;
387
+ if (context.environment)
388
+ event.environment = context.environment;
389
+ if (context.release)
390
+ event.release = context.release;
391
+ emit(event);
392
+ return true;
393
+ },
394
+ resume(state) {
395
+ // Só sob o grant e na mesma URL que o pageview anterior registrou (a do `page()` desta carga).
396
+ if (consent !== 'granted')
397
+ return;
398
+ const loc = env.location ?? env.window?.location;
399
+ let sanitized;
400
+ try {
401
+ sanitized = options.sanitizePath((loc?.pathname ?? '/').split('#')[0].split('?')[0] || '/');
402
+ }
403
+ catch {
404
+ return;
405
+ }
406
+ if (sanitized === null || pageUrl(sanitized, utmParams(loc?.search)) !== state.url)
407
+ return;
408
+ // Mesmo visitante persistido: depois de revogar e conceder de novo, outro par e outro pageview.
409
+ if (storage.get(VISITOR_COOKIE) !== state.visitorId)
410
+ return;
411
+ lastUrl = state.url;
412
+ firstPage = false;
413
+ excluded = false;
414
+ changeView({ ...state.view });
415
+ },
284
416
  get pending() {
285
417
  return pending;
286
418
  },
419
+ get view() {
420
+ return view;
421
+ },
422
+ get lastUrl() {
423
+ return lastUrl;
424
+ },
287
425
  get consent() {
288
426
  return consent;
289
427
  },
@@ -1 +1 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAC;AACxC,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AACtD,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAU,CAAC;AAGlG,MAAM,UAAU,QAAQ,CAAC,GAAe;IACtC,MAAM,UAAU,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAK,UAAkC,CAAC,MAAM,CAAuB,CAAC;IAC5G,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,UAAU,EAAE,eAAe;QAAE,UAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;;QAC5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC1E,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,iBAAiB,CAAC,GAAe;IAC/C,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAwD,CAAC;IAC5G,MAAM,GAAG,GAAG,GAAG,CAAC,MAAwD,CAAC;IACzE,OAAO,GAAG,EAAE,UAAU,KAAK,GAAG,IAAI,GAAG,EAAE,UAAU,KAAK,GAAG,IAAI,GAAG,EAAE,YAAY,KAAK,GAAG,CAAC;AACzF,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,KAAgC;IAC3D,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,KAAK,GAAG,GAAG;QAAE,OAAO,QAAQ,CAAC;IACjC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,QAAQ,CAAC;IAClC,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,cAAc,CAAC,QAAmC,EAAE,aAAiC;IACnG,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC9B,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACvE,OAAO,GAAG,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,SAAS,CAAC,MAAiC;IACzD,MAAM,GAAG,GAAoC,EAAE,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IACxB,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACtF,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,GAAoC;IACxE,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,KAAK,MAAM,GAAG,IAAI,QAAQ;QAAE,IAAI,GAAG,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAE,CAAC,CAAC;IACpE,MAAM,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrC,CAAC;AAQD,wGAAwG;AACxG,SAAS,aAAa,CAAC,GAAe,EAAE,YAAgC;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ,KAAK,QAAQ,CAAC;IAC7E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,KAAK,GAAG,GAA8B,EAAE;QAC5C,IAAI,CAAC;YACH,OAAQ,GAAG,CAAC,MAAuE,EAAE,YAAY,IAAI,IAAI,CAAC;QAC5G,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,IAAY,EAAiB,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,EAAE,MAAM,IAAI,EAAE,CAAC;YAC9B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC9C,IAAI,GAAG,KAAK,IAAI;oBAAE,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,OAAO;QACL,GAAG,CAAC,IAAI;YACN,kEAAkE;YAClE,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,KAAK,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;gBACnC,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC;gBACtB,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACxC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE;oBAAE,OAAO,IAAI,CAAC;gBACxD,OAAO,KAAK,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QACD,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa;YAC5B,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC;oBACR,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,IAAI,kBAAkB,CAAC,KAAK,CAAC,aAAa,aAAa,yBAAyB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAClL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YACD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,KAAK;gBAAE,OAAO;YACvC,IAAI,CAAC;gBACH,KAAK,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,IAAI,EAAE,CAAC,CAAC;YAC1E,CAAC;YAAC,MAAM,CAAC;gBACP,gDAAgD;YAClD,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI;YACT,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,CAAC;gBACH,IAAI,GAAG,EAAE,CAAC;oBACR,GAAG,CAAC,MAAM,GAAG,GAAG,IAAI,qCAAqC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACvI,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;YACD,IAAI,CAAC;gBACH,KAAK,EAAE,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,0BAA0B;YAC5B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAqBD,MAAM,UAAU,eAAe,CAAC,GAAe,EAAE,OAAyB;IACxE,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACzD,IAAI,OAAO,GAAY,OAAO,CAAC,OAAO,CAAC;IACvC,MAAM,OAAO,GAAqB,EAAE,CAAC;IACrC,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,aAAa,GAAwC,IAAI,CAAC;IAC9D,IAAI,MAAM,GAAkB,IAAI,CAAC;IACjC,IAAI,OAAO,GAAkB,IAAI,CAAC;IAClC,IAAI,SAAS,GAAG,IAAI,CAAC;IACrB,IAAI,QAAQ,GAAkE,IAAI,CAAC;IAEnF,MAAM,SAAS,GAAG,GAAW,EAAE;QAC7B,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,IAAI,MAAM,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC5C,aAAa,GAAG,MAAM,CAAC;gBACvB,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QACD,aAAa,KAAb,aAAa,GAAK,QAAQ,CAAC,GAAG,CAAC,EAAC;QAChC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;QAC3F,OAAO,aAAa,CAAC;IACvB,CAAC,CAAC;IAEF,2FAA2F;IAC3F,MAAM,SAAS,GAAG,CAAC,EAAU,EAAU,EAAE;QACvC,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,EAAE,CAAC;YAC5C,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClE,IAAI,EAAE,IAAI,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;gBAAE,aAAa,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACtG,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,GAAG,eAAe;YAAE,aAAa,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACjH,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;QAC5H,OAAO,aAAa,CAAC,EAAE,CAAC;IAC1B,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAqB,EAAE,EAAE;QACrC,IAAI,OAAO,KAAK,QAAQ;YAAE,OAAO;QACjC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,OAAO,CAAC,MAAM,GAAG,mBAAmB;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;YAClG,OAAO;QACT,CAAC;QACD,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC1H,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK;YACtB,IAAI,OAAO,KAAK,QAAQ;gBAAE,OAAO;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;YACjD,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,QAAQ,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;YAC9D,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC;YACxD,gEAAgE;YAChE,IAAI,SAAS,KAAK,IAAI,IAAK,OAAmB,KAAK,QAAQ;gBAAE,OAAO;YACpE,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;YACpC,IAAI,CAAC,KAAK,IAAI,GAAG,KAAK,OAAO;gBAAE,OAAO;YACtC,OAAO,GAAG,GAAG,CAAC;YACd,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;YACjD,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;YACnD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,MAAM,KAAK,GAAkB;gBAC3B,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;gBACvB,GAAG;gBACH,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI;gBACvE,GAAG,GAAG;gBACN,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC;gBACzE,MAAM,EAAE,GAAG,EAAE,QAAQ,IAAI,IAAI;gBAC7B,UAAU,EAAE,SAAS,EAAE;gBACvB,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;gBACzB,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE;aAC/B,CAAC;YACF,IAAI,GAAG,EAAE,KAAK;gBAAE,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACtD,IAAI,MAAM;gBAAE,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;YACnC,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;QACD,QAAQ,CAAC,IAAI;YACX,MAAM,GAAG,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAChG,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,QAAQ;gBAAE,OAAO;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACtB,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC3J,CAAC;QACD,UAAU,CAAC,IAAI;YACb,IAAI,IAAI,KAAK,OAAO;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACtC,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAClB,aAAa,GAAG,IAAI,CAAC;gBACrB,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC/B,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC/B,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,0EAA0E;gBAC1E,IAAI,aAAa;oBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,aAAa,EAAE,mBAAmB,CAAC,CAAC;gBACnF,IAAI,aAAa;oBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,aAAa,CAAC,IAAI,EAAE,EAAE,eAAe,GAAG,IAAI,CAAC,CAAC;gBACpH,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAChE,CAAC;QACH,CAAC;QACD,WAAW;YACT,MAAM,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAC3D,IAAI,OAAO,KAAK,SAAS,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,eAAe;gBAAE,QAAQ,GAAG,IAAI,CAAC;YACzG,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzH,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC9E,CAAC;QACD,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IAAI,OAAO;YACT,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../src/analytics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { Analytics, AnalyticsView } from './analytics.js';
2
+ import type { BrowserEnv, EventProps, EventsOptions, TrafficEventKind } from './types.js';
3
+ /**
4
+ * Eventos de navegação e engajamento (docs/trafego-eventos.md). Seletivos e limitados: nada de texto
5
+ * do DOM, teclas, valores de formulário, URLs completas ou atributos arbitrários. Tudo passa pela
6
+ * analytics (consentimento, Do Not Track, ids e fila) e nunca vira pageview.
7
+ */
8
+ /** Nomes reservados aos automáticos (a API recusa os demais tipos com eles). */
9
+ export declare const AUTO_EVENT_NAMES: readonly ["page_engagement", "scroll", "navigation", "outbound_click", "file_download", "form_start", "form_submit"];
10
+ export declare const EVENT_NAME_PATTERN: RegExp;
11
+ export declare const MAX_EVENT_PROPS = 10;
12
+ /** Sem interação por mais que isto, o tempo deixa de contar como ativo. */
13
+ export declare const ENGAGEMENT_IDLE_MS = 30000;
14
+ /** Relatório de engajamento só sai com ao menos isto acumulado (o resto espera o próximo). */
15
+ export declare const MIN_ENGAGEMENT_REPORT_MS = 1000;
16
+ export declare const SCROLL_MILESTONES: readonly [25, 50, 75, 90];
17
+ /** Por visualização. */
18
+ export declare const MAX_LINK_EVENTS_PER_VIEW = 20;
19
+ export declare const MAX_ACTIONS_PER_VIEW = 30;
20
+ /** Por documento: eventos automáticos e ações por minuto, chamadas a `track`/`conversion` por minuto e nomes distintos. */
21
+ export declare const MAX_AUTO_EVENTS_PER_MINUTE = 120;
22
+ export declare const MAX_CUSTOM_EVENTS_PER_MINUTE = 100;
23
+ export declare const MAX_EVENT_NAMES = 50;
24
+ export declare const DEFAULT_DOWNLOAD_EXTENSIONS: string[];
25
+ export interface ResolvedEventsOptions {
26
+ engagement: boolean;
27
+ scroll: boolean;
28
+ navigation: boolean;
29
+ outboundLinks: boolean;
30
+ downloads: ReadonlySet<string> | null;
31
+ actions: boolean;
32
+ forms: boolean;
33
+ }
34
+ /** `events: true` liga tudo; objeto liga o que não vier `false`; ausente/`false` desliga. */
35
+ export declare function resolveEventsOptions(input: boolean | EventsOptions | undefined): ResolvedEventsOptions | null;
36
+ /** Atributos limpos antes da fila: chaves `snake_case` seguras, valores curtos, até `max` e 1 KiB. */
37
+ export declare function cleanEventProps(input: unknown, max?: number): EventProps;
38
+ /** Nome próprio válido: `snake_case` e fora dos reservados. */
39
+ export declare function isCustomEventName(name: unknown): name is string;
40
+ /** 32 hex estáveis para `name` + `id` (FNV-1a de 4 sementes): o mesmo gesto, o mesmo `event_id`. */
41
+ export declare function stableEventId(name: string, id: string): string;
42
+ export interface EventCollector {
43
+ /** Visualização nova (ou nenhuma): fecha o engajamento da anterior e zera os limites por visualização. */
44
+ onViewChange(previous: AnalyticsView | null, next: AnalyticsView | null): void;
45
+ /** Página oculta: fecha e reporta o engajamento (antes do envio por beacon). */
46
+ onHidden(): void;
47
+ /** `pagehide`: o mesmo do `hidden`. */
48
+ onPageHide(): void;
49
+ /** Volta do bfcache: evento `navigation` (`restore`) na mesma visualização. */
50
+ onRestore(): void;
51
+ track(kind: Exclude<TrafficEventKind, 'auto' | 'action'>, name: unknown, props: unknown, options: {
52
+ value?: unknown;
53
+ currency?: unknown;
54
+ id?: unknown;
55
+ } | undefined): void;
56
+ /** Reporta o engajamento pendente e tira os listeners. */
57
+ close(): void;
58
+ }
59
+ export interface EventCollectorOptions {
60
+ analytics: Analytics;
61
+ config: ResolvedEventsOptions | null;
62
+ cookieDomain?: string;
63
+ log: (...args: unknown[]) => void;
64
+ }
65
+ /**
66
+ * Coletor dos eventos da visualização atual. Listeners passivos, delegados no documento, que só leem
67
+ * o instante, o alvo do clique e atributos `data-fg-*` declarados; sem timers.
68
+ */
69
+ export declare function createEventCollector(env: BrowserEnv, options: EventCollectorOptions): EventCollector;