autotel 2.18.0 → 2.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/attributes.cjs +21 -20
  2. package/dist/attributes.js +2 -1
  3. package/dist/chunk-2ZKEORFN.cjs +14 -0
  4. package/dist/chunk-2ZKEORFN.cjs.map +1 -0
  5. package/dist/chunk-4A53YIAX.js +180 -0
  6. package/dist/chunk-4A53YIAX.js.map +1 -0
  7. package/dist/{chunk-QKVQWGTF.js → chunk-5JLXDCL2.js} +3 -3
  8. package/dist/{chunk-QKVQWGTF.js.map → chunk-5JLXDCL2.js.map} +1 -1
  9. package/dist/chunk-7552UTQW.js +11 -0
  10. package/dist/chunk-7552UTQW.js.map +1 -0
  11. package/dist/{chunk-NWT5SYOX.cjs → chunk-BEVIAKTB.cjs} +5 -5
  12. package/dist/{chunk-NWT5SYOX.cjs.map → chunk-BEVIAKTB.cjs.map} +1 -1
  13. package/dist/chunk-ESMHTKLJ.cjs +206 -0
  14. package/dist/chunk-ESMHTKLJ.cjs.map +1 -0
  15. package/dist/{chunk-QP5LVD4L.js → chunk-G47ZCJGW.js} +25 -3
  16. package/dist/{chunk-QP5LVD4L.js.map → chunk-G47ZCJGW.js.map} +1 -1
  17. package/dist/{chunk-WC2AMGBX.js → chunk-LCMARHLX.js} +3 -3
  18. package/dist/{chunk-WC2AMGBX.js.map → chunk-LCMARHLX.js.map} +1 -1
  19. package/dist/{chunk-HZ23L5KR.cjs → chunk-LGT7XA5O.cjs} +5 -5
  20. package/dist/{chunk-HZ23L5KR.cjs.map → chunk-LGT7XA5O.cjs.map} +1 -1
  21. package/dist/{chunk-4HPWUYCV.js → chunk-M4US3P4K.js} +3 -170
  22. package/dist/chunk-M4US3P4K.js.map +1 -0
  23. package/dist/{chunk-FMPBL2NF.js → chunk-XBVB3AFF.js} +3 -3
  24. package/dist/{chunk-FMPBL2NF.js.map → chunk-XBVB3AFF.js.map} +1 -1
  25. package/dist/{chunk-DWRTSOGR.cjs → chunk-XI5WPVR5.cjs} +25 -3
  26. package/dist/chunk-XI5WPVR5.cjs.map +1 -0
  27. package/dist/{chunk-74L5DOB4.cjs → chunk-XNBTEFRZ.cjs} +7 -7
  28. package/dist/{chunk-74L5DOB4.cjs.map → chunk-XNBTEFRZ.cjs.map} +1 -1
  29. package/dist/chunk-XRBP4RYL.cjs +764 -0
  30. package/dist/chunk-XRBP4RYL.cjs.map +1 -0
  31. package/dist/decorators.cjs +1 -1
  32. package/dist/decorators.js +1 -1
  33. package/dist/functional.cjs +8 -8
  34. package/dist/functional.js +1 -1
  35. package/dist/index.cjs +65 -43
  36. package/dist/index.cjs.map +1 -1
  37. package/dist/index.d.cts +1 -0
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.js +8 -6
  40. package/dist/index.js.map +1 -1
  41. package/dist/messaging.cjs +5 -5
  42. package/dist/messaging.js +2 -2
  43. package/dist/semantic-conventions.cjs +30 -0
  44. package/dist/semantic-conventions.cjs.map +1 -0
  45. package/dist/semantic-conventions.d.cts +29 -0
  46. package/dist/semantic-conventions.d.ts +29 -0
  47. package/dist/semantic-conventions.js +5 -0
  48. package/dist/semantic-conventions.js.map +1 -0
  49. package/dist/semantic-helpers.cjs +6 -6
  50. package/dist/semantic-helpers.js +2 -2
  51. package/dist/webhook.cjs +2 -2
  52. package/dist/webhook.js +1 -1
  53. package/dist/workflow-distributed.cjs +3 -3
  54. package/dist/workflow-distributed.js +1 -1
  55. package/dist/workflow.cjs +6 -6
  56. package/dist/workflow.js +2 -2
  57. package/package.json +16 -11
  58. package/src/decorators.test.ts +22 -72
  59. package/src/functional.test.ts +24 -6
  60. package/src/functional.ts +37 -2
  61. package/src/index.ts +9 -0
  62. package/src/init.openllmetry.test.ts +76 -76
  63. package/src/semantic-conventions.ts +15 -0
  64. package/dist/chunk-4HPWUYCV.js.map +0 -1
  65. package/dist/chunk-7F4PDILZ.cjs +0 -931
  66. package/dist/chunk-7F4PDILZ.cjs.map +0 -1
  67. package/dist/chunk-DWRTSOGR.cjs.map +0 -1
package/src/functional.ts CHANGED
@@ -2338,6 +2338,41 @@ export function withBaggage<T = unknown>(
2338
2338
  // Create new context with updated baggage
2339
2339
  const newContext = propagation.setBaggage(currentContext, updatedBaggage);
2340
2340
 
2341
- // Run the function within the new context
2342
- return context.with(newContext, fn);
2341
+ // Sync contextStorage so nested traces (via getActiveContextWithBaggage) see the baggage.
2342
+ // Use run() instead of enterWith() to properly scope the context changes.
2343
+ const ctxStorage = getContextStorage();
2344
+ const previousStored = ctxStorage.getStore();
2345
+ const baggageEnrichedStored = previousStored
2346
+ ? propagation.setBaggage(previousStored, updatedBaggage)
2347
+ : newContext;
2348
+
2349
+ // Run the function within the new context, scoped properly
2350
+ const result = previousStored
2351
+ ? ctxStorage.run(baggageEnrichedStored, () => context.with(newContext, fn))
2352
+ : context.with(newContext, fn);
2353
+
2354
+ if (result instanceof Promise) {
2355
+ // For async operations, ensure context is restored after the promise settles
2356
+ return result.then(
2357
+ (value) => {
2358
+ // Restore original context before resolving
2359
+ if (previousStored) {
2360
+ return ctxStorage.run(previousStored, () => value);
2361
+ }
2362
+ return value;
2363
+ },
2364
+ (err) => {
2365
+ // Restore original context before rejecting
2366
+ if (previousStored) {
2367
+ return ctxStorage.run(previousStored, () => {
2368
+ throw err;
2369
+ });
2370
+ }
2371
+ throw err;
2372
+ },
2373
+ );
2374
+ }
2375
+
2376
+ // Sync function - context automatically restored when scope exits
2377
+ return result;
2343
2378
  }
package/src/index.ts CHANGED
@@ -192,6 +192,15 @@ export {
192
192
  trace as otelTrace,
193
193
  } from '@opentelemetry/api';
194
194
 
195
+ // Re-export common semantic-convention keys/builders for library instrumentation
196
+ export {
197
+ HTTPAttributes,
198
+ ServiceAttributes,
199
+ URLAttributes,
200
+ httpRequestHeaderAttribute,
201
+ httpResponseHeaderAttribute,
202
+ } from './semantic-conventions';
203
+
195
204
  // Re-export common OpenTelemetry types and utilities
196
205
  // This allows plugins and apps to use OTel without needing separate @opentelemetry/api installation
197
206
 
@@ -12,7 +12,7 @@ const mockedModules = [
12
12
  '@opentelemetry/exporter-trace-otlp-http',
13
13
  '@opentelemetry/exporter-metrics-otlp-http',
14
14
  '@opentelemetry/sdk-metrics',
15
- '@traceloop/node-server-sdk',
15
+ './node-require',
16
16
  ];
17
17
 
18
18
  // Track traceloop initialize calls globally
@@ -29,7 +29,6 @@ async function loadInitWithMocks() {
29
29
  const instance = mockDeep<NodeSDK>();
30
30
  instance.start.mockImplementation(() => {});
31
31
  instance.shutdown.mockResolvedValue();
32
- // Add getTracerProvider method (not in public interface but used internally)
33
32
 
34
33
  (instance as any).getTracerProvider = vi.fn().mockReturnValue(mock());
35
34
  sdkInstances.push({ options, instance });
@@ -69,23 +68,28 @@ async function loadInitWithMocks() {
69
68
  traceloopInitializeCalls.push(options || {});
70
69
  });
71
70
 
72
- // Re-setup the mock after resetModules
73
- // Use virtual: true to make require() fail and fall back to async import
74
- vi.doMock(
75
- '@traceloop/node-server-sdk',
76
- () => {
77
- // This will be called for dynamic import() - return the mock
78
- return {
79
- initialize: globalMockInitialize!,
80
- instrumentations: [{ name: 'openai' }, { name: 'langchain' }],
81
- default: {
82
- initialize: globalMockInitialize!,
83
- instrumentations: [{ name: 'openai' }, { name: 'langchain' }],
84
- },
85
- };
86
- },
87
- { virtual: true },
88
- );
71
+ const mockTraceloop = {
72
+ initialize: globalMockInitialize,
73
+ instrumentations: [{ name: 'openai' }, { name: 'langchain' }],
74
+ };
75
+
76
+ // Mock node-require to intercept safeRequire('@traceloop/node-server-sdk').
77
+ // vi.doMock on the traceloop module itself doesn't work because safeRequire
78
+ // uses native require() which bypasses vitest's module interception.
79
+ vi.doMock('./node-require', () => ({
80
+ safeRequire: vi.fn((id: string) => {
81
+ if (id === '@traceloop/node-server-sdk') {
82
+ return mockTraceloop;
83
+ }
84
+ return undefined;
85
+ }),
86
+ requireModule: vi.fn((id: string) => {
87
+ const err = new Error(`Cannot find module '${id}'`);
88
+ (err as NodeJS.ErrnoException).code = 'MODULE_NOT_FOUND';
89
+ throw err;
90
+ }),
91
+ nodeRequire: vi.fn(),
92
+ }));
89
93
 
