@arizeai/phoenix-otel 0.0.1 → 0.2.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 (39) hide show
  1. package/dist/esm/createNoOpProvider.d.ts +6 -0
  2. package/dist/esm/createNoOpProvider.d.ts.map +1 -0
  3. package/dist/esm/createNoOpProvider.js +9 -0
  4. package/dist/esm/createNoOpProvider.js.map +1 -0
  5. package/dist/esm/index.d.ts +6 -1
  6. package/dist/esm/index.d.ts.map +1 -1
  7. package/dist/esm/index.js +5 -1
  8. package/dist/esm/index.js.map +1 -1
  9. package/dist/esm/register.d.ts +54 -8
  10. package/dist/esm/register.d.ts.map +1 -1
  11. package/dist/esm/register.js +46 -6
  12. package/dist/esm/register.js.map +1 -1
  13. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -1
  14. package/dist/esm/utils.d.ts +3 -0
  15. package/dist/esm/utils.d.ts.map +1 -0
  16. package/dist/esm/utils.js +4 -0
  17. package/dist/esm/utils.js.map +1 -0
  18. package/dist/src/createNoOpProvider.d.ts +6 -0
  19. package/dist/src/createNoOpProvider.d.ts.map +1 -0
  20. package/dist/src/createNoOpProvider.js +12 -0
  21. package/dist/src/createNoOpProvider.js.map +1 -0
  22. package/dist/src/index.d.ts +6 -1
  23. package/dist/src/index.d.ts.map +1 -1
  24. package/dist/src/index.js +8 -1
  25. package/dist/src/index.js.map +1 -1
  26. package/dist/src/register.d.ts +54 -8
  27. package/dist/src/register.d.ts.map +1 -1
  28. package/dist/src/register.js +46 -6
  29. package/dist/src/register.js.map +1 -1
  30. package/dist/src/utils.d.ts +3 -0
  31. package/dist/src/utils.d.ts.map +1 -0
  32. package/dist/src/utils.js +7 -0
  33. package/dist/src/utils.js.map +1 -0
  34. package/dist/tsconfig.tsbuildinfo +1 -1
  35. package/package.json +1 -1
  36. package/src/createNoOpProvider.ts +10 -0
  37. package/src/index.ts +14 -1
  38. package/src/register.ts +75 -10
  39. package/src/utils.ts +9 -0
