@influence-society-web/deshotelsetdesiles 4.1.3

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.
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ (() => {
3
+ })();
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,409 @@
1
+ "use strict";
2
+ (() => {
3
+ // src/utils/constants.ts
4
+ var prefix = "data";
5
+ var SELECTORS = {
6
+ startingPriceList: `[${prefix}=starting-price-list]`,
7
+ price: `[${prefix}=price]`,
8
+ discount: `[${prefix}=discount]`,
9
+ discountContainer: `[${prefix}=discount-container]`,
10
+ currency: `[${prefix}=currency]`,
11
+ beHid: `[${prefix}-be-hid]`,
12
+ destination: `[${prefix}=destination]`,
13
+ offersList: `[${prefix}=offers-list]`,
14
+ /** Offer slug page: wrapper with existing main offer. Match both data="..." and data-... for Webflow. */
15
+ offerSlugDetail: `[${prefix}=offer-slug-detail], [data-offer-slug-detail]`,
16
+ /** Offer slug page: "Nos autres offres" list container. */
17
+ offerSlugOthersList: `[${prefix}=offer-slug-others-list], [data-offer-slug-others-list]`,
18
+ /** Offer slug page: card template inside offer-slug-others-list (use .offer-others_item if no data-list-item). */
19
+ offerSlugOthersListItem: ".offer-others_item",
20
+ /** Offer slug page: "Nos autres offres" section wrapper. Shown when other offers are rendered. */
21
+ offersMoreWrapper: `[${prefix}=offers-more-wrapper]`,
22
+ offersListContainer: `[${prefix}=offers-list-container]`,
23
+ listItem: `[${prefix}=list-item]`,
24
+ image: `[${prefix}=image]`,
25
+ name: `[${prefix}=name]`,
26
+ description: `[${prefix}=description]`,
27
+ hotelName: `[${prefix}=hotel-name]`,
28
+ hotelLink: `[${prefix}=hotel-link]`,
29
+ hotelStartingPriceContainer: `[${prefix}=hotel-starting-price-container]`,
30
+ moreDetails: `[${prefix}=more-details]`,
31
+ offersPopup: `[${prefix}=offers-popup]`,
32
+ offersPopupClose: `[${prefix}=close-btn]`,
33
+ hotelReserveLink: `[${prefix}=hotel-reserve-link]`,
34
+ hotelVillaReserveLink: `[${prefix}=hotel-villa-reserve-link]`,
35
+ hotelURLS: `[${prefix}=hotel-urls]`,
36
+ languageDropdown: `[${prefix}=language-dropdown]`,
37
+ selectedLanguage: `[${prefix}=selected-language]`,
38
+ loadingSpinner: `[${prefix}=loading-spinner]`,
39
+ cmsFilterEmptyState: `[fs-cmsfilter-element=empty]`,
40
+ startingfromItem: (id) => `[${prefix}-be-hid=${id}]`,
41
+ popupOverlay: `[fs-smartlightbox-element=trigger-close]`
42
+ };
43
+ var BE_HID_TO_SNIPPET_CODE = {
44
+ DHDICBeach: "gpgos12767",
45
+ DHDIJMalanga: "gptro12772",
46
+ DHDIToubana: "gpsai12770",
47
+ DHDIMahogany: "gpgos12769",
48
+ DHDILangleyres: "gpgua27143",
49
+ DHDIJungle: "mqros18592",
50
+ DHDIJade: "agste21689",
51
+ DHDIWINDLAND: "zzzzz25376",
52
+ DHDILeCapMaison: "lcgro30400",
53
+ DHDIChastenet: "agste21688",
54
+ DHDILPSoleil: "mqsai18593",
55
+ DHDISHANTI: "zzzzz25378",
56
+ DHDIPavillon: "zzzzz25377",
57
+ DHDIBELLEMARE: "zzzzz25379",
58
+ DHDIPrincemaurice: "mupos25678",
59
+ DHDIANAHITA: "zzzzz25380",
60
+ DHDISamana: "agstm21687",
61
+ FRANTHTLGrandCaseBe1: "frsai31536",
62
+ DHDITInn: "ageng20433",
63
+ DHDIBWaters: "agcro20496",
64
+ DHDICuisinartgolf: "gpang25884",
65
+ DMDESHTLSecretBayDom: "dmtib00001"
66
+ };
67
+ var CURRENCY_TO_SYMBOL = {
68
+ AED: "\u062F.\u0625.",
69
+ AFN: "Af",
70
+ ALL: "L",
71
+ AMD: "\u058F",
72
+ ANG: "\u0192",
73
+ AOA: "Kz",
74
+ ARS: "AR$",
75
+ AUD: "AU$",
76
+ AWG: "\u0192",
77
+ AZN: "\u043C\u0430\u043D",
78
+ BAM: "KM",
79
+ BBD: "BBD$",
80
+ BDT: "\u09F3",
81
+ BGN: "\u043B\u0432.",
82
+ BHD: "BD",
83
+ BIF: "FBu",
84
+ BMD: "$",
85
+ BND: "B$",
86
+ BOB: "Bs.",
87
+ BRL: "R$",
88
+ BSD: "$",
89
+ BTN: "Nu.",
90
+ BWP: "P",
91
+ BYN: "Br",
92
+ BZD: "BZ$",
93
+ CAD: "CA$",
94
+ CDF: "FC",
95
+ CHF: "Fr.",
96
+ CKD: "$",
97
+ CLP: "CL$",
98
+ CNY: "CN\xA5",
99
+ COP: "CO$",
100
+ CRC: "\u20A1",
101
+ CUC: "CUC$",
102
+ CUP: "$MN",
103
+ CVE: "CV$",
104
+ CZK: "K\u010D",
105
+ DJF: "Fdj",
106
+ DKK: "kr.",
107
+ DOP: "RD$",
108
+ DZD: "DA",
109
+ EGP: "E\xA3",
110
+ EHP: "Ptas.",
111
+ ERN: "Nkf",
112
+ ETB: "Br",
113
+ EUR: "\u20AC",
114
+ FJD: "FJ$",
115
+ FKP: "FK\xA3",
116
+ FOK: "kr",
117
+ GBP: "\xA3",
118
+ GEL: "\u20BE",
119
+ GGP: "\xA3",
120
+ GHS: "GH\u20B5",
121
+ GIP: "\xA3",
122
+ GMD: "D",
123
+ GNF: "FG",
124
+ GTQ: "Q",
125
+ GYD: "G$",
126
+ HKD: "HK$",
127
+ HNL: "L",
128
+ HRK: "kn",
129
+ HTG: "G",
130
+ HUF: "Ft",
131
+ IDR: "Rp",
132
+ ILS: "\u20AA",
133
+ IMP: "\xA3",
134
+ INR: "Rs.",
135
+ IQD: "\u062F.\u0639.",
136
+ IRR: "\uFDFC",
137
+ ISK: "kr",
138
+ JEP: "\xA3",
139
+ JMD: "J$",
140
+ JOD: "JD",
141
+ JPY: "\xA5",
142
+ KES: "KSh",
143
+ KGS: "\u0441",
144
+ KHR: "\u17DB",
145
+ KID: "$",
146
+ KMF: "CF",
147
+ KPW: "\u20A9",
148
+ KRW: "\u20A9",
149
+ KWD: "KD",
150
+ KYD: "CI$",
151
+ KZT: "\u20B8",
152
+ LAK: "\u20ADN",
153
+ LBP: "LL.",
154
+ LKR: "Rs.",
155
+ LRD: "L$",
156
+ LSL: "L",
157
+ LYD: "LD",
158
+ MAD: "DH",
159
+ MDL: "L",
160
+ MGA: "Ar",
161
+ MKD: "den",
162
+ MMK: "Ks",
163
+ MNT: "\u20AE",
164
+ MOP: "MOP$",
165
+ MRU: "UM",
166
+ MUR: "Rs.",
167
+ MVR: "MRf",
168
+ MWK: "MK",
169
+ MXN: "MX$",
170
+ MYR: "RM",
171
+ MZN: "MTn",
172
+ NAD: "N$",
173
+ NGN: "\u20A6",
174
+ NIO: "C$",
175
+ NOK: "kr",
176
+ NPR: "Rs.",
177
+ NZD: "NZ$",
178
+ OMR: "OR",
179
+ PAB: "B/.",
180
+ PEN: "S/.",
181
+ PGK: "K",
182
+ PHP: "\u20B1",
183
+ PKR: "Rs.",
184
+ PLN: "z\u0142",
185
+ PND: "$",
186
+ PRB: "\u0440.",
187
+ PYG: "\u20B2",
188
+ QAR: "QR",
189
+ RON: "L",
190
+ RSD: "din",
191
+ RUB: "\u20BD",
192
+ RWF: "FRw",
193
+ SAR: "SR",
194
+ SBD: "SI$",
195
+ SCR: "Rs.",
196
+ SDG: "\xA3SD",
197
+ SEK: "kr",
198
+ SGD: "S$",
199
+ SHP: "\xA3",
200
+ SLL: "Le",
201
+ SLS: "Sl",
202
+ SOS: "Sh.So.",
203
+ SRD: "Sr$",
204
+ SSP: "SS\xA3",
205
+ STN: "Db",
206
+ SVC: "\u20A1",
207
+ SYP: "LS",
208
+ SZL: "L",
209
+ THB: "\u0E3F",
210
+ TJS: "SM",
211
+ TMT: "m.",
212
+ TND: "DT",
213
+ TOP: "T$",
214
+ TRY: "TL",
215
+ TTD: "TT$",
216
+ TVD: "$",
217
+ TWD: "NT$",
218
+ TZS: "TSh",
219
+ UAH: "\u20B4",
220
+ UGX: "USh",
221
+ USD: "$",
222
+ UYU: "$U",
223
+ UZS: "\u0441\u0443\u043C",
224
+ VED: "Bs.",
225
+ VES: "Bs.F",
226
+ VND: "\u20AB",
227
+ VUV: "VT",
228
+ WST: "T",
229
+ XAF: "Fr",
230
+ XCD: "$",
231
+ XOF: "\u20A3",
232
+ XPF: "\u20A3",
233
+ YER: "YR",
234
+ ZAR: "R",
235
+ ZMW: "ZK",
236
+ ZWB: "",
237
+ ZWL: "Z$",
238
+ Abkhazia: "",
239
+ Artsakh: "\u0564\u0580."
240
+ };
241
+ var LANG_TO_LOCALE = {
242
+ it: "it_IT",
243
+ es: "es_ES",
244
+ fr: "fr_FR",
245
+ en: "en_GB"
246
+ };
247
+ var apiBaseUrl = "https://deshotelsetdesiles.ccordier.workers.dev/v2/";
248
+
249
+ // src/utils/buildQueryParams.ts
250
+ var buildQueryParams = (queryParams) => {
251
+ let url = "?";
252
+ for (const [key, value] of Object.entries(queryParams)) {
253
+ if (value) {
254
+ url += `${key}=${value}&`;
255
+ }
256
+ }
257
+ return url;
258
+ };
259
+
260
+ // src/utils/utils.ts
261
+ var listenForLanguageChange = () => {
262
+ const isitProduction = isProduction();
263
+ if (!isitProduction) {
264
+ const currentStagingLang = localStorage.getItem("wglang") || "fr";
265
+ window.Weglot.switchTo(currentStagingLang);
266
+ }
267
+ window.Weglot.on("languageChanged", () => {
268
+ if (isitProduction) {
269
+ window.location.reload();
270
+ } else {
271
+ const newLang = window.Weglot.getCurrentLang();
272
+ localStorage.setItem("wglang", newLang);
273
+ if (window.loadFromServer) {
274
+ window.loadFromServer();
275
+ }
276
+ }
277
+ });
278
+ };
279
+ var isProduction = () => {
280
+ return window.location.hostname !== "deshotelsetdesiles.webflow.io";
281
+ };
282
+ var getLocale = () => {
283
+ const lang = getLanguage();
284
+ return LANG_TO_LOCALE[lang];
285
+ };
286
+ var getLanguage = () => {
287
+ if (!isProduction()) {
288
+ return localStorage.getItem("wglang") || "fr";
289
+ }
290
+ try {
291
+ const language = window.Weglot.getCurrentLang();
292
+ if (language) {
293
+ return language;
294
+ }
295
+ } catch (error) {
296
+ console.error("Error getting language", error);
297
+ return "fr";
298
+ }
299
+ return "fr";
300
+ };
301
+
302
+ // src/utils/StartingPrice.ts
303
+ var StartingPrice = class {
304
+ // The hotel ids
305
+ hotelsIds;
306
+ // The elements that will be updated with the starting price data for each hotel
307
+ itemElements;
308
+ // The container elements for each hotel
309
+ itemContainerElements = [];
310
+ hotelStartingPriceDataMap = /* @__PURE__ */ new Map();
311
+ constructor(container) {
312
+ this.hotelsIds = [];
313
+ this.itemElements = [];
314
+ container.querySelectorAll(SELECTORS.beHid).forEach((item) => {
315
+ const hid = item.getAttribute(`${prefix}-be-hid`)?.trim();
316
+ if (hid && BE_HID_TO_SNIPPET_CODE[hid]) {
317
+ this.hotelsIds.push(BE_HID_TO_SNIPPET_CODE[hid]);
318
+ this.itemElements.push(item);
319
+ this.itemContainerElements.push(item.parentElement);
320
+ const priceElement = item.querySelector(SELECTORS.price);
321
+ if (priceElement) {
322
+ priceElement.style.display = "none";
323
+ }
324
+ } else if (hid && !BE_HID_TO_SNIPPET_CODE[hid]) {
325
+ const hotelStartingPriceContainer = item.querySelector(
326
+ SELECTORS.hotelStartingPriceContainer
327
+ );
328
+ if (hotelStartingPriceContainer) {
329
+ this.hidePricingContainer(hotelStartingPriceContainer);
330
+ }
331
+ }
332
+ });
333
+ listenForLanguageChange();
334
+ }
335
+ /**
336
+ *
337
+ * get the starting price data for each hotel and update the elements with the data
338
+ */
339
+ async getHotelStartingPrice() {
340
+ for (let index = 0; index < this.hotelsIds.length; index++) {
341
+ const hid = this.hotelsIds[index];
342
+ const element = this.itemElements[index];
343
+ const hotelStartingPriceContainer = element.querySelector(SELECTORS.hotelStartingPriceContainer) || this.itemContainerElements[index];
344
+ let startingPriceData = this.hotelStartingPriceDataMap.get(hid);
345
+ if (startingPriceData === void 0) {
346
+ startingPriceData = await this.getHotelStartingPriceData({
347
+ property: hid,
348
+ locale: getLocale()
349
+ });
350
+ }
351
+ this.hotelStartingPriceDataMap.set(hid, startingPriceData);
352
+ if (!startingPriceData) {
353
+ this.hidePricingContainer(hotelStartingPriceContainer);
354
+ continue;
355
+ }
356
+ const {
357
+ quotation: { pricePerNight, currency }
358
+ } = startingPriceData;
359
+ if (!pricePerNight) {
360
+ this.hidePricingContainer(hotelStartingPriceContainer);
361
+ }
362
+ const priceElement = element.querySelector(SELECTORS.price);
363
+ if (priceElement) {
364
+ priceElement.innerHTML = Math.floor(pricePerNight).toString();
365
+ priceElement.style.display = "block";
366
+ }
367
+ const currencyElement = element.querySelector(SELECTORS.currency);
368
+ if (currencyElement)
369
+ currencyElement.innerHTML = CURRENCY_TO_SYMBOL[currency];
370
+ }
371
+ }
372
+ /**
373
+ *
374
+ * @param queryParams to include as part of query for the request
375
+ * @returns Starting price data
376
+ */
377
+ async getHotelStartingPriceData(queryParams) {
378
+ const url = apiBaseUrl + "startingfrom" + buildQueryParams(queryParams);
379
+ const response = await fetch(url);
380
+ const body = await response.json();
381
+ if (body.error || !body.data)
382
+ return null;
383
+ return body.data;
384
+ }
385
+ /**
386
+ *
387
+ * @param hotelStartingPriceContainer to hide
388
+ */
389
+ hidePricingContainer(hotelStartingPriceContainer) {
390
+ if (hotelStartingPriceContainer) {
391
+ hotelStartingPriceContainer.style.display = "none";
392
+ }
393
+ }
394
+ };
395
+
396
+ // src/pages/CarnetDeVoyage.ts
397
+ window.Webflow ||= [];
398
+ window.loadFromServer = () => {
399
+ window.Webflow.push(async () => {
400
+ const startingPriceList = document.querySelector(SELECTORS.startingPriceList);
401
+ if (startingPriceList) {
402
+ const startingPrice = new StartingPrice(startingPriceList);
403
+ await startingPrice.getHotelStartingPrice();
404
+ }
405
+ });
406
+ };
407
+ window.loadFromServer();
408
+ })();
409
+ //# sourceMappingURL=CarnetDeVoyage.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/constants.ts", "../../src/utils/buildQueryParams.ts", "../../src/utils/utils.ts", "../../src/utils/StartingPrice.ts", "../../src/pages/CarnetDeVoyage.ts"],
4
+ "sourcesContent": ["export const prefix = 'data';\n\n// Selectors used within the project\nexport const SELECTORS = {\n startingPriceList: `[${prefix}=starting-price-list]`,\n price: `[${prefix}=price]`,\n discount: `[${prefix}=discount]`,\n discountContainer: `[${prefix}=discount-container]`,\n currency: `[${prefix}=currency]`,\n beHid: `[${prefix}-be-hid]`,\n destination: `[${prefix}=destination]`,\n offersList: `[${prefix}=offers-list]`,\n /** Offer slug page: wrapper with existing main offer. Match both data=\"...\" and data-... for Webflow. */\n offerSlugDetail: `[${prefix}=offer-slug-detail], [data-offer-slug-detail]`,\n /** Offer slug page: \"Nos autres offres\" list container. */\n offerSlugOthersList: `[${prefix}=offer-slug-others-list], [data-offer-slug-others-list]`,\n /** Offer slug page: card template inside offer-slug-others-list (use .offer-others_item if no data-list-item). */\n offerSlugOthersListItem: '.offer-others_item',\n /** Offer slug page: \"Nos autres offres\" section wrapper. Shown when other offers are rendered. */\n offersMoreWrapper: `[${prefix}=offers-more-wrapper]`,\n offersListContainer: `[${prefix}=offers-list-container]`,\n listItem: `[${prefix}=list-item]`,\n image: `[${prefix}=image]`,\n name: `[${prefix}=name]`,\n description: `[${prefix}=description]`,\n hotelName: `[${prefix}=hotel-name]`,\n hotelLink: `[${prefix}=hotel-link]`,\n hotelStartingPriceContainer: `[${prefix}=hotel-starting-price-container]`,\n moreDetails: `[${prefix}=more-details]`,\n offersPopup: `[${prefix}=offers-popup]`,\n offersPopupClose: `[${prefix}=close-btn]`,\n hotelReserveLink: `[${prefix}=hotel-reserve-link]`,\n hotelVillaReserveLink: `[${prefix}=hotel-villa-reserve-link]`,\n hotelURLS: `[${prefix}=hotel-urls]`,\n languageDropdown: `[${prefix}=language-dropdown]`,\n selectedLanguage: `[${prefix}=selected-language]`,\n loadingSpinner: `[${prefix}=loading-spinner]`,\n cmsFilterEmptyState: `[fs-cmsfilter-element=empty]`,\n startingfromItem: (id: string) => `[${prefix}-be-hid=${id}]`,\n popupOverlay: `[fs-smartlightbox-element=trigger-close]`,\n};\n\n// Query params keys\nexport const URL_PARAMS_KEYS = {\n checkinDate: 'checkin_date',\n};\n\n// maps the HID value gotten from the HTML attributes to the snippet code used to make API calls\nexport const BE_HID_TO_SNIPPET_CODE: {\n [key: string]: string;\n} = {\n DHDICBeach: 'gpgos12767',\n DHDIJMalanga: 'gptro12772',\n DHDIToubana: 'gpsai12770',\n DHDIMahogany: 'gpgos12769',\n DHDILangleyres: 'gpgua27143',\n DHDIJungle: 'mqros18592',\n DHDIJade: 'agste21689',\n DHDIWINDLAND: 'zzzzz25376',\n DHDILeCapMaison: 'lcgro30400',\n DHDIChastenet: 'agste21688',\n DHDILPSoleil: 'mqsai18593',\n DHDISHANTI: 'zzzzz25378',\n DHDIPavillon: 'zzzzz25377',\n DHDIBELLEMARE: 'zzzzz25379',\n DHDIPrincemaurice: 'mupos25678',\n DHDIANAHITA: 'zzzzz25380',\n DHDISamana: 'agstm21687',\n FRANTHTLGrandCaseBe1: 'frsai31536',\n DHDITInn: 'ageng20433',\n DHDIBWaters: 'agcro20496',\n DHDICuisinartgolf: 'gpang25884',\n DMDESHTLSecretBayDom: 'dmtib00001',\n};\n\n// location data\nconst GUADELOUPE = {\n en: 'Guadeloupe Islands',\n fr: 'Les \u00CEles de Guadeloupe',\n es: 'Las islas de Guadalupe',\n it: 'Le isole della Guadalupa',\n};\n\nconst DOMINIQUE = {\n en: 'La Dominique',\n fr: 'La Dominique',\n es: 'Dominica',\n it: 'Dominica',\n};\nconst SAINT_LUCIE = {\n en: 'Saint Lucia',\n fr: 'Sainte-Lucie',\n es: 'Santa Luc\u00EDa',\n it: 'Santa Lucia',\n};\n\nconst MARTINIQUE = {\n en: 'Martinique',\n fr: 'Martinique',\n es: 'Martinica',\n it: 'Martinica',\n};\n\nconst ILE_MAURICE = {\n en: 'Mauritius',\n fr: '\u00CEle Maurice',\n es: 'Mauricio',\n it: 'Mauritius',\n};\n\nconst SAINT_MARTIN = {\n en: 'Saint Martin',\n fr: 'Saint-Martin',\n es: 'Saint-Martin',\n it: 'Saint Martin',\n};\n\nconst ANTIGUA = {\n en: 'Antigua',\n fr: 'Antigua',\n es: 'Antigua',\n it: 'Antigua',\n};\n\nconst ANGUILLA = {\n en: 'Anguilla',\n fr: 'Anguilla',\n es: 'Anguila',\n it: 'Anguilla',\n};\n\n// maps the Snippet code to the hotel details\nexport const SNIPPET_CODE_TO_HOTEL: {\n [key: string]: {\n destination: Destination;\n slug: string;\n codeIPlanet: string;\n cmsId: string;\n };\n} = {\n gpgos12767: {\n destination: GUADELOUPE,\n slug: '/hotels-et-villas/creole-beach-hotel-spa',\n codeIPlanet: 'FRAN414',\n cmsId: '67c809b5f63deab8a71cf8e9',\n },\n gptro12772: {\n destination: GUADELOUPE,\n slug: '/hotels-et-villas/le-jardin-malanga',\n codeIPlanet: 'FRAN416',\n cmsId: '67c809b5f63deab8a71cf90d',\n },\n gpsai12770: {\n destination: GUADELOUPE,\n slug: '/hotels-et-villas/la-toubana-hotel-spa',\n codeIPlanet: 'FRAN411',\n cmsId: '67c809b5f63deab8a71cf8ef',\n },\n gpgos12769: {\n destination: GUADELOUPE,\n slug: '/hotels-et-villas/mahogany-hotel-residence-spa',\n codeIPlanet: 'FRAN423',\n cmsId: '67c809b5f63deab8a71cf91f',\n },\n gpgua27143: {\n destination: GUADELOUPE,\n slug: '/hotels-et-villas/langley-resort-fort-royal',\n codeIPlanet: 'GPAN32',\n cmsId: '67c809b5f63deab8a71cf8f0',\n },\n mqros18592: {\n destination: DOMINIQUE,\n slug: '/hotels-et-villas/jungle-bay-dominica',\n codeIPlanet: 'DMAN1',\n cmsId: '67c809b5f63deab8a71cf8ed',\n },\n dmtib00001: {\n destination: DOMINIQUE,\n slug: '/hotels-et-villas/secret-bay-dominique',\n codeIPlanet: 'DMAN2',\n cmsId: '67c809b5f63deab8a71cfefd',\n },\n agste21689: {\n destination: SAINT_LUCIE,\n slug: '/hotels-et-villas/jade-mountain',\n codeIPlanet: 'AGAN6',\n cmsId: '67c809b5f63deab8a71cf92a',\n },\n zzzzz25376: {\n destination: SAINT_LUCIE,\n slug: '/hotels-et-villas/windjammer-landing',\n codeIPlanet: 'LCAN4',\n cmsId: '67c809b5f63deab8a71cf92b',\n },\n lcgro30400: {\n destination: SAINT_LUCIE,\n slug: '/hotels-et-villas/cap-maison',\n codeIPlanet: 'LCLC8',\n cmsId: '67c809b5f63deab8a71cf929',\n },\n agste21688: {\n destination: SAINT_LUCIE,\n slug: '/hotels-et-villas/anse-chastanet',\n codeIPlanet: 'AGAN5',\n cmsId: '67c809b5f63deab8a71cf928',\n },\n mqsai18593: {\n destination: MARTINIQUE,\n slug: '/hotels-et-villas/plein-soleil',\n codeIPlanet: 'MQAN16',\n cmsId: '67c809b5f63deab8a71cf925',\n },\n zzzzz25378: {\n destination: ILE_MAURICE,\n slug: '/hotels-et-villas/shanti-maurice',\n codeIPlanet: 'MUAN22',\n cmsId: '67c809b5f63deab8a71cf933',\n },\n zzzzz25377: {\n destination: ILE_MAURICE,\n slug: '/hotels-et-villas/lux-le-morne',\n codeIPlanet: 'MUAN21',\n cmsId: '67c809b5f63deab8a71cf931',\n },\n zzzzz25379: {\n destination: ILE_MAURICE,\n slug: '/hotels-et-villas/constance-belle-mare-plage',\n codeIPlanet: 'MUAN20',\n cmsId: '67c809b5f63deab8a71cf92f',\n },\n mupos25678: {\n destination: ILE_MAURICE,\n slug: '/hotels-et-villas/constance-le-prince-maurice',\n codeIPlanet: 'MUAN24',\n cmsId: '67c809b5f63deab8a71cf930',\n },\n zzzzz25380: {\n destination: ILE_MAURICE,\n slug: '/hotels-et-villas/anahita-the-resort',\n codeIPlanet: 'MUAN19',\n cmsId: '67c809b5f63deab8a71cf92e',\n },\n agstm21687: {\n destination: SAINT_MARTIN,\n slug: '/hotels-et-villas/la-samanna',\n codeIPlanet: 'FRAN2350',\n cmsId: '67c809b5f63deab8a71cf926',\n },\n frsai31536: {\n destination: SAINT_MARTIN,\n slug: '/hotels-et-villas/le-grand-case-beach-club',\n codeIPlanet: 'FRFRA3',\n cmsId: '67c809b5f63deab8a71cf927',\n },\n ageng20433: {\n destination: ANTIGUA,\n slug: '/hotels-et-villas/the-inn-at-english-harbour',\n codeIPlanet: 'AGAN4',\n cmsId: '67c809b5f63deab8a71cf8ec',\n },\n agcro20496: {\n destination: ANTIGUA,\n slug: '/hotels-et-villas/blue-waters',\n codeIPlanet: 'AGAN1',\n cmsId: '67c809b5f63deab8a71cf8eb',\n },\n gpang25884: {\n destination: ANGUILLA,\n slug: '/hotels-et-villas/aurora-anguilla-resort-golf-club',\n codeIPlanet: 'GPAN30',\n cmsId: '67c809b5f63deab8a71cf8ea',\n },\n};\n\n// maps the currency code to the currency symbol\nexport const CURRENCY_TO_SYMBOL: { [key: string]: string } = {\n AED: '\u062F.\u0625.',\n AFN: 'Af',\n ALL: 'L',\n AMD: '\u058F',\n ANG: '\u0192',\n AOA: 'Kz',\n ARS: 'AR$',\n AUD: 'AU$',\n AWG: '\u0192',\n AZN: '\u043C\u0430\u043D',\n BAM: 'KM',\n BBD: 'BBD$',\n BDT: '\u09F3',\n BGN: '\u043B\u0432.',\n BHD: 'BD',\n BIF: 'FBu',\n BMD: '$',\n BND: 'B$',\n BOB: 'Bs.',\n BRL: 'R$',\n BSD: '$',\n BTN: 'Nu.',\n BWP: 'P',\n BYN: 'Br',\n BZD: 'BZ$',\n CAD: 'CA$',\n CDF: 'FC',\n CHF: 'Fr.',\n CKD: '$',\n CLP: 'CL$',\n CNY: 'CN\u00A5',\n COP: 'CO$',\n CRC: '\u20A1',\n CUC: 'CUC$',\n CUP: '$MN',\n CVE: 'CV$',\n CZK: 'K\u010D',\n DJF: 'Fdj',\n DKK: 'kr.',\n DOP: 'RD$',\n DZD: 'DA',\n EGP: 'E\u00A3',\n EHP: 'Ptas.',\n ERN: 'Nkf',\n ETB: 'Br',\n EUR: '\u20AC',\n FJD: 'FJ$',\n FKP: 'FK\u00A3',\n FOK: 'kr',\n GBP: '\u00A3',\n GEL: '\u20BE',\n GGP: '\u00A3',\n GHS: 'GH\u20B5',\n GIP: '\u00A3',\n GMD: 'D',\n GNF: 'FG',\n GTQ: 'Q',\n GYD: 'G$',\n HKD: 'HK$',\n HNL: 'L',\n HRK: 'kn',\n HTG: 'G',\n HUF: 'Ft',\n IDR: 'Rp',\n ILS: '\u20AA',\n IMP: '\u00A3',\n INR: 'Rs.',\n IQD: '\u062F.\u0639.',\n IRR: '\uFDFC',\n ISK: 'kr',\n JEP: '\u00A3',\n JMD: 'J$',\n JOD: 'JD',\n JPY: '\u00A5',\n KES: 'KSh',\n KGS: '\u0441',\n KHR: '\u17DB',\n KID: '$',\n KMF: 'CF',\n KPW: '\u20A9',\n KRW: '\u20A9',\n KWD: 'KD',\n KYD: 'CI$',\n KZT: '\u20B8',\n LAK: '\u20ADN',\n LBP: 'LL.',\n LKR: 'Rs.',\n LRD: 'L$',\n LSL: 'L',\n LYD: 'LD',\n MAD: 'DH',\n MDL: 'L',\n MGA: 'Ar',\n MKD: 'den',\n MMK: 'Ks',\n MNT: '\u20AE',\n MOP: 'MOP$',\n MRU: 'UM',\n MUR: 'Rs.',\n MVR: 'MRf',\n MWK: 'MK',\n MXN: 'MX$',\n MYR: 'RM',\n MZN: 'MTn',\n NAD: 'N$',\n NGN: '\u20A6',\n NIO: 'C$',\n NOK: 'kr',\n NPR: 'Rs.',\n NZD: 'NZ$',\n OMR: 'OR',\n PAB: 'B/.',\n PEN: 'S/.',\n PGK: 'K',\n PHP: '\u20B1',\n PKR: 'Rs.',\n PLN: 'z\u0142',\n PND: '$',\n PRB: '\u0440.',\n PYG: '\u20B2',\n QAR: 'QR',\n RON: 'L',\n RSD: 'din',\n RUB: '\u20BD',\n RWF: 'FRw',\n SAR: 'SR',\n SBD: 'SI$',\n SCR: 'Rs.',\n SDG: '\u00A3SD',\n SEK: 'kr',\n SGD: 'S$',\n SHP: '\u00A3',\n SLL: 'Le',\n SLS: 'Sl',\n SOS: 'Sh.So.',\n SRD: 'Sr$',\n SSP: 'SS\u00A3',\n STN: 'Db',\n SVC: '\u20A1',\n SYP: 'LS',\n SZL: 'L',\n THB: '\u0E3F',\n TJS: 'SM',\n TMT: 'm.',\n TND: 'DT',\n TOP: 'T$',\n TRY: 'TL',\n TTD: 'TT$',\n TVD: '$',\n TWD: 'NT$',\n TZS: 'TSh',\n UAH: '\u20B4',\n UGX: 'USh',\n USD: '$',\n UYU: '$U',\n UZS: '\u0441\u0443\u043C',\n VED: 'Bs.',\n VES: 'Bs.F',\n VND: '\u20AB',\n VUV: 'VT',\n WST: 'T',\n XAF: 'Fr',\n XCD: '$',\n XOF: '\u20A3',\n XPF: '\u20A3',\n YER: 'YR',\n ZAR: 'R',\n ZMW: 'ZK',\n ZWB: '',\n ZWL: 'Z$',\n Abkhazia: '',\n Artsakh: '\u0564\u0580.',\n};\n\n// maps the language code to the locale\nexport const LANG_TO_LOCALE: { [key: string]: string } = {\n it: 'it_IT',\n es: 'es_ES',\n fr: 'fr_FR',\n en: 'en_GB',\n};\n\n// maps the offer category to the CMS collection ID\nexport const OFFER_CATEGORIES = {\n 'DERNI\u00C8RE MINUTE': '735fe5e0858671cf3a5c14cbcc2470fe',\n 'R\u00C9SERVEZ T\u00D4T': 'c5abb23caf056891f3902ff42ae2f9e0',\n};\n\n// maps the slug to the CMS theme ID\nexport const SLUG_TO_THEME: { [key: string]: string } = {\n // Family stay\n '/thematiques/sejour-en-famille': '67c809b5f63deab8a71cf936',\n '/en/themes/family-stay': '67c809b5f63deab8a71cf936',\n '/es/temas/estancia-en-familia': '67c809b5f63deab8a71cf936',\n '/it/temi/soggiorno-in-famiglia': '67c809b5f63deab8a71cf936',\n\n // Honeymoon\n '/thematiques/voyages-de-noces': '67c809b5f63deab8a71cfb33',\n '/en/themes/honeymoons': '67c809b5f63deab8a71cfb33',\n '/es/temas/lunas-de-miel': '67c809b5f63deab8a71cfb33',\n '/it/temi/lune-di-miele': '67c809b5f63deab8a71cfb33',\n\n // Golf paradise\n '/thematiques/paradis-des-golfeurs': '67c809b5f63deab8a71cfb32',\n '/en/themes/a-golfer-s-paradise': '67c809b5f63deab8a71cfb32',\n '/es/temas/el-paraiso-del-golfista': '67c809b5f63deab8a71cfb32',\n '/it/temi/un-paradiso-per-i-golfisti': '67c809b5f63deab8a71cfb32',\n\n // All-inclusive\n '/thematiques/all-inclusives': '67c809b5f63deab8a71cf934',\n '/en/themes/all-inclusives': '67c809b5f63deab8a71cf934',\n '/es/temas/todo-incluido': '67c809b5f63deab8a71cf934',\n '/it/temi/tutto-compreso': '67c809b5f63deab8a71cf934',\n\n // Escapade SPA & Bien-\u00CAtre\n '/thematiques/escapade-spa-bien-etre': '67c809b5f63deab8a71cf935',\n '/en/themes/wellness-spa-getaway': '67c809b5f63deab8a71cf935',\n '/es/temas/escapada-spa-bienestar': '67c809b5f63deab8a71cf935',\n '/it/temi/soggiorno-benessere-alle-terme': '67c809b5f63deab8a71cf935',\n\n // Adventure\n '/thematiques/activites-et-loisirs': '67c809b5f63deab8a71cfcb4',\n '/en/themes/leisure-activities': '67c809b5f63deab8a71cfcb4',\n '/es/temas/actividades-y-ocio': '67c809b5f63deab8a71cfcb4',\n '/it/temi/attivita-e-tempo-libero': '67c809b5f63deab8a71cfcb4',\n\n // Scuba diving\n '/thematiques/plongee-sous-marine': '67c809b5f63deab8a71cf937',\n '/en/themes/scuba-diving': '67c809b5f63deab8a71cf937',\n '/es/temas/submarinismo': '67c809b5f63deab8a71cf937',\n '/it/temi/immersione-subacquea': '67c809b5f63deab8a71cf937',\n\n // Road trip\n '/thematiques/roadtrip': '67c809b5f63deab8a71cfb34',\n '/en/themes/roadtrip': '67c809b5f63deab8a71cfb34',\n '/es/temas/viaje-por-carretera': '67c809b5f63deab8a71cfb34',\n '/it/temi/viaggio-in-auto': '67c809b5f63deab8a71cfb34',\n\n // Senior\n '/thematiques/senior-60-ans-et-plus': '67c809b5f63deab8a71cfedb',\n '/en/themes/senior-60-ans-et-plus': '67c809b5f63deab8a71cfedb',\n '/es/temas/senior-60-ans-et-plus': '67c809b5f63deab8a71cfedb',\n '/it/temi/senior-60-ans-et-plus': '67c809b5f63deab8a71cfedb',\n};\n\n// base URL for the API\nexport const apiBaseUrl = 'https://deshotelsetdesiles.ccordier.workers.dev/v2/';\n// base URL for the hotel and flight API\nexport const hotelAndFlightURLBaseUrl =\n 'https://deshotelsetdesiles.i-planet.fr/dhdi-public/searchform.cgi';\n\n// default country code\nexport const DEFAULT_COUNTRY_CODE = 'FR';\n\nexport const GTM_GL =\n '1*q1lzz9*_gcl_au*MTMyMzcyMDY5NC4xNzM5Mjg5MzYx*_ga*NTAxMzI1MzMwLjE3MzkyODkzNjE.*_ga_Q0RXHLR7D4*MTczOTI5NzEzNC4zLjAuMTczOTI5NzE3Mi4yMi4wLjA.';\n", "/**\n *\n * @param queryParams to build\n * @returns string representation of query params\n */\nexport const buildQueryParams = (queryParams: QueryParams) => {\n let url = '?';\n for (const [key, value] of Object.entries(queryParams)) {\n if (value) {\n url += `${key}=${value}&`;\n }\n }\n return url;\n};\n", "import {\n GTM_GL,\n hotelAndFlightURLBaseUrl,\n LANG_TO_LOCALE,\n SNIPPET_CODE_TO_HOTEL,\n} from './constants';\n\n/**\n * Listen for language change and reload the page when the language is changed.\n */\nexport const listenForLanguageChange = () => {\n const isitProduction = isProduction();\n if (!isitProduction) {\n const currentStagingLang = localStorage.getItem('wglang') || 'fr';\n window.Weglot.switchTo(currentStagingLang);\n }\n window.Weglot.on('languageChanged', () => {\n if (isitProduction) {\n window.location.reload();\n } else {\n const newLang = window.Weglot.getCurrentLang();\n //add new language to local storage\n localStorage.setItem('wglang', newLang);\n if (window.loadFromServer) {\n window.loadFromServer();\n }\n }\n });\n};\n\nexport const isProduction = () => {\n return window.location.hostname !== 'deshotelsetdesiles.webflow.io';\n};\n\n/**\n *\n * @returns The locale of the current language.\n */\nexport const getLocale = () => {\n const lang = getLanguage();\n return LANG_TO_LOCALE[lang];\n};\n\n/**\n *\n * @returns the current language.\n */\nexport const getLanguage = (): string => {\n if (!isProduction()) {\n return localStorage.getItem('wglang') || 'fr';\n }\n try {\n const language = window.Weglot.getCurrentLang();\n if (language) {\n return language;\n }\n } catch (error) {\n console.error('Error getting language', error);\n return 'fr';\n }\n\n return 'fr';\n};\n\n/**\n *\n * @returns A map of cmsid to hotel id.\n */\nexport const cmsIDToHotelIdMap = () => {\n const map: { [key: string]: string } = {};\n Object.entries(SNIPPET_CODE_TO_HOTEL).forEach(([key, value]) => {\n map[value.cmsId] = key;\n });\n return map;\n};\n\n/**\n * gets the offer slug from the hotel id and offer name.\n * This is used to compare the offer CMS metadata with the offer data from the API.\n * @param hotelId The hotel id.\n * @param offerName The offer name.\n * @returns\n */\nexport const offerSlug = (hotelId: string, offerName: string) => {\n return `${hotelId.toLowerCase().trim()}-${offerName.toLowerCase().trim()}`;\n};\n\n/**\n * Generates the URL for the hotel and flight page.\n * @param currency iso currency code\n * @param hotelID The hotel id.\n * @param accessCodeValue for HotelPromo\n * @returns\n */\nexport const hotelAndFlightURL = (\n currency: string,\n hotelID: string,\n accessCodeValue: string | null\n) => {\n const lang = getLanguage().toUpperCase();\n const hotelCode = SNIPPET_CODE_TO_HOTEL[hotelID].codeIPlanet.toUpperCase();\n let url = `${hotelAndFlightURLBaseUrl}?Lang=${lang}&currency=${currency.toUpperCase()}&HotelCode=${hotelCode}`;\n\n // Include the Google Tag query parameter if it exists\n const gaTag = getCookie('_ga');\n const glTag = GTM_GL;\n const gclAuTag = getCookie('_gcl_au');\n url += `&_ga=${gaTag}&_gl=${glTag}&_gcl_au=${gclAuTag}`;\n\n if (accessCodeValue) {\n url = `${url}&HotelPromo=${accessCodeValue}`;\n }\n return url;\n};\n\n/**\n * Get the value of a cookie.\n * @param name The name of the cookie.\n */\nexport const getCookie = (name: string): string | null => {\n const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));\n return match ? match[2] : null;\n};\n", "import { buildQueryParams } from './buildQueryParams';\nimport {\n apiBaseUrl,\n BE_HID_TO_SNIPPET_CODE,\n CURRENCY_TO_SYMBOL,\n prefix,\n SELECTORS,\n} from './constants';\nimport { getLocale, listenForLanguageChange } from './utils';\n\n/**\n * Represents the Starting Price model for hotels\n */\nexport class StartingPrice {\n // The hotel ids\n private hotelsIds: string[];\n // The elements that will be updated with the starting price data for each hotel\n private itemElements: HTMLDivElement[];\n // The container elements for each hotel\n private itemContainerElements: (HTMLElement | null)[] = [];\n private hotelStartingPriceDataMap: Map<string, StartingPriceData | null> = new Map();\n\n constructor(container: HTMLDivElement) {\n this.hotelsIds = [];\n this.itemElements = [];\n\n container.querySelectorAll<HTMLDivElement>(SELECTORS.beHid).forEach((item) => {\n const hid = item.getAttribute(`${prefix}-be-hid`)?.trim();\n\n if (hid && BE_HID_TO_SNIPPET_CODE[hid]) {\n this.hotelsIds.push(BE_HID_TO_SNIPPET_CODE[hid]);\n this.itemElements.push(item);\n this.itemContainerElements.push(item.parentElement);\n\n const priceElement = item.querySelector<HTMLElement>(SELECTORS.price);\n if (priceElement) {\n priceElement.style.display = 'none';\n }\n } else if (hid && !BE_HID_TO_SNIPPET_CODE[hid]) {\n const hotelStartingPriceContainer = item.querySelector<HTMLElement>(\n SELECTORS.hotelStartingPriceContainer\n );\n if (hotelStartingPriceContainer) {\n this.hidePricingContainer(hotelStartingPriceContainer);\n }\n }\n });\n\n // get the starting price data for each hotel\n listenForLanguageChange();\n }\n\n /**\n *\n * get the starting price data for each hotel and update the elements with the data\n */\n public async getHotelStartingPrice() {\n for (let index = 0; index < this.hotelsIds.length; index++) {\n const hid = this.hotelsIds[index];\n const element = this.itemElements[index];\n\n const hotelStartingPriceContainer =\n element.querySelector<HTMLElement>(SELECTORS.hotelStartingPriceContainer) ||\n this.itemContainerElements[index];\n\n let startingPriceData = this.hotelStartingPriceDataMap.get(hid);\n // if the starting price data is not available in the cache, get it from the server\n if (startingPriceData === undefined) {\n startingPriceData = await this.getHotelStartingPriceData({\n property: hid,\n locale: getLocale(),\n });\n }\n\n // cache the starting price data\n this.hotelStartingPriceDataMap.set(hid, startingPriceData);\n\n // hide the container if there is no price data\n if (!startingPriceData) {\n this.hidePricingContainer(hotelStartingPriceContainer);\n continue;\n }\n\n const {\n quotation: { pricePerNight, currency },\n } = startingPriceData;\n\n // hide the container if the price is empty\n if (!pricePerNight) {\n this.hidePricingContainer(hotelStartingPriceContainer);\n }\n\n const priceElement = element.querySelector<HTMLElement>(SELECTORS.price);\n if (priceElement) {\n priceElement.innerHTML = Math.floor(pricePerNight).toString();\n priceElement.style.display = 'block';\n }\n\n const currencyElement = element.querySelector(SELECTORS.currency);\n if (currencyElement) currencyElement.innerHTML = CURRENCY_TO_SYMBOL[currency];\n }\n }\n\n /**\n *\n * @param queryParams to include as part of query for the request\n * @returns Starting price data\n */\n private async getHotelStartingPriceData(\n queryParams: QueryParams\n ): Promise<StartingPriceData | null> {\n const url = apiBaseUrl + 'startingfrom' + buildQueryParams(queryParams);\n\n const response = await fetch(url);\n const body = await response.json();\n if (body.error || !body.data) return null;\n\n return body.data as StartingPriceData;\n }\n\n /**\n *\n * @param hotelStartingPriceContainer to hide\n */\n private hidePricingContainer(hotelStartingPriceContainer: HTMLElement | null) {\n if (hotelStartingPriceContainer) {\n hotelStartingPriceContainer.style.display = 'none';\n }\n }\n}\n", "import { SELECTORS } from '$utils/constants';\n\nimport { StartingPrice } from '../utils/StartingPrice';\n\nwindow.Webflow ||= [];\nwindow.loadFromServer = () => {\n window.Webflow.push(async () => {\n // get the starting price list container\n const startingPriceList = document.querySelector<HTMLDivElement>(SELECTORS.startingPriceList);\n\n if (startingPriceList) {\n // get the starting price data\n const startingPrice = new StartingPrice(startingPriceList);\n await startingPrice.getHotelStartingPrice();\n }\n });\n};\n\nwindow.loadFromServer();\n"],
5
+ "mappings": "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,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL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",
6
+ "names": []
7
+ }