google-fli 0.1.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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +158 -0
  3. package/dist/core/airports.d.ts +31 -0
  4. package/dist/core/airports.d.ts.map +1 -0
  5. package/dist/core/airports.js +168 -0
  6. package/dist/core/airports.js.map +1 -0
  7. package/dist/core/builders.d.ts +30 -0
  8. package/dist/core/builders.d.ts.map +1 -0
  9. package/dist/core/builders.js +113 -0
  10. package/dist/core/builders.js.map +1 -0
  11. package/dist/core/currency.d.ts +21 -0
  12. package/dist/core/currency.d.ts.map +1 -0
  13. package/dist/core/currency.js +172 -0
  14. package/dist/core/currency.js.map +1 -0
  15. package/dist/core/dates.d.ts +22 -0
  16. package/dist/core/dates.d.ts.map +1 -0
  17. package/dist/core/dates.js +41 -0
  18. package/dist/core/dates.js.map +1 -0
  19. package/dist/core/index.d.ts +7 -0
  20. package/dist/core/index.d.ts.map +1 -0
  21. package/dist/core/index.js +7 -0
  22. package/dist/core/index.js.map +1 -0
  23. package/dist/core/links.d.ts +39 -0
  24. package/dist/core/links.d.ts.map +1 -0
  25. package/dist/core/links.js +53 -0
  26. package/dist/core/links.js.map +1 -0
  27. package/dist/core/parsers.d.ts +34 -0
  28. package/dist/core/parsers.d.ts.map +1 -0
  29. package/dist/core/parsers.js +161 -0
  30. package/dist/core/parsers.js.map +1 -0
  31. package/dist/index.d.ts +30 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +30 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/models/airline.d.ts +1120 -0
  36. package/dist/models/airline.d.ts.map +1 -0
  37. package/dist/models/airline.js +2224 -0
  38. package/dist/models/airline.js.map +1 -0
  39. package/dist/models/airport.d.ts +7899 -0
  40. package/dist/models/airport.d.ts.map +1 -0
  41. package/dist/models/airport.js +15782 -0
  42. package/dist/models/airport.js.map +1 -0
  43. package/dist/models/google-flights/base.d.ts +232 -0
  44. package/dist/models/google-flights/base.d.ts.map +1 -0
  45. package/dist/models/google-flights/base.js +188 -0
  46. package/dist/models/google-flights/base.js.map +1 -0
  47. package/dist/models/google-flights/dates.d.ts +51 -0
  48. package/dist/models/google-flights/dates.d.ts.map +1 -0
  49. package/dist/models/google-flights/dates.js +222 -0
  50. package/dist/models/google-flights/dates.js.map +1 -0
  51. package/dist/models/google-flights/flights.d.ts +57 -0
  52. package/dist/models/google-flights/flights.d.ts.map +1 -0
  53. package/dist/models/google-flights/flights.js +224 -0
  54. package/dist/models/google-flights/flights.js.map +1 -0
  55. package/dist/models/google-flights/index.d.ts +4 -0
  56. package/dist/models/google-flights/index.d.ts.map +1 -0
  57. package/dist/models/google-flights/index.js +4 -0
  58. package/dist/models/google-flights/index.js.map +1 -0
  59. package/dist/models/index.d.ts +4 -0
  60. package/dist/models/index.d.ts.map +1 -0
  61. package/dist/models/index.js +4 -0
  62. package/dist/models/index.js.map +1 -0
  63. package/dist/search/client.d.ts +66 -0
  64. package/dist/search/client.d.ts.map +1 -0
  65. package/dist/search/client.js +205 -0
  66. package/dist/search/client.js.map +1 -0
  67. package/dist/search/concurrency.d.ts +45 -0
  68. package/dist/search/concurrency.d.ts.map +1 -0
  69. package/dist/search/concurrency.js +148 -0
  70. package/dist/search/concurrency.js.map +1 -0
  71. package/dist/search/dates.d.ts +33 -0
  72. package/dist/search/dates.d.ts.map +1 -0
  73. package/dist/search/dates.js +159 -0
  74. package/dist/search/dates.js.map +1 -0
  75. package/dist/search/decoders.d.ts +22 -0
  76. package/dist/search/decoders.d.ts.map +1 -0
  77. package/dist/search/decoders.js +333 -0
  78. package/dist/search/decoders.js.map +1 -0
  79. package/dist/search/exceptions.d.ts +21 -0
  80. package/dist/search/exceptions.d.ts.map +1 -0
  81. package/dist/search/exceptions.js +37 -0
  82. package/dist/search/exceptions.js.map +1 -0
  83. package/dist/search/flights.d.ts +57 -0
  84. package/dist/search/flights.d.ts.map +1 -0
  85. package/dist/search/flights.js +298 -0
  86. package/dist/search/flights.js.map +1 -0
  87. package/dist/search/helpers.d.ts +10 -0
  88. package/dist/search/helpers.d.ts.map +1 -0
  89. package/dist/search/helpers.js +30 -0
  90. package/dist/search/helpers.js.map +1 -0
  91. package/dist/search/index.d.ts +10 -0
  92. package/dist/search/index.d.ts.map +1 -0
  93. package/dist/search/index.js +10 -0
  94. package/dist/search/index.js.map +1 -0
  95. package/dist/search/proto.d.ts +69 -0
  96. package/dist/search/proto.d.ts.map +1 -0
  97. package/dist/search/proto.js +355 -0
  98. package/dist/search/proto.js.map +1 -0
  99. package/dist/search/urls.d.ts +9 -0
  100. package/dist/search/urls.d.ts.map +1 -0
  101. package/dist/search/urls.js +9 -0
  102. package/dist/search/urls.js.map +1 -0
  103. package/dist/search/wire.d.ts +14 -0
  104. package/dist/search/wire.d.ts.map +1 -0
  105. package/dist/search/wire.js +120 -0
  106. package/dist/search/wire.js.map +1 -0
  107. package/package.json +91 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoders.d.ts","sourceRoot":"","sources":["../../src/search/decoders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAEnE,OAAO,KAAK,EAEV,aAAa,EAEb,YAAY,EAEb,MAAM,kCAAkC,CAAC;AAqB1C,iBAAS,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAsB/D;AASD,iBAAS,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,CAKlD;AAqBD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,iBAAS,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,cAAc,CAYvD;AAqGD,wDAAwD;AACxD,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,YAAY,CAgC3D;AAMD,wEAAwE;AACxE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,aAAa,EAAE,CAIjE;AAYD,iBAAS,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,aAAa,GAAG,IAAI,CA+DhE;AAgCD,OAAO,EACL,aAAa,IAAI,cAAc,EAC/B,cAAc,IAAI,eAAe,EACjC,WAAW,IAAI,YAAY,EAC3B,kBAAkB,IAAI,mBAAmB,GAC1C,CAAC"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Pure response decoders for Google Flights' RPC payloads.