@@ -0,0 +1,6 @@
1
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
+ /**
3
+ * For dry runs we create a provider that doesn't export traces.
4
+ */
5
+ export declare function createNoOpProvider(): NodeTracerProvider;
6
+ //# sourceMappingURL=createNoOpProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNoOpProvider.d.ts","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,wBAAgB,kBAAkB,uBAIjC"}
@@ -0,0 +1,9 @@
1
+ import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
+ /**
3
+ * For dry runs we create a provider that doesn't export traces.
4
+ */
5
+ export function createNoOpProvider() {
6
+ const provider = new NodeTracerProvider({});
7
+ return provider;
8
+ }
9
+ //# sourceMappingURL=createNoOpProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createNoOpProvider.js","sourceRoot":"","sources":["../../src/createNoOpProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC,EAAE,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,3 +1,8 @@
1
- export { trace } from "@opentelemetry/api";
1
+ export { trace, context, type DiagLogLevel, type Tracer, SpanStatusCode, } from "@opentelemetry/api";
2
+ export { registerInstrumentations } from "@opentelemetry/instrumentation";
3
+ export { type Instrumentation } from "@opentelemetry/instrumentation";
4
+ export { type NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
5
+ export * from "./createNoOpProvider.js";
2
6
  export * from "./register.js";
7
+ export * from "./utils.js";
3
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,MAAM,EACX,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGxE,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,3 +1,7 @@
1
- export { trace } from "@opentelemetry/api";
1
+ export { trace, context, SpanStatusCode, } from "@opentelemetry/api";
2
+ export { registerInstrumentations } from "@opentelemetry/instrumentation";
3
+ // Phoenix abstractions
4
+ export * from "./createNoOpProvider.js";
2
5
  export * from "./register.js";
6
+ export * from "./utils.js";
3
7
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,EACL,OAAO,EAGP,cAAc,GACf,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAI1E,uBAAuB;AACvB,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -1,12 +1,18 @@
1
1
  import { NodeTracerProvider } from "@opentelemetry/sdk-trace-node";
2
- type RegisterParams = {
2
+ import { Instrumentation } from "@opentelemetry/instrumentation";
3
+ import { DiagLogLevel } from "@opentelemetry/api";
4
+ export type Headers = Record<string, string>;
5
+ /**
6
+ * Configuration parameters for registering Phoenix OpenTelemetry tracing
7
+ */
8
+ export type RegisterParams = {
3
9
  /**
4
10
  * The project the spans should be associated to
5
11
  * @default "default"
6
12
  */
7
13
  projectName?: string;
8
14
  /**
9
- * the URL to the phoenix server. Can be postfixed with tracing path.
15
+ * The URL to the phoenix server. Can be postfixed with tracing path.
10
16
  * If not provided, environment variables are checked.
11
17
  * @example "https://app.phoenix.arize.com"
12
18
  */
@@ -16,24 +22,64 @@ type RegisterParams = {
16
22
  * If not provided, environment variables are checked.
17
23
  */
18
24
  apiKey?: string;
25
+ /**
26
+ * Headers to be used when communicating with the OTLP collector
27
+ */
28
+ headers?: Headers;
19
29
  /**
20
30
  * Whether to use batching for span processing.
21
31
  * It is recommended to use batching in production environments
22
32
  * @default true
23
33
  */
24
34
  batch?: boolean;
35
+ /**
36
+ * A list of instrumentation to register.
37
+ * Note: this may only work with commonjs projects. ESM projects will require manually applying instrumentation.
38
+ */
39
+ instrumentations?: Instrumentation[];
25
40
  /**
26
41
  * Whether to set the tracer as a global provider.
27
42
  * @default true
28
43
  */
29
- setGlobalTracerProvider?: boolean;
44
+ global?: boolean;
45
+ /**
46
+ * The diag log level to set for the built in DiagConsoleLogger instance.
47
+ * Omit to disable built in logging.
48
+ */
49
+ diagLogLevel?: DiagLogLevel;
30
50
  };
31
- export declare function register({ url: paramsUrl, apiKey: paramsApiKey, projectName, batch, setGlobalTracerProvider, }: RegisterParams): NodeTracerProvider;
32
51
  /**
33
- * A utility method to normalize the url to be http compatible.
34
- * Assumes we are using http over gRPC.
35
- * @param url the url to the phoenix server. May contain a slug
52
+ * Registers Phoenix OpenTelemetry tracing with the specified configuration
53
+ *
54
+ * @param params - Configuration parameters for Phoenix tracing
55
+ * @param params.url - The URL to the phoenix server. Can be postfixed with tracing path
56
+ * @param params.apiKey - The API key for the phoenix instance
57
+ * @param params.projectName - The project the spans should be associated to
58
+ * @param params.instrumentations - A list of instrumentation to register
59
+ * @param params.batch - Whether to use batching for span processing
60
+ * @param params.global - Whether to set the tracer as a global provider
61
+ * @param params.diagLogLevel - the diagnostics log level
62
+ * @returns {NodeTracerProvider} The configured NodeTracerProvider instance
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * import { register } from '@arizeai/phoenix-otel';
67
+ *
68
+ * const provider = register({
69
+ * projectName: 'my-app',
70
+ * url: 'https://app.phoenix.arize.com',
71
+ * apiKey: 'your-api-key',
72
+ * batch: true
73
+ * });
74
+ * ```
75
+ */
76
+ export declare function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders, projectName, instrumentations, batch, global, diagLogLevel, }: RegisterParams): NodeTracerProvider;
77
+ /**
78
+ * A utility method to normalize the URL to be HTTP compatible.
79
+ * Assumes we are using HTTP over gRPC and ensures the URL ends with the correct traces endpoint.
80
+ *
81
+ * @param url - The URL to the phoenix server. May contain a slug
82
+ * @returns {string} The normalized URL with the '/v1/traces' endpoint
36
83
  */
37
84
  export declare function ensureCollectorEndpoint(url: string): string;
38
- export {};
39
85
  //# sourceMappingURL=register.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAGvC,KAAK,cAAc,GAAG;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,WAAuB,EACvB,KAAY,EACZ,uBAA8B,GAC/B,EAAE,cAAc,sBA+BhB;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D"}
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kBAAkB,EAEnB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,eAAe,EAEhB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAA2B,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,eAAe,EAAE,CAAC;IACrC;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAkB,EAC3B,WAAuB,EACvB,gBAAgB,EAChB,KAAY,EACZ,MAAa,EACb,YAAY,GACb,EAAE,cAAc,GAAG,kBAAkB,CA0CrC;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK3D"}
@@ -4,10 +4,42 @@ import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-proto";
4
4
  import { resourceFromAttributes } from "@opentelemetry/resources";
5
5
  import { NodeTracerProvider, } from "@opentelemetry/sdk-trace-node";
6
6
  import { getEnvApiKey, getEnvCollectorURL } from "./config.js";
7
- export function register({ url: paramsUrl, apiKey: paramsApiKey, projectName = "default", batch = true, setGlobalTracerProvider = true, }) {
7
+ import { registerInstrumentations, } from "@opentelemetry/instrumentation";
8
+ import { diag, DiagConsoleLogger } from "@opentelemetry/api";
9
+ /**
10
+ * Registers Phoenix OpenTelemetry tracing with the specified configuration
11
+ *
12
+ * @param params - Configuration parameters for Phoenix tracing
13
+ * @param params.url - The URL to the phoenix server. Can be postfixed with tracing path
14
+ * @param params.apiKey - The API key for the phoenix instance
15
+ * @param params.projectName - The project the spans should be associated to
16
+ * @param params.instrumentations - A list of instrumentation to register
17
+ * @param params.batch - Whether to use batching for span processing
18
+ * @param params.global - Whether to set the tracer as a global provider
19
+ * @param params.diagLogLevel - the diagnostics log level
20
+ * @returns {NodeTracerProvider} The configured NodeTracerProvider instance
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * import { register } from '@arizeai/phoenix-otel';
25
+ *
26
+ * const provider = register({
27
+ * projectName: 'my-app',
28
+ * url: 'https://app.phoenix.arize.com',
29
+ * apiKey: 'your-api-key',
30
+ * batch: true
31
+ * });
32
+ * ```
33
+ */
34
+ export function register({ url: paramsUrl, apiKey: paramsApiKey, headers: paramsHeaders = {}, projectName = "default", instrumentations, batch = true, global = true, diagLogLevel, }) {
35
+ if (diagLogLevel) {
36
+ diag.setLogger(new DiagConsoleLogger(), diagLogLevel);
37
+ }
8
38
  const url = ensureCollectorEndpoint(paramsUrl || getEnvCollectorURL() || "http://localhost:6006");
9
39
  const apiKey = paramsApiKey || getEnvApiKey();
10
- const headers = {};
40
+ const headers = Array.isArray(paramsHeaders)
41
+ ? Object.fromEntries(paramsHeaders)
42
+ : paramsHeaders;
11
43
  const configureHeaders = typeof apiKey == "string";
12
44
  if (configureHeaders) {
13
45
  headers["authorization"] = `Bearer ${apiKey}`;
@@ -29,15 +61,23 @@ export function register({ url: paramsUrl, apiKey: paramsApiKey, projectName = "
29
61
  }),
30
62
  spanProcessors: [spanProcessor],
31
63
  });
32
- if (setGlobalTracerProvider) {
64
+ if (instrumentations) {
65
+ registerInstrumentations({
66
+ instrumentations,
67
+ tracerProvider: provider,
68
+ });
69
+ }
70
+ if (global) {
33
71
  provider.register();
34
72
  }
35
73
  return provider;
36
74
  }
37
75
  /**
38
- * A utility method to normalize the url to be http compatible.
39
- * Assumes we are using http over gRPC.
40
- * @param url the url to the phoenix server. May contain a slug
76
+ * A utility method to normalize the URL to be HTTP compatible.
77
+ * Assumes we are using HTTP over gRPC and ensures the URL ends with the correct traces endpoint.
78
+ *
79
+ * @param url - The URL to the phoenix server. May contain a slug
80
+ * @returns {string} The normalized URL with the '/v1/traces' endpoint
41
81
  */
42
82
  export function ensureCollectorEndpoint(url) {
43
83
  if (!url.includes("/v1/traces")) {
@@ -1 +1 @@
1
- {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAgC5D,MAAM,UAAU,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,WAAW,GAAG,SAAS,EACvB,KAAK,GAAG,IAAI,EACZ,uBAAuB,GAAG,IAAI,GACf;IACf,MAAM,GAAG,GAAG,uBAAuB,CACjC,SAAS,IAAI,kBAAkB,EAAE,IAAI,uBAAuB,CAC7D,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IAC9C,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,MAAM,gBAAgB,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC;IACnD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,GAAG;QACH,OAAO;KACR,CAAC,CAAC;IACH,IAAI,aAA4B,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,+BAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,gCAAgC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC;QACtC,QAAQ,EAAE,sBAAsB,CAAC;YAC/B,CAAC,wBAAwB,CAAC,EAAE,WAAW;SACxC,CAAC;QACF,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,uBAAuB,EAAE,CAAC;QAC5B,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjC,CAAC"}
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,+BAA+B,EAC/B,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAEL,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAgB,MAAM,oBAAoB,CAAC;AAmD3E;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,QAAQ,CAAC,EACvB,GAAG,EAAE,SAAS,EACd,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,aAAa,GAAG,EAAE,EAC3B,WAAW,GAAG,SAAS,EACvB,gBAAgB,EAChB,KAAK,GAAG,IAAI,EACZ,MAAM,GAAG,IAAI,EACb,YAAY,GACG;IACf,IAAI,YAAY,EAAE,CAAC;QACjB,IAAI,CAAC,SAAS,CAAC,IAAI,iBAAiB,EAAE,EAAE,YAAY,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,GAAG,GAAG,uBAAuB,CACjC,SAAS,IAAI,kBAAkB,EAAE,IAAI,uBAAuB,CAC7D,CAAC;IACF,MAAM,MAAM,GAAG,YAAY,IAAI,YAAY,EAAE,CAAC;IAC9C,MAAM,OAAO,GAAY,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;QACnD,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC;QACnC,CAAC,CAAC,aAAa,CAAC;IAClB,MAAM,gBAAgB,GAAG,OAAO,MAAM,IAAI,QAAQ,CAAC;IACnD,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,MAAM,EAAE,CAAC;IAChD,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,iBAAiB,CAAC;QACrC,GAAG;QACH,OAAO;KACR,CAAC,CAAC;IACH,IAAI,aAA4B,CAAC;IACjC,IAAI,KAAK,EAAE,CAAC;QACV,aAAa,GAAG,IAAI,+BAA+B,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,aAAa,GAAG,IAAI,gCAAgC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,kBAAkB,CAAC;QACtC,QAAQ,EAAE,sBAAsB,CAAC;YAC/B,CAAC,wBAAwB,CAAC,EAAE,WAAW;SACxC,CAAC;QACF,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC,CAAC,CAAC;IAEH,IAAI,gBAAgB,EAAE,CAAC;QACrB,wBAAwB,CAAC;YACvB,gBAAgB;YAChB,cAAc,EAAE,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,EAAE,CAAC;QACX,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACtB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAW;IACjD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,OAAO,IAAI,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;AACjC,CAAC"}