@workos/oagen 0.30.2 → 0.31.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 (46) hide show
  1. package/README.md +4 -12
  2. package/dist/cli/index.d.mts +1 -1
  3. package/dist/cli/index.mjs +2885 -651
  4. package/dist/cli/index.mjs.map +1 -1
  5. package/dist/compat/index.d.mts +85 -36
  6. package/dist/compat/index.d.mts.map +1 -1
  7. package/dist/compat/index.mjs +33 -23
  8. package/dist/compat/index.mjs.map +1 -1
  9. package/dist/{diff-BO5FieX5.mjs → diff-CAsypxXV.mjs} +107 -89
  10. package/dist/{diff-BO5FieX5.mjs.map → diff-CAsypxXV.mjs.map} +1 -1
  11. package/dist/differ-B0DSuKUZ.d.mts +72 -0
  12. package/dist/differ-B0DSuKUZ.d.mts.map +1 -0
  13. package/dist/index.d.mts +129 -61
  14. package/dist/index.d.mts.map +1 -1
  15. package/dist/index.mjs +2877 -546
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/{overlay-DWAHPofk.mjs → overlay-Dj3WWlNP.mjs} +44 -38
  18. package/dist/overlay-Dj3WWlNP.mjs.map +1 -0
  19. package/dist/scripts/smoke/baseline.d.mts +1 -1
  20. package/dist/scripts/smoke/baseline.mjs +2740 -527
  21. package/dist/scripts/smoke/baseline.mjs.map +1 -1
  22. package/dist/scripts/smoke/sdk-test.d.mts +1 -1
  23. package/dist/scripts/smoke/sdk-test.mjs +4 -2
  24. package/dist/scripts/smoke/sdk-test.mjs.map +1 -1
  25. package/dist/smoke.d.mts +251 -36
  26. package/dist/smoke.d.mts.map +1 -1
  27. package/dist/smoke.mjs +2740 -527
  28. package/dist/smoke.mjs.map +1 -1
  29. package/dist/{tree-sitter-CDKm3n64.mjs → tree-sitter-C7Hk-NDu.mjs} +35 -7
  30. package/dist/tree-sitter-C7Hk-NDu.mjs.map +1 -0
  31. package/dist/{types-BcbGLNkh.d.mts → types-I7W7CNl1.d.mts} +219 -9
  32. package/dist/types-I7W7CNl1.d.mts.map +1 -0
  33. package/dist/verify/index.d.mts +7 -8
  34. package/dist/verify/index.d.mts.map +1 -1
  35. package/dist/verify/index.mjs +24 -14
  36. package/dist/verify/index.mjs.map +1 -1
  37. package/docs/architecture/emitter-contract.md +1 -0
  38. package/docs/architecture/ir-types.md +170 -17
  39. package/docs/cli.md +13 -13
  40. package/package.json +3 -3
  41. package/skills/check-emitter-parity/SKILL.md +15 -1
  42. package/dist/differ-nZSxhCfC.d.mts +0 -123
  43. package/dist/differ-nZSxhCfC.d.mts.map +0 -1
  44. package/dist/overlay-DWAHPofk.mjs.map +0 -1
  45. package/dist/tree-sitter-CDKm3n64.mjs.map +0 -1
  46. package/dist/types-BcbGLNkh.d.mts.map +0 -1
package/docs/cli.md CHANGED
@@ -301,16 +301,16 @@ export default config;
301
301
 
302
302
  ### Options
303
303
 
