@metriport/fhir-sdk 1.2.6 → 1.3.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 (84) hide show
  1. package/README.md +207 -0
  2. package/dist/__tests__/date-range-performance.test.d.ts +2 -0
  3. package/dist/__tests__/date-range-performance.test.d.ts.map +1 -0
  4. package/dist/__tests__/date-range-performance.test.js +218 -0
  5. package/dist/__tests__/date-range-performance.test.js.map +1 -0
  6. package/dist/__tests__/date-range-search.test.d.ts +2 -0
  7. package/dist/__tests__/date-range-search.test.d.ts.map +1 -0
  8. package/dist/__tests__/date-range-search.test.js +215 -0
  9. package/dist/__tests__/date-range-search.test.js.map +1 -0
  10. package/dist/__tests__/fhir-bundle-sdk.test.js +467 -0
  11. package/dist/__tests__/fhir-bundle-sdk.test.js.map +1 -1
  12. package/dist/__tests__/reverse-references.test.d.ts +2 -0
  13. package/dist/__tests__/reverse-references.test.d.ts.map +1 -0
  14. package/dist/__tests__/reverse-references.test.js +241 -0
  15. package/dist/__tests__/reverse-references.test.js.map +1 -0
  16. package/dist/demo-reverse-references.d.ts +7 -0
  17. package/dist/demo-reverse-references.d.ts.map +1 -0
  18. package/dist/demo-reverse-references.js +207 -0
  19. package/dist/demo-reverse-references.js.map +1 -0
  20. package/dist/fhir-bundle-sdk.d.ts +222 -0
  21. package/dist/fhir-bundle-sdk.d.ts.map +1 -0
  22. package/dist/fhir-bundle-sdk.js +527 -0
  23. package/dist/fhir-bundle-sdk.js.map +1 -0
  24. package/dist/index.d.ts +2 -242
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +2 -677
  27. package/dist/index.js.map +1 -1
  28. package/dist/internal/bundle-operations.d.ts +14 -0
  29. package/dist/internal/bundle-operations.d.ts.map +1 -0
  30. package/dist/internal/bundle-operations.js +55 -0
  31. package/dist/internal/bundle-operations.js.map +1 -0
  32. package/dist/internal/date-extraction.d.ts +12 -0
  33. package/dist/internal/date-extraction.d.ts.map +1 -0
  34. package/dist/internal/date-extraction.js +206 -0
  35. package/dist/internal/date-extraction.js.map +1 -0
  36. package/dist/internal/graph-traversal.d.ts +13 -0
  37. package/dist/internal/graph-traversal.d.ts.map +1 -0
  38. package/dist/internal/graph-traversal.js +89 -0
  39. package/dist/internal/graph-traversal.js.map +1 -0
  40. package/dist/internal/indexing.d.ts +17 -0
  41. package/dist/internal/indexing.d.ts.map +1 -0
  42. package/dist/internal/indexing.js +118 -0
  43. package/dist/internal/indexing.js.map +1 -0
  44. package/dist/internal/llm-context.d.ts +39 -0
  45. package/dist/internal/llm-context.d.ts.map +1 -0
  46. package/dist/internal/llm-context.js +188 -0
  47. package/dist/internal/llm-context.js.map +1 -0
  48. package/dist/internal/reference-resolution.d.ts +25 -0
  49. package/dist/internal/reference-resolution.d.ts.map +1 -0
  50. package/dist/internal/reference-resolution.js +133 -0
  51. package/dist/internal/reference-resolution.js.map +1 -0
  52. package/dist/internal/reference-utils.d.ts +26 -0
  53. package/dist/internal/reference-utils.d.ts.map +1 -0
  54. package/dist/internal/reference-utils.js +89 -0
  55. package/dist/internal/reference-utils.js.map +1 -0
  56. package/dist/internal/validation.d.ts +16 -0
  57. package/dist/internal/validation.d.ts.map +1 -0
  58. package/dist/internal/validation.js +45 -0
  59. package/dist/internal/validation.js.map +1 -0
  60. package/dist/types/sdk-types.d.ts +107 -0
  61. package/dist/types/sdk-types.d.ts.map +1 -0
  62. package/dist/types/sdk-types.js +17 -0
  63. package/dist/types/sdk-types.js.map +1 -0
  64. package/dist/types/smart-resources.d.ts +97 -4
  65. package/dist/types/smart-resources.d.ts.map +1 -1
  66. package/dist/types/smart-resources.js +82 -5
  67. package/dist/types/smart-resources.js.map +1 -1
  68. package/dist/utils/interval-tree/index.d.ts +87 -0
  69. package/dist/utils/interval-tree/index.d.ts.map +1 -0
  70. package/dist/utils/interval-tree/index.js +774 -0
  71. package/dist/utils/interval-tree/index.js.map +1 -0
  72. package/dist/utils/interval-tree/shallowequal/arrays.d.ts +3 -0
  73. package/dist/utils/interval-tree/shallowequal/arrays.d.ts.map +1 -0
  74. package/dist/utils/interval-tree/shallowequal/arrays.js +25 -0
  75. package/dist/utils/interval-tree/shallowequal/arrays.js.map +1 -0
  76. package/dist/utils/interval-tree/shallowequal/index.d.ts +6 -0
  77. package/dist/utils/interval-tree/shallowequal/index.d.ts.map +1 -0
  78. package/dist/utils/interval-tree/shallowequal/index.js +28 -0
  79. package/dist/utils/interval-tree/shallowequal/index.js.map +1 -0
  80. package/dist/utils/interval-tree/shallowequal/objects.d.ts +3 -0
  81. package/dist/utils/interval-tree/shallowequal/objects.d.ts.map +1 -0
  82. package/dist/utils/interval-tree/shallowequal/objects.js +28 -0
  83. package/dist/utils/interval-tree/shallowequal/objects.js.map +1 -0
  84. package/package.json +2 -3
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const index_1 = require("../index");
5
+ describe("Date Range Search", () => {
6
+ const testBundle = {
7
+ resourceType: "Bundle",
8
+ type: "searchset",
9
+ entry: [
10
+ {
11
+ resource: {
12
+ resourceType: "Patient",
13
+ id: "patient-1",
14
+ },
15
+ },
16
+ {
17
+ resource: {
18
+ resourceType: "Observation",
19
+ id: "obs-1",
20
+ status: "final",
21
+ code: { text: "Blood Pressure" },
22
+ effectiveDateTime: "2024-01-15T10:00:00Z",
23
+ },
24
+ },
25
+ {
26
+ resource: {
27
+ resourceType: "Observation",
28
+ id: "obs-2",
29
+ status: "final",
30
+ code: { text: "Heart Rate" },
31
+ effectiveDateTime: "2024-03-20T14:30:00Z",
32
+ },
33
+ },
34
+ {
35
+ resource: {
36
+ resourceType: "Condition",
37
+ id: "condition-1",
38
+ clinicalStatus: { text: "active" },
39
+ code: { text: "Hypertension" },
40
+ onsetDateTime: "2024-02-10T08:00:00Z",
41
+ recordedDate: "2024-02-11",
42
+ },
43
+ },
44
+ {
45
+ resource: {
46
+ resourceType: "Encounter",
47
+ id: "encounter-1",
48
+ status: "finished",
49
+ class: { code: "outpatient" },
50
+ period: {
51
+ start: "2024-01-10T09:00:00Z",
52
+ end: "2024-01-10T10:00:00Z",
53
+ },
54
+ },
55
+ },
56
+ {
57
+ resource: {
58
+ resourceType: "Encounter",
59
+ id: "encounter-2",
60
+ status: "finished",
61
+ class: { code: "inpatient" },
62
+ period: {
63
+ start: "2024-04-01T08:00:00Z",
64
+ end: "2024-04-05T12:00:00Z",
65
+ },
66
+ },
67
+ },
68
+ ],
69
+ };
70
+ describe("Basic date range search", () => {
71
+ it("should find resources within a date range", async () => {
72
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
73
+ const results = sdk.searchByDateRange({
74
+ dateFrom: "2024-01-01",
75
+ dateTo: "2024-01-31",
76
+ });
77
+ expect(results.length).toBeGreaterThan(0);
78
+ const resourceIds = results.map(r => r.id);
79
+ expect(resourceIds).toContain("obs-1");
80
+ expect(resourceIds).toContain("encounter-1");
81
+ expect(resourceIds).not.toContain("obs-2");
82
+ expect(resourceIds).not.toContain("condition-1");
83
+ });
84
+ it("should find resources with Date objects", async () => {
85
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
86
+ const results = sdk.searchByDateRange({
87
+ dateFrom: new Date("2024-02-01"),
88
+ dateTo: new Date("2024-02-28"),
89
+ });
90
+ const resourceIds = results.map(r => r.id);
91
+ expect(resourceIds).toContain("condition-1");
92
+ });
93
+ it("should search from a start date to current date when dateTo is omitted", async () => {
94
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
95
+ const results = sdk.searchByDateRange({
96
+ dateFrom: "2024-01-01",
97
+ });
98
+ expect(results.length).toBeGreaterThan(0);
99
+ expect(results.length).toBeGreaterThanOrEqual(5);
100
+ });
101
+ });
102
+ describe("Filtered date range search", () => {
103
+ it("should filter by resource type", async () => {
104
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
105
+ const results = sdk.searchByDateRange({
106
+ dateFrom: "2024-01-01",
107
+ dateTo: "2024-12-31",
108
+ resourceTypes: ["Observation"],
109
+ });
110
+ expect(results.length).toBe(2);
111
+ expect(results.every(r => r.resourceType === "Observation")).toBe(true);
112
+ });
113
+ it("should filter by multiple resource types", async () => {
114
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
115
+ const results = sdk.searchByDateRange({
116
+ dateFrom: "2024-01-01",
117
+ dateTo: "2024-12-31",
118
+ resourceTypes: ["Observation", "Condition"],
119
+ });
120
+ expect(results.length).toBe(3);
121
+ const resourceTypes = results.map(r => r.resourceType);
122
+ expect(resourceTypes).toContain("Observation");
123
+ expect(resourceTypes).toContain("Condition");
124
+ expect(resourceTypes).not.toContain("Encounter");
125
+ });
126
+ it("should filter by date field", async () => {
127
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
128
+ const results = sdk.searchByDateRange({
129
+ dateFrom: "2024-02-01",
130
+ dateTo: "2024-02-28",
131
+ dateFields: ["recordedDate"],
132
+ });
133
+ expect(results.length).toBe(1);
134
+ expect(results[0]?.id).toBe("condition-1");
135
+ });
136
+ it("should filter by both resource type and date field", async () => {
137
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
138
+ const results = sdk.searchByDateRange({
139
+ dateFrom: "2024-01-01",
140
+ dateTo: "2024-12-31",
141
+ resourceTypes: ["Observation"],
142
+ dateFields: ["effectiveDateTime"],
143
+ });
144
+ expect(results.length).toBe(2);
145
+ expect(results.every(r => r.resourceType === "Observation")).toBe(true);
146
+ });
147
+ });
148
+ describe("Edge cases", () => {
149
+ it("should return empty array when no resources match date range", async () => {
150
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
151
+ const results = sdk.searchByDateRange({
152
+ dateFrom: "2025-01-01",
153
+ dateTo: "2025-12-31",
154
+ });
155
+ expect(results).toEqual([]);
156
+ });
157
+ it("should throw error for invalid dateFrom", async () => {
158
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
159
+ expect(() => {
160
+ sdk.searchByDateRange({
161
+ dateFrom: "invalid-date",
162
+ dateTo: "2024-12-31",
163
+ });
164
+ }).toThrow("Invalid dateFrom parameter");
165
+ });
166
+ it("should handle resources with period dates", async () => {
167
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
168
+ const results = sdk.searchByDateRange({
169
+ dateFrom: "2024-04-01",
170
+ dateTo: "2024-04-30",
171
+ });
172
+ const resourceIds = results.map(r => r.id);
173
+ expect(resourceIds).toContain("encounter-2");
174
+ });
175
+ it("should handle overlapping date ranges", async () => {
176
+ const sdk = await index_1.FhirBundleSdk.create(testBundle);
177
+ const results = sdk.searchByDateRange({
178
+ dateFrom: "2024-04-03",
179
+ dateTo: "2024-04-03",
180
+ });
181
+ const resourceIds = results.map(r => r.id);
182
+ expect(resourceIds).toContain("encounter-2");
183
+ });
184
+ });
185
+ describe("Performance", () => {
186
+ it("should perform search efficiently on large bundles", async () => {
187
+ const largeBundle = {
188
+ resourceType: "Bundle",
189
+ type: "searchset",
190
+ entry: [],
191
+ };
192
+ for (let i = 0; i < 1000; i++) {
193
+ largeBundle.entry.push({
194
+ resource: {
195
+ resourceType: "Observation",
196
+ id: `obs-${i}`,
197
+ status: "final",
198
+ code: { text: `Test ${i}` },
199
+ effectiveDateTime: new Date(2024, 0, 1 + (i % 365)).toISOString(),
200
+ },
201
+ });
202
+ }
203
+ const sdk = await index_1.FhirBundleSdk.create(largeBundle);
204
+ const start = performance.now();
205
+ const results = sdk.searchByDateRange({
206
+ dateFrom: "2024-01-01",
207
+ dateTo: "2024-01-31",
208
+ });
209
+ const end = performance.now();
210
+ expect(results.length).toBeGreaterThan(0);
211
+ expect(end - start).toBeLessThan(100);
212
+ });
213
+ });
214
+ });
215
+ //# sourceMappingURL=date-range-search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date-range-search.test.js","sourceRoot":"","sources":["../../src/__tests__/date-range-search.test.ts"],"names":[],"mappings":";AAAA,6DAA6D;;AAE7D,oCAAyC;AAGzC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,MAAM,UAAU,GAAW;QACzB,YAAY,EAAE,QAAQ;QACtB,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE;YACL;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,SAAS;oBACvB,EAAE,EAAE,WAAW;iBAChB;aACF;YACD;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,aAAa;oBAC3B,EAAE,EAAE,OAAO;oBACX,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;oBAChC,iBAAiB,EAAE,sBAAsB;iBAC3B;aACjB;YACD;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,aAAa;oBAC3B,EAAE,EAAE,OAAO;oBACX,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;oBAC5B,iBAAiB,EAAE,sBAAsB;iBAC3B;aACjB;YACD;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,WAAW;oBACzB,EAAE,EAAE,aAAa;oBACjB,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAClC,IAAI,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;oBAC9B,aAAa,EAAE,sBAAsB;oBACrC,YAAY,EAAE,YAAY;iBACd;aACf;YACD;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,WAAW;oBACzB,EAAE,EAAE,aAAa;oBACjB,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;oBAC7B,MAAM,EAAE;wBACN,KAAK,EAAE,sBAAsB;wBAC7B,GAAG,EAAE,sBAAsB;qBAC5B;iBACW;aACf;YACD;gBACE,QAAQ,EAAE;oBACR,YAAY,EAAE,WAAW;oBACzB,EAAE,EAAE,aAAa;oBACjB,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;oBAC5B,MAAM,EAAE;wBACN,KAAK,EAAE,sBAAsB;wBAC7B,GAAG,EAAE,sBAAsB;qBAC5B;iBACW;aACf;SACF;KACF,CAAC;IAEF,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAE1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC7C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;gBAChC,MAAM,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;YACtF,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;aACvB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;gBACpB,aAAa,EAAE,CAAC,aAAa,CAAC;aAC/B,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;gBACpB,aAAa,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC;aAC5C,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;YACvD,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;YAC/C,MAAM,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7C,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;gBACpB,UAAU,EAAE,CAAC,cAAc,CAAC;aAC7B,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;gBACpB,aAAa,EAAE,CAAC,aAAa,CAAC;gBAC9B,UAAU,EAAE,CAAC,mBAAmB,CAAC;aAClC,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,KAAK,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;YAC5E,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,CAAC,GAAG,EAAE;gBACV,GAAG,CAAC,iBAAiB,CAAC;oBACpB,QAAQ,EAAE,cAAc;oBACxB,MAAM,EAAE,YAAY;iBACrB,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEnD,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YAEH,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,WAAW,GAAW;gBAC1B,YAAY,EAAE,QAAQ;gBACtB,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,EAAE;aACV,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;gBAC7B,WAAW,CAAC,KAAM,CAAC,IAAI,CAAC;oBACtB,QAAQ,EAAE;wBACR,YAAY,EAAE,aAAa;wBAC3B,EAAE,EAAE,OAAO,CAAC,EAAE;wBACd,MAAM,EAAE,OAAO;wBACf,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE;wBAC3B,iBAAiB,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE;qBACnD;iBACjB,CAAC,CAAC;aACJ;YAED,MAAM,GAAG,GAAG,MAAM,qBAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;YAEpD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAChC,MAAM,OAAO,GAAG,GAAG,CAAC,iBAAiB,CAAC;gBACpC,QAAQ,EAAE,YAAY;gBACtB,MAAM,EAAE,YAAY;aACrB,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;YAE9B,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}