Une erreur s'est produite lors du traitement du gabarit.
Failed to "?eval" string with this error:

---begin-message---
Syntax error in ?eval-ed string in line 1, column 453:
Encountered "}", but was expecting one of:
    <STRING_LITERAL>
    <RAW_STRING>
    "false"
    "true"
    <INTEGER>
    <DECIMAL>
    "."
    "+"
    "-"
    "!"
    "["
    "("
    "{"
    <ID>
---end-message---

The failing expression:
==> Texte1szp.getData()?eval  [in template "20097#20123#37023070" at line 159, column 14]

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #list Texte1szp.getData()?eval.faq as...  [in template "20097#20123#37023070" at line 159, column 7]
----
1<div id="first"> 
2  <div class="container custom-container"> 
3    <div class="row section"> 
4      <div class="col-md-8 p-3"> 
5        <div class="text-white"> 
6          <h1>${Titre.getData()}</h1> 
7          <p class="title-desc">${ZoneDeSaisie1x48.getData()}</p> 
8        </div> 
9      </div> 
10      <div id="background-image"></div> 
11      <div class="diagonal-divider"></div> 
12    </div> 
13  </div> 
14</div> 
15<div class="container"> 
16  <#attempt> 
17    <#assign offerLocalService = serviceLocator.findService("com.totemia.commerce.type.offer.service.OfferLocalService")> 
18    <#assign produits = offerLocalService.searchProducts(Texteq55r.getData(), themeDisplay) > 
19    <div class="row justify-content-center align-items-center mt-4 mb-2"> 
20      <#if produits?size == 0> 
21        <div class="col"> 
22        <div class="d-flex text-center"> <i class="fa fa-exclamation-triangle" style="margin-top: 3px; 
23    margin-right: 10px;color: orange;"></i><h4>Catalogue en cours d'intégration pour cette catégorie</h4></div> 
24        
25              <p class="text-center">N'hésitez pas à nous contacter par téléphone au  
26                   <a href="tel:+33176381092">01 76 38 10 92</a>, par email à  
27                   <a href="mailto:contact@totemia.com">contact@totemia.com</a>  
28                   ou à demander un rappel via le formulaire ci-dessous pour bénéficier de nos conseils et vous inscrire sur liste d'attente. 
29                </p> 
30                 
31                <div id="recalled-form"></div> 
32                 
33              
34        </div> 
35        <img 
36            src="https://totemia.com/documents/37901/0/sad_cat.gif/ce486981-2149-275f-3b95-74f21a62e914?t=1710349975702" 
37            alt="Sad gif" class="gif-responsive"> 
38        <style> 
39          .gif-responsive { 
40            max-width: 100%; /* La largeur maximale de l'image sera de 100% de la largeur de son conteneur parent */ 
41            height: auto; /* La hauteur sera ajustée automatiquement pour conserver les proportions de l'image */ 
42            display: block; /* Assurez-vous que l'image est un élément de bloc pour respecter les marges et les paddings */ 
43            margin: auto; /* Centrez l'image horizontalement dans son conteneur parent */ 
44
45        </style> 
46      <#else> 
47        <span class="h3 text-center">Nos séjours coups de cœur </span> 
48        <i class="fa fa-heart text-secondary ml-2 mb-2"></i> 
49      </#if> 
50    </div> 
51    <div class="row justify-content-center"> 
52      <#list produits as produit> 
53        <#assign productName = produit.getProductName()> 
54        <#assign url = "${produit.getUrl()}" > 
55        <#assign img = "${produit.getImg()}" > 
56        <#assign id = "${produit.getCPDefinitionId()}" > 
57        <#assign shortDesc = "${produit.getShortDesc()}" > 
58        <#assign min = produit.getAgeMin() > 
59        <#assign max = produit.getAgeMax() > 
60        <#assign address = produit.getAddress() > 
61        <#assign cat = produit.getCatName() > 
62        <#assign price = produit.getMinPrice()> 
63        <#assign promo = produit.getMinPromoPrice()> 
64        <#assign isPromo = produit.getMinPrice() != produit.getMinPromoPrice() 
65        && produit.getMinPromoPrice() != "0"> 
66 
67        <div class="col-sm-6 col-xl-4 mb-3 hover-animate p-0 p-md-2"> 
68          <a href="${url}" class="text-decoration-none"> 
69            <div class="card h-100 shadow"> 
70              <img loading="lazy" class="card-img-top overflow-hidden gradient-overlay" src="${img}" 
71                   alt="${productName}"> 
72              <#if isPromo > 
73                <div class="card-img-overlay-top text-left"> 
74                  <span style="margin-right:2px;" class="badge summercamp">Promotion</span> 
75                </div> 
76              </#if> 
77              <div class="d-flex text-right font-weight-bold position-relative"> 
78                <div class="card-img-overlay-bottom z-index-20"> 
79                  <div class="text-white text-sm"> 
80                    <div class="media-body"> 
81                      <#if isPromo > 
82                        <span class="card-text text-muted position-relative mb-0">À partir de 
83                        <span style="text-decoration: line-through;" 
84                              class="text-dark text-sm">${price}€ 
85                        </span> 
86                        <span class="h4 promo-price"> 
87                        ${promo}€ 
88                        </span> 
89                        </span> 
90                      <#else> 
91                        <span class="card-text text-muted position-relative mb-0"> À partir de <span 
92                              class="h4">${price}€</span></span> 
93                      </#if> 
94                    </div> 
95                  </div> 
96                </div> 
97              </div> 
98              <div class="d-flex px-3 pt-2 justify-content-start overflow-hidden"> 
99                <span title="14-17 ans" class="badge badge-secondary-light">${min}-${max} ans</span> 
100                <span title="${cat}" class="badge badge-secondary-light">${cat}</span> 
101              </div> 
102              <div class="px-3 py-1"> 
103                <span 
104                    class="text-decoration-none text-dark font-weight-bold text-xs"> REF. ${id} </span><br> 
105                <span class="card-title mb-0 h5"> 
106               <span class="text-decoration-none text-uppercase text-dark" 
107                     style="letter-spacing: 0;">${address}</span> 
108               </span><br> 
109                <span class="card-title mb-1"> 
110               <span class="text-decoration-none text-dark"> ${productName} </span> 
111               </span> 
112                <div class="trustpilot-widget mb-1 trustbox-catalog" data-locale="fr-FR" 
113                     data-template-id="577258fb31f02306e4e3aaf9" 
114                     data-businessunit-id="619ccea0823eff5b62bdd9f3" data-style-height="24px" 
115                     data-style-width="100%" data-theme="light" data-sku="${id}" 
116                     data-no-reviews="hide" data-scroll-to-list="true" 
117                     data-style-alignment="left"></div> 
118              </div> 
119              <div class="card-body px-3 py-0"> 
120                <div class="d-flex card-subtitle mb-3"> 
121                  <span style="max-height: 75px;overflow: hidden;" 
122                        class="flex-grow-1 mb-0 text-muted text-xs font-weight-normal">${shortDesc} </span> 
123                </div> 
124              </div> 
125              <span class="p-2 bg-primary text-center text-white btn-see-offer"> Voir l'offre <i 
126                    class="fa fa-arrow-right ml-2"></i></span> 
127            </div> 
128          </a> 
129        </div> 
130 
131      </#list> 
132    </div> 
133    <#recover> 
134  </#attempt> 
135  <style> 
136    .card-img-overlay-bottom { 
137      position: absolute; 
138      right: 0; 
139      bottom: 10px; 
140      background: white; 
141      padding: 5px 15px; 
142      border-radius: 10px 0px 0px 10px; 
143
144  </style> 
145  <#if produits?size != 0> 
146    <div class="text-right d-flex align-items-center justify-content-end mb-4"> 
147      <a class="h3 text-secondary pr-3 mb-0" href="${Texteq55r.getData()}">Découvrir tous les 
148        séjours ${Titre.getData()}</a> 
149      <i class="fa text-secondary fa-arrow-right"></i> 
150    </div> 
151  </#if> 
152   <div class="article mt-5 p-1 p-md-3"> 
153      ${HTML1yo0.getData()} 
154    </div> 
155  <#if Texte1szp?? && Texte1szp.getData()?has_content> 
156  <div class="row justify-content-center"> 
157    <h2 class="">FAQ ${Titre.getData()}</h2> 
158    <div class="accordion"> 
159      <#list Texte1szp.getData()?eval.faq as item> 
160        <div class="accordion-item" itemscope itemprop="mainEntity" 
161             itemtype="https://schema.org/Question"> 
162          <button aria-expanded="false"> 
163            <h3 itemprop="name" class="accordion-title h4 p-1">${item.question}</h3> 
164            <span class="icon" aria-hidden="true"></span> 
165          </button> 
166          <div itemscope itemprop="acceptedAnswer" itemtype="https://schema.org/Answer" 
167               class="accordion-content"> 
168            <p itemprop="text" class="h5 p-4 font-weight-normal m-0">${item.answer}</p> 
169          </div> 
170        </div> 
171      </#list> 
172    </div> 
173    <style> 
174      .accordion .accordion-item { 
175        border-bottom: 1px solid #212529; 
176
177 
178      .accordion .accordion-item button[aria-expanded=true] { 
179        border-bottom: 1px solid #212529; 
180
181 
182      .accordion button { 
183        position: relative; 
184        display: block; 
185        text-align: left; 
186        width: 100%; 
187        padding: 1em 0; 
188        font-size: 1.15rem; 
189        font-weight: 400; 
190        border: none; 
191        background: none; 
192        outline: none; 
193
194 
195      .accordion button:hover, .accordion button:focus { 
196        cursor: pointer; 
197        color: #e83e8c; 
198
199 
200      .accordion button:hover::after, .accordion button:focus::after { 
201        cursor: pointer; 
202        color: #e83e8c; 
203        border: 1px solid #e83e8c; 
204
205 
206      .accordion button .accordion-title { 
207        padding: 1em 1.5em 1em 0; 
208
209 
210      .accordion button .icon { 
211        display: inline-block; 
212        position: absolute; 
213        top: 18px; 
214        right: 0; 
215        width: 22px; 
216        height: 22px; 
217        border: 1px solid; 
218        border-radius: 22px; 
219
220 
221      .accordion button .icon::before { 
222        display: block; 
223        position: absolute; 
224        content: ""; 
225        top: 9px; 
226        left: 5px; 
227        width: 10px; 
228        height: 2px; 
229        background: currentColor; 
230
231 
232      .accordion button .icon::after { 
233        display: block; 
234        position: absolute; 
235        content: ""; 
236        top: 5px; 
237        left: 9px; 
238        width: 2px; 
239        height: 10px; 
240        background: currentColor; 
241
242 
243      .accordion button[aria-expanded=true] { 
244        color: #212529; 
245
246 
247      .accordion button[aria-expanded=true] .icon::after { 
248        width: 0; 
249
250 
251      .accordion button[aria-expanded=true] + .accordion-content { 
252        opacity: 1; 
253        max-height: 200em; 
254        transition: all 200ms linear; 
255        will-change: opacity, max-height; 
256
257 
258      .accordion .accordion-content { 
259        opacity: 0; 
260        max-height: 0; 
261        overflow: hidden; 
262        transition: opacity 200ms linear, max-height 200ms linear; 
263        will-change: opacity, max-height; 
264
265 
266      .accordion .accordion-content p { 
267        font-size: 1rem; 
268        margin: 2em 0; 
269
270    </style> 
271    <script> 
272        let items = document.querySelectorAll(".accordion button"); 
273         
274        function toggleAccordion() { 
275        const itemToggle = this.getAttribute("aria-expanded"); 
276         
277        for (i = 0; i < items.length; i++) { 
278          items[i].setAttribute("aria-expanded", "false"); 
279
280         
281        if (itemToggle == "false") { 
282          this.setAttribute("aria-expanded", "true"); 
283
284
285         
286        items.forEach((item) => item.addEventListener("click", toggleAccordion)); 
287         
288        var element = document.getElementsByClassName("trustpilot-widget"); 
289        for(var i=0; i<element.length; i++) { 
290        window.Trustpilot.loadFromElement(element[i]); 
291
292    </script> 
293    </#if> 
294    
295  </div> 
296  <style> 
297    .article img { 
298      max-width: -webkit-fill-available; 
299      object-fit: cover; 
300
301 
302    #first { 
303      background: #1e2c63; /* Couleur de fond */ 
304      position: relative; 
305      overflow: hidden; 
306      position: relative; 
307
308 
309    <#if (Image29wz.getData())?? && Image29wz.getData() != ""> 
310    <#assign backgroundImage = '${Image29wz.getData()}'> 
311    <#assign extraStyle = '-4%'> 
312    <#else> 
313    <#assign backgroundImage = 'https://totemia.com/documents/37901/0/homepage_page_cat.jpg/0fb81309-6f8e-91af-aafe-4c6e44de0ec2?t=1707217228005'> 
314    <#assign extraStyle = '0%'> 
315    </#if> 
316    #background-image { 
317      background: url('${backgroundImage}'); 
318      background-size: cover; /* Redimensionnement de l'image */ 
319      background-position: right; /* Position de l'image à droite */ 
320      position: absolute; 
321      top: 0; 
322      right: ${extraStyle}; /* Commence à droite et en dehors du conteneur */ 
323      height: 100%; /* Hauteur de l'image égale à celle du conteneur */ 
324      width: 30%; /* Largeur de l'image égale à celle du conteneur */ 
325
326 
327    .section { 
328      color: white; /* Couleur du texte */ 
329
330 
331    .diagonal-divider::before { 
332      content: ''; 
333      position: absolute; 
334      top: 0; 
335      right: 25%; 
336      width: 10%; 
337      height: 100%; 
338      background-color: #1e2c63; /* Couleur de fond */ 
339      transform: skew(-15deg); /* Inclinaison diagonale */ 
340      z-index: 1; /* Place le pseudo-élément au-dessus du contenu */ 
341
342 
343    .section-content { 
344      position: relative; /* Position relative pour le z-index */ 
345      z-index: 2; /* Place le contenu au-dessus de la démarcation */ 
346
347 
348    .title-desc { 
349      margin-bottom: 0 !important; 
350
351 
352    @media (max-width: 767.98px) { 
353      .diagonal-divider { 
354        display: none; /* Masquer l'image sur les écrans de petite taille (mobile) */ 
355
356 
357      #background-image { 
358        position: relative; 
359        width: 100%; 
360
361 
362      .title-desc { 
363        font-size: 0.7rem; 
364
365 
366      .section div { 
367        text-align: center !important; 
368
369
370 
371    .breadcrumb { 
372      margin: 0; 
373      padding-bottom: 0; 
374
375  </style> 
376   
377     <script> 
378     
379     function onVariableExist(varName, callback) { 
380    // Création d'un intervalle pour vérifier l'existence de la variable 
381        const checkExist = setInterval(() => { 
382            if (typeof window[varName] !== 'undefined') {  // Vérifie si la variable existe dans l'objet global `window` 
383                clearInterval(checkExist);  // Arrête l'intervalle 
384                callback(window[varName]);  // Exécute la fonction callback en passant la variable en argument 
385
386        }, 100);  // Vérification toutes les 100ms 
387
388     
389    // Utilisation de la fonction pour détecter la variable "myVariable" 
390    onVariableExist('hbspt', function(value) { 
391        console.log("La variable 'myVariable' existe maintenant avec la valeur :", value); 
392        // Ajoutez ici le code que vous souhaitez exécuter lorsque la variable existe 
393        hbspt.forms.create({ 
394                region: "na1", 
395                portalId: "8587022", 
396                formId: "dedc835c-9a30-443a-9029-77321fc48d33", 
397                target: '#recalled-form', 
398            }); 
399    }); 
400    </script>