PageSourceSearch

https://www.dompierresurhelpe.fr/typo3conf/ext/rvvnsiteconfig/Reso…/tarteaucitron.services.RVVN.1789549383.js

js dompierresurhelpe.fr collected 2026-09-25 08:21:45 UTC 49,244 bytes, 1,123 lines download raw bytes

1/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
2/* !!! suffixe "RVVN" obligatoire dans la clef !!! */
3/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
4
5/* Contenus RVVN ***************************************************************************/
6
7tarteaucitron.services.youtubeRVVN = {
8    "key": "youtubeRVVN",
9    "type": "video",
10    "name": "YouTube",
11    "uri": "https://policies.google.com/privacy",
12    "needConsent": true,
13    "cookies": ['VISITOR_INFO1_LIVE', 'YSC', 'PREF', 'GEUP'],
14    "domains": [
15        "www.youtube-nocookie.com", 
16        "googlevideo.com", 
17        "www.google.com",
18        "www.gstatic.com",
19        "fonts.gstatic.com",
20        "googleapis.com",
21        "ytimg.com",
22        "ggpht.com"
23    ], // attribut custom de RVVN
24    "js": function() {
25        "use strict";
26        tarteaucitron.fallback(['youtube_responsive'], function(x) {
27            var video_id = x.dataset.videoId || x.dataset.playlistId,
28                video_title = ((x.dataset.videoTitle || x.dataset.playlistTitle) ?? "").replaceAll('"', '"'),
29                embed_type = x.dataset.embedType,
30                autoplay = x.dataset.autoplay || "0",
31                video_frame,
32                params = 'theme=light&rel=0&controls=1&showinfo=1&autoplay=' + autoplay + '&mute=0&autohide=1&fs=1&hd=1&wmode=transparent&enablejsapi=1&html5=1';
33            if (video_id === undefined) {
34                return "";
35            }
36            if (embed_type === undefined || !['video', 'playlist'].includes(embed_type)) {
37                embed_type = "video";
38            }
39            var src = 'https://www.youtube-nocookie.com/embed/';
40            if (embed_type == "playlist") {
41                src += 'videoseries?list=' + video_id + '&';
42            } else {
43                src += video_id + '?';
44            }
45            video_frame = '<div class="TACVideoPlayer"><iframe type="text/html" title="(' + embed_type + ' Youtube) ' + video_title + '" src="' + src + params + '" frameborder="0" allowfullscreen></iframe></div>';
46            return video_frame;
47        });
48        tarteaucitron.fallback(['YTimage'], function(x) {
49            if(x.parentNode.dataset.modal !== undefined) {
50                window.tobiiVideo ??= new Tobii({
51                    selector: false,
52                    dialogTitle: "Ceci est une fenêtre de dialogue qui s'affiche par dessus le contenu de la page. Cette modale affiche la vidéo Youtube. Appuyez sur la touche Échap pour fermer la modale et retourner au contenu de la page.",
53                    loadingIndicatorLabel: "Chargement de la vidéo",
54                    closeLabel: 'Fermer la fenêtre de dialogue',
55                    navLabel: ['Vidéo précédente', 'Vidéo suivante'],
56                    /*zoom: true,
57                    zoomText: `
58                        <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-hidden="true" focusable="false" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" stroke="currentColor">
59                            <path d="M8 3H5a2 2 0 00-2 2v3m18 0V5a2 2 0 00-2-2h-3m0 18h3a2 2 0 002-2v-3M3 16v3a2 2 0 002 2h3"/>
60                        </svg>`,*/
61                });
62                window.tobiiVideo.add(x.parentNode);
63
64            }
65            $(x.parentNode).click(function(event) {
66                event.preventDefault();
67                var target = $(event.target);
68                if (target.hasClass('tarteaucitronAllow')) {
69                    return false;
70                }
71                if (x.parentNode.dataset.modal === undefined) {
72                    if (!$(this).hasClass('playerUp')) {
73                       $(this).addClass('playerUp');
74                        $(this).find('.date').remove();
75                        $(this).find('picture').remove();
76                        var url = $(this).attr("href");
77                        var ytID = url.split("https://www.youtube.com/watch?v=")[1];
78                        const video_title = (x.dataset.youtubeTitle ?? "").replaceAll('"', '&quot;');
79                        $(this).prepend('<div class="YTvideo"><iframe id="ytplayer-' + ytID + '" type="text/html" title="(video Youtube) ' + video_title + '" src="https://www.youtube-nocookie.com/embed/' + ytID + '?rel=0&fs=1&auto
79play=1&enablejsapi=1&html5=1" frameborder="0" allowfullscreen="" allow="autoplay;"></iframe></div>');
80                    }
81                }
82            });
83
84            return '<img src="https://img.youtube.com/vi/' + x.dataset.youtubeId + '/sddefault.jpg" class="img-fluid"/><i class="fas fa-play-circle"></i>';
85        });
86    },
87    "fallback": function() {
88        "use strict";
89        var id = 'youtubeRVVN';
90        tarteaucitron.fallback(['youtube_responsive', 'YTimage'], function(elem) {
91            if (elem.classList.contains('YTimage')) {
92                elem.parentNode.onclick = function(e) {
93                    e.preventDefault();
94                }
95            }
96            return tarteaucitron.engage(id);
97        });
98    }
99};
100tarteaucitron.services.dailymotionRVVN = {
101    "key": "dailymotionRVVN",
102    "type": "video",
103    "name": "Dailymotion",
104    "uri": "https://www.dailymotion.com/legal/privacy",
105    "needConsent": true,
106    "cookies": ['ts', 'dmvk', 'hist', 'v1st', 's_vi'],
107    "domains": [
108        "Pour Dailymotion : www.dailymotion.com, geo.dailymotion.com, dmcdn.net, dm-event.net, api.dailymotion.com, dmxleo.dailymotion.com, dmxleo.com", 
109        "Pour Google : imasdk.googleapis.com, googlesyndication.com, www.gstatic.com",
110        "Pour les régies publicitaires : doubleclick.net, mediarithmics.com, 2mdn.net, nmrodam.com, ads.yieldmo.com, ads.servenobid.com, ads.stickyadstv.com, amazon-adsystem.com, shb-sync.com, sync.adkernel.com, cookiesync.api.bliink.io, sync.cootlogix.com, openx.net, ib.adnxs.com, api.bliink.io",
111    ], // attribut custom de RVVN
112    "js": function() {
113        "use strict";
114        tarteaucitron.fallback(['dailymotion_responsive'], function(x) {
115            var video_id = x.dataset.videoId || x.dataset.playlistId,
116                video_title = ((x.dataset.videoTitle || x.dataset.playlistTitle) ?? "").replaceAll('"', '&quot;'),
117                video_frame,
118                embed_type = x.dataset.embedType,
119                params = 'info=1&autoPlay=' + x.dataset.autoplay;
120
121            if (video_id === undefined) {
122                return "";
123            }
124            if (embed_type === undefined || !['video', 'playlist'].includes(embed_type)) {
125                embed_type = "video";
126            }
127            video_frame = '<div class="TACVideoPlayer"><iframe title="(' + embed_type + ' Dailymotion) ' + video_title + '" src="//www.dailymotion.com/embed/' + embed_type + '/' + video_id + '?' + params + '" frameborder="0" allowfullscreen allow="mute; fullscreen; queue-enable;"></iframe></div>';
128            return video_frame;
129        });
130    },
131    "fallback": function() {
132        "use strict";
133        var id = 'dailymotionRVVN';
134        tarteaucitron.fallback(['dailymotion_responsive'], function(elem) {
135            return tarteaucitron.engage(id);
136        });
137    }
138};
139tarteaucitron.services.vimeoRVVN = {
140    "key": "vimeoRVVN",
141    "type": "video",
142    "name": "Vimeo",
143    "uri": "https://vimeo.com/privacy",
144    "needConsent": true,
145    "cookies": ['__utmt_player', '__utma', '__utmb', '__utmc', '__utmv', 'vuid', '__utmz', 'player'],
146    "domains": ["vimeo.com", "vimeocdn.com", "www.gstatic.com"], // attribut custom de RVVN
147    "js": function() {
148        "use strict";
149        tarteaucitron.fallback(['vimeo_responsive'], function(x) {
150            var video_id = x.dataset.videoId,
151                video_title = (x.dataset.videoTitle ?? "").replaceAll('"', '&quot;'),
152                video_frame;
153            if (video_id === undefined) {
154                return "";
155            }
156
157            video_frame = '<div class="TACVideoPlayer"><iframe title="(video Vimeo) ' + video_title + '" src="//player.vimeo.com/video/' + video_id + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>';
158
159            return video_frame;
160        });
161    },
162    "fallback": function() {
163        "use strict";
164        var id = 'vimeoRVVN';
165        tarteaucitron.fallback(['vimeo_responsive'], function(elem) {
166            return tarteaucitron.engage(id);
167        });
168    }
169};
170tarteaucitron.services.podeducRVVN = {
171    "key": "podeducRVVN",
172    "type": "video",
173    "name": "Podeduc",
174    "uri": "https://podeduc.apps.education.fr/mentions/",
175    "needConsent": true,
176    "cookies": ['_pk_id', '_pk_ref', '_pk_ses', 'activeCollapseAside', 'csrftoken', 'podCookieConsent'],
177    "domains": ["podeduc.apps.education.fr"], // attribut custom de RVVN
178    "js": function() {
179        "use strict";
180        tarteaucitron.fallback(['podeduc_responsive'], function(x) {
181            var video_id = x.dataset.videoId,
182                video_title = (x.dataset.videoTitle ?? "").replaceAll('"', '&quot;'),
183                video_frame;
184            if (video_id === undefined) {
185                return "";
186            }
187
188            video_frame = '<div class="TACVideoPlayer"><iframe title="(video Podeduc) ' + video_title + '" src="//podeduc.apps.education.fr/video/' + video_id + '/?is_iframe=true" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div>';
189
190            return video_frame;
191        });
192    },
193    "fallback": function() {
194        "use strict";
195        var id = 'podeducRVVN';
196        tarteaucitron.fallback(['podeduc_responsive'], function(elem) {
197            return tarteaucitron.engage(id);
198        });
199    }
200};
201tarteaucitron.services.openstreetmapRVVN = {
202    "key": "openstreetmapRVVN",
203    "type": "api",
204    "name": "Cartes OpenStreetMap et Umap",
205    "uri": "https://wiki.osmfoundation.org/wiki/Privacy_Policy",
206    "needConsent": true,
207    "cookies": [],
208    "domains": ["umap.openstreetmap.fr", "tile.osm.org", "js.entry-cdn.com"], // attribut custom de RVVN
209    "js": function() {
210        "use strict";
211
212        // Cartes openstreetmap avec leaflet
213        // Ne charger le script que s'il y a présence de ".osm-simple"
214        // La carte openstreetmap avec leaflet présente dans le formulaire de signalement d'anomalie charge ses propres JS et CSS
215        if (document.body.querySelectorAll(".osm-simple").length != 0) {
216            tarteaucitron.addScript('/typo3conf/ext/rvvnfsccarto/Resources/Public/js/leaflet/leaflet.js', 'leaflet', function() {
217
218                if (document.head.querySelectorAll('link[href*="leaflet"]').length == 0) {
219                    //console.log("pas de CSS leaflet chargée");
220                    var leaflet_css_link = document.createElement("link");
221                    leaflet_css_link.type = "text/css";
222                    leaflet_css_link.href = "/typo3conf/ext/rvvnfsccarto/Resources/Public/css/leaflet/leaflet.css";
223                    leaflet_css_link.rel = "stylesheet";
224                    document.head.appendChild(leaflet_css_link);
225                }
226    
227                tarteaucitron.fallback(['osm-simple'], function(x) {
228                    var mapOptions = {
229                        id: x.getAttribute("id"),
230                        latitude: parseFloat(x.dataset.latitude),
231                        longitude: parseFloat(x.dataset.longitude),
232                        zoomlevel: parseInt(x.dataset.zoomlevel),
233                        leafletImagesPath: x.dataset.leafletImagesPath,
234                        centralmarker: x.dataset.centralmarker,
235                        centralmarkerText: x.dataset.centralmarkerText
236                    };
237    
238                    x.style.height = x.dataset.mapHeight + "px";
239    
240                    function doTheMap(x, mapOptions) {
241                        // on vide le contenu de l'encart TAC sinon il reste dans le code HTML "sous" la carte et
242                        // cela créé un problème d'accessibilité car les boutons prennent le focus alors qu'ils sont cachés
243                        x.innerHTML = '';
244
245                        L.DomEvent.disableClickPropagation(document.getElementById(x.getAttribute("id")));
246    
247                        L.Icon.Default.imagePath = mapOptions.leafletImagesPath;
248    
249                        var map = L.map(mapOptions.id, {
250                            center: [mapOptions.latitude, mapOptions.longitude],
251                            zoom: mapOptions.zoomlevel,
252                            zoomControl: false,
253                            attributionControl: false
254                        });
255                        L.control.zoom({
256                            zoomInTitle: "Augmenter le niveau de zoom",
257                            zoomOutTitle: "Diminuer le niveau de zoom"
258                        }).addTo(map);
259
260                        L.control.attribution({
261                            prefix: ''
262                        }).addTo(map);
263    
264                        // disable scroll-zooming initially
265                        map.scrollWheelZoom.disable();
266    
267                        var zoomTimer;
268    
269                        // on entering the map we're starting a timer to
270                        // 3 seconds after which we'll enable scroll-zooming
271                        map.on('mouseover', function() {
272                            zoomTimer = setTimeout(function() {
273                                map.scrollWheelZoom.enable();
274                            }, 3000);
275                        });
276    
277                        // on leaving the map we're disarming not yet triggered timers
278                        // and disabling scrolling
279                        map.on('mouseout', function() {
280                            clearTimeout(zoomTimer);
281                            map.scrollWheelZoom.disable();
282                        });
283    
284                        L.tileLayer('https://{' + 's}.tile.osm.org/{' + 'z}/{' + 'x}/{' + 'y}.png', {
285                            attribution: '&copy; Données fournies par <a href="https://osm.org/copyright">OpenStreetMap</a>',
286    
287                        }).addTo(map);
288    
289                        map.whenReady(function() {
290    
291                            if (mapOptions.centralmarker == 1) {
292                                let markerText = mapOptions.centralmarkerText || "Centre de la carte";
293                                
294                                let center = L.marker([mapOptions.latitude, mapOptions.longitude], {alt: markerText}).addTo(map);
295
296                                center.bindPopup(markerText).openPopup();
297                                if (mapOptions.centralmarkerText == "") center.closePopup();
298                                center.getPopup().getElement().setAttribute("id", `${mapOptions.id}-popup`);
299                                
300                                const centerElement = center.getElement();
301                                centerElement.setAttribute("title", "Afficher ou masquer l'infobulle de ce marqueur");
302                                centerElement.setAttribute("aria-controls", `${mapOptions.id}-popup`);
303                                centerElement.setAttribute("aria-expanded", 
304                                    center.isPopupOpen()
305                                        ? "true"
306                                        : "false"
307                                );
308
309                                const status = document.querySelector(`#${mapOptions.id}-status`);
310                                if(status) {
311                                    center.on('popupopen', function(ev) {
312                                        centerElement.setAttribute("aria-expanded", "true");
313                                        status.innerHTML = '';
314    
315                                        const span = document.createElement('span');
316                                        span.textContent = "Infobulle ouverte";
317                                        
318                                        status.appendChild(span);
319
320                                        const popupContentEl = center.getPopup().getElement().querySelector(".leaflet-popup-content");
321                                        popupContentEl.setAttribute('tabindex', '-1');
322                                        popupContentEl.focus();
323                                    });
324                                    center.on('popupclose', function(ev) {
325                                        centerElement.setAttribute("aria-expanded", "false");
326                                        status.innerHTML = ''; 
327    
328                                        const span = document.createElement('span');
329                                        span.textContent = "Infobulle fermée";
330                                        
331                                        status.appendChild(span);
332
333                                        // bug de Leaflet : lorsqu'on ferme la popup, le focus ne retourne pas sur le marqueur
334                                        centerElement.focus();
335                                    });
336                                }
337                            }
338                        });
339    
340                    } // end of function doTheMap()
341                    doTheMap(x, mapOptions);
342    
343                }, true);
344            });
345        }
346        
347        // Cartes openstreetmap avec leaflet dans formulaire de signalement d'anomalie
348        tarteaucitron.fallback(['map-canvas-rvvnfscforms-incidentReport'], function(x) {
349            //console.log('map-canvas-rvvnfscforms-incidentReport');
350            var mapOptions = {
351                id: x.getAttribute("id"),
352                latitude: parseFloat(x.dataset.latitude),
353                longitude: parseFloat(x.dataset.longitude),
354                zoomlevel: parseInt(x.dataset.zoomlevel),
355                leafletImagesPath: x.dataset.leafletImagesPath,
356                cursorPlaceMarker: x.dataset.cursorPlaceMarker,
357                ctrlPlaceMarker: x.dataset.ctrlPlaceMarker,
358                ctrlPlaceMarkerOn: x.dataset.ctrlPlaceMarkerOn,
359                coordinatesFieldId: x.dataset.coordinatesFieldId
360            };
361
362            x.style.height = x.dataset.mapHeight + "px";
363
364            //L.DomEvent.disableClickPropagation(document.getElementById(x.getAttribute("id")));
365
366            var map = L.map(mapOptions.id, {
367                center: [mapOptions.latitude, mapOptions.longitude],
368                zoom: mapOptions.zoomlevel,
369                zoomControl: false,
370                attributionControl: false
371            });
372            L.control.zoom({
373                zoomInTitle: "Augmenter le niveau de zoom",
374                zoomOutTitle: "Diminuer le niveau de zoom"
375            }).addTo(map);
376
377            L.control.attribution({
378                prefix: ''
379            }).addTo(map);
380
381            // disable scroll-zooming initially
382            map.scrollWheelZoom.disable();
383
384            var zoomTimer;
385
386            // on entering the map we're starting a timer to
387            // 3 seconds after which we'll enable scroll-zooming
388            map.on('mouseover', function() {
389                zoomTimer = setTimeout(function() {
390                    map.scrollWheelZoom.enable();
391                }, 3000);
392            });
393
394            // on leaving the map we're disarming not yet triggered timers
395            // and disabling scrolling
396            map.on('mouseout', function() {
397                clearTimeout(zoomTimer);
398                map.scrollWheelZoom.disable();
399            });
400
401            L.tileLayer('https://{' + 's}.tile.osm.org/{' + 'z}/{' + 'x}/{' + 'y}.png', {
402                attribution: '&copy; Données fournies par <a href="http://osm.org/copyright">OpenStreetMap</a>',
403
404            }).addTo(map);
405
406            L.Control.GetCoordinates = L.Control.extend({
407                onAdd: function(map) {
408                    this.map = map;
409                    this.mode = "off";
410
411                    this.leafIconClass = L.icon({
412                        iconUrl: mapOptions.leafletImagesPath + 'marker-icon.png',
413                        iconSize: [50, 50],
414                        iconAnchor: [25, 50]
415                    });
416
417                    this.layerGroup = L.layerGroup().addTo(map);
418
419                    this.coordinatesField = document.getElementById(mapOptions.coordinatesFieldId);
420                    this.coordinatesField.style.display = "none";
421
422                    this.container = L.DomUtil.create('div', 'leaflet-bar leaflet-control leaflet-control-custom');
423                    this.container.title = "Géolocaliser le lieu de l'anomalie"
424                    this.container.style.backgroundColor = 'white';
425                    this.container.style.backgroundRepeat = 'no-repeat';
426                    this.container.style.backgroundImage = 'url(' + mapOptions.ctrlPlaceMarker + ')';
427                    this.container.style.backgroundPosition = 'center';
428
429                    this.container.style.width = '64px';
430                    this.container.style.height = '64px';
431
432                    L.DomEvent
433                        .on(this.container, 'click', L.DomEvent.stopPropagation)
434                        .on(this.container, 'click', L.DomEvent.preventDefault)
435                        .on(this.container, 'click', this._onClick, this)
436                        .on(this.container, 'dblclick', L.DomEvent.stopPropagation);
437
438                    // connect to mouseevents
439                    //map.on("mousemove", this._update, this);
440                    map.on("click", this._update, this);
441                    map.whenReady(this._update, this);
442
443                    return this.container;
444                },
445
446                onRemove: function(map) {
447                    // Nothing to do here
448                },
449
450                _onClick: function() {
451                    this.toggleMode();
452                },
453
454                _update: function(evt) {
455                    var pos = evt.latlng;
456                    if (pos && this.mode === "point") {
457                        //pos = pos.wrap();
458                        this._currentPos = pos;
459                    }
460                },
461
462                toggleMode: function() {
463                    if (this.mode === "point") {
464                        this.mode = "off";
465                        this._map._container.style.cursor = '';
466                        this.container.style.backgroundColor = 'white';
467                        this.container.style.backgroundImage = 'url(' + mapOptions.ctrlPlaceMarker + ')';
468                    } else {
469                        this.mode = "point";
470                        this._map._container.style.cursor = 'url(' + mapOptions.cursorPlaceMarker + ') 25 49, auto';
471                        this.container.style.backgroundColor = '#3498DB';
472                        this.container.style.backgroundImage = 'url(' + mapOptions.ctrlPlaceMarkerOn + ')';
473                    }
474                },
475
476                placeMarker: function(evt) {
477                    if (this.mode === "point") {
478                        this.layerGroup.clearLayers();
479
480                        var markerOptions = {
481                            icon: this.leafIconClass
482                        };
483
484                        //var point = this.map.latLngToContainerPoint(this._currentPos);
485                        //var newPoint = newPoint = L.point([point.x + 25, point.y + 50]);
486                        //var pos = this.map.containerPointToLatLng(newPoint);
487
488                        var marker = L.marker(
489                            [this._currentPos.lat, this._currentPos.lng],
490                            //[pos.lat, pos.lng], 
491                            markerOptions
492                        ).addTo(this.layerGroup);
493
494                        //this.coordinatesField.value = pos.lat +","+ pos.lng;
495                        this.coordinatesField.value = this._currentPos.lat + "," + this._currentPos.lng;
496                        this.toggleMode();
497                    }
498                },
499            });
500
501            L.control.GetCoordinates = function(opts) {
502                return new L.Control.GetCoordinates(opts);
503            }
504
505            var GetCoordinatesControl = L.control.GetCoordinates({
506                position: 'bottomleft'
507            }).addTo(map);
508
509            map.on('click', function(evt) {
510                GetCoordinatesControl.placeMarker(evt);
511            });
512
513
514        }, true);
515
516        // Cartes Umap
517        tarteaucitron.fallback(['umap-with-pois'], function(x) {
518            var map_id = x.dataset.mapId,
519                load_panel = x.dataset.loadPanel,
520                height = x.dataset.mapHeight,
521                iframe_title = (x.closest('[data-rvvnctype="map"]').dataset.rvvntitle ?? "").replaceAll('"', '&quot;'),
522                map_frame;
523            if (map_id === undefined) {
524                return "";
525            }
526            //x.style.height = "auto"; // Tarte au Citron fixe une hauteur si un attribut "height" ou "data-height" est renseigné
527            map_frame = '<div class="TACUmap"><iframe aria-hidden="true" tabindex="-1" width="100%" height="' + height + '" frameBorder="0" title="(Carte Umap) ' + iframe_title + '" src="https://umap.openstreetmap.fr/fr/map/' + map_id + '?scaleControl=true&miniMap=false&scrollWheelZoom=false&zoomControl=true&allowEdit=false&more
527Control=false&searchControl=null&tilelayersControl=null&embedControl=null&datalayersControl=true&onLoadPanel=' + load_panel + '&captionBar=false&fullscreenControl=false"></iframe></div>';
528            return map_frame;
529
530        });
531    },
532    "fallback": function() {
533        "use strict";
534        var id = 'openstreetmapRVVN';
535        tarteaucitron.fallback(['osm-simple'], tarteaucitron.engage(id));
536        tarteaucitron.fallback(['map-canvas-rvvnfscforms-incidentReport'], tarteaucitron.engage(id));
537        tarteaucitron.fallback(['umap-with-pois'], tarteaucitron.engage(id));
538    }
539};
540tarteaucitron.services.opendatamelRVVN = {
541    "key": "opendatamelRVVN",
542    "type": "api",
543    "name": "Open Data Lille Métropole (Cartographies)",
544    "uri": "https://opendata.lillemetropole.fr/page/mentions-legales/",
545    "needConsent": true,
546    "cookies": [],
547    "domains": ["data.lillemetropole.fr", "basemaps.cartocdn.com", "cdn.jsdelivr.net"], // attribut custom de RVVN
548    "js": function() {
549        "use strict";
550        tarteaucitron.fallback(['opendatalillemetropole'], function(x) {
551            var dataset_id = x.dataset.datasetId,
552                zoomlevel = x.dataset.zoomlevel,
553                latitude = x.dataset.latitude,
554                longitude = x.dataset.longitude,
555                height = x.dataset.mapHeight,
556                iframe_title = (x.closest('[data-rvvnctype="map"]').dataset.rvvntitle ?? "").replaceAll('"', '&quot;'),
557                map_frame;
558            if (dataset_id === undefined) {
559                return "";
560            }
561            //x.style.height = "auto"; // Tarte au Citron fixe une hauteur si un attribut "height" ou "data-height" est renseigné
562            map_frame = '<div class="TACopendatamel"><iframe aria-hidden="true" tabindex="-1" width="100%" height="' + height + '" frameborder="0" title="(Carte Open Data MEL) ' + iframe_title + '" src="https://data.lillemetropole.fr/catalogue/wc-embedder.html?v=v2.4.5&e=gn-dataset-view-map&a=api-url%3D%2Fgeonetwork%2Fsrv%2Fapi&a=dataset-id%3D' + dataset_id + '&a=primary-color%3D%230f4395&a=secondary-color%3D%238bc832&a=main-color%3D%23555&a=background-color%3D%23fdfbff"></</iframe></div>';
563            return map_frame;
564
565        });
566    },
567    "fallback": function() {
568        "use strict";
569        var id = 'opendatamelRVVN';
570        tarteaucitron.fallback(['opendatalillemetropole'], tarteaucitron.engage(id));
571    }
572};
573
574(tarteaucitron.job = tarteaucitron.job || []).push('podeducRVVN');
575(tarteaucitron.job = tarteaucitron.job || []).push('vimeoRVVN');
576(tarteaucitron.job = tarteaucitron.job || []).push('dailymotionRVVN');
577(tarteaucitron.job = tarteaucitron.job || []).push('youtubeRVVN');
578(tarteaucitron.job = tarteaucitron.job || []).push('openstreetmapRVVN');
579(tarteaucitron.job = tarteaucitron.job || []).push('opendatamelRVVN');
580
581/* Contenus HTML custom ********************************************************************/
582
583/********************/
584/* timelapsegoBox   */
585/********************/
586tarteaucitron.services.timelapsegoBoxRVVN = {
587    "key": "timelapsegoBoxRVVN",
588    "type": "other",
589    "name": "Webcam de suivi de chantier Timelapsego",
590    "uri": "https://timelapsego.com/",
591    "needConsent": true,
592    "cookies": [],
593    "domains": [
594        "prodtimelapsego.com", 
595        "rsms.me",
596        "amazonaws.com",
597        "www.googletagmanager.com"
598    ], // attribut custom de RVVN
599    "js": function () {
600        "use strict";
601        tarteaucitron.fallback(['timelapsegoBox'], function (x) {
602            var timelapsegoID = x.dataset.timelapsegoId,
603                timelapsegoToken = x.dataset.timelapsegoToken, 
604            iframe;
605            if (timelapsegoID === undefined || timelapsegoToken === undefined) {
606                return "";
607            }
608            iframe = '<div class="TACIframe"><iframe src="https://prod.timelapsego.com/embed/company/box/' + timelapsegoID + '/fs?accesstoken=' + timelapsegoToken + '" title="Webcam de suivi de chantier" allowfullscreen frameborder="0"></iframe></div>';
609
610            return iframe;
611        });
612    },
613    "fallback": function () {
614        "use strict";
615        var id = 'timelapsegoBoxRVVN';
616        tarteaucitron.fallback(['timelapsegoBox'], function (elem) {
617            return tarteaucitron.engage(id);
618        });
619    }
620};
621
622
623/*****************************/
624/* timelapsego Avant Après   */
625/*****************************/
626tarteaucitron.services.timelapsegoBefterRVVN = {
627    "key": "timelapsegoBefterRVVN",
628    "type": "other",
629    "name": "Avant / Après de suivi de chantier Timelapsego",
630    "uri": "https://timelapsego.com/",
631    "needConsent": true,
632    "cookies": [],
633    "domains": [
634        "prodtimelapsego.com", 
635        "rsms.me",
636        "amazonaws.com",
637        "www.googletagmanager.com"
638    ], // attribut custom de RVVN
639    "js": function () {
640        "use strict";
641        tarteaucitron.fallback(['timelapsegoBefter'], function (x) {
642            var timelapsegoID = x.dataset.timelapsegoId,
643                timelapsegoToken = x.dataset.timelapsegoToken,
644                timelapsegoBefore = x.dataset.timelapsegoBefore,
645                timelapsegoAfter = x.dataset.timelapsegoAfter, 
646                iframe;
647            if (timelapsegoID === undefined || timelapsegoToken === undefined) {
648                return "";
649            }
650            if (timelapsegoAfter === undefined || timelapsegoAfter == null) {
651                timelapsegoAfter = "x";
652            }
653            iframe = '<div class="TACIframe"><iframe src="https://prod.timelapsego.com/embed/company/box/' + timelapsegoID + '/fs/compare/' + timelapsegoBefore + '/' + timelapsegoAfter + '?accesstoken=' + timelapsegoToken + '" title="Module de comparaison avant et après travaux" allowfullscreen frameborder="0"></iframe></div>';
654
655            return iframe;
656        });
657    },
658    "fallback": function () {
659        "use strict";
660        var id = 'timelapsegoBefterRVVN';
661        tarteaucitron.fallback(['timelapsegoBefter'], function (elem) {
662            return tarteaucitron.engage(id);
663        });
664    }
665};
666
667
668/********************/
669/* SPL XDemat Actes */
670/********************/
671tarteaucitron.services.xdematActesRVVN = {
672    "key": "xdematActesRVVN",
673    "type": "other",
674    "name": "Affichage des actes de la SPL xDemat",
675    "uri": "https://www.spl-xdemat.fr",
676    "needConsent": true,
677    "cookies": [],
678    "domains": ["opendata.spl-xdemat.fr"], // attribut custom de RVVN
679    "js": function () {
680        "use strict";
681        tarteaucitron.fallback(['xdematActes'], function (x) {
682            var xdematActesID = x.dataset.xdematActesId,
683                iframe;
684            if (xdematActesID === undefined) {
685                return "";
686            }
687            iframe = '<div class="TACIframe"><iframe title="Affichage légal par la SPL XDemat" src="https://opendata.spl-xdemat.fr/frame/' + xdematActesID + '/affichage-administratif" frameborder="0"></iframe></div>';
688
689            return iframe;
690        });
691    },
692    "fallback": function () {
693        "use strict";
694        var id = 'xdematActesRVVN';
695        tarteaucitron.fallback(['xdematActes'], function (elem) {
696            return tarteaucitron.engage(id);
697        });
698    }
699};
700
701
702/******************/
703/* Panneau Pocket */
704/******************/
705tarteaucitron.services.panneauPocketRVVN = {
706    "key": "panneauPocketRVVN",
707    "type": "other",
708    "name": "Panneau Pocket",
709    "uri": "https://app.panneaupocket.com/mentions-legales",
710    "needConsent": true,
711    "cookies": [],
712    "domains": ["app.panneaupocket.com", "fonts.googleapis.com"], // attribut custom de RVVN
713    "js": function () {
714        "use strict";
715        tarteaucitron.fallback(['panneauPocket'], function (x) {
716            var panneauPocketID = x.dataset.panneaupocketId,
717                iframe;
718            if (panneauPocketID === undefined) {
719                return "";
720            }
721            iframe = '<div class="TACIframe"><iframe title="Actualités fournies par l\'application mobile PanneauPocket" src="https://app.panneaupocket.com/embeded/' + panneauPocketID + '" height="518" width="100%" frameborder="0"></iframe></div>';
722
723            return iframe;
724        });
725    },
726    "fallback": function () {
727        "use strict";
728        var id = 'panneauPocketRVVN';
729        tarteaucitron.fallback(['panneauPocket'], function (elem) {
730            return tarteaucitron.engage(id);
731        });
732    }
733};
734
735
736/************************/
737/* PassPass Covoiturage */
738/************************/
739tarteaucitron.services.passpasscovoiturageRVVN = {
740    "key": "passpasscovoiturageRVVN",
741    "type": "other",
742    "name": "Pass Pass Covoiturage",
743    "uri": "https://passpasscovoiturage.fr/cgu",
744    "needConsent": true,
745    "cookies": ['_ga'],
746    "domains": ["passpasscovoiturage.fr"], // attribut custom de RVVN
747    "js": function () {
748        "use strict";
749        tarteaucitron.fallback(['passpasscovoiturage'], function (x) {
750            var communauteID = x.dataset.communauteId,
751                iframe;
752            if (communauteID === undefined) {
753                return "";
754            }
755            iframe = '<div class="TACIframe"><iframe title="Trouvez un covoiturage avec Pass Pass Covoiturage" src="https://passpasscovoiturage.fr/communaute/widget/' + communauteID + '" width="100%" height="640px" frameborder="0" scrolling="no"></iframe></div>';
756            return iframe;
757        });
758    },
759    "fallback": function () {
760        "use strict";
761        var id = 'passpasscovoiturageRVVN';
762        tarteaucitron.fallback(['passpasscovoiturage'], function (elem) {
763            return tarteaucitron.engage(id);
764        });
765    }
766};
767
768
769/****************/
770/* Centolive v3 */
771/****************/
772tarteaucitron.services.centoliveRVVN = {
773    "key": "centoliveRVVN",
774    "type": "other",
775    "name": "Centolive",
776    "uri": "https://www.centaure-systems.fr/confidentialite/",
777    "needConsent": true,
778    "cookies": ['_ga'],
779    "domains": ["centoweb.centaure-systems.fr", "themes.googleusercontent.com"], // attribut custom de RVVN
780    "js": function () {
781        "use strict";
782        tarteaucitron.fallback(['centolive'], function (x) {
783            var centoliveID = x.dataset.centoliveId,
784                iframe;
785            if (centoliveID === undefined) {
786                return "";
787            }
788            iframe = '<div class="TACIframe"><iframe title="Reprise du panneau d\'affichage physique Centolive" src="https://centoweb.centaure-systems.fr/embedded/' + centoliveID + '" frameborder="0"></iframe></div>';
789            return iframe;
790        });
791    },
792    "fallback": function () {
793        "use strict";
794        var id = 'centoliveRVVN';
795        tarteaucitron.fallback(['centolive'], function (elem) {
796            return tarteaucitron.engage(id);
797        });
798    }
799};
800
801/****************/
802/* Centolive v4 */
803/****************/
804tarteaucitron.services.centolivev4RVVN = {
805    "key": "centolivev4RVVN",
806    "type": "other",
807    "name": "Centolive v4",
808    "uri": "https://www.centaure-systems.fr/confidentialite/",
809    "needConsent": true,
810    "cookies": ['_ga'],
811    "domains": ["centoweb4.centaure-systems.fr"], // attribut custom de RVVN
812    "js": function () {
813        "use strict";
814        tarteaucitron.fallback(['centolivev4'], function (x) {
815            var centoliveID = x.dataset.centoliveId,
816                iframe;
817            if (centoliveID === undefined) {
818                return "";
819            }
820            iframe = '<div class="TACIframe"><iframe title="Reprise du panneau d\'affichage physique Centolive" src="https://centoweb4.centaure-systems.fr/panel/panel_web/' + centoliveID + '" frameborder="0"></iframe></div>';
821            return iframe;
822        });
823    },
824    "fallback": function () {
825        "use strict";
826        var id = 'centolivev4RVVN';
827        tarteaucitron.fallback(['centolivev4'], function (elem) {
828            return tarteaucitron.engage(id);
829        });
830    }
831};
832
833
834/*******************/
835/* Google Calendar */
836/*******************/
837tarteaucitron.services.googleCalendarRVVN = {
838    "key": "googleCalendarRVVN",
839    "type": "api",
840    "name": "Google Calendar",
841    "uri": "https://support.google.com/calendar/answer/10366125?hl=fr",
842    "needConsent": true,
843    "cookies": ['1p_jar', 'anid', 'apisid', 'compass', 'consent', 'hsid', 'nid', 'ogpc', 'osid', 'sapisid', 'sid', 'sidcc', 'ssid'],
844    "domains": ["apis.google.com", "calendar.google.com", "clients6.google.com", "play.google.com", "www.gstatic.com", "fonts.gstatic.com"], // attribut custom de RVVN
845    "js": function () {
846        "use strict";
847        tarteaucitron.fallback(['googleCalendar'], function (x) {
848            var googleCalendarID = x.dataset.googleCalendarId,
849                iframe,
850                iframe_title = x.dataset.title ?? "Calendrier Google de la salle des fêtes";
851            if (googleCalendarID === undefined) {
852                return "";
853            }
854            iframe = '<div class="TACIframe"><iframe title="' + iframe_title + '" src="https://calendar.google.com/calendar/b/1/embed?wkst=2&amp;bgcolor=%23f0f0f0&amp;ctz=Europe%2FParis&amp;src=' + googleCalendarID + '&amp;color=%23DD5511&amp;showTitle=0&amp;showNav=1&amp;showDate=1&amp;showPrint=0&amp;showTabs=0&amp;showCalendars=0&amp;showTz=0" frameborder="0"></iframe></div>';
855            return iframe;
856        });
857    },
858    "fallback": function () {
859        "use strict";
860        var id = 'googleCalendarRVVN';
861        tarteaucitron.fallback(['googleCalendar'], function (elem) {
862            return tarteaucitron.engage(id);
863        });
864    }
865};
866
867
868/**********/
869/* TIMIFY */
870/**********/
871tarteaucitron.services.timifyRVVN = {
872    "key": "timifyRVVN",
873    "type": "other",
874    "name": "TIMIFY",
875    "uri": "https://www.timify.com/fr-fr/legal/",
876    "needConsent": true,
877    "cookies": ['intercom-id-xxxxx'],
878    "domains": ["api-public.timify.io", "book.timify.com", "cdn.timify.com", "maps.googleapis.com"], // attribut custom de RVVN
879    "js": function () {
880        "use strict";
881        tarteaucitron.fallback(['timify'], function (x) {
882            var timifyID = x.dataset.timifyId,
883                iframe;
884            if (timifyID === undefined) {
885                return "";
886            }
887            iframe = '<div class="TACIframe"><iframe title="Module de réservation en ligne Timify" src="https://book.timify.com/services?accountId=' + timifyID + '&fullscreen=1&hideCloseButton=1&locale=fr-fr" width="100%" height="600" frameborder="0"></iframe></div>';
888            return iframe;
889        });
890    },
891    "fallback": function () {
892        "use strict";
893        var id = 'timifyRVVN';
894        tarteaucitron.fallback(['timify'], function (elem) {
895            return tarteaucitron.engage(id);
896        });
897    }
898};
899
900
901/*************/
902/* RDV360 v3 */
903/*************/
904tarteaucitron.services.rdv360v3RVVN = {
905    "key": "rdv360v3RVVN",
906    "type": "other",
907    "name": "RDV360 (v3)",
908    "uri": "https://www.rdv360.com/cgu/",
909    "needConsent": true,
910    "cookies": ['os_visitor', '__stripe_mid'],
911    "domains": ["www.rdv360.com", "apiv2.rdv360.com", "js.stripe.com", "m.stripe.com", "m.stripe.network"], // attribut custom de RVVN
912    "js": function () {
913        "use strict";
914        tarteaucitron.fallback(['rdv360v3'], function (x) {
915            var rdv360apiKey = x.dataset.rdv360ApiKey,
916                html;
917            if (rdv360apiKey === undefined) {
918                return "";
919            }
920            html = '<div class="TACIframe"><link href="https://www.rdv360.com/widget/dist/app_v3.css" rel="stylesheet"><div class="rdv360-widget" data-apikey="' + rdv360apiKey + '"></div></div>';
921            return html;
922        });
923        const rdv360v3FirstElement = document.querySelector('.TAC.rdv360v3');
924        if (rdv360v3FirstElement !== null) {
925            tarteaucitron.addScript('//www.rdv360.com/widget/dist/app_vuidget_v3.js', 'rdv360v3');
926        }
927    },
928    "fallback": function () {
929        "use strict";
930        var id = 'rdv360v3RVVN';
931        tarteaucitron.fallback(['rdv360v3'], function (elem) {
932            return tarteaucitron.engage(id);
933        });
934    }
935};
936
937
938/***********/
939/* SynBird */
940/***********/
941tarteaucitron.services.synbirdRVVN = {
942    "key": "synbirdRVVN",
943    "type": "other",
944    "name": "SynBird",
945    "uri": "https://www.synbird.com/fr/conditions-generales-dutilisation/",
946    "needConsent": true,
947    "cookies": [],
948    "domains": ["auth.synbird.com", "widgets.synbird.com", "ws.synbird.com"], // attribut custom de RVVN
949    "js": function () {
950        "use strict";
951        tarteaucitron.fallback(['synbird'], function (x) {
952            var companyID = x.dataset.companyId,
953                scriptID = x.dataset.scriptId,
954                activities = x.dataset.activities,
955                prestations = x.dataset.prestations,
956                places = x.dataset.places,
957                html;
958            if (companyID === undefined) {
959                return "";
960            }
961            scriptID = scriptID !== undefined ? `data-script-id="${scriptID}"` : "";
962            // data-activities="[2578]" data-prestations="[13641,13643,13640]" data-places="[2591]
963            activities = activities !== undefined ? `data-activities="[${activities}]"` : "";
964            prestations = prestations !== undefined ? `data-prestations="[${prestations}]"` : "";
965            places = places !== undefined ? `data-places="[${places}]"` : "";
966            
967            html = '<div class="TACIframe"><div class="synbird-widget" data-id-professional-company="' + companyID + '" ' + scriptID + ' ' + activities + ' ' + prestations + ' ' + places + '> <a href="https://app.synbird.com/p/' + companyID + '" style="text-align: center; display: block;"><img height="150" src="https://images.synbird.com/public/logo_synbird_small.png" style=" margin-top: 20px" /></a></div></div>';
968            return html;
969        });
970        const synbirdFirstElement = document.querySelector('.TAC.synbird');
971        if (synbirdFirstElement !== null) {
972            tarteaucitron.addScript('//ws.synbird.com/widget.js', 'synbird');
973        }
974    },
975    "fallback": function () {
976        "use strict";
977        var id = 'synbirdRVVN';
978        tarteaucitron.fallback(['synbird'], function (elem) {
979            return tarteaucitron.engage(id);
980        });
981    }
982};
983
984
985/*************/
986/* Publidata */
987/*************/
988tarteaucitron.services.publidataRVVN = {
989    "key": "publidataRVVN",
990    "type": "other",
991    "name": "Publidata",
992    "uri": "https://www.publidata.io/legal/",
993    "needConsent": true,
994    "cookies": ["intercom-device-id-ua54a2c7", "intercom-session-ua54a2c7"],
995    "domains": [
996        "Pour Publidata : analytics.publidata.io, api.publidata.io, cdn.publidata.io, citizen.publidata.io, medias.publidata.io, next.publidata.io, store.publidata.io, widgets.publidata.io",
997        "Pour Amazon : publidata-prod.s3.amazonaws.com ,publidata-prod.s3-eu-west-1.amazonaws.com",
998        "Pour Fontawesome : api.fontawesome.com, ka-p.fontawesome.com, kit.fontawesome.com", 
999        "Pour Google : fonts.googleapis.com", 
1000        "Pour Mapbox : api.mapbox.com, events.mapbox.com",
1001        "Pour les autres partenaires de Publidata : icons.batch.com ,via.batch.com, infos.siaved.fr, ingest.sentry.io, www.datadoghq-browser-agent.com"
1002    ], // attribut custom de RVVN
1003    "js": function () {
1004        "use strict";
1005        tarteaucitron.fallback(['publidata'], function (x) {
1006            var companyID = x.dataset.companyId,
1007                html;
1008            if (companyID === undefined) {
1009                return "";
1010            }
1011            html = '<div class="TACIframe"><div class="publidata-widget-container widget-id-' + companyID + '"><a target="_blank" class="external-link" rel="external noopener noreferrer" href="https://widgets.publidata.io/' + companyID + '">Accéder au widget de collecte des déchets</a></div></div>';
1012            return html;
1013        });
1014        const publidataFirstElement = document.querySelector('.TAC.publidata');
1015        if (publidataFirstElement !== null) {
1016            tarteaucitron.addScript('//cdn.publidata.io/publidata.js', 'publidata');
1017        }
1018    },
1019    "fallback": function () {
1020        "use strict";
1021        var id = 'publidataRVVN';
1022        tarteaucitron.fallback(['publidata'], function (elem) {
1023            return tarteaucitron.engage(id);
1024        });
1025    }
1026};
1027
1028
1029/******************/
1030/* PubliAct       */
1031/******************/
1032tarteaucitron.services.publiActRVVN = {
1033    "key": "publiActRVVN",
1034    "type": "other",
1035    "name": "PubliAct",
1036    "uri": "https://publiact.fr/privacy",
1037    "needConsent": true,
1038    "cookies": [],
1039    "domains": ["publiact.fr"], // attribut custom de RVVN
1040    "js": function () {
1041        "use strict";
1042        tarteaucitron.fallback(['publiAct'], function (x) {
1043            var publiActID = x.dataset.publiactId,
1044                iframe;
1045            if (publiActID === undefined) {
1046                return "";
1047            }
1048            iframe = '<div class="TACIframe"><div class="publiact" data-key="' + publiActID + '"></div></div>';
1049
1050            return iframe;
1051        });
1052        //tarteaucitron.addScript('https://publiact.fr/files/public/integration/script.js');
1053        /*tarteaucitron.addScript('https://publiact.fr/files/public/integration/script.js', 'publiact', function() {
1054            
1055        });*/
1056        //document.addEventListener("DOMContentLoaded", function() {
1057        //console.log("DOMContentLoaded");
1058        //});
1059        if (typeof publiactDefault === 'undefined') {
1060            var publiactDefault = {
1061                url: 'https://publiact.fr/i/',
1062                // url: 'http://dev.publiactes.fr/i/',
1063                // url: 'http://localhost:3000/i/',
1064                style: {
1065                    width: '100%',
1066                    height: '660px',
1067                }
1068            }
1069            //document.addEventListener("DOMContentLoaded", function() { // Cet évènement n'est pas déclenché
1070            let elements = document.getElementsByClassName('publiact');
1071
1072            for (let i = 0; i < elements.length; i++) {
1073                let element = elements[i];
1074
1075                // Check si élément vide
1076                if (element.innerHTML.trim().length === 0) {
1077                    let key = element.dataset.key;
1078                    element.innerHTML = "<iframe title='Affichage légal par la société PubliAct' src='" + publiactDefault.url + key + "' style='border: none;width: " + publiactDefault.style.width + "; height:" + publiactDefault.style.height + ";'></iframe>";
1079                }
1080            }
1081            //});
1082        }
1083    },
1084    "fallback": function () {
1085        "use strict";
1086        var id = 'publiActRVVN';
1087        tarteaucitron.fallback(['publiAct'], function (elem) {
1088            return tarteaucitron.engage(id);
1089        });
1090    }
1091};
1092
1093/********/
1094/* ATMO */
1095/********/
1096tarteaucitron.services.atmoRVVN = {
1097	"key": "atmoRVVN",
1098	"type": "other",
1099	"name": "ATMO",
1100	"uri": "https://www.atmo-hdf.fr/article/donnees-personnelles",
1101	"needConsent": true,
1102	"cookies": ['__cf_bm'],
1103    "domains": ["www.atmo-hdf.fr", "fonts.googleapis.com", "fonts.gstatic.com", "www.clarity.ms", "o.clarity.ms"], // attribut custom de RVVN
1104	"js": function () {
1105	    "use strict";
1106	    tarteaucitron.fallback(['atmo'], function (x) {
1107		    var atmoID = x.dataset.atmoId,
1108                iframe;
1109            if (atmoID === undefined) {
1110                return "";
1111            }
1112            iframe = '<div class="TACIframe"><iframe title="Module de qualité de l\'air des Hauts de France" src="https://www.atmo-hdf.fr/widget-mon-air/widget/commune/' + atmoID + '" frameborder="0"></iframe></div>';
1113            return iframe;
1114	    });
1115	},
1116	"fallback": function () {
1117	    "use strict";
1118	    var id = 'atmoRVVN';
1119	    tarteaucitron.fallback(['atmo'], function (elem) {
1120	        return tarteaucitron.engage(id);
1121	    });
1122	}
1123};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.