304
- | Key | Type | Description |
305
- | ---------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
306
- | `emitters` | `Emitter[]` | Language emitters to register. Each emitter implements the `Emitter` interface and generates SDK files for one target language. |
307
- | `extractors` | `Extractor[]` | API surface extractors to register. Each extractor parses a live SDK and produces an `ApiSurface` JSON used for compat verification. |
308
- | `emitterProject` | `string` | Path to the emitter project directory. Used by skills to scaffold new emitters, tests, and smoke runners in the correct location. |
309
- | `smokeRunners` | `Record<string, string>` | Map from language key to custom smoke runner script path. Overrides the built-in `sdk-test.ts` for `oagen verify`. Can also be set per-invocation with `--smoke-runner`. |
310
- | `operationIdTransform` | `(id: string) => string` | Custom transform for operation IDs. Receives the raw `operationId` from the spec; return the desired operation name. No additional casing conversion is applied. When omitted, `operationId` values are converted to `camelCase`. |
311
- | `schemaNameTransform` | `(name: string) => string` | Custom transform for schema (model/enum) names. Applied after the built-in `cleanSchemaName` normalization. Receives the cleaned PascalCase name; return the desired name. |
312
- | `transformSpec` | `(spec: OpenApiDocument) => OpenApiDocument` | Pre-IR overlay applied to the bundled OpenAPI document before any IR extraction. Use to patch around upstream spec quirks that would otherwise emit a breaking SDK change. See [`transformSpec` — Pre-IR Spec Overlay](advanced/transform-spec.md). |
313
- | `docUrl` | `string` | Base URL for documentation links. When set, relative markdown paths in descriptions (e.g. `[User](/reference/users/user)`) are expanded to full URLs (e.g. `[User](https://docs.example.com/reference/users/user)`). |
314
- | `operationHints` | `Record<string, OperationHint>` | Per-operation overrides keyed by `"METHOD /path"`. Override derived method names, remount to a different service, or split union-body operations into typed wrappers. See [Operation Resolution](architecture/ir-types.md#operation-resolution). |
315
- | `mountRules` | `Record<string, string>` | Service-level remounting. Maps IR service name to target service/namespace (PascalCase). Keys may be exact names or trailing-`*` prefix patterns (e.g. `"UserManagement*"`); an exact key wins over any wildcard, and among wildcards the longest prefix wins. All operations in the source service are mounted on the target unless overridden per-operation in `operationHints`. |
316
- | `modelHints` | `Record<string, string>` | Pin specific models to a specific IR service for placement. Maps IR model name (post-`cleanSchemaName`/`schemaNameTransform`) → IR service name (PascalCase). Overrides the default "first service to reference the model wins" assignment. Both names must exist in the parsed spec; unknown names throw at generation time. |
304
+ | Key | Type | Description |
305
+ | ---------------------- | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
306
+ | `emitters` | `Emitter[]` | Language emitters to register. Each emitter implements the `Emitter` interface and generates SDK files for one target language. |
307
+ | `extractors` | `Extractor[]` | API surface extractors to register. Each extractor parses a live SDK and produces an `ApiSurface` JSON used for compat verification. |
308
+ | `emitterProject` | `string` | Path to the emitter project directory. Used by skills to scaffold new emitters, tests, and smoke runners in the correct location. |
309
+ | `smokeRunners` | `Record<string, string>` | Map from language key to custom smoke runner script path. Overrides the built-in `sdk-test.ts` for `oagen verify`. Can also be set per-invocation with `--smoke-runner`. |
310
+ | `operationIdTransform` | `(id: string) => string` | Custom transform for operation IDs. Receives the raw `operationId` from the spec; return the desired operation name. No additional casing conversion is applied. When omitted, `operationId` values are converted to `camelCase`. |
311
+ | `schemaNameTransform` | `(name: string, originalName?: string) => string` | Custom transform for schema (model/enum) names. Applied after the built-in `cleanSchemaName` normalization. Receives the cleaned PascalCase name (`name`) and, for component schemas, the original name exactly as spelled in the document (`originalName`); return the desired name. Return `originalName` to opt a schema out of normalization, but only when its spelling is already a valid identifier: a bare `originalName ?? name` would also keep keys like `user-profile` or `Foo.Bar` that `cleanSchemaName` would otherwise have fixed. For example `(name, originalName) => (originalName && /^[A-Za-z_$][\w$]*$/.test(originalName) ? originalName : name)` keeps `HTTPConfig`, `URL`, and `Settings` instead of `HttpConfig`, `Url`, and `Setting`. `originalName` is `undefined` for any name oagen synthesises (inline enums, request-body variant models, title-derived names), so fall back to `name` for those. Collisions are detected automatically: if a transform would produce a duplicate name, the cleaned name is kept. |
312
+ | `transformSpec` | `(spec: OpenApiDocument) => OpenApiDocument` | Pre-IR overlay applied to the bundled OpenAPI document before any IR extraction. Use to patch around upstream spec quirks that would otherwise emit a breaking SDK change. See [`transformSpec` — Pre-IR Spec Overlay](advanced/transform-spec.md). |
313
+ | `docUrl` | `string` | Base URL for documentation links. When set, relative markdown paths in descriptions (e.g. `[User](/reference/users/user)`) are expanded to full URLs (e.g. `[User](https://docs.example.com/reference/users/user)`). |
314
+ | `operationHints` | `Record<string, OperationHint>` | Per-operation overrides keyed by `"METHOD /path"`. Override derived method names, remount to a different service, or split union-body operations into typed wrappers. See [Operation Resolution](architecture/ir-types.md#operation-resolution). |
315
+ | `mountRules` | `Record<string, string>` | Service-level remounting. Maps IR service name to target service/namespace (PascalCase). Keys may be exact names or trailing-`*` prefix patterns (e.g. `"UserManagement*"`); an exact key wins over any wildcard, and among wildcards the longest prefix wins. All operations in the source service are mounted on the target unless overridden per-operation in `operationHints`. |
316
+ | `modelHints` | `Record<string, string>` | Pin specific models to a specific IR service for placement. Maps IR model name (post-`cleanSchemaName`/`schemaNameTransform`) → IR service name (PascalCase). Overrides the default "first service to reference the model wins" assignment. Both names must exist in the parsed spec; unknown names throw at generation time. |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workos/oagen",
3
- "version": "0.30.2",
3
+ "version": "0.31.0",
4
4
  "description": "Framework for building OpenAPI SDK emitters",
5
5
  "author": "WorkOS",
6
6
  "license": "MIT",
@@ -96,10 +96,10 @@
96
96
  "@types/node": "^25.3.3",
97
97
  "@vitest/coverage-v8": "^4.1.2",
98
98
  "husky": "^9.1.7",
99
- "oxfmt": "^0.36.0",
99
+ "oxfmt": "^0.72.0",
100
100
  "oxlint": "^1.51.0",
101
101
  "prettier": "^3.8.1",
102
- "tsdown": "^0.21.5",
102
+ "tsdown": "^0.23.0",
103
103
  "vitest": "^4.1.2"
104
104
  }
105
105
  }