90
94
  vi.doMock('@opentelemetry/sdk-node', () => ({
91
95
  NodeSDK: MockNodeSDK,
@@ -110,18 +114,15 @@ async function loadInitWithMocks() {
110
114
  getConfig: mod.getConfig,
111
115
  sdkInstances,
112
116
  traceloopInitializeCalls,
113
- mockTraceloop: {
114
- initialize: globalMockInitialize!, // Return the same mock function reference
115
- instrumentations: [{ name: 'openai' }, { name: 'langchain' }],
116
- },
117
+ mockTraceloop,
117
118
  };
118
119
  }
119
120
 
120
121
  describe('init() OpenLLMetry integration', () => {
121
122
  beforeEach(() => {
122
123
  vi.resetModules();
123
- traceloopInitializeCalls.length = 0; // Clear calls array
124
- globalMockInitialize = null; // Reset mock function
124
+ traceloopInitializeCalls.length = 0;
125
+ globalMockInitialize = null;
125
126
  });
126
127
 
127
128
  afterEach(() => {
@@ -142,11 +143,7 @@ describe('init() OpenLLMetry integration', () => {
142
143
  expect(traceloopInitializeCalls).toHaveLength(0);
143
144
  });
144
145
 
145
- // Skipped: vi.doMock doesn't properly intercept require('@traceloop/node-server-sdk')
146
- // when the real module is installed. The real module loads instead of the mock,
147
- // so initialize() calls aren't captured. This is a known vitest limitation with
148
- // optional peer dependencies that may or may not be installed.
149
- it.skip('should initialize OpenLLMetry when enabled', async () => {
146
+ it('should initialize OpenLLMetry when enabled', async () => {
150
147
  const { init, traceloopInitializeCalls } = await loadInitWithMocks();
151
148
 
152
149
  init({
@@ -154,22 +151,11 @@ describe('init() OpenLLMetry integration', () => {
154
151
  openllmetry: { enabled: true },
155
152
  });
156
153
 
157
- // Wait for async import to complete (require fails, falls back to async import)
158
- // Use a longer timeout and retry logic for CI environments
159
- let attempts = 0;
160
- while (traceloopInitializeCalls.length === 0 && attempts < 20) {
161
- await new Promise((resolve) => setTimeout(resolve, 50));
162
- attempts++;
163
- }
164
-
165
154
  expect(traceloopInitializeCalls).toHaveLength(1);
166
- const callOptions = traceloopInitializeCalls[0];
167
- expect(callOptions).toBeDefined();
155
+ expect(traceloopInitializeCalls[0]).toBeDefined();
168
156
  });
169
157
 
170
- // Skipped: Same mocking issue as above - vi.doMock doesn't intercept require()
171
- // calls for optional peer dependencies when the real module is installed.
172
- it.skip('should pass OpenLLMetry options to initialize', async () => {
158
+ it('should pass OpenLLMetry options to initialize', async () => {
173
159
  const { init, traceloopInitializeCalls } = await loadInitWithMocks();
174
160
 
175
161
  init({
@@ -183,21 +169,14 @@ describe('init() OpenLLMetry integration', () => {
183
169
  },
184
170
  });
185
171
 
186
- // Wait for async import to complete
187
- // Use a longer timeout for CI environments
188
- await new Promise((resolve) => setTimeout(resolve, 500));
189
-
190
172
  expect(traceloopInitializeCalls).toHaveLength(1);
191
- const callOptions = traceloopInitializeCalls[0];
192
- expect(callOptions).toMatchObject({
173
+ expect(traceloopInitializeCalls[0]).toMatchObject({
193
174
  disableBatch: true,
194
175
  apiKey: 'test-key',
195
176
  });
196
177
  });
197
178
 
198
- // Skipped: Same mocking issue - vi.doMock doesn't intercept require() for optional
199
- // peer dependencies, so the mock initialize() function is never called.
200
- it.skip('should reuse autotel tracer provider when OpenLLMetry is enabled', async () => {
179
+ it('should reuse autotel tracer provider when OpenLLMetry is enabled', async () => {
201
180
  const { init, traceloopInitializeCalls, sdkInstances } =
202
181
  await loadInitWithMocks();
203
182
 
@@ -209,16 +188,9 @@ describe('init() OpenLLMetry integration', () => {
209
188
  expect(sdkInstances).toHaveLength(1);
210
189
  const sdkInstance = sdkInstances[0].instance;
211
190
 
212
- // Wait a bit for async operations if any
213
- // Use a longer timeout for CI environments
214
- await new Promise((resolve) => setTimeout(resolve, 500));
215
-
216
191
  expect(traceloopInitializeCalls).toHaveLength(1);
217
192
  const callOptions = traceloopInitializeCalls[0];
218
- // Should pass tracer provider to OpenLLMetry
219
193
  expect(callOptions).toBeDefined();
220
- // Verify getTracerProvider was called to get the provider
221
-
222
194
  expect((sdkInstance as any).getTracerProvider).toHaveBeenCalled();
223
195
  });
224
196
 
@@ -228,26 +200,61 @@ describe('init() OpenLLMetry integration', () => {
228
200
  init({
229
201
  service: 'test-app',
230
202
  openllmetry: { enabled: true },
231
- autoInstrumentations: false, // This means selectiveInstrumentation is true by default
203
+ autoInstrumentations: false,
232
204
  });
233
205
 
234
206
  const options = sdkInstances.at(-1)?.options as Record<string, unknown>;
235
207
  const instrumentations = options.instrumentations as unknown[];
236
208
 
237
- // When selectiveInstrumentation is true (default), OpenLLMetry instrumentations should be added
238
209
  expect(instrumentations).toBeDefined();
239
- // Should include OpenLLMetry instrumentations
240
210
  expect(mockTraceloop.instrumentations).toBeDefined();
241
211
  });
242
212
 
243
213
  it('should handle missing @traceloop/node-server-sdk gracefully', async () => {
244
- vi.doMock('@traceloop/node-server-sdk', () => {
245
- throw new Error('Module not found');
246
- });
214
+ vi.resetModules();
215
+
216
+ // Mock node-require to return undefined for traceloop (simulating not installed)
217
+ vi.doMock('./node-require', () => ({
218
+ safeRequire: vi.fn(() => undefined),
219
+ requireModule: vi.fn((id: string) => {
220
+ const err = new Error(`Cannot find module '${id}'`);
221
+ (err as NodeJS.ErrnoException).code = 'MODULE_NOT_FOUND';
222
+ throw err;
223
+ }),
224
+ nodeRequire: vi.fn(),
225
+ }));
226
+
227
+ vi.doMock('@opentelemetry/sdk-node', () => ({
228
+ NodeSDK: class {
229
+ constructor() {
230
+ const instance = mockDeep<NodeSDK>();
231
+ instance.start.mockImplementation(() => {});
232
+ instance.shutdown.mockResolvedValue();
233
+ return instance;
234
+ }
235
+ },
236
+ }));
237
+
238
+ vi.doMock('@opentelemetry/exporter-trace-otlp-http', () => ({
239
+ OTLPTraceExporter: class {
240
+ constructor() {}
241
+ },
242
+ }));
243
+
244
+ vi.doMock('@opentelemetry/exporter-metrics-otlp-http', () => ({
245
+ OTLPMetricExporter: class {
246
+ constructor() {}
247
+ },
248
+ }));
249
+
250
+ vi.doMock('@opentelemetry/sdk-metrics', () => ({
251
+ PeriodicExportingMetricReader: class {
252
+ constructor() {}
253
+ },
254
+ }));
247
255
 
248
256
  const { init } = await import('./init');
249
257
 
250
- // Should not throw, but log a warning
251
258
  expect(() => {
252
259
  init({
253
260
  service: 'test-app',
@@ -256,10 +263,7 @@ describe('init() OpenLLMetry integration', () => {
256
263
  }).not.toThrow();
257
264
  });
258
265
 
259
- // Skipped: Same mocking issue - vi.doMock doesn't intercept require() calls,
260
- // so the async import fallback path is used but the mock isn't found either.
261
- // This prevents proper verification of the initialization sequence.
262
- it.skip('should initialize OpenLLMetry after SDK start', async () => {
266
+ it('should initialize OpenLLMetry after SDK start', async () => {
263
267
  const { init, sdkInstances, traceloopInitializeCalls } =
264
268
  await loadInitWithMocks();
265
269
 
@@ -268,15 +272,11 @@ describe('init() OpenLLMetry integration', () => {
268
272
  openllmetry: { enabled: true },
269
273
  });
270
274
 
271
- // Wait for async import to complete (require fails, falls back to async import)
272
- // Use a longer timeout for CI environments
273
- await new Promise((resolve) => setTimeout(resolve, 500));
274
-
275
- // Verify SDK started (it's called synchronously in init)
275
+ // Verify SDK started (synchronously in init)
276
276
  expect(sdkInstances).toHaveLength(1);
277
277
  expect(sdkInstances[0].instance.start).toHaveBeenCalled();
278
278
 
279
- // Verify OpenLLMetry was initialized (via async import)
279
+ // Verify OpenLLMetry was initialized (synchronously via safeRequire)
280
280
  expect(traceloopInitializeCalls).toHaveLength(1);
281
281
  });
282
282
  });
@@ -0,0 +1,15 @@
1
+ import {
2
+ HTTPAttributes,
3
+ ServiceAttributes,
4
+ URLAttributes,
5
+ } from './attributes/registry';
6
+
7
+ export { HTTPAttributes, ServiceAttributes, URLAttributes };
8
+
9
+ export function httpRequestHeaderAttribute(name: string): string {
10
+ return `http.request.header.${name.toLowerCase()}`;
11
+ }
12
+
13
+ export function httpResponseHeaderAttribute(name: string): string {
14
+ return `http.response.header.${name.toLowerCase()}`;
15
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/attributes/registry.ts","../src/attributes/builders.ts","../src/attributes/validators.ts","../src/attributes/utils.ts","../src/attributes/attachers.ts","../src/attributes/domains.ts"],"names":["replacement","attrs"],"mappings":";;;;AAKO,IAAM,cAAA,GAAiB;AAAA,EAC5B,EAAA,EAAI,SAAA;AAAA,EACJ,KAAA,EAAO,YAAA;AAAA,EACP,IAAA,EAAM,WAAA;AAAA,EACN,QAAA,EAAU,gBAAA;AAAA,EACV,IAAA,EAAM,WAAA;AAAA,EACN,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,EAAA,EAAI,YAAA;AAAA,EACJ,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,EAAA,EAAI,WAAA;AAAA,EACJ,YAAA,EAAc,qBAAA;AAAA,EACd,eAAA,EAAiB,yBAAA;AAAA,EACjB,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,eAAA,EAAiB,uBAAA;AAAA,EACjB,aAAA,EAAe,qBAAA;AAAA,EACf,qBAAA,EAAuB,8BAAA;AAAA,EACvB,kBAAA,EAAoB,2BAAA;AAAA,EACpB,WAAA,EAAa,mBAAA;AAAA,EACb,eAAA,EAAiB,wBAAA;AAAA,EACjB,YAAA,EAAc,oBAAA;AAAA,EACd,gBAAA,EAAkB,yBAAA;AAAA,EAClB,kBAAA,EAAoB,2BAAA;AAAA,EACpB,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,YAAA,GAAe;AAAA,EAG1B,cAAA,EAAgB,oBAAA;AAAA,EAChB,SAAA,EAAW,cAAA;AAAA,EAEX,aAAA,EAAe,mBAAA;AAAA,EACf,YAAA,EAAc,kBAAA;AAAA,EACd,SAAA,EAAW,eAAA;AAAA,EACX,oBAAA,EAAsB,2BAAA;AAAA,EACtB,kBAAA,EAAoB,yBAAA;AAAA,EACpB,UAAA,EAAY,gBAAA;AAAA,EACZ,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU,qBAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,WAAA,EAAa,sBAAA;AAAA,EACb,QAAA,EAAU,mBAAA;AAAA,EACV,SAAA,EAAW,mBAAA;AAAA,EAEX,YAAA,EAAc,uBAAA;AAAA,EACd,eAAA,EAAiB;AACnB,CAAA;AAEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,OAAA,EAAS,gBAAA;AAAA,EACT,IAAA,EAAM,aAAA;AAAA,EACN,aAAA,EAAe;AACjB,CAAA;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,MAAA,EAAQ,YAAA;AAAA,EACR,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,UAAA;AAAA,EACN,KAAA,EAAO,WAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,IAAA,EAAM,YAAA;AAAA,EACN,OAAA,EAAS,eAAA;AAAA,EACT,UAAA,EAAY,aAAA;AAAA,EACZ,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,OAAA,EAAS,mBAAA;AAAA,EACT,OAAA,EAAS,mBAAA;AAAA,EACT,UAAA,EAAY,sBAAA;AAAA,EACZ,IAAA,EAAM,gBAAA;AAAA,EACN,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,GAAA,EAAK,aAAA;AAAA,EACL,cAAA,EAAgB,yBAAA;AAAA,EAChB,OAAA,EAAS,iBAAA;AAAA,EACT,KAAA,EAAO,eAET,CAAA;AAEO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,EAAA,EAAI,WAAA;AAAA,EACJ,IAAA,EAAM;AACR,CAAA;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,EAAA,EAAI,cAAA;AAAA,EACJ,IAAA,EAAM,gBAAA;AAAA,EACN,KAAA,EAAO,sBAAA;AAAA,EACP,GAAA,EAAK;AACP,CAAA;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,OAAA,EAAS,cAAA;AAAA,EACT,aAAA,EAAe,oBAAA;AAAA,EACf,cAAA,EAAgB,qBAAA;AAAA,EAChB,KAAA,EAAO;AACT,CAAA;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,QAAA,EAAU,gBAAA;AAAA,EACV,SAAA,EAAW,kBAAA;AAAA,EACX,MAAA,EAAQ,cAAA;AAAA,EACR,gBAAA,EAAkB,yBAAA;AAAA,EAClB,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,WAAA;AAAA,EACN,OAAA,EAAS,cAAA;AAAA,EACT,QAAA,EAAU,eAAA;AAAA,EACV,SAAA,EAAW,gBAAA;AAAA,EACX,SAAA,EAAW;AACb,CAAA;AAEO,IAAM,qBAAA,GAAwB;AAAA,EACnC,GAAA,EAAK,kBAAA;AAAA,EACL,QAAA,EAAU,4BAAA;AAAA,EACV,OAAA,EAAS;AACX,CAAA;AAEO,IAAM,mBAAA,GAAsB;AAAA,EACjC,MAAA,EAAQ,kBAAA;AAAA,EACR,WAAA,EAAa,4BAAA;AAAA,EACb,SAAA,EAAW,qBAAA;AAAA,EACX,SAAA,EAAW,sBAAA;AAAA,EACX,cAAA,EAAgB,2BAGlB,CAAA;AAEO,IAAM,eAAA,GAAkB;AAAA,EAC7B,MAAA,EAAQ,eAAA;AAAA,EACR,YAAA,EAAc,sBAAA;AAAA,EACd,aAAA,EAAe,uBAAA;AAAA,EACf,aAAA,EAAe,uBAAA;AAAA,EACf,iBAAA,EAAmB,4BAAA;AAAA,EACnB,qBAAA,EAAuB,gCAAA;AAAA,EACvB,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,MAAA,EAAQ,YAAA;AAAA,EACR,OAAA,EAAS,aAAA;AAAA,EACT,MAAA,EAAQ,YAAA;AAAA,EACR,cAAA,EAAgB;AAClB,CAAA;AAEO,IAAM,iBAAA,GAAoB;AAAA,EAC/B,QAAA,EAAU,kBAAA;AAAA,EACV,aAAA,EAAe,wBAAA;AAAA,EACf,aAAA,EAAe;AACjB,CAAA;AAiBO,IAAM,cAAA,GAAiB;AAAA,EAC5B,WAAA,EAAa,mBAAA;AAAA,EACb,cAAA,EAAgB,sBAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AAEO,IAAM,cAAA,GAAiB;AAAA,EAC5B,SAAA,EAAW,gBAAA;AAAA,EACX,QAAA,EAAU,eAAA;AAAA,EACV,QAAA,EAAU,eAAA;AAAA,EACV,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,aAAA;AAAA,EACR,MAAA,EAAQ,aAAA;AAAA,EACR,UAAA,EAAY,aAAA;AAAA,EACZ,UAAA,EAAY,iBAAA;AAAA,EACZ,QAAA,EAAU;AACZ,CAAA;AAEO,IAAM,aAAA,GAAgB;AAAA,EAC3B,eAAA,EAAiB,sBAAA;AAAA,EACjB,MAAA,EAAQ,YAAA;AAAA,EACR,SAAA,EAAW,gBAAA;AAAA,EACX,OAAA,EAAS;AACX,CAAA;;;ACvJO,IAAM,KAAA,GAAQ;AAAA,EACnB,IAAA,EAAM;AAAA,IACJ,EAAA,EAAI,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,EAAE,GAAG,KAAA,EAAM,CAAA;AAAA,IACrD,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAC3D,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IACzD,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACjE,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IACzD,KAAA,EAAO,CAAC,KAAA,MAAqB,EAAE,CAAC,cAAA,CAAe,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAE7D,IAAA,EAAM,CAAC,IAAA,KAAoB;AACzB,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,EAAA,KAAO,MAAA,SAAkB,cAAA,CAAe,EAAE,IAAI,IAAA,CAAK,EAAA;AAC5D,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,SAAkB,cAAA,CAAe,KAAK,IAAI,IAAA,CAAK,KAAA;AAClE,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,cAAA,CAAe,IAAI,IAAI,IAAA,CAAK,IAAA;AAChE,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,cAAA,CAAe,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AACzC,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,cAAA,CAAe,IAAI,IAAI,IAAA,CAAK,IAAA;AAChE,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,SAAkB,cAAA,CAAe,KAAK,IAAI,IAAA,CAAK,KAAA;AAClE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,EAAA,EAAI,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,EAAE,GAAG,KAAA,EAAM,CAAA;AAAA,IACxD,UAAA,EAAY,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,UAAU,GAAG,KAAA,EAAM,CAAA;AAAA,IAExE,IAAA,EAAM,CAAC,IAAA,KAAuB;AAC5B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,EAAA,KAAO,MAAA,SAAkB,iBAAA,CAAkB,EAAE,IAAI,IAAA,CAAK,EAAA;AAC/D,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,iBAAA,CAAkB,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA;AAC9C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,CAAC,KAAA,MAAmB,EAAE,CAAC,gBAAA,CAAiB,EAAE,GAAG,KAAA,EAAM,CAAA;AAAA,IACvD,YAAA,EAAc,CAAC,KAAA,MAAmB;AAAA,MAChC,CAAC,gBAAA,CAAiB,YAAY,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,KAAA,MAAmB;AAAA,MACnC,CAAC,gBAAA,CAAiB,eAAe,GAAG;AAAA,KACtC,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,gBAAA,CAAiB,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IAErE,IAAA,EAAM,CAAC,IAAA,KAAsB;AAC3B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,EAAA,KAAO,MAAA,SAAkB,gBAAA,CAAiB,EAAE,IAAI,IAAA,CAAK,EAAA;AAC9D,MAAA,IAAI,KAAK,YAAA,KAAiB,MAAA;AACxB,QAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,CAAA,GAAI,IAAA,CAAK,YAAA;AAC/C,MAAA,IAAI,KAAK,eAAA,KAAoB,MAAA;AAC3B,QAAA,MAAA,CAAO,gBAAA,CAAiB,eAAe,CAAA,GAAI,IAAA,CAAK,eAAA;AAClD,MAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,QAAA,MAAA,CAAO,gBAAA,CAAiB,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAC5C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS;AAAA,MACP,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,aAAa,GAAG,KAAA,EAAM,CAAA;AAAA,MACpE,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,QAClC,CAAC,cAAA,CAAe,qBAAqB,GAAG;AAAA,OAC1C,CAAA;AAAA,MACA,WAAA,EAAa,CAAC,KAAA,MAAmB;AAAA,QAC/B,CAAC,cAAA,CAAe,kBAAkB,GAAG;AAAA,OACvC,CAAA;AAAA,MACA,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,WAAW,GAAG,KAAA,EAAM,CAAA;AAAA,MAChE,QAAA,EAAU,CAAC,KAAA,MAAmB;AAAA,QAC5B,CAAC,cAAA,CAAe,eAAe,GAAG;AAAA,OACpC;AAAA,KACF;AAAA,IAEA,QAAA,EAAU;AAAA,MACR,UAAA,EAAY,CAAC,KAAA,MAAmB;AAAA,QAC9B,CAAC,cAAA,CAAe,kBAAkB,GAAG;AAAA,OACvC,CAAA;AAAA,MACA,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,YAAY,GAAG,KAAA,EAAM,CAAA;AAAA,MACjE,QAAA,EAAU,CAAC,KAAA,MAAmB;AAAA,QAC5B,CAAC,cAAA,CAAe,gBAAgB,GAAG;AAAA,OACrC;AAAA,KACF;AAAA,IAEA,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAC3D,eAAA,EAAiB,CAAC,KAAA,MAAmB;AAAA,MACnC,CAAC,cAAA,CAAe,eAAe,GAAG;AAAA,KACpC,CAAA;AAAA,IAEA,MAAA,EAAQ,CAAC,IAAA,KAA0B;AACjC,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,MAAA,KAAW,MAAA;AAClB,QAAA,MAAA,CAAO,cAAA,CAAe,aAAa,CAAA,GAAI,IAAA,CAAK,MAAA;AAC9C,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,SAAkB,cAAA,CAAe,KAAK,IAAI,IAAA,CAAK,KAAA;AAClE,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,cAAA,CAAe,kBAAkB,CAAA,GAAI,IAAA,CAAK,UAAA;AACnD,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,cAAA,CAAe,eAAe,CAAA,GAAI,IAAA,CAAK,QAAA;AAChD,MAAA,IAAI,KAAK,WAAA,KAAgB,MAAA;AACvB,QAAA,MAAA,CAAO,cAAA,CAAe,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA;AAC5C,MAAA,IAAI,KAAK,YAAA,KAAiB,MAAA;AACxB,QAAA,MAAA,CAAO,cAAA,CAAe,YAAY,CAAA,GAAI,IAAA,CAAK,YAAA;AAC7C,MAAA,IAAI,KAAK,WAAA,KAAgB,MAAA;AACvB,QAAA,MAAA,CAAO,cAAA,CAAe,kBAAkB,CAAA,GAAI,IAAA,CAAK,WAAA;AACnD,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAA,EAAQ,CAAC,IAAA,KAA0B;AACjC,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,MAAA,KAAW,MAAA;AAClB,QAAA,MAAA,CAAO,cAAA,CAAe,aAAa,CAAA,GAAI,IAAA,CAAK,MAAA;AAC9C,MAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,SAAkB,cAAA,CAAe,KAAK,IAAI,IAAA,CAAK,GAAA;AAChE,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,cAAA,CAAe,kBAAkB,CAAA,GAAI,IAAA,CAAK,UAAA;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,EAAA,EAAI;AAAA,IACF,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,UAAU,GAAG,KAAA,EAAM,CAAA;AAAA,MAC/D,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,aAAa,GAAG,KAAA,EAAM,CAAA;AAAA,MACrE,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,QAClC,CAAC,YAAA,CAAa,cAAc,GAAG;AAAA,OACjC,CAAA;AAAA,MACA,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,MACjE,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,MACjE,YAAA,EAAc,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,YAAY,GAAG,KAAA,EAAM,CAAA;AAAA,MACvE,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,YAAA,CAAa,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,MACjE,cAAA,EAAgB,CAAC,KAAA,MAA4B;AAAA,QAC3C,CAAC,YAAA,CAAa,kBAAkB,GAAG;AAAA,OACrC,CAAA;AAAA,MACA,YAAA,EAAc,CAAC,KAAA,MAAmB;AAAA,QAChC,CAAC,YAAA,CAAa,oBAAoB,GAAG;AAAA,OACvC,CAAA;AAAA,MAEA,IAAA,EAAM,CAAC,IAAA,KAAkB;AACvB,QAAA,MAAM,SAAkC,EAAC;AACzC,QAAA,IAAI,KAAK,MAAA,KAAW,MAAA;AAClB,UAAA,MAAA,CAAO,YAAA,CAAa,UAAU,CAAA,GAAI,IAAA,CAAK,MAAA;AACzC,QAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,UAAA,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA,GAAI,IAAA,CAAK,SAAA;AAC5C,QAAA,IAAI,KAAK,cAAA,KAAmB,MAAA;AAC1B,UAAA,MAAA,CAAO,YAAA,CAAa,cAAc,CAAA,GAAI,IAAA,CAAK,cAAA;AAE7C,QAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,YAAA,CAAa,SAAS,IAAI,IAAA,CAAK,IAAA;AAEnE,QAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,UAAA,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AACxC,QAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,UAAA,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AACxC,QAAA,IAAI,KAAK,YAAA,KAAiB,MAAA;AACxB,UAAA,MAAA,CAAO,YAAA,CAAa,YAAY,CAAA,GAAI,IAAA,CAAK,YAAA;AAC3C,QAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,UAAA,MAAA,CAAO,YAAA,CAAa,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AACxC,QAAA,IAAI,KAAK,cAAA,KAAmB,MAAA;AAC1B,UAAA,MAAA,CAAO,YAAA,CAAa,kBAAkB,CAAA,GAAI,IAAA,CAAK,cAAA;AACjD,QAAA,IAAI,KAAK,YAAA,KAAiB,MAAA;AACxB,UAAA,MAAA,CAAO,YAAA,CAAa,oBAAoB,CAAA,GAAI,IAAA,CAAK,YAAA;AACnD,QAAA,OAAO,MAAA;AAAA,MACT;AAAA;AACF,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAC5D,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACpE,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAElE,IAAA,EAAM,CAAC,IAAA,KAAuB;AAC5B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,iBAAA,CAAkB,IAAI,IAAI,IAAA,CAAK,IAAA;AACnE,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,iBAAA,CAAkB,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AAC5C,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC3C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,WAAA,EAAa,CAAC,KAAA,MAAmB;AAAA,MAC/B,CAAC,iBAAA,CAAkB,WAAW,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACpE,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IACtE,YAAA,EAAc,CAAC,KAAA,MAAmB;AAAA,MAChC,CAAC,iBAAA,CAAkB,YAAY,GAAG;AAAA,KACpC,CAAA;AAAA,IACA,eAAA,EAAiB,CAAC,KAAA,MAAmB;AAAA,MACnC,CAAC,iBAAA,CAAkB,eAAe,GAAG;AAAA,KACvC,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,IAAA,KAAuB;AAC5B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,WAAA,KAAgB,MAAA;AACvB,QAAA,MAAA,CAAO,iBAAA,CAAkB,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA;AAC/C,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,iBAAA,CAAkB,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AAC5C,MAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,QAAA,MAAA,CAAO,iBAAA,CAAkB,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAC7C,MAAA,IAAI,KAAK,YAAA,KAAiB,MAAA;AACxB,QAAA,MAAA,CAAO,iBAAA,CAAkB,YAAY,CAAA,GAAI,IAAA,CAAK,YAAA;AAChD,MAAA,IAAI,KAAK,eAAA,KAAoB,MAAA;AAC3B,QAAA,MAAA,CAAO,iBAAA,CAAkB,eAAe,CAAA,GAAI,IAAA,CAAK,eAAA;AACnD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,uBAAA,CAAwB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IACxE,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,uBAAA,CAAwB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAClE,aAAA,EAAe,CAAC,KAAA,MAAmB;AAAA,MACjC,CAAC,uBAAA,CAAwB,aAAa,GAAG;AAAA,KAC3C,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,IAAA,KAA6B;AAClC,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,uBAAA,CAAwB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AACjD,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA;AAChB,QAAA,MAAA,CAAO,uBAAA,CAAwB,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA;AAC9C,MAAA,IAAI,KAAK,aAAA,KAAkB,MAAA;AACzB,QAAA,MAAA,CAAO,uBAAA,CAAwB,aAAa,CAAA,GAAI,IAAA,CAAK,aAAA;AACvD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC5D,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IACxD,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IACxD,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAC1D,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IAEhE,IAAA,EAAM,CAAC,IAAA,KAAmB;AACxB,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,MAAA,KAAW,MAAA,SAAkB,aAAA,CAAc,MAAM,IAAI,IAAA,CAAK,MAAA;AACnE,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,aAAA,CAAc,IAAI,IAAI,IAAA,CAAK,IAAA;AAC/D,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,aAAA,CAAc,IAAI,IAAI,IAAA,CAAK,IAAA;AAC/D,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA,SAAkB,aAAA,CAAc,KAAK,IAAI,IAAA,CAAK,KAAA;AACjE,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,aAAA,CAAc,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AACxC,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAC1D,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAChE,UAAA,EAAY,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,UAAU,GAAG,KAAA,EAAM,CAAA;AAAA,IACtE,IAAA,EAAM,CAAC,KAAA,MAA4B,EAAE,CAAC,eAAA,CAAgB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAEnE,IAAA,EAAM,CAAC,IAAA,KAAqB;AAC1B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,eAAA,CAAgB,IAAI,IAAI,IAAA,CAAK,IAAA;AACjE,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,eAAA,CAAgB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AACzC,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,eAAA,CAAgB,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA;AAC5C,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,eAAA,CAAgB,IAAI,IAAI,IAAA,CAAK,IAAA;AACjE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,OAAA,EAAS,CAAC,KAAA,MAAoB,EAAE,CAAC,mBAAA,CAAoB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IACrE,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IACpE,UAAA,EAAY,CAAC,KAAA,MAAmB;AAAA,MAC9B,CAAC,mBAAA,CAAoB,UAAU,GAAG;AAAA,KACpC,CAAA;AAAA,IACA,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,UAAA,EAAY,CAAC,KAAA,MAAmB;AAAA,MAC9B,CAAC,mBAAA,CAAoB,UAAU,GAAG;AAAA,KACpC,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,IAAA,KAAyB;AAC9B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,mBAAA,CAAoB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC7C,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,mBAAA,CAAoB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC7C,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA;AAChD,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,mBAAA,CAAoB,IAAI,IAAI,IAAA,CAAK,IAAA;AACrE,MAAA,IAAI,KAAK,UAAA,KAAe,MAAA;AACtB,QAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,CAAA,GAAI,IAAA,CAAK,UAAA;AAChD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,GAAA,EAAK,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,GAAG,GAAG,KAAA,EAAM,CAAA;AAAA,IAC1D,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,MAClC,CAAC,iBAAA,CAAkB,cAAc,GAAG;AAAA,KACtC,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAClE,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAE9D,IAAA,EAAM,CAAC,IAAA,KAAuB;AAC5B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,SAAkB,iBAAA,CAAkB,GAAG,IAAI,IAAA,CAAK,GAAA;AACjE,MAAA,IAAI,KAAK,cAAA,KAAmB,MAAA;AAC1B,QAAA,MAAA,CAAO,iBAAA,CAAkB,cAAc,CAAA,GAAI,IAAA,CAAK,cAAA;AAClD,MAAA,IAAI,KAAK,OAAA,KAAY,MAAA;AACnB,QAAA,MAAA,CAAO,iBAAA,CAAkB,OAAO,CAAA,GAAI,IAAA,CAAK,OAAA;AAC3C,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA;AACjB,QAAA,MAAA,CAAO,iBAAA,CAAkB,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,MAAA,EAAQ;AAAA,IACN,EAAA,EAAI,CAAC,KAAA,MAAmB,EAAE,CAAC,gBAAA,CAAiB,EAAE,GAAG,KAAA,EAAM,CAAA;AAAA,IACvD,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,gBAAA,CAAiB,IAAI,GAAG,KAAA,EAAM;AAAA,GAC7D;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,EAAA,EAAI,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,EAAE,GAAG,KAAA,EAAM,CAAA;AAAA,IAC1D,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAChE,GAAA,EAAK,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,GAAG,GAAG,KAAA,EAAM,CAAA;AAAA,IAE5D,IAAA,EAAM,CAAC,IAAA,KAAyB;AAC9B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,EAAA,KAAO,MAAA,SAAkB,mBAAA,CAAoB,EAAE,IAAI,IAAA,CAAK,EAAA;AACjE,MAAA,IAAI,KAAK,IAAA,KAAS,MAAA,SAAkB,mBAAA,CAAoB,IAAI,IAAI,IAAA,CAAK,IAAA;AACrE,MAAA,IAAI,KAAK,KAAA,KAAU,MAAA;AACjB,QAAA,MAAA,CAAO,mBAAA,CAAoB,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA;AAC3C,MAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,SAAkB,mBAAA,CAAoB,GAAG,IAAI,IAAA,CAAK,GAAA;AACnE,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,aAAA,EAAe,CAAC,KAAA,MAAmB;AAAA,MACjC,CAAC,aAAA,CAAc,aAAa,GAAG;AAAA,KACjC,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,MAClC,CAAC,aAAA,CAAc,cAAc,GAAG;AAAA,KAClC,CAAA;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,KAAK,GAAG,KAAA,EAAM;AAAA,GAC5D;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IAClE,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IACpE,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,gBAAA,EAAkB,CAAC,KAAA,MAAmB;AAAA,MACpC,CAAC,eAAA,CAAgB,gBAAgB,GAAG;AAAA,KACtC,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IAElE,IAAA,EAAM,CAAC,IAAA,KAAqB;AAC1B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AAC1C,MAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,QAAA,MAAA,CAAO,eAAA,CAAgB,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAC3C,MAAA,IAAI,KAAK,MAAA,KAAW,MAAA;AAClB,QAAA,MAAA,CAAO,eAAA,CAAgB,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA;AACxC,MAAA,IAAI,KAAK,gBAAA,KAAqB,MAAA;AAC5B,QAAA,MAAA,CAAO,eAAA,CAAgB,gBAAgB,CAAA,GAAI,IAAA,CAAK,gBAAA;AAClD,MAAA,IAAI,KAAK,QAAA,KAAa,MAAA;AACpB,QAAA,MAAA,CAAO,eAAA,CAAgB,QAAQ,CAAA,GAAI,IAAA,CAAK,QAAA;AAC1C,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,IAAI,GAAG,KAAA,EAAM,CAAA;AAAA,IACzD,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAC/D,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACjE,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IACnE,SAAA,EAAW,CAAC,KAAA,MAAoB,EAAE,CAAC,cAAA,CAAe,SAAS,GAAG,KAAA,EAAM;AAAA,GACtE;AAAA,EAEA,WAAA,EAAa;AAAA,IACX,GAAA,EAAK,CAAC,KAAA,MAAmB,EAAE,CAAC,qBAAA,CAAsB,GAAG,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,qBAAA,CAAsB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACxE,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,qBAAA,CAAsB,OAAO,GAAG,KAAA,EAAM;AAAA,GACxE;AAAA,EAEA,SAAA,EAAW;AAAA,IACT,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAClE,WAAA,EAAa,CAAC,KAAA,MAAmB;AAAA,MAC/B,CAAC,mBAAA,CAAoB,WAAW,GAAG;AAAA,KACrC,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,MAA8C;AAAA,MACxD,CAAC,mBAAA,CAAoB,SAAS,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,mBAAA,CAAoB,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IACxE,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,MAClC,CAAC,mBAAA,CAAoB,cAAc,GAAG;AAAA,KACxC,CAAA;AAAA,IAEA,IAAA,EAAM,CAAC,IAAA,KAAyB;AAC9B,MAAA,MAAM,SAAkC,EAAC;AACzC,MAAA,IAAI,KAAK,MAAA,KAAW,MAAA;AAClB,QAAA,MAAA,CAAO,mBAAA,CAAoB,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA;AAC5C,MAAA,IAAI,KAAK,WAAA,KAAgB,MAAA;AACvB,QAAA,MAAA,CAAO,mBAAA,CAAoB,WAAW,CAAA,GAAI,IAAA,CAAK,WAAA;AACjD,MAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAC/C,MAAA,IAAI,KAAK,SAAA,KAAc,MAAA;AACrB,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,CAAA,GAAI,IAAA,CAAK,SAAA;AAC/C,MAAA,IAAI,KAAK,cAAA,KAAmB,MAAA;AAC1B,QAAA,MAAA,CAAO,mBAAA,CAAoB,cAAc,CAAA,GAAI,IAAA,CAAK,cAAA;AACpD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,GACF;AAAA,EAEA,KAAA,EAAO;AAAA,IACL,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,YAAA,EAAc,CAAC,KAAA,MAAmB;AAAA,MAChC,CAAC,eAAA,CAAgB,YAAY,GAAG;AAAA,KAClC,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,KAAA,MAAmB;AAAA,MACjC,CAAC,eAAA,CAAgB,aAAa,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,KAAA,MAAgD;AAAA,MAC9D,CAAC,eAAA,CAAgB,aAAa,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,iBAAA,EAAmB,CAAC,KAAA,MAAmB;AAAA,MACrC,CAAC,eAAA,CAAgB,iBAAiB,GAAG;AAAA,KACvC,CAAA;AAAA,IACA,qBAAA,EAAuB,CAAC,KAAA,MAAmB;AAAA,MACzC,CAAC,eAAA,CAAgB,qBAAqB,GAAG;AAAA,KAC3C,CAAA;AAAA,IACA,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,eAAA,CAAgB,QAAQ,GAAG,KAAA,EAAM;AAAA,GACpE;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC5D,OAAA,EAAS,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,OAAO,GAAG,KAAA,EAAM,CAAA;AAAA,IAC9D,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC5D,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,MAClC,CAAC,aAAA,CAAc,cAAc,GAAG;AAAA,KAClC;AAAA,GACF;AAAA,EAEA,OAAA,EAAS;AAAA,IACP,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,iBAAA,CAAkB,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACpE,aAAA,EAAe,CAAC,KAAA,MAAmB;AAAA,MACjC,CAAC,iBAAA,CAAkB,aAAa,GAAG;AAAA,KACrC,CAAA;AAAA,IACA,aAAA,EAAe,CAAC,KAAA,MAAkD;AAAA,MAChE,CAAC,iBAAA,CAAkB,aAAa,GAAG;AAAA,KACrC;AAAA,GACF;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,WAAA,EAAa,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,WAAW,GAAG,KAAA,EAAM,CAAA;AAAA,IACvE,cAAA,EAAgB,CAAC,KAAA,MAAmB;AAAA,MAClC,CAAC,cAAA,CAAe,cAAc,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,UAAA,EAAY,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,UAAU,GAAG,KAAA,EAAM;AAAA,GACvE;AAAA,EAEA,IAAA,EAAM;AAAA,IACJ,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IACnE,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACjE,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,QAAQ,GAAG,KAAA,EAAM,CAAA;AAAA,IACjE,KAAA,EAAO,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,KAAK,GAAG,KAAA,EAAM,CAAA;AAAA,IAC3D,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC7D,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC7D,UAAA,EAAY,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,UAAU,GAAG,KAAA,EAAM,CAAA;AAAA,IACrE,UAAA,EAAY,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,UAAU,GAAG,KAAA,EAAM,CAAA;AAAA,IACrE,QAAA,EAAU,CAAC,KAAA,MAAmB,EAAE,CAAC,cAAA,CAAe,QAAQ,GAAG,KAAA,EAAM;AAAA,GACnE;AAAA,EAEA,GAAA,EAAK;AAAA,IACH,eAAA,EAAiB,CAAC,KAAA,MAAmB;AAAA,MACnC,CAAC,aAAA,CAAc,eAAe,GAAG;AAAA,KACnC,CAAA;AAAA,IACA,MAAA,EAAQ,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,MAAM,GAAG,KAAA,EAAM,CAAA;AAAA,IAC5D,SAAA,EAAW,CAAC,KAAA,MAAmB,EAAE,CAAC,aAAA,CAAc,SAAS,GAAG,KAAA,EAAM,CAAA;AAAA,IAClE,OAAA,EAAS,CAAC,KAAA,MAAoB,EAAE,CAAC,aAAA,CAAc,OAAO,GAAG,KAAA,EAAM;AAAA;AAEnE;;;ACpgBA,IAAM,qBAAA,GAAwB;AAAA,EAC5B,YAAA,EAAc,SAAA;AAAA,EACd,cAAA,EAAgB,YAAA;AAAA,EAChB,eAAA,EAAiB,MAAA;AAAA,EACjB,aAAA,EAAe,qBAAA;AAAA,EACf,WAAA,EAAa,gBAAA;AAAA,EACb,kBAAA,EAAoB,2BAAA;AAAA,EACpB,aAAA,EAAe,UAAA;AAAA,EACf,UAAA,EAAY,UAAA;AAAA,EACZ,iBAAA,EAAmB,qBAAA;AAAA,EACnB,aAAA,EAAe,uBAAA;AAAA,EACf,aAAA,EAAe,YAAA;AAAA,EACf,kBAAA,EAAoB,gBAAA;AAAA,EACpB,SAAA,EAAW,cAAA;AAAA,EACX,cAAA,EAAgB,mBAAA;AAAA,EAChB,cAAA,EAAgB,eAAA;AAAA,EAChB,WAAA,EAAa,gBAAA;AAAA,EACb,eAAA,EAAiB,oBAAA;AAAA,EACjB,gBAAA,EAAkB,MAAA;AAAA,EAClB,0BAAA,EAA4B,MAAA;AAAA,EAC5B,wBAAA,EAA0B,qBAAA;AAAA,EAC1B,cAAA,EAAgB,oBAAA;AAAA,EAChB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,qBAAA,EAAuB;AACzB,CAAA;AAEA,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,SAAS,iBAAA,CACd,GAAA,EACA,KAAA,EACA,MAAA,GAA0B,EAAC,EAClB;AACT,EAAA,MAAM,EAAE,UAAA,GAAa,EAAC,EAAE,GAAI,MAAA;AAE5B,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAI7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,KAAA;AAEpB,EAAA,IAAI,WAAW,GAAA,EAAK;AAClB,IAAA,MAAM,SAAA,GAAY,cAAA,CAAe,GAAA,EAAK,WAAA,EAAa,WAAW,GAAG,CAAA;AACjE,IAAA,IAAI,cAAc,WAAA,EAAa;AAC7B,MAAA,OAAO,SAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,CAAW,SAAA,IAAa,WAAA,CAAY,MAAA,GAAS,WAAW,SAAA,EAAW;AACrE,IAAA,OAAO,aAAA,CAAc,GAAA,EAAK,WAAA,EAAa,UAAA,CAAW,SAAS,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,UAAA,CAAW,YAAA,IAAgB,YAAA,CAAa,GAAA,CAAI,WAAW,CAAA,EAAG;AAC5D,IAAA,MAAM,gBAAA,GAAmB,oBAAoB,WAAW,CAAA;AACxD,IAAA,IAAI,qBAAqB,WAAA,EAAa;AACpC,MAAA,OAAO,gBAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;AAEA,SAAS,cAAA,CACP,GAAA,EACA,KAAA,EACA,GAAA,EACQ;AACR,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,OAAO,WAAA,CAAY,KAAK,KAAK,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAO,SAAA,CAAU,KAAK,KAAK,CAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,GAAA,KAAQ,OAAA,IAAW,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,kBAAkB,GAAG,CAAA,0DAAA;AAAA,KACvB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAS,GAAA,EAAsB;AACtC,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,EAAA,OAAO,eAAe,IAAA,CAAK,CAAC,YAAY,QAAA,CAAS,QAAA,CAAS,OAAO,CAAC,CAAA;AACpE;AAEA,SAAS,WAAA,CAAY,KAAa,KAAA,EAAuB;AACvD,EAAA,IAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAEjB,IAAA,KAAA,MAAW,GAAG,OAAO,KAAK,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAA,EAAG;AAC3D,MAAA,IAAI,OAAA,YAAmB,MAAA,IAAU,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AACpD,QAAA,OAAO,YAAA;AAAA,MACT;AAAA,IACF;AAEA,IAAA,OAAO,YAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,KAAa,KAAA,EAAuB;AACrD,EAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,MAAM,SAAA,GAAY,QAAA;AAClB,EAAA,MAAM,UAAA,GAAa,UAAA;AAGnB,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,CAAA,EAAG,KAAA,EAAA,EAAS;AACtC,IAAA,IAAI,IAAA,GAAO,UAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,IAAA,IAAA,CAAS,KAAA,CAAM,WAAA,CAAY,CAAC,CAAA,IAAK,CAAA,IAAK,KAAA;AACtC,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,IAAA,EAAM,SAAS,CAAA;AAAA,IAClC;AACA,IAAA,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,QAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,QAAA,CAAS,EAAE,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAA,CAAA;AAC5E;AAEA,SAAS,aAAA,CAAc,GAAA,EAAa,KAAA,EAAe,SAAA,EAA2B;AAC5E,EAAA,IAAI,KAAA,CAAM,UAAU,SAAA,EAAW;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AACzC;AAEA,SAAS,oBAAoB,MAAA,EAAwB;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AACjC,EAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,wBAAA,CACd,GAAA,EACA,MAAA,GAA0B,EAAC,EACZ;AACf,EAAA,MAAM,EAAE,UAAA,GAAa,IAAI,kBAAA,GAAqB,IAAG,GAAI,MAAA;AACrD,EAAA,MAAM,EAAE,cAAA,GAAiB,IAAA,EAAK,GAAI,UAAA;AAElC,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,eAAe,GAAA,IAAO,qBAAA;AAC5B,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,MAAMA,YAAAA,GACJ,sBAAsB,GAAyC,CAAA;AACjE,IAAA,IAAIA,iBAAgB,MAAA,EAAW;AAE7B,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,mCAAmC,GAAG,CAAA,2GAAA;AAAA,OAExC;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,gCAAA,EAAmC,GAAG,CAAA,sBAAA,EAAyBA,YAAW,CAAA,UAAA;AAAA,OAC5E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,qBAAA,EAAwB,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,WAAA,GACJ,sBAAsB,GAAyC,CAAA;AACjE,EAAA,OAAO,WAAA,IAAe,IAAA;AACxB;AAEO,SAAS,aAAA,CACd,UAAA,EACA,MAAA,GAA0B,EAAC,EACF;AACzB,EAAA,MAAM,EAAE,UAAA,GAAa,EAAE,GAAA,EAAK,QAAA,IAAW,GAAI,MAAA;AAE3C,EAAA,MAAM,WAAoC,EAAC;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AACrD,IAAA,QAAA,CAAS,GAAG,CAAA,GAAI,iBAAA,CAAkB,KAAK,KAAA,EAAO,EAAE,YAAY,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,QAAA;AACT;AAEO,SAAS,iBAAA,GAAyC;AACvD,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,QAAA;AAAA,IACL,SAAA,EAAW,GAAA;AAAA,IACX,YAAA,EAAc,IAAA;AAAA,IACd,cAAA,EAAgB;AAAA,GAClB;AACF;;;ACtPO,SAAS,cACX,QAAA,EACsB;AACzB,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,IAC/B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,iBAAA,CACd,IAAA,EACAC,MAAAA,EACA,MAAA,EACM;AAGN,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,GAAG,iBAAA,EAAkB;AAAA,IACrB,GAAG,MAAA,EAAQ;AAAA,GACb;AACA,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,GAAG,MAAA;AAAA,IACH,UAAA,EAAY;AAAA,GACd;AAEA,EAAA,MAAM,SAAA,GAAY,aAAA,CAAcA,MAAAA,EAAO,eAAe,CAAA;AAEtD,EAAA,MAAM,iBAAiD,EAAC;AACxD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,IAAA,IAAI,UAAU,MAAA,EAAW;AAEvB,MAAA,wBAAA,CAAyB,KAAK,eAAe,CAAA;AAC7C,MAAA,MAAM,cAAA,GAAiB,iBAAA,CAAkB,GAAA,EAAK,KAAA,EAAO,eAAe,CAAA;AACpE,MAAA,IAAI,mBAAmB,MAAA,EAAW;AAEhC,QAAA,cAAA,CAAe,GAAG,CAAA,GAAI,cAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAA,CAAK,cAAc,cAAc,CAAA;AACnC;;;AChDO,SAAS,OAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA;AACvC,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,UAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC1C,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,SAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AACzC,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,UAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAEzC,EAAA,IAAI,YAAA,IAAgB,aAAA,IAAiB,IAAA,CAAK,MAAA,IAAU,KAAK,KAAA,EAAO;AAC9D,IAAA,MAAM,IAAA,GAAO,aAAA;AACb,IAAA,IAAA,CAAK,WAAW,CAAA,KAAA,EAAQ,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACrD;AAEA,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,UAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACzC,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,QAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,EAAA,CAAG,MAAA,CAAO,KAAK,IAAI,CAAA;AAC5C,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAqBO,SAAS,oBAAA,CACd,UACA,IAAA,EACU;AACV,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA;AAC1C,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,sBAAA,CAAuB,UAAwB,CAAC,CAAA;AACxE;AAEO,SAAS,QAAA,CACd,aAAA,EACA,IAAA,EAKA,UAAA,EACM;AACN,EAAA,MAAM,WAAW,EAAC;AAElB,EAAA,IAAI,KAAK,IAAA,EAAM;AACb,IAAA,QAAA,CAAS,KAAK,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,KAAK,OAAA,EAAS;AAChB,IAAA,QAAA,CAAS,KAAK,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,CAAC,CAAA;AAAA,EAChD;AACA,EAAA,IAAI,KAAK,MAAA,EAAQ;AACf,IAAA,QAAA,CAAS,KAAK,KAAA,CAAM,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAC9C;AAEA,EAAA,MAAM,SAAkC,EAAC;AACzC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAA,CAAO,MAAA,CAAO,QAAQ,OAAO,CAAA;AAAA,EAC/B;AAEA,EAAA,iBAAA,CAAkB,aAAA,EAAe,QAAQ,UAAU,CAAA;AACrD;AAEO,SAAS,OAAA,CACd,aAAA,EACA,IAAA,EAGA,UAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AACxC,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,IAAA,CAAK,YAAY,EAAE,CAAA;AAClE,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,SAAA,EAAW,GAAG,YAAA,EAAa;AAC/C,EAAA,iBAAA,CAAkB,aAAA,EAAe,QAAQ,UAAU,CAAA;AACrD;AAEO,SAAS,QAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AACxC,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;AAEO,SAAS,YAAA,CACd,aAAA,EACA,IAAA,EACA,UAAA,EACM;AACN,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAC5C,EAAA,iBAAA,CAAkB,aAAA,EAAe,YAAY,UAAU,CAAA;AACzD;;;ACxJO,SAAS,WAAA,CACd,aAAA,EACA,MAAA,EAQA,UAAA,EACM;AACN,EAAA,MAAM,YAAY,KAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,IAAA,IAAQ,EAAE,CAAA;AACnD,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,KAAK,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAC5D,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO;AAAA,IAClC,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO;AAAA,GACpB,CAAA;AACD,EAAA,MAAM,eAAe,KAAA,CAAM,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,YAAY,EAAE,CAAA;AAEpE,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,GAAG,SAAA;AAAA,IACH,GAAG,YAAA;AAAA,IACH,GAAG,SAAA;AAAA,IACH,GAAG;AAAA,GACL;AAEA,EAAA,IAAI,MAAA,CAAO,MAAA,IAAU,MAAA,CAAO,KAAA,IAAS,gBAAgB,aAAA,EAAe;AAClE,IAAA,aAAA,CAAc,WAAW,CAAA,KAAA,EAAQ,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,EAClE;AAEA,EAAA,iBAAA,CAAkB,aAAA,EAAe,QAAQ,UAAU,CAAA;AACrD","file":"chunk-4HPWUYCV.js","sourcesContent":["/**\n * OpenTelemetry attribute registry\n * Central source of truth for attribute keys, types, and metadata\n */\n\nexport const UserAttributes = {\n id: 'user.id' as const,\n email: 'user.email' as const,\n name: 'user.name' as const,\n fullName: 'user.full_name' as const,\n hash: 'user.hash' as const,\n roles: 'user.roles' as const,\n} as const;\n\nexport const SessionAttributes = {\n id: 'session.id' as const,\n previousId: 'session.previous_id' as const,\n} as const;\n\nexport const DeviceAttributes = {\n id: 'device.id' as const,\n manufacturer: 'device.manufacturer' as const,\n modelIdentifier: 'device.model.identifier' as const,\n modelName: 'device.model.name' as const,\n} as const;\n\nexport const HTTPAttributes = {\n connectionState: 'http.connection.state' as const,\n requestMethod: 'http.request.method' as const,\n requestMethodOriginal: 'http.request.method_original' as const,\n requestResendCount: 'http.request.resend_count' as const,\n requestSize: 'http.request.size' as const,\n requestBodySize: 'http.request.body.size' as const,\n responseSize: 'http.response.size' as const,\n responseBodySize: 'http.response.body.size' as const,\n responseStatusCode: 'http.response.status_code' as const,\n route: 'http.route' as const,\n} as const;\n\nexport const DBAttributes = {\n clientConnectionPoolName: 'db.client.connection.pool.name' as const,\n clientConnectionState: 'db.client.connection.state' as const,\n collectionName: 'db.collection.name' as const,\n namespace: 'db.namespace' as const,\n operationBatchSize: 'db.operation.batch.size' as const,\n operationName: 'db.operation.name' as const,\n querySummary: 'db.query.summary' as const,\n queryText: 'db.query.text' as const,\n responseReturnedRows: 'db.response.returned_rows' as const,\n responseStatusCode: 'db.response.status_code' as const,\n systemName: 'db.system.name' as const,\n statement: 'db.statement' as const,\n} as const;\n\nexport const ServiceAttributes = {\n name: 'service.name' as const,\n instance: 'service.instance.id' as const,\n version: 'service.version' as const,\n} as const;\n\nexport const NetworkAttributes = {\n peerAddress: 'network.peer.address' as const,\n peerPort: 'network.peer.port' as const,\n transport: 'network.transport' as const,\n type: 'network.type' as const,\n protocolName: 'network.protocol.name' as const,\n protocolVersion: 'network.protocol.version' as const,\n} as const;\n\nexport const ServerAddressAttributes = {\n address: 'server.address' as const,\n port: 'server.port' as const,\n socketAddress: 'server.socket.address' as const,\n} as const;\n\nexport const URLAttributes = {\n scheme: 'url.scheme' as const,\n full: 'url.full' as const,\n path: 'url.path' as const,\n query: 'url.query' as const,\n fragment: 'url.fragment' as const,\n} as const;\n\nexport const ErrorAttributes = {\n type: 'error.type' as const,\n message: 'error.message' as const,\n stackTrace: 'error.stack' as const,\n code: 'error.code' as const,\n} as const;\n\nexport const ExceptionAttributes = {\n escaped: 'exception.escaped' as const,\n message: 'exception.message' as const,\n stackTrace: 'exception.stacktrace' as const,\n type: 'exception.type' as const,\n moduleName: 'exception.module' as const,\n} as const;\n\nexport const ProcessAttributes = {\n pid: 'process.pid' as const,\n executablePath: 'process.executable.path' as const,\n command: 'process.command' as const,\n owner: 'process.owner' as const,\n commandArgs: 'process.command_args' as const,\n} as const;\n\nexport const ThreadAttributes = {\n id: 'thread.id' as const,\n name: 'thread.name' as const,\n} as const;\n\nexport const ContainerAttributes = {\n id: 'container.id' as const,\n name: 'container.name' as const,\n image: 'container.image.name' as const,\n tag: 'container.image.tag' as const,\n} as const;\n\nexport const K8sAttributes = {\n podName: 'k8s.pod.name' as const,\n namespaceName: 'k8s.namespace.name' as const,\n deploymentName: 'k8s.deployment.name' as const,\n state: 'k8s.state.name' as const,\n} as const;\n\nexport const CloudAttributes = {\n provider: 'cloud.provider' as const,\n accountId: 'cloud.account.id' as const,\n region: 'cloud.region' as const,\n availabilityZone: 'cloud.availability_zone' as const,\n platform: 'cloud.platform' as const,\n} as const;\n\nexport const FaaSAttributes = {\n name: 'faas.name' as const,\n version: 'faas.version' as const,\n instance: 'faas.instance' as const,\n execution: 'faas.execution' as const,\n coldstart: 'faas.coldstart' as const,\n} as const;\n\nexport const FeatureFlagAttributes = {\n key: 'feature.flag.key' as const,\n provider: 'feature.flag.provider_name' as const,\n variant: 'feature.flag.variant.name' as const,\n} as const;\n\nexport const MessagingAttributes = {\n system: 'messaging.system' as const,\n destination: 'messaging.destination.name' as const,\n operation: 'messaging.operation' as const,\n messageId: 'messaging.message.id' as const,\n conversationId: 'messaging.conversation_id' as const,\n batchMessageCount: 'messaging.batch.message_count' as const,\n consumerGroup: 'messaging.consumer.group' as const,\n} as const;\n\nexport const GenAIAttributes = {\n system: 'gen.ai.system' as const,\n requestModel: 'gen.ai.request.model' as const,\n responseModel: 'gen.ai.response.model' as const,\n operationName: 'gen.ai.operation.name' as const,\n usagePromptTokens: 'gen.ai.usage.prompt_tokens' as const,\n usageCompletionTokens: 'gen.ai.usage.completion_tokens' as const,\n provider: 'gen.ai.provider' as const,\n} as const;\n\nexport const RPCAttributes = {\n system: 'rpc.system' as const,\n service: 'rpc.service' as const,\n method: 'rpc.method' as const,\n grpcStatusCode: 'rpc.grpc.status_code' as const,\n} as const;\n\nexport const GraphQLAttributes = {\n document: 'graphql.document' as const,\n operationName: 'graphql.operation.name' as const,\n operationType: 'graphql.operation.type' as const,\n} as const;\n\nexport const PeerAttributes = {\n service: 'peer.service' as const,\n} as const;\n\nexport const ClientAttributes = {\n address: 'client.address' as const,\n port: 'client.port' as const,\n socketAddress: 'client.socket.address' as const,\n} as const;\n\nexport const DeploymentAttributes = {\n environment: 'deployment.environment' as const,\n id: 'deployment.environment.id' as const,\n} as const;\n\nexport const OTelAttributes = {\n libraryName: 'otel.library.name' as const,\n libraryVersion: 'otel.library.version' as const,\n statusCode: 'otel.status_code' as const,\n} as const;\n\nexport const CodeAttributes = {\n namespace: 'code.namespace' as const,\n filepath: 'code.filepath' as const,\n function: 'code.function' as const,\n class: 'code.class' as const,\n method: 'code.method' as const,\n column: 'code.column' as const,\n lineNumber: 'code.lineno' as const,\n repository: 'code.repository' as const,\n revision: 'code.revision' as const,\n} as const;\n\nexport const TLSAttributes = {\n protocolVersion: 'tls.protocol.version' as const,\n cipher: 'tls.cipher' as const,\n curveName: 'tls.curve.name' as const,\n resumed: 'tls.resumed' as const,\n} as const;\n\nexport const BrowserAttributes = {\n platform: 'browser.platform' as const,\n language: 'browser.language' as const,\n brand: 'browser.brand' as const,\n mobile: 'browser.mobile' as const,\n} as const;\n\nexport const AndroidAttributes = {\n appVersion: 'android.app.version' as const,\n package: 'android.package' as const,\n activityName: 'android.activity.name' as const,\n} as const;\n\nexport const IOSAttributes = {\n deviceModel: 'ios.device.model' as const,\n version: 'ios.version' as const,\n} as const;\n\nexport const GeoAttributes = {\n cityName: 'geo.city.name' as const,\n countryCode: 'geo.country.name' as const,\n continentCode: 'geo.continent.code' as const,\n} as const;\n\nexport const UserAgentAttributes = {\n original: 'user_agent.original' as const,\n} as const;\n\nexport const AWSAttributes = {\n ecsClusterArn: 'aws.ecs.cluster.arn' as const,\n ecsContainerArn: 'aws.ecs.container.arn' as const,\n logGroupName: 'aws.log.group.name' as const,\n requestId: 'aws.requestId' as const,\n} as const;\n\nexport const AzureAttributes = {\n subscriptionId: 'azure.subscription.id' as const,\n tenantId: 'azure.tenant.id' as const,\n} as const;\n\nexport const GCPAttributes = {\n project: 'gcp.project.id' as const,\n instanceName: 'gcp.instance.name' as const,\n zone: 'gcp.zone' as const,\n} as const;\n\nexport const CassandraAttributes = {\n consistencyLevel: 'cassandra.consistency.level' as const,\n coordinatorId: 'cassandra.coordinator.id' as const,\n dataCenter: 'cassandra.coordinator.dc' as const,\n pageSize: 'cassandra.page.size' as const,\n} as const;\n\nexport const ElasticsearchAttributes = {\n clusterName: 'elasticsearch.cluster.name' as const,\n nodeId: 'elasticsearch.node.name' as const,\n} as const;\n\nexport const MongoDBAttributes = {\n collectionName: 'mongodb.collection.name' as const,\n} as const;\n\nexport const RedisAttributes = {\n databaseIndex: 'redis.database.index' as const,\n} as const;\n\nexport const MSSQLAttributes = {\n instanceName: 'mssql.instance.name' as const,\n} as const;\n\nexport const PostgreSQLAttributes = {\n databaseName: 'postgresql.database.name' as const,\n} as const;\n\nexport const AWSLambdaAttributes = {\n requestId: 'aws.lambda.invoked_arn' as const,\n requestFunction: 'aws.lambda.invoked_function_arn' as const,\n} as const;\n\nexport const OpenAIAttributes = {\n requestId: 'openai.request.id' as const,\n responseModel: 'openai.response.model' as const,\n responseOrganization: 'openai.response.organization' as const,\n} as const;\n\nexport const AzureAIAAttributes = {\n resource: 'azure.ai.inference.resource' as const,\n deploymentId: 'azure.ai.inference.deployment.id' as const,\n} as const;\n\nexport const AWSBedrockAttributes = {\n requestId: 'aws.bedrock.requestId' as const,\n responseModel: 'aws.bedrock.responseModel' as const,\n} as const;\n\nexport const TestAttributes = {\n framework: 'test.framework' as const,\n name: 'test.name' as const,\n} as const;\n\nexport const ArtifactAttributes = {\n type: 'artifact.type' as const,\n id: 'artifact.id' as const,\n checksum: 'artifact.checksum' as const,\n} as const;\n\nexport const CICDAttributes = {\n pipelineName: 'ci.pipeline.name' as const,\n pipelineRunId: 'ci.pipeline.run.id' as const,\n} as const;\n","/**\n * Attribute builders for constructing OpenTelemetry attributes\n * Provides both key builders (Pattern A) and object builders (Pattern B)\n *\n * @example Pattern A: Key builders\n * ```typescript\n * attrs.user.id('123') // { 'user.id': '123' }\n * attrs.user.email('user@example.com') // { 'user.email': 'user@example.com' }\n * attrs.http.request.method('GET') // { 'http.request.method': 'GET' }\n * attrs.http.response.statusCode(200) // { 'http.response.status_code': 200 }\n * ```\n *\n * @example Pattern B: Object builders\n * ```typescript\n * attrs.user({ id: '123', email: 'user@example.com' })\n * attrs.http.server({ method: 'GET', route: '/users/:id', statusCode: 200 })\n * attrs.db.client({ system: 'postgresql', operation: 'SELECT', collectionName: 'users' })\n * ```\n */\n\nimport {\n UserAttributes,\n SessionAttributes,\n DeviceAttributes,\n HTTPAttributes,\n DBAttributes,\n ServiceAttributes,\n NetworkAttributes,\n ServerAddressAttributes,\n URLAttributes,\n ErrorAttributes,\n ExceptionAttributes,\n ProcessAttributes,\n ThreadAttributes,\n ContainerAttributes,\n K8sAttributes,\n CloudAttributes,\n FaaSAttributes,\n FeatureFlagAttributes,\n MessagingAttributes,\n GenAIAttributes,\n RPCAttributes,\n GraphQLAttributes,\n OTelAttributes,\n CodeAttributes,\n TLSAttributes,\n} from './registry';\n\nimport type {\n UserAttrs,\n SessionAttrs,\n DeviceAttrs,\n HTTPServerAttrs,\n HTTPClientAttrs,\n DBAttrs,\n ServiceAttrs,\n NetworkAttrs,\n ErrorAttrs,\n MessagingAttrs,\n CloudAttrs,\n ServerAddressAttrs,\n URLAttrs,\n ProcessAttrs,\n ContainerAttrs,\n ExceptionAttrs,\n} from './types';\n\nexport const attrs = {\n user: {\n id: (value: string) => ({ [UserAttributes.id]: value }),\n email: (value: string) => ({ [UserAttributes.email]: value }),\n name: (value: string) => ({ [UserAttributes.name]: value }),\n fullName: (value: string) => ({ [UserAttributes.fullName]: value }),\n hash: (value: string) => ({ [UserAttributes.hash]: value }),\n roles: (value: string[]) => ({ [UserAttributes.roles]: value }),\n\n data: (data: UserAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[UserAttributes.id] = data.id;\n if (data.email !== undefined) result[UserAttributes.email] = data.email;\n if (data.name !== undefined) result[UserAttributes.name] = data.name;\n if (data.fullName !== undefined)\n result[UserAttributes.fullName] = data.fullName;\n if (data.hash !== undefined) result[UserAttributes.hash] = data.hash;\n if (data.roles !== undefined) result[UserAttributes.roles] = data.roles;\n return result;\n },\n },\n\n session: {\n id: (value: string) => ({ [SessionAttributes.id]: value }),\n previousId: (value: string) => ({ [SessionAttributes.previousId]: value }),\n\n data: (data: SessionAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[SessionAttributes.id] = data.id;\n if (data.previousId !== undefined)\n result[SessionAttributes.previousId] = data.previousId;\n return result;\n },\n },\n\n device: {\n id: (value: string) => ({ [DeviceAttributes.id]: value }),\n manufacturer: (value: string) => ({\n [DeviceAttributes.manufacturer]: value,\n }),\n modelIdentifier: (value: string) => ({\n [DeviceAttributes.modelIdentifier]: value,\n }),\n modelName: (value: string) => ({ [DeviceAttributes.modelName]: value }),\n\n data: (data: DeviceAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[DeviceAttributes.id] = data.id;\n if (data.manufacturer !== undefined)\n result[DeviceAttributes.manufacturer] = data.manufacturer;\n if (data.modelIdentifier !== undefined)\n result[DeviceAttributes.modelIdentifier] = data.modelIdentifier;\n if (data.modelName !== undefined)\n result[DeviceAttributes.modelName] = data.modelName;\n return result;\n },\n },\n\n http: {\n request: {\n method: (value: string) => ({ [HTTPAttributes.requestMethod]: value }),\n methodOriginal: (value: string) => ({\n [HTTPAttributes.requestMethodOriginal]: value,\n }),\n resendCount: (value: number) => ({\n [HTTPAttributes.requestResendCount]: value,\n }),\n size: (value: number) => ({ [HTTPAttributes.requestSize]: value }),\n bodySize: (value: number) => ({\n [HTTPAttributes.requestBodySize]: value,\n }),\n },\n\n response: {\n statusCode: (value: number) => ({\n [HTTPAttributes.responseStatusCode]: value,\n }),\n size: (value: number) => ({ [HTTPAttributes.responseSize]: value }),\n bodySize: (value: number) => ({\n [HTTPAttributes.responseBodySize]: value,\n }),\n },\n\n route: (value: string) => ({ [HTTPAttributes.route]: value }),\n connectionState: (value: string) => ({\n [HTTPAttributes.connectionState]: value,\n }),\n\n server: (data: HTTPServerAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.method !== undefined)\n result[HTTPAttributes.requestMethod] = data.method;\n if (data.route !== undefined) result[HTTPAttributes.route] = data.route;\n if (data.statusCode !== undefined)\n result[HTTPAttributes.responseStatusCode] = data.statusCode;\n if (data.bodySize !== undefined)\n result[HTTPAttributes.requestBodySize] = data.bodySize;\n if (data.requestSize !== undefined)\n result[HTTPAttributes.requestSize] = data.requestSize;\n if (data.responseSize !== undefined)\n result[HTTPAttributes.responseSize] = data.responseSize;\n if (data.resendCount !== undefined)\n result[HTTPAttributes.requestResendCount] = data.resendCount;\n return result;\n },\n\n client: (data: HTTPClientAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.method !== undefined)\n result[HTTPAttributes.requestMethod] = data.method;\n if (data.url !== undefined) result[HTTPAttributes.route] = data.url;\n if (data.statusCode !== undefined)\n result[HTTPAttributes.responseStatusCode] = data.statusCode;\n return result;\n },\n },\n\n db: {\n client: {\n system: (value: string) => ({ [DBAttributes.systemName]: value }),\n operation: (value: string) => ({ [DBAttributes.operationName]: value }),\n collectionName: (value: string) => ({\n [DBAttributes.collectionName]: value,\n }),\n namespace: (value: string) => ({ [DBAttributes.namespace]: value }),\n statement: (value: string) => ({ [DBAttributes.statement]: value }),\n querySummary: (value: string) => ({ [DBAttributes.querySummary]: value }),\n queryText: (value: string) => ({ [DBAttributes.queryText]: value }),\n responseStatus: (value: string | number) => ({\n [DBAttributes.responseStatusCode]: value,\n }),\n rowsReturned: (value: number) => ({\n [DBAttributes.responseReturnedRows]: value,\n }),\n\n data: (data: DBAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.system !== undefined)\n result[DBAttributes.systemName] = data.system;\n if (data.operation !== undefined)\n result[DBAttributes.operationName] = data.operation;\n if (data.collectionName !== undefined)\n result[DBAttributes.collectionName] = data.collectionName;\n // 'name' maps to db.namespace (db.name is deprecated per OTel semantic conventions)\n if (data.name !== undefined) result[DBAttributes.namespace] = data.name;\n // 'namespace' takes precedence over 'name' if both are provided\n if (data.namespace !== undefined)\n result[DBAttributes.namespace] = data.namespace;\n if (data.statement !== undefined)\n result[DBAttributes.statement] = data.statement;\n if (data.querySummary !== undefined)\n result[DBAttributes.querySummary] = data.querySummary;\n if (data.queryText !== undefined)\n result[DBAttributes.queryText] = data.queryText;\n if (data.responseStatus !== undefined)\n result[DBAttributes.responseStatusCode] = data.responseStatus;\n if (data.rowsReturned !== undefined)\n result[DBAttributes.responseReturnedRows] = data.rowsReturned;\n return result;\n },\n },\n },\n\n service: {\n name: (value: string) => ({ [ServiceAttributes.name]: value }),\n instance: (value: string) => ({ [ServiceAttributes.instance]: value }),\n version: (value: string) => ({ [ServiceAttributes.version]: value }),\n\n data: (data: ServiceAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.name !== undefined) result[ServiceAttributes.name] = data.name;\n if (data.instance !== undefined)\n result[ServiceAttributes.instance] = data.instance;\n if (data.version !== undefined)\n result[ServiceAttributes.version] = data.version;\n return result;\n },\n },\n\n network: {\n peerAddress: (value: string) => ({\n [NetworkAttributes.peerAddress]: value,\n }),\n peerPort: (value: number) => ({ [NetworkAttributes.peerPort]: value }),\n transport: (value: string) => ({ [NetworkAttributes.transport]: value }),\n protocolName: (value: string) => ({\n [NetworkAttributes.protocolName]: value,\n }),\n protocolVersion: (value: string) => ({\n [NetworkAttributes.protocolVersion]: value,\n }),\n\n data: (data: NetworkAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.peerAddress !== undefined)\n result[NetworkAttributes.peerAddress] = data.peerAddress;\n if (data.peerPort !== undefined)\n result[NetworkAttributes.peerPort] = data.peerPort;\n if (data.transport !== undefined)\n result[NetworkAttributes.transport] = data.transport;\n if (data.protocolName !== undefined)\n result[NetworkAttributes.protocolName] = data.protocolName;\n if (data.protocolVersion !== undefined)\n result[NetworkAttributes.protocolVersion] = data.protocolVersion;\n return result;\n },\n },\n\n server: {\n address: (value: string) => ({ [ServerAddressAttributes.address]: value }),\n port: (value: number) => ({ [ServerAddressAttributes.port]: value }),\n socketAddress: (value: string) => ({\n [ServerAddressAttributes.socketAddress]: value,\n }),\n\n data: (data: ServerAddressAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.address !== undefined)\n result[ServerAddressAttributes.address] = data.address;\n if (data.port !== undefined)\n result[ServerAddressAttributes.port] = data.port;\n if (data.socketAddress !== undefined)\n result[ServerAddressAttributes.socketAddress] = data.socketAddress;\n return result;\n },\n },\n\n url: {\n scheme: (value: string) => ({ [URLAttributes.scheme]: value }),\n full: (value: string) => ({ [URLAttributes.full]: value }),\n path: (value: string) => ({ [URLAttributes.path]: value }),\n query: (value: string) => ({ [URLAttributes.query]: value }),\n fragment: (value: string) => ({ [URLAttributes.fragment]: value }),\n\n data: (data: URLAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.scheme !== undefined) result[URLAttributes.scheme] = data.scheme;\n if (data.full !== undefined) result[URLAttributes.full] = data.full;\n if (data.path !== undefined) result[URLAttributes.path] = data.path;\n if (data.query !== undefined) result[URLAttributes.query] = data.query;\n if (data.fragment !== undefined)\n result[URLAttributes.fragment] = data.fragment;\n return result;\n },\n },\n\n error: {\n type: (value: string) => ({ [ErrorAttributes.type]: value }),\n message: (value: string) => ({ [ErrorAttributes.message]: value }),\n stackTrace: (value: string) => ({ [ErrorAttributes.stackTrace]: value }),\n code: (value: string | number) => ({ [ErrorAttributes.code]: value }),\n\n data: (data: ErrorAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.type !== undefined) result[ErrorAttributes.type] = data.type;\n if (data.message !== undefined)\n result[ErrorAttributes.message] = data.message;\n if (data.stackTrace !== undefined)\n result[ErrorAttributes.stackTrace] = data.stackTrace;\n if (data.code !== undefined) result[ErrorAttributes.code] = data.code;\n return result;\n },\n },\n\n exception: {\n escaped: (value: boolean) => ({ [ExceptionAttributes.escaped]: value }),\n message: (value: string) => ({ [ExceptionAttributes.message]: value }),\n stackTrace: (value: string) => ({\n [ExceptionAttributes.stackTrace]: value,\n }),\n type: (value: string) => ({ [ExceptionAttributes.type]: value }),\n moduleName: (value: string) => ({\n [ExceptionAttributes.moduleName]: value,\n }),\n\n data: (data: ExceptionAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.escaped !== undefined)\n result[ExceptionAttributes.escaped] = data.escaped;\n if (data.message !== undefined)\n result[ExceptionAttributes.message] = data.message;\n if (data.stackTrace !== undefined)\n result[ExceptionAttributes.stackTrace] = data.stackTrace;\n if (data.type !== undefined) result[ExceptionAttributes.type] = data.type;\n if (data.moduleName !== undefined)\n result[ExceptionAttributes.moduleName] = data.moduleName;\n return result;\n },\n },\n\n process: {\n pid: (value: number) => ({ [ProcessAttributes.pid]: value }),\n executablePath: (value: string) => ({\n [ProcessAttributes.executablePath]: value,\n }),\n command: (value: string) => ({ [ProcessAttributes.command]: value }),\n owner: (value: string) => ({ [ProcessAttributes.owner]: value }),\n\n data: (data: ProcessAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.pid !== undefined) result[ProcessAttributes.pid] = data.pid;\n if (data.executablePath !== undefined)\n result[ProcessAttributes.executablePath] = data.executablePath;\n if (data.command !== undefined)\n result[ProcessAttributes.command] = data.command;\n if (data.owner !== undefined)\n result[ProcessAttributes.owner] = data.owner;\n return result;\n },\n },\n\n thread: {\n id: (value: number) => ({ [ThreadAttributes.id]: value }),\n name: (value: string) => ({ [ThreadAttributes.name]: value }),\n },\n\n container: {\n id: (value: string) => ({ [ContainerAttributes.id]: value }),\n name: (value: string) => ({ [ContainerAttributes.name]: value }),\n image: (value: string) => ({ [ContainerAttributes.image]: value }),\n tag: (value: string) => ({ [ContainerAttributes.tag]: value }),\n\n data: (data: ContainerAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.id !== undefined) result[ContainerAttributes.id] = data.id;\n if (data.name !== undefined) result[ContainerAttributes.name] = data.name;\n if (data.image !== undefined)\n result[ContainerAttributes.image] = data.image;\n if (data.tag !== undefined) result[ContainerAttributes.tag] = data.tag;\n return result;\n },\n },\n\n k8s: {\n podName: (value: string) => ({ [K8sAttributes.podName]: value }),\n namespaceName: (value: string) => ({\n [K8sAttributes.namespaceName]: value,\n }),\n deploymentName: (value: string) => ({\n [K8sAttributes.deploymentName]: value,\n }),\n state: (value: string) => ({ [K8sAttributes.state]: value }),\n },\n\n cloud: {\n provider: (value: string) => ({ [CloudAttributes.provider]: value }),\n accountId: (value: string) => ({ [CloudAttributes.accountId]: value }),\n region: (value: string) => ({ [CloudAttributes.region]: value }),\n availabilityZone: (value: string) => ({\n [CloudAttributes.availabilityZone]: value,\n }),\n platform: (value: string) => ({ [CloudAttributes.platform]: value }),\n\n data: (data: CloudAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.provider !== undefined)\n result[CloudAttributes.provider] = data.provider;\n if (data.accountId !== undefined)\n result[CloudAttributes.accountId] = data.accountId;\n if (data.region !== undefined)\n result[CloudAttributes.region] = data.region;\n if (data.availabilityZone !== undefined)\n result[CloudAttributes.availabilityZone] = data.availabilityZone;\n if (data.platform !== undefined)\n result[CloudAttributes.platform] = data.platform;\n return result;\n },\n },\n\n faas: {\n name: (value: string) => ({ [FaaSAttributes.name]: value }),\n version: (value: string) => ({ [FaaSAttributes.version]: value }),\n instance: (value: string) => ({ [FaaSAttributes.instance]: value }),\n execution: (value: string) => ({ [FaaSAttributes.execution]: value }),\n coldstart: (value: boolean) => ({ [FaaSAttributes.coldstart]: value }),\n },\n\n featureFlag: {\n key: (value: string) => ({ [FeatureFlagAttributes.key]: value }),\n provider: (value: string) => ({ [FeatureFlagAttributes.provider]: value }),\n variant: (value: string) => ({ [FeatureFlagAttributes.variant]: value }),\n },\n\n messaging: {\n system: (value: string) => ({ [MessagingAttributes.system]: value }),\n destination: (value: string) => ({\n [MessagingAttributes.destination]: value,\n }),\n operation: (value: 'publish' | 'receive' | 'process') => ({\n [MessagingAttributes.operation]: value,\n }),\n messageId: (value: string) => ({ [MessagingAttributes.messageId]: value }),\n conversationId: (value: string) => ({\n [MessagingAttributes.conversationId]: value,\n }),\n\n data: (data: MessagingAttrs) => {\n const result: Record<string, unknown> = {};\n if (data.system !== undefined)\n result[MessagingAttributes.system] = data.system;\n if (data.destination !== undefined)\n result[MessagingAttributes.destination] = data.destination;\n if (data.operation !== undefined)\n result[MessagingAttributes.operation] = data.operation;\n if (data.messageId !== undefined)\n result[MessagingAttributes.messageId] = data.messageId;\n if (data.conversationId !== undefined)\n result[MessagingAttributes.conversationId] = data.conversationId;\n return result;\n },\n },\n\n genAI: {\n system: (value: string) => ({ [GenAIAttributes.system]: value }),\n requestModel: (value: string) => ({\n [GenAIAttributes.requestModel]: value,\n }),\n responseModel: (value: string) => ({\n [GenAIAttributes.responseModel]: value,\n }),\n operationName: (value: 'chat' | 'completion' | 'embedding') => ({\n [GenAIAttributes.operationName]: value,\n }),\n usagePromptTokens: (value: number) => ({\n [GenAIAttributes.usagePromptTokens]: value,\n }),\n usageCompletionTokens: (value: number) => ({\n [GenAIAttributes.usageCompletionTokens]: value,\n }),\n provider: (value: string) => ({ [GenAIAttributes.provider]: value }),\n },\n\n rpc: {\n system: (value: string) => ({ [RPCAttributes.system]: value }),\n service: (value: string) => ({ [RPCAttributes.service]: value }),\n method: (value: string) => ({ [RPCAttributes.method]: value }),\n grpcStatusCode: (value: number) => ({\n [RPCAttributes.grpcStatusCode]: value,\n }),\n },\n\n graphql: {\n document: (value: string) => ({ [GraphQLAttributes.document]: value }),\n operationName: (value: string) => ({\n [GraphQLAttributes.operationName]: value,\n }),\n operationType: (value: 'query' | 'mutation' | 'subscription') => ({\n [GraphQLAttributes.operationType]: value,\n }),\n },\n\n otel: {\n libraryName: (value: string) => ({ [OTelAttributes.libraryName]: value }),\n libraryVersion: (value: string) => ({\n [OTelAttributes.libraryVersion]: value,\n }),\n statusCode: (value: string) => ({ [OTelAttributes.statusCode]: value }),\n },\n\n code: {\n namespace: (value: string) => ({ [CodeAttributes.namespace]: value }),\n filepath: (value: string) => ({ [CodeAttributes.filepath]: value }),\n function: (value: string) => ({ [CodeAttributes.function]: value }),\n class: (value: string) => ({ [CodeAttributes.class]: value }),\n method: (value: string) => ({ [CodeAttributes.method]: value }),\n column: (value: string) => ({ [CodeAttributes.column]: value }),\n lineNumber: (value: number) => ({ [CodeAttributes.lineNumber]: value }),\n repository: (value: string) => ({ [CodeAttributes.repository]: value }),\n revision: (value: string) => ({ [CodeAttributes.revision]: value }),\n },\n\n tls: {\n protocolVersion: (value: string) => ({\n [TLSAttributes.protocolVersion]: value,\n }),\n cipher: (value: string) => ({ [TLSAttributes.cipher]: value }),\n curveName: (value: string) => ({ [TLSAttributes.curveName]: value }),\n resumed: (value: boolean) => ({ [TLSAttributes.resumed]: value }),\n },\n} as const;\n","/**\n * Attribute validation, PII detection, and guardrails\n * Provides safe-by-default attribute handling with configurable policies\n */\n\nimport { REDACTOR_PATTERNS } from '../attribute-redacting-processor';\n\nexport interface AttributeGuardrails {\n /** How to handle PII in attributes */\n pii?: 'allow' | 'redact' | 'hash' | 'block';\n\n /** Maximum length for attribute values */\n maxLength?: number;\n\n /** Validate enum values against known values */\n validateEnum?: boolean;\n\n /** Log warnings for deprecated attributes instead of throwing */\n warnDeprecated?: boolean;\n\n /** Custom deprecation warnings */\n deprecatedWarnings?: Record<string, string>;\n}\n\nexport interface AttributePolicy {\n guardrails?: AttributeGuardrails;\n /** Custom deprecation warnings for specific attributes */\n deprecatedWarnings?: Record<string, string>;\n}\n\nconst DEPRECATED_ATTRIBUTES = {\n 'enduser.id': 'user.id',\n 'enduser.role': 'user.roles',\n 'enduser.scope': undefined,\n 'http.method': 'http.request.method',\n 'http.host': 'server.address',\n 'http.status_code': 'http.response.status_code',\n 'http.target': 'url.path',\n 'http.url': 'url.full',\n 'http.user_agent': 'user_agent.original',\n 'http.flavor': 'network.protocol.name',\n 'http.scheme': 'url.scheme',\n 'http.server_name': 'server.address',\n 'db.name': 'db.namespace',\n 'db.operation': 'db.operation.name',\n 'db.statement': 'db.query.text',\n 'db.system': 'db.system.name',\n 'db.collection': 'db.collection.name',\n 'db.instance.id': undefined,\n 'db.jdbc.driver_classname': undefined,\n 'db.mssql.instance_name': 'mssql.instance.name',\n 'db.sql.table': 'db.collection.name',\n 'http.client_ip': 'client.address',\n 'user_agent.original': 'user_agent.original',\n} as const;\n\nconst HTTP_METHODS = new Set([\n 'GET',\n 'POST',\n 'PUT',\n 'DELETE',\n 'PATCH',\n 'HEAD',\n 'OPTIONS',\n 'TRACE',\n 'QUERY',\n '_OTHER',\n]);\n\nexport function validateAttribute(\n key: string,\n value: unknown,\n policy: AttributePolicy = {},\n): unknown {\n const { guardrails = {} } = policy;\n\n if (value === undefined || value === null) {\n return undefined;\n }\n\n // For non-string values that don't need transformation, preserve the original type\n if (typeof value !== 'string') {\n // PII checks only apply to strings\n // maxLength only applies to strings\n // validateEnum only applies to strings\n return value;\n }\n\n const stringValue = value;\n\n if (guardrails.pii) {\n const piiResult = applyPIIPolicy(key, stringValue, guardrails.pii);\n if (piiResult !== stringValue) {\n return piiResult;\n }\n }\n\n if (guardrails.maxLength && stringValue.length > guardrails.maxLength) {\n return truncateValue(key, stringValue, guardrails.maxLength);\n }\n\n if (guardrails.validateEnum && HTTP_METHODS.has(stringValue)) {\n const normalizedMethod = normalizeHTTPMethod(stringValue);\n if (normalizedMethod !== stringValue) {\n return normalizedMethod;\n }\n }\n\n return stringValue;\n}\n\nfunction applyPIIPolicy(\n key: string,\n value: string,\n pii: AttributeGuardrails['pii'],\n): string {\n if (pii === 'allow') {\n return value;\n }\n\n if (pii === 'redact') {\n return redactIfPII(key, value);\n }\n\n if (pii === 'hash') {\n return hashIfPII(key, value);\n }\n\n if (pii === 'block' && isPIIKey(key)) {\n throw new Error(\n `PII attribute \"${key}\" is blocked by guardrails. Use pii: \"allow\" to enable it.`,\n );\n }\n\n return value;\n}\n\nfunction isPIIKey(key: string): boolean {\n const piiKeyPatterns = [\n 'email',\n 'phone',\n 'ssn',\n 'credit_card',\n 'password',\n 'secret',\n 'token',\n 'api_key',\n 'authorization',\n ];\n const lowerKey = key.toLowerCase();\n return piiKeyPatterns.some((pattern) => lowerKey.includes(pattern));\n}\n\nfunction redactIfPII(key: string, value: string): string {\n if (isPIIKey(key)) {\n // REDACTOR_PATTERNS values are RegExp patterns\n for (const [, pattern] of Object.entries(REDACTOR_PATTERNS)) {\n if (pattern instanceof RegExp && pattern.test(value)) {\n return '[REDACTED]';\n }\n }\n // If no pattern matched but key is PII, still redact\n return '[REDACTED]';\n }\n return value;\n}\n\nfunction hashIfPII(key: string, value: string): string {\n if (!isPIIKey(key)) {\n return value;\n }\n\n // Use a simple but consistent hash that produces 32-char hex\n // FNV-1a hash variant producing 128-bit output (32 hex chars)\n const FNV_PRIME = 0x01_00_01_93;\n const FNV_OFFSET = 0x81_1c_9d_c5;\n\n // Generate 4 32-bit hashes to produce 32 hex chars\n const hashes: number[] = [];\n for (let round = 0; round < 4; round++) {\n let hash = FNV_OFFSET;\n for (let i = 0; i < value.length; i++) {\n hash ^= (value.codePointAt(i) ?? 0) + round;\n hash = Math.imul(hash, FNV_PRIME);\n }\n hashes.push(hash >>> 0); // Convert to unsigned\n }\n\n return `hash_${hashes.map((h) => h.toString(16).padStart(8, '0')).join('')}`;\n}\n\nfunction truncateValue(key: string, value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return value.slice(0, maxLength - 3) + '...';\n}\n\nfunction normalizeHTTPMethod(method: string): string {\n const upper = method.toUpperCase();\n if (HTTP_METHODS.has(upper)) {\n return upper;\n }\n return upper;\n}\n\nexport function checkDeprecatedAttribute(\n key: string,\n policy: AttributePolicy = {},\n): string | null {\n const { guardrails = {}, deprecatedWarnings = {} } = policy;\n const { warnDeprecated = true } = guardrails;\n\n if (!warnDeprecated) {\n return null;\n }\n\n // Check if the key exists in the deprecated attributes map\n const isDeprecated = key in DEPRECATED_ATTRIBUTES;\n if (isDeprecated) {\n const replacement =\n DEPRECATED_ATTRIBUTES[key as keyof typeof DEPRECATED_ATTRIBUTES];\n if (replacement === undefined) {\n // Deprecated with no replacement (e.g., enduser.scope)\n console.warn(\n `[autotel/attributes] Attribute \"${key}\" is deprecated and has no replacement. ` +\n `Remove or find a replacement in OpenTelemetry semantic conventions.`,\n );\n } else {\n // Deprecated with a known replacement\n console.warn(\n `[autotel/attributes] Attribute \"${key}\" is deprecated. Use \"${replacement}\" instead.`,\n );\n }\n }\n\n if (deprecatedWarnings[key]) {\n console.warn(`[autotel/attributes] ${deprecatedWarnings[key]}`);\n }\n\n const replacement =\n DEPRECATED_ATTRIBUTES[key as keyof typeof DEPRECATED_ATTRIBUTES];\n return replacement ?? null;\n}\n\nexport function autoRedactPII(\n attributes: Record<string, unknown>,\n policy: AttributePolicy = {},\n): Record<string, unknown> {\n const { guardrails = { pii: 'redact' } } = policy;\n\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(attributes)) {\n redacted[key] = validateAttribute(key, value, { guardrails });\n }\n return redacted;\n}\n\nexport function defaultGuardrails(): AttributeGuardrails {\n return {\n pii: 'redact',\n maxLength: 255,\n validateEnum: true,\n warnDeprecated: true,\n };\n}\n","/**\n * Attribute utility functions\n */\n\nimport type { AttributeValue } from '../trace-context';\nimport {\n validateAttribute,\n autoRedactPII,\n defaultGuardrails,\n checkDeprecatedAttribute,\n type AttributePolicy,\n} from './validators';\n\n// Type for objects that have setAttributes method (spans or contexts)\n// Using a generic parameter to accommodate different AttributeValue types\ntype AttributeSetter = {\n setAttributes: (attrs: Record<string, AttributeValue>) => void;\n};\n\nexport function mergeAttrs(\n ...attrSets: Array<Record<string, unknown> | undefined>\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const attrSet of attrSets) {\n if (attrSet) {\n Object.assign(result, attrSet);\n }\n }\n return result;\n}\n\nexport function safeSetAttributes(\n span: AttributeSetter,\n attrs: Record<string, unknown>,\n policy?: AttributePolicy,\n): void {\n // Merge user-supplied guardrails with defaults so callers can tweak\n // a single option without opting out of the rest\n const mergedGuardrails = {\n ...defaultGuardrails(),\n ...policy?.guardrails,\n };\n const effectivePolicy: AttributePolicy = {\n ...policy,\n guardrails: mergedGuardrails,\n };\n\n const validated = autoRedactPII(attrs, effectivePolicy);\n\n const sanitizedAttrs: Record<string, AttributeValue> = {};\n for (const [key, value] of Object.entries(validated)) {\n if (value !== undefined) {\n // Check for deprecated attributes and log warnings\n checkDeprecatedAttribute(key, effectivePolicy);\n const validatedValue = validateAttribute(key, value, effectivePolicy);\n if (validatedValue !== undefined) {\n // Cast to AttributeValue since validateAttribute ensures valid types\n sanitizedAttrs[key] = validatedValue as AttributeValue;\n }\n }\n }\n\n span.setAttributes(sanitizedAttrs);\n}\n","/**\n * Signal attachment helpers\n * These functions know WHERE to attach attributes automatically\n * They handle span, resource, and log signals correctly\n */\n\nimport type { Span, Attributes } from '@opentelemetry/api';\nimport {\n resourceFromAttributes,\n type Resource,\n} from '@opentelemetry/resources';\nimport type { TraceContext } from '../trace-context';\nimport { attrs } from './builders';\nimport { safeSetAttributes } from './utils';\n\nexport function setUser(\n spanOrContext: Span | TraceContext,\n data: import('./types').UserAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.user.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setSession(\n spanOrContext: Span | TraceContext,\n data: import('./types').SessionAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.session.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setDevice(\n spanOrContext: Span | TraceContext,\n data: import('./types').DeviceAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.device.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function httpServer(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPServerAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.http.server(data);\n\n if ('updateName' in spanOrContext && data.method && data.route) {\n const span = spanOrContext as Span;\n span.updateName(`HTTP ${data.method} ${data.route}`);\n }\n\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function httpClient(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPClientAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.http.client(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function dbClient(\n spanOrContext: Span | TraceContext,\n data: import('./types').DBAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.db.client.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\n/**\n * Merge service attributes into a Resource and return a new Resource.\n *\n * Resource.attributes is readonly, so this function returns a new merged\n * Resource rather than mutating the input.\n *\n * @param resource - The existing resource to merge with\n * @param data - Service attributes to add\n * @returns A new Resource with the merged attributes\n *\n * @example\n * ```typescript\n * const baseResource = Resource.default();\n * const enrichedResource = mergeServiceResource(baseResource, {\n * name: 'my-service',\n * version: '1.0.0',\n * });\n * ```\n */\nexport function mergeServiceResource(\n resource: Resource,\n data: import('./types').ServiceAttrs,\n): Resource {\n const attributes = attrs.service.data(data);\n return resource.merge(resourceFromAttributes(attributes as Attributes));\n}\n\nexport function identify(\n spanOrContext: Span | TraceContext,\n data: {\n user?: import('./types').UserAttrs;\n session?: import('./types').SessionAttrs;\n device?: import('./types').DeviceAttrs;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const allAttrs = [];\n\n if (data.user) {\n allAttrs.push(attrs.user.data(data.user));\n }\n if (data.session) {\n allAttrs.push(attrs.session.data(data.session));\n }\n if (data.device) {\n allAttrs.push(attrs.device.data(data.device));\n }\n\n const merged: Record<string, unknown> = {};\n for (const attrSet of allAttrs) {\n Object.assign(merged, attrSet);\n }\n\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n\nexport function request(\n spanOrContext: Span | TraceContext,\n data: import('./types').HTTPServerAttrs & {\n clientIp?: string;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const httpAttrs = attrs.http.server(data);\n const networkAttrs = attrs.network.peerAddress(data.clientIp || '');\n const merged = { ...httpAttrs, ...networkAttrs };\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n\nexport function setError(\n spanOrContext: Span | TraceContext,\n data: import('./types').ErrorAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.error.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n\nexport function setException(\n spanOrContext: Span | TraceContext,\n data: import('./types').ExceptionAttrs,\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const attributes = attrs.exception.data(data);\n safeSetAttributes(spanOrContext, attributes, guardrails);\n}\n","/**\n * Domain helpers for common attribute patterns\n * These bundle multiple attribute groups into semantic helpers\n */\n\nimport { attrs } from './builders';\nimport { safeSetAttributes } from './utils';\n\nexport function transaction(\n spanOrContext: import('../trace-context').TraceContext,\n config: {\n user?: import('./types').UserAttrs;\n session?: import('./types').SessionAttrs;\n method?: string;\n route?: string;\n statusCode?: number;\n clientIp?: string;\n },\n guardrails?: import('./validators').AttributePolicy,\n): void {\n const userAttrs = attrs.user.data(config.user || {});\n const sessionAttrs = attrs.session.data(config.session || {});\n const httpAttrs = attrs.http.server({\n method: config.method,\n route: config.route,\n statusCode: config.statusCode,\n });\n const networkAttrs = attrs.network.peerAddress(config.clientIp || '');\n\n const merged = {\n ...userAttrs,\n ...sessionAttrs,\n ...httpAttrs,\n ...networkAttrs,\n };\n\n if (config.method && config.route && 'updateName' in spanOrContext) {\n spanOrContext.updateName(`HTTP ${config.method} ${config.route}`);\n }\n\n safeSetAttributes(spanOrContext, merged, guardrails);\n}\n"]}