1 2jQuery.fn.femanagerValidation=function(a){function e(e){d=new g({numRequest:e.find("*[data-validation]").length,element:e}),e.find("*[data-validation]").each(function(){n(a(this),!0)})}function n(e,n){if(e.prop("disabled"))return void(n&&d.addCallbackToQueue(!0));var o=e.closest("form"),c=o.data("femanager-plugin"),v="tx_"+o.data("femanager-plugin-name"),g=o.find("div:first").find('input[name="'+v+'[user][__identity]"]').val(),m=o.find("div:first").find('input[name="'+v+'[__referrer][@action]"]').val(),p=Femanager.getBaseUrl()+"?id="+a("#femanagerPid").val()+"&type=1548935210",h=a("#femanagerStoragePid").val(),b=e.attr("data-validation"),_=s(e),x=e.val();"checkbox"==e.prop("type")&&0==e.prop("checked")&&(x="");var y="";if(l(_,"sameAs")){var C=l(_,"sameAs"),k=f(C),T=a('input[name="'+v+"[user]["+k+']"]');y=T.val(),"checkbox"==T.prop("type")&&0==T.prop("checked")&&(y="")}var P={storagePid:h,L:a("#femanagerLanguage").val(),id:a("#femanagerPid").val()};P["tx_femanager_validation[validation]"]=b,P["tx_femanager_validation[value]"]=x,P["tx_femanager_validation[field]"]=t(e),P["tx_femanager_validation[user]"]=void 0!==g?g:"",P["tx_femanager_validation[additionalValue]"]=y?y:"",P["tx_femanager_validation[plugin]"]=c,P["tx_femanager_validation[pluginName]"]=v,P["tx_femanager_validation[referrerAction]"]=m,a.ajax({url:p,data:P,type:"POST",cache:!1,success:function(a){if(n&&d.addCallbackToQueue(!0),a)try{a.validate?r(e):i(e,a.message)}catch(t){e.before(data)}},error:function(){u()}})}function t(a){var e="",n=a.prop("name").split("[");return e=void 0!==n[2]?n[2].replace("]",""):n[1].replace("]","")}function i(e,n){r(e);var t=a(".femanager_validation_container").html().replace("###messages###",n);e.before(t),e.closest(".form-group").addClass("has-error"),e.addClass("error")}function r(a){a.closest(".form-group").removeClass("has-error"),a.siblings(".alert").remove(),a.removeClass("error")}function o(a){if(0==a.find(".error").length)v=!0,a.trigger("submit");else{const e=a.find(".error:first")[0];if(!e)return;e.scrollIntoView({behavior:"smooth"})}}function l(a,e){for(var n=0;n<a.length;n++)if(a[n].indexOf(e)!==-1)return a[n];return""}function s(a){return a.attr("data-validation").split(",")}function f(a){var e="";if(a.indexOf("(")!==-1){var n=a.split("(");e=n[1].substr(0,n[1].length-1)}return e}function u(){"object"==typeof console&&console.log("Error: The called url is not available - if you use TYPO3 in a subfolder, please use config.baseURL in TypoScript")}var d,c=a(this),v=!1;0==c.find("*[data-validation]").length&&(v=!0);var g=function(){var e,n,t;return function(i){i||(i={}),e=i.numRequest||0,n=i.requestsCompleted||0,c=i.element||0,t=[];var r=function(){a("body").css("cursor","default"),o(c);for(var e=0;e<t.length;e++)t[e]()};i.singleCallback&&t.push(i.singleCallback),this.addCallbackToQueue=function(a,i){a&&n++,i&&t.push(i),n==e&&r()},this.requestComplete=function(a){a&&n++,n==e&&r()},this.setCallback=function(a){t.push(callBack)}}}();a('*[data-validation]:not([type="file"])').on("blur",function(){n(a(this),!1)}),a('*[data-validation][type="file"]').on("change",function(){n(a(this),!1)}),c.on("submit",function(n){a("body").css("cursor","wait"),v||(n.preventDefault(),e(a(this)))})}; 3function createUploader(e){if(0!=e("#femanager_field_fine-uploader").length){var a={imageNames:{},getImageNames:function(){return e.map(this.imageNames,function(e){return e}).join(",")},addImageName:function(a,t){this.imageNames[a]=t,e("#femanager_field_image").val(this.getImageNames())},deleteImageName:function(a){delete this.imageNames[a],e("#femanager_field_image").val(this.getImageNames())}};new qq.FineUploader({element:document.getElementById("femanager_field_fine-uploader"),request:{endpoint:Femanager.getBaseUrl()+"index.php?eID=femanagerFileUpload&id="+e("#femanagerPid").val(),customHeaders:{Accept:"application/json"}},multiple:!0,template:e(".image_container_template:first").html(),fileTemplate:'<li><div class="qq-progress-bar"></div><span class="qq-upload-spinner"></span><span class="qq-upload-finished"></span><span class="qq-upload-file"></span><span class="qq-upload-size"></span><a class="qq-upload-cancel" href="#">{cancelButtonText}</a><a class="qq-upload-retry" href="#">{retryButtonText}</a><a class="qq-upload-delete icon-trash" href="#">{deleteButtonText}</a><span class="qq-upload-status-text">{statusText}</span></li>',deleteFile:{enabled:!0,forceConfirm:!0,endpoint:Femanager.getBaseUrl()+"index.php?eID=femanagerFileDelete&id="+e("#femanagerPid").val()},classes:{success:"alert alert-success",fail:"alert alert-error"},validation:{allowedExtensions:getValueFromField("#uploadFileExtension","jpeg, jpg, gif, png, bmp","array"),sizeLimit:getValueFromField("#uploadSize",25e6,"int"),itemLimit:getValueFromField("#uploadAmount",1,"int")},callbacks:{onComplete:function(t,n,i){if(i.success){var l=e("<img />").addClass("fileupload_image").prop("src",e("#uploadFolder").val()+"/"+i.uploadName).prop("alt",i.uploadName);l.appendTo(this.getItemByFileId(t)),a.addImageName(t,i.uploadName)}},onDeleteComplete:function(e,t,n){a.deleteImageName(e)}}});return a}}function getValueFromField(e,a,t){var n=a;return $(e).length&&(n=$(e).val()),void 0!==t&&("int"===t?n=parseInt(n):"array"===t&&(n=n.toString(),n=n.replace(/[\s,]+/g,","),n=n.split(","))),n}jQuery(document).ready(function(e){function a(e){e+="";var a=e.charAt(0).toLowerCase();return a+e.substr(1)}var t;t=null!=document.querySelector(".tx-femanager[data-labels]")?JSON.parse(document.querySelector(".tx-femanager[data-labels]").dataset.labels):[],e(".feManagerValidation").femanagerValidation(e);var n=createUploader(e);e("#femanager_field_image").length>0&&e.each(e("#femanager_field_image").val().split(","),function(e,a){a.trim().length>0&&n.addImageName(a,a)}),e("#femanager_field_preview-image").find(".qq-upload-delete").click(function(a){a.preventDefault();var t=e(a.target).parent();n.deleteImageName(t.find(".qq-upload-file").text()),t.fadeOut("",function(){e(this).remove()})}),e("*[data-confirm]").click(function(a){var t=e(this).attr("data-confirm");confirm(t)||a.preventDefault()}),document.querySelectorAll("[data-data-endpoint]").forEach(function(n){var i=function(i){var l=n.dataset.dataEndpoint,o={"tx_femanager_data[action]":l,"tx_femanager_data[controller]":"Data"};arguments=JSON.parse(JSON.stringify(n.dataset));for(var r in arguments)if(arguments.hasOwnProperty(r)&&r.match("arguments")){var s=document.getElementById(arguments[r]);if(s){var d=a(r.substr(9));o["tx_femanager_data["+d+"]"]=s.value}}var p=Femanager.getBaseUrl()+"index.php?id="+e("#femanagerPid").val()+"&type=1594138042",m=n.dataset.selectedValue;
3e.ajax({url:p,data:o,type:"POST",cache:!1,beforeSend:function(){n.disabled=1,n.options.length=0,n.options[0]=new Option(t.loading_states)},success:function(e){n.disabled=1,n.options.length=0,""===m||e.hasOwnProperty(m)||(n.options[n.options.length]=new Option(t.please_choose));for(var a in e)if(e.hasOwnProperty(a)){var i=a===m;n.options[n.options.length]=new Option(e[a],a,i,i),n.disabled=0}},error:function(){console.log("Error: The called url is not available - if you use TYPO3 in a subfolder, please use config.baseURL in TypoScript")}})},l=n.dataset.triggerFields;void 0!==l?l.split(",").forEach(function(e){var a=document.getElementById(e);void 0!==a&&a.addEventListener("change",i)}):n.addEventListener("change",i),i()})}),window.Femanager={},window.Femanager.getBaseUrl=function(){var e;if(jQuery("base").length>0)e=jQuery("base").prop("href");else if(window.location.hostname.indexOf("localhost")!==-1)e="";else{var a="";window.location.port.length>0&&(a=":"+window.location.port),e="https:"!==window.location.protocol?"http://"+window.location.hostname+a+"/":"https://"+window.location.hostname+a+"/"}return e}; 4// Consent class 5const serviceConfigs = JSON.parse(JSON.stringify(allServiceSettings)); 6 7// Function to retrieve a cookie by its name 8function getCookie(name) { 9 var nameEQ = name + "="; 10 var ca = document.cookie.split(';'); 11 for (var i = 0; i < ca.length; i++) { 12 var c = ca[i]; 13 while (c.charAt(0) == ' ') c = c.substring(1); 14 if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length); 15 } 16 return null; 17} 18 19// Function to set a cookie with a specified name, value, and expiration date 20function setCookie(name, value, daysToExpire) { 21 var expires = ""; 22 if (daysToExpire) { 23 var date = new Date(); 24 date.setTime(date.getTime() + (daysToExpire * 24 * 60 * 60 * 1000)); 25 expires = "; expires=" + date.toUTCString(); 26 } 27 document.cookie = name + "=" + (value || "") + expires + "; path=/"; 28} 29 30// Function to evaluate the final consent value based on service settings 31function evaluateFinalValue(serviceSettings, settingKey) { 32 let hasGranted = false; 33 let hasDenied = false; 34 35 // Iterate through all services and check their consent settings 36 serviceSettings.forEach(settings => { 37 if (settings[settingKey] === 'granted') 38 if (settings[settingKey] === 'granted') hasGranted = true; 39 else if (settings[settingKey] === 'denied') hasDenied = true; 40 }); 41 42 // If there is at least one "denied" value, return "denied" 43 if (hasDenied) return 'denied'; 44 45 // If there is only one "granted" value, return "granted" 46 if (hasGranted) return 'granted'; 47 48 // If all values are "not set" or there are no explicit "granted"/"denied" values, return "denied" 49 return 'denied'; 50} 51 52// Function to update the cookie with the final consent values 53function updateCookieWithFinalConsent(name, daysToExpire, services) { 54 const cookieValue = getCookie(name); 55 if (cookieValue !== null) { 56 const obj = JSON.parse(decodeURIComponent(cookieValue)); 57 58 // Evaluate and set the final values for each consent setting 59 ['ad_storage','analytics_storage','ad_user_data','ad_personalization', 60 'personalization_storage','functionality_storage','security_storage'] 61 .forEach(key => { 62 obj[key] = evaluateFinalValue(services, key); 63 }); 64 65 setCookie(name, encodeURIComponent(JSON.stringify(obj)), daysToExpire); 66 pushTriggerAfterConsentChanged(obj); 67 } else { 68 console.log("Cookie name '" + name + "' does not exist."); 69 } 70} 71 72// Function to push the trigger for gtm after consent changed 73function pushTriggerAfterConsentChanged(changes) { 74 window.dataLayer = window.dataLayer || []; 75 window.dataLayer.push({ 76 event: 'cmp_we_cookie_consent_changed', // Custom-Event-Name 77 we_consent_state: { // Add all final states 78 ad_storage : changes.ad_storage, 79 analytics_storage : changes.analytics_storage, 80 ad_user_data : changes.ad_user_data, 81 ad_personalization : changes.ad_personalization, 82 personalization_storage: changes.personalization_storage, 83 functionality_storage : changes.functionality_storage, 84 security_storage : changes.security_storage 85 } 86 }); 87} 88 89// Debug function to log all stored service settings 90function getAllServiceSettings() { 91 // Log all service settings to the console 92 console.log(allServiceSettings); 93 // Optionally return allServiceSettings; 94 // return allServiceSettings; 95} 96 97// main controller 98let ConsentApp = new function ConsentController() { 99 // public functions 100 /** 101 * Callback function for GoogleTagManager Script to handle consent state changes and fire the dataLayer trigger 102 * @param bool state 103 * @param object service 104 */ 105 this.consentChanged = function(state, service) { 106 // Check if the service is related to Google Tag Manager 107 const isGTM = service.name.indexOf('google-tagmanager-service') !== -1; 108 if (isGTM) { 109 // A) Remap all services - only the service that has just been changed receives either its config values (if state=true) or "denied" all-over. 110 allServiceSettings = allServiceSettings.map(tempSettings => { 111 if (tempSettings.serviceId !== service.name) { 112 // Unmodified copy 113 return { 114 serviceId: tempSettings.serviceId, 115 serviceConsent: tempSettings.serviceConsent, 116 ad_storage: tempSettings.ad_storage, 117 analytics_storage: tempSettings.analytics_storage, 118 ad_user_data: tempSettings.ad_user_data, 119 ad_personalization: tempSettings.ad_personalization, 120 functionality_storage: tempSettings.functionality_storage, 121 personalization_storage: tempSettings.personalization_storage, 122 security_storage: tempSettings.security_storage 123 }; 124 } 125 126 // Get the original config 127 const originalConfig = serviceConfigs.find(original => original.serviceId === tempSettings.serviceId); 128 const updated = { serviceId: tempSettings.serviceId, serviceConsent: state }; 129 130 // For every consent type 131 ['ad_storage','analytics_storage','ad_user_data','ad_personalization', 132 'personalization_storage','functionality_storage','security_storage'] 133 .forEach(key => { 134 // if consent is granted: accept from config 135 // if consent is denied: always 'denied' 136 updated[key] = state ? originalConfig[key] : 'denied'; 137 }); 138 139 return updated; 140 }); 141 142 // B) Evaluate only the granted services 143 // Filter allServiceSettings to include only services with serviceConsent = true 144 // Update cookie 145 const relevantServices = allServiceSettings.filter(relevant => relevant.serviceConsent); 146 updateCookieWithFinalConsent(storageName, cookieExpiresAfterDays, relevantServices); 147 148 // C) dataLayer-Push based on the state 149 window.dataLayer = window.dataLayer || []; 150 window.dataLayer.push({ 151 event: service.gtm.trigger, 152 [service.gtm.variable]: state 153 }); 154 } 155 156 // D) Check if the own callback function is allready defined 157 if (service.ownCallback) { 158 if (typeof window[service.ownCallback] === 'function') { 159 window[service.ownCallback](state, service); 160 } else { 161 console.error('The Callback function ' + service.ownCallback + ' is not yet defined. Please create it first.'); 162 } 163 } 164 }; 165 166 // constructor (modal and safari) 167 (function contruct() { 168 document.addEventListener('DOMContentLoaded', function () { 169 // Listener for the button on the privacy page, to edit the consent 170 document.addEventListener('click', function (event) { 171 if (event.target.closest('.js-showConsentModal')) { 172 event.preventDefault(); 173 klaro.show(); 174 } 175 }); 176 }); 177 })(); 178 179 const isSafari = navigator.vendor && 180 navigator.vendor.indexOf('Apple') > -1 && 181 navigator.userAgent && 182 navigator.userAgent.indexOf('CriOS') == -1 && 183 navigator.userAgent.indexOf('FxiOS') == -1; 184 185 document.addEventListener('DOMContentLoaded', function() { 186 setTimeout(function() { 187 188 setServiceSuccessVarBtn(); 189 190 document.addEventListener('click', function (event) { 191 if (event.target.matches('.cn-decline')) { 192 setServiceSuccessVarBtn(); 193 } 194 }); 195 196 document.addEventListener('click', function (event) {
197 if (event.target.matches('.cm-btn-accept')) { 198 setServiceSuccessVarBtn(); 199 } 200 }); 201 202 document.addEventListener('click', function (event) { 203 if (event.target.matches('.cm-btn-decline')) { 204 setServiceSuccessVarBtn(); 205 } 206 }); 207 208 if (isSafari!==true) { 209 document.getElementById('klaro').classList.remove('safari'); 210 } else { 211 document.getElementById('klaro').classList.add('safari'); 212 } 213 }) 214 }); 215}; 216// End main controller 217 218var optOutLink = document.getElementById("ga-opt-out"); 219 220if(optOutLink) { 221 optOutLink.onclick = function() { 222 document.cookie = 'ga-opt-out=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/'; 223 this.innerHTML = "Google Analytics opt-out successful"; 224 return false; 225 } 226} 227 228// Functions after window.load(): 229window.addEventListener('load', function () { 230 const iframes = document.querySelectorAll('iframe'); 231 232 if (iframes.length > 0) { 233 iframes.forEach(function (iframe) { 234 let attrDataSrc = iframe.getAttribute('src'); 235 if (!attrDataSrc) { 236 attrDataSrc = iframe.getAttribute('data-src'); 237 } 238 239 if (attrDataSrc && (attrDataSrc.includes('youtube') || attrDataSrc.includes('vimeo'))) { 240 // Adjust measures for videoOverlay similar to iframe: 241 const parent = iframe.parentElement; 242 const contextNotice = parent.querySelector('.klaro.cm-as-context-notice'); 243 244 if (contextNotice) { 245 iframe.style.display = 'block'; 246 247 // Set the width of .klaro.cm-as-context-notice to the iframe's width 248 contextNotice.style.width = iframe.offsetWidth + 'px'; 249 250 if (iframe.offsetHeight < contextNotice.offsetHeight) { 251 const cmButtons = contextNotice.querySelector('.cm-buttons'); 252 if (cmButtons) { 253 cmButtons.style.marginTop = '1em'; 254 } 255 } 256 } 257 } 258 }); 259 } 260 261 // Add class for small context-notice box: if video integration within small iframes (width < 300px) 262 document.querySelectorAll('.klaro.we_cookie_consent.cm-as-context-notice').forEach(function(element) { 263 if (element.offsetWidth <= 300) { 264 element.classList.add('notice--minified'); 265 } 266 }); 267 268 // Add class to avoid Google to crawl consent info text 269 document.querySelectorAll('.klaro.we_cookie_consent .cn-body').forEach(function(element) { 270 element.setAttribute('data-nosnippet', 'data-nosnippet'); 271 }); 272}); 273 274// Workaround: Show "Always" Button for overlay (for example youtube videos) only when the klaro cookie is set 275function setServiceSuccessVarBtn() 276{ 277 const klaroCookie = getCookie('klaro'); 278 279 if (klaroCookie) { 280 const allServiceSuccessVarBtn = document.querySelectorAll('.cm-btn-success-var'); 281 if (allServiceSuccessVarBtn.length > 0) {
282 allServiceSuccessVarBtn.forEach((serviceSuccessVarBtn) => { 283 serviceSuccessVarBtn.style.setProperty('display', 'block', 'important'); 284 } 285 ) 286 } 287 } 288} 289 290document.addEventListener('DOMContentLoaded', function () { 291 292 if (checkCookieExists('klaro')) { 293 createTooltip(); 294 } 295 296 setTimeout(function () { 297 const klaroDiv = document.getElementById('klaro'); 298 const buttons = klaroDiv.querySelectorAll('button'); 299 300 function handleClick(event) { 301 createTooltip(); 302 if (document.querySelector('#klaro .cookie-notice') == null && document.querySelector('#klaro .cookie-modal') == null) { 303 } 304 } 305 306 buttons.forEach(button => { 307 button.addEventListener('click', handleClick); 308 }); 309 }); 310 311 setTimeout(function () { 312 if (document.querySelector('.cm-link')) { 313 document.querySelector('.cm-link').addEventListener('click', function () { 314 if (document.querySelector('.cm-btn-success')) { 315 document.querySelector('.cm-btn-success').addEventListener('click', function () { 316 createTooltip(); 317 }); 318 } 319 320 if (document.querySelector('.cn-decline')) { 321 document.querySelector('.cn-decline').addEventListener('click', function () { 322 createTooltip(); 323 }); 324 } 325 326 if (document.querySelector('.cm-btn-accept-all')) { 327 document.querySelector('.cm-btn-accept-all').addEventListener('click', function () { 328 createTooltip(); 329 }); 330 } 331 }); 332 } 333 }, 1000); 334}); 335 336function checkCookieExists(cookieName) { 337 let cookies = document.cookie.split(';'); 338 339 for (let i = 0; i < cookies.length; i++) { 340 let cookie = cookies[i]; 341 // Remove leading spaces (if any) 342 while (cookie.charAt(0) == ' ') { 343 cookie = cookie.substring(1); 344 } 345 // Check if the cookie name matches 346 if (cookie.indexOf(cookieName + '=') == 0) { 347 return true; 348 } 349 } 350 return false; 351} 352 353function createTooltip() { 354 if (cookieIconPermanentlyAvailable === '1') { 355 let iconTooltip = document.createElement('div'); 356 let iconImgTag = document.createElement('img'); 357 let iconBtn = document.createElement('button'); 358 let iconContainer = document.createElement('div'); 359 360 // Button 361 iconBtn.type = 'button'; 362 iconBtn.className = 'consent-trigger js-showConsentModal'; 363 iconBtn.setAttribute('aria-label', translatedButtonTextCookieSettings); 364 iconBtn.setAttribute('aria-haspopup', 'dialog'); 365 366 // Image 367 iconImgTag.src = cookieSettingsImgPathDefault; 368 iconImgTag.alt = ''; 369 iconImgTag.setAttribute('aria-hidden', 'true'); 370 iconImgTag.width = 85; iconImgTag.height = 85; 371 iconImgTag.style.cssText = 'margin-right:0px;width:85px;height:85px;'; 372 373 // Hover/Fokus (Image & Tooltip) 374 function showTip(){ iconTooltip.style.display = 'block'; iconImgTag.src = cookieSettingsImgPathHover; } 375 function hideTip(){ iconTooltip.style.display = 'none'; iconImgTag.src = cookieSettingsImgPathDefault; } 376 377 iconBtn.addEventListener('mouseover', showTip); 378 iconBtn.addEventListener('mouseout', hideTip); 379 iconBtn.addEventListener('focusin', showTip); 380 iconBtn.addEventListener('focusout', hideTip); 381 382 // Tooltip 383 iconTooltip.textContent = translatedButtonTextCookieSettings; 384 iconTooltip.classList.add('consent-cookie-text'); 385 iconTooltip.style.cssText = 'display:none;'; 386 // (optional ARIA) 387 // tooltip.id = 'consent-tooltip'; 388 // tooltip.setAttribute('role', 'tooltip'); 389 // btn.setAttribute('aria-describedby', 'consent-tooltip'); 390 391 // Container 392 iconContainer.classList.add('consent-cookie'); 393 iconContainer.style.cssText = 'display:flex;'; 394 395 // DOM 396 iconBtn.appendChild(iconImgTag); 397 iconContainer.appendChild(iconBtn); 398 iconContainer.appendChild(iconTooltip); 399 document.body.appendChild(iconContainer); 400 } 401} 402 403$(document).ready(function () { 404 var settings = { 405 checkbox: '#femanager_field_is_jetticket_user', 406 hiddenClass: '.jetticketHidden', 407 hiddenClassInfo: '.hide-info', 408 email: '#femanager_field_email', 409 password: '#femanager_field_password', 410 jetticketUser: '#femanager_field_jetticketUser', 411 jetticketPassword: '#femanager_field_jetticketPassword', 412 form: '#femanager_form' 413 }; 414 415 $(settings.checkbox).click(function (){ 416 if ($(this).prop('checked')) { 417 // checked 418 $(settings.hiddenClass).addClass('d-block'); 419 } else { 420 // not checked 421 $(settings.hiddenClass).removeClass('d-block'); 422 } 423 }); 424 425 $(settings.form).submit(function(e) { 426 var emailVal = $(settings.email).val(); 427 var passwordVal = $(settings.password).val(); 428 429 var jetticketEmailVal = $(settings.jetticketUser).val(); 430 var jetticketPasswordVal = $(settings.jetticketPassword).val(); 431 432 if (emailVal !== '' && passwordVal !== '') { 433 $(settings.hiddenClassInfo).removeClass('show'); 434 435 if (jetticketEmailVal === '' && jetticketPasswordVal === '') { 436 $(settings.jetticketUser).val(emailVal); 437 $(settings.jetticketPassword).val(passwordVal); 438 } 439 } else { 440 $(this).prop('checked', false); 441 $(settings.hiddenClassInfo).addClass('show'); 442 } 443 }); 444});
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.