@@ -80,6 +80,7 @@ A missing kind means an entire category of types won't generate correctly.
80
80
  #### ErrorResponse
81
81
 
82
82
  - `type` — Structured error type for typed exception/error classes
83
+ - `headers` — Declared response headers (e.g. `Retry-After` on a 429) for typed error accessors
83
84
 
84
85
  ### Priority: MEDIUM (documentation — affects developer experience)
85
86
 
@@ -98,6 +99,7 @@ A missing kind means an entire category of types won't generate correctly.
98
99
  - `deprecated` — Deprecation marker on methods
99
100
  - `async` — Async operation marker
100
101
  - `successResponses` — Multiple 2xx response types
102
+ - `responseHeaders` — Headers declared on the primary response (`Content-Disposition`, `Location`, `ETag`, rate limits)
101
103
  - `errors` — Error responses for exception/error documentation
102
104
  - `cookieParams` — Cookie parameter handling
103
105
 
@@ -107,11 +109,14 @@ A missing kind means an entire category of types won't generate correctly.
107
109
  - `deprecated` — Deprecated marker on params
108
110
  - `default` — Default value annotation
109
111
  - `example` — Example value annotation
112
+ - `constraints` — Validation limits (min/max, length, pattern, item counts) for doc comments or argument checks
113
+ - `examples` — Every example value (the list `example` is drawn from)
110
114
 
111
115
  #### Model
112
116
 
113
117
  - `description` — Model-level doc comment
114
118
  - `typeParams` — Generic type parameters
119
+ - `constraints` — Object-level limits (`minProperties`, `maxProperties`, `dependentRequired`)
115
120
 
116
121
  #### Field
117
122
 
@@ -120,6 +125,9 @@ A missing kind means an entire category of types won't generate correctly.
120
125
  - `writeOnly` — Write-only annotation
121
126
  - `deprecated` — Deprecation marker on fields
122
127
  - `default` — Default value annotation
128
+ - `example` — Example value annotation
129
+ - `examples` — Every example value (the list `example` is drawn from)
130
+ - `constraints` — Validation limits (min/max, length, pattern, item counts) for doc comments or value checks
123
131
 
124
132
  #### EnumValue