3
+ * 1:1 port of fli/search/_decoders.py.
4
+ */
5
+ import { extractCurrencyFromPriceToken } from "../core/currency.js";
6
+ import { AIRLINE_NAMES } from "../models/airline.js";
7
+ import { AIRPORT_NAMES } from "../models/airport.js";
8
+ import { asBool, asInt, asNonNegativeInt, asStr, safeGet } from "./helpers.js";
9
+ // Pseudo-codes Google emits in place of a real IATA carrier identifier.
10
+ const AIRLINE_SENTINELS = new Set(["multi"]);
11
+ // Pre-compute the bare-IATA-code → enum-key lookup table. Digit-prefixed
12
+ // IATA codes (e.g. "2B") are stored in the enum under a "_2B" key because
13
+ // "2B" is not a valid JavaScript identifier; we strip the leading "_" so
14
+ // callers can look up by the wire-format code Google emits.
15
+ const AIRLINE_BY_CODE = {};
16
+ for (const key of Object.keys(AIRLINE_NAMES)) {
17
+ const code = key.startsWith("_") ? key.slice(1) : key;
18
+ AIRLINE_BY_CODE[code] = key;
19
+ }
20
+ const AIRPORT_BY_CODE = {};
21
+ for (const key of Object.keys(AIRPORT_NAMES)) {
22
+ AIRPORT_BY_CODE[key] = key;
23
+ }
24
+ function parseDateTime(dateArr, timeArr) {
25
+ if (!Array.isArray(dateArr) || !Array.isArray(timeArr)) {
26
+ throw new Error("Date and time arrays must contain at least one non-null value");
27
+ }
28
+ if (!dateArr.some((x) => x != null) || !timeArr.some((x) => x != null)) {
29
+ throw new Error("Date and time arrays must contain at least one non-null value");
30
+ }
31
+ const y = dateArr[0];
32
+ const m = dateArr[1];
33
+ const d = dateArr[2];
34
+ // Python's `datetime(y, m, d, ...)` rejects month=0 / day=0, so a partial
35
+ // like `[2026, null, null]` raises there. JS `new Date(2026, -1, 0, ...)`
36
+ // silently returns a valid-but-wrong Date (Nov 30 2025), so we enforce
37
+ // the same strictness up front. Time components default to 0 to match
38
+ // Python's `or 0` for the time tuple.
39
+ if (y == null || m == null || d == null || m < 1 || m > 12 || d < 1 || d > 31) {
40
+ throw new Error(`Invalid date components: y=${y}, m=${m}, d=${d}`);
41
+ }
42
+ const h = timeArr[0] ?? 0;
43
+ const min = timeArr[1] ?? 0;
44
+ // Use local-time constructor (mirrors Python's naive datetime).
45
+ return new Date(y, m - 1, d, h, min);
46
+ }
47
+ function parseAirport(code) {
48
+ if (typeof code !== "string" || !(code in AIRPORT_BY_CODE)) {
49
+ throw new Error(`Unknown airport code: ${String(code)}`);
50
+ }
51
+ return AIRPORT_BY_CODE[code];
52
+ }
53
+ function safeAirline(code) {
54
+ if (typeof code !== "string" || code.length === 0)
55
+ return null;
56
+ if (AIRLINE_SENTINELS.has(code))
57
+ return null;
58
+ if (code in AIRLINE_BY_CODE)
59
+ return AIRLINE_BY_CODE[code];
60
+ return null;
61
+ }
62
+ function parseAmenities(slots) {
63
+ if (!Array.isArray(slots) || slots.length === 0)
64
+ return null;
65
+ const wifi = asBool(safeGet(slots, 1));
66
+ const power = asBool(safeGet(slots, 5));
67
+ const onDemandVideo = asBool(safeGet(slots, 9));
68
+ const legroomRating = asNonNegativeInt(safeGet(slots, 11));
69
+ if (wifi == null && power == null && onDemandVideo == null && legroomRating == null) {
70
+ return null;
71
+ }
72
+ return {
73
+ wifi: wifi ?? null,
74
+ power: power ?? null,
75
+ usb_power: null,
76
+ in_seat_video: null,
77
+ on_demand_video: onDemandVideo ?? null,
78
+ legroom_rating: legroomRating ?? null,
79
+ };
80
+ }
81
+ function parseEmissions(detail) {
82
+ const out = { this_g: null, typical_g: null, delta_pct: null, tag: null };
83
+ const block = safeGet(detail, 22);
84
+ if (!Array.isArray(block))
85
+ return out;
86
+ out.this_g = asNonNegativeInt(safeGet(block, 7));
87
+ out.typical_g = asNonNegativeInt(safeGet(block, 8));
88
+ out.delta_pct = asInt(safeGet(block, 3));
89
+ const tagInt = asInt(safeGet(block, 11));
90
+ if (tagInt === 1)
91
+ out.tag = "lower";
92
+ else if (tagInt === 2)
93
+ out.tag = "typical";
94
+ else if (tagInt === 3)
95
+ out.tag = "higher";
96
+ return out;
97
+ }
98
+ function parseLeg(fl) {
99
+ const airlineInfo = fl[22] ?? [];
100
+ const airline = safeAirline(safeGet(airlineInfo, 0));
101
+ if (airline == null) {
102
+ throw new Error("Leg missing airline code");
103
+ }
104
+ const flightNumber = asStr(safeGet(airlineInfo, 1)) ?? "";
105
+ const opCode = safeGet(airlineInfo, 2);
106
+ const operatingAirline = opCode ? safeAirline(opCode) : null;
107
+ const amenities = parseAmenities(safeGet(fl, 12));
108
+ const aircraft = asStr(safeGet(fl, 17));
109
+ const legroomShort = asStr(safeGet(fl, 14));
110
+ const legroomLong = asStr(safeGet(fl, 30));
111
+ const overnight = asBool(safeGet(fl, 19)) ?? false;
112
+ const co2EmissionsG = asNonNegativeInt(safeGet(fl, 31));
113
+ return {
114
+ airline,
115
+ flight_number: flightNumber,
116
+ departure_airport: parseAirport(fl[3]),
117
+ arrival_airport: parseAirport(fl[6]),
118
+ departure_datetime: parseDateTime(fl[20], fl[8]),
119
+ arrival_datetime: parseDateTime(fl[21], fl[10]),
120
+ duration: fl[11],
121
+ departure_airport_name: asStr(safeGet(fl, 4)),
122
+ arrival_airport_name: asStr(safeGet(fl, 5)),
123
+ operating_airline: operatingAirline,
124
+ operating_flight_number: null,
125
+ aircraft,
126
+ legroom_short: legroomShort,
127
+ legroom: legroomLong ?? legroomShort,
128
+ amenities,
129
+ overnight,
130
+ co2_emissions_g: co2EmissionsG,
131
+ };
132
+ }
133
+ function deriveLayovers(legs, detailBlock) {
134
+ const detailEntries = Array.isArray(detailBlock) ? detailBlock : [];
135
+ const layovers = [];
136
+ for (let i = 0; i < legs.length - 1; i++) {
137
+ const prev = legs[i];
138
+ const next = legs[i + 1];
139
+ const waitMs = next.departure_datetime.getTime() - prev.arrival_datetime.getTime();
140
+ const deltaMinutes = Math.max(Math.floor(waitMs / 60000), 0);
141
+ let airportName = null;
142
+ let city = null;
143
+ const entry = detailEntries[i];
144
+ if (Array.isArray(entry)) {
145
+ airportName = asStr(safeGet(entry, 4));
146
+ city = asStr(safeGet(entry, 5));
147
+ }
148
+ layovers.push({
149
+ airport: prev.arrival_airport,
150
+ duration: deltaMinutes,
151
+ overnight: prev.arrival_datetime.toDateString() !== next.departure_datetime.toDateString(),
152
+ change_of_airport: prev.arrival_airport !== next.departure_airport,
153
+ airport_name: airportName,
154
+ city,
155
+ });
156
+ }
157
+ return layovers;
158
+ }
159
+ function getPriceBlock(row) {
160
+ const block = safeGet(row, 1);
161
+ return Array.isArray(block) ? block : null;
162
+ }
163
+ function parsePriceInfo(row) {
164
+ const priceBlock = getPriceBlock(row);
165
+ if (priceBlock == null)
166
+ throw new Error("price block missing — skip row");
167
+ const head = priceBlock[0];
168
+ if (!Array.isArray(head))
169
+ throw new Error("price head is not a list");
170
+ let price = null;
171
+ if (head.length > 0) {
172
+ const rawPrice = head[head.length - 1];
173
+ if (typeof rawPrice === "boolean" || (typeof rawPrice !== "number" && rawPrice != null)) {
174
+ throw new Error(`price field is not numeric: ${JSON.stringify(rawPrice)}`);
175
+ }
176
+ price = rawPrice == null ? null : Number(rawPrice);
177
+ }
178
+ let currency = null;
179
+ if (priceBlock.length > 1) {
180
+ try {
181
+ currency = extractCurrencyFromPriceToken(priceBlock[1]);
182
+ }
183
+ catch {
184
+ currency = null;
185
+ }
186
+ }
187
+ return [price, currency];
188
+ }
189
+ /** Decode a single flight row into a `FlightResult`. */
190
+ export function parseFlightRow(row) {
191
+ const detail = row[0];
192
+ const [price, currency] = parsePriceInfo(row);
193
+ const rawLegs = detail[2] ?? [];
194
+ const legs = rawLegs.map(parseLeg);
195
+ const layovers = legs.length > 1 ? deriveLayovers(legs, safeGet(detail, 13)) : [];
196
+ const emissions = parseEmissions(detail);
197
+ const primaryAirline = safeAirline(safeGet(detail, 0));
198
+ const namesField = safeGet(detail, 1);
199
+ let primaryAirlineName = null;
200
+ if (Array.isArray(namesField) && namesField.length > 0) {
201
+ const first = namesField[0];
202
+ if (typeof first === "string")
203
+ primaryAirlineName = first;
204
+ }
205
+ return {
206
+ legs,
207
+ price,
208
+ currency,
209
+ duration: detail[9],
210
+ stops: Math.max(legs.length - 1, 0),
211
+ layovers: layovers.length > 0 ? layovers : null,
212
+ co2_emissions_g: emissions.this_g,
213
+ co2_emissions_typical_g: emissions.typical_g,
214
+ co2_emissions_delta_pct: emissions.delta_pct,
215
+ emissions_tag: emissions.tag,
216
+ self_transfer: asBool(safeGet(detail, 12)),
217
+ mixed_cabin: asBool(safeGet(row, 10)),
218
+ primary_airline: primaryAirline,
219
+ primary_airline_name: primaryAirlineName,
220
+ booking_token: asStr(safeGet(row, 8)),
221
+ };
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Booking option decoding
225
+ // ---------------------------------------------------------------------------
226
+ /** Walk a decoded `wrb.fr` chunk and yield every booking-option row. */
227
+ export function parseBookingChunk(chunk) {
228
+ const out = [];
229
+ walkForBookingRows(chunk, out);
230
+ return out;
231
+ }
232
+ function walkForBookingRows(node, out) {
233
+ if (!Array.isArray(node))
234
+ return;
235
+ const opt = tryParseBookingRow(node);
236
+ if (opt != null) {
237
+ out.push(opt);
238
+ return;
239
+ }
240
+ for (const child of node)
241
+ walkForBookingRows(child, out);
242
+ }
243
+ function tryParseBookingRow(row) {
244
+ if (!Array.isArray(row) || row.length < 8)
245
+ return null;
246
+ if (typeof row[0] !== "number" || !Number.isInteger(row[0]))
247
+ return null;
248
+ const vendorBlock = row[1];
249
+ if (!Array.isArray(vendorBlock) || vendorBlock.length === 0)
250
+ return null;
251
+ const firstVendor = vendorBlock[0];
252
+ if (!Array.isArray(firstVendor) ||
253
+ firstVendor.length < 2 ||
254
+ typeof firstVendor[0] !== "string" ||
255
+ typeof firstVendor[1] !== "string") {
256
+ return null;
257
+ }
258
+ const isDirect = firstVendor.length >= 4 && typeof firstVendor[3] === "boolean" ? firstVendor[3] : false;
259
+ let flights = null;
260
+ if (Array.isArray(row[3])) {
261
+ const gathered = [];
262
+ for (const entry of row[3]) {
263
+ if (Array.isArray(entry) &&
264
+ entry.length >= 2 &&
265
+ typeof entry[0] === "string" &&
266
+ typeof entry[1] === "string") {
267
+ gathered.push([entry[0], entry[1]]);
268
+ }
269
+ }
270
+ flights = gathered.length > 0 ? gathered : null;
271
+ }
272
+ const [bookingUrl, googleClickUrl] = extractBookingUrls(row[5]);
273
+ let price = null;
274
+ let currency = null;
275
+ if (Array.isArray(row[7])) {
276
+ const pblock = row[7];
277
+ if (pblock.length > 0 && Array.isArray(pblock[0]) && pblock[0].length >= 2) {
278
+ const inner = pblock[0];
279
+ const rawPrice = inner[inner.length - 1];
280
+ if (typeof rawPrice === "number" && !Number.isNaN(rawPrice)) {
281
+ price = rawPrice;
282
+ }
283
+ }
284
+ if (pblock.length > 1 && typeof pblock[1] === "string") {
285
+ currency = extractCurrencyFromPriceToken(pblock[1]);
286
+ }
287
+ }
288
+ return {
289
+ vendor_code: firstVendor[0],
290
+ vendor_name: firstVendor[1],
291
+ is_airline_direct: isDirect,
292
+ price,
293
+ currency,
294
+ fare_name: extractFareName(row),
295
+ booking_url: bookingUrl,
296
+ google_click_url: googleClickUrl,
297
+ flights,
298
+ };
299
+ }
300
+ function extractBookingUrls(block) {
301
+ if (!Array.isArray(block))
302
+ return [null, null];
303
+ const vendorUrl = block.length > 0 && typeof block[0] === "string" ? block[0] : null;
304
+ let googleClickUrl = null;
305
+ if (block.length > 2 && Array.isArray(block[2]) && block[2].length > 0) {
306
+ const candidate = block[2][0];
307
+ if (typeof candidate === "string" && candidate.includes("/travel/clk")) {
308
+ googleClickUrl = candidate;
309
+ }
310
+ }
311
+ return [vendorUrl, googleClickUrl];
312
+ }
313
+ function extractFareName(row) {
314
+ if (row.length > 21 && Array.isArray(row[21]) && row[21].length > 3) {
315
+ const candidate = row[21][3];
316
+ if (typeof candidate === "string" && candidate.length > 0)
317
+ return candidate;
318
+ }
319
+ if (row.length > 14 && Array.isArray(row[14]) && row[14].length > 0) {
320
+ try {
321
+ const label = row[14][0][0][1][1];
322
+ if (typeof label === "string" && label.length > 0)
323
+ return label;
324
+ }
325
+ catch {
326
+ // Shape mismatch — fall through.
327
+ }
328
+ }
329
+ return null;
330
+ }
331
+ // Re-export the internal helpers so tests can exercise them.
332
+ export { parseDateTime as _parseDateTime, parseEmissions as _parseEmissions, safeAirline as _safeAirline, tryParseBookingRow as _tryParseBookingRow, };
333
+ //# sourceMappingURL=decoders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decoders.js","sourceRoot":"","sources":["../../src/search/decoders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,aAAa,EAAgB,MAAM,sBAAsB,CAAC;AAQnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE/E,wEAAwE;AACxE,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAE7C,yEAAyE;AACzE,0EAA0E;AAC1E,yEAAyE;AACzE,4DAA4D;AAC5D,MAAM,eAAe,GAA4B,EAAE,CAAC;AACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAC7C,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtD,eAAe,CAAC,IAAI,CAAC,GAAG,GAAc,CAAC;AACzC,CAAC;AAED,MAAM,eAAe,GAA4B,EAAE,CAAC;AACpD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;IAC7C,eAAe,CAAC,GAAG,CAAC,GAAG,GAAc,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB,EAAE,OAAgB;IACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAkB,CAAC;IACtC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAkB,CAAC;IACtC,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAkB,CAAC;IACtC,0EAA0E;IAC1E,0EAA0E;IAC1E,uEAAuE;IACvE,sEAAsE;IACtE,sCAAsC;IACtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,CAAC,GAAI,OAAO,CAAC,CAAC,CAAmB,IAAI,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAI,OAAO,CAAC,CAAC,CAAmB,IAAI,CAAC,CAAC;IAC/C,gEAAgE;IAChE,OAAO,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY,CAAC,IAAa;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,eAAe,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,eAAe,CAAC,IAAI,CAAY,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,IAAI,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC,IAAI,CAAY,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3D,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,EAAE,CAAC;QACpF,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO;QACL,IAAI,EAAE,IAAI,IAAI,IAAI;QAClB,KAAK,EAAE,KAAK,IAAI,IAAI;QACpB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,aAAa,IAAI,IAAI;QACtC,cAAc,EAAE,aAAa,IAAI,IAAI;KACtC,CAAC;AACJ,CAAC;AASD,SAAS,cAAc,CAAC,MAAe;IACrC,MAAM,GAAG,GAAmB,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IAC1F,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAClC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,GAAG,CAAC,MAAM,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,GAAG,CAAC,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACpD,GAAG,CAAC,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACzC,IAAI,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC;SAC/B,IAAI,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,GAAG,GAAG,SAAS,CAAC;SACtC,IAAI,MAAM,KAAK,CAAC;QAAE,GAAG,CAAC,GAAG,GAAG,QAAQ,CAAC;IAC1C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,QAAQ,CAAC,EAAa;IAC7B,MAAM,WAAW,GAAI,EAAE,CAAC,EAAE,CAAe,IAAI,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IACD,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC;IACnD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAExD,OAAO;QACL,OAAO;QACP,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,eAAe,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,kBAAkB,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAChD,gBAAgB,EAAE,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/C,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAW;QAC1B,sBAAsB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,oBAAoB,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,iBAAiB,EAAE,gBAAgB;QACnC,uBAAuB,EAAE,IAAI;QAC7B,QAAQ;QACR,aAAa,EAAE,YAAY;QAC3B,OAAO,EAAE,WAAW,IAAI,YAAY;QACpC,SAAS;QACT,SAAS;QACT,eAAe,EAAE,aAAa;KAC/B,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB,EAAE,WAAoB;IAC7D,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAc,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAc,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC;QACnF,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7D,IAAI,WAAW,GAAkB,IAAI,CAAC;QACtC,IAAI,IAAI,GAAkB,IAAI,CAAC;QAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,eAAe;YAC7B,QAAQ,EAAE,YAAY;YACtB,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,KAAK,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE;YAC1F,iBAAiB,EAAE,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,iBAAiB;YAClE,YAAY,EAAE,WAAW;YACzB,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7C,CAAC;AAED,SAAS,cAAc,CAAC,GAAc;IACpC,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,UAAU,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAE1E,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEtE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,OAAO,QAAQ,KAAK,SAAS,IAAI,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,IAAI,IAAI,CAAC,EAAE,CAAC;YACxF,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7E,CAAC;QACD,KAAK,GAAG,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,QAAQ,GAAG,6BAA6B,CAAC,UAAU,CAAC,CAAC,CAAW,CAAC,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ,GAAG,IAAI,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC3B,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,cAAc,CAAC,GAAc;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAc,CAAC;IACnC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAI,MAAM,CAAC,CAAC,CAAiB,IAAI,EAAE,CAAC;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACtC,IAAI,kBAAkB,GAAkB,IAAI,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,kBAAkB,GAAG,KAAK,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK;QACL,QAAQ;QACR,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAW;QAC7B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,QAAQ,EAAE,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;QAC/C,eAAe,EAAE,SAAS,CAAC,MAAM;QACjC,uBAAuB,EAAE,SAAS,CAAC,SAAS;QAC5C,uBAAuB,EAAE,SAAS,CAAC,SAAS;QAC5C,aAAa,EAAE,SAAS,CAAC,GAAG;QAC5B,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrC,eAAe,EAAE,cAAc;QAC/B,oBAAoB,EAAE,kBAAkB;QACxC,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,MAAM,GAAG,GAAoB,EAAE,CAAC;IAChC,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAa,EAAE,GAAoB;IAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,OAAO;IACjC,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QAChB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACd,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,IAAI;QAAE,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAc;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzE,MAAM,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzE,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACnC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3B,WAAW,CAAC,MAAM,GAAG,CAAC;QACtB,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ;QAClC,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,EAClC,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GACZ,WAAW,CAAC,MAAM,IAAI,CAAC,IAAI,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE1F,IAAI,OAAO,GAAmC,IAAI,CAAC;IACnD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC,CAAc,EAAE,CAAC;YACxC,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,MAAM,IAAI,CAAC;gBACjB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;gBAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAC5B,CAAC;gBACD,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAEhE,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAc,CAAC;QACnC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAK,MAAM,CAAC,CAAC,CAAe,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAc,CAAC;YACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5D,KAAK,GAAG,QAAQ,CAAC;YACnB,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACvD,QAAQ,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3B,iBAAiB,EAAE,QAAQ;QAC3B,KAAK;QACL,QAAQ;QACR,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC;QAC/B,WAAW,EAAE,UAAU;QACvB,gBAAgB,EAAE,cAAc;QAChC,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAK,KAAK,CAAC,CAAC,CAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtF,MAAM,SAAS,GAAI,KAAK,CAAC,CAAC,CAAe,CAAC,CAAC,CAAC,CAAC;QAC7C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;YACvE,cAAc,GAAG,SAAS,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,GAAc;IACrC,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAK,GAAG,CAAC,EAAE,CAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,MAAM,SAAS,GAAI,GAAG,CAAC,EAAE,CAAe,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,CAAC;IAC9E,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,GAAG,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAK,GAAG,CAAC,EAAE,CAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC;YACH,MAAM,KAAK,GAAO,GAAG,CAAC,EAAE,CAAe,CAAC,CAAC,CAAe,CAAC,CAAC,CAAe,CAAC,CAAC,CAAe,CAAC,CAAC,CAAC,CAAC;YAC9F,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,KAAK,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6DAA6D;AAC7D,OAAO,EACL,aAAa,IAAI,cAAc,EAC/B,cAAc,IAAI,eAAe,EACjC,WAAW,IAAI,YAAY,EAC3B,kBAAkB,IAAI,mBAAmB,GAC1C,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Typed errors raised by the search client.
3
+ * Mirrors fli/search/exceptions.py.
4
+ */
5
+ export declare class SearchClientError extends Error {
6
+ constructor(message: string);
7
+ }
8
+ export declare class SearchTimeoutError extends SearchClientError {
9
+ constructor(message: string);
10
+ }
11
+ export declare class SearchConnectionError extends SearchClientError {
12
+ constructor(message: string);
13
+ }
14
+ export declare class SearchHTTPError extends SearchClientError {
15
+ status_code: number | null;
16
+ constructor(message: string, statusCode?: number | null);
17
+ }
18
+ export declare class SearchParseError extends Error {
19
+ constructor(message: string);
20
+ }
21
+ //# sourceMappingURL=exceptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/search/exceptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,qBAAsB,SAAQ,iBAAiB;gBAC9C,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,eAAgB,SAAQ,iBAAiB;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;gBACf,OAAO,EAAE,MAAM,EAAE,UAAU,GAAE,MAAM,GAAG,IAAW;CAK9D;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Typed errors raised by the search client.
3
+ * Mirrors fli/search/exceptions.py.
4
+ */
5
+ export class SearchClientError extends Error {
6
+ constructor(message) {
7
+ super(message);
8
+ this.name = "SearchClientError";
9
+ }
10
+ }
11
+ export class SearchTimeoutError extends SearchClientError {
12
+ constructor(message) {
13
+ super(message);
14
+ this.name = "SearchTimeoutError";
15
+ }
16
+ }
17
+ export class SearchConnectionError extends SearchClientError {
18
+ constructor(message) {
19
+ super(message);
20
+ this.name = "SearchConnectionError";
21
+ }
22
+ }
23
+ export class SearchHTTPError extends SearchClientError {
24
+ status_code;
25
+ constructor(message, statusCode = null) {
26
+ super(message);
27
+ this.name = "SearchHTTPError";
28
+ this.status_code = statusCode;
29
+ }
30
+ }
31
+ export class SearchParseError extends Error {
32
+ constructor(message) {
33
+ super(message);
34
+ this.name = "SearchParseError";
35
+ }
36
+ }
37
+ //# sourceMappingURL=exceptions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exceptions.js","sourceRoot":"","sources":["../../src/search/exceptions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,iBAAiB;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,iBAAiB;IAC1D,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,iBAAiB;IACpD,WAAW,CAAgB;IAC3B,YAAY,OAAe,EAAE,aAA4B,IAAI;QAC3D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,UAAU,CAAC;IAChC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Flight search orchestrator — `GetShoppingResults` + `GetBookingResults`.
3
+ *
4
+ * 1:1 port of fli/search/flights.py.
5
+ */
6
+ import type { GoogleFlightsUrlOptions } from "../core/links.ts";
7
+ import type { BookingOption, FlightResult } from "../models/google-flights/base.ts";
8
+ import { FlightSearchFilters } from "../models/google-flights/flights.ts";
9
+ import { type Client } from "./client.ts";
10
+ export interface SearchOptions {
11
+ topN?: number;
12
+ currency?: string | null;
13
+ language?: string | null;
14
+ country?: string | null;
15
+ }
16
+ export interface BookingOptions {
17
+ currency?: string | null;
18
+ language?: string | null;
19
+ country?: string | null;
20
+ bookingToken?: string | null;
21
+ sessionId?: string | null;
22
+ }
23
+ /** Locale knobs for {@link SearchFlights.buildFlightBookingUrl} (alias of the core options). */
24
+ export type BookingUrlOptions = GoogleFlightsUrlOptions;
25
+ export declare class SearchFlights {
26
+ static readonly BASE_URL = "https://www.google.com/_/FlightsFrontendUi/data/travel.frontend.flights.FlightsFrontendService/GetShoppingResults";
27
+ static readonly BOOKING_URL = "https://www.google.com/_/FlightsFrontendUi/data/travel.frontend.flights.FlightsFrontendService/GetBookingResults";
28
+ private readonly client;
29
+ private _lastSessionId;
30
+ constructor(client?: Client);
31
+ /** Search for flights using the given filters. */
32
+ search(filters: FlightSearchFilters, options?: SearchOptions): Promise<Array<FlightResult | FlightResult[]> | null>;
33
+ private _fetchFlights;
34
+ /** Fetch bookable fare options for a selected itinerary. */
35
+ getBookingOptions(flight: FlightResult | FlightResult[], filters: FlightSearchFilters, options?: BookingOptions): Promise<BookingOption[]>;
36
+ /**
37
+ * Build a Google Flights deep-link URL for a specific itinerary.
38
+ *
39
+ * Constructs `https://www.google.com/travel/flights/booking?tfs=…` that opens
40
+ * the booking page pre-loaded with the given itinerary — the airline/OTA fare
41
+ * options and the "Continue" booking CTA included.
42
+ *
43
+ * The `tfs` itinerary token is fully deterministic (built from the flight's
44
+ * airports, dates and flight numbers); no session id or network round-trip is
45
+ * required, so the same itinerary always yields the same URL. This method
46
+ * never throws — on malformed input it falls back to the generic Google
47
+ * Flights URL.
48
+ *
49
+ * @param flight A single `FlightResult` (one-way / single segment) or an
50
+ * array of them (round-trip / multi-city, one element per travel direction).
51
+ */
52
+ buildFlightBookingUrl(flight: FlightResult | FlightResult[], options?: BookingUrlOptions): string;
53
+ private _captureSessionId;
54
+ private _expandMultiLeg;
55
+ static _encodeBookingPayload(token: string, filters: FlightSearchFilters): string;
56
+ }
57
+ //# sourceMappingURL=flights.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flights.d.ts","sourceRoot":"","sources":["../../src/search/flights.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAEpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,aAAa,CAAC;AAQrD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,gGAAgG;AAChG,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;AAExD,qBAAa,aAAa;IACxB,MAAM,CAAC,QAAQ,CAAC,QAAQ,uHAC8F;IACtH,MAAM,CAAC,QAAQ,CAAC,WAAW,sHAC0F;IAErH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,cAAc,CAAuB;gBAEjC,MAAM,CAAC,EAAE,MAAM;IAI3B,kDAAkD;IAC5C,MAAM,CACV,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,EAAE,CAAC,GAAG,IAAI,CAAC;YAkBzC,aAAa;IA4D3B,4DAA4D;IACtD,iBAAiB,CACrB,MAAM,EAAE,YAAY,GAAG,YAAY,EAAE,EACrC,OAAO,EAAE,mBAAmB,EAC5B,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC;IAuE3B;;;;;;;;;;;;;;;OAeG;IACH,qBAAqB,CACnB,MAAM,EAAE,YAAY,GAAG,YAAY,EAAE,EACrC,OAAO,GAAE,iBAAsB,GAC9B,MAAM;IAyCT,OAAO,CAAC,iBAAiB;YAcX,eAAe;IA0D7B,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,MAAM;CAalF"}