125
133
 
@@ -142,7 +150,7 @@ For each IR field from Step 2, search for references to the field name in the em
142
150
  - The field is used in conditional logic or output generation
143
151
  - The field is iterated over (e.g., `op.cookieParams`, `op.successResponses`)
144
152
 
145
- Use `Grep` with patterns like `\.description`, `\.readOnly`, `\.writeOnly`, `\.deprecated`, `\.default`, `\.example`, `\.async`, `\.cookieParams`, `\.successResponses`, `\.servers`, `\.typeParams`, `\.pagination`, `\.auth`, `\.requestBodyEncoding`, `\.injectIdempotencyKey`, `\.discriminator`, `\.compositionKind`, `\.format` scoped to the emitter source directory.
153
+ Use `Grep` with patterns like `\.description`, `\.readOnly`, `\.writeOnly`, `\.deprecated`, `\.default`, `\.example`, `\.examples`, `\.async`, `\.cookieParams`, `\.successResponses`, `\.responseHeaders`, `\.servers`, `\.typeParams`, `\.pagination`, `\.auth`, `\.requestBodyEncoding`, `\.injectIdempotencyKey`, `\.discriminator`, `\.compositionKind`, `\.format`, `\.constraints` scoped to the emitter source directory.
146
154
 
147
155
  ### 3c: Intentional Skips
148
156
 
@@ -227,14 +235,20 @@ For each gap, provide a specific, actionable suggestion for what the emitter sho
227
235
  | `ApiSpec.servers` | Server URL constants or configuration |
228
236
  | `Operation.async` | Mark method as async or add async behavior hints (e.g., `async` in TS/Rust, coroutine in Kotlin, `async def` in Python) |
229
237
  | `Operation.successResponses` | Document additional return types for each 2xx response |
238
+ | `Operation.responseHeaders` | Typed accessors for declared response headers (download filename, `Location`, `ETag`, rate limits) |
230
239
  | `Operation.cookieParams` | Document cookie parameters |
231
240
  | `Parameter.description` | Document query/header/cookie params in method doc comments |
232
241
  | `Parameter.deprecated` | Mark parameter as deprecated in docs |
233
242
  | `Parameter.default` | Document default value |
234
243
  | `Parameter.example` | Document example value |
244
+ | `Parameter.examples` | Document every example value (e.g. one `@example` tag each) |
235
245
  | `Field.readOnly` | Read-only annotation and language-appropriate modifier (`readonly` in TS, `attr_reader` in Ruby, `val` in Kotlin, `pub` without setter in Rust) |
236
246
  | `Field.writeOnly` | Write-only annotation in doc comments |
237
247
  | `Field.default` | Document default value |
248
+ | `Field.example` | Document example value |
249
+ | `Field.examples` | Document every example value (e.g. one `@example` tag each) |
250
+ | `Field.constraints` | Document limits ("at most 100 characters") or validate before serializing |
251
+ | `Parameter.constraints` | Document limits on method arguments or validate before sending |
238
252
 
239
253
  Include the specific file and approximate location where each fix should be applied.
240
254
 
@@ -1,123 +0,0 @@
1
- import { At as CompatSnapshot, Lt as LanguageId, Nt as CompatSymbol, St as LanguageHints, Vt as CompatPolicyHints, bt as DiffResult, nt as CompatChangeCategory, ot as CompatProvenance, rt as CompatChangeSeverity, t as ApiSpec, vt as ApiSurface } from "./types-BcbGLNkh.mjs";
2
-
3
- //#region src/compat/classify.d.ts
4
- /** A single classified compatibility change. */
5
- interface ClassifiedChange {
6
- /** Specific change category. */
7
- category: CompatChangeCategory;
8
- /** Policy-aware severity (may differ from defaultSeverityForCategory). */
9
- severity: CompatChangeSeverity;
10
- /** Fully-qualified symbol path. */
11
- symbol: string;
12
- /** Deterministic ID for grouping related changes across languages. */
13
- conceptualChangeId: string;
14
- /** Where the drift originated. */
15
- provenance: CompatProvenance;
16
- /** Description of the old state. */
17
- old: Record<string, string>;
18
- /** Description of the new state. */
19
- new: Record<string, string>;
20
- /** Human-readable explanation. */
21
- message: string;
22
- /**
23
- * Optional spec-level remediation hint. Set by post-classification rules
24
- * (see `detectForkedSchemas` in differ.ts) when a change has a recognized
25
- * upstream root cause that the spec author can fix. Surfaces in both the
26
- * machine-readable report and the human-readable summary.
27
- */
28
- remediation?: string;
29
- }
30
- /** Result of classifying all changes between two snapshots. */
31
- interface ClassificationResult {
32
- changes: ClassifiedChange[];
33
- summary: {
34
- breaking: number;
35
- softRisk: number;
36
- additive: number;
37
- };
38
- }
39
- /**
40
- * Classify changes between a baseline and candidate symbol.
41
- * Returns one or more classified changes for the diff.
42
- */
43
- declare function classifySymbolChanges(baseline: CompatSymbol, candidate: CompatSymbol | undefined, policy: CompatPolicyHints, language?: LanguageId): ClassifiedChange[];
44
- /**
45
- * Classify a new symbol as additive.
46
- */
47
- declare function classifyAddedSymbol(symbol: CompatSymbol): ClassifiedChange;
48
- /** Summarize a list of classified changes by severity. */
49
- declare function summarizeChanges(changes: ClassifiedChange[]): ClassificationResult['summary'];
50
- //#endregion
51
- //#region src/compat/spec-filter.d.ts
52
- /**
53
- * Compute the set of symbol names that are derivable from the OpenAPI spec.
54
- * Only these names should be compared during compat verification — everything
55
- * else in the baseline is hand-written and out of scope for generation.
56
- */
57
- declare function specDerivedNames(spec: ApiSpec, hints: LanguageHints): Set<string>;
58
- /**
59
- * Compute a map of enum name → set of wire values that appear in the spec.
60
- * Used by filterSurface to exclude hand-added enum members that aren't in the spec.
61
- */
62
- declare function specDerivedEnumValues(spec: ApiSpec): Map<string, Set<string | number>>;
63
- /**
64
- * Compute the set of field paths (e.g., "Organization.name") that are defined
65
- * in the OpenAPI spec's model schemas. Used by filterSurface to exclude
66
- * hand-added SDK fields that reference spec-derived types.
67
- */
68
- declare function specDerivedFieldPaths(spec: ApiSpec, hints: LanguageHints): Set<string>;
69
- /**
70
- * Compute the set of method paths (e.g., "Auth.authorize") that are defined
71
- * as operations in the OpenAPI spec's services. Used by filterSurface to
72
- * exclude hand-written SDK methods that don't correspond to spec operations.
73
- */
74
- declare function specDerivedMethodPaths(spec: ApiSpec): Set<string>;
75
- /**
76
- * Compute the set of HTTP operation keys (e.g., "GET /auth/authorize") that
77
- * exist in the spec. Used for overlay-based method matching.
78
- */
79
- declare function specDerivedHttpKeys(spec: ApiSpec): Set<string>;
80
- /**
81
- * Filter an ApiSurface to only include symbols whose names appear in the
82
- * allowed set. Symbols not in the set are dropped entirely — they won't
83
- * count toward the total or produce violations.
84
- *
85
- * For interfaces: when fieldPaths is provided, only keeps fields that appear
86
- * in the spec-derived field paths. This prevents false positives from hand-added
87
- * SDK fields that reference spec-derived types but aren't defined in the spec.
88
- *
89
- * For classes: when methodPaths is provided, only keeps methods whose names
90
- * appear in the spec-derived method paths. This prevents false positives from
91
- * hand-written SDK methods (e.g., Auth.authorization_url, Webhooks.construct_event)
92
- * that don't correspond to spec operations. Properties on service classes are
93
- * also filtered: only UPPER_CASE constants that are spec-derivable are kept.
94
- */
95
- declare function filterSurface(surface: ApiSurface, allowedNames: Set<string>, opts?: {
96
- fieldPaths?: Set<string>;
97
- methodPaths?: Set<string>;
98
- enumValues?: Map<string, Set<string | number>>;
99
- }): ApiSurface;
100
- //#endregion
101
- //#region src/compat/differ.d.ts
102
- /** Result of diffing two compat snapshots. */
103
- interface CompatDiffResult {
104
- changes: ClassifiedChange[];
105
- summary: ClassificationResult['summary'];
106
- }
107
- /**
108
- * Diff two compat snapshots, producing classified changes with
109
- * policy-aware severity.
110
- */
111
- declare function diffSnapshots(baseline: CompatSnapshot, candidate: CompatSnapshot, policy?: CompatPolicyHints): CompatDiffResult;
112
- /**
113
- * Compare two ApiSurface objects and return a DiffResult.
114
- *
115
- * This preserves the existing diffing behavior used by the overlay retry loop,
116
- * compat check, and all existing tests. The internal implementation uses the
117
- * same algorithms as before to maintain full backward compatibility with
118
- * overlay patching and verification workflows.
119
- */
120
- declare function diffSurfaces(baseline: ApiSurface, candidate: ApiSurface, hints: LanguageHints): DiffResult;
121
- //#endregion
122
- export { specDerivedEnumValues as a, specDerivedMethodPaths as c, ClassifiedChange as d, classifyAddedSymbol as f, filterSurface as i, specDerivedNames as l, summarizeChanges as m, diffSnapshots as n, specDerivedFieldPaths as o, classifySymbolChanges as p, diffSurfaces as r, specDerivedHttpKeys as s, CompatDiffResult as t, ClassificationResult as u };
123
- //# sourceMappingURL=differ-nZSxhCfC.d.mts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"differ-nZSxhCfC.d.mts","names":[],"sources":["../src/compat/classify.ts","../src/compat/spec-filter.ts","../src/compat/differ.ts"],"mappings":";;;;UAaiB,gBAAA;EAcJ;EAZX,QAAA,EAAU,oBAAA;EAAV;EAEA,QAAA,EAAU,oBAAA;EAAV;EAEA,MAAA;EAAA;EAEA,kBAAA;EAEA;EAAA,UAAA,EAAY,gBAAA;EAEZ;EAAA,GAAA,EAAK,MAAA;EAEL;EAAA,GAAA,EAAK,MAAA;EAEL;EAAA,OAAA;EAOW;;AAIb;;;;EAJE,WAAA;AAAA;;UAIe,oBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA;IACE,QAAA;IACA,QAAA;IACA,QAAA;EAAA;AAAA;;;;;iBAmMY,qBAAA,CACd,QAAA,EAAU,YAAA,EACV,SAAA,EAAW,YAAA,cACX,MAAA,EAAQ,iBAAA,EACR,QAAA,GAAW,UAAA,GACV,gBAAA;;;;iBAgYa,mBAAA,CAAoB,MAAA,EAAQ,YAAA,GAAe,gBAAA;;iBAc3C,gBAAA,CAAiB,OAAA,EAAS,gBAAA,KAAqB,oBAAA;;;;AAtnB/D;;;;iBCJgB,gBAAA,CAAiB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAA,GAAgB,GAAA;;;;;iBAgDvD,qBAAA,CAAsB,IAAA,EAAM,OAAA,GAAU,GAAA,SAAY,GAAA;;;;;;iBAalD,qBAAA,CAAsB,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,aAAA,GAAgB,GAAA;;;;;;iBAqB5D,sBAAA,CAAuB,IAAA,EAAM,OAAA,GAAU,GAAA;;;;;iBAcvC,mBAAA,CAAoB,IAAA,EAAM,OAAA,GAAU,GAAA;;;;;;;;;;;;ADuIpD;;;;iBCnFgB,aAAA,CACd,OAAA,EAAS,UAAA,EACT,YAAA,EAAc,GAAA,UACd,IAAA;EACE,UAAA,GAAa,GAAA;EACb,WAAA,GAAc,GAAA;EACd,UAAA,GAAa,GAAA,SAAY,GAAA;AAAA,IAE1B,UAAA;;;;UCtIc,gBAAA;EACf,OAAA,EAAS,gBAAA;EACT,OAAA,EAAS,oBAAA;AAAA;;;;;iBAOK,aAAA,CACd,QAAA,EAAU,cAAA,EACV,SAAA,EAAW,cAAA,EACX,MAAA,GAAS,iBAAA,GACR,gBAAA;;;;;;AFJH;;;iBEsqBgB,YAAA,CAAa,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,UAAA,EAAY,KAAA,EAAO,aAAA,GAAgB,UAAA"}