1<!doctype html> 2<html lang="pt"> 3<head >
3<script nonce="anZ5bmpyamN1NW5oZGptNHRkaDRwbzJ1b3QwdjBtNjk=">(() => { 4 let mstCookieService = { 5 allCookiesByGroups: {"1":["add_to_cart","guest-view","login_redirect","mage-banners-cache-storage","mage-messages","mage-translation-storage","mage-translation-file-version","product_data_storage","recently_compared_product","recently_compared_product_previous","recently_viewed_product","recently_viewed_product_previous","remove_from_cart","stf","X-Magento-Vary","form_key","mage-cache-sessid","mage-cache-storage","mage-cache-storage-section-invalidation","persistent_shopping_cart","private_content_version","section_data_ids","store"],"2":["customer_segment_ids","external_no_cache","frontend","guest_view","last_category","last_product","newmessage","no_cache"],"3":["mg_dnt","user_allowed_save_cookie","authentication_flag","dataservices_customer_id","dataservices_customer_group","dataservices_cart_id","dataservices_product_context"],"4":["_ga","_ga_[*]"]}, 6 essentialGroupIds: [1], 7 requiredCookies: ["mst_blog_secret_[*]","CacheWarmerStatus","CacheWarmer","mst-cache-warmer-toolbar","mst-cache-warmer-track","PHPSESSID","form_key","gdpr_cookie_consent","gdpr_cookie_groups","geo_ip_request","geo_ip_request_status","geo_ip_location","geo_ip_currency","info_bypass_cookie","trigger_send_key","qid","searchReport-log"], 8 isTrack: false, 9 wildcard: '[*]', 10 rejected: [], 11 sent: [], 12 getAllowedGroups() { 13 let cookieValue = this.getCookie('gdpr_cookie_groups'); 14 let allowedGroupIds = cookieValue ? unescape(cookieValue).split(',') : []; 15 16 return (allowedGroupIds.length) ? allowedGroupIds : this.essentialGroupIds; 17 }, 18 getAllowedCookies() { 19 let allowedGroups = this.getAllowedGroups(); 20 let cookies = this.requiredCookies; 21 for (let groupId of allowedGroups) { 22 if (this.allCookiesByGroups[groupId]) { 23 for (let code of this.allCookiesByGroups[groupId]) { 24 cookies.push(code); 25 } 26 } 27 } 28 return cookies; 29 }, 30 getCookie(cookieCode) { 31 cookieCode += '='; 32 let cookieArr = document.cookie.split(';'); 33 for (i = 0; i < cookieArr.length; i++) { 34 let cookie = (cookieArr[i]).trim(); 35 if (cookie.indexOf(cookieCode) === 0) { 36 return cookie.substring(cookieCode.length, cookie.length); 37 } 38 } 39 return null; 40 }, 41 isAllowed(cookieCode) { 42 let allowedCookies = this.getAllowedCookies(); 43 for (let code of allowedCookies) { 44 if (code == cookieCode) { 45 return true; 46 } 47 if (code.indexOf(this.wildcard) !== -1) { 48 let regexp = new RegExp('^' + code.replace(this.wildcard, '.+') + '$', 'i'); 49 if (regexp.test(cookieCode)) { 50 return true; 51 } 52 } 53 } 54 return false; 55 }, 56 addSent(sent) { 57 this.sent = this.sent.concat(sent); 58 }, 59 reject(cookieCode) { 60 if (this.rejected.indexOf(cookieCode) === -1) { 61 this.rejected.push(cookieCode); 62 } 63 }, 64 sendRejected() { 65 if (this.rejected.length) { 66 let toSend = this.rejected.filter(function (cookieCode) { 67 return this.indexOf(cookieCode) === -1; 68 }, this.sent); 69 if (toSend.length) { 70 let body = toSend.reduce((body, cookieCode) => { 71 body.append('cookie_list[]', cookieCode); 72 return body; 73 }, new URLSearchParams({})); 74 fetch('/gdpr_cookie/cookie/rejected', { 75 method: 'POST', 76 headers: { 77 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 78 'X-Requested-With': 'XMLHttpRequest' 79 }, 80 body: body 81 }); 82 this.addSent(toSend); 83 } 84 } 85 } 86 }; 87 88 let nativeCookie = Object.getOwnPropertyDescriptor(Document.prototype, 'cookie'); 89 if (!nativeCookie && HTMLDocument) { 90 nativeCookie = Object.getOwnPropertyDescriptor(HTMLDocument.prototype, 'cookie'); 91 } 92 if (nativeCookie && nativeCookie.configurable) { 93 Object.defineProperty(document, 'cookie', { 94 enumerable: true, 95 configurable: true, 96 get() { 97 return nativeCookie.get.call(document); 98 }, 99 set(v) { 100 try { 101 let cookieCode = ((v.split(';')[0]).split('=')[0]).trim(); 102 if (!mstCookieService.isAllowed(cookieCode)) { 103 mstCookieService.reject(cookieCode); 104 return; 105 } 106 } catch (e) { 107 console.log(' -- error when check cookie: ', v); 108 console.log(e.name + ':' + e.message); 109 console.log(e.stack); 110 } 111 nativeCookie.set.call(document, v); 112 } 113 }); 114 115 if (mstCookieService.isTrack) { 116 let timerId = setInterval(mstCookieService.sendRejected.bind(mstCookieService), 1000); 117 } 118 } 119})();window.dataLayer = window.dataLayer || []; 120function gtag(){dataLayer.push(arguments);} 121if(localStorage.getItem("mst-gdpr-google-consent-mode") === null){ 122 gtag("consent", "default", {"ad_user_data":"granted","ad_personalization":"granted","ad_storage":"granted","analytics_storage":"granted","personalization_storage":"granted","functionality_storage":"granted","security_storage":"granted"}); 123} else { 124 gtag("consent", "default", JSON.parse(localStorage.getItem("mst-gdpr-google-consent-mode"))); 125}</script>
125 126 <meta charset="utf-8"/> 127<meta name="title" content="Customer Login"/> 128<meta name="robots" content="INDEX,FOLLOW"/> 129<meta name="viewport" content="width=device-width, initial-scale=1"/> 130<title>Customer Login</title> 131 <link rel="stylesheet" type="text/css" media="all" href="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/mage/gallery/gallery.css" /> 132<link rel="stylesheet" type="text/css" media="all" href="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/css/styles.css" /> 133<link rel="stylesheet" type="text/css" media="all" href="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/Magento_Theme/css/swiper.min.css" /> 134<link rel="stylesheet" type="text/css" media="all" href="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/StripeIntegration_Payments/css/wallets.css" />
135<script type="text/javascript" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/Hyva_CheckoutStripe/js/load-stripe.js"></script>
135 136<link rel="canonical" href="https://stata-brazil.com/customer/account/login/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/" /> 137<link rel="alternate" hreflang="pt-BR" href="https://stata-brazil.com/customer/account/login/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/customer/account/login/" /> 138<link rel="alternate" hreflang="fr-FR" href="https://stata-france.com/customer/account/login/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/customer/account/login/" /> 139<link rel="alternate" hreflang="en-GB" href="https://stata-uk.com/customer/account/login/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/customer/account/login/" /> 140<link rel="alternate" hreflang="x-default" href="https://stata-uk.com/customer/account/login/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/customer/account/login/" /> 141<link rel="icon" type="image/x-icon" href="https://stata-brazil.com/media/favicon/default/timberlake-favicon_2_.png" /> 142<link rel="shortcut icon" type="image/x-icon" href="https://stata-brazil.com/media/favicon/default/timberlake-favicon_2_.png" />
143<script type="application/ld+json"> 144{ 145 "@context": "https://schema.org", 146 "@type": "Organization", 147 "name": "Stata Brazil", 148 "url": "https://stata-brazil.com/", 149 "logo": "https://stata-brazil.com/static/frontend/TimberlakeHyva/timberlake/es_ES/images/stata-logo.png", 150 "sameAs": [ 151 "https://www.facebook.com/timberlakeconsultants", 152 "https://www.linkedin.com/company/timberlake-consultants", 153 "https://twitter.com/timberlake_cons" 154 ], 155 "contactPoint": [{ 156 "@type": "ContactPoint", 157 "telephone": "+55-11-4680-3503", 158 "email": "[email protected]", 159 "contactType": "customer service", 160 "areaServed": "BR", 161 "availableLanguage": ["Portuguese", "English"] 162 }], 163 "address": { 164 "@type": "PostalAddress", 165 "streetAddress": "Rua Gomes de Carvalho, 911 â Vila Olimpia", 166 "addressLocality": "São Paulo", 167 "addressRegion": "SP", 168 "postalCode": "04547-003", 169 "addressCountry": "BR" 170 } 171} 172</script>
172 173
173<script> 174 var BASE_URL = 'https://stata-brazil.com/'; 175 var THEME_PATH = 'https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR'; 176 var COOKIE_CONFIG = { 177 "expires": null, 178 "path": "\u002F", 179 "domain": ".stata\u002Dbrazil.com", 180 "secure": false, 181 "lifetime": "3600", 182 "cookie_restriction_enabled": false }; 183 var CURRENT_STORE_CODE = 'stata_br'; 184 var CURRENT_WEBSITE_ID = '49'; 185 186 window.hyva = window.hyva || {} 187 188 window.cookie_consent_groups = window.cookie_consent_groups || {} 189 window.cookie_consent_groups['necessary'] = true; 190 191 window.cookie_consent_config = window.cookie_consent_config || {}; 192 window.cookie_consent_config['necessary'] = [].concat( 193 window.cookie_consent_config['necessary'] || [], 194 [ 195 'user_allowed_save_cookie', 196 'form_key', 197 'mage-messages', 198 'private_content_version', 199 'mage-cache-sessid', 200 'last_visited_store', 201 'section_data_ids' 202 ] 203 ); 204</script>
vendor: 1 bytes, line 204
204
205<script> 206 (function( hyva, undefined ) { 207 208 function lifetimeToExpires(options, defaults) { 209 210 const lifetime = options.lifetime || defaults.lifetime; 211 212 if (lifetime) { 213 const date = new Date; 214 date.setTime(date.getTime() + lifetime * 1000); 215 return date; 216 } 217 218 return null; 219 } 220 221 function generateRandomString() { 222 223 const allowedCharacters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 224 length = 16; 225 226 let formKey = '', 227 charactersLength = allowedCharacters.length; 228 229 for (let i = 0; i < length; i++) { 230 formKey += allowedCharacters[Math.round(Math.random() * (charactersLength - 1))] 231 } 232 233 return formKey; 234 } 235 236 const sessionCookieMarker = {noLifetime: true} 237 238 const cookieTempStorage = {}; 239 240 const internalCookie = { 241 get(name) { 242 const v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 243 return v ? v[2] : null; 244 }, 245 set(name, value, days, skipSetDomain) { 246 let expires, 247 path, 248 domain, 249 secure, 250 samesite; 251 252 const defaultCookieConfig = { 253 expires: null, 254 path: '/', 255 domain: null, 256 secure: false, 257 lifetime: null, 258 samesite: 'lax' 259 }; 260 261 const cookieConfig = window.COOKIE_CONFIG || {}; 262 263 expires = days && days !== sessionCookieMarker 264 ? lifetimeToExpires({lifetime: 24 * 60 * 60 * days, expires: null}, defaultCookieConfig) 265 : lifetimeToExpires(window.COOKIE_CONFIG, defaultCookieConfig) || defaultCookieConfig.expires; 266 267 path = cookieConfig.path || defaultCookieConfig.path; 268 domain = !skipSetDomain && (cookieConfig.domain || defaultCookieConfig.domain); 269 secure = cookieConfig.secure || defaultCookieConfig.secure; 270 samesite = cookieConfig.samesite || defaultCookieConfig.samesite; 271 272 document.cookie = name + "=" + encodeURIComponent(value) + 273 (expires && days !== sessionCookieMarker ? '; expires=' + expires.toGMTString() : '') + 274 (path ? '; path=' + path : '') + 275 (domain ? '; domain=' + domain : '') + 276 (secure ? '; secure' : '') + 277 (samesite ? '; samesite=' + samesite : 'lax'); 278 }, 279 isWebsiteAllowedToSaveCookie() { 280 const allowedCookies = this.get('user_allowed_save_cookie'); 281 if (allowedCookies) { 282 const allowedWebsites = JSON.parse(unescape(allowedCookies)); 283 284 return allowedWebsites[CURRENT_WEBSITE_ID] === 1; 285 } 286 return false; 287 }, 288 getGroupByCookieName(name) { 289 const cookieConsentConfig = window.cookie_consent_config || {}; 290 let group = null; 291 for (let prop in cookieConsentConfig) { 292 if (!cookieConsentConfig.hasOwnProperty(prop)) continue; 293 if (cookieConsentConfig[prop].includes(name)) { 294 group = prop; 295 break; 296 } 297 } 298 return group; 299 }, 300 isCookieAllowed(name) { 301 const cookieGroup = this.getGroupByCookieName(name); 302 return cookieGroup 303 ? window.cookie_consent_groups[cookieGroup] 304 : this.isWebsiteAllowedToSaveCookie(); 305 }, 306 saveTempStorageCookies() { 307 for (const [name, data] of Object.entries(cookieTempStorage)) { 308 if (this.isCookieAllowed(name)) { 309 this.set(name, data['value'], data['days'], data['skipSetDomain']); 310 delete cookieTempStorage[name]; 311 } 312 } 313 } 314 }; 315 316 hyva.getCookie = (name) => { 317 const cookieConfig = window.COOKIE_CONFIG || {}; 318 319 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 320 return cookieTempStorage[name] ? cookieTempStorage[name]['value'] : null; 321 } 322 323 return internalCookie.get(name); 324 } 325 326 hyva.setCookie = (name, value, days, skipSetDomain) => { 327 const cookieConfig = window.COOKIE_CONFIG || {}; 328 329 if (cookieConfig.cookie_restriction_enabled && ! internalCookie.isCookieAllowed(name)) { 330 cookieTempStorage[name] = {value, days, skipSetDomain}; 331 return; 332 } 333 return internalCookie.set(name, value, days, skipSetDomain); 334 } 335 336 337 hyva.setSessionCookie = (name, value, skipSetDomain) => { 338 return hyva.setCookie(name, value, sessionCookieMarker, skipSetDomain) 339 } 340 341 hyva.getBrowserStorage = () => { 342 const browserStorage = window.localStorage || window.sessionStorage; 343 if (!browserStorage) { 344 console.warn('Browser Storage is unavailable'); 345 return false;
346 } 347 try { 348 browserStorage.setItem('storage_test', '1'); 349 browserStorage.removeItem('storage_test'); 350 } catch (error) { 351 console.warn('Browser Storage is not accessible', error); 352 return false; 353 } 354 return browserStorage; 355 } 356 357 hyva.postForm = (postParams) => { 358 const form = document.createElement("form"); 359 360 let data = postParams.data; 361 362 if (! postParams.skipUenc && ! data.uenc) { 363 data.uenc = btoa(window.location.href); 364 } 365 form.method = "POST"; 366 form.action = postParams.action; 367 368 Object.keys(postParams.data).map(key => { 369 const field = document.createElement("input"); 370 field.type = 'hidden' 371 field.value = postParams.data[key]; 372 field.name = key; 373 form.appendChild(field); 374 }); 375 376 const form_key = document.createElement("input"); 377 form_key.type = 'hidden'; 378 form_key.value = hyva.getFormKey(); 379 form_key.name="form_key"; 380 form.appendChild(form_key); 381 382 document.body.appendChild(form); 383 384 form.submit(); 385 } 386 387 hyva.getFormKey = function () { 388 let formKey = hyva.getCookie('form_key'); 389 390 if (!formKey) { 391 formKey = generateRandomString(); 392 hyva.setCookie('form_key', formKey); 393 } 394 395 return formKey; 396 } 397 398 hyva.formatPrice = (value, showSign, options = {}) => { 399 const groupSeparator = options.groupSeparator; 400 const decimalSeparator = options.decimalSeparator 401 delete options.groupSeparator; 402 delete options.decimalSeparator; 403 const formatter = new Intl.NumberFormat( 404 'pt\u002DBR', 405 Object.assign({ 406 style: 'currency', 407 currency: 'USD', 408 signDisplay: showSign ? 'always' : 'auto' 409 }, options) 410 ); 411 return (typeof Intl.NumberFormat.prototype.formatToParts === 'function') ? 412 formatter.formatToParts(value).map(({type, value}) => { 413 switch (type) { 414 case 'currency': 415 return '\u0024' || value; 416 case 'minusSign': 417 return '- '; 418 case 'plusSign': 419 return '+ '; 420 case 'group': 421 return groupSeparator !== undefined ? groupSeparator : value; 422 case 'decimal': 423 return decimalSeparator !== undefined ? decimalSeparator : value; 424 default : 425 return value; 426 } 427 }).reduce((string, part) => string + part) : 428 formatter.format(value); 429 } 430 431 const formatStr = function (str, nStart) { 432 const args = Array.from(arguments).slice(2); 433 434 return str.replace(/(%+)([0-9]+)/g, (m, p, n) => { 435 const idx = parseInt(n) - nStart; 436 437 if (args[idx] === null || args[idx] === void 0) { 438 return m; 439 } 440 return p.length % 2 441 ? p.slice(0, -1).replace('%%', '%') + args[idx] 442 : p.replace('%%', '%') + n; 443 }) 444 } 445 446 hyva.str = function (string) { 447 const args = Array.from(arguments); 448 args.splice(1, 0, 1); 449 450 return formatStr.apply(undefined, args); 451 } 452 453 hyva.strf = function () { 454 const args = Array.from(arguments); 455 args.splice(1, 0, 0); 456 457 return formatStr.apply(undefined, args); 458 } 459 460 /** 461 * Take a html string as `content` parameter and 462 * extract an element from the DOM to replace in 463 * the current page under the same selector, 464 * defined by `targetSelector` 465 */ 466 hyva.replaceDomElement = (targetSelector, content) => { 467 // Parse the content and extract the DOM node using the `targetSelector` 468 const parser = new DOMParser(); 469 const doc = parser.parseFromString(content, 'text/html');
470 const contentNode = doc.querySelector(targetSelector); 471 472 // Bail if content or target can't be found 473 if (!contentNode || !document.querySelector(targetSelector)) { 474 return; 475 } 476 477 hyva.activateScripts(contentNode); 478 479 // Replace the old DOM node with the new content 480 document.querySelector(targetSelector).replaceWith(contentNode); 481 482 // Reload customerSectionData and display cookie-messages if present 483 window.dispatchEvent(new CustomEvent("reload-customer-section-data")); 484 hyva.initMessages(); 485 } 486 487 hyva.removeScripts = (contentNode) => { 488 const scripts = contentNode.getElementsByTagName('script'); 489 for (let i = 0; i < scripts.length; i++) { 490 scripts[i].parentNode.removeChild(scripts[i]); 491 } 492 const templates = contentNode.getElementsByTagName('template'); 493 for (let i = 0; i < templates.length; i++) { 494 const container = document.createElement('div'); 495 container.innerHTML = templates[i].innerHTML; 496 hyva.removeScripts(container); 497 templates[i].innerHTML = container.innerHTML; 498 } 499 } 500 501 hyva.activateScripts = (contentNode) => { 502 // Create new array from HTMLCollection to avoid mutation of collection while manipulating the DOM. 503 const scripts = Array.from(contentNode.getElementsByTagName('script')); 504 505 // Iterate over all script tags to duplicate+inject each into the head 506 for (const original of scripts) { 507 const script = document.createElement('script'); 508 original.type && (script.type = original.type); 509 script.innerHTML = original.innerHTML; 510 511 // Remove the original (non-executing) script from the contentNode 512 original.parentNode.removeChild(original) 513 514 // Add script to head 515 document.head.appendChild(script); 516 } 517 518 return contentNode; 519 } 520 521 const replace = {['+']: '-', ['/']: '_', ['=']: ','}; 522 hyva.getUenc = () => btoa(window.location.href).replace(/[+/=]/g, match => replace[match]); 523 524 let currentTrap; 525 526 const focusableElements = (rootElement) => { 527 const selector = 'button, [href], input, select, textarea, details, [tabindex]:not([tabindex="-1"]'; 528 return Array.from(rootElement.querySelectorAll(selector)) 529 .filter(el => { 530 return el.style.display !== 'none' 531 && !el.disabled 532 && el.tabIndex !== -1 533 && (el.offsetWidth || el.offsetHeight || el.getClientRects().length) 534 }) 535 } 536 537 const focusTrap = (e) => { 538 const isTabPressed = e.key === 'Tab' || e.keyCode === 9; 539 if (!isTabPressed) return; 540 541 const focusable = focusableElements(currentTrap) 542 const firstFocusableElement = focusable[0] 543 const lastFocusableElement = focusable[focusable.length - 1] 544 545 e.shiftKey 546 ? document.activeElement === firstFocusableElement && (lastFocusableElement.focus(), e.preventDefault()) 547 : document.activeElement === lastFocusableElement && (firstFocusableElement.focus(), e.preventDefault()) 548 }; 549 550 hyva.releaseFocus = (rootElement) => { 551 if (currentTrap && (!rootElement || rootElement === currentTrap)) { 552 currentTrap.removeEventListener('keydown', focusTrap) 553 currentTrap = null 554 } 555 } 556 hyva.trapFocus = (rootElement) => { 557 if (!rootElement) return; 558 hyva.releaseFocus() 559 currentTrap = rootElement 560 rootElement.addEventListener('keydown', focusTrap) 561 const firstElement = focusableElements(rootElement)[0] 562 firstElement && firstElement.focus() 563 } 564 565 hyva.safeParseNumber = (rawValue) => { 566 const number = rawValue ? parseFloat(rawValue) : null; 567 568 return Array.isArray(number) || isNaN(number) ? rawValue : number; 569 } 570 571 const toCamelCase = s => s.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1)).join(''); 572 hyva.createBooleanObject = (name, value = false, additionalMethods = {}) => { 573 574 const camelCase = toCamelCase(name);
575 const key = '__hyva_bool_' + name 576 577 return new Proxy(Object.assign( 578 additionalMethods, 579 { 580 [key]: !!value, 581 [name]() {return !!this[key]}, 582 ['!' + name]() {return !this[key]}, // @deprecated This does not work with non-CSP Alpine 583 ['not' + camelCase]() {return !this[key]}, 584 ['toggle' + camelCase]() {this[key] = !this[key]}, 585 [`set${camelCase}True`]() {this[key] = true}, 586 [`set${camelCase}False`]() {this[key] = false}, 587 } 588 ), { 589 set(target, prop, value) { 590 return prop === name 591 ? (target[key] = !!value) 592 : Reflect.set(...arguments); 593 } 594 }) 595 } 596 597 hyva.alpineInitialized = (fn) => window.addEventListener('alpine:initialized', fn, {once: true}) 598 window.addEventListener('alpine:init', () => Alpine.data('{}', () => ({})), {once: true}); 599 window.addEventListener('user-allowed-save-cookie', () => internalCookie.saveTempStorageCookies()) 600 601 }( window.hyva = window.hyva || {} )); 602</script>
vendor: 1 bytes, line 602
602
603<script type="speculationrules"> 604{ 605 "tag": "Hyva Theme", 606 "prefetch": [{ 607 "source": "document", 608 "where": { 609 "and": [ 610 { "href_matches": "/*" }, 611 { "not": { 612 "href_matches": ["/customer/*","*/customer/*","/search/*","*/search/*","/sales/*","*/sales/*","/wishlist/*","*/wishlist/*","/checkout/*","*/checkout/*","/paypal/*","*/paypal/*"] }}, 613 { "not": { 614 "selector_matches": [".no-preload", ".do-not-prerender", "[download]", "[rel~=nofollow]", "[target]"] 615 }} 616 ] 617 }, 618 "eagerness": "moderate" 619 }] 620} 621</script>
vendor: 1 bytes, line 621
621
622<script> 623(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 624new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 625j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 626'https://www.googletagmanager.com/gtm.js?id='+i+dl;window.scriptEl = f.parentNode.insertBefore(j,f); 627 window.scriptEl.addEventListener('abort', function() {window.isGtmLoaded = false;}, false); 628 window.scriptEl.addEventListener('cancel', function() {window.isGtmLoaded = false;}, false); 629 window.scriptEl.addEventListener('error', function() {window.isGtmLoaded = false;}, false); 630 window.scriptEl.addEventListener('invalid', function() {window.isGtmLoaded = false;}, false); 631 window.scriptEl.addEventListener('load', function() {window.isGtmLoaded = true;}, false); 632 window.scriptEl.addEventListener('loadeddata', function() {window.isGtmLoaded = true;}, false); 633 window.scriptEl.addEventListener('reset', function() {window.isGtmLoaded = false;}, false); 634 window.scriptEl.addEventListener('suspend', function() {window.isGtmLoaded = false;}, false); 635 636})(window,document,'script','dataLayer','GTM-P4JQ4VV9'); 637</script>
637 638</head> 639<body id="html-body" class="mst-nav__theme-hyva-reset mst-nav__theme-hyva-default mst-nav__theme-timberlakehyva-timberlake customer-account-login page-layout-1column"> 640<!-- Google Tag Manager (noscript) -->
vendor: 69 bytes, lines 640-641
640 641<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
641GTM-P4JQ4VV9
vendor: 85 bytes, lines 641-642
641" 642height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
643<!-- End Google Tag Manager (noscript) --><input name="form_key" type="hidden" value="MKRqwFeJZFPuKz00" /> 644 <noscript> 645 <section class="message global noscript border-b-2 border-blue-500 bg-blue-50 shadow-none m-0 px-0 rounded-none font-normal"> 646 <div class="container text-center"> 647 <p> 648 <strong>JavaScript seems to be disabled in your browser.</strong> 649 <span> 650 For the best experience on our site, be sure to turn on Javascript in your browser. </span> 651 </p> 652 </div> 653 </section> 654 </noscript> 655 656
657<script> 658 document.body.addEventListener('touchstart', () => {}, {passive: true}) 659</script>
659 660
661<script> 662 (function(hyva) { 663 const formValidationRules = { 664 required(value, options, field, context) { 665 const el = field.element.type === 'hidden' ? createTextInputFrom(field.element) : field.element, 666 fieldName = getFieldName(field), 667 msg = fieldName 668 ? hyva.str('\u00251\u0020field\u0020is\u0020required.', fieldName) 669 : 'This\u0020is\u0020a\u0020required\u0020field.'; 670 671 if (el.type === 'radio' || el.type === 'checkbox') { 672 return (value === undefined || value.length === 0) ? msg : true; 673 } 674 675 el.setAttribute('required', ''); 676 el.checkValidity(); 677 678 return el.validity.valueMissing ? msg : true; 679 }, 680 maxlength(value, options, field, context) { 681 const n = Number(options) 682 if (value.length > n) { 683 const fieldName = getFieldName(field); 684 return fieldName 685 ? n === 1 686 ? hyva.str('\u00251\u0020field\u0020cannot\u0020be\u0020longer\u0020than\u00201\u0020character.', fieldName) 687 : hyva.str('\u00251\u0020field\u0020cannot\u0020be\u0020longer\u0020than\u0020\u00252\u0020characters.', fieldName, options) 688 : n === 1 689 ? 'Digite\u0020no\u0020m\u00E1ximo\u00201\u0020caractere.' 690 : hyva.strf('Digite\u0020n\u00E3o\u0020mais\u0020do\u0020que\u0020\u00250\u0020caracteres.', options); 691 } 692 return true; 693 }, 694 minlength(value, options, field, context) { 695 const n = Number(options) 696 if (value.length > 0 && value.length < n) { 697 const fieldName = getFieldName(field); 698 return fieldName 699 ? n === 1 700 ? hyva.str('\u00251\u0020field\u0020must\u0020be\u0020at\u0020least\u00201\u0020character\u0020long.', fieldName) 701 : hyva.str('\u00251\u0020field\u0020must\u0020be\u0020at\u0020least\u0020\u00252\u0020characters\u0020long.', fieldName, options) 702 : n === 1 703 ? 'Digite\u0020pelo\u0020menos\u00201\u0020caractere.' 704 : hyva.strf('Digite\u0020pelo\u0020menos\u0020\u00250\u0020caracteres.', options); 705 } 706 return true; 707 }, 708 max(value, options, field, context) { 709 field.element.setAttribute('max', options); 710 field.element.checkValidity(); 711 if (field.element.validity.rangeOverflow) { 712 const fieldName = getFieldName(field); 713 return fieldName 714 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020less\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options) 715 : hyva.strf('Digite\u0020um\u0020valor\u0020menor\u0020ou\u0020igual\u0020a\u0020\u0022\u00250\u0022.', options); 716 } 717 return true; 718 }, 719 min(value, options, field, context) { 720 field.element.setAttribute('min', options); 721 field.element.checkValidity(); 722 if (field.element.validity.rangeUnderflow) { 723 const fieldName = getFieldName(field); 724 return fieldName 725 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020value\u0020greater\u0020than\u0020or\u0020equal\u0020to\u0020\u0022\u00252\u0022.', fieldName, options) 726 : hyva.strf('Digite\u0020um\u0020valor\u0020maior\u0020ou\u0020igual\u0020a\u0020\u0022\u00250\u0022.', options); 727 } 728 return true; 729 }, 730 step(value, options, field, context) { 731 field.element.setAttribute('step', options); 732 field.element.checkValidity(); 733 if (field.element.validity.stepMismatch) { 734 const val = Number(value), 735 step = Number(options), 736 fieldName = getFieldName(field), 737 nearestLowerValue = Math.floor(val / step) * step,
738 nearestUpperValue = Math.ceil(val / step) * step; 739 return fieldName 740 ? hyva.str('\u00251\u0020field\u0020is\u0020invalid.\u0020The\u0020two\u0020nearest\u0020valid\u0020values\u0020are\u0020\u0022\u00252\u0022\u0020and\u0020\u0022\u00253\u0022.', fieldName, nearestLowerValue, nearestUpperValue) 741 : hyva.strf('Digite\u0020um\u0020valor\u0020v\u00E1lido.\u0020Os\u0020dois\u0020valores\u0020v\u00E1lidos\u0020mais\u0020pr\u00F3ximos\u0020s\u00E3o\u0020\u0022\u00250\u0022\u0020e\u0020\u0022\u00251\u0022.', nearestLowerValue, nearestUpperValue); 742 } 743 return true; 744 }, 745 pattern(value, options, field, context) { 746 field.element.setAttribute('pattern', options); 747 field.element.checkValidity(); 748 if (field.element.validity.patternMismatch) { 749 const fieldName = getFieldName(field); 750 return fieldName 751 ? field.element.pattern 752 ? hyva.str('\u00251\u0020field\u0020must\u0020match\u0020the\u0020requested\u0020format\u003A\u0020\u00252.', fieldName, field.element.pattern) 753 : hyva.str('\u00251\u0020field\u0020must\u0020match\u0020the\u0020requested\u0020format.', fieldName) 754 : field.element.pattern 755 ? hyva.strf('Corresponda\u0020ao\u0020formato\u0020solicitado\u003A\u0020\u00250.', field.element.pattern) 756 : 'Favor\u0020corresponder\u0020ao\u0020formato\u0020solicitado.'; 757 } 758 return true; 759 }, 760 email(value, options, field, context) { 761 const rule = /^([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9,!\#\$%&'\*\+\/=\?\^_`\{\|\}~-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*@([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z0-9-]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*\.(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]){2,})$/i; 762 if (value.length > 0 && !rule.test(value)) { 763 const fieldName = getFieldName(field); 764 return fieldName 765 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020a\u0020valid\u0020email\u0020address\u0020\u0028Ex\u003A\u0020johndoe\u0040domain.com\u0029.', fieldName) 766 : 'Please\u0020enter\u0020a\u0020valid\u0020email\u0020address\u0020\u0028Ex\u003A\u0020johndoe\u0040domain.com\u0029.'; 767 } 768 return true; 769 }, 770 password(value, options, field, context) { 771 const rule = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$/; 772 if (value.length > 0 && !rule.test(value)) { 773 const fieldName = getFieldName(field); 774 return fieldName 775 ? hyva.str('\u00251\u0020field\u0020must\u0020contain\u0020at\u0020least\u0020one\u0020upper\u0020case,\u0020one\u0020lower\u0020case,\u0020one\u0020digit\u0020and\u0020one\u0020special\u0020character\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026\u002A\u002D\u0029', fieldName) 776 : 'Forne\u00E7a\u0020pelo\u0020menos\u0020uma\u0020letra\u0020mai\u00FAscula,\u0020uma\u0020letra\u0020min\u00FAscula,\u0020um\u0020d\u00EDgito\u0020e\u0020um\u0020caractere\u0020especial\u0020\u0028\u0023\u003F\u0021\u0040\u0024\u0025\u005E\u0026amp\u003B\u002A\u002D\u0029'; 777 } 778 return true; 779 }, 780 equalTo(value, options, field, context) { 781 const dependencyField = context.fields[options].element; 782 if (value !== dependencyField.value) { 783 const dependencyFieldName = 784 dependencyField.label || 785 dependencyField.title || 786 (dependencyField.labels && dependencyField.labels[0] && dependencyField.labels[0].innerText) || 787 dependencyField.name, 788 fieldName = getFieldName(field); 789 return fieldName
790 ? hyva.str('\u00251\u0020field\u0020value\u0020must\u0020be\u0020the\u0020same\u0020as\u0020\u0022\u00252\u0022.', fieldName, dependencyFieldName) 791 : hyva.strf('Esse\u0020valor\u0020de\u0020campo\u0020deve\u0020ser\u0020igual\u0020a\u0020\u0022\u00250\u0022.', dependencyFieldName); 792 } 793 return true; 794 } 795 }; 796 797 function raceSome(promises, pred) { 798 return new Promise((resolve, reject) => { 799 800 if (promises.length === 0) { 801 return resolve(); 802 } 803 804 let settled = false, nDone = 0; 805 806 const resolveIf = v => { 807 if (!settled && (pred(v) || ++nDone === promises.length)) { 808 settled = true; 809 resolve(v); 810 } 811 return v; 812 } 813 814 promises.map(promise => { 815 promise.then(resolveIf).catch(reason => { 816 settled = true; 817 reject(reason) 818 }); 819 return promise; 820 }); 821 }); 822 } 823 824 const INPUT_ATTRIBUTE_RULES = {min: 'min', max: 'max', required: 'required', minlength: 'minlength', maxlength: 'maxlength', step: 'step', pattern: 'pattern'} 825 const INPUT_TYPE_RULES = {email: 'email'} 826 827 function getRules(element) { 828 let rules = {}; 829 Object.keys(INPUT_ATTRIBUTE_RULES).forEach(attrName => { 830 if (element.hasAttribute(attrName)) { 831 rules[INPUT_ATTRIBUTE_RULES[attrName]] = element.getAttribute(attrName); 832 } 833 }) 834 if (INPUT_TYPE_RULES[element.type]) { 835 rules[INPUT_TYPE_RULES[element.type]] = true; 836 } 837 838 if (element.dataset.validate) { 839 try { 840 Object.assign(rules, JSON.parse(element.dataset.validate)); 841 } catch (error) { 842 console.error('Validator error. Cannot parse data-validate attribute of element:\n', element); 843 } 844 } 845 846 return rules; 847 } 848 849 function isInvalidRuleResult(ruleState) { 850 return typeof ruleState === 'string' || !ruleState || (ruleState.type && ruleState.content); 851 } 852 853 async function runValidateFn(rule, options, value, field) { 854 return formValidationRules[rule](value, options, field, this); 855 } 856 857 function generateId() { 858 let id; 859 do { 860 id = `${this.idPrefix}-${++this.idSeq}`; 861 } while (document.getElementById(id)); 862 return id; 863 } 864 865 function isVisible(element) { 866 const el = element.type !== 'hidden' ? element : (element.parentElement || {}); 867 return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length) 868 } 869 870 function elementWillValidate(element) { 871 return (element.willValidate || element.type === 'hidden') 872 && element.tagName !== 'BUTTON' 873 && element.disabled === false 874 && !(element.tagName === 'INPUT' && element.type === 'submit') 875 && (element.hasAttribute('data-validate-hidden') || isVisible(element)) 876 } 877 878 function createMessageContainer(el, fieldWrapperClassName) { 879 if (! el.parentElement) { 880 return; 881 } 882 const refocus = document.activeElement === el; 883 const wrapper = document.createElement('div'); 884 wrapper.classList.add.apply(wrapper.classList, fieldWrapperClassName.split(' ')); 885 el.parentElement.insertBefore(wrapper, el); 886 wrapper.appendChild(el); 887 refocus && document.activeElement !== el && el.focus(); 888 return wrapper; 889 } 890 891 function containerNotFound(selector, el) { 892 const msg = `Cannot find message container element ${selector} of ${el.name}`; 893 console.error(msg, el); 894 throw msg; 895 } 896 897 function createTextInputFrom(el) { 898 const text = document.createElement('INPUT'); 899 text.type = 'text'; 900 text.value = el.value; 901 return text; 902 } 903 904 function classNamesToSelector(classNames) { 905 return classNames.split(' ') 906 .filter(className => className.length > 0) 907 .map(className => `.${className}`) 908 .join('') 909 } 910 911 function hasMessagesWrapper(field, messagesWrapperClassName) { 912 return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); 913 } 914
915 function getMessagesWrapper(field, messagesWrapperClassName) { 916 if (hasMessagesWrapper.call(this, field, messagesWrapperClassName)) { 917 return this.getMessageContainer(field).querySelector(classNamesToSelector(messagesWrapperClassName)); 918 } 919 920 const msgWrapper = document.createElement('ul'); 921 const msgId = generateId.call(this); 922 msgWrapper.id = msgId; 923 field.element.setAttribute('aria-errormessage', msgId); 924 field.element.setAttribute('aria-describedby', msgId); 925 msgWrapper.classList.add.apply(msgWrapper.classList, messagesWrapperClassName.split(' ')); 926 if (field.validateOnChange) { 927 msgWrapper.setAttribute('aria-live', 'polite'); 928 } 929 this.getMessageContainer(field).appendChild(msgWrapper); 930 931 return msgWrapper; 932 } 933 934 function getCheckedValues(field) { 935 const name = field.element.name.replace(/([\\"])/g, '\\$1'); 936 const elements = field.element.form.querySelectorAll('input[name="' + name + '"]:checked'); 937 return Array.from(elements).map(el => el.value); 938 } 939 940 function escapeHtml(s) { 941 const div = document.createElement('div') 942 div.innerText = s; 943 return div.innerHTML; 944 } 945 946 947 function formValidation(form, options = {}) { 948 const formElement = form || this.$el; 949 950 if (formElement.dataset && formElement.dataset.options) { 951 try { 952 options = Object.assign(options, JSON.parse(formElement.dataset.options || '{}')); 953 } catch (e) { 954 throw new Error('Cannot read the form options from the data-options attribute: not valid JSON'); 955 } 956 } 957 958 // Disable browser default validation 959 if (formElement.tagName === 'FORM') { 960 formElement.setAttribute('novalidate', ''); 961 } else { 962 console.error('formValidation can be initialized only on FORM element', formElement); 963 return; 964 } 965 966 options = Object.assign({ 967 fieldWrapperClassName: 'field field-reserved', 968 messagesWrapperClassName: 'messages', 969 validClassName: 'field-success', 970 invalidClassName: 'field-error', 971 pageMessagesWrapperSelector: null, 972 scrollToFirstError: true, 973 }, options || {}); 974 975 return { 976 state: { 977 valid: false, 978 }, 979 fields: {}, 980 idSeq: 0, 981 idPrefix: formElement.id || 'vld-msg', 982 setupFields(elements) { 983 this.fields = {}; 984 Array.from(elements).forEach(element => { 985 if (elementWillValidate(element)) { 986 this.setupField(element); 987 } 988 }); 989 }, 990 setupField(element) { 991 if (! element) return; 992 const onChange = !!element.dataset.onChange; 993 if (elementWillValidate(element)) { 994 const rules = getRules(element); 995 if (Object.keys(rules).length > 0) { 996 if (this.fields[element.name]) { 997 Object.assign(this.fields[element.name].rules, rules); 998 } else { 999 this.fields[element.name] = { 1000 element, 1001 rules: rules, 1002 validateOnChange: onChange, 1003 state: { 1004 valid: null, 1005 rules: {} 1006 } 1007 } 1008 } 1009 } 1010 } else { 1011 console.error('Element will not validate', element); 1012 } 1013 }, 1014 onSubmit(event) { 1015 if (event.target.tagName === 'FORM') { 1016 event.preventDefault(); 1017 1018 this.validate() 1019 .then(() => event.target.submit()) 1020 .catch(invalidElements => {}); 1021 } 1022 }, 1023 onChange(event) {
1024 event.target.dataset.onChange = 'true'; 1025 if (!Object.keys(this.fields).length) { 1026 this.setupFields(formElement.elements); 1027 } 1028 if (!Object.keys(this.fields).includes(event.target.name)) { 1029 this.setupField(event.target); 1030 } 1031 const field = this.fields[event.target.name]; 1032 1033 this.validateField(field); 1034 field && field.element.removeAttribute('data-on-change') 1035 }, 1036 validateSafe() { 1037 return new Promise(resolve => this.validate().then(() => resolve(true)).catch(() => {})) 1038 }, 1039 validate() { 1040 if (!Object.keys(this.fields).length || !Object.keys(this.fields).length !== formElement.elements.length) { 1041 this.setupFields(formElement.elements); 1042 } 1043 return new Promise(async (resolve, reject) => { 1044 if (formElement.elements) { 1045 await raceSome(this.validateFields(), result => result !== true) 1046 const invalidFields = Object.values(this.fields).filter(field => !field.state.valid); 1047 this.state.valid = invalidFields.length === 0; 1048 if (this.state.valid) { 1049 resolve(); 1050 } else { 1051 if (options.scrollToFirstError && invalidFields.length > 0) { 1052 invalidFields[0].element.focus() 1053 invalidFields[0].element.select && invalidFields[0].element.select(); 1054 } 1055 reject(invalidFields.map(field => field.element)); 1056 } 1057 } 1058 }); 1059 }, 1060 validateFields() { 1061 const fields = Object.values(this.fields); 1062 1063 fields.forEach(field => { 1064 this.getMessageContainer(field).classList.remove(options.validClassName, options.invalidClassName) 1065 }); 1066 return fields.map(field => this.validateField(field)) 1067 }, 1068 validateField(field) { 1069 if (! field || ! elementWillValidate(field.element)) { 1070 return new Promise(resolve => resolve(true)) 1071 } 1072 1073 let value; 1074 if (field.element.type === 'checkbox') { 1075 value = getCheckedValues(field); 1076 } else if (field.element.type === 'radio') { 1077 value = getCheckedValues(field)[0] || undefined; 1078 } else if (field.element.tagName === 'SELECT' && field.element.multiple) { 1079 value = Array.from(field.element.selectedOptions).map(opt => opt.value); 1080 } else { 1081 value = field.element.value; 1082 } 1083 1084 const rules = field.rules || {}; 1085 1086 field.state.valid = true; 1087 this.showFieldState(field); 1088 1089 1090 const fieldValidations = Object.keys(rules).filter(rule => formValidationRules[rule]).map(async rule => { 1091 return runValidateFn.call(this, rule, rules[rule], value, field).then(result => { 1092 field.state.rules[rule] = result; 1093 return result; 1094 }) 1095 }); 1096 1097 return new Promise(resolve => { 1098 Promise.all(fieldValidations).then(results => { 1099 field.state.valid = !elementWillValidate(field.element) || rules.length === 0 || !results.some(isInvalidRuleResult)
1100 this.showFieldState(field); 1101 resolve(field.state.valid); 1102 }) 1103 }); 1104 }, 1105 getMessagesByField(field) { 1106 const messages = []; 1107 const invalidRules = Object.keys(field.state.rules).filter(rule => isInvalidRuleResult(field.state.rules[rule])); 1108 1109 field.rules && Object.keys(field.rules).forEach((rule) => { 1110 if (invalidRules.includes(rule)) { 1111 const customMessage = field.element.getAttribute('data-msg-' + rule); 1112 const message = customMessage ? customMessage : field.state.rules[rule]; 1113 const ruleOptions = JSON.parse(JSON.stringify(field.rules[rule])); 1114 1115 if (typeof message === 'undefined' || message === null || (typeof message !== 'string' && ! message.type)) { 1116 messages.push(hyva.strf('Validation rule "%0" failed.', rule)); 1117 } else if (Array.isArray(ruleOptions)) { 1118 ruleOptions.unshift(message.type ? message.content : message); 1119 const content = hyva.strf.apply(null, ruleOptions); 1120 messages.push(message.type ? {type: message.type, content} : content); 1121 } else { 1122 const content = hyva.strf(message.type ? message.content : message, ruleOptions) 1123 messages.push(message.type ? {type: message.type, content} : content); 1124 } 1125 } 1126 }); 1127 return messages; 1128 }, 1129 /** @deprecated */ 1130 getFieldWrapper(field) { 1131 return this.getMessageContainer(field) 1132 }, 1133 getMessageContainer(field) { 1134 let container; 1135 const pageSelector = field.element.getAttribute('data-validation-container') || options.pageMessagesContainerSelector; 1136 if (pageSelector) { 1137 container = document.querySelector(pageSelector) 1138 || containerNotFound(pageSelector, field.element) 1139 } else { 1140 const containerSelector = classNamesToSelector(options.fieldWrapperClassName); 1141 container = field.element.closest(containerSelector) 1142 || createMessageContainer(field.element, options.fieldWrapperClassName) 1143 || containerNotFound(containerSelector, field.element); 1144 } 1145 1146 return container; 1147 }, 1148 showFieldState(field) { 1149 const container = this.getMessageContainer(field), 1150 hasErrorMessages = hasMessagesWrapper.call(this, field, options.messagesWrapperClassName), 1151 messages = this.getMessagesByField(field).map(m => { 1152 return m.type !== 'html' ? escapeHtml(m.type ? m.content : m) : m.content; 1153 }); 1154 container.classList.toggle(options.validClassName, field.state.valid && ! hasErrorMessages); 1155 container.classList.toggle(options.invalidClassName, !field.state.valid || hasErrorMessages); 1156 this.createHtmlErrorMessage(field, messages); 1157 1158 if (field.state.valid) { 1159 field.element.removeAttribute('aria-invalid'); 1160 } else { 1161 field.element.setAttribute('aria-invalid', 'true'); 1162 if (! document.activeElement) { 1163 field.element.focus(); 1164 } 1165 } 1166 }, 1167 removeMessages(field, messagesClass) { 1168 if (! hasMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName)) { 1169 return; 1170 } 1171 1172 const msgWrapper = getMessagesWrapper.call(this, field, messagesClass || options.messagesWrapperClassName); 1173 const messages = msgWrapper.querySelectorAll(`[data-msg-field='${field.element.name}']`);
1174 Array.from(messages).forEach(msg => msg.remove()); 1175 if (msgWrapper && msgWrapper.childElementCount === 0) { 1176 field.element.removeAttribute('aria-errormessage'); 1177 field.element.removeAttribute('aria-describedby'); 1178 msgWrapper.remove(); 1179 } 1180 }, 1181 createErrorMessage(field, messages) { 1182 const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) 1183 this.createHtmlErrorMessage(field, htmlMessages); 1184 }, 1185 createHtmlErrorMessage(field, messages) { 1186 this.removeMessages(field, options.messagesWrapperClassName); 1187 field.element.removeAttribute('aria-errormessage'); 1188 field.element.removeAttribute('aria-describedby'); 1189 1190 if (!field.state.valid) { 1191 const msgWrapper = this.addHtmlMessages(field, options.messagesWrapperClassName, messages); 1192 field.element.setAttribute('aria-errormessage', msgWrapper.id); 1193 field.element.setAttribute('aria-describedby', msgWrapper.id); 1194 } 1195 }, 1196 /** @deprecated */ 1197 createMessage(field, message) { 1198 return this.addMessages(field, options.messagesWrapperClassName, message); 1199 }, 1200 addMessages(field, messagesClass, messages) { 1201 const htmlMessages = (Array.isArray(messages) ? messages : [messages]).map(escapeHtml) 1202 return this.addHtmlMessages(field, messagesClass, htmlMessages); 1203 }, 1204 addHtmlMessages(field, messagesClass, htmlMessages) { 1205 const msgWrapper = getMessagesWrapper.call(this, field, messagesClass); 1206 1207 (Array.isArray(htmlMessages) ? htmlMessages : [htmlMessages]).forEach((htmlMessage) => { 1208 const li = document.createElement('li'); 1209 li.innerHTML = htmlMessage; 1210 li.setAttribute('data-msg-field', field.element.name); 1211 msgWrapper.appendChild(li); 1212 }); 1213 1214 return msgWrapper; 1215 }, 1216 setField(name, value) { 1217 this.fields[name].element.value = value; 1218 this.fields[name].element.dispatchEvent((new Event('input'))); 1219 this.validateField(this.fields[name]); 1220 } 1221 } 1222 } 1223 1224 function getFieldName(field) { 1225 const fieldName = field.element?.getAttribute('title') 1226 || document.querySelector(`label[for="${field.element?.id}"]`)?.innerText; 1227 1228 return fieldName 1229 ? fieldName.trim() 1230 : ''; 1231 } 1232 1233 hyva.formValidation = formValidation; 1234 hyva.formValidation.rules = formValidationRules; 1235 hyva.formValidation.setInputAttributeRuleName = (attrName, ruleName) => INPUT_ATTRIBUTE_RULES[attrName] = ruleName || attrName; 1236 hyva.formValidation.setInputTypeRuleName = (typeName, ruleName) => INPUT_TYPE_RULES[typeName] = ruleName || typeName; 1237 hyva.formValidation.addRule = (name, validator) => formValidationRules[name] = validator; 1238 hyva.formValidation.getFieldName = getFieldName; 1239 }(window.hyva = window.hyva || {})); 1240 1241 window.addEventListener('alpine:init', () => { 1242 Alpine.data('hyva.formValidation', hyva.formValidation); 1243 Alpine.data('hyva.formValidation($el)', hyva.formValidation); 1244 }, {once: true}); 1245</script>
vendor: 1 bytes, line 1245
1245
1246<script> 1247 // https://github.com/Fischer-L/autoComplt 1248 !function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.autoComplt=t.returnExports=e()}(this,function(){"use strict";Array.prototype.indexOf||(Array.prototype.indexOf=function(t,e){if(void 0===this||null===this)throw new TypeError('"this" is null or not defined');var o=this.length>>>0;for(e=+e||0,Math.abs(e)===1/0&&(e=0),0>e&&(e+=o,0>e&&(e=0));o>e;e++)if(this[e]===t)return e;return-1});var t=function(){var t=-1;if("Microsoft Internet Explorer"==navigator.appName){var e=navigator.userAgent,o=new RegExp("MSIE ([0-9]{1,}[.0-9]{0,})");null!=o.exec(e)&&(t=+RegExp.$1)}return-1===t?NaN:t},e=function(){var e=window.navigator.userAgent.toLowerCase();return e.search(/mobile|windows phone/)>=0?i.modeMobile:t()<=9?i.modePC:o().windowWidth>i.modeMobileW?i.modePC:i.modeMobile},o=function(){return window.innerWidth?{windowWidth:window.innerWidth,windowHeight:window.innerHeight}:document.documentElement.offsetHeight?{windowWidth:document.documentElement.offsetWidth,windowHeight:document.documentElement.offsetHeight}:document.body.offsetHeight?{windowWidth:document.body.offsetWidth,windowHeight:document.body.offsetHeight}:document.documentElement.clientHeight?{windowWidth:document.documentElement.clientWidth,windowHeight:document.documentElement.clientHeight}:document.body.clientHeight?{windowWidth:document.body.clientWidth,windowHeight:document.body.clientHeight}:{windowWidth:-1,windowHeight:-1}},i=function(t){return i=t,t.modePC="modePC",t.modeMobile="modeMobile",t.modeMobileW=768,t.autoCompltListClass="autoComplt-list",t.autoCompltHintClass="autoComplt-hint",t.autoCompltHintSelectedClass="autoComplt-hint-selected",t.maxHintNum=e()===i.modePC?10:5,t.autoCompltDelay=250,t.hiddenArg_close_list_n_make_final_selection="hiddenArg_close_list_n_make_final_selection",t.listStatus={attr:"data-listStatus",open:"open"},t.keyCode={up:38,down:40,esc:27,enter:13},t.defaultStyles={autoCompltList:{maxHeight:"none",border:"1px solid #aaa",padding:"0",margin:"0",zIndex:99,overflowX:"hidden",overflowY:"auto",display:"none",position:"absolute",backgroundColor:"#fff"},autoCompltHint:{height:"1.5em",padding:e()===i.modePC?"2px 6px 2px 10px":"6px 6px 6px 10px",margin:"6px 0",overflow:"hidden",listStyleType:"none",color:"#000",backgroundColor:"#fff",cursor:"default",fontSize:"1em"},autoCompltHintSelected:{color:"#fff",backgroundColor:"#3399ff"}},t.adjStyleAttrs={autoCompltList:["border","maxHeight","backgroundColor"],autoCompltHint:["height","padding","margin","color","backgroundColor","fontSize"],autoCompltHintSelected:["color","backgroundColor"]},t.listenersSupported=["select"],i}({}),n=function(t){return t||(t=window.event),t.target||(t.target=t.srcElement),t.stopBubble=function(){this.cancelBubble=!0,this.stopPropoagation&&this.stopPropoagation()},t.stopDefault=function(){return this.preventDefault&&this.preventDefault(),this.returnValue=!1,!1},t},l=function(t,e,o){t.addEventListener?t.addEventListener(e,o):t.attachEvent&&t.attachEvent("on"+e,o)},s=function(t,e,o){t.removeEventListener?t.removeEventListener(e,o):t.detachEvent&&t.detachEvent("on"+e,o)},u=function(t,e){var o=null;if(window.getComputedStyle)o=window.getComputedStyle(t)[e]||null;else if(t.currentStyle){o=t.currentStyle&&t.currentStyle[e];var i,n,l=t.style;null==o&&l&&l[e]&&(o=l[e]),i=l.left,n=t.runtimeStyle&&t.runtimeStyle.left,n&&(t.runtimeStyle.left=t.currentStyle.left),l.left="fontSize"===e?"1em":o,o=l.pixelLeft+"px",l.left=i,n&&(t.runtimeStyle.left=n)}return o},a={buildElem:function(t){var e=document.createElement("DIV");return e.innerHTML=t,e.firstChild.cloneNode(!0)},buildHint:function(t,e){return"string"==typeof t&&t?(t=this.buildElem('<li class="'+i.autoCompltHintClass+'">'+t+"</li>"),t.style.height=t.style.lineHeight=e.autoCompltHint.height,t.style.padding=e.autoCompltHint.padding,t.style.margin=e.autoCompltHint.margin,t.style.overflow=e.autoCompltHint.overflow,t.style.listStyleType=e.autoCompltHint.listStyleType,t.style.color=e.autoCompltHint.color,t.style.backgroundColor=e.autoCompltHint.backgroundColor,t.style.cursor=e.autoCompltHint.cursor,t.style.fontSize=e.autoCompltHint.fontSize,t):null},buildList:function(t){var e=this.buildElem('<ul class="'+i.autoCompltListClass+'"></ul>');return e.style.maxHeight=t.autoCompltList.maxHeight,e.style.border=t.autoCompltList.border,e.style.padding=t.autoCompltList.padding,e.style.margin=t.autoCompltList.margin,e.style.zIndex=t.autoCompltList.zIndex,e.style.overflowX=t.autoCompltList.overflowX,e.style.overflowY=t.autoCompltList.overflowY,e.style.display=t.autoCompltList.display,e.style.position=t.autoCompltList.position,e.style.backgroundColor=t.autoCompltList.backgroundColor,e}},r=function(t){this.uiElem=null,this.assocInput=t,this.mouseOnList=!1,this.onMouseSelectionListener=null,this.maxHintNum=i.maxHintNum,this.styles=JSON.parse(JSON.stringify(i.defaultStyles))};r.prototype.genList=function(){if(!this.uiElem){var t=this;this.uiElem=a.buildList(this.styles),l(this.uiElem,"mouseover",function(e){e=n(e),t.isHint(e.target)&&(t.pick(e.target),t.autoScroll())}),l(this.uiElem,"mouseout",function(e){t.unpick()}),l(this.uiElem,"mousedown",function(e){t.mouseOnList=!0,setTimeout(function(){t.assocInput.focus()},50)}),l(this.uiElem,"mouseup",function(e){e=n(e),t.isHint(e.target)&&(t.pick(e.target),"function"==typeof t.onMouseSelectionListener&&t.onMouseSelectionListener())}),document.body.appendChild(this.uiElem)}},r.prototype.isHint=function(t){if(t&&"object"==typeof t&&1===t.nodeType){var e=" "+t.className+" ";return e.indexOf(" "+i.autoCompltHintClass+" ")>=0}return!1},r.prototype.putHints=function(t){var e=0;if(t instanceof Array){var o,i,n=[];for(i=Math.min(t.length,this.maxHintNum),o=0;i>o;o++)n.push(a.buildHint(t[o],this.styles)),n[n.length-1]||n.pop();if(n.length>0){var l=document.createDocumentFragment();for(o=0,e=n.length;e>o;o++)l.appendChild(n[o]);this.clearHints(),this.genList(),this.uiElem.appendChild(l)}}return e},r.prototype.clearHints=function(){this.uiElem&&(this.uiElem.innerHTML="")},r.prototype.isOpen=function(){return this.uiElem?this.uiElem.getAttribute(i.listStatus.attr)==i.listStatus.open:!1},r.prototype.open=function(){var t;if(this.uiElem&&(t=this.uiElem.querySelectorAll("."+i.autoCompltHintClass))&&t.length){var e,o;for(o=this.assocInput.getBoundingClientRect(),this.uiElem.style.top=(document.documentElement&&document.documentElement.scrollTop?document.documentElement.scrollTop:document.body.scrollTop)+o.bottom+"px",this.uiElem.style.left=o.left+"px",o=o.right-o.left-parseFloat(u(this.uiElem,"borderLeftWidth"))-parseFloat(u(this.uiElem,"borderRightWidth")),this.uiElem.style.width=o+"px",e=0,o=0;e<t.length;
1248e++)o+=parseFloat(u(t[e],"height"))+parseFloat(u(t[e],"paddingTop"))+parseFloat(u(t[e],"paddingBottom")),t[e+1]&&(o+=Math.max(parseFloat(u(t[e],"marginBottom")),parseFloat(u(t[e+1],"marginTop"))));o+=parseFloat(u(t[0],"marginTop"))+parseFloat(u(t[t.length-1],"marginBottom")),this.uiElem.style.height=o+1+"px",this.uiElem.setAttribute(i.listStatus.attr,i.listStatus.open),this.uiElem.style.display="block"}},r.prototype.close=function(){this.uiElem&&(this.mouseOnList=!1,this.uiElem.parentNode.removeChild(this.uiElem),this.uiElem=null)},r.prototype.autoScroll=function(){var t=this.getPicked();if(t){var e,o=0,i=0,n=t.clientHeight,l=parseFloat(u(t,"marginTop")),s=parseFloat(u(t,"marginBottom"));for(e=t.previousSibling,i=n+(e?Math.max(l,s):l);e;)o+=n,e=e.previousSibling,o+=e?Math.max(l,s):l;(this.uiElem.clientHeight+this.uiElem.scrollTop-o<i||o-this.uiElem.scrollTop<i)&&(this.uiElem.scrollTop=o)}},r.prototype.pick=function(t){if(this.uiElem){var e=null;if(this.isHint(t))e=t;else if("number"==typeof t&&(t>=0||-1===t)){var o=this.uiElem.querySelectorAll("."+i.autoCompltHintClass);o.length>0&&(e=+t,e=-1===e||e>o.length-1?o.length-1:e,e=o[e])}null!==e&&(this.unpick(),e.className+=" "+i.autoCompltHintSelectedClass,e.style.color=this.styles.autoCompltHintSelected.color,e.style.backgroundColor=this.styles.autoCompltHintSelected.backgroundColor)}},r.prototype.unpick=function(){if(this.uiElem){var t=this.getPicked();t&&(t.className=i.autoCompltHintClass,t.style.color=this.styles.autoCompltHint.color,t.style.backgroundColor=this.styles.autoCompltHint.backgroundColor)}},r.prototype.getPicked=function(){return this.uiElem?this.uiElem.querySelector("."+i.autoCompltHintSelectedClass)||null:null};var c={enable:function(t,o){if(t&&"object"==typeof t&&"string"==typeof t.tagName&&"input"==t.tagName.toLowerCase()&&"text"==t.type&&1===t.nodeType&&!t.autoComplt){t.autoComplt={};var u=i.autoCompltDelay,a=!0,c="",p=null,m=null,d=new r(t),f=function(){if(t.value.length>0&&a&&"function"==typeof p&&c!==t.value){var e={that:t,compltTarget:c=t.value,compltTargetMatchCurrentTarget:function(){return e.compltTarget===c},call:function(){e.compltTargetMatchCurrentTarget()&&p.call(e.that,e.compltTarget,e.openHint)},openHint:function(t){e.compltTargetMatchCurrentTarget()&&(d.putHints(t)?d.open():e.that.autoComplt.close())}};setTimeout(e.call,u)}},h=function(){if(a){var e=d.getPicked();e?t.value=e.innerHTML:t.value=c}},y=function(e){d.mouseOnList?(t.focus(),d.mouseOnList=!1):d.isOpen()&&t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection)},g=function(o){if(e()!==i.modeMobile&&(o=n(o),a))if("keydown"!=o.type||!d.isOpen()||o.keyCode!==i.keyCode.up&&o.keyCode!==i.keyCode.down){if("keyup"==o.type){var l=!1;switch(o.keyCode){case i.keyCode.up:case i.keyCode.down:d.isOpen()||(l=!0);break;case i.keyCode.esc:d.isOpen()&&(t.value=c,t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection));break;case i.keyCode.enter:d.isOpen()&&(h(),t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection));break;default:l=!0}l&&(t.value.length>0?f():t.autoComplt.close())}}else{var s=d.getPicked();o.keyCode===i.keyCode.up?s?s.previousSibling?d.pick(s.previousSibling):d.unpick():d.pick(-1):o.keyCode===i.keyCode.down&&(s?s.nextSibling?d.pick(s.nextSibling):d.unpick():d.pick(0)),d.autoScroll(),h()}},C=function(o){e()!==i.modePC&&(t.value.length>0?f():t.autoComplt.close())},H=function(e){null!=m&&"function"==typeof m[e]&&m[e].call(t)};return t.autoComplt.setHintsFetcher=function(t){return null===t||"function"==typeof t?(p=t,!0):!1},t.autoComplt.setListener=function(t,e){return(null===e||"function"==typeof e)&&i.listenersSupported.indexOf(t)>=0?(null==m&&(m={}),m[t]=e,!0):!1},t.autoComplt.setStyles=function(t,e){var o,n,l=!1;switch(t){case i.autoCompltListClass:o=d.styles.autoCompltList,n=i.adjStyleAttrs.autoCompltList;break;case i.autoCompltHintClass:o=d.styles.autoCompltHint,n=i.adjStyleAttrs.autoCompltHint;break;case i.autoCompltHintSelectedClass:o=d.styles.autoCompltHintSelected,n=i.adjStyleAttrs.autoCompltHintSelected}if(e instanceof Object&&o&&n)for(var s=0;s<n.length;s++)("string"==typeof e[n[s]]||"number"==typeof e[n[s]])&&(l||(l={}),l[n[s]]=o[n[s]]=e[n[s]]);return l},t.autoComplt.config=function(t){var e=!1;if(t instanceof Object){var o;void 0!==t.delay&&(o=Math.floor(t.delay))>0&&(e||(e={}),u=e.delay=o),void 0!==t.maxHintNum&&(o=Math.floor(t.maxHintNum))>0&&(e||(e={}),d.maxHintNum=e.maxHintNum=o)}return e},t.autoComplt.close=function(){c="",d.close(),a&&""!==t.value&&arguments[0]===i.hiddenArg_close_list_n_make_final_selection&&H("select")},t.autoComplt.enable=function(){a=!0},t.autoComplt.disable=function(){a=!1,this.close()},t.autoComplt.destroy=function(){s(t,"blur",y),s(t,"keyup",g),s(t,"keydown",g),this.disable(),delete t.autoComplt},d.onMouseSelectionListener=function(){h(),t.autoComplt.close(i.hiddenArg_close_list_n_make_final_selection)},l(t,"blur",y),l(t,"keyup",g),l(t,"keydown",g),l(t,"input",C),o instanceof Object&&(t.autoComplt.config(o),t.autoComplt.setHintsFetcher(o.hintsFetcher)),t}return null}};return c}); 1249</script>
1249 1250<div class="page-wrapper"><div class="before-header-container2"><div class="widget block block-static-block"> 1251 </div> 1252</div><header class="page-header"><a class="action skip sr-only focus:not-sr-only focus:absolute focus:z-40 focus:bg-white 1253 contentarea" 1254 href="#contentarea"> 1255 <span> 1256 Skip to Content </span> 1257</a> 1258</header><main id="maincontent" class="page-main"><div id="contentarea" tabindex="-1"></div> 1259<div class="page messages">
1259<script> 1260 function initMessages() { 1261 "use strict"; 1262 return { 1263 messages: window.mageMessages || [], 1264 isEmpty() { 1265 return this.messages.reduce( 1266 function (isEmpty, message) { 1267 return isEmpty && message === undefined 1268 }, true 1269 ) 1270 }, 1271 removeMessage(messageIndex) { 1272 this.messages[messageIndex] = undefined; 1273 }, 1274 addMessages(messages, hideAfter) { 1275 messages.map((message) => { 1276 this.messages = this.messages.concat(message); 1277 if (hideAfter === undefined && message.type === 'success' && window.defaultSuccessMessageTimeout) { 1278 hideAfter = window.defaultSuccessMessageTimeout; 1279 } 1280 if (hideAfter) { 1281 this.setHideTimeOut(this.messages.length - 1, hideAfter); 1282 } 1283 }); 1284 }, 1285 setHideTimeOut(messageIndex, hideAfter) { 1286 if (hideAfter == false) { 1287 return; 1288 } 1289 setTimeout((messageIndex) => { 1290 this.removeMessage(messageIndex); 1291 }, hideAfter, messageIndex); 1292 }, 1293 eventListeners: { 1294 ['@messages-loaded.window'](event) { 1295 this.addMessages(event.detail.messages, event.detail.hideAfter) 1296 }, 1297 ['@private-content-loaded.window'](event) { 1298 const data = event.detail.data; 1299 if ( 1300 data.messages && 1301 data.messages.messages && 1302 data.messages.messages.length 1303 ) { 1304 this.addMessages(data.messages.messages, event.detail.hideAfter); 1305 } 1306 }, 1307 ['@clear-messages.window']() { 1308 this.messages = []; 1309 } 1310 } 1311 } 1312 } 1313</script>
1313 1314<section id="messages" 1315 x-data="initMessages()" 1316 x-bind="eventListeners" 1317 aria-live="assertive" 1318 role="alert" 1319> 1320 <template x-if="!isEmpty()"> 1321 <div> 1322 <div class="backdrop z-40"></div> 1323 <template x-for="(message, index) in messages" :key="index"> 1324 <div> 1325 <template x-if="message"> 1326 <div 1327 class="fixed top-1/2 left-1/2 -translate-y-1/2 -translate-x-1/2 z-50 flex flex-col items-center gap-4 md:gap-0 md:items-end mx-auto w-full max-w-full md:max-w-[520px]"> 1328 <button 1329 type="button" 1330 class="w-12 h-12 rounded-full flex items-center justify-center text-primary bg-white md:-mr-12 md:-mb-2" 1331 aria-label="Fechar mensagem" 1332 @click.prevent="removeMessage(index)" 1333 > 1334 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6" width="18" height="18" aria-hidden="true"> 1335 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 1336</svg> 1337 </button> 1338 <div 1339 class="message-info w-full text-center py-6 px-4 lg:py-20 lg:px-10 bg-white rounded-2xl" 1340 :class="message.type" 1341 :ui-id="'message-' + message.type"> 1342 <div class="message-icon block mx-auto mb-7 w-[98px] h-[98px] p-6 rounded-3xl"> 1343 <template x-if="message.type === 'success'"> 1344 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-12 h-12 text-white" width="48" height="48" aria-hidden="true"> 1345 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 1346</svg> 1347 </template> 1348 <template x-if="message.type === 'error'"> 1349 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-12 h-12 text-white" width="48" height="48" aria-hidden="true"> 1350 <path stroke-linecap="round" stroke-linejoin="round" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"/> 1351</svg> 1352 </template> 1353 1354 <template x-if="message.type === 'info'"> 1355 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-12 h-12 text-white" width="48" height="48" aria-hidden="true"> 1356 <path stroke-linecap="round" stroke-linejoin="round" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 1357</svg> 1358 </template> 1359 <template x-if="message.type === 'warning'"> 1360 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-12 h-12 text-white" width="48" height="48" aria-hidden="true"> 1361 <path stroke-linecap="round" stroke-linejoin="round" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/> 1362</svg> 1363 </template> 1364 1365 <template x-if="message.type === 'forgot_password'"> 1366 <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 47 47" fill="currentColor" class="w-12 h-12 text-white" aria-hidden="true"> 1367 <path d="M9.518 9.164c-1.046.044-1.234.073-1.706.269-.998.414-1.917 1.137-2.471 1.945-.383.558-.711 1.275-.803 1.756-.12.627-.197 19.492-.085 20.878.093 1.149.304 1.76.894 2.587.709.992 1.586 1.645 2.788 2.074l.74.265 6.549-.023c7.359-.025 6.827.02 7.29-.619.478-.659.34-1.469-.333-1.956l-.315-.228-3.102-.007a556.578 556.578 0 0 1-6.513-.061l-3.411-.055-.36-.212c-.415-.243-.923-.79-1.128-1.214-.132-.272-.143-.698-.168-6.089-.015-3.188.001-7.042.035-8.564l.062-2.768 7.763 5.098 7.764 5.098h.984l7.756-5.093c4.266-2.801 7.775-5.073 7.799-5.049.024.024.065 2.06.092 4.525.053 4.893.044 4.798.517 5.24a1.41 1.41 0 0 0 1.936 0c.514-.486.483-.024.478-7.103-.004-4.937-.028-6.505-.104-6.776-.054-.194-.242-.652-.418-1.017-.263-.55-.441-.786-1.032-1.373-.764-.758-1.283-1.084-2.255-1.414l-.562-.191-13.753.014c-7.564.007-14.282.036-14.928.063m24.283 2.811 4.073.049.509.279c.409.223.576.376.846.776.276.408.319.517.235.598-.056.056-3.671 2.444-8.033 5.309L23.5 24.194l-7.461-4.902-7.986-5.244c-.289-.188-.544-.373-.567-.409-.078-.127.553
1367-.988.884-1.207.634-.418.488-.405 5.025-.449 6.301-.06 15.768-.064 20.406-.008m6.571 20.469c-.36.272-1.133 1.009-4.202 4.006l-2.879 2.811-1.37-1.332c-.753-.732-1.535-1.441-1.736-1.575-1.042-.69-2.488.172-2.267 1.352.07.371.944 1.344 2.834 3.155 2.02 1.936 1.917 1.858 2.503 1.895l.489.031.732-.655c.402-.36 2.326-2.235 4.274-4.167 3.537-3.507 3.866-3.879 3.862-4.365-.003-.295-.4-.949-.696-1.148-.375-.252-1.216-.256-1.544-.008" fill-rule="evenodd"/> 1368</svg> 1369 </template> 1370 <template x-if="message.type === 'password_reset'"> 1371 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-12 h-12 text-white" width="48" height="48" aria-hidden="true"> 1372 <path stroke-linecap="round" stroke-linejoin="round" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"/> 1373</svg> 1374 </template> 1375 1376 </div> 1377 <div x-html="message.text"></div> 1378 </div> 1379 </div> 1380 </template> 1381 </div> 1382 </template> 1383 </div> 1384 </template> 1385</section> 1386</div><div class="page-title-wrapper sr-only text-3xl"> 1387 <h1 class="page-title" 1388 > 1389 <span class="base" data-ui-id="page-title-wrapper" >Customer Login</span> </h1> 1390 1391 </div> 1392<div class="columns"><div class="column main"> 1393<div x-data="initWarmerTrack" @private-content-loaded.window="sendStats"></div> 1394
1395<script> 1396 document.addEventListener('alpine:init', () => { 1397 Alpine.data('initWarmerTrack', () => ({ 1398 ...{"pageType":"customer_account_login","url":"https:\/\/stata-brazil.com\/cache_warmer\/track\/","cookieName":"mst-cache-warmer-track","cookieValue":null}, 1399 1400 sendStats: function () { 1401 var originCookieValue = hyva.getCookie(this.cookieName); 1402 1403 document.cookie = this.cookieName + '=' + window.performance.timing.fetchStart; 1404 1405 if (this.cookieValue === null && originCookieValue === null) { 1406 return; //we don't know cached or not now 1407 } 1408 1409 var uri = window.location.href; 1410 var ttfb = window.performance.timing.responseStart - window.performance.timing.fetchStart; 1411 var isHit = this.cookieValue != originCookieValue ? 1 : 0; 1412 1413 fetch(this.url + '?' + (new URLSearchParams({ 1414 uri: uri, 1415 ttfb: ttfb, 1416 isHit: isHit 1417 }))).then(response => response.json()); 1418 } 1419 })); 1420 }); 1421</script>
1421 1422<span data-mage-init='{"emailCapture": {"url": "https://stata-brazil.com/event/action/capture/"}}'></span> 1423<div data-mage-init='{"Mirasvit_OptimizeJs\/js\/bundle\/track":{"callbackUrl":"https:\/\/stata-brazil.com\/optimizeJs\/bundle\/track\/","checkUrl":"https:\/\/stata-brazil.com\/optimizeJs\/bundle\/check\/","layout":"customer_account_login","mode":"background","locale":"pt_BR","theme":"TimberlakeHyva\/timberlake"}}'></div> 1424 1425<section class="customer-authentication"> 1426 <div class="pb-20"> 1427 <!--Logo--> 1428 <div class="brightness-0 invert flex justify-center lg:justify-start pt-[26px] pb-[22px] lg:pt-16 lg:pb-24"> 1429 <div class="order-1 "> 1430 <a 1431 class="flex items-center justify-center max-w-[206px] max-h-[34px]" 1432 href="https://stata-brazil.com/" 1433 aria-label="Ir para a página inicial" 1434 > 1435 <img fetchpriority="high" 1436 class="main-logo" 1437 src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/stata-logo.png" 1438 alt="Stata Brazil" 1439 width="226" 1440 height="76" 1441 /> 1442 1443 <img fetchpriority="high" 1444 class="secondary-logo" 1445 src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/stata-logo.png" 1446 alt="Stata Brazil" 1447 width="226" 1448 height="76" 1449 /> 1450 1451 </a> 1452</div> 1453 </div> 1454 <div class="lg:flex lg:gap-2.5 xl:gap-5"> 1455 <div> 1456 <h2 class="text-white mb-6 lg:mb-0 max-lg:text-2xl text-center lg:text-left pt-16"> 1457 Cutting Edge Solutions in Data Science,Econometrics & Forecasting </h2> 1458 </div> 1459 <div class="w-full lg:max-w-[460px]" 1460 x-data="{ activeTab: 0 }"> 1461 <div class="bg-white rounded-t-3xl rounded-b-sm"> 1462 <div class="pt-6 px-4 pb-4 text-center lg:pt-10 lg:px-6"> 1463 <h5 class="pb-1"> 1464 Welcome To Timberlake </h5> 1465 <p class="text-sm text-secondary"> 1466 Log in or create an account below </p> 1467 </div> 1468 <h2 class="sr-only">Authentication Tabs</h2> 1469 <nav aria-label="Sign In and Sign Up Tabs"> 1470 <ul class="flex items-center justify-center gap-2.5" 1471 role="tablist"> 1472 <li class="basis-1/2" 1473 role="presentation"> 1474 <button class="w-full pb-2.5 px-2 font-bold relative" 1475 role="tab" 1476 aria-controls="Sign In" 1477 @click="activeTab = 0" 1478 :aria-selected="activeTab === 0" 1479 :class="{ 1480 'text-brightBlue after:w-full after:h-1 after:rounded-sm after:bg-brightBlue after:absolute after:bottom-0 after:left-0': activeTab === 0 1481 }"> 1482 Sign In </button> 1483 </li> 1484 <li class="basis-1/2" 1485 role="presentation"> 1486 <button class="w-full pb-2.5 px-2 font-bold relative" 1487 role="tab" 1488 aria-controls=" Sign Up" 1489 @click="activeTab = 1" 1490 :aria-selected="activeTab === 1" 1491 :class="{ 1492 'text-brightBlue after:w-full after:h-1 after:rounded-sm after:bg-brightBlue after:absolute after:bottom-0 after:left-0': activeTab === 1 1493 }"> 1494 Sign Up </button> 1495 </li> 1496 </ul> 1497 </nav> 1498 </div> 1499 <div class="bg-white rounded-t-sm rounded-b-3xl mt-px py-6 px-4 lg:p-10"> 1500 <div x-show.transition.in.opacity.duration.600="activeTab === 0" 1501 role="tabpanel" 1502 aria-labelledby=" Sign In Tab"> 1503 <div id="customer-login-container" class="login-container"><form class="form form-login" 1504 action="https://stata-brazil.com/customer/account/loginPost/referer/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvaW5kZXgv/" 1505 method="post"
1506 x-data="initCustomerLoginForm()" 1507 @submit.prevent="submitForm()" 1508 id="customer-login-form"> 1509 <input name="form_key" type="hidden" value="MKRqwFeJZFPuKz00" /> <fieldset class="fieldset login"> 1510 <div class="field email required pb-2"> 1511 <div class="control"> 1512 <input name="login[username]" 1513 class="form-input peer" 1514 required 1515 value="" 1516 autocomplete="off" 1517 id="login-email" 1518 type="email" 1519 placeholder="Email" 1520 title="Email" 1521 /> 1522 <label class="label" for="login-email"> 1523 <span>Email</span> 1524 </label> 1525 </div> 1526 </div> 1527 <div class="field password required"> 1528 <div class="control flex items-center"> 1529 <div class="sr-only" aria-live="polite"> 1530 <template x-if="!showPassword"> 1531 <span> 1532 Senha oculta </span> 1533 </template> 1534 <template x-if="showPassword"> 1535 <span> 1536 Senha exibida </span> 1537 </template> 1538 </div> 1539 <input name="login[password]" 1540 class="form-input peer pr-9" 1541 required 1542 :type="showPassword ? 'text' : 'password'" 1543 autocomplete="off" 1544 id="login-pass" 1545 placeholder="Password" 1546 title="Password" 1547 /> 1548 <label for="login-pass" class="label"> 1549 <span>Password</span> 1550 </label> 1551 <button 1552 type="button" 1553 x-on:click="showPassword = !showPassword" 1554 :aria-pressed="showPassword ? 'true' : 'false'" 1555 class="absolute top-1/2 -translate-y-1/2 right-3" 1556 :aria-label="showPassword ? 'Ocultar\u0020senha' : 'Show\u0020Password'" 1557 > 1558 <template x-if="!showPassword"> 1559 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1560 <path d="M2.673 8.056c-.225.08-.457.285-.56.495-.12.243-.128.678-.016.887.129.243 1.161 1.275 1.75 1.75.15.122.273.236.273.254 0 .018-.454.723-1.008 1.566-.555.842-1.031 1.595-1.058 1.672-.153.427.042.946.445 1.182.339.198.8.166 1.121-.079.076-.058.554-.747 1.161-1.671l1.038-1.582c.004-.005.189.08.411.189.223.109.519.246.658.303.312.13 1.206.438 1.382.476.082.018.131.053.132.095.001.037-.093.832-.208 1.767-.193 1.561-.206 1.716-.156 1.892a.996.996 0 0 0 1.553.55c.09-.065.212-.2.27-.3.098-.168.124-.318.319-1.865.117-.925.22-1.69.229-1.7.01-.009.232.001.494.022.61.051 1.584.051 2.194 0 .262-.021.484-.031.494-.022.009.01.112.775.229 1.7.195 1.547.221 1.697.319 1.865.447.762 1.583.607 1.823-.25.05-.176.037-.331-.156-1.892a88.188 88.188 0 0 1-.208-1.767c.001-.042.05-.077.132-.095.399-.086 1.423-.477 2.031-.775.227-.111.417-.198.422-.193l1.026 1.55c.559.847 1.083 1.598 1.164 1.668.167.147.404.224.673.22.492-.008.896-.406.944-.93a.704.704 0 0 0-.079-.443c-.055-.118-.526-.86-1.047-1.647a69.58 69.58 0 0 1-.968-1.484c-.011-.03.097-.146.255-.274.59-.477 1.626-1.513 1.747-1.747.179-.345.098-.847-.181-1.126-.294-.294-.613-.376-1.013-.26-.211.061-.274.112-.817.655-1.853 1.855-3.754 2.817-6.307 3.194-.681.101-2.479.101-3.16 0-2.578-.381-4.486-1.352-6.344-3.23-.485-.49-.566-.556-.757-.613-.256-.076-.448-.078-.646-.007" fill-rule="evenodd"/> 1561</svg> 1562 </template> 1563 <template x-if="showPassword"> 1564 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1565 <path d="M11.16 5.043c-3.343.254-6.198 2.157-8.536 5.688-.542.819-.604.949-.604 1.269 0 .32.062.45.604 1.269 1.507 2.277 3.229 3.88 5.147 4.791 2.037.967 4.441 1.198 6.67.639 2.681-.673 4.974-2.468 6.935-5.43.542-.819.604-.949.604-1.269 0-.32-.062-.45-.604-1.269-1.764-2.665-3.814-4.395-6.156-5.197-1.278-.437-2.624-.6-4.06-.491m2.049 2.055c.802.123 1.373.302 2.176.683 1.533.727 2.957 2.037 4.188 3.854.125.184.227.349.227.365 0 .041-.399.627-.694 1.02-.819 1.09-1.86 2.087-2.834 2.714a7.874 7.874 0 0 1-5.772 1.12c-2.234-.431-4.191-1.837-5.895-4.234-.407-.572-.42-.597-.361-.71.076-.145.65-.94.944-1.31.388-.486 1.247-1.357 1.697-1.719a8.64 8.64 0 0 1 1.73-1.1c.838-.398 1.531-.607 2.312-.698l.513-.06c.267-.031 1.382.016 1.769.075m-1.71 1.942a3.05 3.05 0 0 0-2.385 2.12c-.135.434-.135 1.246 0 1.68a3.086 3.086 0 0 0 2.046 2.046c.434.135 1.246.135 1.68 0a3.086 3.086 0 0 0 2.046-2.046c.135-.434.135-1.246 0-1.68-.305-.981-1.076-1.753-2.025-2.031-.361-.106-1.029-.149-1.362-.089m.8
156511 2.021c.378.112.69.537.69.94 0 .33-.216.695-.516.871-.156.091-.23.108-.484.108s-.328-.017-.484-.108c-.581-.342-.683-1.098-.212-1.569.279-.279.612-.359 1.006-.242" fill-rule="evenodd"/> 1566</svg> 1567 </template> 1568 </button> 1569 </div> 1570 </div> 1571 1572 <div class="control"> 1573 <input type="hidden" 1574 value="" 1575 name="g-recaptcha-response" 1576 /> 1577</div> 1578 <div class="flex flex-col gap-3 pt-3 lg:pt-4 lg:gap-4"> 1579 <a class="btn-link btn-link-primary" 1580 href="https://stata-brazil.com/customer/account/forgotpassword/"> 1581 <span>Forgot Your Password?</span> 1582 </a> 1583 1584 <button type="submit" class="btn btn-primary btn-size-lg" name="send" 1585 > 1586 <span>Sign In</span></button> 1587 </div> 1588 <div> 1589 <template x-if="displayErrorMessage"> 1590 <p class="text-red flex items-center"> 1591 <span class="inline-block w-8 h-8 mr-3"> 1592 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" width="24" height="24" role="img"> 1593 <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/> 1594<title>exclamation-circle</title></svg> 1595 </span> 1596 <template x-for="errorMessage in errorMessages"> 1597 <span x-html="errorMessage"></span> 1598 </template> 1599 </p> 1600 </template> 1601 </div> 1602 </fieldset> 1603</form> 1604<div class="w-full"> 1605 <p class="my-4 text-sm text-gray-900"> 1606Este formulário é protegido pelo reCAPTCHA - se aplicam a <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">PolÃtica de Privacidade do Google</a> e <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">Termos de Serviço</a>.</p> 1607</div>
1608<script> 1609 function initCustomerLoginForm() { 1610 hyva.setCookie( 1611 'login_redirect', 1612 window.location.href, 1613 1 1614 ) 1615 return { 1616 errors: 0, 1617 hasCaptchaToken: 0, 1618 showPassword: false, 1619 displayErrorMessage: false, 1620 errorMessages: [], 1621 setErrorMessages(messages) { 1622 this.errorMessages = [messages] 1623 this.displayErrorMessage = this.errorMessages.length 1624 }, 1625 submitForm() { 1626 // do not rename $form, the variable is the expected name in the recaptcha output 1627 const $form = document.querySelector('#customer-login-form'); 1628 if (!this.hasCaptchaToken) { 1629 this.errors = 1; 1630 1631 1632 const executeGreCaptcha = () => { 1633 grecaptcha.ready(() => { 1634 grecaptcha.execute( 1635 '6LfZyRsrAAAAAA274PpbvhhN2tBp_pIfniW8yAPZ', 1636 {action: 'submit'} 1637 ).then((token) => { 1638 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 1639 1640 if (tokenElement && token && token.length > 0) { 1641 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 1642 this.errors = 0; 1643 this.hasCaptchaToken = 1; 1644 (this.submitForm || $form.submit).call(this); 1645 } else { 1646 this.errors = 1; 1647 const error = tokenElement 1648 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 1649 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 1650 if (this.setErrorMessages) { 1651 this.setErrorMessages([error]) 1652 this.displayErrorMessage = true; 1653 } else { 1654 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 1655 } 1656 } 1657 }).catch(exception => { 1658 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 1659 }); 1660 }) 1661 } 1662 1663 if (window.grecaptcha) { 1664 executeGreCaptcha(); 1665 } else { 1666 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfZyRsrAAAAAA274PpbvhhN2tBp_pIfniW8yAPZ"; 1667 const script = document.createElement('script'); 1668 script.setAttribute('type', 'text/javascript'); 1669 script.setAttribute('src', recaptchaUrl); 1670 document.head.appendChild(script); 1671 1672 script.addEventListener("load", executeGreCaptcha, false); 1673 } 1674 } 1675 1676 if (this.errors === 0) { 1677 $form.submit(); 1678 } 1679 } 1680 } 1681 } 1682</script>
1682 1683</div> </div> 1684 <div x-show.transition.in.opacity.duration.600="activeTab === 1" 1685 role="tabpanel" 1686 aria-labelledby=" Sign Up Tab"> 1687 <div class="registration-container registation-container container p-0"><form class="form create account form-create-account" 1688 action="https://stata-brazil.com/customer/account/createpost/" 1689 x-data="Object.assign(hyva.formValidation($el), initForm())" 1690 id="accountcreate" 1691 @submit.prevent="submitForm()" 1692 method="post" id="form-validate" enctype="multipart/form-data" autocomplete="off" 1693> 1694 <input name="form_key" type="hidden" value="MKRqwFeJZFPuKz00" /> <div class="control"> 1695 <input type="hidden" 1696 value="" 1697 name="g-recaptcha-response" 1698 /> 1699</div> 1700 <fieldset class=""> 1701 <input type="hidden" name="success_url" value=""> 1702 <input type="hidden" name="error_url" value=""> 1703 <div class="field field-reserved w-full field-name-firstname required"> 1704 <div class="control"> 1705 <input type="text" id="firstname" 1706 name="firstname" 1707 value="" 1708 required 1709 title="First Name" 1710 class="form-input peer required-entry" 1711 placeholder=" " 1712 maxlength="18" 1713 @input.debounce="onChange" 1714 required > 1715 <label class="label" for="firstname"> 1716 <span> 1717 First Name </span> 1718 </label> 1719 </div> 1720 </div> 1721 <div class="field field-reserved w-full field-name-lastname required"> 1722 <div class="control"> 1723 <input type="text" id="lastname" 1724 name="lastname" 1725 required 1726 value="" 1727 title="Last Name" 1728 class="form-input peer required-entry" 1729 @input.debounce="onChange" 1730 placeholder=" " 1731 maxlength="18" 1732 required > 1733 <label class="label" for="lastname"> 1734 <span> 1735 Last Name </span> 1736 </label> 1737 </div> 1738 </div> 1739 1740 1741 1742 1743 <div class="field field-reserved required"> 1744 <div class="control"> 1745 <input 1746 type="email" 1747 name="email" 1748 autocomplete="email" 1749 id="email_address" 1750 required 1751 title="Email" 1752 class="form-input peer" 1753 @input.debounce="onChange" 1754 placeholder=" " 1755 /> 1756 <label for="email_address" class="label"> 1757 <span>Email</span> 1758 </label> 1759 </div> 1760 </div> 1761 1762 <div class="field field-reserved company "> 1763 <div class="control"> 1764 <input type="text" 1765 name="company" 1766 id="company" 1767 value="" 1768 title="Organização" 1769 class="form-input peer " 1770 placeholder=" " 1771 > 1772 <label for="company" class="label"> 1773 <span>Organização</span> 1774 </label> 1775 </div> 1776</div> 1777 1778 <div class="field field-reserved required"> 1779 <div class="control" 1780 x-data="{ customerIndustry: '' }" 1781 :class="{ 'select-placeholder': !customerIndustry }" 1782 > 1783 <select x-select="customerIndustry" name="customer_industry" class="form-select [&_+_button]:h-[52px]" id="customer_industry" 1784 @input.debounce="onChange" 1785 required 1786 placeholder="" 1787 > 1788 <option value=""> 1789 Please Select Your Industry </option> 1790 <option value="468"> 1791 Social/Science </option> 1792 <option value="469"> 1793 Biostatistics </option> 1794 <option value="470"> 1795 Economics </option> 1796 <option value="471"> 1797 Econometrics </option> 1798 <option value="472"> 1799 Finance </option> 1800 <option value="473"> 1801 Medicine </option> 1802 <option value="474"> 1803 Other </option> 1804 </select> 1805 </div> 1806 </div> 1807 1808 <div class="field field-reserved required"> 1809 <div class="flex flex-wrap gap-4"> 1810 <div class="control w-full flex items-center"> 1811 <div class="sr-only" aria-l
1811ive="polite"> 1812 <template x-if="!showPassword"> 1813 <span> 1814 Senha oculta </span> 1815 </template> 1816 <template x-if="showPassword"> 1817 <span> 1818 Senha exibida </span> 1819 </template> 1820 </div> 1821 <input 1822 :type="showPassword ? 'text' : 'password'" 1823 type="password" 1824 id="password" 1825 name="password" 1826 title="Password" 1827 minlength="8" 1828 class="form-input peer pr-9" 1829 required 1830 data-validate='{"password-strength": {"minCharacterSets": 3}}' 1831 @input.debounce="onChange" 1832 autocomplete="off" 1833 placeholder=" " 1834 > 1835 <label for="password" class="label"> 1836 <span>Password</span> 1837 </label> 1838 <button 1839 type="button" 1840 :aria-pressed="showPassword ? true : false" 1841 x-on:click="showPassword = !showPassword" 1842 class=" cursor-pointer absolute top-1/2 -translate-y-1/2 right-3" 1843 :aria-label="showPassword ? 'Ocultar\u0020senha' : 'Show\u0020Password'" 1844 > 1845 <template x-if="!showPassword"> 1846 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1847 <path d="M2.673 8.056c-.225.08-.457.285-.56.495-.12.243-.128.678-.016.887.129.243 1.161 1.275 1.75 1.75.15.122.273.236.273.254 0 .018-.454.723-1.008 1.566-.555.842-1.031 1.595-1.058 1.672-.153.427.042.946.445 1.182.339.198.8.166 1.121-.079.076-.058.554-.747 1.161-1.671l1.038-1.582c.004-.005.189.08.411.189.223.109.519.246.658.303.312.13 1.206.438 1.382.476.082.018.131.053.132.095.001.037-.093.832-.208 1.767-.193 1.561-.206 1.716-.156 1.892a.996.996 0 0 0 1.553.55c.09-.065.212-.2.27-.3.098-.168.124-.318.319-1.865.117-.925.22-1.69.229-1.7.01-.009.232.001.494.022.61.051 1.584.051 2.194 0 .262-.021.484-.031.494-.022.009.01.112.775.229 1.7.195 1.547.221 1.697.319 1.865.447.762 1.583.607 1.823-.25.05-.176.037-.331-.156-1.892a88.188 88.188 0 0 1-.208-1.767c.001-.042.05-.077.132-.095.399-.086 1.423-.477 2.031-.775.227-.111.417-.198.422-.193l1.026 1.55c.559.847 1.083 1.598 1.164 1.668.167.147.404.224.673.22.492-.008.896-.406.944-.93a.704.704 0 0 0-.079-.443c-.055-.118-.526-.86-1.047-1.647a69.58 69.58 0 0 1-.968-1.484c-.011-.03.097-.146.255-.274.59-.477 1.626-1.513 1.747-1.747.179-.345.098-.847-.181-1.126-.294-.294-.613-.376-1.013-.26-.211.061-.274.112-.817.655-1.853 1.855-3.754 2.817-6.307 3.194-.681.101-2.479.101-3.16 0-2.578-.381-4.486-1.352-6.344-3.23-.485-.49-.566-.556-.757-.613-.256-.076-.448-.078-.646-.007" fill-rule="evenodd"/> 1848</svg> 1849 </template> 1850 <template x-if="showPassword"> 1851 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1852 <path d="M11.16 5.043c-3.343.254-6.198 2.157-8.536 5.688-.542.819-.604.949-.604 1.269 0 .32.062.45.604 1.269 1.507 2.277 3.229 3.88 5.147 4.791 2.037.967 4.441 1.198 6.67.639 2.681-.673 4.974-2.468 6.935-5.43.542-.819.604-.949.604-1.269 0-.32-.062-.45-.604-1.269-1.764-2.665-3.814-4.395-6.156-5.197-1.278-.437-2.624-.6-4.06-.491m2.049 2.055c.802.123 1.373.302 2.176.683 1.533.727 2.957 2.037 4.188 3.854.125.184.227.349.227.365 0 .041-.399.627-.694 1.02-.819 1.09-1.86 2.087-2.834 2.714a7.874 7.874 0 0 1-5.772 1.12c-2.234-.431-4.191-1.837-5.895-4.234-.407-.572-.42-.597-.361-.71.076-.145.65-.94.944-1.31.388-.486 1.247-1.357 1.697-1.719a8.64 8.64 0 0 1 1.73-1.1c.838-.398 1.531-.607 2.312-.698l.513-.06c.267-.031 1.382.016 1.769.075m-1.71 1.942a3.05 3.05 0 0 0-2.385 2.12c-.135.434-.135 1.246 0 1.68a3.086 3.086 0 0 0 2.046 2.046c.434.135 1.246.135 1.68 0a3.086 3.086 0 0 0 2.046-2.046c.135-.434.135-1.246 0-1.68-.305-.981-1.076-1.753-2.025-2.031-.361-.106-1.029-.149-1.362-.089m.8
185211 2.021c.378.112.69.537.69.94 0 .33-.216.695-.516.871-.156.091-.23.108-.484.108s-.328-.017-.484-.108c-.581-.342-.683-1.098-.212-1.569.279-.279.612-.359 1.006-.242" fill-rule="evenodd"/> 1853</svg> 1854 </template> 1855 </button> 1856 </div> 1857 </div> 1858 </div> 1859 1860 <div class="field field-reserved"> 1861 <div class="control flex items-center"> 1862 <div class="sr-only" aria-live="polite"> 1863 <template x-if="!showPasswordConfirm"> 1864 <span> 1865 Confirmar senha oculta </span> 1866 </template> 1867 <template x-if="showPasswordConfirm"> 1868 <span> 1869 confirmar a senha exibida </span> 1870 </template> 1871 </div> 1872 <input 1873 :type="showPasswordConfirm ? 'text' : 'password'" 1874 type="password" 1875 name="password_confirmation" 1876 title="Confirm Password" 1877 id="password-confirmation" 1878 data-validate='{"equalTo": "password"}' 1879 @input.debounce="onChange" 1880 required 1881 class="form-input peer pr-9"" 1882 autocomplete="off" 1883 placeholder=" " 1884 > 1885 <label for="password-confirmation" class="label"> 1886 <span>Confirm Password</span> 1887 </label> 1888 1889 <button 1890 type="button" 1891 x-on:click="showPasswordConfirm = !showPasswordConfirm" 1892 :aria-pressed="showPasswordConfirm ? true : false" 1893 class="cursor-pointer absolute top-1/2 -translate-y-1/2 right-3" 1894 :aria-label=" 1895 showPasswordConfirm ? 'Ocultar\u0020senha' : 'Show\u0020Password' 1896 " 1897 > 1898 <template x-if="!showPasswordConfirm"> 1899 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1900 <path d="M2.673 8.056c-.225.08-.457.285-.56.495-.12.243-.128.678-.016.887.129.243 1.161 1.275 1.75 1.75.15.122.273.236.273.254 0 .018-.454.723-1.008 1.566-.555.842-1.031 1.595-1.058 1.672-.153.427.042.946.445 1.182.339.198.8.166 1.121-.079.076-.058.554-.747 1.161-1.671l1.038-1.582c.004-.005.189.08.411.189.223.109.519.246.658.303.312.13 1.206.438 1.382.476.082.018.131.053.132.095.001.037-.093.832-.208 1.767-.193 1.561-.206 1.716-.156 1.892a.996.996 0 0 0 1.553.55c.09-.065.212-.2.27-.3.098-.168.124-.318.319-1.865.117-.925.22-1.69.229-1.7.01-.009.232.001.494.022.61.051 1.584.051 2.194 0 .262-.021.484-.031.494-.022.009.01.112.775.229 1.7.195 1.547.221 1.697.319 1.865.447.762 1.583.607 1.823-.25.05-.176.037-.331-.156-1.892a88.188 88.188 0 0 1-.208-1.767c.001-.042.05-.077.132-.095.399-.086 1.423-.477 2.031-.775.227-.111.417-.198.422-.193l1.026 1.55c.559.847 1.083 1.598 1.164 1.668.167.147.404.224.673.22.492-.008.896-.406.944-.93a.704.704 0 0 0-.079-.443c-.055-.118-.526-.86-1.047-1.647a69.58 69.58 0 0 1-.968-1.484c-.011-.03.097-.146.255-.274.59-.477 1.626-1.513 1.747-1.747.179-.345.098-.847-.181-1.126-.294-.294-.613-.376-1.013-.26-.211.061-.274.112-.817.655-1.853 1.855-3.754 2.817-6.307 3.194-.681.101-2.479.101-3.16 0-2.578-.381-4.486-1.352-6.344-3.23-.485-.49-.566-.556-.757-.613-.256-.076-.448-.078-.646-.007" fill-rule="evenodd"/> 1901</svg> 1902 </template> 1903 <template x-if="showPasswordConfirm"> 1904 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" class="w-6 h-6" aria-hidden="true"> 1905 <path d="M11.16 5.043c-3.343.254-6.198 2.157-8.536 5.688-.542.819-.604.949-.604 1.269 0 .32.062.45.604 1.269 1.507 2.277 3.229 3.88 5.147 4.791 2.037.967 4.441 1.198 6.67.639 2.681-.673 4.974-2.468 6.935-5.43.542-.819.604-.949.604-1.269 0-.32-.062-.45-.604-1.269-1.764-2.665-3.814-4.395-6.156-5.197-1.278-.437-2.624-.6-4.06-.491m2.049 2.055c.802.123 1.373.302 2.176.683 1.533.727 2.957 2.037 4.188 3.854.125.184.227.349.227.365 0 .041-.399.627-.694 1.02-.819 1.09-1.86 2.087-2.834 2.714a7.874 7.874 0 0 1-5.772 1.12c-2.234-.431-4.191-1.837-5.895-4.234-.407-.572-.42-.597-.361-.71.076-.145.65-.94.944-1.31.388-.486 1.247-1.357 1.697-1.719a8.64 8.64 0 0 1 1.73-1.1c.838-.398 1.531-.607 2.312-.698l.513-.06c.267-.031 1.382.016 1.769.075m-1.71 1.942a3.05 3.05 0 0 0-2.385 2.12c-.135.434-.135 1.246 0 1.68a3.086 3.086 0 0 0 2.046 2.046c.434.135 1.246.135 1.68 0a3.086 3.086 0 0 0 2.046-2.046c.135-.434.135-1.246 0-1.68-.305-.981-1.076-1.753-2.025-2.031-.361-.106-1.029-.149-1.362-.089m.8
190511 2.021c.378.112.69.537.69.94 0 .33-.216.695-.516.871-.156.091-.23.108-.484.108s-.328-.017-.484-.108c-.581-.342-.683-1.098-.212-1.569.279-.279.612-.359 1.006-.242" fill-rule="evenodd"/> 1906</svg> 1907 </template> 1908 </button> 1909 </div> 1910 </div> 1911 1912 <div class="field choice newsletter"> 1913 <input type="checkbox" name="is_subscribed" 1914 title="Sign Up for Newsletter" value="1" 1915 id="is_subscribed" 1916 class="checkbox"> 1917 <label for="is_subscribed" class="label"> 1918 <span> 1919 Sign Up for Newsletter </span> 1920 </label> 1921 </div> 1922 1923 1924 <p class="my-4 text-sm text-gray-900"> 1925Este formulário é protegido pelo reCAPTCHA - se aplicam a <a class="underline" href="https://policies.google.com/privacy" target="_blank" rel="noopener">PolÃtica de Privacidade do Google</a> e <a class="underline" href="https://policies.google.com/terms" target="_blank" rel="noopener">Termos de Serviço</a>.</p> 1926 1927 </fieldset> 1928 <div class="flex pt-3"> 1929 <div class="primary w-full"> 1930 <button type="submit" class="action submit primary btn btn-primary btn-size-lg w-full" 1931 title="Sign Up" 1932 > 1933 <span>Sign Up</span> 1934 </button> 1935 </div> 1936 </div> 1937</form> 1938
1939<script> 1940 function initForm() { 1941 return { 1942 errors: 0, 1943 hasCaptchaToken: 0, 1944 showPassword: false, 1945 showPasswordConfirm: false, 1946 submitForm() { 1947 this.validate() 1948 .then(() => { 1949 // Do not rename $form, the variable is expected to be declared in the recaptcha output 1950 const $form = document.querySelector('#accountcreate'); 1951 if (!this.hasCaptchaToken) { 1952 this.errors = 1; 1953 1954 1955 const executeGreCaptcha = () => { 1956 grecaptcha.ready(() => { 1957 grecaptcha.execute( 1958 '6LfZyRsrAAAAAA274PpbvhhN2tBp_pIfniW8yAPZ', 1959 {action: 'submit'} 1960 ).then((token) => { 1961 const tokenElement = $form['g\u002Drecaptcha\u002Dresponse']; 1962 1963 if (tokenElement && token && token.length > 0) { 1964 $form['g\u002Drecaptcha\u002Dresponse'].value = token; 1965 this.errors = 0; 1966 this.hasCaptchaToken = 1; 1967 (this.submitForm || $form.submit).call(this); 1968 } else { 1969 this.errors = 1; 1970 const error = tokenElement 1971 ? 'ReCaptcha\u0020validation\u0020failed,\u0020please\u0020try\u0020again' 1972 : 'ReCaptcha\u0020token\u0020element\u0020is\u0020missing.\u0020Please\u0020refresh\u0020the\u0020page\u0020and\u0020trying\u0020again.'; 1973 if (this.setErrorMessages) { 1974 this.setErrorMessages([error]) 1975 this.displayErrorMessage = true; 1976 } else { 1977 window.dispatchMessages && window.dispatchMessages([{type: "error", text: error}], 5000); 1978 } 1979 } 1980 }).catch(exception => { 1981 console.error(exception || `An unknown error occurred during ReCaptcha validation. Are the tokens and the domain correctly set up in the Google console?`) 1982 }); 1983 }) 1984 } 1985 1986 if (window.grecaptcha) { 1987 executeGreCaptcha(); 1988 } else { 1989 const recaptchaUrl = "https://www.google.com/recaptcha/api.js?render=6LfZyRsrAAAAAA274PpbvhhN2tBp_pIfniW8yAPZ"; 1990 const script = document.createElement('script'); 1991 script.setAttribute('type', 'text/javascript'); 1992 script.setAttribute('src', recaptchaUrl); 1993 document.head.appendChild(script); 1994 1995 script.addEventListener("load", executeGreCaptcha, false); 1996 } 1997 } 1998 1999 if (this.errors === 0) { 2000 $form.submit(); 2001 } 2002 }) 2003 .catch((invalid) => { 2004 if (invalid.length > 0) { 2005 invalid[0].focus(); 2006 } 2007 }); 2008 }, 2009 } 2010 } 2011 2012 window.addEventListener('DOMContentLoaded', () => { 2013 2014 hyva.formValidation.addRule('telephone', (value, options) => { 2015 const phoneNumber = value.trim().replace(' ', ''); 2016 if (phoneNumber && phoneNumber.length < (options.minlength || 3)) { 2017 return 'O\u0020n\u00FAmero\u0020de\u0020telefone\u0020\u00E9\u0020muito\u0020curto.'; 2018 } 2019 2020 return true; 2021 }); 2022 2023 const postCodeSpecs = {"AD":{"pattern_1":{"example":"AD100","pattern":"^AD\\d{3}$"}},"AM":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"AR":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"},"pattern_2":{"example":"A1234BCD","pattern":"^[a-zA-z]{1}[0-9]{4}[a-zA-z]{3}$"}},"AS":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"AT":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"AU":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"AX":{"pattern_1":{"example":"22123","pattern":"^22\\d{3}$"}},"AZ":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"},"pattern_2":{"example":"123456","pattern":"^[0-9]{6}$"}},"BA":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"BB":{"pattern_1":{"example":"BB12345","pattern":"^(BB\\d{5})?$"}},"BD":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"BE":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"BG":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"BH":{"pattern_1":{"example":"323","pattern":"^((1[0-2]|[1-9])\\d{2})?$"}},"BM":{"pattern_1":{"example":"MA 02","pattern":"^[A-Z]{2}[ ]?[A-Z0-9]{2}$"}},"BN":{"pattern_1":{"example":"AB1234","pattern":"^[a-zA-z]{2}[0-9]{4}$"}},"BR":{"pattern_1":{"example":"12345678","pattern":"^[0-9]{8}$"},"pattern_2":{"example":"12345-678","pattern":"^[0-9]{5}\\-[0-9]{3}$"}},"BY":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"CA":{"pattern_1":{"example":"A1B 2C3","pattern":"^[a-zA-z]{1}[0-9]{1}[a-zA-z]{1}\\s[0-9]{1}[a-zA-z]{1}[0-9]{1}$"},"pattern_2":{"example":"A1B2C3","pattern":"^[a-zA-z]{1}[0-9]{1}[a-zA-z]{1}[0-9]{1}[a-zA-z]{1}[0-9]{1}$"},"pattern_3":{"example":"A1B","pattern":"^[a-zA-z]{1}[0-9]{1}[a-zA-z]{1}$"}},"CC":{"pattern_1":{"example":"6799","pattern":"^6799$"}},"CH":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"CK":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"CL":{"pattern_1":{"example":"1234567","pattern":"^\\d{7}$"}},"CN":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"CR":{"pattern_1":{"example":"12345 or 123-1234","pattern":"^\\d{4,5}|\\d{3}-\\d{4}$"}},"CS":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"CU":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"CV":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"CX":{"pattern_1":{"example":"6798","pattern":"^6798$"}},"CY":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"CZ":{"pattern_1":{"example":"123 45","pattern":"^[0-9]{3}\\s[0-9]{2}$"}},"DE":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"DK":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"DO":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"DZ":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"EC":{"pattern_1":{"example":"A1234B or AB123456 or 123456","pattern":"^([A-Z]\\d{4}[A-Z]|(?:[A-Z]{2})?\\d{6})?$"}},"EE":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"EG":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"ES":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"ET":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"FI":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"FK":{"pattern_1":{"example":"FIQQ 1ZZ","pattern":"^FIQQ 1ZZ$"}},"FM":{"pattern_1":{"example":"96941","pattern":"^(9694[1-4])([ \\-]\\d{4})?$"}},"FO":{"pattern_1":{"example":"123","pattern":"^\\d{3}$"}},"FR":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"GB":{"pattern_1":{"example":"AB12 3CD","pattern":"^[a-zA-Z]{2}[0-9]{2}\\s?[0-9]{1}[a-zA-Z]{2}$"},"pattern_2":{"example":"A1B 2CD","pattern":"^[a-zA-Z]{1}[0-9]{1}[a-zA-Z]{1}\\s?[0-9]{1}[a-zA-Z]{2}$"},"pattern_3":{"example":"AB1 2CD","pattern":"^[a-zA-Z]{2}[0-9]{1}\\s?[0-9]{1}[a-zA-Z]{2}$"},"pattern_4":{"example":"AB1C 2DF","pattern":"^[a-zA-Z]{2}[0-9]{1}[a-zA-Z]{1}\\s?[0-9]{1}[a-zA-Z]{2}$"},"pattern_5":{"example":"A12 3BC","pattern":"^[a-zA-Z]{1}[0-9]{2}\\s?[0-9]{1}[a-zA-Z]{2}$"},"pattern_6":{"example":"A1 2BC","pattern":"^[a-zA-Z]{1}[0-9]{1}\\s?[0-9]{1}[a-zA-Z]{2}$"}},"GE":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"GF":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"GG":{"pattern_1":{"example":"GY10 2AB","pattern":"^[gG][yY]([1-9]|10)\\s?[0-9]{1}[a-zA-Z]{2}$"}},"GH":{"pattern_1":{"example":"GA18400","pattern":"^[A-Z][A-Z0-9]\\d{3,5}$"}},"GL":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"GN":{"pattern_1":{"example":"123","pattern":"^\\d{3}$"}},"GP":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"GR":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"GS":{"pattern_1":{"example":"SIQQ 1ZZ","pattern":"^SIQQ 1ZZ$"}},"GT":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"GU":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"GW":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"HM":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"HN":{"pattern_1":{"example":"12345","pattern":"^(?:\\d{5})?$"}},"HR":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"HT":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"HU":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"IC":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"ID":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"IE":{"pattern_1":{"example":"A65 F4E2","pattern":"^([AC-FHKNPRTV-Y]{1}[0-9]{2}|D6W)[ ]?[0-9AC-FHKNPRTV-Y]{4}$"}},"IL":{"pattern_1":{"example":"6687865","pattern":"^[0-9]{7}$"}},"IM":{"pattern_1":{"example":"IM1 1AD","pattern":"^IM\\d[\\dA-Z]?[ ]?\\d[ABD-HJLN-UW-Z]{2}$"}},"IN":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"IO":{"pattern_1":{"example":"BBND 1ZZ","pattern":"^BBND 1ZZ$"}},"IS":{"pattern_1":{"example":"123","pattern":"^[0-9]{3}$"}},"IQ":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"IT":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}}
2023,"JE":{"pattern_1":{"example":"JE2 4PJ","pattern":"^[jJ][eE][1-5]{1}\\s?[0-9]{1}[a-zA-Z]{2}$"}},"JO":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"JP":{"pattern_1":{"example":"123-4567","pattern":"^[0-9]{3}-[0-9]{4}$"},"pattern_2":{"example":"1234567","pattern":"^[0-9]{7}$"}},"KE":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"KG":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"KR":{"pattern_1":{"example":"123-456","pattern":"^[0-9]{3}-[0-9]{3}$"},"pattern_2":{"example":"12345","pattern":"^[0-9]{5}$"}},"KH":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"KW":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"KZ":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"LA":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"LB":{"pattern_1":{"example":"1234 5678","pattern":"^(\\d{4}([ ]?\\d{4})?)?$"}},"LI":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"LK":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"LT":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"LU":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"LV":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"MA":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MC":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MD":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"ME":{"pattern_1":{"example":"81101","pattern":"^8\\d{4}$"}},"MG":{"pattern_1":{"example":"123","pattern":"^[0-9]{3}$"}},"MH":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MK":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"MN":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"MP":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MS":{"pattern_1":{"example":"MSR1250","pattern":"^MSR\\s?\\d{4}$"}},"MQ":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MT":{"pattern_1":{"example":"ABC 1234","pattern":"^[a-zA-Z]{3}\\s[0-9]{4}$"},"pattern_2":{"example":"ABC 123","pattern":"^[a-zA-Z]{3}\\s[0-9]{3}$"},"pattern_3":{"example":"ABC 12","pattern":"^[a-zA-Z]{3}\\s[0-9]{2}$"}},"MU":{"pattern_1":{"example":"A1201 or 80110","pattern":"^([AR]|[0-9])\\d{4,5}$"}},"MV":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"},"pattern_2":{"example":"1234","pattern":"^[0-9]{4}$"}},"MX":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"MY":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"NC":{"pattern_1":{"example":"98800","pattern":"^988\\d{2}$"}},"NE":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"NF":{"pattern_1":{"example":"2899","pattern":"^2899$"}},"NG":{"pattern_1":{"example":"123456","pattern":"^(\\d{6})?$"}},"NI":{"pattern_1":{"example":"22500","pattern":"^\\d{5}$"}},"NL":{"pattern_1":{"example":"1234 AB\/1234AB","pattern":"^[1-9][0-9]{3}\\s?[a-zA-Z]{2}$"},"pattern_2":{"example":"1234","pattern":"^[1-9][0-9]{3}$"}},"NO":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"NP":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"NZ":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"OM":{"pattern_1":{"example":"PC 123 or 123","pattern":"^(PC )?\\d{3}$"}},"PA":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"PF":{"pattern_1":{"example":"98701","pattern":"^987\\d{2}$"}},"PG":{"pattern_1":{"example":"123","pattern":"^\\d{3}$"}},"PH":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"PK":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"PL":{"pattern_1":{"example":"12-345","pattern":"^[0-9]{2}-[0-9]{3}$"}},"PM":{"pattern_1":{"example":"97500","pattern":"^9[78]5\\d{2}$"}},"PN":{"pattern_1":{"example":"PCRN 1ZZ","pattern":"^PCRN 1ZZ$"}},"PR":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"PT":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"},"pattern_2":{"example":"1234-567","pattern":"^[0-9]{4}-[0-9]{3}$"}},"PW":{"pattern_1":{"example":"96939 or 96940","pattern":"^(?:96939|96940)$"}}
2023,"PY":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"RE":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"RO":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"RS":{"pattern_1":{"example":"123456","pattern":"^\\d{6}$"}},"RU":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"SA":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"SE":{"pattern_1":{"example":"123 45","pattern":"^[0-9]{3}\\s[0-9]{2}$"}},"SG":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"SI":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"SK":{"pattern_1":{"example":"123 45","pattern":"^[0-9]{3}\\s[0-9]{2}$"}},"SH":{"pattern_1":{"example":"ASCN 1ZZ","pattern":"^(ASCN|STHL) 1ZZ$"}},"SJ":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"SM":{"pattern_1":{"example":"47890","pattern":"^4789\\d$"}},"SN":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"SO":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"SZ":{"pattern_1":{"example":"A123","pattern":"^[a-zA-Z]{1}[0-9]{3}$"}},"TC":{"pattern_1":{"example":"TKCA 1ZZ","pattern":"^TKCA 1ZZ$"}},"TH":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"TJ":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"TM":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"TN":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"TR":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"TT":{"pattern_1":{"example":"120110","pattern":"^\\d{6}$"}},"TW":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"},"pattern_2":{"example":"123","pattern":"^[0-9]{3}$"}},"UA":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"US":{"pattern_1":{"example":"12345-6789","pattern":"^[0-9]{5}\\-[0-9]{4}$"},"pattern_2":{"example":"12345","pattern":"^[0-9]{5}$"}},"UY":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"UZ":{"pattern_1":{"example":"123456","pattern":"^[0-9]{6}$"}},"VA":{"pattern_1":{"example":"00120","pattern":"^00120$"}},"VE":{"pattern_1":{"example":"1234","pattern":"^\\d{4}$"}},"VI":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"WF":{"pattern_1":{"example":"98601","pattern":"^986\\d{2}$"}},"XK":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}},"XY":{"pattern_1":{"example":"12345","pattern":"^[0-9]{5}$"}},"YT":{"pattern_1":{"example":"97601","pattern":"^976\\d{2}$"}},"ZA":{"pattern_1":{"example":"1234","pattern":"^[0-9]{4}$"}},"ZM":{"pattern_1":{"example":"12345","pattern":"^\\d{5}$"}}}; 2024 2025 hyva.formValidation.addRule('postcode', (postCode, options, field, context) => { 2026 context.removeMessages(field, 'postcode-warning') 2027 const countryId = (context.fields['country_id'] && context.fields['country_id'].element.value), 2028 validatedPostCodeExamples = [], 2029 countryPostCodeSpecs = countryId && postCodeSpecs ? postCodeSpecs[countryId] : false; 2030 2031 if (! postCode || ! countryPostCodeSpecs) return true; 2032 2033 for (const postCodeSpec of Object.values(countryPostCodeSpecs)) { 2034 if (new RegExp(postCodeSpec.pattern).test(postCode)) return true; 2035 validatedPostCodeExamples.push(postCodeSpec.example); 2036 } 2037 if (validatedPostCodeExamples) { 2038 context.addMessages(field, 'postcode-warning', [ 2039 'Provided\u0020Zip\u002FPostal\u0020Code\u0020seems\u0020to\u0020be\u0020invalid.', 2040 '\u0020Example\u003A\u0020' + validatedPostCodeExamples.join('; ') + '. ', 2041 'If\u0020you\u0020believe\u0020it\u0020is\u0020the\u0020right\u0020one\u0020you\u0020can\u0020ignore\u0020this\u0020notice.' 2042 ]); 2043 } 2044 2045 return true; 2046 }); 2047 }) 2048</script>
2048 2049</div> </div> 2050 <span class="block py-3 text-sm text-center uppercase"> 2051 or </span> 2052 <div> 2053 <div class="block"> 2054 <div class="block-content"> 2055 <div class="google-login" 2056 x-data="{ open: false }"> 2057 <a class="cursor-pointer block text-base text-center p-4 border border-solid border-[#DADCE0] rounded-full btn-google-login" 2058 @click="openPopUp('https://stata-brazil.com/sociallogin/social/login/type/google/', 'Google')"> 2059 <span style="background-image: url('https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/social-login/google.svg ')" class="w-6 h-6 absolute left-4 bg-contain"></span> 2060 Sign in with Google </a> 2061 </div> 2062 </div> 2063 </div> 2064
2065<script> 2066 const popupCenter = ({url, title, w, h}) => { 2067 const dualScreenLeft = window.screenLeft !== undefined ? window.screenLeft : window.screenX; 2068 const dualScreenTop = window.screenTop !== undefined ? window.screenTop : window.screenY; 2069 const width = window.innerWidth ? window.innerWidth : document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; 2070 const height = window.innerHeight ? window.innerHeight : document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; 2071 const systemZoom = width / window.screen.availWidth; 2072 const left = (width - w) / 2 / systemZoom + dualScreenLeft; 2073 const top = (height - h) / 2 / systemZoom + dualScreenTop; 2074 const newWindow = window.open(url, title, 2075 ` 2076 scrollbars=yes, 2077 width=${w / systemZoom}, 2078 height=${h / systemZoom}, 2079 top=${top}, 2080 left=${left} 2081 ` 2082 ) 2083 2084 if (window.focus) newWindow.focus(); 2085 } 2086 2087 const openPopUp = (url, label) => { 2088 const date = new Date(); 2089 const currentTime = date.getTime(); 2090 2091 popupCenter({url: url + '?' + currentTime, title: label, w: 450, h: 550}); 2092 } 2093</script>
2093 2094 </div> 2095 </div> 2096 </div> 2097 2098 </div> 2099 </div> 2100</section> 2101</div></div></main><div class="mst-gdpr__cookie-bar-wrapper relative z-50" id="gdprCookieBar" x-data="initMstGdprCookieBar()" x-init="initDisplay()"> 2102 <div class="mst-gdpr__cookie-bar 2103 shadow-[0px_1.85px_2.21px_0px_#00000004,0px_4.46px_5.32px_0px_#00000005,0px_8.39px_10.02px_0px_#00000006,0px_14.97px_17.87px_0px_#00000008,0px_27.99px_33.42px_0px_#00000009,0px_67px_80px_0px_#0000000D] 2104 bg-white bottom-6 md:bottom-10 fixed left-1/2 -translate-x-1/2 md:translate-x-0 md:left-10 2105 w-full max-w-[calc(100%-32px)] md:max-w-[440px] 2106 rounded-3xl p-6 z-50" 2107 x-bind:class="{'opacity-70': isLoading}" 2108 x-show="isBarVisible" 2109 style="display: none"> 2110 2111 <div class="consent-text font-bold mb-4 [&>a]:btn-link [&>a]:btn-link-primary"> 2112 Os cookies ajudam a fornecer nossos serviços. Ao usar nossos serviços, você concorda com o uso de cookies. 2113<a href="/privacy-policy">Saiba mais</a> </div> 2114 2115 <div class="mst-gdpr__buttons flex flex-wrap gap-2"> 2116 <button class="action btn btn-primary grow basis-full" 2117 x-bind:class="{'opacity-0': isLoading}" 2118 @click="handleAllow(1)"><span>Aceitar</span></button> 2119 2120 <button 2121 class="action btn btn-primary py-1.5 border-2 border-solid border-accent grow basis-[calc(theme(flexBasis.6/12)-4px)]" 2122 x-bind:class="{'opacity-0': isLoading}" 2123 @click="handleDecline"><span>DeclÃnio</span></button> 2124 2125 <button type="button" 2126 class="action btn btn-secondary py-1.5 grow basis-[calc(theme(flexBasis.6/12)-4px)]" 2127 x-bind:class="{'opacity-0': isLoading}" 2128 @click="openSettings"> 2129 <span>Configurações</span> 2130 </button> 2131 </div> 2132 </div> 2133 <div class="mst-gdpr__cookie-bar-overlay bg-white fixed h-full left-0 opacity-60 top-0 w-full z-40" 2134 style="display: none" 2135 id="gdprCookieBarOverlay" x-show="isScreenLocked"></div> 2136</div>
2137<script> 2138 function initMstGdprCookieBar() { 2139 'use strict'; 2140 2141 const barConfig = {"allowUrl":"https:\/\/stata-brazil.com\/gdpr_cookie\/cookie\/allow\/","declineUrl":"https:\/\/stata-brazil.com\/gdpr_cookie\/cookie\/decline\/","countryConfigUrl":"https:\/\/stata-brazil.com\/gdpr_cookie\/country\/config\/","lockScreen":false,"groupCookieName":"gdpr_cookie_groups","consentCookieName":"gdpr_cookie_consent","barEnabled":true,"cookieGroupTypes":{"1":"essential","2":"marketing","3":"functionality","4":"statistical"},"googleConsentEnabled":true,"googleConsentTypes":["ad_user_data","ad_personalization","ad_storage","analytics_storage","personalization_storage","functionality_storage","security_storage"],"googleConsentDefault":{"ad_user_data":"granted","ad_personalization":"granted","ad_storage":"granted","analytics_storage":"granted","personalization_storage":"granted","functionality_storage":"granted","security_storage":"granted"},"showDeclineButton":true,"isAllCountries":true,"countries":[""],"version":"1"}; 2142 return { 2143 isLoading: false, 2144 isBarVisible: false, 2145 isScreenLocked: false, 2146 initDisplay: function () { 2147 if (barConfig.googleConsentEnabled) { 2148 if (!barConfig.barEnabled) { 2149 this.sendConsentUpdate(barConfig.googleConsentDefault); 2150 } 2151 } 2152 if (this.isSaved()) { 2153 this.initSavedCookieConsent(); 2154 } 2155 if (!barConfig.barEnabled && !this.isSaved()) { 2156 this.handleAllow(true); 2157 } 2158 2159 if (barConfig.isAllCountries) { 2160 this.showIfNotSaved(); 2161 } else { 2162 let countryCode = localStorage.getItem('mst-gdpr-country-code'); 2163 if (countryCode) { 2164 if (this.isAllowedCountry(countryCode)) { 2165 this.showIfNotSaved(); 2166 } else { 2167 this.hide(); 2168 this.handleAllow(true); 2169 } 2170 } else { 2171 this.hide(); 2172 fetch(barConfig.countryConfigUrl + '?_=' + Date.now()) 2173 .then(function (response) { 2174 return response.json(); 2175 }) 2176 .then(function (data) { 2177 if (data.CountryIsoCode) { 2178 localStorage.setItem('mst-gdpr-country-code', data.CountryIsoCode); 2179 if (data.isShowCookieBar) { 2180 this.showIfNotSaved(); 2181 } else { 2182 this.hide(); 2183 this.handleAllow(true); 2184 } 2185 } 2186 }.bind(this)); 2187 } 2188 } 2189 2190 window.addEventListener('mst-gdpr-cookie-settings-save', () => { 2191 this.handleAllow(); 2192 }) 2193 2194 window.addEventListener('mst-gdpr-cookie-open-bar-request', () => { 2195 this.show(); 2196 }) 2197 }, 2198 2199 isAllowedCountry: function (countryCode) { 2200 return barConfig.countries.indexOf(countryCode) !== -1; 2201 }, 2202 2203 initSavedCookieConsent: function () { 2204 let allowedCookieGroups = unescape(hyva.getCookie(barConfig.groupCookieName)).split(','); 2205 let checkboxList = document.querySelectorAll('.group-content .cookie-group-container .checkbox') 2206 2207 checkboxList.forEach(function (item) { 2208 let groupId = item.getAttribute('data-group-id'); 2209 item.checked = allowedCookieGroups.indexOf(groupId.toString()) !== -1; 2210 }.bind(this)); 2211 }, 2212 2213 isSaved: function () { 2214 if (hyva.getCookie(barConfig.consentCookieName) < barConfig.version) { 2215 this.deleteCookieGroupsCookie(); 2216 return false;
2217 } 2218 2219 return !!hyva.getCookie(barConfig.groupCookieName); 2220 }, 2221 2222 showIfNotSaved: function () { 2223 if (this.isSaved() || !barConfig.barEnabled) { 2224 this.hide(); 2225 } else { 2226 this.show(); 2227 } 2228 }, 2229 2230 handleAllow: function (agreeAll) { 2231 this.isLoading = true; 2232 2233 let allowedGroupIds = this.getUserAllowedGroupIds(agreeAll); 2234 if (allowedGroupIds.length) { 2235 this.setCookie(allowedGroupIds); 2236 } 2237 2238 if (barConfig.googleConsentEnabled) { 2239 let consent = barConfig.barEnabled ? this.getGoogleConsentByAllowedGroupIds(allowedGroupIds) : barConfig.googleConsentDefault; 2240 this.saveGoogleConsent(consent); 2241 } 2242 2243 const body = allowedGroupIds.reduce((body, groupId) => { 2244 body.append('group_ids[]', groupId); 2245 return body; 2246 }, new URLSearchParams({form_key: hyva.getFormKey()})) 2247 2248 fetch('https://stata-brazil.com/gdpr_cookie/cookie/allow/', { 2249 method: 'post', 2250 body: body, 2251 headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'} 2252 }) 2253 .then(() => this.hide()) 2254 .finally(() => this.isLoading = false) 2255 }, 2256 2257 handleDecline: function () { 2258 this.isLoading = true; 2259 2260 let checkboxList = document.querySelectorAll('.cookie-group-container .checkbox[disabled]:checked'); 2261 const required = Array.from(checkboxList || []); 2262 let requiredGroupIds = required.reduce((requiredGroupIds, item) => { 2263 requiredGroupIds.push(item.dataset.groupId); 2264 return requiredGroupIds; 2265 }, []); 2266 if (requiredGroupIds.length) { 2267 this.setCookie(requiredGroupIds); 2268 } 2269 2270 if (barConfig.googleConsentEnabled) { 2271 let consent = barConfig.barEnabled ? this.getGoogleConsentByAllowedGroupIds(requiredGroupIds) : barConfig.googleConsentDefault; 2272 this.saveGoogleConsent(consent); 2273 } 2274 2275 const body = new URLSearchParams({form_key: hyva.getFormKey()}); 2276 fetch('https://stata-brazil.com/gdpr_cookie/cookie/decline/', { 2277 method: 'post', 2278 body: body, 2279 headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'} 2280 }) 2281 .then(() => this.hide()) 2282 .finally(() => this.isLoading = false) 2283 }, 2284 2285 setCookie: function (groupIds) { 2286 let d = new Date(); 2287 d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000)); 2288 let expires = "expires=" + d.toUTCString(); 2289 let cookieDomain = '.' + (new URL(window.location.href)).hostname; 2290 document.cookie = "gdpr_cookie_consent=" + barConfig.version + ";domain=" + cookieDomain + ";" + expires + ";path=/;SameSite=Lax"; 2291 let value = encodeURIComponent(groupIds.join(',')); 2292 document.cookie = "gdpr_cookie_groups=" + value + ";domain=" + cookieDomain + ";" + expires + ";path=/;SameSite=Lax"; 2293 }, 2294 2295 deleteCookieGroupsCookie: function () { 2296 let d = new Date(); 2297 d.setTime(0); 2298 let expires = "expires=" + d.toUTCString(); 2299 let cookieDomain = '.' + (new URL(window.location.href)).hostname; 2300 document.cookie = "gdpr_cookie_groups=;domain=" + cookieDomain + ";" + expires + ";path=/;SameSite=Lax"; 2301 }, 2302 2303 show: function () { 2304 this.isBarVisible = true; 2305 2306 this.isScreenLocked = window.location.href.indexOf('cookie') === -1 && barConfig.lockScreen; 2307 if (this.isScreenLocked) { 2308 document.querySelector('body').style.overflow = 'hidden'; 2309 } 2310 }, 2311 2312 hide: function () { 2313 this.isBarVisible = false;
2314 this.isScreenLocked = false; 2315 document.querySelector('body').style.overflow = 'auto'; 2316 }, 2317 2318 getLocalStorageGoogleConsent: function () { 2319 return localStorage.getItem('mst-gdpr-google-consent-mode'); 2320 }, 2321 2322 setLocalStorageGoogleConsent: function (consent) { 2323 localStorage.setItem('mst-gdpr-google-consent-mode', JSON.stringify(consent)); 2324 }, 2325 2326 getGoogleConsent: function () { 2327 let consent = this.getLocalStorageGoogleConsent(); 2328 if (consent) { 2329 return JSON.parse(consent); 2330 } 2331 2332 return barConfig.googleConsentDefault; 2333 }, 2334 2335 getUserAllowedGroupIds: function (agreeAll) { 2336 let checkboxList = []; 2337 if (agreeAll) { 2338 checkboxList = document.querySelectorAll('.cookie-group-container .checkbox'); 2339 } else { 2340 checkboxList = document.querySelectorAll('.cookie-group-container .checkbox:checked'); 2341 } 2342 2343 const checked = Array.from(checkboxList || []); 2344 let groupIds = checked.reduce((groupIds, item) => { 2345 groupIds.push(item.dataset.groupId); 2346 return groupIds; 2347 }, []); 2348 2349 return groupIds; 2350 }, 2351 2352 saveGoogleConsent: function (consent) { 2353 this.sendConsentUpdate(consent); 2354 this.setLocalStorageGoogleConsent(consent); 2355 }, 2356 2357 sendConsentUpdate: function (consent) { 2358 if (typeof gtag === "function") { 2359 gtag('consent', 'update', consent); 2360 } 2361 }, 2362 2363 getGoogleConsentByAllowedGroupIds: function (allowedGroupIds) { 2364 let consent = {}; 2365 barConfig.googleConsentTypes.forEach(function (consentType) { 2366 consent[consentType] = 'denied'; 2367 }); 2368 2369 for (let i = 0; i < allowedGroupIds.length; i++) { 2370 let groupId = allowedGroupIds[i]; 2371 let type = barConfig.cookieGroupTypes[groupId] 2372 if (!type) { 2373 type = 'other' 2374 } 2375 2376 switch (type) { 2377 case 'essential': 2378 consent['security_storage'] = 'granted'; 2379 break; 2380 case 'marketing': 2381 consent['ad_storage'] = 'granted'; 2382 consent['ad_user_data'] = 'granted'; 2383 consent['ad_personalization'] = 'granted'; 2384 break; 2385 case 'functionality': 2386 consent['functionality_storage'] = 'granted'; 2387 consent['personalization_storage'] = 'granted'; 2388 break; 2389 case 'statistical': 2390 consent['analytics_storage'] = 'granted'; 2391 break; 2392 } 2393 } 2394 2395 return consent; 2396 }, 2397 2398 openSettings: function () { 2399 window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-open')); 2400 }, 2401 }; 2402 } 2403</script>
2403 2404 2405<div class="relative z-60" 2406 x-data="initGdprSettingsModal()" x-init="init()"> 2407 <div class="backdrop z-40" style="display: none" x-on:click="close" x-show="open" ></div> 2408 <div class="fixed top-1/2 left-1/2 -translate-y-1/2 -translate-x-1/2 z-50 flex flex-col max-lg:items-center w-full max-w-[calc(100%-32px)] lg:max-w-[720px]" x-show="open"> 2409 <button 2410 type="button" 2411 class="w-12 h-12 rounded-full flex items-center justify-center text-primary bg-white mx-auto mb-2 lg:ml-auto lg:-mr-12 lg:-mb-2" 2412 style="display: none" 2413 aria-label="Close" 2414 @click.prevent="close" 2415 > 2416 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6" width="18" height="18" aria-hidden="true"> 2417 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 2418</svg> 2419 </button> 2420 <div class="z-20 bg-white h-[85dvh] py-6 px-4 rounded-2xl lg:p-10 overflow-y-auto max-w-full" 2421 style="display: none" 2422 x-show.transition.origin.top="open"> 2423 2424 <h5 class="pb-4">Privacy Overview</h5> 2425 2426 <div> 2427 <p class="text-sm text-secondary"> Este site utiliza cookies para melhorar sua experiência enquanto você navega pelo site. Dentre esses cookies, os que são classificados como necessários são armazenados no seu navegador, pois são essenciais para o funcionamento das funcionalidades básicas do site. Também utilizamos cookies de terceiros que nos ajudam a analisar e entender como você utiliza este site. Esses cookies serão armazenados no seu navegador somente com o seu consentimento. Você também tem a opção de recusar esses cookies. No entanto, a recusa de alguns deles pode afetar sua experiência de navegação.</p> 2428 <div class="group-content my-6 space-y-1"> 2429 <div class="cookie-group-container cookie-group-container-1 card"
2430 x-data="{open1: false}"> 2431 <div class="flex items-center gap-1"> 2432 <input class="checkbox disabled:opacity-40 mr-1 rounded" type="checkbox" value="1" disabled checked data-group-id="1" name="allowed-group-1"> 2433 <h6 class="flex grow items-center justify-between" 2434 x-on:click="open1 = !open1"> 2435 <span> 2436 Essential </span> 2437 <span x-show="! open1"> 2438 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2439 <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/> 2440</svg> 2441 </span> 2442 <span x-show="open1" style="display: none"> 2443 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2444 <path stroke-linecap="round" stroke-linejoin="round" d="M20 12H4"/> 2445</svg> 2446 </span> 2447 </h6> 2448 </div> 2449 2450 <div class="content mt-4" x-show.transition.origin.top="open1" style="display: none"> 2451 <div> 2452 </div> 2453 <div class="cookie-list overflow-x-auto"> 2454 <table class="w-full"> 2455 <thead> 2456 <tr class="text-left text-sm"> 2457 <th class="pl-4 py-3 text-neutralGray-700 font-normal">Nome</th> 2458 <th class="py-3 font-normal">Description</th> 2459 <th class="pr-4 py-3 font-normal"> 2460 <span class="sr-only">Lifetime</span> 2461 </th> 2462 </tr> 2463 </thead> 2464 <tbody class="text-sm"> 2465 <tr class="odd:bg-white"> 2466 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">ADD_TO_CART</td> 2467 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">(Adobe Commerce only) Used by Google Tag Manager</td> 2468 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2469 </tr> 2470 <tr class="odd:bg-white"> 2471 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">GUEST-VIEW</td> 2472 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores the Order ID that guest shoppers use to retrieve their order status. Guest orders view. Used in Orders and Returns widgets</td> 2473 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2474 </tr> 2475 <tr class="odd:bg-white"> 2476 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">LOGIN_REDIRECT</td> 2477 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Preserves the destination page that was loading before the customer was directed to log in</td> 2478 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2479 </tr> 2480 <tr class="odd:bg-white"> 2481 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-BANNERS-CACHE-STORAGE</td> 2482 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">(Adobe Commerce only) Stores banner content locally to improve performance</td> 2483 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2484 </tr> 2485 <tr class="odd:bg-white"> 2486 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-MESSAGES</td> 2487 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Tracks error messages and other notifications that are shown to the user</td> 2488 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2489 </tr> 2490 <tr class="odd:bg-white"> 2491 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-TRANSLATION-STORAGE</td> 2492 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores translated content when requested by the shopper</td> 2493 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2494 </tr> 2495 <tr class="odd:bg-white"> 2496 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-TRANSLATION-FILE-VERSION</td> 2497 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Tracks the version of translations in local storage</td> 2498 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2499 </tr> 2500 <tr class="odd:bg-white"> 2501 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">PRODUCT_DATA_STORAGE</td> 2502 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores configuration for product data related to Recently Viewed/Compared Products</td> 2503 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2504 </tr> 2505 <tr class="odd:bg-white"> 2506 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">RECENTLY_COMPARED_PRODUCT</td> 2507 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores product IDs of recently compared products</td> 2508 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2509 </tr> 2510 <tr class="odd:bg-white"> 2511 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">RECENTLY_COMPARED_PRODUCT_PREVIOUS</td> 2512 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores product IDs of previously compared products for easy navigation</td> 2513 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2514 </tr> 2515 <tr class="odd:bg-white"> 2516 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">RECENTLY_VIEWED_PRODUCT</td> 2517 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores product IDs of recently viewed products for easy navigation</td> 2518 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2519 </tr> 2520 <tr class="odd:bg-white"> 2521 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">RECENTLY_VIEWED_PRODUCT_PREVIOUS</td> 2522 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores product IDs of recently previously viewed products for easy navigation</td> 2523 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2524 </tr> 2525 <tr class="odd:bg-white"> 2526 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">REMOVE_FROM_CART</td> 2527 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">(Adobe Commerce only) Used by Google Tag Manager</td> 2528 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2529 </tr> 2530 <tr class="odd:bg-white"> 2531 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">STF</td> 2532 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Records the time messages are sent by the SendFriend</td> 2533 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2534 </tr> 2535 <tr class="odd:bg-white"> 2536 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">X-MAGENTO-VARY</td> 2537 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Configuration setting that improves performance when using Varnish static content caching</td> 2538 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2539 </tr> 2540 <tr class="odd:bg-white"> 2541 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">FORM_KEY</td> 2542 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">A security measure that appends a random string to all form submissions to protect the data from Cross-Site Request Forgery</td> 2543 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2544 </tr> 2545 <tr class="odd:bg-white"> 2546 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">
2546MAGE-CACHE-SESSID</td> 2547 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">The value of this cookie triggers the cleanup of local cache storage</td> 2548 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2549 </tr> 2550 <tr class="odd:bg-white"> 2551 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-CACHE-STORAGE</td> 2552 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Local storage of visitor-specific content that enables ecommerce functions</td> 2553 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2554 </tr> 2555 <tr class="odd:bg-white"> 2556 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MAGE-CACHE-STORAGE-SECTION-INVALIDATION</td> 2557 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Forces local storage of specific content sections that should be invalidated</td> 2558 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2559 </tr> 2560 <tr class="odd:bg-white"> 2561 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">PERSISTENT_SHOPPING_CART</td> 2562 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores the key (ID) of persistent cart to make it possible to restore the cart for an anonymous shopper</td> 2563 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2564 </tr> 2565 <tr class="odd:bg-white"> 2566 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">PRIVATE_CONTENT_VERSION</td> 2567 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Appends a random, unique number and time to pages with customer content to prevent them from being cached on the server</td> 2568 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2569 </tr> 2570 <tr class="odd:bg-white"> 2571 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">SECTION_DATA_IDS</td> 2572 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores customer-specific information related to shopper-initiated actions, such as wish list display and checkout information</td> 2573 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2574 </tr> 2575 <tr class="odd:bg-white"> 2576 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">STORE</td> 2577 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Tracks the specific store view/locale selected by the shopper</td> 2578 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2579 </tr> 2580 </tbody> 2581 </table> 2582 </div> 2583 </div> 2584 2585</div> 2586 <div class="cookie-group-container cookie-group-container-2 card" 2587 x-data="{open2: false}"> 2588 <div class="flex items-center gap-1"> 2589 <input class="checkbox disabled:opacity-40 mr-1 rounded" type="checkbox" value="1" checked data-group-id="2" name="allowed-group-2"> 2590 <h6 class="flex grow items-center justify-between" 2591 x-on:click="open2 = !open2">
2592 <span> 2593 Marketing </span> 2594 <span x-show="! open2"> 2595 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2596 <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/> 2597</svg> 2598 </span> 2599 <span x-show="open2" style="display: none"> 2600 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2601 <path stroke-linecap="round" stroke-linejoin="round" d="M20 12H4"/> 2602</svg> 2603 </span> 2604 </h6> 2605 </div> 2606 2607 <div class="content mt-4" x-show.transition.origin.top="open2" style="display: none"> 2608 <div> 2609 </div> 2610 <div class="cookie-list overflow-x-auto"> 2611 <table class="w-full"> 2612 <thead> 2613 <tr class="text-left text-sm"> 2614 <th class="pl-4 py-3 text-neutralGray-700 font-normal">Nome</th> 2615 <th class="py-3 font-normal">Description</th> 2616 <th class="pr-4 py-3 font-normal"> 2617 <span class="sr-only">Lifetime</span> 2618 </th> 2619 </tr> 2620 </thead> 2621 <tbody class="text-sm"> 2622 <tr class="odd:bg-white"> 2623 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">CUSTOMER_SEGMENT_IDS</td> 2624 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Stores your Customer Segment ID</td> 2625 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2626 </tr> 2627 <tr class="odd:bg-white"> 2628 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">EXTERNAL_NO_CACHE</td> 2629 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">A flag that, indicates whether caching is on or off</td> 2630 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2631 </tr> 2632 <tr class="odd:bg-white"> 2633 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">FRONTEND</td> 2634 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Your session ID on the server</td> 2635 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2636 </tr> 2637 <tr class="odd:bg-white"> 2638 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">GUEST-VIEW</td> 2639 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Allows guests to edit their orders</td> 2640 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2641 </tr> 2642 <tr class="odd:bg-white"> 2643 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">LAST_CATEGORY</td> 2644 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">The last category you visited</td> 2645 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2646 </tr> 2647 <tr class="odd:bg-white"> 2648 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">LAST_PRODUCT</td> 2649 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">The last product you looked at</td> 2650 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2651 </tr> 2652 <tr class="odd:bg-white"> 2653 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">NEWMESSAGE</td> 2654 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Indicates whether a new message has been received</td> 2655 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2656 </tr> 2657 <tr class="odd:bg-white"> 2658 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">NO_CACHE</td> 2659 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Indicates whether it is allowed to use cache</td> 2660 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2661 </tr> 2662 </tbody> 2663 </table> 2664 </div> 2665 </div> 2666 2667</div> 2668 <div class="cookie-group-container cookie-group-container-3
2668card" 2669 x-data="{open3: false}"> 2670 <div class="flex items-center gap-1"> 2671 <input class="checkbox disabled:opacity-40 mr-1 rounded" type="checkbox" value="1" checked data-group-id="3" name="allowed-group-3"> 2672 <h6 class="flex grow items-center justify-between" 2673 x-on:click="open3 = !open3"> 2674 <span> 2675 Functionality </span> 2676 <span x-show="! open3"> 2677 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2678 <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/> 2679</svg> 2680 </span> 2681 <span x-show="open3" style="display: none"> 2682 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2683 <path stroke-linecap="round" stroke-linejoin="round" d="M20 12H4"/> 2684</svg> 2685 </span> 2686 </h6> 2687 </div> 2688 2689 <div class="content mt-4" x-show.transition.origin.top="open3" style="display: none"> 2690 <div> 2691 </div> 2692 <div class="cookie-list overflow-x-auto"> 2693 <table class="w-full"> 2694 <thead> 2695 <tr class="text-left text-sm"> 2696 <th class="pl-4 py-3 text-neutralGray-700 font-normal">Nome</th> 2697 <th class="py-3 font-normal">Description</th> 2698 <th class="pr-4 py-3 font-normal"> 2699 <span class="sr-only">Lifetime</span> 2700 </th> 2701 </tr> 2702 </thead> 2703 <tbody class="text-sm"> 2704 <tr class="odd:bg-white"> 2705 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">MG_DNT</td> 2706 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Allows you to restrict Adobe Commerce data collection if you have custom code to manage cookie consent on your site</td> 2707 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2708 </tr> 2709 <tr class="odd:bg-white"> 2710 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">USER_ALLOWED_SAVE_COOKIE</td> 2711 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Used for cookie restriction mode</td> 2712 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2713 </tr> 2714 <tr class="odd:bg-white"> 2715 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">AUTHENTICATION_FLAG</td> 2716 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Indicates if a shopper has signed in or signed out</td> 2717 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2718 </tr> 2719 <tr class="odd:bg-white"> 2720 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">DATASERVICES_CUSTOMER_ID</td> 2721 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Indicates if a shopper has signed in or signed out</td> 2722 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2723 </tr> 2724 <tr class="odd:bg-white"> 2725 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">DATASERVICES_CUSTOMER_GROUP</td> 2726 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Indicates a customer's group. This cookie is stored as sha1 checksum of the customer's group ID</td> 2727 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2728 </tr> 2729 <tr class="odd:bg-white"> 2730 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">DATASERVICES_CART_ID</td> 2731 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Identifies a shopper's cart actions</td> 2732 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2733 </tr> 2734 <tr class="odd:bg-white"> 2735 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">DATASERVICES_PRODUCT_CONTEXT</td> 2736 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Identifies a shopper's product interactions. This cookie contains the customer's unique quote ID in the system</td> 2737 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2738 </tr> 2739 </tbody> 2740 </table> 2741 </div> 2742 </div> 2743 2744</div> 2745 <div class="cookie-group-container cookie-group-container-4 card" 2746 x-data="{open4: false}"> 2747 <div class="flex items-center gap-1"> 2748 <input class="checkbox disabled:opacity-40 mr-1 rounded" type="checkbox" value="1" checked data-group-id="4" name="allowed-group-4"> 2749 <h6 class="flex grow items-center justify-between" 2750 x-on:click="open4 = !open4">
2751 <span> 2752 Statistical </span> 2753 <span x-show="! open4"> 2754 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2755 <path stroke-linecap="round" stroke-linejoin="round" d="M12 4v16m8-8H4"/> 2756</svg> 2757 </span> 2758 <span x-show="open4" style="display: none"> 2759 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="shrink-0 bg-white w-10 h-10 p-2 rounded-full" width="40" height="40" aria-hidden="true"> 2760 <path stroke-linecap="round" stroke-linejoin="round" d="M20 12H4"/> 2761</svg> 2762 </span> 2763 </h6> 2764 </div> 2765 2766 <div class="content mt-4" x-show.transition.origin.top="open4" style="display: none"> 2767 <div> 2768 </div> 2769 <div class="cookie-list overflow-x-auto"> 2770 <table class="w-full"> 2771 <thead> 2772 <tr class="text-left text-sm"> 2773 <th class="pl-4 py-3 text-neutralGray-700 font-normal">Nome</th> 2774 <th class="py-3 font-normal">Description</th> 2775 <th class="pr-4 py-3 font-normal"> 2776 <span class="sr-only">Lifetime</span> 2777 </th> 2778 </tr> 2779 </thead> 2780 <tbody class="text-sm"> 2781 <tr class="odd:bg-white"> 2782 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">_ga</td> 2783 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Used by Google Analytics</td> 2784 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2785 </tr> 2786 <tr class="odd:bg-white"> 2787 <td class="text-neutralGray-700 break-words rounded-l-2xl pl-4 py-3 align-top min-w-[186px] max-w-[186px] pr-2.5">_ga_*</td> 2788 <td class="py-3 align-top min-w-[355px] max-w-[355px] pr-2.5">Used by Google Analytics</td> 2789 <td class="rounded-r-2xl pr-3 py-3 align-top min-w-[50px] max-w-[50px]">1 Year</td> 2790 </tr> 2791 </tbody> 2792 </table> 2793 </div> 2794 </div> 2795 2796</div> 2797 </div> 2798 </div> 2799 <div class="bg-white sticky bottom-0 -mx-4 px-4 lg:px-10 lg:-mx-10 pb-2.5"> 2800 <button class="btn btn-primary btn-size-lg w-full -mb-6 lg:-mb-10" 2801 x-on:click="save"><span>Aplicar</span> 2802 </button> 2803 </div> 2804 </div> 2805 </div> 2806</div>
2807<script> 2808 function initGdprSettingsModal() { 2809 return { 2810 open: false, 2811 close: function () { 2812 this.open = false; 2813 document.querySelector('body').style.overflow = 'auto'; 2814 }, 2815 init: function () { 2816 window.addEventListener('mst-gdpr-cookie-settings-open', () => { 2817 document.querySelector('body').style.overflow = 'hidden'; 2818 this.open = true; 2819 }) 2820 }, 2821 save: function () { 2822 window.dispatchEvent(new CustomEvent('mst-gdpr-cookie-settings-save')); 2823 this.close(); 2824 } 2825 }; 2826 } 2827</script>
vendor: 1 bytes, line 2827
2827
2828<script> 2829 'use strict'; 2830 2831 (function () { 2832 const swiperSrc = 'https\u003A\u002F\u002Fstata\u002Dbrazil.com\u002Fstatic\u002Fversion1790944496\u002Ffrontend\u002FTimberlakeHyva\u002Ftimberlake\u002Fpt_BR\u002FMagento_PageBuilder\u002Fjs\u002Fswiper\u002Dbundle.min.js'; 2833 2834 function loadSwiper() { 2835 if (!window.sliderBannerSwiperPromise) { 2836 window.sliderBannerSwiperPromise = new Promise(function (resolve, reject) { 2837 if (window.Swiper) { 2838 resolve(window.Swiper); 2839 2840 return; 2841 } 2842 2843 const script = document.createElement('script'); 2844 2845 script.src = swiperSrc; 2846 script.async = true; 2847 script.addEventListener('load', function () { 2848 resolve(window.Swiper); 2849 }); 2850 script.addEventListener('error', reject); 2851 document.head.appendChild(script); 2852 }); 2853 } 2854 2855 return window.sliderBannerSwiperPromise; 2856 } 2857 2858 document.addEventListener('alpine:init', function () { 2859 window.Alpine.data('sliderBanner', function () { 2860 return { 2861 swiper: null, 2862 2863 // Gap between slides, New style only. Must stay larger than the 2864 // tab's 40px thickness (w-10 on the prototype): a tab is pinned 2865 // 40px left of its own slide, so only a wider gap keeps the next 2866 // tab clear of the previous card's right edge while at rest. 2867 slideGap: 56, 2868 2869 /** 2870 * The Old style root is the Swiper element itself; the New style 2871 * wraps it so the tabs can sit outside the clipping box. 2872 */ 2873 swiperEl() { 2874 return this.$root.classList.contains('swiper') 2875 ? this.$root 2876 : this.$root.querySelector('.swiper'); 2877 }, 2878 2879 /** 2880 * One Bottom Title tab per slide, cloned from the prototype and 2881 * placed at its own slide's offset, so each tab is pinned to the 2882 * left edge of the slide it belongs to. Only the New style has 2883 * the refs. 2884 */ 2885 buildTabs(swiper) { 2886 const track = this.$refs.tabTrack, 2887 prototype = this.$refs.tabPrototype; 2888 2889 if (!track || !prototype) { 2890 return; 2891 } 2892 2893 track.querySelectorAll('[data-bottom-title-tab]').forEach(function (el) { 2894 el.remove(); 2895 }); 2896 2897 this.$root.querySelectorAll('.swiper-slide').forEach(function (slide, index) { 2898 const source = slide.querySelector('[data-element="bottom_title_side"]'), 2899 offset = swiper && swiper.slidesGrid ? swiper.slidesGrid[index] : 0, 2900 tab = prototype.cloneNode(false); 2901 2902 tab.removeAttribute('x-ref'); 2903 tab.removeAttribute('hidden'); 2904 tab.setAttribute('data-bottom-title-tab', ''); 2905 tab.setAttribute('data-banner-border', slide.getAttribute('data-banner-border') || 'blue'); 2906 tab.style.left = offset + 'px'; 2907 tab.textContent = source ? source.textContent.trim() : ''; 2908 track.appendChild(tab); 2909 }); 2910 }, 2911 2912 /** 2913 * Move the track by Swiper's own translate, so each tab travels 2914 * exactly with the slide it is pinned to. 2915 */ 2916 moveTabs(swiper) { 2917 const track = this.$refs.tabTrack; 2918 2919 if (track) { 2920 track.style.transform = 'translateX(' + swiper.translate + 'px)'; 2921 } 2922 }, 2923 2924 init() { 2925 const root = this.swiperEl(); 2926 2927 if (!root) { 2928 return; 2929 } 2930 2931 loadSwiper().then(function (Swiper) { 2932 this.swiper = new Swiper(root, { 2933 speed: 400, 2934 slidesPerView: 1, 2935 // Only the New style has tabs to make room for; the Old 2936 // style is byte-identical to the widget and stays flush. 2937 spaceBetween: this.$refs.tabTrack ? this.slideGap : 0, 2938 navigation: { 2939 nextEl: root.querySelector('.swiper-button-next'), 2940 prevEl: root.querySelector('.swiper-button-prev') 2941 }, 2942 pagination: { 2943 el: root.querySelector('.swiper-pagination'), 2944 type: 'fraction', 2945 renderFraction: function (currentClass, totalClass) { 2946 return '<span class="' + currentClass + ' text-base text-white"></span>' 2947 + '<span class="text-xs text-white/30">/</span>' 2948 + '<span class="' + totalClass + ' text-xs text-white/30"></span>'; 2949 } 2950 }, 2951 on: { 2952 init: function (swiper) { 2953 this.buildTabs(swiper); 2954 this.moveTabs(swiper); 2955 }.bind(this), 2956 // setTranslate, not progress: Swiper emits progress 2957 // from updateProgress(), which runs before it sets the 2958 // transition duration, so moving the track there applies 2959 // the transform while the duration is still 0 and it 2960 // snaps instead of animating. setTranslate runs after. 2961 setTranslate: this.moveTabs.bind(this), 2962 // Swiper hands us the duration it is using: 0 while 2963 // dragging, so the tabs track the finger exactly, and 2964 // the slide speed otherwise, so they ease in step. 2965 setTransition: function (swiper, duration) { 2966 const track = this.$refs.tabTrack; 2967 2968 if (track) { 2969 track.style.transitionDuration = duration + 'ms'; 2970 } 2971 }.bind(this), 2972 // slide widths change, so the offsets must be redone 2973 resize: function (swiper) { 2974 this.buildTabs(swiper); 2975 this.moveTabs(swiper); 2976 }.bind(this) 2977 } 2978 }); 2979 }.bind(this)); 2980 }, 2981 2982 destroy() { 2983 if (this.swiper) { 2984 this.swiper.destroy(true, true); 2985 this.swiper = null; 2986 } 2987 } 2988 }; 2989 }); 2990 }); 2991 })(); 2992</script>
2992 2993 2994 <div wire:id="stripe.paymentrequest.minicart" wire:initial-data="{"fingerprint":{"id":"stripe.paymentrequest.minicart","name":"stripe-payments.minicart.shortcut","locale":"pt_BR","path":"\/","method":"GET","resolver":"layout","handle":"customer_account_login","type":"default","v":"acj"},"effects":{"listeners":["shipping_method_selected","payment_method_selected","coupon_code_applied","coupon_code_revoked","shipping_address_saved","shipping_address_activated","billing_address_saved","billing_address_activated","refresh"]},"serverMemo":{"data":{"eceParams":[],"walletParams":[],"placeOrderResult":[],"shippingAddress":[],"isEmptyCart":false,"productId":null,"resolvePayload":[],"orderPlaced":false,"totalAmount":0},"htmlHash":"20f46407","children":[],"checksum":"e38b67a33506d93f368fcac2418b65434bc665b6b4378b8c0f9127ee5b216ce7"}}" class="hidden"></div> 2995<!-- Magewire Component wire-end:stripe.paymentrequest.minicart -->
2995<script> 2996 document.addEventListener('livewire:available', (event) => { 2997 const orig = Element.prototype.setAttribute; 2998 2999 Element.prototype.setAttribute = function patchLivewireSetAttribute(name, value) { 3000 // In Alpine v2, ignore Alpine v3 x-bind attributes that are used as x-spread 3001 if (window.Alpine && Alpine.version.substring(0, 1) === '2' && ! name) return; 3002 orig.call(this, name, value); 3003 } 3004 }) 3005</script>
3005 3006
3007<script src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/Magewirephp_Magewire/js/livewire.js"></script>
3007 3008
3008<script> 3009 'use strict'; 3010 3011 if (window.magewire) { 3012 console.warn('Magewire: It looks like Magewire\'s JavaScript assets have already been loaded. Make sure you aren\'t loading them twice.') 3013 } 3014 3015 window.magewire = new Livewire() 3016 3017 window.Livewire = window.magewire 3018 window.Magewire = window.magewire 3019 window.livewire_app_url = 'https://stata-brazil.com/magewire/post' 3020 window.livewire_token = window.hyva.getFormKey() 3021 3022 if (window.Alpine) { 3023 document.addEventListener("DOMContentLoaded", () => { 3024 setTimeout(function() { 3025 console.warn("Magewire: It looks like AlpineJS has already been loaded. Make sure Magewire\'s scripts are loaded before AlpineJS.") 3026 }) 3027 }) 3028 } 3029 3030 (() => { 3031 const startMagewireOnce = () => { 3032 document.removeEventListener('DOMContentLoaded', startMagewireOnce) 3033 window.removeEventListener('alpine:init', startMagewireOnce) 3034 window.magewire.start() 3035 } 3036 3037 const initAlpine = window.deferLoadingAlpine || ((callback) => callback()) 3038 window.deferLoadingAlpine = (callback) => { 3039 window.addEventListener('magewire:load', () => { 3040 initAlpine(callback) 3041 }); 3042 } 3043 document.addEventListener('DOMContentLoaded', startMagewireOnce) 3044 3045 window.addEventListener('alpine:init', startMagewireOnce) 3046 })(); 3047 3048 Magewire.dispatchEvent = (name, event = {}, element = null) => { 3049 let e = new CustomEvent(`magewire:${ name }`, Object.assign({ 3050 'bubbles': true, 3051 'cancelable': false 3052 }, event)) 3053 3054 if (element) { 3055 element.dispatchEvent(e); 3056 } else { 3057 document.dispatchEvent(e) 3058 } 3059 } 3060 3061 ['load', 'update'].forEach(function (target, index) { 3062 document.addEventListener('livewire:' + target, (event) => { 3063 Magewire.dispatchEvent(target, event) 3064 }) 3065 }) 3066 3067 Magewire.plugins = {} 3068 </script>
3068 3069 3070
3070<script> 3071 'use strict'; 3072 3073 (() => { 3074 let queue = []; 3075 3076 const loaderTypeResolvers = { 3077 syncInput: (item, loader) => { 3078 let name = item.payload.name; 3079 3080 let expression = [ 3081 `${ name }:${ item.payload.value }`, 3082 `${ name.substr(0, name.lastIndexOf('.')) }:${ item.payload.value }`, 3083 `${ name }`, 3084 `${ name.substr(0, name.lastIndexOf('.')) }` 3085 ].filter((expression) => { 3086 return expression in loader 3087 })[0] || false; 3088 3089 if (expression) { 3090 return loader[expression]; 3091 } 3092 3093 return true; 3094 }, 3095 callMethod: (item, loader) => { 3096 return loader[item.method]; 3097 }, 3098 fireEvent: (item, loader) => { 3099 return loader[item.payload.event]; 3100 } 3101 } 3102 3103 const getLoaderData = function(message, component) { 3104 let loader = component.effects.loader || null; 3105 3106 if (! loader) { 3107 return null; 3108 } 3109 3110 let data = {}; 3111 3112 for (let item of message.updateQueue) { 3113 let value = true; 3114 3115 if (typeof loader === 'object' && item.type in loaderTypeResolvers) { 3116 value = loaderTypeResolvers[item.type](item, loader); 3117 } else if (typeof loader === 'string') { 3118 value = [loader]; 3119 } 3120 3121 if (value === undefined) { 3122 value = false; 3123 3124 if ('*' in loader) { 3125 value = loader['*']; 3126 } 3127 } 3128 3129 data[component.id] = { 3130 key: Date.now(), 3131 component: component, 3132 loader: value, 3133 update: item 3134 }; 3135 } 3136 3137 return data; 3138 } 3139 3140 const start = function(loader, component) { 3141 if (! loader || ! component) { 3142 Magewire.dispatchEvent(`loader:start`); 3143 return; 3144 } 3145 3146 let first = ! queue.some(({ parent }) => parent); 3147 let me = queue.findIndex(item => item && item.component && item.component.id === component.id); 3148 3149 if (first) { 3150 queue.push({ 3151 loader: loader, 3152 component: component 3153 }); 3154 } 3155 3156 if (queue[me]) { 3157 queue[me].loader = loader; 3158 } 3159 3160 queue.forEach((item, index) => { 3161 item.parent = item.parent ?? false; 3162 3163 if (me > index && item.loader) { 3164 stop(item.component, false, true); 3165 } 3166 }); 3167 3168 Magewire.dispatchEvent(`loader:${ first ? 'start' : 'tick' }`, { 3169 detail: loader 3170 }); 3171 } 3172 3173 const stop = function(component, failure = false, force = false) { 3174 if (failure) { 3175 force = true; 3176 } 3177 3178 let remove = []; 3179 const me = queue.findIndex(item => item && item.component && item.component.id === component.id); 3180 3181 if (queue[me]) { 3182 queue[me].done = true; 3183 } 3184 3185 if (force) { 3186 remove.push(me); 3187 } else if (queue.every(item => item && item.done)) { 3188 remove = Object.keys(queue); 3189 } 3190 3191 remove.forEach(index => { 3192 if (queue[index] && queue[index].loader) { 3193 Magewire.dispatchEvent(`loader:stop`, { 3194 detail: { 3195 loader: queue[index].loader, 3196 component: queue[index].component, 3197 failure: failure 3198 } 3199 }); 3200 } 3201 3202 delete queue[index]; 3203 }); 3204 3205 if (Object.values(queue).length === 0) { 3206 Magewire.dispatchEvent(`loader:done`, { 3207 detail: { 3208 component: component, 3209 failure: failure 3210 } 3211 }); 3212 3213 // Empty insurance. 3214 queue = []; 3215 } 3216 } 3217 3218 Magewire.plugins.loader = (() => { 3219 return { 3220 start(loader, component) { 3221 return start(loader, component); 3222 }, 3223 stop(component, failure = false, force = false) { 3224 return stop(component, failure, force); 3225 } 3226 } 3227 })(); 3228 3229 document.addEventListener('DOMContentLoaded', () => { 3230 Magewire.hook('message.sent', (message, component) => { 3231 let loader = getLoaderData(message, component) || {}; 3232 3233 if (component.id in loader && loader[component.id].loader) { 3234 Magewire.plugins.loader.start(loader[component.id], component); 3235 } 3236 }); 3237 3238 Magewire.hook('message.processed', (message, component) => { 3239 if (message.response && message.response.effects) { 3240 (message.response.effects.emits || []).forEac
3240h((emit) => { 3241 Magewire.components.componentsListeningForEvent(emit.event) 3242 .filter(listener => ! emit.to || emit.to === listener.id) 3243 .forEach(listener => queue.push({ component: listener, parent: component })); 3244 }); 3245 3246 let ids = []; 3247 3248 for (let i = queue.length - 1; i >= 0; i--) { 3249 if (queue[i]) { 3250 if (ids.indexOf(queue[i].component.id) !== -1) { 3251 queue.splice(i, 1); 3252 continue; 3253 } 3254 3255 ids.push(queue[i].component.id); 3256 } 3257 } 3258 } 3259 3260 Magewire.plugins.loader.stop(component); 3261 3262 if (component.effects && message.response.effects) { 3263 component.effects.loader = message.response.effects.loader; 3264 } 3265 }); 3266 3267 Magewire.hook('message.failed', (message, component) => { 3268 Magewire.plugins.loader.stop(component, true); 3269 }); 3270 }); 3271 })(); 3272 </script>
vendor: 1 bytes, line 3272
3272
3273<script> 3274 'use strict'; 3275 3276 Magewire.onPageExpired(() => { 3277 alert('The\u0020session\u0020has\u0020expired.\u0020Therefore,\u0020the\u0020page\u0020will\u0020be\u0020refreshed\u0020when\u0020you\u0020confirm.') 3278 window.location.reload() 3279 }) 3280 3281 Magewire.onError((status, response) => { 3282 if (status === 419) { 3283 return 3284 } 3285 3286 response.clone().text().then((result) => { 3287 let messages = {"419":"The session has expired. Therefore, the page will be refreshed when you confirm."}; 3288 result = JSON.parse(result) 3289 3290 console.error( 3291 `Magewire: ${ messages[status] || result.message || 'Something went wrong' } (${ status })` 3292 ) 3293 }).catch((exception) => { 3294 console.error(exception) 3295 }) 3296 3297 return false 3298 }) 3299</script>
3299 3300 3301
3301<script> 3302 'use strict'; 3303 3304 Magewire.hasPlugin = function(name) { 3305 const plugins = Magewire.plugins 3306 3307 if (typeof plugins !== 'object' || plugins.length === 0) { 3308 return false; 3309 } else if (typeof name === 'object') { 3310 return name.every((name) => Magewire.hasPlugin(name)) 3311 } 3312 3313 return name in plugins 3314 } 3315</script>
3315 3316 3317
3317<script> 3318 Magewire.dispatchEvent('available') 3319 </script>
3319 3320 3321
3321<script> 3322 Magewire.directive('select', (element, directive, component) => { 3323 if (element.tagName !== 'SELECT') { 3324 console.error('Magewire: [wire:select] can only be applied on elements of type select.', element) 3325 return 3326 } 3327 if (directive.value) { 3328 console.error('Magewire: [wire:select] shouldn\'t have a value.', element) 3329 return 3330 } 3331 if (! element.hasAttribute('wire:model.defer')) { 3332 console.error('Magewire: [wire:model] requires a defer modifier for [wire:select] to function properly.', element) 3333 return 3334 } 3335 3336 let changed = false, 3337 timeout = null 3338 3339 const sync = () => { 3340 clearTimeout(timeout) 3341 3342 if (changed) { 3343 changed = false 3344 3345 component.fireMessage() 3346 } 3347 } 3348 3349 const debounce = () => { 3350 if (directive.modifiers.includes('debounce')) { 3351 clearTimeout(timeout) 3352 3353 timeout = setTimeout(() => sync(), directive.durationOr(1500)) 3354 } 3355 } 3356 3357 const change = () => { 3358 changed = true 3359 3360 debounce() 3361 } 3362 3363 element.addEventListener('keydown', debounce) 3364 element.addEventListener('change', change) 3365 3366 if (directive.modifiers.includes('blur')) { 3367 element.addEventListener('blur', () => sync()) 3368 } 3369 }) 3370</script>
3370 3371
3372<script> 3373 let SnapSlider = class { 3374 constructor(el, { 3375 labelSepparator = 'of', 3376 autoPager, 3377 groupPager 3378 } = {}) { 3379 this.el = el; 3380 this.track = this.el.querySelector("[data-track]"); 3381 if (!this.track) { 3382 console.warn( 3383 "No Slider track defined, reverting back to CSS slider.\nPlease create a wrapper for your slides with the attribute data-track", 3384 this.el 3385 ); 3386 return; 3387 } 3388 this.initialLoad = true; 3389 this.slides = []; 3390 this.inViewObserver; 3391 this.mutationObserver; 3392 this.resizeObserver; 3393 this.pager = this.el.querySelector("[data-pager]"); 3394 this.navBtns = Array.from( 3395 this.el.querySelectorAll("[data-next], [data-prev]") 3396 ); 3397 this.slideLabelSepparator = this.el.dataset.slideLabelSepparator || labelSepparator; 3398 this.useAutoPager = autoPager || this.el.hasAttribute("data-auto-pager") || false; 3399 this.useGroupPager = groupPager || this.el.hasAttribute("data-group-pager") || false; 3400 this.sliderLabel = this.el.hasAttribute("aria-label") && this.el.getAttribute("aria-label").toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, ""); 3401 this.sliderId = this.el.id || this.sliderLabel || "slider"; 3402 this.markerIdName = "data-target-id"; 3403 this.pagerClasses = this.el.dataset.pagerClass || "snap-pager"; 3404 this.markerClasses = this.el.dataset.markerClass || "snap-marker"; 3405 this.init(); 3406 } 3407 init() { 3408 this.setupSlides(); 3409 this.setupNav(); 3410 if (this.useAutoPager) { 3411 this.createPager(); 3412 } else { 3413 this.setupPager(); 3414 } 3415 this.setupObservers(); 3416 this.setupMutationObserver(); 3417 this.setupResizeObserver(); 3418 this.el.addEventListener("click", this.eventHandler.bind(this)); 3419 this.el.addEventListener("keydown", this.eventHandler.bind(this)); 3420 } 3421 destroy() { 3422 this.inViewObserver?.disconnect(); 3423 this.mutationObserver?.disconnect(); 3424 this.resizeObserver?.disconnect(); 3425 this.el.removeEventListener("click", this.eventHandler.bind(this)); 3426 this.el.removeEventListener("keydown", this.eventHandler.bind(this)); 3427 } 3428 roundUpIfGreaterThan(number, min = 8) { 3429 const decimalPart = number - Math.floor(number); 3430 return decimalPart >= min ? Math.ceil(number) : Math.floor(number); 3431 } 3432 getInViewItems() { 3433 const inViewSlides = this.track.querySelectorAll("[data-in-view]"); 3434 const firstInViewSlide = inViewSlides[0] || null; 3435 const lastInViewSlide = inViewSlides[inViewSlides.length - 1] || null; 3436 const isAtStart = firstInViewSlide === this.slides[0]; 3437 const isAtEnd = lastInViewSlide === this.slides[this.slides.length - 1]; 3438 return { 3439 inViewSlides, 3440 totalInViewSlides: inViewSlides.length, 3441 firstInViewSlide, 3442 lastInViewSlide, 3443 isAtStart, 3444 isAtEnd, 3445 hasNoOverflow: isAtStart && isAtEnd 3446 }; 3447 } 3448 groupPagerMarkers() { 3449 if (this.slides.length === 0 || !this.pager || !this.useGroupPager) return; 3450 const totalVisibleSlides = this.roundUpIfGreaterThan( 3451 this.track.offsetWidth / this.slides[0].offsetWidth 3452 ); 3453 const markers = Array.from(this.pager.querySelectorAll("a, button")); 3454 markers.forEach((marker, index) => { 3455 marker.style.display = index % totalVisibleSlides === 0 ? null : "none"; 3456 }); 3457 } 3458 handleInView(entries) { 3459 entries.forEach((entry) => { 3460 const marker = this.pager && (this.pager.querySelector(`[href="#${entry.target.id}"]`) || this.pager.querySelector( 3461 `[${this.markerIdName}="${entry.target.id}"]` 3462 )); 3463 entry.target.toggleAttribute("data-in-view", entry.isIntersecting); 3464 entry.target.toggleAttribute("inert", !entry.isIntersecting); 3465 marker?.setAttribute("aria-current", entry.isIntersecting); 3466 marker?.setAttribute("tabindex", entry.isIntersecting ? "0" : "-1"); 3467 }); 3468 const { 3469 isAtStart, 3470 isAtEnd, 3471 hasNoOverflow 3472 } = this.getInViewItems(); 3473 this.navBtns.forEach((btn) => { 3474 if (btn.hasAttribute("data-next")) { 3475 btn.style.visibility = hasNoOverflow ? "hidden" : null; 3476 isAtEnd ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 3477 } 3478 if (btn.hasAttribute("data-prev")) { 3479 btn.style.visibility = hasNoOverflow ? "hidden" : null; 3480 isAtStart ? btn.setAttribute("disabled", "") : btn.removeAttribute("disabled"); 3481 } 3482 }); 3483 if (this.pager) { 3484 this.pager.style.visibility = hasNoOverflow ? "hidden" : null; 3485 } 3486 if (!this.initialLoad) { 3487 this.el.dispatchEvent( 3488 new CustomEvent("slideChange", { 3489 detail: this.getInViewItems() 3490 }) 3491 ); 3492 } else { 3493 this.initialLoad = false;
3494 } 3495 if (document.activeElement.parentElement.hasAttribute("data-pager")) { 3496 const activeItems = this.pager.querySelectorAll('[tabindex="0"]'); 3497 if (activeItems.length) { 3498 activeItems[0].focus({ preventScroll: true }); 3499 } 3500 } 3501 } 3502 getSlides() { 3503 if (!this.track) return []; 3504 return Array.from(this.track.children).filter( 3505 (child) => child.tagName.toLowerCase() !== "template" && child.tagName.toLowerCase() !== "style" && child.tagName.toLowerCase() !== "script" 3506 ); 3507 } 3508 refreshSlides() { 3509 this.initialLoad = true; 3510 this.slides = this.getSlides(); 3511 this.setupSlides(); 3512 if (this.useAutoPager) { 3513 this.createPager(); 3514 } else { 3515 this.setupPager(); 3516 } 3517 this.groupPagerMarkers(); 3518 this.setupObservers(); 3519 } 3520 setupSlides() { 3521 this.slides = this.getSlides(); 3522 this.slides.forEach((slide, index) => { 3523 const totalSlides = this.slides.length; 3524 const currentSlide = index + 1; 3525 const existingLabel = slide.getAttribute("aria-label") || ""; 3526 const isImage = slide.tagName.toLowerCase() === "img" || slide.tagName.toLowerCase() === "picture"; 3527 const slideLabelTag = isImage ? "alt" : "aria-label"; 3528 const hasAutoLabel = existingLabel.startsWith( 3529 `${currentSlide} ${this.slideLabelSepparator} ` 3530 ); 3531 if (!slide.hasAttribute("id")) { 3532 slide.setAttribute( 3533 "id", 3534 `${this.sliderId}-item-${currentSlide}` 3535 ); 3536 } 3537 if (!slide.hasAttribute(slideLabelTag) || slide.getAttribute(slideLabelTag) === "" || hasAutoLabel) { 3538 slide.setAttribute( 3539 slideLabelTag, 3540 `${currentSlide} ${this.slideLabelSepparator} ${totalSlides}` 3541 ); 3542 } 3543 if (slide.tagName.toLowerCase() === "div" && !slide.hasAttribute("role")) { 3544 slide.setAttribute("role", "group"); 3545 } 3546 if (this.pager && !isImage) { 3547 slide.setAttribute("role", "tabpanel"); 3548 } 3549 if (slide.getAttribute("role") === "group") { 3550 slide.setAttribute("aria-roledescription", "item"); 3551 } 3552 }); 3553 if (!this.el.hasAttribute("role") && this.el.tagName !== "SECTION") { 3554 this.el.setAttribute("role", "region"); 3555 } 3556 if (!this.el.hasAttribute("aria-roledescription")) { 3557 this.el.setAttribute("aria-roledescription", "carousel"); 3558 } 3559 this.track.setAttribute("tabindex", 0); 3560 this.track.setAttribute("aria-live", "polite"); 3561 } 3562 setupNav() { 3563 this.navBtns.forEach((btn) => { 3564 btn.setAttribute("disabled", ""); 3565 btn.removeAttribute("hidden"); 3566 btn.classList.remove("invisible"); 3567 btn.style.visibility = null; 3568 }); 3569 } 3570 createPager() { 3571 const newPager = document.createElement("nav"); 3572 newPager.setAttribute("data-pager", ""); 3573 newPager.setAttribute("role", "tablist"); 3574 newPager.classList.add(...this.pagerClasses.split(" ")); 3575 this.slides.forEach((slide, index) => { 3576 const marker = document.createElement("button"); 3577 const slideId = slide.id || `${this.sliderId}-item-${index + 1}`; 3578 marker.setAttribute(this.markerIdName, slideId); 3579 marker.classList.add(...this.markerClasses.split(" ")); 3580 this.setupPagerMarker(marker, index); 3581 newPager.appendChild(marker); 3582 if (slide.tagName.toLowerCase() !== "img" && slide.tagName.toLowerCase() !== "picture") { 3583 slide.removeAttribute("aria-roledescription"); 3584 slide.setAttribute("role", "tabpanel"); 3585 } 3586 }); 3587 if (this.pager) { 3588 this.pager.setAttribute("role", "tablist"); 3589 this.pager.replaceChildren(...newPager.children); 3590 } else { 3591 this.track.after(newPager); 3592 this.pager = this.el.querySelector("[data-pager]"); 3593 } 3594 } 3595 setupPager() { 3596 if (!this.pager) return; 3597 this.pager.setAttribute("role", "tablist"); 3598 const items = Array.from(this.pager.querySelectorAll("a, button"));
3599 items.forEach((marker, index) => this.setupPagerMarker(marker, index)); 3600 } 3601 setupPagerMarker(marker, index) { 3602 const markerId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 3603 const slideId = markerId || `${this.sliderId}-item-${index + 1}`; 3604 if (!markerId) { 3605 marker.setAttribute(this.markerIdName, slideId); 3606 } 3607 marker.setAttribute("role", "tab"); 3608 marker.setAttribute("aria-controls", slideId); 3609 marker.setAttribute("aria-posinset", index + 1); 3610 marker.setAttribute("aria-setsize", this.slides.length); 3611 marker.setAttribute("tabindex", "-1"); 3612 if (!marker.hasAttribute("aria-label")) { 3613 marker.setAttribute("aria-label", `Slide ${index + 1}`); 3614 } 3615 } 3616 setupObservers() { 3617 if (this.inViewObserver) { 3618 this.inViewObserver.disconnect(); 3619 } 3620 this.inViewObserver = new IntersectionObserver( 3621 this.handleInView.bind(this), { 3622 root: this.track, 3623 threshold: 0.8 3624 } 3625 ); 3626 this.slides.forEach((slide) => this.inViewObserver.observe(slide)); 3627 } 3628 setupMutationObserver() { 3629 this.mutationObserver = new MutationObserver( 3630 this.refreshSlides.bind(this) 3631 ); 3632 this.mutationObserver.observe(this.track, { 3633 childList: true, 3634 subtree: false 3635 }); 3636 } 3637 setupResizeObserver() { 3638 this.resizeObserver = new ResizeObserver( 3639 this.groupPagerMarkers.bind(this) 3640 ); 3641 this.resizeObserver.observe(this.el); 3642 } 3643 goToSlideDir(dir = "next") { 3644 const { 3645 firstInViewSlide, 3646 lastInViewSlide 3647 } = this.getInViewItems(); 3648 const isPrev = dir === "prev"; 3649 let targetSlide = isPrev ? firstInViewSlide?.previousElementSibling : lastInViewSlide?.nextElementSibling; 3650 if (!targetSlide) return; 3651 if (targetSlide.tagName.toLowerCase() === "template") { 3652 targetSlide = isPrev ? targetSlide?.previousElementSibling : targetSlide?.nextElementSibling; 3653 } 3654 targetSlide.scrollIntoView({ block: "nearest", inline: isPrev ? "end" : "start" }); 3655 } 3656 pagerToSlide(event) { 3657 if (!event.target.closest("[data-pager]")) return; 3658 const marker = event.target.closest("a, button"); 3659 if (!marker) return; 3660 event.preventDefault(); 3661 const slideId = marker.getAttribute("href")?.slice(1) || marker.getAttribute(this.markerIdName); 3662 const targetSlide = this.track.querySelector(`#${slideId}`); 3663 targetSlide?.scrollIntoView({ block: "nearest", inline: "start" }); 3664 } 3665 eventHandler(event) { 3666 const target = event.target.closest( 3667 "[data-next], [data-prev], [data-pager]" 3668 ); 3669 if (!target) return; 3670 if (event.type === "click") { 3671 if (target.hasAttribute("data-next")) { 3672 this.goToSlideDir("next"); 3673 } else if (target.hasAttribute("data-prev")) { 3674 this.goToSlideDir("prev"); 3675 } else if (target.closest("[data-pager]")) { 3676 this.pagerToSlide(event); 3677 } 3678 } 3679 if (event.type === "keydown" && target.closest("[data-pager]")) { 3680 if (event.key === "ArrowRight") { 3681 this.goToSlideDir("next"); 3682 } else if (event.key === "ArrowLeft") { 3683 this.goToSlideDir("prev"); 3684 } 3685 } 3686 } 3687 }; 3688 3689 (() => { 3690 function alpineSnapSlider(Alpine) { 3691 Alpine.directive("snap-slider", (el, { 3692 modifiers 3693 }, { 3694 cleanup 3695 }) => { 3696 const autoPager = modifiers.includes("auto-pager");
3697 const groupPager = modifiers.includes("group-pager"); 3698 const slider = new SnapSlider(el, { 3699 autoPager, 3700 groupPager 3701 }); 3702 cleanup(() => { 3703 slider.destroy(); 3704 }); 3705 }); 3706 } 3707 3708 document.addEventListener("alpine:init", () => { 3709 window.Alpine.plugin(alpineSnapSlider); 3710 }); 3711 })(); 3712</script>
vendor: 1 bytes, line 3712
3712
3713<script> 3714 (() => { 3715 // src/dialog.js 3716 function dialog_default(Alpine) { 3717 Alpine.directive("htmldialog", fylgjaAlpineDialog); 3718 function fylgjaAlpineDialog(el, { expression, modifiers }, { evaluateLater, cleanup }) { 3719 const evaluate = expression.length ? evaluateLater(expression) : () => {}; 3720 const canEvaluate = expression.length > 0; 3721 const lockPageScroll = modifiers.includes("noscroll"); 3722 const closeBy = el.getAttribute("closeby") || modifierValue(modifiers, "closeby", "closerequest"); 3723 el.style.display = null; 3724 el.style.length === 0 && el.removeAttribute("style"); 3725 if (el._x_isShown) { 3726 open(); 3727 } 3728 const closeBySupported = (() => { 3729 return "closedBy" in HTMLDialogElement.prototype; 3730 })(); 3731 function scrollLock(use = true) { 3732 document.body.style.overflow = use ? "hidden" : ""; 3733 } 3734 function dialogSubmit(event) { 3735 if (event.target.getAttribute("method") === "dialog" || event.submitter?.getAttribute("formmethod") === "dialog") { 3736 event.preventDefault(); 3737 evaluate(); 3738 } 3739 } 3740 function escapeDialog(event) { 3741 if (event.key !== "Escape") return; 3742 event.preventDefault(); 3743 if (closeBy === "none") return; 3744 evaluate(); 3745 } 3746 function handleCloseByEvent(event) { 3747 if (event.target !== el) return; 3748 const rect = el.getBoundingClientRect(); 3749 const isInDialog = rect.top <= event.clientY && event.clientY <= rect.top + rect.height && rect.left <= event.clientX && event.clientX <= rect.left + rect.width; 3750 if (!isInDialog) { 3751 if (closeBy === "any") { 3752 if (closeBySupported) { 3753 event.preventDefault(); 3754 } 3755 evaluate(); 3756 } 3757 } 3758 } 3759 function handleCloseEvent() { 3760 evaluate(); 3761 } 3762 function open() { 3763 if (el.hasAttribute("open")) return; 3764 el.showModal(); 3765 scrollLock(lockPageScroll); 3766 } 3767 function close() { 3768 if (!el.hasAttribute("open")) return; 3769 el.close(); 3770 scrollLock(false); 3771 } 3772 el._x_doShow = () => open(); 3773 el._x_doHide = () => close(); 3774 el.addEventListener("keydown", escapeDialog); 3775 el.addEventListener("submit", dialogSubmit); 3776 el.addEventListener("click", handleCloseByEvent); 3777 el.addEventListener("cancel", handleCloseEvent); 3778 cleanup(() => { 3779 el.removeEventListener("keydown", escapeDialog); 3780 el.removeEventListener("submit", dialogSubmit); 3781 el.removeEventListener("click", handleCloseByEvent); 3782 el.removeEventListener("cancel", handleCloseEvent); 3783 scrollLock(false); 3784 }); 3785 } 3786 } 3787 function modifierValue(modifiers, key, fallback) { 3788 if (modifiers.indexOf(key) === -1) return fallback; 3789 const rawValue = modifiers[modifiers.indexOf(key) + 1]; 3790 if (!rawValue) return fallback; 3791 if (key === "closeby") { 3792 const allowedValues = ["auto", "none", "closerequest", "any"]; 3793 const options = allowedValues.join(", "); 3794 if (!allowedValues.includes(rawValue)) { 3795 console.warn( 3796 `"${rawValue}" is not one of the allowed values for closeby: ${options}` 3797 ); 3798 return fallback; 3799 } 3800 } 3801 return rawValue; 3802 } 3803 3804 // src/cdn.js 3805 document.addEventListener("alpine:init", () => { 3806 window.Alpine.plugin(dialog_default); 3807 }); 3808 })(); 3809</script>
vendor: 1 bytes, line 3809
3809
3810<script> 3811 (() => { 3812 function src_default(Alpine) { 3813 Alpine.directive("intersect", Alpine.skipDuringClone((el, { value, expression, modifiers }, { evaluateLater, cleanup }) => { 3814 let evaluate = evaluateLater(expression); 3815 let options = { 3816 rootMargin: getRootMargin(modifiers), 3817 threshold: getThreshold(modifiers) 3818 }; 3819 let observer = new IntersectionObserver((entries) => { 3820 entries.forEach((entry) => { 3821 if (entry.isIntersecting === (value === "leave")) 3822 return; 3823 evaluate(); 3824 modifiers.includes("once") && observer.disconnect(); 3825 }); 3826 }, options); 3827 observer.observe(el); 3828 cleanup(() => { 3829 observer.disconnect(); 3830 }); 3831 })); 3832 } 3833 function getThreshold(modifiers) { 3834 if (modifiers.includes("full")) 3835 return 0.99; 3836 if (modifiers.includes("half")) 3837 return 0.5; 3838 if (!modifiers.includes("threshold")) 3839 return 0; 3840 let threshold = modifiers[modifiers.indexOf("threshold") + 1]; 3841 if (threshold === "100") 3842 return 1; 3843 if (threshold === "0") 3844 return 0; 3845 return Number(`.${threshold}`); 3846 } 3847 function getLengthValue(rawValue) { 3848 let match = rawValue.match(/^(-?[0-9]+)(px|%)?$/); 3849 return match ? match[1] + (match[2] || "px") : void 0; 3850 } 3851 function getRootMargin(modifiers) { 3852 const key = "margin"; 3853 const fallback = "0px 0px 0px 0px"; 3854 const index = modifiers.indexOf(key); 3855 if (index === -1) 3856 return fallback; 3857 let values = []; 3858 for (let i = 1; i < 5; i++) { 3859 values.push(getLengthValue(modifiers[index + i] || "")); 3860 } 3861 values = values.filter((v) => v !== void 0); 3862 return values.length ? values.join(" ").trim() : fallback; 3863 } 3864 3865 document.addEventListener("alpine:init", () => { 3866 window.Alpine.plugin(src_default); 3867 }); 3868 })(); 3869</script>
vendor: 1 bytes, line 3869
3869
3870<script> 3871 for (const [selector, deferUntil] of Object.entries({".product-slider section[x-data]:not([x-data] [x-data])":"intersect",".product-info [x-data]:not([x-data] [x-data])":"intersect","#filters-content [x-data]:not([x-data] [x-data])":"intersect","#review_form":"intersect","section[x-data^=initRecentlyViewedProductsComponent]":"intersect","div[x-data^=initBundleOptions]":"intersect","#product_addtocart_form [x-data]:not([x-data] [x-data])":"intersect","#notice-cookie-block":"idle"})) { 3872 document.querySelectorAll(selector).forEach(el => el.setAttribute('x-defer', `${deferUntil}`)); 3873 } 3874</script>
vendor: 1 bytes, line 3874
3874
3875<script> 3876 (function () { 3877 "use strict"; 3878 3879 const hasAlpine = new Promise(resolve => { 3880 window.addEventListener('alpine:initialized', resolve, {once: true, passive: true}); 3881 }); 3882 3883 const hasInteract = new Promise(resolve => { 3884 (events => { 3885 const onInteract = () => { 3886 resolve(); 3887 events.forEach(type => window.removeEventListener(type, onInteract)); 3888 } 3889 events.forEach(type => window.addEventListener(type, onInteract, {once: true, passive: true})) 3890 })(['touchstart', 'mouseover', 'wheel', 'scroll', 'keydown']) 3891 }); 3892 3893 const onIntersect = (el) => { 3894 return new Promise(resolve => { 3895 const observer = new IntersectionObserver(entries => { 3896 for (const entry of entries) { 3897 if (entry.isIntersecting) { 3898 observer.disconnect() 3899 resolve(); 3900 } 3901 } 3902 }, {}); 3903 observer.observe(el); 3904 }); 3905 } 3906 3907 function runComponent(el) { 3908 hasAlpine.then(() => { 3909 el.removeAttribute('x-ignore'); 3910 queueMicrotask(() => Alpine.initTree(el)); 3911 }); 3912 } 3913 3914 function initDeferredComponents() { 3915 document.querySelectorAll('[x-data][x-defer]').forEach(el => { 3916 el.setAttribute('x-ignore', ''); 3917 const deferUntil = (el.getAttribute('x-defer') || '').trim(); 3918 switch (deferUntil) { 3919 case 'interact': 3920 hasInteract.then(() => runComponent(el)); 3921 break; 3922 case 'intersect': 3923 onIntersect(el).then(() => runComponent(el)) 3924 break; 3925 case 'idle': 3926 window.requestIdleCallback 3927 ? window.requestIdleCallback(() => runComponent(el), {timeout: 4000}) 3928 : setTimeout(() => runComponent(el), 4000); 3929 break; 3930 case 'eager': 3931 runComponent(el); 3932 break; 3933 default: 3934 if (deferUntil.startsWith('event:') && deferUntil.length > 6) { 3935 window.addEventListener(deferUntil.substring(6), () => runComponent(el), {once: true, passive: true}); 3936 } 3937 } 3938 }); 3939 } 3940 3941 window.addEventListener('alpine:init', initDeferredComponents, {once: true, passive: true}); 3942 })() 3943</script>
vendor: 1 bytes, line 3943
3943
vendor: 1,455 bytes, lines 3944-3946
3944<script> 3945(()=>{function g(n){n.directive("collapse",e),e.inline=(t,{modifiers:i})=>{i.includes("min")&&(t._x_doShow=()=>{},t._x_doHide=()=>{})};function e(t,{modifiers:i}){let r=l(i,"duration",250)/1e3,u=l(i,"min",0),h=!i.includes("min");t._x_isShown||(t.style.height=`${u}px`),!t._x_isShown&&h&&(t.hidden=!0),t._x_isShown||(t.style.overflow="hidden");let c=(d,s)=>{let o=n.setStyles(d,s);return s.height?()=>{}:o},f={transitionProperty:"height",transitionDuration:`${r}s`,transitionTimingFunction:"cubic-bezier(0.4, 0.0, 0.2, 1)"};t._x_transition={in(d=()=>{},s=()=>{}){h&&(t.hidden=!1),h&&(t.style.display=null);let o=t.getBoundingClientRect().height;t.style.height="auto";let a=t.getBoundingClientRect().height;o===a&&(o=u),n.transition(t,n.setStyles,{during:f,start:{height:o+"px"},end:{height:a+"px"}},()=>t._x_isShown=!0,()=>{t.getBoundingClientRect().height==a&&(t.style.overflow=null)})},out(d=()=>{},s=()=>{}){let o=t.getBoundingClientRect().height;n.transition(t,c,{during:f,start:{height:o+"px"},end:{height:u+"px"}},()=>t.style.overflow="hidden",()=>{t._x_isShown=!1,t.style.height==`${u}px`&&h&&(t.style.display="none",t.hidden=!0)})}}}}function l(n,e,t){if(n.indexOf(e)===-1)return t;let i=n[n.indexOf(e)+1];if(!i)return t;if(e==="duration"){let r=i.match(/([0-9]+)ms/);if(r)return r[1]}if(e==="min"){let r=i.match(/([0-9]+)px/);if(r)return r[1]}return i}document.addEventListener("alpine:init",()=>{window.Alpine.plugin(g)});})(); 3946</script>
vendor: 1 bytes, line 3946
3946
3947<script> 3948 (() => { 3949 function selectPlugin(Alpine) { 3950 Alpine.data('_selectImplementation', () => { 3951 return { 3952 $select: null, 3953 3954 // Props 3955 get props() { 3956 return this.$data.$select?.props ?? {} 3957 }, 3958 3959 // Data 3960 touched: false, 3961 activatedIndex: undefined, 3962 keyPressed: false, 3963 expanded: false, 3964 positioningStyles: {}, 3965 positionClasses: [], 3966 listboxOverlapsTrigger: false, 3967 valueOnOpen: undefined, 3968 //animatingListbox: false, 3969 3970 // Computed 3971 get listboxVisible() { 3972 return this.$data.expanded // || this.$data.animatingListbox 3973 }, 3974 get valueArray() { 3975 return this.$data.props.multiple 3976 ? this.$data.props.modelValue 3977 : [this.$data.props.modelValue] 3978 }, 3979 get idPrefix() { 3980 return this.$data.props.id 3981 }, 3982 get idListbox() { 3983 return `${this.$data.idPrefix}-listbox` 3984 }, 3985 get idTrigger() { 3986 return `${this.$data.idPrefix}-trigger` 3987 }, 3988 get hasSelected() { 3989 return this.$data.props.multiple 3990 ? this.$data.props.selectedOption.length > 0 3991 : typeof this.$data.props.selectedOption !== 'undefined' 3992 }, 3993 get firstSelectedOptionIndex() { 3994 return this.$data.hasSelected 3995 ? this.$data.props.options.indexOf( 3996 this.$data.props.multiple 3997 ? this.$data.props.selectedOption[0] 3998 : this.$data.props.selectedOption, 3999 ) 4000 : undefined 4001 }, 4002 getPlaceholder(option) { 4003 const placeholderValue = this.$data.props.placeholder 4004 if (!this.$data.hasSelected) return placeholderValue.trim() || '\u00A0' 4005 4006 if (this.$data.props.multiple) { 4007 return this.$data.props.selectedOption.map(option => option.label).join(', ') 4008 } else { 4009 return this.$data.props.selectedOption.label 4010 } 4011 }, 4012 get hasActivatedItem() { 4013 return typeof this.$data.activatedIndex === 'number' 4014 }, 4015 get activatedOption() { 4016 return !this.$data.hasActivatedItem 4017 ? undefined 4018 : this.$data.props.options[this.$data.activatedIndex] 4019 }, 4020 get activatedId() { 4021 return !this.$data.hasActivatedItem ? undefined : this.$data.activatedOption.id 4022 }, 4023 4024 // Functions 4025 pressKey(key) { 4026 this.$data.keyPressed = key 4027 setTimeout(() => { 4028 this.$data.keyPressed = false 4029 }, 0) 4030 }, 4031 scrollListbox({direction = 'auto', index = this.$data.activatedIndex} = {}) { 4032 let hasSelected = typeof index === 'number' 4033 let listbox = this.$refs.listbox 4034 if (!listbox) return 4035 4036 let listboxRect = listbox.getBoundingClientRect() 4037 let listboxTriggerRect = this.$refs.listboxTrigger.getBoundingClientRect() 4038 let listboxItem = listbox.children[index] 4039 if (!listboxItem) return 4040 let previousItem = listbox.children[index - 1] ?? listboxItem 4041 let nextItem = listbox.children[index + 1] ?? listboxItem 4042 let previousItemRect = previousItem.getBoundingClientRect() 4043 let nextItemRect = nextItem.getBoundingClientRect() 4044 4045 if (direction === 'auto' && this.$data.listboxOverlapsTrigger && hasSelected) { 4046 let diff = listboxTriggerRect.top - listboxRect.top 4047 let top = listboxItem.offsetTop - diff 4048 listbox.scrollTo({top}) 4049 } else if ( 4050 direction === 'down' && 4051 nextItemRect.bottom + listboxTriggerRect.height > listboxRect.bottom 4052 ) { 4053 listbox.scrollTo({ 4054 top: 4055 index === this.$data.props.options.length - 1 4056 ? listbox.scrollHeight 4057 : nextItem.offsetTop + nextItemRect.height - listboxRect.height, 4058 behavior: 'smooth', 4059 }) 4060 } else if ( 4061 direction === 'up' && 4062 previousItemRect.top - listboxTriggerRect.height < listboxRect.top 4063 ) { 4064 listbox.scrollTo({ 4065 top: index === 0 ? 0 : previousItem.offsetTop, 4066 behavior: 'smooth', 4067 }) 4068 } 4069 }, 4070 calculatePosition() { 4071 let listbox = this.$refs.listbox 4072 let listboxTrigger = this.$refs.listboxTrigger 4073 if (!listbox || !listboxTrigger) return 4074 let screenWidth = Math.min(window.innerWidth, window.outerWidth) 4075 let screenHeight = window.innerHeight 4076 let listboxRect = listbox.getBoundingClientRect() 4077 let listboxTriggerRect = listboxTrigger.getBoundingClientRect() 4078 let spaceBelowTrigger = screenHeight - listboxTriggerRect.bottom 4079 let spaceAboveTrigger = listboxTriggerRect.top 4080 let listboxTooTall = listboxRect.bottom > screenHeight 4081 let listboxTooWide = listboxRect.right > screenWidth 4082 let listboxTooWideForTrigger = listboxRect.width > listboxTriggerRect.width 4083 let localPositioningStyles = {} 4084 let localPositionClasses = [] 4085 4086 if (listboxTooTall) { 4087 if (spaceAboveTrigger > spaceBelowTrigger && spaceAboveTrigger > listboxRect.height) { 4088 localPositioningStyles[
4089 '--x-select--position-bottom' 4090 ] = `${listboxTriggerRect.height}px` 4091 localPositionClasses = ['from-bottom'] 4092 } else if (spaceAboveTrigger > spaceBelowTrigger) { 4093 localPositioningStyles['--x-select--position-bottom'] = `${Math.round( 4094 listboxTriggerRect.bottom - screenHeight, 4095 )}px` 4096 localPositionClasses = ['from-bottom'] 4097 this.$data.listboxOverlapsTrigger = true 4098 } else { 4099 localPositioningStyles['--x-select--position-top'] = `${Math.round( 4100 -listboxTriggerRect.top, 4101 )}px` 4102 localPositionClasses = ['from-top'] 4103 this.$data.listboxOverlapsTrigger = true 4104 } 4105 } else { 4106 localPositionClasses = ['from-none'] 4107 } 4108 if (listboxTooWideForTrigger) { 4109 localPositionClasses.push('is-too-wide-for-trigger') 4110 } 4111 if (listboxTooWide) { 4112 localPositionClasses.push('is-too-wide-for-screen') 4113 } 4114 this.$data.positionClasses = localPositionClasses 4115 this.$data.positioningStyles = localPositioningStyles 4116 }, 4117 activate(index) { 4118 if (index < 0) return 4119 if (index >= this.$data.props.options.length) return 4120 this.$data.activatedIndex = index 4121 }, 4122 activateFirst() { 4123 this.$data.activate(0) 4124 }, 4125 activateLast() { 4126 this.$data.activate(this.$data.props.options.length - 1) 4127 }, 4128 activateFirstSelected() { 4129 if (this.$data.hasSelected) { 4130 this.$data.activate(this.$data.firstSelectedOptionIndex) 4131 } else { 4132 this.$data.activateFirst() 4133 } 4134 }, 4135 activatePrevious() { 4136 if (!this.$data.hasActivatedItem) { 4137 this.$data.activateLast() 4138 } else { 4139 this.$data.activate(this.$data.activatedIndex - 1) 4140 } 4141 }, 4142 activateNext() { 4143 if (!this.$data.hasActivatedItem) { 4144 this.$data.activateFirst() 4145 } else { 4146 this.$data.activate(this.$data.activatedIndex + 1) 4147 } 4148 }, 4149 open() { 4150 this.$data.valueOnOpen = this.$data.props.modelValue 4151 this.$data.expanded = true 4152 }, 4153 close() { 4154 this.$data.touched = true 4155 if (this.$refs.listbox?.matches(':focus')) { 4156 this.$refs.listboxTrigger.focus({preventScroll: true}) 4157 } 4158 this.$data.expanded = false 4159 this.$data.$select.el.dispatchEvent(new CustomEvent('select:close', {bubbles: true})) 4160 4161 if ( 4162 JSON.stringify(this.$data.valueOnOpen) !== JSON.stringify(this.$data.props.modelValue) 4163 ) { 4164 this.$data.$select.el.dispatchEvent( 4165 new CustomEvent('select:change', { 4166 bubbles: true, 4167 detail: { 4168 value: this.$data.props.modelValue, 4169 }, 4170 }), 4171 ) 4172 } 4173 }, 4174 select(value) { 4175 this.$data.$select.setValue(value) 4176 this.$data.$select.el.dispatchEvent( 4177 new CustomEvent('select:input', { 4178 bubbles: true, 4179 detail: { 4180 value, 4181 }, 4182 }), 4183 ) 4184 }, 4185 selectSingle(value) { 4186 this.$data.select(this.$data.props.multiple ? [value] : value) 4187 }, 4188 selectSingleAndClose(value) { 4189 this.$data.select(value) 4190 this.$data.close() 4191 }, 4192 toggle(value) { 4193 const currentValue = this.$data.props.modelValue 4194 if (currentValue.includes(value)) { 4195 this.$data.$select.setValue(currentValue.filter(selectedValue => selectedValue !== value)) 4196 } else { 4197 this.$data.$select.setValue([...currentValue, value]) 4198 } 4199 }, 4200 commitSingleValue(value) { 4201 if (this.$data.props.multiple) { 4202 this.$data.toggle(value) 4203 } else { 4204 this.$data.selectSingleAndClose(value) 4205 } 4206 }, 4207 onListboxKeydown(event) { 4208 switch (event.key) { 4209 case 'Escape': 4210 event.preventDefault() 4211 this.$data.pressKey(event.key) 4212 this.$data.close() 4213 break 4214 4215 case 'ArrowDown': 4216 event.preventDefault() 4217 this.$data.pressKey(event.key) 4218 this.$data.activateNext() 4219 break 4220 4221 case 'ArrowUp': 4222 event.preventDefault() 4223 this.$data.pressKey(event.key) 4224 this.$data.activatePrevious() 4225 break 4226 4227 case 'Home': 4228 event.preventDefault() 4229 this.$data.pressKey(event.key) 4230 this.$data.activateFirst() 4231 break 4232 4233 case 'End': 4234 event.preventDefault() 4235 this.$data.pressKey(event.key) 4236 this.$data.activateLast() 4237 break 4238 4239 case 'Enter': 4240 case ' ': 4241 event.preventDefault() 4242 this.$data.pressKey(event.key) 4243 if (!this.$data.hasActivatedItem) { 4244 this.$data.close() 4245 break 4246 } 4247 if (this.$data.props.multiple) { 4248 this.$data.toggle(this.$data.activatedOption.value) 4249 } else { 4250 this.$data.selectSingleAndClose(this.$data.activatedOption.value) 4251 } 4252 break 4253 } 4254 }, 4255 4256 // Initialize 4257 init() { 4258 this.$watch('$data?.$select?.props?.disabled', disabled => { 4259 if (disabled) { 4260 this.$data.close() 4261 } 4262 }) 4263 4264 this.$watch('listboxVisible', visible => { 4265 if (!visible) { 4266 this.$data.positioningStyles = {} 4267 this.$data.positionClasses = [] 4268 this.$data.listboxOverlapsTrigger = false 4269 } 4270 }) 4271 4272 this.$watch('expanded', expanded => { 4273 if (!expanded) { 4274 this.$data.activatedIndex = undefined 4275 } else { 4276 this.$data.activateFirstSelected() 4277 let index = this.$data.hasSelected ? this.$data.firstSelectedOptionIndex : 0 4278 4279 Alpine.nextTick(() => { 4280 this.$data.calculatePosition() 4281 4282 setTimeout(() => { 4283 this.$refs.listbox.focus({preventScroll: true}) 4284 this.$data.scrollListbox({index}) 4285 }, 0) 4286 }) 4287 } 4288 }) 4289 4290 this.$watch('activatedIndex', (activatedIndex, oldActivatedIndex) => { 4291 if (this.$data.hasActivatedItem && this.$data.keyPressed) { 4292 this.$data.scrollListbox({ 4293 direction: (activatedIndex ?? 0) > (oldActivatedIndex ?? 0) ? 'down' : 'up', 4294 }) 4295 } 4296 }) 4297 }, 4298 } 4299 }) 4300 4301 Alpine.directive('select', async (el, {expression}, {evaluate, cleanup, Alpine}) => { 4302 const html = /*html*/ `<div 4303 x-data="_selectImplementation()" 4304 class="x-select--select-wrapper" 4305 :class="{ 4306 'is-expanded': expanded, 4307 'is-overlapping': listboxOverlapsTrigger, 4308 ...Object.fromEntries(positionClasses.map(c => [c, true])), 4309 }" 4310 ></div>` 4311 4312 el.insertAdjacentHTML('beforebegin', html) 4313 el.previousElementSibling.prepend(el) 4314 4315 el.classList.add('x-select--select-field') 4316 el.setAttribute(':class', '{ touched: $data.touched }') 4317 el.tabIndex = -1 4318 // el.setAttribute('inert', '') 4319 // el.setAttribute('aria-hidden', 'true') 4320 el.setAttribute('x-on:focus', '$refs.listboxTrigger.focus()') 4321 4322 if (expression) { 4323 el.setAttribute('x-model', expression) 4324 Alpine.nextTick(() => updateSelectedOptions()) 4325 // $data.$select is only assigned further down, after `await Alpine.nextTick()`,
4326 // so this watcher can fire before it exists (e.g. when a parent component 4327 // writes to the bound property from its own init()). Anything missed in that 4328 // window is caught up by the updateSelectedOptions() call after the assignment. 4329 evaluate(`$watch('${expression}', () => $data.$select?.updateSelectedOptions())`) 4330 } 4331 4332 const optionsMap = new WeakMap() 4333 4334 function readOptions() { 4335 const options = [...el.options].filter(option => !option.disabled) 4336 return options.map(option => { 4337 let id 4338 if (optionsMap.has(option)) { 4339 id = optionsMap.get(option) 4340 } else { 4341 id = crypto.randomUUID() 4342 optionsMap.set(option, id) 4343 } 4344 4345 return { 4346 id, 4347 value: option.value, 4348 label: option.textContent, 4349 } 4350 }) 4351 } 4352 4353 const state = Alpine.reactive({ 4354 id: el.id ?? crypto.randomUUID(), 4355 placeholder: el.getAttribute('placeholder') ?? '', 4356 required: el.required, 4357 multiple: el.multiple, 4358 disabled: el.disabled, 4359 options: readOptions(), 4360 4361 selectedOptions: [], 4362 4363 get selectedOption() { 4364 if (this.multiple) { 4365 return this.selectedOptions 4366 } else { 4367 return this.selectedOptions[0] 4368 } 4369 }, 4370 get modelValue() { 4371 if (this.multiple) { 4372 return this.selectedOptions.map(option => option.value) 4373 } else { 4374 return this.selectedOptions[0]?.value 4375 } 4376 }, 4377 }) 4378 4379 function readSelectedOptions() { 4380 return [...el.options].flatMap((option, index) => 4381 option.selected ? state.options[index] : [], 4382 ) 4383 } 4384 4385 state.selectedOptions = readSelectedOptions() 4386 4387 const updateMultiple = () => (state.multiple = el.multiple) 4388 const updateDisabled = () => (state.disabled = el.disabled) 4389 const updateId = () => (state.id = el.id ?? crypto.randomUUID()) 4390 const updatePlaceholder = () => (state.placeholder = el.getAttribute('placeholder') ?? '') 4391 const updateRequired = () => (state.required = el.required) 4392 4393 const updateState = (option, getter) => { 4394 const newData = getter() 4395 if (JSON.stringify(newData) !== JSON.stringify(state[option])) { 4396 state[option] = newData 4397 } 4398 } 4399 4400 const updateOptions = () => updateState('options', readOptions) 4401 const updateSelectedOptions = () => updateState('selectedOptions', readSelectedOptions) 4402 4403 el.addEventListener('change', updateSelectedOptions) 4404 4405 const observer = new MutationObserver(entries => { 4406 for (const entry of entries) { 4407 if (entry.type === 'attributes') { 4408 switch (entry.attributeName) { 4409 case 'multiple': 4410 updateMultiple() 4411 updateSelectedOptions() 4412 4413 if (expression) { 4414 el.dispatchEvent(new Event('change', {bubbles: true})) 4415 } 4416 break 4417 case 'disabled': 4418 updateDisabled() 4419 break 4420 case 'id': 4421 updateId() 4422 break 4423 case 'placeholder': 4424 updatePlaceholder() 4425 break 4426 case 'required': 4427 updateRequired() 4428 break 4429 } 4430 } else if (entry.type === 'childList') { 4431 updateOptions() 4432 updateSelectedOptions() 4433 } 4434 } 4435 }) 4436 4437 observer.observe(el, { 4438 childList: true, 4439 attributes: true, 4440 subtree: true, 4441 attributeFilter: ['multiple', 'disabled', 'id', 'placeholder', 'required'], 4442 }) 4443 4444 // Expose API to $select 4445 await Alpine.nextTick() 4446 const $select = { 4447 el, 4448 wrapperElement: el.parentElement, 4449 props: { 4450 get selectedOption() { 4451 return state.selectedOption 4452 }, 4453 get modelValue() { 4454 return state.modelValue 4455 }, 4456 get options() { 4457 return state.options 4458 }, 4459 get id() { 4460 return state.id 4461 }, 4462 get disabled() { 4463 return state.disabled 4464 }, 4465 get multiple() { 4466 return state.multiple 4467 }, 4468 get placeholder() { 4469 return state.placeholder 4470 }, 4471 get required() { 4472 return state.required 4473 }, 4474 }, 4475 setValue(value) { 4476 value = Array.isArray(value) ? value : [value] 4477 4478 for (const option of el.options) { 4479 option.selected = value.includes(option.value) 4480 } 4481 4482 el.dispatchEvent(new Event('change', {bubbles: true})) 4483 }, 4484 updateSelectedOptions, 4485 refresh() { 4486 updateMultiple() 4487 updateDisabled() 4488 4489 updateOptions() 4490 updateId() 4491 updatePlaceholder() 4492 4493 updateSelectedOptions() 4494 }, 4495 } 4496 evaluate('$data').$select = $select 4497 Alpine.evaluate(el.parentElement, '$data').$select = $select 4498 4499 // Re-sync in case the model changed while $select was still unavailable 4500 updateSelectedOptions() 4501 4502 // Can't inject this earlier because we need the $select API to be available 4503 el.insertAdjacentHTML( 4504 'afterend', 4505 /*html*/ ` 4506 <button 4507 x-ref="listboxTrigger" 4508 type="button" 4509 class="x-select--select-trigger" 4510 :class="{ inert: expanded }" 4511 :disabled="props.disabled" 4512 :id="idTrigger" 4513 aria-haspopup="true" 4514 :aria-expanded="expanded" 4515 :aria-controls="idListbox" 4516 @click="open()" 4517 @keydown.up.prevent="$el.click()" 4518 @keydown.down.prevent="$el.click()" 4519 >
4520 <span class="x-select--select-trigger-label" x-text="getPlaceholder(props.selectedOption)"></span> 4521 </button> 4522 <template x-if="expanded"> 4523 <ul 4524 x-ref="listbox" 4525 class="x-select--select-listbox" 4526 :id="idListbox" 4527 :style="positioningStyles" 4528 tabindex="0" 4529 role="listbox" 4530 aria-orientation="vertical" 4531 :aria-labelledby="idTrigger" 4532 :aria-activedescendant="activatedId" 4533 @keydown="onListboxKeydown" 4534 @mouseout="activatedIndex = undefined" 4535 @blur="close()" 4536 > 4537 <template x-for="({ id, value, label }, index) in props.options"> 4538 <li 4539 :key="id" 4540 :id="id" 4541 class="x-select--select-listbox-item" 4542 :class="{ 4543 'is-active': activatedIndex === index, 4544 'is-selected': valueArray.includes(value) 4545 }" 4546 role="option" 4547 :aria-selected="valueArray.includes(value)" 4548 :value="value" 4549 tabindex="-1" 4550 @mouseenter="activatedIndex = index" 4551 @mousedown.prevent="commitSingleValue(value)" 4552 x-text="label" 4553 ></li> 4554 </template> 4555 </ul> 4556 </template> 4557 `, 4558 ) 4559 4560 // Stop observing select on cleanup 4561 cleanup(() => { 4562 observer.disconnect() 4563 el.removeEventListener('change', updateSelectedOptions) 4564 4565 el.classList.remove('x-select--select-field') 4566 // el.removeAttribute('inert') 4567 el.removeAttribute('x-model') 4568 el.removeAttribute('x-on:focus') 4569 el.removeAttribute(':class') 4570 el.removeAttribute('tabindex') 4571 // el.removeAttribute('aria-hidden') 4572 4573 if (document.contains(el)) { 4574 const container = el.parentElement 4575 container.after(el) 4576 container.remove() 4577 } 4578 }) 4579 }) 4580 } 4581 4582 document.addEventListener("alpine:init", () => { 4583 window.Alpine.plugin(selectPlugin); 4584 }); 4585 })(); 4586</script>
4586 4587
4588<script type="module" 4589 src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/Hyva_Theme/js/alpine3.min.js" 4590 defer 4591 crossorigin 4592></script>
vendor: 1 bytes, line 4592
4592
4593<script> 4594 function dispatchMessages(messages, hideAfter) { 4595 const messagesEvent = new CustomEvent("messages-loaded", { 4596 detail: { 4597 messages: messages, 4598 hideAfter: hideAfter 4599 } 4600 }); 4601 window.dispatchEvent(messagesEvent); 4602 } 4603 4604 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4605 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4606 } 4607 4608 (function( hyva, undefined ) { 4609 4610 hyva.initFormKey = () => { 4611 const inputSelector = 'input[name="form_key"]', 4612 formKey = hyva.getFormKey(); 4613 4614 Array.from(document.querySelectorAll(inputSelector)).map(function (input) { 4615 input.value = formKey 4616 }); 4617 } 4618 4619 hyva.initMessages = () => { 4620 try { 4621 const messages = hyva.getCookie('mage-messages'); 4622 window.mageMessages = messages ? JSON.parse(decodeURIComponent(messages).replace(/\+/g, ' ')) : []; 4623 4624 dispatchMessages(window.mageMessages); 4625 4626 // empty `mage-messages` cookie 4627 const skipSetDomain = true; 4628 hyva.setCookie('mage-messages','', -1, skipSetDomain); 4629 4630 } catch (error) { 4631 console.warn('Error parsing Cookie Messages:', error); 4632 } 4633 } 4634 4635 window.addEventListener('DOMContentLoaded', hyva.initFormKey); 4636 hyva.alpineInitialized(hyva.initMessages) 4637 4638 }( window.hyva = window.hyva || {} )); 4639</script>
vendor: 1 bytes, line 4639
4639
4640<script> 4641 { 4642 const private_content_key = 'mage-cache-storage'; 4643 const private_content_expire_key = 'mage-cache-timeout'; 4644 const private_content_version_key = 'private_content_version'; 4645 const section_data_ids_key = 'section_data_ids'; 4646 const mage_cache_session_id_key = 'mage-cache-sessid'; 4647 const last_visited_store_key = 'last_visited_store'; 4648 4649 const ttl = 3600; 4650 4651 if (typeof hyva === 'undefined' || (!hyva.getBrowserStorage || !hyva.getCookie || !hyva.setCookie)) { 4652 console.warn("Hyvä helpers are not loaded yet. Make sure they are included before this script"); 4653 } 4654 4655 function loadSectionData () { 4656 const browserStorage = hyva.getBrowserStorage(); 4657 if (!browserStorage) { 4658 typeof window.dispatchMessages !== "undefined" && window.dispatchMessages( 4659 [{ 4660 type: "warning", 4661 text: "Por favor, habilite o LocalStorage no seu navegador." 4662 }] 4663 ); 4664 return; 4665 } 4666 try { 4667 let isInvalid = false; 4668 4669 if (hyva.getCookie(last_visited_store_key) !== CURRENT_STORE_CODE) { 4670 isInvalid = true; 4671 } 4672 hyva.setCookie(last_visited_store_key, CURRENT_STORE_CODE, false, false); 4673 4674 if (!hyva.getCookie(mage_cache_session_id_key)) { 4675 isInvalid = true; 4676 browserStorage.removeItem(private_content_key); 4677 const skipSetDomain = true; 4678 const days = false; 4679 hyva.setCookie(mage_cache_session_id_key, true, days, skipSetDomain) 4680 } 4681 4682 const cookieVersion = hyva.getCookie(private_content_version_key); 4683 const storageVersion = browserStorage.getItem(private_content_version_key); 4684 4685 if (cookieVersion && !storageVersion || cookieVersion !== storageVersion) { 4686 isInvalid = true; 4687 } 4688 4689 const privateContentExpires = browserStorage.getItem(private_content_expire_key); 4690 if (privateContentExpires && new Date(privateContentExpires) < new Date()) { 4691 browserStorage.removeItem(private_content_key); 4692 } 4693 4694 if (isInvalid && cookieVersion) { 4695 fetchPrivateContent([]); 4696 } else if (cookieVersion && storageVersion && cookieVersion === storageVersion) { 4697 const privateContent = JSON.parse(browserStorage.getItem(private_content_key)); 4698 if ( 4699 privateContent && 4700 privateContentExpires && 4701 privateContent.cart && 4702 privateContent.customer 4703 ) { 4704 dispatchPrivateContent(privateContent); 4705 } else { 4706 fetchPrivateContent([]); 4707 } 4708 } else { 4709 if (document.getElementById('default-section-data')) { 4710 const privateContent = JSON.parse(document.getElementById('default-section-data').innerText.trim()); 4711 dispatchPrivateContent(privateContent); 4712 } else { 4713 dispatchPrivateContent({}); 4714 } 4715 } 4716 4717 } catch (error) { 4718 console.warn('Error retrieving Private Content:', error); 4719 } 4720 } 4721 4722 hyva.alpineInitialized(loadSectionData) 4723 window.addEventListener('reload-customer-section-data', loadSectionData); 4724 4725 window.processSectionDataBeforeDispatch = window.processSectionDataBeforeDispatch || (data => data); 4726 4727 function dispatchPrivateContent(data) { 4728 4729 const privateContentEvent = new CustomEvent("private-content-loaded", { 4730 detail: { 4731 data: window.processSectionDataBeforeDispatch(data) 4732 } 4733 }); 4734 window.dispatchEvent(privateContentEvent); 4735 } 4736 4737 function fetchPrivateContent(sections) { 4738 fetch(`${BASE_URL}customer/section/load/?sections=${encodeURIComponent(sections.join(','))}`, { 4739 method: 'GET', 4740 headers: { 4741 'Content-Type': 'application/json', 4742 'X-Requested-With': 'XMLHttpRequest' 4743 } 4744 }) 4745 .then(response => response.ok && response.json()) 4746 .then( 4747 data => { 4748 if (data) { 4749 try { 4750 const browserStorage = hyva.getBrowserStorage(); 4751 4752 // merge new data preserving non-invalidated sections 4753 const oldSectionData = JSON.parse(browserStorage.getItem(private_content_key) || '{}') || {}; 4754 4755 if ((! data.cart || ! data.cart.cartId) && oldSectionData['checkout-data']) { 4756 delete oldSectionData['checkout-data']; 4757 } 4758 const newSectionData = Object.assign(oldSectionData, data); 4759 4760 dispatchPrivateContent(newSectionData); 4761 4762 // don't persist messages, they've been dispatched already 4763 if (newSectionData.messages && newSectionData.messages.messages ) { 4764 newSectionData.messages.messages = []; 4765 } 4766 4767 browserStorage.setItem(private_content_key, JSON.stringify(newSectionData)); 4768 4769 const expiresAt = new Date(Date.now() + (ttl * 1000)).toISOString(); 4770 browserStorage.setItem(private_content_expire_key, expiresAt); 4771 4772 const newCookieVersion = hyva.getCookie(private_content_version_key); 4773 browserStorage.setItem(private_content_version_key, newCookieVersion); 4774 4775 // We don't need the section_data_ids in Hyvä, but we store them for compatibility 4776 // with Luma Fallback. Otherwise, not all sections are loaded in Luma Checkout 4777 hyva.setCookie( 4778 section_data_ids_key, 4779 JSON.stringify( 4780 Object.keys(data).reduce((sectionDataIds, sectionKey) => { 4781 sectionDataIds[sectionKey] = data[sectionKey]['data_id']; 4782 return sectionDataIds; 4783 }, {}) 4784 ), 4785 false, 4786 true 4787 ); 4788 } catch (error) { 4789 console.warn("Couldn't store privateContent", error); 4790 } 4791 } 4792 } 4793 ); 4794 } 4795 } 4796</script>
vendor: 1 bytes, line 4796
4796
4797<script> 4798 (() => { 4799 document.addEventListener('submit', event => event.target.action = event.target.action.replace('%25uenc%25', hyva.getUenc())); 4800 })() 4801</script>
vendor: 1 bytes, line 4801
4801
4802<script> 4803 (events => { 4804 const dispatchUserInteractionEvent = () => { 4805 events.forEach(type => window.removeEventListener(type, dispatchUserInteractionEvent)) 4806 window.dispatchEvent(new Event('init-external-scripts')) 4807 }; 4808 events.forEach(type => window.addEventListener(type, dispatchUserInteractionEvent, {once: true, passive: true})) 4809 })(['touchstart', 'mousemove', 'wheel', 'scroll', 'keydown']) 4810</script>
vendor: 1 bytes, line 4810
4810
4811<script> 4812 function initConfigurableOptions(productId, optionConfig) { 4813 function findPathParam(key) { 4814 const baseUrl = (BASE_URL.substring(0, 2) === '//' ? 'http:' : '') + BASE_URL; 4815 const baseUrlParts = (new URL(baseUrl)).pathname.replace(/\/$/, '').split('/'); 4816 const pathParts = window.location.pathname.split('/').slice(baseUrlParts.length + 3); 4817 for (let i = 0; i < pathParts.length; i += 2) { 4818 if (pathParts[i] === key && pathParts.length > i) { 4819 return pathParts[i + 1]; 4820 } 4821 } 4822 } 4823 4824 return { 4825 optionConfig, 4826 productId, 4827 itemId: (new URLSearchParams(window.location.search)).get('id') || findPathParam('id'), 4828 allowedAttributeOptions: [], 4829 selectedValues: [], 4830 init() { 4831 this.findAllowedAttributeOptions(); 4832 this.$nextTick(() => { 4833 if (typeof this.optionConfig.defaultValues === 'object') { 4834 for (const [attributeId, value] of Object.entries(this.optionConfig.defaultValues)) { 4835 this.changeOption(attributeId, value + ''); 4836 } 4837 } 4838 }); 4839 }, 4840 getPriceForOption(option) { 4841 const productIds = this.getProductIdsForOption(option); 4842 return this.optionConfig.optionPrices[productIds[0]].finalPrice.amount.toString(); 4843 }, 4844 findSimpleIndex() { 4845 this.productIndex = this.calculateSimpleIndexForPartialSelection(this.selectedValues); 4846 }, 4847 calculateSimpleIndexForPartialSelection(selectedValues) { 4848 if (selectedValues.length === 0) return 0; 4849 let productIndexIds = Object.keys(this.optionConfig.index); 4850 Object.keys(this.optionConfig.attributes).forEach((attribute) => { 4851 const productsWithAttributeMatch = selectedValues[attribute] 4852 ? productIndexIds.filter((productIndex) => { 4853 return this.optionConfig.index[productIndex][attribute] === this.selectedValues[attribute] 4854 }) 4855 : []; 4856 4857 productIndexIds = productsWithAttributeMatch.length ? productsWithAttributeMatch : productIndexIds 4858 }) 4859 return productIndexIds[0]; 4860 }, 4861 calculateSimpleIndexForFullSelection(selectedValues) { 4862 const productIndexes = this.optionConfig.index; 4863 return Object.keys(productIndexes).find(productIndex => { 4864 const productCandidateOptions = productIndexes[productIndex]; 4865 4866 for (const productOption in productCandidateOptions) { 4867 if ( 4868 ! selectedValues[productOption] || 4869 selectedValues[productOption] !== productCandidateOptions[productOption] 4870 ) { 4871 return false; 4872 } 4873 } 4874 return productIndex; 4875 }); 4876 }, 4877 productIndex: 0, 4878 findAllowedAttributeOptions() { 4879 this.allowedAttributeOptions = this.calculateAllowedAttributeOptions(this.selectedValues); 4880 }, 4881 calculateAllowedAttributeOptions(selectedValues) { 4882 const allAttributes = this.optionConfig.attributes; 4883 const allAttributesSorted = Object.values(allAttributes).sort((a,b) => { 4884 return a.position - b.position 4885 }); 4886 4887 const newAllowedAttributeOptions = []; 4888 4889 allAttributesSorted.forEach(attribute => { 4890 const selectionWithoutAttr = Object.assign({}, this.removeAttrFromSelection(selectedValues, attribute.id)); 4891 const availableIndexes = this.calculateAvailableProductIndexes(selectionWithoutAttr); 4892 newAllowedAttributeOptions[attribute.id] = allAttributes[attribute.id].options.filter(option => { 4893 return !!option.products.find(product => { 4894 return availableIndexes.includes(product); 4895 }) 4896 }); 4897 }); 4898 return newAllowedAttributeOptions; 4899 }, 4900 calculateAvailableProductIndexes(selectedOptions) { 4901 if (Object.keys(selectedOptions).length === 0) { 4902 if (Object.values(this.optionConfig.salable || {}).length) { 4903 return [].concat.apply([], [].concat.apply([], Object.values(this.optionConfig.salable).map(Object.values))).filter((x, i, a) => a.indexOf(x) === i) 4904 } 4905 return Object.keys(this.optionConfig.index); 4906 } 4907 4908 const selectedIds = Object.keys(selectedOptions); 4909 if (Object.values(this.optionConfig.salable || {}).length) { 4910 const selectedOptionIndexes = selectedIds.map(attrId => { 4911 const optionValue = selectedOptions[attrId]; 4912 return this.optionConfig.salable[attrId] && this.optionConfig.salable[attrId][optionValue] || [] 4913 }) 4914 return selectedOptionIndexes.reduce((acc, optionIndexes) => { 4915 return acc.filter(index => optionIndexes.includes(index)); 4916 }); 4917 } else { 4918 const productIndexes = this.optionConfig.index; 4919 return Object.keys(productIndexes).filter(index => { 4920 for (const attrId of selectedIds) { 4921 if (productIndexes[index][attrId] !== `${selectedOptions[attrId]}`) return false 4922 } 4923 return true 4924 }); 4925 } 4926 }, 4927 findAttributeByOptionId(optionId) { 4928 for (const attributeId in this.optionConfig.attributes) { 4929 const attributeOptions = this.optionConfig.attributes[attributeId].options || []; 4930 if (attributeOptions.find(option => option.id === optionId)) { 4931 return attributeId; 4932 } 4933 } 4934 }, 4935 getAllowedAttributeOptions(attributeId) { 4936 return this.allowedAttributeOptions[attributeId] || [] 4937 }, 4938 getProductIdsForOption(option) { 4939 const attributeId = this.findAttributeByOptionId(option.id); 4940 const allOptions = this.optionConfig.attributes[attributeId]; 4941 const opt = (allOptions && allOptions.options || []).find(o => o.id === option.id); 4942 return opt && opt.products 4943 ? opt.products 4944 : []; 4945 }, 4946 findProductIdsForPartialSelection(optionSelection) { 4947 const candidateProducts = Object.values(optionSelection).reduce((candidates, optionId) => { 4948 const newCandidates = this.getProductIdsForOption({id: optionId}); 4949 return candidates === null 4950 ? newCandidates 4951 : candidates.filter(productId => newCandidates.includes(productId)); 4952 }, null); 4953 return candidateProducts || []; 4954 },
4955 findCheapestProductForPartialSelection(optionSelection) { 4956 const candidateProducts = this.findProductIdsForPartialSelection(optionSelection); 4957 return candidateProducts.reduce((cheapest, simpleIdx) => { 4958 // in the first iteration we start with simpleIdx as the currently cheapest product 4959 if (! this.optionConfig.optionPrices[cheapest]) return simpleIdx; 4960 const knownCheapestPrice = this.optionConfig.optionPrices[cheapest].finalPrice.amount; 4961 return knownCheapestPrice > this.optionConfig.optionPrices[simpleIdx].finalPrice.amount 4962 ? simpleIdx 4963 : cheapest; 4964 }, 0) 4965 }, 4966 findProductIdToUseForOptionPrice(option) { 4967 // try to find a product for a complete selection 4968 const attributeId = this.findAttributeByOptionId(option.id); 4969 const optionSelection = Object.assign({}, this.selectedValues, {[attributeId]: option.id}); 4970 const matchingSimpleIndex = this.calculateSimpleIndexForFullSelection(optionSelection); 4971 // if there is no complete selection, use the cheapest product for the option 4972 return matchingSimpleIndex || this.findCheapestProductForPartialSelection(optionSelection); 4973 }, 4974 getAttributeOptionLabel(option) { 4975 const optionProduct = this.findProductIdToUseForOptionPrice(option); 4976 if ((! optionProduct) || (optionProduct === this.productIndex)) { 4977 return option.label; 4978 } 4979 4980 // const currentPrice = this.getOptionPriceAdjustmentBasePrice(); 4981 // 4982 // if (this.optionConfig.optionPrices[optionProduct]) { 4983 // const optionPrice = this.optionConfig.optionPrices[optionProduct].finalPrice.amount; 4984 // if (optionPrice !== currentPrice){ 4985 // return option.label + ' ' + hyva.formatPrice(optionPrice - currentPrice, true); 4986 // } 4987 // } 4988 return option.label; 4989 }, 4990 getOptionPriceAdjustmentBasePrice() { 4991 if (this.optionConfig.optionPrices[this.productIndex]) { 4992 return this.optionConfig.optionPrices[this.productIndex].finalPrice.amount 4993 } 4994 const cheapestForSelection = this.findCheapestProductForPartialSelection(this.selectedValues); 4995 return this.optionConfig.optionPrices[cheapestForSelection] 4996 ? this.optionConfig.optionPrices[cheapestForSelection].finalPrice.amount 4997 : this.optionConfig.prices.finalPrice.amount; // default price if no option selection 4998 }, 4999 clearOptionIfActive(optionId, value) { 5000 if (this.selectedValues[optionId] === value) { 5001 this.blurLabel() 5002 this.changeOption(optionId, '') 5003 } 5004 }, 5005 removeAttrFromSelection(selectedValues, attributeId) { 5006 attributeId = parseInt(attributeId); 5007 return selectedValues.reduce((newSelection, val, attr) => { 5008 if (attr !== attributeId) { 5009 newSelection[attr] = val; 5010 } 5011 return newSelection; 5012 }, []); 5013 }, 5014 changeOption(attributeId, value) { 5015 let maxCustomOptions; 5016 if (value === '') { 5017 this.selectedValues = this.removeAttrFromSelection(this.selectedValues, attributeId) 5018 } else if (value && this.getAllowedAttributeOptions(attributeId).find(option => option.id === value)) { 5019 this.selectedValues[attributeId] = value; 5020 } 5021 5022 if ([251,258].includes(parseInt(attributeId))) { 5023 maxCustomOptions = this.calculateMaxCustomOptions(attributeId, value); 5024 } 5025 5026 this.findSimpleIndex(); 5027 this.findAllowedAttributeOptions(); 5028 this.updatePrices(); 5029 this.updateGallery(); 5030 5031 let $formEl = document.getElementById('product_addtocart_form'), 5032 $formOptions = $formEl.querySelectorAll('select'), 5033 $formValid = Array.from($formOptions).every(select => !!parseInt(select.value)); 5034 5035 5036 window.dispatchEvent( 5037 new CustomEvent( 5038 'configurable-selection-changed', 5039 { 5040 detail: { 5041 productId: this.productId, 5042 optionId: attributeId, 5043 value: value, 5044 productIndex: this.productIndex, 5045 selectedValues: this.selectedValues, 5046 candidates: this.findProductIdsForPartialSelection(this.selectedValues), 5047 valid: $formValid, 5048 ... maxCustomOptions && {maxCustomOptions: maxCustomOptions} 5049 } 5050 } 5051 ) 5052 ); 5053 }, 5054 calculateMaxCustomOptions(attributeId ,value) { 5055 if (value === '') { 5056 return 0; 5057 } else { 5058 return parseInt( 5059 this.optionConfig.attributes[attributeId].options 5060 .filter(item => item.id === value)[0].adminLabel 5061 ) 5062 } 5063 5064 }, 5065 calculateIsMinimalPrice() { 5066 return ( 5067 this.selectedValues.filter(value => !!value).length < 5068 Object.keys(this.optionConfig.attributes).length 5069 ); 5070 }, 5071 updatePrices() { 5072 const value = this.productIndex ? 5073 this.optionConfig.optionPrices[this.productIndex] : 5074 this.optionConfig.prices; 5075 window.dispatchEvent( 5076 new CustomEvent( 5077 "update-prices-" + this.productId, 5078 { 5079 detail: Object.assign( 5080 value, 5081 { isMinimalPrice: this.calculateIsMinimalPrice() } 5082 ) 5083 } 5084 ) 5085 ); 5086 }, 5087 updateGallery () { 5088 if (this.productIndex) { 5089 const images = this.optionConfig.images[this.productIndex]; 5090 images && window.dispatchEvent(new CustomEvent( 5091 "update-gallery", 5092 { detail: this.sortImagesByPosition(images) } 5093 )); 5094 } else { 5095 window.dispatchEvent(new Event("reset-gallery")); 5096 } 5097 }, 5098 sortImagesByPosition(images) { 5099 return images.sort((x, y) => { 5100 return x.position === y.position ? 0 : (parseInt(x.position) > parseInt(y.position) ? 1 : -1) 5101 }); 5102 }, 5103 onGetCartData(data) { 5104 }, 5105 preselectCartItems(data) { 5106 // pre-select options based on cart data for current (quote) itemId 5107 const cart = data && data.cart; 5108 if (cart && cart.items) { 5109 const cartItem = cart.items.find((item) => { 5110 return ( 5111 item.item_id === this.itemId 5112 && item.product_id === this.productId 5113 ) 5114 }); 5115 if (cartItem && cartItem.options && cartItem.options.length) { 5116 cartItem.options.map(option => { 5117 this.changeOption(option.option_id, option.option_value); 5118 }) 5119 } 5120 } 5121 }, 5122 preselectQuerystringItems() { 5123 // pre-select option like ?size=167 5124 const urlQueryParams = new URLSearchParams(window.location.search.replace('?','')); 5125 this.preselectItemsBasedOnLocation(attribute => urlQueryParams.get(attribute.code)); 5126 }, 5127 preselectLocationHashItems() { 5128 // pre-select option like #144=167 5129 const urlHashParams = new URLSearchParams(window.location.hash.replace('#','')); 5130 this.preselectItemsBasedOnLocation(attribute => urlHashParams.get(attribute.id)); 5131 }, 5132 preselectItemsBasedOnLocation(getLocationValue) { 5133 Object.values(this.optionConfig.attributes).map(attribute => { 5134 this.changeOption(attribute.id, getLocationValue(attribute)) 5135 }); 5136 } 5137 } 5138 } 5139 5140</script>
vendor: 1 bytes, line 5140
5140
5141<script> 5142 function initSwatchOptions(swatchConfig) { 5143 return { 5144 swatchConfig, 5145 getAttributeSwatchData(attributeId) { 5146 const swatchConfig = Object.assign({}, this.swatchConfig[attributeId]); 5147 swatchConfig['details'] = JSON.parse(swatchConfig['additional_data']); 5148 5149 return swatchConfig; 5150 }, 5151 mapSwatchTypeNumberToTypeCode(typeNumber) { 5152 switch ("" + typeNumber) { 5153 case "1": 5154 return "color" 5155 case "2": 5156 return "image" 5157 case "3": 5158 return "empty" 5159 case "0": 5160 default: 5161 return "text" 5162 } 5163 }, 5164 getTypeOfFirstOption(attributeId) { 5165 for (const optionId in this.swatchConfig[attributeId]) { 5166 const option = this.swatchConfig[attributeId][optionId]; 5167 if (typeof option.type !== 'undefined') { 5168 return this.mapSwatchTypeNumberToTypeCode(option.type); 5169 } 5170 } 5171 }, 5172 getVisualSwatchType(attributeId, targetOptionId) { 5173 // If a type configuration is present for the given option id, use it 5174 const config = this.swatchConfig[attributeId]; 5175 if (config[targetOptionId] && typeof config[targetOptionId].type !== 'undefined') { 5176 return this.mapSwatchTypeNumberToTypeCode(config[targetOptionId].type); 5177 } 5178 5179 // Otherwise - if no config is present for the target option - use the type of the first option 5180 // with a type property from the attribute, thus assuming its the same type as the target option. 5181 // (This edge case condition can occur on single swatch products if some options are not salable) 5182 return this.getTypeOfFirstOption(attributeId); 5183 }, 5184 getSwatchType(attributeId, optionId) { 5185 // Deserialize the attribute details the first time they are used 5186 if (this.swatchConfig[attributeId] && ! this.swatchConfig[attributeId].details) { 5187 this.swatchConfig[attributeId] = this.getAttributeSwatchData(attributeId); 5188 } 5189 const type = this.swatchConfig[attributeId] && 5190 this.swatchConfig[attributeId].details && 5191 this.swatchConfig[attributeId].details.swatch_input_type || 5192 "empty"; 5193 return type === 'visual' ? this.getVisualSwatchType(attributeId, optionId) : type; 5194 }, 5195 isTextSwatch(attributeId, optionId) { 5196 return this.getSwatchType(attributeId, optionId) === 'text'; 5197 }, 5198 isVisualSwatch(attributeId, optionId) { 5199 const type = this.getSwatchType(attributeId, optionId); 5200 5201 return ['image', 'color'].includes(type); 5202 }, 5203 getSwatchBackgroundStyle(attributeId, optionId) { 5204 const config = this.getSwatchConfig(attributeId, optionId); 5205 const type = this.getSwatchType(attributeId, optionId); 5206 5207 if (type === "color") { 5208 return 'background-color:' + config.value; 5209 } else if (type === "image") { 5210 return "background: #fff url('" + config.value + "') no-repeat center"; 5211 } else { 5212 return ''; 5213 } 5214 }, 5215 getSwatchText(attributeId, optionId) { 5216 const config = this.getSwatchConfig(attributeId, optionId); 5217 return config.label || config.value || this.getOptionLabelFromOptionConfig(attributeId, optionId); 5218 }, 5219 getOptionLabelFromOptionConfig(attributeId, optionId) { 5220 // Fallback if no value is present in swatchConfig data 5221 // Reference issue https://gitlab.hyva.io/hyva-themes/magento2-default-theme/-/issues/190 5222 const option = this.getAllAttributeOptions(attributeId).filter(option => option.id === optionId); 5223 return option && option[0] && option[0].label ||''; 5224 }, 5225 getSwatchConfig(attributeId, optionId) { 5226 return this.swatchConfig[attributeId] && this.swatchConfig[attributeId][optionId] 5227 ? this.swatchConfig[attributeId][optionId] 5228 : false;
5229 }, 5230 activeTooltipItem: false, 5231 tooltipPositionElement: false, 5232 isTooltipVisible() { 5233 return this.activeTooltipItem && 5234 this.getSwatchConfig( 5235 this.activeTooltipItem.attribute, 5236 this.activeTooltipItem.item 5237 ); 5238 }, 5239 isFirstItemCol() { 5240 return this.activeTooltipItem.index === 0; 5241 }, 5242 getTooltipImageStyle(attributeId, optionId) { 5243 const config = this.getSwatchConfig(attributeId, optionId); 5244 const type = this.getSwatchType(attributeId, optionId); 5245 5246 if (type === "color") { 5247 return 'background-color:' + config.value + '; width: 110px; height: 90px;'; 5248 } else if (type === "image") { 5249 return "background: #ffffff url('" + config.thumb + 5250 "') center center no-repeat; width: 110px; height: 90px;"; 5251 } else { 5252 return 'display:none'; 5253 } 5254 }, 5255 getTooltipPosition() { 5256 return this.tooltipPositionElement ? 5257 `top: ${this.tooltipPositionElement.offsetTop}px;` + 5258 `left: ${ 5259 this.tooltipPositionElement.offsetLeft - ( 5260 this.tooltipPositionElement.closest('.snap') && 5261 this.tooltipPositionElement.closest('.snap').scrollLeft || 5262 0 5263 ) 5264 }px;` : '' 5265 }, 5266 getTooltipLabel() { 5267 return this.getSwatchConfig(this.activeTooltipItem.attribute, this.activeTooltipItem.item).label 5268 }, 5269 focusedLabel: false, 5270 focusLabel(optionId) { 5271 this.focusedLabel = optionId; 5272 }, 5273 blurLabel() { 5274 this.focusedLabel = false; 5275 }, 5276 showSwatches: false, 5277 initShowSwatchesIntersect() { 5278 if ('IntersectionObserver' in window && !window.scrollY) { 5279 let io = new IntersectionObserver( 5280 entries => { 5281 entries.map(entry => { 5282 if (entry.isIntersecting) { 5283 this.showSwatches = true; 5284 io.unobserve(this.$root); 5285 } 5286 }) 5287 } 5288 ); 5289 io.observe(this.$root); 5290 } else { 5291 this.showSwatches = true 5292 } 5293 } 5294 } 5295 } 5296</script>
vendor: 1 bytes, line 5296
5296
5297<script> 5298 'use strict'; 5299 5300 const grecaptchaV2LoadCallbacks = []; 5301 5302 function executeRecaptchaLoadCallbacks () { 5303 while (window.grecaptcha && grecaptchaV2LoadCallbacks.length > 0) { 5304 const callback = grecaptchaV2LoadCallbacks.pop(); 5305 typeof callback === 'string' ? window[callback]() : callback(); 5306 } 5307 } 5308 5309 (function() { 5310 const loadRecaptchaScript = (event) => { 5311 5312 if (window.grecaptcha || !event.target.form) { 5313 return; 5314 } 5315 5316 const url = 'https://www.google.com/recaptcha/api.js?onload=executeRecaptchaLoadCallbacks'; 5317 const siteKey = '6LfZyRsrAAAAAA274PpbvhhN2tBp_pIfniW8yAPZ'; 5318 const script = document.createElement('script'); 5319 script.type = 'text/javascript'; 5320 script.src = siteKey ? `${url}&render=${siteKey}` : `${url}&render=explicit`; 5321 script.async = true; 5322 document.head.appendChild(script); 5323 5324 script.addEventListener('load', () => { 5325 Array.from(document.querySelectorAll('button[data-recaptcha-btn]:disabled')).forEach(btn => btn.removeAttribute('disabled')); 5326 }); 5327 } 5328 5329 window.forceLoadRecaptchaScript = (form) => { 5330 loadRecaptchaScript({target: {form: form || 'dummy'}}); 5331 executeRecaptchaLoadCallbacks(); 5332 }; 5333 5334 document.body.addEventListener('input', loadRecaptchaScript, { once: true }); 5335 document.body.addEventListener('focus', loadRecaptchaScript, { once: true }); 5336 5337 }()); 5338 5339</script>
vendor: 1 bytes, line 5339
5339
5340<script> 5341 'use strict'; 5342 5343 (function () { 5344 const preloadRecaptcha = () => { 5345 // script_loader.phtml did not render (no keys configured), or api.js is already up. 5346 if (typeof window.forceLoadRecaptchaScript !== 'function' || window.grecaptcha) { 5347 return; 5348 } 5349 5350 const element = document.querySelector( 5351 'input[name="g-recaptcha-response"], .g-recaptcha, [data-recaptcha-btn]' 5352 ); 5353 5354 if (!element) { 5355 return; 5356 } 5357 5358 // forceLoadRecaptchaScript needs a truthy form to get past its own guard; a bare 5359 // .g-recaptcha container has no .form, and undefined makes it substitute a placeholder. 5360 window.forceLoadRecaptchaScript(element.form || undefined); 5361 }; 5362 5363 if (document.readyState === 'loading') { 5364 document.addEventListener('DOMContentLoaded', preloadRecaptcha); 5365 } else { 5366 preloadRecaptcha(); 5367 } 5368 }()); 5369</script>
5369 5370<div class="pubble-app" data-app-id="85585" data-app-identifier="85585"></div>
5371<script 5372 type="text/javascript" src="https://cdn.pubble.io/javascript/loader.js" defer 5373></script>
5373 5374
5375<script> 5376 'use strict'; 5377 (() => { 5378 function _calculateStrength({elementID, valid}) { 5379 const password = document.getElementById(elementID), 5380 emailElm = document.getElementById('email_address'); 5381 let displayScore; 5382 // Display score is based on combination of whether password is empty, valid, and zxcvbn strength 5383 if (!password || !password.value) { 5384 displayScore = 0; 5385 } else { 5386 // We should only perform this check in case there is an email field on screen 5387 if (emailElm && password.value && emailElm.value && 5388 password.value.toLowerCase() === emailElm.value.toLowerCase()) { 5389 displayScore = 1; 5390 } else { 5391 const zxcvbnScore = zxcvbn(password.value).score; 5392 displayScore = valid && zxcvbnScore > 0 ? zxcvbnScore : 1; 5393 } 5394 } 5395 5396 _displayStrength(displayScore); 5397 } 5398 5399 function _displayStrength(displayScore) { 5400 let strengthLabel = '', 5401 className; 5402 5403 switch (displayScore) { 5404 case 0: 5405 strengthLabel = "No\u0020Password"; 5406 className = 'password-none'; 5407 break; 5408 5409 case 1: 5410 strengthLabel = "Weak"; 5411 className = 'password-weak'; 5412 break; 5413 5414 case 2: 5415 strengthLabel = "Medium"; 5416 className = 'password-medium'; 5417 break; 5418 5419 case 3: 5420 strengthLabel = "Strong"; 5421 className = 'password-strong'; 5422 break; 5423 5424 case 4: 5425 strengthLabel = "Very\u0020Strong"; 5426 className = 'password-very-strong'; 5427 break; 5428 } 5429 const meterElm = document.getElementById('password-strength-meter-container'), 5430 meterLabelElm = document.getElementById('password-strength-meter-label'); 5431 meterElm.className = ''; 5432 meterElm.classList.add(className); 5433 meterLabelElm.textContent = strengthLabel; 5434 } 5435 5436 let loading = false; 5437 const callbacks = []; 5438 5439 function loadZxcvbn(cb) { 5440 callbacks.push(cb); 5441 if (loading) return; 5442 loading = true; 5443 5444 const script = document.createElement('script'); 5445 script.type = 'text/javascript'; 5446 script.src = 'https\u003A\u002F\u002Fstata\u002Dbrazil.com\u002Fstatic\u002Fversion1790944496\u002Ffrontend\u002FTimberlakeHyva\u002Ftimberlake\u002Fpt_BR\u002Fjs\u002Fzxcvbn.js'; 5447 script.async = true; 5448 script.onload = () => callbacks.forEach(cb => cb()); 5449 document.head.appendChild(script); 5450 } 5451 5452 window.addEventListener('password-validate', function (evt) { 5453 const meterElm = document.getElementById('password-strength-meter-container'), 5454 meterLabelElm = document.getElementById('password-strength-meter-label'); 5455 if (meterElm && meterLabelElm) { 5456 if (evt.detail && evt.detail.elementID) { 5457 const cb = () => _calculateStrength(evt.detail); 5458 window.zxcvbn ? cb() : loadZxcvbn(cb) 5459 } 5460 } 5461 }); 5462 5463 5464 document.addEventListener('DOMContentLoaded', () => { 5465 hyva && hyva.formValidation && hyva.formValidation.addRule('password-strength', function(value, options, field, context) { 5466 let counter = 0; 5467 const minCharacterSets = options.minCharacterSets !== undefined ? options.minCharacterSets : 1; 5468 if (value.match(/\d+/)) { 5469 counter++; 5470 } 5471 5472 if (value.match(/[a-z]+/)) { 5473 counter++; 5474 } 5475 5476 if (value.match(/[A-Z]+/)) { 5477 counter++; 5478 } 5479 5480 if (value.match(/[^a-zA-Z0-9]+/)) { 5481 counter++; 5482 } 5483 5484 queueMicrotask(() => { 5485 window.dispatchEvent(new CustomEvent('password-validate', { detail: {
5486 elementID: field.element.id || 'password', 5487 valid: field.state.valid 5488 }})); 5489 }); 5490 5491 if (counter < minCharacterSets) { 5492 const missing = minCharacterSets - counter; 5493 return hyva.str('A\u0020senha\u0020deve\u0020incluir\u0020pelo\u0020menos\u0020\u00251\u0020ou\u0020mais\u0020de\u003A\u0020letras\u0020mai\u00FAsculas\u0020\u0028A\u002DZ\u0029,\u0020letras\u0020min\u00FAsculas\u0020\u0028a\u002Dz\u0029,\u0020n\u00FAmeros\u0020e\u0020s\u00EDmbolos.', missing); 5494 } 5495 return true; 5496 }); 5497 }) 5498 })(); 5499 5500</script>
vendor: 1 bytes, line 5500
5500
5501<script> 5502 (function () { 5503 const modals = []; 5504 const excludedFromFocusTrapping = new Set(); 5505 5506 function trapFocusInNextModalWithOverlay() { 5507 for (let idx = modals.length -1; idx >= 0; idx--) { 5508 const nextOnStack = modals[idx]; 5509 const nextDialogElement = nextOnStack.instance.$refs[nextOnStack.name]; 5510 if (! isOverlayDisabled(nextDialogElement)) { 5511 hyva.trapFocus(nextDialogElement); 5512 break; 5513 } 5514 } 5515 } 5516 5517 function focusables(dialogElement) { 5518 const selector = 'button, [href], input, textarea, select, details, [tabindex]:not([tabindex="-1"])'; 5519 return Array.from(dialogElement.querySelectorAll(selector)) 5520 .filter(el => !el.hasAttribute('disabled')); 5521 } 5522 5523 function firstVisible(elements) { 5524 const a = Array.from(elements); 5525 for (let i = 0; i < a.length; i++) { 5526 if (a[i].offsetWidth || a[i].offsetHeight || a[i].getClientRects().length) return a[i]; 5527 } 5528 return null; 5529 } 5530 5531 function isInViewport(element) { 5532 const rect = element && element.getBoundingClientRect(); 5533 return rect && 5534 rect.top >= 0 && 5535 rect.left >= 0 && 5536 rect.right <= window.innerWidth && 5537 rect.bottom <= window.innerHeight; 5538 } 5539 5540 function setFocusAfterTransition(dialogElement, duration) { 5541 const nested = Array.from(dialogElement.querySelectorAll('[role="dialog"]')); 5542 const candidates = Array.from(dialogElement.querySelectorAll('[x-focus-first]')); 5543 next: for (let candidate of candidates) { 5544 for (let child of nested) { 5545 if (child.contains(candidate)) continue next; 5546 } 5547 setTimeout(() => candidate.focus(), 50); 5548 break; 5549 } 5550 window.setTimeout(() => { 5551 const focusElement = firstVisible(dialogElement.querySelectorAll('[x-focus-first]')) || 5552 focusables(dialogElement)[0] || 5553 null; 5554 focusElement && isInViewport(focusElement) && focusElement.focus(); 5555 }, Math.max(1, duration)); 5556 } 5557 5558 function determineTrigger($refs, dialog, trigger) { 5559 if (typeof trigger === 'undefined' && typeof dialog === 'object' && dialog.target instanceof HTMLElement) { 5560 return dialog.target; 5561 } 5562 if (typeof dialog === 'string' && typeof trigger === 'object' && trigger.target instanceof HTMLElement) { 5563 return trigger.target; 5564 } 5565 if (typeof trigger === 'string') { 5566 try { 5567 return $refs[trigger] || document.querySelector(trigger) 5568 } catch (e) {} 5569 } 5570 if (trigger instanceof Element) { 5571 return trigger; 5572 } 5573 5574 return null; 5575 } 5576 5577 function isOverlayDisabled(dialog) { 5578 return dialog && dialog.hasAttribute('x-no-overlay') 5579 } 5580 5581 function areRemainingModalsWithoutOverlay(modals) 5582 { 5583 const overflowDisabled = modals.map(modal => modal.instance.$refs[modal.name]).filter(isOverlayDisabled); 5584 5585 return overflowDisabled.length === modals.length; 5586 } 5587 5588 window.hyva.modal = function(options = {}) { 5589 if (this.$el && this.$el.dataset && this.$el.dataset.options) { 5590 try { 5591 options = Object.assign(options, JSON.parse(this.$el.dataset.options || '{}')); 5592 } catch (e) { 5593 throw new Error('Cannot read the dialog options from the data-options attribute: not valid JSON'); 5594 } 5595 } 5596 5597 const config = Object.assign({ 5598 dialog: 'dialog', duration: 300, transitionEnter: 'transition ease-out duration-300', 5599 transitionEnterStart: 'opacity-0', 5600 transitionEnterEnd: 'opacity-100', 5601 transitionLeave: 'transition ease-in duration-300', 5602 transitionLeaveStart: 'opacity-100', 5603 transitionLeaveEnd: 'opacity-0', 5604 }, options); 5605 let lastHide = 0; 5606 5607 return { 5608 opened: {}, 5609 show(dialog, trigger) { 5610 const focusTargetAfterHide = determineTrigger(this.$refs, dialog, trigger); 5611 const name = typeof dialog === 'string' ? dialog : config.dialog; 5612 const dialogElement = this.$refs[name]; 5613 if (! dialogElement) { 5614 return; 5615 } 5616 const useOverlay = ! dialogElement.hasAttribute('x-no-overlay'); 5617 5618 dialogElement.scrollTop = 0; 5619 5620 if (this.opened[name]) { 5621 return; 5622 } 5623 5624 if (focusTargetAfterHide) { 5625 focusTargetAfterHide.setAttribute('aria-expanded', 'true'); 5626 } 5627 5628 this.opened[name] = true; 5629 useOverlay && this.$nextTick(() => hyva.trapFocus(dialogElement)); 5630 setFocusAfterTransition(dialogElement, config.duration); 5631 5632 const frame = {name, instance: this, focusTarget: focu
5632sTargetAfterHide, time: Date.now()}; 5633 5634 modals.push(frame); 5635 if (useOverlay) { 5636 document.body.classList.add('overflow-hidden'); 5637 } 5638 return new Promise(resolve => frame.resolve = resolve); 5639 }, 5640 cancel() { 5641 this.hide(false); 5642 }, 5643 ok() { 5644 this.hide(true); 5645 }, 5646 hide(value) { 5647 if (Date.now() - lastHide < config.duration) { 5648 return; 5649 } 5650 lastHide = Date.now(); 5651 5652 const modal = modals.pop() || {}; 5653 if (! modal.instance) { 5654 return; 5655 } 5656 5657 const name = modal.name; 5658 this.opened[name] = false; 5659 hyva.releaseFocus(modal.instance.$refs[modal.name]) 5660 trapFocusInNextModalWithOverlay(); 5661 5662 const nextFocusAfterHide = modal.focusTarget; 5663 nextFocusAfterHide && setTimeout(() => { 5664 nextFocusAfterHide.setAttribute('aria-expanded', 'false'); 5665 nextFocusAfterHide.focus() 5666 }, config.duration); 5667 5668 if (modals.length === 0 || areRemainingModalsWithoutOverlay(modals)) { 5669 document.body.classList.remove('overflow-hidden'); 5670 } 5671 5672 modal.resolve(value); 5673 }, 5674 overlay(dialog) { 5675 dialog = this.$el.dataset.dialogRefName || dialog; 5676 const name = typeof dialog === 'string' ? dialog : config.dialog; 5677 return { 5678 ['x-show']() { 5679 return this.opened[name] 5680 }, 5681 ['x-transition:enter']: config.transitionEnter, 5682 ['x-transition:enter-start']: config.transitionEnterStart, 5683 ['x-transition:enter-end']: config.transitionEnterEnd, 5684 ['x-transition:leave']: config.transitionLeave, 5685 ['x-transition:leave-start']: config.transitionLeaveStart, 5686 ['x-transition:leave-end']: config.transitionLeaveEnd, 5687 ['@hyva-modal-show.window'](event) { 5688 event.detail && event.detail.dialog === name && this.show(name, event.detail.focusAfterHide) 5689 } 5690 }; 5691 }, 5692 showDialogOnInit() { 5693 const parent = this.$el.closest('[data-dialog-ref-name]'); 5694 if (parent && parent.dataset.dialogRefName) { 5695 this.$dispatch('hyva-modal-show', {dialog: parent.dataset.dialogRefName}) 5696 } 5697 } 5698 }; 5699 } 5700 5701 window.hyva.modal.peek = () => modals.length > 0 && modals[modals.length -1] 5702 5703 window.hyva.modal.pop = function () { 5704 if (modals.length > 0) { 5705 const modal = modals[modals.length -1]; 5706 modal.instance.hide(); 5707 } 5708 } 5709 5710 window.hyva.modal.excludeSelectorsFromFocusTrap = function (selectors) { 5711 typeof selectors === 'string' || selectors instanceof String 5712 ? excludedFromFocusTrapping.add(selectors) 5713 : selectors.map(selector => excludedFromFocusTrapping.add(selector)); 5714 } 5715 5716 window.hyva.modal.eventListeners = { 5717 keydown: event => { 5718 if (event.key === 'Escape') { 5719 window.hyva.modal.pop(); 5720 } 5721 }, 5722 click: event => { 5723 if (modals.length > 0) { 5724 const modal = modals[modals.length -1]; 5725 const dialog = modal.instance.$refs[modal.name]; 5726 if (modal.time + 50 < Date.now() && // if last click processing is more than 50ms ago 5727 ! isOverlayDisabled(dialog) && // if dialog has overlay 5728 ! dialog.contains(event.target)) { // if click is outside of dialog 5729 modal.instance.hide(); 5730 } 5731 } 5732 } 5733 }; 5734 5735 document.addEventListener('keydown', window.hyva.modal.eventListeners.keydown); 5736 5737 document.addEventListener('click', window.hyva.modal.eventListeners.click); 5738 })(); 5739 window.addEventListener('alpine:init', () => { 5740 Alpine.data('hyvaModal', window.hyva.modal); 5741 }, {once: true}); 5742</script>
vendor: 1 bytes, line 5742
5742
5743<script type="text/json" id="default-section-data"> 5744 {"messages":[],"customer":[],"compare-products":[],"last-ordered-items":[],"cart":[],"directory-data":{"AD":{"name":"Andorra"},"AE":{"name":"Emirados \u00c1rabes Unidos"},"AF":{"name":"Afeganist\u00e3o"},"AG":{"name":"Ant\u00edgua e Barbuda"},"AI":{"name":"Anguila"},"AL":{"name":"Alb\u00e2nia","regions":{"485":{"code":"AL-01","name":"Berat"},"486":{"code":"AL-09","name":"Dib\u00ebr"},"487":{"code":"AL-02","name":"Durr\u00ebs"},"488":{"code":"AL-03","name":"Elbasan"},"489":{"code":"AL-04","name":"Fier"},"490":{"code":"AL-05","name":"Gjirokast\u00ebr"},"491":{"code":"AL-06","name":"Kor\u00e7\u00eb"},"492":{"code":"AL-07","name":"Kuk\u00ebs"},"493":{"code":"AL-08","name":"Lezh\u00eb"},"494":{"code":"AL-10","name":"Shkod\u00ebr"},"495":{"code":"AL-11","name":"Tiran\u00eb"},"496":{"code":"AL-12","name":"Vlor\u00eb"}}},"AM":{"name":"Arm\u00eania"},"AN":{"name":null},"AO":{"name":"Angola"},"AQ":{"name":"Ant\u00e1rtida"},"AR":{"name":"Argentina","regions":{"498":{"code":"AR-B","name":"Buenos Aires"},"499":{"code":"AR-K","name":"Catamarca"},"500":{"code":"AR-H","name":"Chaco"},"501":{"code":"AR-U","name":"Chubut"},"497":{"code":"AR-C","name":"Ciudad Aut\u00f3noma de Buenos Aires"},"502":{"code":"AR-X","name":"C\u00f3rdoba"},"503":{"code":"AR-W","name":"Corrientes"},"504":{"code":"AR-E","name":"Entre R\u00edos"},"505":{"code":"AR-P","name":"Formosa"},"506":{"code":"AR-Y","name":"Jujuy"},"507":{"code":"AR-L","name":"La Pampa"},"508":{"code":"AR-F","name":"La Rioja"},"509":{"code":"AR-M","name":"Mendoza"},"510":{"code":"AR-N","name":"Misiones"},"511":{"code":"AR-Q","name":"Neuqu\u00e9n"},"512":{"code":"AR-R","name":"R\u00edo Negro"},"513":{"code":"AR-A","name":"Salta"},"514":{"code":"AR-J","name":"San Juan"},"515":{"code":"AR-D","name":"San Luis"},"516":{"code":"AR-Z","name":"Santa Cruz"},"517":{"code":"AR-S","name":"Santa Fe"},"518":{"code":"AR-G","name":"Santiago del Estero"},"519":{"code":"AR-V","name":"Tierra del Fuego"},"520":{"code":"AR-T","name":"Tucum\u00e1n"}}},"AS":{"name":"Samoa Americana"},"AT":{"name":"\u00c1ustria","regions":{"102":{"code":"BL","name":"Burgenland"},"99":{"code":"KN","name":"K\u00e4rnten"},"96":{"code":"NO","name":"Nieder\u00f6sterreich"},"97":{"code":"OO","name":"Ober\u00f6sterreich"},"98":{"code":"SB","name":"Salzburg"},"100":{"code":"ST","name":"Steiermark"},"101":{"code":"TI","name":"Tirol"},"103":{"code":"VB","name":"Vorarlberg"},"95":{"code":"WI","name":"Wien"}}},"AU":{"name":"Austr\u00e1lia"},"AW":{"name":"Aruba"},"AX":{"name":"Ilhas Aland"},"AZ":{"name":"Azerbaij\u00e3o"},"BA":{"name":"B\u00f3snia e Herzegovina"},"BB":{"name":"Barbados"},"BD":{"name":"Bangladesh"},"BE":{"name":"B\u00e9lgica"},"BF":{"name":"Burquina Faso"},"BG":{"name":"Bulg\u00e1ria"},"BH":{"name":"Barein"},"BI":{"name":"Burundi"},"BJ":{"name":"Benin"},"BL":{"name":"S\u00e3o Bartolomeu"},"BM":{"name":"Bermudas"},"BN":{"name":"Brunei"},"BO":{"name":"Bol\u00edvia","regions":{"529":{"code":"BO-H","name":"Chuquisaca"},"528":{"code":"BO-C","name":"Cochabamba"},"530":{"code":"BO-B","name":"El Beni"},"531":{"code":"BO-L","name":"La Paz"},"532":{"code":"BO-O","name":"Oruro"},"533":{"code":"BO-N","name":"Pando"},"534":{"code":"BO-P","name":"Potos\u00ed"},"535":{"code":"BO-S","name":"Santa Cruz"},"536":{"code":"BO-T","name":"Tarija"}}},"BR":{"name":"Brasil"},"BS":{"name":"Bahamas"},"BT":{"name":"But\u00e3o"},"BV":{"name":"Ilha Bouvet"},"BW":{"name":"Botsuana"},"BY":{"name":"Bielorr\u00fassia","regions":{"521":{"code":"BY-BR","name":"Bresckaja voblas\u0107"},"522":{"code":"BY-HO","name":"Homie\u013askaja voblas\u0107"},"523":{"code":"BY-HM","name":"Horad Minsk"},"524":{"code":"BY-HR","name":"Hrodzienskaja voblas\u0107"},"525":{"code":"BY-MA","name":"Mahilio\u016dskaja voblas\u0107"},"526":{"code":"BY-MI","name":"Minskaja voblas\u0107"},"527":{"code":"BY-VI","name":"Viciebskaja voblas\u0107"}}},"BZ":{"name":"Belize"},"CA":{"name":"Canad\u00e1","regions":{"66":{"code":"AB","name":"Alberta"},"67":{"code":"BC","name":"British Columbia"},"68":{"code":"MB","name":"Manitoba"},"70":{"code":"NB","name":"New Brunswick"},"69":{"code":"NL","name":"Newfoundland and Labrador"},"72":{"code":"NT","name":"Northwest Territories"},"71":{"code":"NS","name":"Nova Scotia"},"73":{"code":"NU","name":"Nunavut"},"74":{"code":"ON","name":"Ontario"},"75":{"code":"PE","name":"Prince Edward Island"},"76":{"code":"QC","name":"Quebec"},"77":{"code":"SK","name":"Saskatchewan"},"78":{"code":"YT","name":"Yukon Territory"}}},"CC":{"name":"Ilhas Cocos (Keeling)"},"CD":{"name":"Congo - Kinshasa"},"CF":{"name":"Rep\u00fablica Centro-Africana"}
5744,"CG":{"name":"Rep\u00fablica do Congo"},"CH":{"name":"Su\u00ed\u00e7a","regions":{"104":{"code":"AG","name":"Aargau"},"106":{"code":"AR","name":"Appenzell Ausserrhoden"},"105":{"code":"AI","name":"Appenzell Innerrhoden"},"108":{"code":"BL","name":"Basel-Landschaft"},"109":{"code":"BS","name":"Basel-Stadt"},"107":{"code":"BE","name":"Bern"},"110":{"code":"FR","name":"Friburg"},"111":{"code":"GE","name":"Geneva"},"112":{"code":"GL","name":"Glarus"},"113":{"code":"GR","name":"Graub\u00fcnden"},"114":{"code":"JU","name":"Jura"},"115":{"code":"LU","name":"Lucerne"},"116":{"code":"NE","name":"Neuch\u00e2tel"},"117":{"code":"NW","name":"Nidwalden"},"118":{"code":"OW","name":"Obwalden"},"120":{"code":"SH","name":"Schaffhausen"},"122":{"code":"SZ","name":"Schwyz"},"121":{"code":"SO","name":"Solothurn"},"119":{"code":"SG","name":"St. Gallen"},"123":{"code":"TG","name":"Thurgau"},"124":{"code":"TI","name":"Ticino"},"125":{"code":"UR","name":"Uri"},"126":{"code":"VD","name":"Vaud"},"127":{"code":"VS","name":"Wallis"},"128":{"code":"ZG","name":"Zug"},"129":{"code":"ZH","name":"Z\u00fcrich"}}},"CI":{"name":"Costa do Marfim"},"CK":{"name":"Ilhas Cook"},"CL":{"name":"Chile","regions":{"537":{"code":"CL-AI","name":"Ais\u00e9n del General Carlos Iba\u00f1ez del Campo"},"538":{"code":"CL-AN","name":"Antofagasta"},"539":{"code":"CL-AP","name":"Arica y Parinacota"},"541":{"code":"CL-AT","name":"Atacama"},"542":{"code":"CL-BI","name":"Biob\u00edo"},"543":{"code":"CL-CO","name":"Coquimbo"},"540":{"code":"CL-AR","name":"La Araucan\u00eda"},"544":{"code":"CL-LI","name":"Libertador General Bernardo O'Higgins"},"545":{"code":"CL-LL","name":"Los Lagos"},"546":{"code":"CL-LR","name":"Los R\u00edos"},"547":{"code":"CL-MA","name":"Magallanes"},"548":{"code":"CL-ML","name":"Maule"},"549":{"code":"CL-NB","name":"\u00d1uble"},"550":{"code":"CL-RM","name":"Regi\u00f3n Metropolitana de Santiago"},"551":{"code":"CL-TA","name":"Tarapac\u00e1"},"552":{"code":"CL-VS","name":"Valpara\u00edso"}}},"CM":{"name":"Camar\u00f5es"},"CN":{"name":"China"},"CO":{"name":"Col\u00f4mbia"},"CR":{"name":"Costa Rica","regions":{"735":{"code":"CR-AL","name":"Alajuela"},"736":{"code":"CR-CA","name":"Cartago"},"738":{"code":"CR-GU","name":"Guanacaste"},"737":{"code":"CR-HE","name":"Heredia"},"740":{"code":"CR-LI","name":"Lim\u00f3n"},"739":{"code":"CR-PU","name":"Puntarenas"},"734":{"code":"CR-SJ","name":"San Jos\u00e9"}}},"CU":{"name":"Cuba"},"CV":{"name":"Cabo Verde"},"CX":{"name":"Ilha Christmas"},"CY":{"name":"Chipre"},"CZ":{"name":"Tch\u00e9quia","regions":{"743":{"code":"CZ-31","name":"Jiho\u010desk\u00fd kraj"},"751":{"code":"CZ-64","name":"Jihomoravsk\u00fd kraj"},"745":{"code":"CZ-41","name":"Karlovarsk\u00fd kraj"},"750":{"code":"CZ-63","name":"Kraj Vyso\u010dina"},"748":{"code":"CZ-52","name":"Kr\u00e1lov\u00e9hradeck\u00fd kraj"},"747":{"code":"CZ-51","name":"Libereck\u00fd kraj"},"754":{"code":"CZ-80","name":"Moravskoslezsk\u00fd kraj"},"752":{"code":"CZ-71","name":"Olomouck\u00fd kraj"},"749":{"code":"CZ-53","name":"Pardubick\u00fd kraj"},"744":{"code":"CZ-32","name":"Plze\u0148sk\u00fd kraj"},"741":{"code":"CZ-10","name":"Praha, Hlavn\u00ed m\u011bsto"},"742":{"code":"CZ-20","name":"St\u0159edo\u010desk\u00fd kraj"},"746":{"code":"CZ-42","name":"\u00dasteck\u00fd kraj"},"753":{"code":"CZ-72","name":"Zl\u00ednsk\u00fd kraj"}}},"DE":{"name":"Alemanha","regions":{"80":{"code":"BAW","name":"Baden-W\u00fcrttemberg"},"81":{"code":"BAY","name":"Bayern"},"82":{"code":"BER","name":"Berlin"},"83":{"code":"BRG","name":"Brandenburg"},"84":{"code":"BRE","name":"Bremen"},"85":{"code":"HAM","name":"Hamburg"},"86":{"code":"HES","name":"Hessen"},"87":{"code":"MEC","name":"Mecklenburg-Vorpommern"},"79":{"code":"NDS","name":"Niedersachsen"},"88":{"code":"NRW","name":"Nordrhein-Westfalen"},"89":{"code":"RHE","name":"Rheinland-Pfalz"},"90":{"code":"SAR","name":"Saarland"},"91":{"code":"SAS","name":"Sachsen"},"92":{"code":"SAC","name":"Sachsen-Anhalt"},"93":{"code":"SCN","name":"Schleswig-Holstein"},"94":{"code":"THE","name":"Th\u00fcringen"}}},"DJ":{"name":"Djibuti"},"DK":{"name":"Dinamarca","regions":{"553":{"code":"DK-84","name":"Hovedstaden"},"554":{"code":"DK-82","name":"Midtjylland"},"555":{"code":"DK-81","name":"Nordjylland"},"556":{"code":"DK-85","name":"Sj\u00e6lland"},"557":{"code":"DK-83","name":"Syddanmark"}}},"DM":{"name":"Dominica"}
5744,"DO":{"name":"Rep\u00fablica Dominicana"},"DZ":{"name":"Arg\u00e9lia"},"EC":{"name":"Equador","regions":{"558":{"code":"EC-A","name":"Azuay"},"559":{"code":"EC-B","name":"Bol\u00edvar"},"560":{"code":"EC-F","name":"Ca\u00f1ar"},"561":{"code":"EC-C","name":"Carchi"},"562":{"code":"EC-H","name":"Chimborazo"},"563":{"code":"EC-X","name":"Cotopaxi"},"564":{"code":"EC-O","name":"El Oro"},"565":{"code":"EC-E","name":"Esmeraldas"},"566":{"code":"EC-W","name":"Gal\u00e1pagos"},"567":{"code":"EC-G","name":"Guayas"},"568":{"code":"EC-I","name":"Imbabura"},"569":{"code":"EC-L","name":"Loja"},"570":{"code":"EC-R","name":"Los R\u00edos"},"571":{"code":"EC-M","name":"Manab\u00ed"},"572":{"code":"EC-S","name":"Morona Santiago"},"573":{"code":"EC-N","name":"Napo"},"574":{"code":"EC-D","name":"Orellana"},"575":{"code":"EC-Y","name":"Pastaza"},"576":{"code":"EC-P","name":"Pichincha"},"577":{"code":"EC-SE","name":"Santa Elena"},"578":{"code":"EC-SD","name":"Santo Domingo de los Ts\u00e1chilas"},"579":{"code":"EC-U","name":"Sucumb\u00edos"},"580":{"code":"EC-T","name":"Tungurahua"},"581":{"code":"EC-Z","name":"Zamora Chinchipe"}}},"EE":{"name":"Est\u00f4nia","regions":{"340":{"code":"EE-37","name":"Harjumaa"},"341":{"code":"EE-39","name":"Hiiumaa"},"342":{"code":"EE-44","name":"Ida-Virumaa"},"344":{"code":"EE-51","name":"J\u00e4rvamaa"},"343":{"code":"EE-49","name":"J\u00f5gevamaa"},"346":{"code":"EE-59","name":"L\u00e4\u00e4ne-Virumaa"},"345":{"code":"EE-57","name":"L\u00e4\u00e4nemaa"},"348":{"code":"EE-67","name":"P\u00e4rnumaa"},"347":{"code":"EE-65","name":"P\u00f5lvamaa"},"349":{"code":"EE-70","name":"Raplamaa"},"350":{"code":"EE-74","name":"Saaremaa"},"351":{"code":"EE-78","name":"Tartumaa"},"352":{"code":"EE-82","name":"Valgamaa"},"353":{"code":"EE-84","name":"Viljandimaa"},"354":{"code":"EE-86","name":"V\u00f5rumaa"}}},"EG":{"name":"Egito"},"EH":{"name":"Saara Ocidental"},"ER":{"name":"Eritreia"},"ES":{"name":"Espanha","regions":{"130":{"code":"A Coru\u0441a","name":"A Coru\u00f1a"},"131":{"code":"Alava","name":"Alava"},"132":{"code":"Albacete","name":"Albacete"},"133":{"code":"Alicante","name":"Alicante"},"134":{"code":"Almeria","name":"Almeria"},"135":{"code":"Asturias","name":"Asturias"},"136":{"code":"Avila","name":"Avila"},"137":{"code":"Badajoz","name":"Badajoz"},"138":{"code":"Baleares","name":"Baleares"},"139":{"code":"Barcelona","name":"Barcelona"},"140":{"code":"Burgos","name":"Burgos"},"141":{"code":"Caceres","name":"Caceres"},"142":{"code":"Cadiz","name":"Cadiz"},"143":{"code":"Cantabria","name":"Cantabria"},"144":{"code":"Castellon","name":"Castellon"},"145":{"code":"Ceuta","name":"Ceuta"},"146":{"code":"Ciudad Real","name":"Ciudad Real"},"147":{"code":"Cordoba","name":"Cordoba"},"148":{"code":"Cuenca","name":"Cuenca"},"149":{"code":"Girona","name":"Girona"},"150":{"code":"Granada","name":"Granada"},"151":{"code":"Guadalajara","name":"Guadalajara"},"152":{"code":"Guipuzcoa","name":"Guipuzcoa"},"153":{"code":"Huelva","name":"Huelva"},"154":{"code":"Huesca","name":"Huesca"},"155":{"code":"Jaen","name":"Jaen"},"156":{"code":"La Rioja","name":"La Rioja"},"157":{"code":"Las Palmas","name":"Las Palmas"},"158":{"code":"Leon","name":"Leon"},"159":{"code":"Lleida","name":"Lleida"},"160":{"code":"Lugo","name":"Lugo"},"161":{"code":"Madrid","name":"Madrid"},"162":{"code":"Malaga","name":"Malaga"},"163":{"code":"Melilla","name":"Melilla"},"164":{"code":"Murcia","name":"Murcia"},"165":{"code":"Navarra","name":"Navarra"},"166":{"code":"Ourense","name":"Ourense"},"167":{"code":"Palencia","name":"Palencia"},"168":{"code":"Pontevedra","name":"Pontevedra"},"169":{"code":"Salamanca","name":"Salamanca"},"170":{"code":"Santa Cruz de Tenerife","name":"Santa Cruz de Tenerife"},"171":{"code":"Segovia","name":"Segovia"},"172":{"code":"Sevilla","name":"Sevilla"},"173":{"code":"Soria","name":"Soria"},"174":{"code":"Tarragona","name":"Tarragona"},"175":{"code":"Teruel","name":"Teruel"},"176":{"code":"Toledo","name":"Toledo"},"177":{"code":"Valencia","name":"Valencia"},"178":{"code":"Valladolid","name":"Valladolid"},"179":{"code":"Vizcaya","name":"Vizcaya"},"180":{"code":"Zamora","name":"Zamora"},"181":{"code":"Zaragoza","name":"Zaragoza"}}},"ET":{"name":"Eti\u00f3pia"},"FI":{"name":"Finl\u00e2ndia","regions":{"339":{"code":"Ahvenanmaa","name":"Ahvenanmaa"},"333":{"code":"Etel\u00e4-Karjala","name":"Etel\u00e4-Karjala"},"326":{"code":"Etel\u00e4-Pohjanmaa","name":"Etel\u00e4-Pohjanmaa"},"325":{"code":"Etel\u00e4-Savo","name":"Etel\u00e4-Savo"},"337":{"code":"It\u00e4-Uusimaa","name":"It\u00e4-Uusimaa"},"322":{"code":"Kainuu","name":"Kainuu"},"335":{"code":"Kanta-H\u00e4me","name":"Kanta-H\u00e4me"},"330":{"code":"Keski-Pohjanmaa","name":"Keski-Pohjanmaa"},"331":{"code":"Keski-Suomi","name":"Keski-Suomi"},"338":{"code":"Kymenlaakso","name":"Kymenlaakso"},"320":{"code":"Lappi","name":"Lappi"},"334":{"code":"P\u00e4ij\u00e4t-H\u00e4me","name":"P\u00e4ij\u00e4t-H\u00e4me"},"328":{"code":"Pirkanmaa","name":"Pirkanmaa"},"327":{"code":"Pohjanmaa","name":"Pohjanmaa"},"323":{"code":"Pohjois-Karjala","name":"Pohjois-Karjala"},"321":{"code":"Pohjois-Pohjanmaa","name":"Pohjois-Pohjanmaa"},"324":{"code":"Pohjois-Savo","name":"Pohjois-Savo"},"329":{"code":"Satakunta","name":"Satakunta"},"336":{"code":"Uusimaa","name":"Uusimaa"},"332":{"code":"Varsinais-Suomi","name":"Varsinais-Suomi"}}},"FJ":{"name":"Fiji"},"FK":{"name":"Ilhas Malvinas"},"FM":{"name":"Micron\u00e9sia"},"FO":{"name":"Ilhas Faro\u00e9"},"FR":{"name":"Fran\u00e7a","regions":{"182":{"code":"1","name":"Ain"},"183":{"code":"2","name":"Aisne"},"184":{"code":"3","name":"Allier"}
5744,"185":{"code":"4","name":"Alpes-de-Haute-Provence"},"187":{"code":"6","name":"Alpes-Maritimes"},"188":{"code":"7","name":"Ard\u00e8che"},"189":{"code":"8","name":"Ardennes"},"190":{"code":"9","name":"Ari\u00e8ge"},"191":{"code":"10","name":"Aube"},"192":{"code":"11","name":"Aude"},"193":{"code":"12","name":"Aveyron"},"249":{"code":"67","name":"Bas-Rhin"},"194":{"code":"13","name":"Bouches-du-Rh\u00f4ne"},"195":{"code":"14","name":"Calvados"},"196":{"code":"15","name":"Cantal"},"197":{"code":"16","name":"Charente"},"198":{"code":"17","name":"Charente-Maritime"},"199":{"code":"18","name":"Cher"},"200":{"code":"19","name":"Corr\u00e8ze"},"201":{"code":"2A","name":"Corse-du-Sud"},"203":{"code":"21","name":"C\u00f4te-d'Or"},"204":{"code":"22","name":"C\u00f4tes-d'Armor"},"205":{"code":"23","name":"Creuse"},"261":{"code":"79","name":"Deux-S\u00e8vres"},"206":{"code":"24","name":"Dordogne"},"207":{"code":"25","name":"Doubs"},"208":{"code":"26","name":"Dr\u00f4me"},"273":{"code":"91","name":"Essonne"},"209":{"code":"27","name":"Eure"},"210":{"code":"28","name":"Eure-et-Loir"},"211":{"code":"29","name":"Finist\u00e8re"},"212":{"code":"30","name":"Gard"},"214":{"code":"32","name":"Gers"},"215":{"code":"33","name":"Gironde"},"250":{"code":"68","name":"Haut-Rhin"},"202":{"code":"2B","name":"Haute-Corse"},"213":{"code":"31","name":"Haute-Garonne"},"225":{"code":"43","name":"Haute-Loire"},"234":{"code":"52","name":"Haute-Marne"},"252":{"code":"70","name":"Haute-Sa\u00f4ne"},"256":{"code":"74","name":"Haute-Savoie"},"269":{"code":"87","name":"Haute-Vienne"},"186":{"code":"5","name":"Hautes-Alpes"},"247":{"code":"65","name":"Hautes-Pyr\u00e9n\u00e9es"},"274":{"code":"92","name":"Hauts-de-Seine"},"216":{"code":"34","name":"H\u00e9rault"},"217":{"code":"35","name":"Ille-et-Vilaine"},"218":{"code":"36","name":"Indre"},"219":{"code":"37","name":"Indre-et-Loire"},"220":{"code":"38","name":"Is\u00e8re"},"221":{"code":"39","name":"Jura"},"222":{"code":"40","name":"Landes"},"223":{"code":"41","name":"Loir-et-Cher"},"224":{"code":"42","name":"Loire"},"226":{"code":"44","name":"Loire-Atlantique"},"227":{"code":"45","name":"Loiret"},"228":{"code":"46","name":"Lot"},"229":{"code":"47","name":"Lot-et-Garonne"},"230":{"code":"48","name":"Loz\u00e8re"},"231":{"code":"49","name":"Maine-et-Loire"},"232":{"code":"50","name":"Manche"},"233":{"code":"51","name":"Marne"},"235":{"code":"53","name":"Mayenne"},"236":{"code":"54","name":"Meurthe-et-Moselle"},"237":{"code":"55","name":"Meuse"},"238":{"code":"56","name":"Morbihan"},"239":{"code":"57","name":"Moselle"},"240":{"code":"58","name":"Ni\u00e8vre"},"241":{"code":"59","name":"Nord"},"242":{"code":"60","name":"Oise"},"243":{"code":"61","name":"Orne"},"257":{"code":"75","name":"Paris"},"244":{"code":"62","name":"Pas-de-Calais"},"245":{"code":"63","name":"Puy-de-D\u00f4me"},"246":{"code":"64","name":"Pyr\u00e9n\u00e9es-Atlantiques"},"248":{"code":"66","name":"Pyr\u00e9n\u00e9es-Orientales"},"251":{"code":"69","name":"Rh\u00f4ne"},"253":{"code":"71","name":"Sa\u00f4ne-et-Loire"},"254":{"code":"72","name":"Sarthe"},"255":{"code":"73","name":"Savoie"},"259":{"code":"77","name":"Seine-et-Marne"},"258":{"code":"76","name":"Seine-Maritime"},"275":{"code":"93","name":"Seine-Saint-Denis"},"262":{"code":"80","name":"Somme"},"263":{"code":"81","name":"Tarn"},"264":{"code":"82","name":"Tarn-et-Garonne"},"272":{"code":"90","name":"Territoire-de-Belfort"},"277":{"code":"95","name":"Val-d'Oise"},"276":{"code":"94","name":"Val-de-Marne"},"265":{"code":"83","name":"Var"},"266":{"code":"84","name":"Vaucluse"},"267":{"code":"85","name":"Vend\u00e9e"},"268":{"code":"86","name":"Vienne"},"270":{"code":"88","name":"Vosges"},"271":{"code":"89","name":"Yonne"},"260":{"code":"78","name":"Yvelines"}}},"GA":{"name":"Gab\u00e3o"},"GB":{"name":"Reino Unido"},"GD":{"name":"Granada"},"GE":{"name":"Ge\u00f3rgia"},"GF":{"name":"Guiana Francesa"},"GG":{"name":"Guernsey"},"GH":{"name":"Gana"},"GI":{"name":"Gibraltar"},"GL":{"name":"Groenl\u00e2ndia"},"GM":{"name":"G\u00e2mbia"},"GN":{"name":"Guin\u00e9"},"GP":{"name":"Guadalupe"},"GQ":{"name":"Guin\u00e9 Equatorial"},"GR":{"name":"Gr\u00e9cia","regions":{"595":{"code":"GR-69","name":"\u00c1gion \u00d3ros"},"582":{"code":"GR-A","name":"Anatolik\u00ed Makedon\u00eda kai Thr\u00e1ki"},"583":{"code":"GR-I","name":"Attik\u00ed"},"584":{"code":"GR-G","name":"Dytik\u00ed Ell\u00e1da"},"585":{"code":"GR-C","name":"Dytik\u00ed Makedon\u00eda"},"586":{"code":"GR-F","name":"Ion\u00eda N\u00edsia"},"587":{"code":"GR-D","name":"\u00cdpeiros"},"588":{"code":"GR-B","name":"Kentrik\u00ed Makedon\u00eda"},"589":{"code":"GR-M","name":"Kr\u00edti"},"590":{"code":"GR-L","name":"N\u00f3tio Aiga\u00edo"},"591":{"code":"GR-J","name":"Pelop\u00f3nnisos"},"592":{"code":"GR-H","name":"Stere\u00e1 Ell\u00e1da"}
5744,"593":{"code":"GR-E","name":"Thessal\u00eda"},"594":{"code":"GR-K","name":"V\u00f3reio Aiga\u00edo"}}},"GS":{"name":"Ilhas Ge\u00f3rgia do Sul e Sandwich do Sul"},"GT":{"name":"Guatemala"},"GU":{"name":"Guam"},"GW":{"name":"Guin\u00e9-Bissau"},"GY":{"name":"Guiana","regions":{"596":{"code":"GY-BA","name":"Barima-Waini"},"597":{"code":"GY-CU","name":"Cuyuni-Mazaruni"},"598":{"code":"GY-DE","name":"Demerara-Mahaica"},"599":{"code":"GY-EB","name":"East Berbice-Corentyne"},"600":{"code":"GY-ES","name":"Essequibo Islands-West Demerara"},"601":{"code":"GY-MA","name":"Mahaica-Berbice"},"602":{"code":"GY-PM","name":"Pomeroon-Supenaam"},"603":{"code":"GY-PT","name":"Potaro-Siparuni"},"604":{"code":"GY-UD","name":"Upper Demerara-Berbice"},"605":{"code":"GY-UT","name":"Upper Takutu-Upper Essequibo"}}},"HK":{"name":"Hong Kong, RAE da China"},"HM":{"name":"Ilhas Heard e McDonald"},"HN":{"name":"Honduras"},"HR":{"name":"Cro\u00e1cia"},"HT":{"name":"Haiti"},"HU":{"name":"Hungria"},"ID":{"name":"Indon\u00e9sia"},"IE":{"name":"Irlanda"},"IL":{"name":"Israel"},"IM":{"name":"Ilha de Man"},"IN":{"name":"\u00cdndia","regions":{"782":{"code":"LA","name":"Ladakh"}}},"IO":{"name":"Territ\u00f3rio Brit\u00e2nico do Oceano \u00cdndico"},"IQ":{"name":"Iraque"},"IR":{"name":"Ir\u00e3"},"IS":{"name":"Isl\u00e2ndia","regions":{"612":{"code":"IS-07","name":"Austurland"},"606":{"code":"IS-01","name":"H\u00f6fu\u00f0borgarsv\u00e6\u00f0i"},"611":{"code":"IS-06","name":"Nor\u00f0urland eystra"},"610":{"code":"IS-05","name":"Nor\u00f0urland vestra"},"613":{"code":"IS-08","name":"Su\u00f0urland"},"607":{"code":"IS-02","name":"Su\u00f0urnes"},"609":{"code":"IS-04","name":"Vestfir\u00f0ir"},"608":{"code":"IS-03","name":"Vesturland"}}},"IT":{"name":"It\u00e1lia"},"JE":{"name":"Jersey"},"JM":{"name":"Jamaica"},"JO":{"name":"Jord\u00e2nia"},"JP":{"name":"Jap\u00e3o"},"KE":{"name":"Qu\u00eania"},"KG":{"name":"Quirguist\u00e3o"},"KH":{"name":"Camboja"},"KI":{"name":"Quiribati"},"KM":{"name":"Comores"},"KN":{"name":"S\u00e3o Crist\u00f3v\u00e3o e N\u00e9vis"},"KP":{"name":"Coreia do Norte"}
5744,"KR":{"name":"Coreia do Sul"},"KW":{"name":"Kuwait"},"KY":{"name":"Ilhas Cayman"},"KZ":{"name":"Cazaquist\u00e3o"},"LA":{"name":"Laos"},"LB":{"name":"L\u00edbano"},"LC":{"name":"Santa L\u00facia"},"LI":{"name":"Liechtenstein"},"LK":{"name":"Sri Lanka"},"LR":{"name":"Lib\u00e9ria"},"LS":{"name":"Lesoto"},"LT":{"name":"Litu\u00e2nia","regions":{"475":{"code":"LT-AL","name":"Alytaus Apskritis"},"476":{"code":"LT-KU","name":"Kauno Apskritis"},"477":{"code":"LT-KL","name":"Klaip\u0117dos Apskritis"},"478":{"code":"LT-MR","name":"Marijampol\u0117s Apskritis"},"479":{"code":"LT-PN","name":"Panev\u0117\u017eio Apskritis"},"480":{"code":"LT-SA","name":"\u0160iauli\u0173 Apskritis"},"481":{"code":"LT-TA","name":"Taurag\u0117s Apskritis"},"482":{"code":"LT-TE","name":"Tel\u0161i\u0173 Apskritis"},"483":{"code":"LT-UT","name":"Utenos Apskritis"},"484":{"code":"LT-VL","name":"Vilniaus Apskritis"}}},"LU":{"name":"Luxemburgo"},"LV":{"name":"Let\u00f4nia","regions":{"471":{"code":"\u0100da\u017eu novads","name":"\u0100da\u017eu novads"},"366":{"code":"Aglonas novads","name":"Aglonas novads"},"367":{"code":"LV-AI","name":"Aizkraukles novads"},"368":{"code":"Aizputes novads","name":"Aizputes novads"},"369":{"code":"Akn\u012bstes novads","name":"Akn\u012bstes novads"},"370":{"code":"Alojas novads","name":"Alojas novads"},"371":{"code":"Alsungas novads","name":"Alsungas novads"},"372":{"code":"LV-AL","name":"Al\u016bksnes novads"},"373":{"code":"Amatas novads","name":"Amatas novads"},"374":{"code":"Apes novads","name":"Apes novads"},"375":{"code":"Auces novads","name":"Auces novads"},"376":{"code":"Bab\u012btes novads","name":"Bab\u012btes novads"},"377":{"code":"Baldones novads","name":"Baldones novads"},"378":{"code":"Baltinavas novads","name":"Baltinavas novads"},"379":{"code":"LV-BL","name":"Balvu novads"},"380":{"code":"LV-BU","name":"Bauskas novads"},"381":{"code":"Bever\u012bnas novads","name":"Bever\u012bnas novads"},"382":{"code":"Broc\u0113nu novads","name":"Broc\u0113nu novads"},"383":{"code":"Burtnieku novads","name":"Burtnieku novads"},"384":{"code":"Carnikavas novads","name":"Carnikavas novads"},"387":{"code":"LV-CE","name":"C\u0113su novads"},"385":{"code":"Cesvaines novads","name":"Cesvaines novads"},"386":{"code":"Ciblas novads","name":"Ciblas novads"},"388":{"code":"Dagdas novads","name":"Dagdas novads"},"355":{"code":"LV-DGV","name":"Daugavpils"},"389":{"code":"LV-DA","name":"Daugavpils novads"},"390":{"code":"LV-DO","name":"Dobeles novads"},"391":{"code":"Dundagas novads","name":"Dundagas novads"},"392":{"code":"Durbes novads","name":"Durbes novads"},"393":{"code":"Engures novads","name":"Engures novads"},"472":{"code":"\u0112rg\u013cu novads","name":"\u0112rg\u013cu novads"},"394":{"code":"Garkalnes novads","name":"Garkalnes novads"},"395":{"code":"Grobi\u0146as novads","name":"Grobi\u0146as novads"},"396":{"code":"LV-GU","name":"Gulbenes novads"},"397":{"code":"Iecavas novads","name":"Iecavas novads"},"398":{"code":"Ik\u0161\u0137iles novads","name":"Ik\u0161\u0137iles novads"},"399":{"code":"Il\u016bkstes novads","name":"Il\u016bkstes novads"},"400":{"code":"In\u010dukalna novads","name":"In\u010dukalna novads"},"401":{"code":"Jaunjelgavas novads","name":"Jaunjelgavas novads"},"402":{"code":"Jaunpiebalgas novads","name":"Jaunpiebalgas novads"},"403":{"code":"Jaunpils novads","name":"Jaunpils novads"},"357":{"code":"J\u0113kabpils","name":"J\u0113kabpils"},"405":{"code":"LV-JK","name":"J\u0113kabpils novads"},"356":{"code":"LV-JEL","name":"Jelgava"},"404":{"code":"LV-JL","name":"Jelgavas novads"},"358":{"code":"LV-JUR","name":"J\u016brmala"},"406":{"code":"Kandavas novads","name":"Kandavas novads"},"412":{"code":"K\u0101rsavas novads","name":"K\u0101rsavas novads"},"473":{"code":"\u0136eguma novads","name":"\u0136eguma novads"},"474":{"code":"\u0136ekavas novads","name":"\u0136ekavas novads"},"407":{"code":"Kokneses novads","name":"Kokneses novads"},"410":{"code":"LV-KR","name":"Kr\u0101slavas novads"},"408":{"code":"Krimuldas novads","name":"Krimuldas novads"},"409":{"code":"Krustpils novads","name":"Krustpils novads"},"411":{"code":"LV-KU","name":"Kuld\u012bgas novads"},"413":{"code":"Lielv\u0101rdes novads","name":"Lielv\u0101rdes novads"},"359":{"code":"LV-LPX","name":"Liep\u0101ja"},"360":{"code":"LV-LE","name":"Liep\u0101jas novads"},"417":{"code":"L\u012bgatnes novads","name":"L\u012bgatnes novads"},"414":{"code":"LV-LM","name":"Limba\u017eu novads"},"418":{"code":"L\u012bv\u0101nu novads","name":"L\u012bv\u0101nu novads"},"415":{"code":"Lub\u0101nas novads","name":"Lub\u0101nas novads"},"416":{"code":"LV-LU","name":"Ludzas novads"},"419":{"code":"LV-MA","name":"Madonas novads"},"421":{"code":"M\u0101lpils novads","name":"M\u0101lpils novads"},"422":{"code":"M\u0101rupes novads","name":"M\u0101rupes novads"},"420":{"code":"Mazsalacas novads","name":"Mazsalacas novads"},"423":{"code":"Nauk\u0161\u0113nu novads","name":"Nauk\u0161\u0113nu novads"},"424":{"code":"Neretas novads","name":"Neretas novads"},"425":{"code":"N\u012bcas novads","name":"N\u012bcas novads"},"426":{"code":"LV-OG","name":"Ogres novads"},"427":{"code":"Olaines novads","name":"Olaines novads"},"428":{"code":"Ozolnieku novads","name":"Ozolnieku novads"},"432":{"code":"P\u0101rgaujas novads","name":"P\u0101rgaujas novads"},"433":{"code":"P\u0101vilostas novads","name":"P\u0101vilostas novads"},"434":{"code":"P\u013cavi\u0146u novads","name":"P\u013cavi\u0146u novads"},"429":{"code":"LV-PR","name":"Prei\u013cu novads"},"430":{"code":"Priekules novads","name":"Priekules novads"},"431":{"code":"Prieku\u013cu novads","name":"Prieku\u013cu novads"},"435":{"code":"Raunas novads","name":"Raunas novads"},"361":{"code":"LV-REZ","name":"R\u0113zekne"},"442":{"code":"LV-RE","name":"R\u0113zeknes novads"},"436":{"code":"Riebi\u0146u novads","name":"Riebi\u0146u novads"},"362":{"code":"LV-RIX","name":"R\u012bga"},"363":{"code":"LV-RI","name":"R\u012bgas novads"},"437":{"code":"Rojas novads","name":"Rojas novads"},"438":{"code":"Ropa\u017eu novads","name":"Ropa\u017eu novads"},"439":{"code":"Rucavas novads","name":"Rucavas novads"},"440":{"code":"Rug\u0101ju novads","name":"Rug\u0101ju novads"},"443":{"code":"R\u016bjienas novads","name":"R\u016bjienas novads"},"441":{"code":"Rund\u0101les novads","name":"Rund\u0101les novads"},"444":{"code":"Salacgr\u012bvas novads","name":"Salacgr\u012bvas novads"},"445":{"code":"Salas novads","name":"Salas novads"},"446":{"code":"Salaspils novads","name":"Salaspils novads"},"447":{"code":"LV-SA","name":"Saldus novads"},"448":{"code":"Saulkrastu novads","name":"Saulkrastu novads"},"455":{"code":"S\u0113jas novads","name":"S\u0113jas novads"},"449":{"code":"Siguldas novads","name":"Siguldas novads"}
5744,"451":{"code":"Skr\u012bveru novads","name":"Skr\u012bveru novads"},"450":{"code":"Skrundas novads","name":"Skrundas novads"},"452":{"code":"Smiltenes novads","name":"Smiltenes novads"},"453":{"code":"Stopi\u0146u novads","name":"Stopi\u0146u novads"},"454":{"code":"Stren\u010du novads","name":"Stren\u010du novads"},"456":{"code":"LV-TA","name":"Talsu novads"},"458":{"code":"T\u0113rvetes novads","name":"T\u0113rvetes novads"},"457":{"code":"LV-TU","name":"Tukuma novads"},"459":{"code":"Vai\u0146odes novads","name":"Vai\u0146odes novads"},"460":{"code":"LV-VK","name":"Valkas novads"},"364":{"code":"Valmiera","name":"Valmiera"},"461":{"code":"LV-VM","name":"Valmieras novads"},"462":{"code":"Varak\u013c\u0101nu novads","name":"Varak\u013c\u0101nu novads"},"469":{"code":"V\u0101rkavas novads","name":"V\u0101rkavas novads"},"463":{"code":"Vecpiebalgas novads","name":"Vecpiebalgas novads"},"464":{"code":"Vecumnieku novads","name":"Vecumnieku novads"},"365":{"code":"LV-VEN","name":"Ventspils"},"465":{"code":"LV-VE","name":"Ventspils novads"},"466":{"code":"Vies\u012btes novads","name":"Vies\u012btes novads"},"467":{"code":"Vi\u013cakas novads","name":"Vi\u013cakas novads"},"468":{"code":"Vi\u013c\u0101nu novads","name":"Vi\u013c\u0101nu novads"},"470":{"code":"Zilupes novads","name":"Zilupes novads"}}},"LY":{"name":"L\u00edbia"},"MA":{"name":"Marrocos"},"MC":{"name":"M\u00f4naco"},"MD":{"name":"Mold\u00e1via"},"ME":{"name":"Montenegro"},"MF":{"name":"S\u00e3o Martinho"},"MG":{"name":"Madagascar"},"MH":{"name":"Ilhas Marshall"},"MK":{"name":"Maced\u00f4nia do Norte"},"ML":{"name":"Mali"},"MM":{"name":"Mianmar (Birm\u00e2nia)"},"MN":{"name":"Mong\u00f3lia"},"MO":{"name":"Macau, RAE da China"},"MP":{"name":"Ilhas Marianas do Norte"},"MQ":{"name":"Martinica"},"MR":{"name":"Maurit\u00e2nia"},"MS":{"name":"Montserrat"},"MT":{"name":"Malta"},"MU":{"name":"Maur\u00edcio"},"MV":{"name":"Maldivas"},"MW":{"name":"Malaui"},"MX":{"name":"M\u00e9xico"},"MY":{"name":"Mal\u00e1sia"},"MZ":{"name":"Mo\u00e7ambique"},"NA":{"name":"Nam\u00edbia"},"NC":{"name":"Nova Caled\u00f4nia"},"NE":{"name":"N\u00edger"},"NF":{"name":"Ilha Norfolk"},"NG":{"name":"Nig\u00e9ria"},"NI":{"name":"Nicar\u00e1gua"},"NL":{"name":"Pa\u00edses Baixos"},"NO":{"name":"Noruega"},"NP":{"name":"Nepal"},"NR":{"name":"Nauru"},"NU":{"name":"Niue"},"NZ":{"name":"Nova Zel\u00e2ndia"},"OM":{"name":"Om\u00e3"},"PA":{"name":"Panam\u00e1"},"PE":{"name":"Peru","regions":{"633":{"code":"PE-AMA","name":"Amazonas"},"634":{"code":"PE-ANC","name":"Ancash"},"635":{"code":"PE-APU","name":"Apur\u00edmac"},"636":{"code":"PE-ARE","name":"Arequipa"},"637":{"code":"PE-AYA","name":"Ayacucho"},"638":{"code":"PE-CAJ","name":"Cajamarca"},"639":{"code":"PE-CUS","name":"Cusco"},"640":{"code":"PE-CAL","name":"El Callao"},"641":{"code":"PE-HUV","name":"Huancavelica"},"642":{"code":"PE-HUC","name":"Hu\u00e1nuco"},"643":{"code":"PE-ICA","name":"Ica"},"644":{"code":"PE-JUN","name":"Jun\u00edn"},"645":{"code":"PE-LAL","name":"La Libertad"},"646":{"code":"PE-LAM","name":"Lambayeque"},"647":{"code":"PE-LIM","name":"Lima"},"648":{"code":"PE-LOR","name":"Loreto"},"649":{"code":"PE-MDD","name":"Madre de Dios"},"650":{"code":"PE-MOQ","name":"Moquegua"},"632":{"code":"PE-LMA","name":"Municipalidad Metropolitana de Lima"},"651":{"code":"PE-PAS","name":"Pasco"}
5744,"652":{"code":"PE-PIU","name":"Piura"},"653":{"code":"PE-PUN","name":"Puno"},"654":{"code":"PE-SAM","name":"San Mart\u00edn"},"655":{"code":"PE-TAC","name":"Tacna"},"656":{"code":"PE-TUM","name":"Tumbes"},"657":{"code":"PE-UCA","name":"Ucayali"}}},"PF":{"name":"Polin\u00e9sia Francesa"},"PG":{"name":"Papua-Nova Guin\u00e9"},"PH":{"name":"Filipinas"},"PK":{"name":"Paquist\u00e3o"},"PL":{"name":"Pol\u00f4nia"},"PM":{"name":"S\u00e3o Pedro e Miquel\u00e3o"},"PN":{"name":"Ilhas Pitcairn"},"PR":{"name":"Porto Rico"},"PS":{"name":"Territ\u00f3rios palestinos"},"PT":{"name":"Portugal","regions":{"658":{"code":"PT-01","name":"Aveiro"},"659":{"code":"PT-02","name":"Beja"},"660":{"code":"PT-03","name":"Braga"},"661":{"code":"PT-04","name":"Bragan\u00e7a"},"662":{"code":"PT-05","name":"Castelo Branco"},"663":{"code":"PT-06","name":"Coimbra"},"664":{"code":"PT-07","name":"\u00c9vora"},"665":{"code":"PT-08","name":"Faro"},"666":{"code":"PT-09","name":"Guarda"},"667":{"code":"PT-10","name":"Leiria"},"668":{"code":"PT-11","name":"Lisboa"},"669":{"code":"PT-12","name":"Portalegre"},"670":{"code":"PT-13","name":"Porto"},"677":{"code":"PT-30","name":"Regi\u00e3o Aut\u00f3noma da Madeira"},"676":{"code":"PT-20","name":"Regi\u00e3o Aut\u00f3noma dos A\u00e7ores"},"671":{"code":"PT-14","name":"Santar\u00e9m"},"672":{"code":"PT-15","name":"Set\u00fabal"},"673":{"code":"PT-16","name":"Viana do Castelo"},"674":{"code":"PT-17","name":"Vila Real"},"675":{"code":"PT-18","name":"Viseu"}}},"PW":{"name":"Palau"},"PY":{"name":"Paraguai","regions":{"615":{"code":"PY-16","name":"Alto Paraguay"},"616":{"code":"PY-10","name":"Alto Paran\u00e1"},"617":{"code":"PY-13","name":"Amambay"},"614":{"code":"PY-ASU","name":"Asunci\u00f3n"},"618":{"code":"PY-19","name":"Boquer\u00f3n"},"619":{"code":"PY-5","name":"Caaguaz\u00fa"},"620":{"code":"PY-6","name":"Caazap\u00e1"},"621":{"code":"PY-14","name":"Canindey\u00fa"},"622":{"code":"PY-11","name":"Central"},"623":{"code":"PY-1","name":"Concepci\u00f3n"},"624":{"code":"PY-3","name":"Cordillera"},"625":{"code":"PY-4","name":"Guair\u00e1"},"626":{"code":"PY-7","name":"Itap\u00faa"},"627":{"code":"PY-8","name":"Misiones"},"628":{"code":"PY-12","name":"\u00d1eembuc\u00fa"},"629":{"code":"PY-9","name":"Paraguar\u00ed"},"630":{"code":"PY-15","name":"Presidente Hayes"},"631":{"code":"PY-2","name":"San Pedro"}}},"QA":{"name":"Catar"},"RE":{"name":"Reuni\u00e3o"},"RO":{"name":"Rom\u00eania","regions":{"278":{"code":"AB","name":"Alba"},"279":{"code":"AR","name":"Arad"},"280":{"code":"AG","name":"Arge\u015f"},"281":{"code":"BC","name":"Bac\u0103u"},"282":{"code":"BH","name":"Bihor"},"283":{"code":"BN","name":"Bistri\u0163a-N\u0103s\u0103ud"},"284":{"code":"BT","name":"Boto\u015fani"},"286":{"code":"BR","name":"Br\u0103ila"},"285":{"code":"BV","name":"Bra\u015fov"},"287":{"code":"B","name":"Bucure\u015fti"},"288":{"code":"BZ","name":"Buz\u0103u"},"290":{"code":"CL","name":"C\u0103l\u0103ra\u015fi"},"289":{"code":"CS","name":"Cara\u015f-Severin"},"291":{"code":"CJ","name":"Cluj"},"292":{"code":"CT","name":"Constan\u0163a"},"293":{"code":"CV","name":"Covasna"},"294":{"code":"DB","name":"D\u00e2mbovi\u0163a"},"295":{"code":"DJ","name":"Dolj"},"296":{"code":"GL","name":"Gala\u0163i"},"297":{"code":"GR","name":"Giurgiu"},"298":{"code":"GJ","name":"Gorj"},"299":{"code":"HR","name":"Harghita"},"300":{"code":"HD","name":"Hunedoara"},"301":{"code":"IL","name":"Ialomi\u0163a"},"302":{"code":"IS","name":"Ia\u015fi"},"303":{"code":"IF","name":"Ilfov"},"304":{"code":"MM","name":"Maramure\u015f"},"305":{"code":"MH","name":"Mehedin\u0163i"},"306":{"code":"MS","name":"Mure\u015f"},"307":{"code":"NT","name":"Neam\u0163"},"308":{"code":"OT","name":"Olt"},"309":{"code":"PH","name":"Prahova"},"311":{"code":"SJ","name":"S\u0103laj"},"310":{"code":"SM","name":"Satu-Mare"},"312":{"code":"SB","name":"Sibiu"},"313":{"code":"SV","name":"Suceava"},"314":{"code":"TR","name":"Teleorman"},"315":{"code":"TM","name":"Timi\u015f"},"316":{"code":"TL","name":"Tulcea"},"318":{"code":"VL","name":"V\u00e2lcea"},"317":{"code":"VS","name":"Vaslui"},"319":{"code":"VN","name":"Vrancea"}}},"RS":{"name":"S\u00e9rvia"},"RU":{"name":"R\u00fassia"},"RW":{"name":"Ruanda"},"SA":{"name":"Ar\u00e1bia Saudita"},"SB":{"name":"Ilhas Salom\u00e3o"},"SC":{"name":"Seicheles"},"SD":{"name":"Sud\u00e3o"},"SE":{"name":"Su\u00e9cia","regions":{"688":{"code":"SE-K","name":"Blekinge l\u00e4n"}
5744,"689":{"code":"SE-W","name":"Dalarnas l\u00e4n"},"691":{"code":"SE-X","name":"G\u00e4vleborgs l\u00e4n"},"690":{"code":"SE-I","name":"Gotlands l\u00e4n"},"692":{"code":"SE-N","name":"Hallands l\u00e4n"},"693":{"code":"SE-Z","name":"J\u00e4mtlands l\u00e4n"},"694":{"code":"SE-F","name":"J\u00f6nk\u00f6pings l\u00e4n"},"695":{"code":"SE-H","name":"Kalmar l\u00e4n"},"696":{"code":"SE-G","name":"Kronobergs l\u00e4n"},"697":{"code":"SE-BD","name":"Norrbottens l\u00e4n"},"707":{"code":"SE-T","name":"\u00d6rebro l\u00e4n"},"708":{"code":"SE-E","name":"\u00d6sterg\u00f6tlands l\u00e4n"},"698":{"code":"SE-M","name":"Sk\u00e5ne l\u00e4n"},"700":{"code":"SE-D","name":"S\u00f6dermanlands l\u00e4n"},"699":{"code":"SE-AB","name":"Stockholms l\u00e4n"},"701":{"code":"SE-C","name":"Uppsala l\u00e4n"},"702":{"code":"SE-S","name":"V\u00e4rmlands l\u00e4n"},"703":{"code":"SE-AC","name":"V\u00e4sterbottens l\u00e4n"},"704":{"code":"SE-Y","name":"V\u00e4sternorrlands l\u00e4n"},"705":{"code":"SE-U","name":"V\u00e4stmanlands l\u00e4n"},"706":{"code":"SE-O","name":"V\u00e4stra G\u00f6talands l\u00e4n"}}},"SG":{"name":"Singapura"},"SH":{"name":"Santa Helena"},"SI":{"name":"Eslov\u00eania"},"SJ":{"name":"Svalbard e Jan Mayen"},"SK":{"name":"Eslov\u00e1quia"},"SL":{"name":"Serra Leoa"},"SM":{"name":"San Marino"},"SN":{"name":"Senegal"},"SO":{"name":"Som\u00e1lia"},"SR":{"name":"Suriname","regions":{"678":{"code":"SR-BR","name":"Brokopondo"},"679":{"code":"SR-CM","name":"Commewijne"},"680":{"code":"SR-CR","name":"Coronie"},"681":{"code":"SR-MA","name":"Marowijne"},"682":{"code":"SR-NI","name":"Nickerie"},"683":{"code":"SR-PR","name":"Para"},"684":{"code":"SR-PM","name":"Paramaribo"},"685":{"code":"SR-SA","name":"Saramacca"},"686":{"code":"SR-SI","name":"Sipaliwini"},"687":{"code":"SR-WA","name":"Wanica"}}},"ST":{"name":"S\u00e3o Tom\u00e9 e Pr\u00edncipe"},"SV":{"name":"El Salvador"},"SY":{"name":"S\u00edria"},"SZ":{"name":"Essuat\u00edni"},"TC":{"name":"Ilhas Turcas e Caicos"},"TD":{"name":"Chade"},"TF":{"name":"Territ\u00f3rios Franceses do Sul"},"TG":{"name":"Togo"},"TH":{"name":"Tail\u00e2ndia"},"TJ":{"name":"Tadjiquist\u00e3o"},"TK":{"name":"Tokelau"},"TL":{"name":"Timor-Leste"},"TM":{"name":"Turcomenist\u00e3o"},"TN":{"name":"Tun\u00edsia"},"TO":{"name":"Tonga"},"TR":{"name":"Turquia"},"TT":{"name":"Trinidad e Tobago"},"TV":{"name":"Tuvalu"},"TW":{"name":"Taiwan"},"TZ":{"name":"Tanz\u00e2nia"},"UA":{"name":"Ucr\u00e2nia","regions":{"779":{"code":"UA-43","name":"Avtonomna Respublika Krym"},"755":{"code":"UA-71","name":"Cherkaska oblast"},"756":{"code":"UA-74","name":"Chernihivska oblast"},"757":{"code":"UA-77","name":"Chernivetska oblast"},"758":{"code":"UA-12","name":"Dnipropetrovska oblast"},"759":{"code":"UA-14","name":"Donetska oblast"},"760":{"code":"UA-26","name":"Ivano-Frankivska oblast"},"761":{"code":"UA-63","name":"Kharkivska oblast"},"762":{"code":"UA-65","name":"Khersonska oblast"},"763":{"code":"UA-68","name":"Khmelnytska oblast"},"764":{"code":"UA-35","name":"Kirovohradska oblast"},"780":{"code":"UA-30","name":"Kyiv"},"765":{"code":"UA-32","name":"Kyivska oblast"},"766":{"code":"UA-09","name":"Luhanska oblast"},"767":{"code":"UA-46","name":"Lvivska oblast"},"768":{"code":"UA-48","name":"Mykolaivska oblast"},"769":{"code":"UA-51","name":"Odeska oblast"},"770":{"code":"UA-53","name":"Poltavska oblast"},"771":{"code":"UA-56","name":"Rivnenska oblast"},"781":{"code":"UA-40","name":"Sevastopol"},"772":{"code":"UA-59","name":"Sumska oblast"},"773":{"code":"UA-61","name":"Ternopilska oblast"},"774":{"code":"UA-05","name":"Vinnytska oblast"},"775":{"code":"UA-07","name":"Volynska oblast"},"776":{"code":"UA-21","name":"Zakarpatska oblast"},"777":{"code":"UA-23","name":"Zaporizka oblast"},"778":{"code":"UA-18","name":"Zhytomyrska oblast"}}},"UG":{"name":"Uganda"},"UM":{"name":"Ilhas Menores Distantes dos EUA"},"US":{"name":"Estados Unidos","regions":{"1":{"code":"AL","name":"Alabama"},"2":{"code":"AK","name":"Alaska"},"3":{"code":"AS","name":"American Samoa"},"4":{"code":"AZ","name":"Arizona"},"5":{"code":"AR","name":"Arkansas"},"6":{"code":"AF","name":"Armed Forces Africa"},"7":{"code":"AA","name":"Armed Forces Americas"},"8":{"code":"AC","name":"Armed Forces Canada"},"9":{"code":"AE","name":"Armed Forces Europe"},"10":{"code":"AM","name":"Armed Forces Middle East"},"11":{"code":"AP","name":"Armed Forces Pacific"},"12":{"code":"CA","name":"California"},"13":{"code":"CO","name":"Colorado"},"14":{"code":"CT","name":"Connecticut"},"15":{"code":"DE","name":"Delaware"},"16":{"code":"DC","name":"District of Columbia"},"17":{"code":"FM","name":"Federated States Of Micronesia"}
5744,"18":{"code":"FL","name":"Florida"},"19":{"code":"GA","name":"Georgia"},"20":{"code":"GU","name":"Guam"},"21":{"code":"HI","name":"Hawaii"},"22":{"code":"ID","name":"Idaho"},"23":{"code":"IL","name":"Illinois"},"24":{"code":"IN","name":"Indiana"},"25":{"code":"IA","name":"Iowa"},"26":{"code":"KS","name":"Kansas"},"27":{"code":"KY","name":"Kentucky"},"28":{"code":"LA","name":"Louisiana"},"29":{"code":"ME","name":"Maine"},"30":{"code":"MH","name":"Marshall Islands"},"31":{"code":"MD","name":"Maryland"},"32":{"code":"MA","name":"Massachusetts"},"33":{"code":"MI","name":"Michigan"},"34":{"code":"MN","name":"Minnesota"},"35":{"code":"MS","name":"Mississippi"},"36":{"code":"MO","name":"Missouri"},"37":{"code":"MT","name":"Montana"},"38":{"code":"NE","name":"Nebraska"},"39":{"code":"NV","name":"Nevada"},"40":{"code":"NH","name":"New Hampshire"},"41":{"code":"NJ","name":"New Jersey"},"42":{"code":"NM","name":"New Mexico"},"43":{"code":"NY","name":"New York"},"44":{"code":"NC","name":"North Carolina"},"45":{"code":"ND","name":"North Dakota"},"46":{"code":"MP","name":"Northern Mariana Islands"},"47":{"code":"OH","name":"Ohio"},"48":{"code":"OK","name":"Oklahoma"},"49":{"code":"OR","name":"Oregon"},"50":{"code":"PW","name":"Palau"},"51":{"code":"PA","name":"Pennsylvania"},"52":{"code":"PR","name":"Puerto Rico"},"53":{"code":"RI","name":"Rhode Island"},"54":{"code":"SC","name":"South Carolina"},"55":{"code":"SD","name":"South Dakota"},"56":{"code":"TN","name":"Tennessee"},"57":{"code":"TX","name":"Texas"},"58":{"code":"UT","name":"Utah"},"59":{"code":"VT","name":"Vermont"},"60":{"code":"VI","name":"Virgin Islands"},"61":{"code":"VA","name":"Virginia"},"62":{"code":"WA","name":"Washington"},"63":{"code":"WV","name":"West Virginia"},"64":{"code":"WI","name":"Wisconsin"},"65":{"code":"WY","name":"Wyoming"}}},"UY":{"name":"Uruguai"},"UZ":{"name":"Uzbequist\u00e3o"},"VA":{"name":"Cidade do Vaticano"},"VC":{"name":"S\u00e3o Vicente e Granadinas"},"VE":{"name":"Venezuela","regions":{"711":{"code":"VE-Z","name":"Amazonas"},"712":{"code":"VE-B","name":"Anzo\u00e1tegui"},"713":{"code":"VE-C","name":"Apure"},"714":{"code":"VE-D","name":"Aragua"},"715":{"code":"VE-E","name":"Barinas"},"716":{"code":"VE-F","name":"Bol\u00edvar"},"717":{"code":"VE-G","name":"Carabobo"},"718":{"code":"VE-H","name":"Cojedes"},"719":{"code":"VE-Y","name":"Delta Amacuro"},"709":{"code":"VE-W","name":"Dependencias Federales"},"710":{"code":"VE-A","name":"Distrito Capital"},"720":{"code":"VE-I","name":"Falc\u00f3n"},"721":{"code":"VE-J","name":"Gu\u00e1rico"},"722":{"code":"VE-K","name":"Lara"},"723":{"code":"VE-L","name":"M\u00e9rida"},"724":{"code":"VE-M","name":"Miranda"},"725":{"code":"VE-N","name":"Monagas"},"726":{"code":"VE-O","name":"Nueva Esparta"},"727":{"code":"VE-P","name":"Portuguesa"},"728":{"code":"VE-R","name":"Sucre"},"729":{"code":"VE-S","name":"T\u00e1chira"},"730":{"code":"VE-T","name":"Trujillo"},"731":{"code":"VE-X","name":"Vargas"},"732":{"code":"VE-U","name":"Yaracuy"},"733":{"code":"VE-V","name":"Zulia"}}},"VG":{"name":"Ilhas Virgens Brit\u00e2nicas"},"VI":{"name":"Ilhas Virgens Americanas"},"VN":{"name":"Vietn\u00e3"},"VU":{"name":"Vanuatu"},"WF":{"name":"Wallis e Futuna"},"WS":{"name":"Samoa"},"YE":{"name":"I\u00eamen"},"YT":{"name":"Mayotte"},"ZA":{"name":"\u00c1frica do Sul"},"ZM":{"name":"Z\u00e2mbia"},"ZW":{"name":"Zimb\u00e1bue"},"data_id":1791588099},"captcha":[],"instant-purchase":[],"loggedAsCustomer":[],"persistent":[],"review":[],"payments":[],"wishlist":{"items":[]},"gtm":{"push":[]},"hyva_checkout":[],"mst-tm-addtocart":[],"recently_viewed_product":[],"recently_compared_product":[],"product_data_storage":[],"paypal-billing-agreement":[],"paypal-buyer-country":[]}</script>
5744 5745 5746<div x-data="hyva.modal()" 5747> 5748 <div x-cloak x-bind="overlay('mst-geoip-popup')" 5749 x-spread="overlay('mst-geoip-popup')" 5750 class="fixed inset-0 bg-black/50 z-50"> 5751 <div class="fixed flex justify-center items-center text-left z-40 px-4 inset-0 flex-col w-max max-w-full left-1/2 -translate-x-1/2 md:px-12 md:pt-20"> 5752 <button 5753 type="button" 5754 class="w-12 h-12 rounded-full shrink-0 flex items-center justify-center text-primary bg-white mb-4 md:mb-0 md:ml-auto md:-mr-12" 5755 aria-label="Close modal" 5756 @click="hide" 5757 > 5758 <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" class="w-6 h-6" width="18" height="18" aria-hidden="true"> 5759 <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12"/> 5760</svg> 5761 </button> 5762 <div x-ref="mst-geoip-popup" role="dialog" aria-modal="true" 5763 class="inline-block bg-white shadow-xl rounded-lg p-10 max-h-screen overflow-auto overscroll-y-contain px-8 md:px-10 w-full max-w-2xl"> 5764
5765<script> 5766 function mstGeoIpPopup() { 5767 return { 5768 isOpen: false, 5769 isNotification: false, 5770 isConfirmation: true, 5771 isAjaxMode: 'true', 5772 isShowRequest: 'false', 5773 acceptUrl: 'https://stata-brazil.com/geo_ip/action/accept/', 5774 rejectUrl: 'https://stata-brazil.com/geo_ip/action/reject/', 5775 redirectEnabled: true, 5776 5777 handleAccept: function () { 5778 if (this.isAjaxMode) { 5779 window.dispatchEvent(new Event("mstGeoIpProcessRedirectAccept")); 5780 this.isOpen = false; 5781 this.$dispatch('close-geo-modal'); 5782 } else { 5783 window.location.href = this.acceptUrl 5784 } 5785 }, 5786 5787 handleDecline: function () { 5788 if (this.isAjaxMode) { 5789 window.dispatchEvent(new Event("mstGeoIpProcessRedirectReject")); 5790 this.isOpen = false; 5791 this.$dispatch('close-geo-modal'); 5792 } else { 5793 window.location.href = this.rejectUrl 5794 } 5795 }, 5796 5797 handleOk: function () { 5798 if (this.isAjaxMode) { 5799 window.dispatchEvent(new Event("mstGeoIpProcessRedirectDone")); 5800 this.isOpen = false; 5801 this.$dispatch('close-geo-modal'); 5802 } else { 5803 window.location.href = this.acceptUrl 5804 } 5805 }, 5806 5807 mstGeoIpPopupInit() { 5808 if (this.isAjaxMode) { 5809 window.addEventListener('mstGeoIpPopupOpen', function (event) { 5810 window.dispatchEvent( 5811 new CustomEvent('hyva-modal-show', {detail: {dialog: 'mst-geoip-popup'}}) 5812 ) 5813 this.isOpen = true; 5814 }.bind(this)); 5815 } else { 5816 if (this.isShowRequest) { 5817 window.dispatchEvent( 5818 new CustomEvent('hyva-modal-show', {detail: {dialog: 'mst-geoip-popup'}}) 5819 ) 5820 this.isOpen = true; 5821 } 5822 } 5823 }, 5824 5825 eventListeners: { 5826 ['@open-store-selector.window']($event) { 5827 this.redirectEnabled = ($event.detail.redirectEnabled) 5828 }, 5829 } 5830 } 5831 } 5832</script>
5832 5833 5834<div x-data="mstGeoIpPopup()" x-init="mstGeoIpPopupInit()" 5835 @close-geo-modal.window="hide" 5836 x-bind="eventListeners" 5837> 5838 <div class="text-center"> 5839 <template x-if="redirectEnabled"> 5840 <div> 5841 <p class="text-2xl lg:text-[40px]/[48px] text-primary mb-1 font-bold" role="heading">Mude para sua loja local</p> 5842 <p class="text-base text-secondary mb-1">Para uma melhor experiência, recomendamos visitar a sua loja local</p> 5843 <div class="actions flex items-center justify-center gap-2"> 5844 <button @click="handleAccept" class="action btn btn-primary grow">Aceitar</button> 5845 <button @click="handleDecline" class="action btn btn-secondary grow">DeclÃnio</button> 5846 </div> 5847 <div class="relative my-4 5848 before:bg-brightBlue/50 before:rounded-sm before:w-[calc(50%-30px)] before:h-px before:absolute before:left-0 before:top-1/2 before:-translate-y-1/2 5849 after:bg-brightBlue/50 after:rounded-sm after:w-[calc(50%-30px)] after:h-px after:absolute after:right-0 after:top-1/2 after:-translate-y-1/2"> 5850 <span class="w-10 h-10 text-sm flex items-center justify-center mx-auto rounded-full bg-pastelBlue">OR</span> 5851 </div> 5852 </div> 5853 </template> 5854 5855 <div> 5856 <p class="text-base text-secondary mb-1">Selecione sua região para continuar</p> 5857 <div class="pt-2 pb-4"> 5858 <img fetchpriority="high" 5859 class="mx-auto mb-4" 5860 src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/logo.svg" 5861 alt="Timberlake Stores" 5862 width="189" 5863 height="64" 5864 /> 5865 <ul class="grid grid-cols-2 md:grid-cols-3 gap-4 items-center pl-[50px]"> 5866 <li> 5867 <a href="https://stata-brazil.com/stores/store/redirect/___store/stata_uk/___from_store/stata_br/uenc/aHR0cHM6Ly9zdGF0YS11ay5jb20vY3VzdG9tZXIvYWNjb3VudC9sb2dpbi9yZWZlcmVyL2FIUjBjSE02THk5emRHRjBZUzFpY21GNmFXd3VZMjl0TDJOMWMzUnZiV1Z5TDJGalkyOTFiblF2YVc1a1pYZ3Yv/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5868 <img fetchpriority="high" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/uk.png" 5869 alt="UK & World" 5870 class="w-8 aspect-square rounded-full"> 5871 <span class="block text-l text-neutralGray-700"> UK & World</span> 5872 </a> 5873 </li> 5874 <li> 5875 <a href="https://stata-brazil.com/stores/store/redirect/___store/pl/___from_store/stata_br/uenc/aHR0cHM6Ly90aW1iZXJsYWtlLmNvL3BsL2N1c3RvbWVyL2FjY291bnQvbG9naW4vcmVmZXJlci9hSFIwY0hNNkx5OXpkR0YwWVMxaWNtRjZhV3d1WTI5dEwyTjFjM1J2YldWeUwyRmpZMjkxYm5RdmFXNWtaWGd2Lw~~/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5876 <img fetchpriority="high" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/poland.png" 5877 alt="Poland" 5878 class="w-8 aspect-square rounded-full"> 5879 <span class="block text-l text-neutralGray-700"> Poland</span> 5880 </a> 5881 </li> 5882 <li> 5883 <a href="https://stata-brazil.com/stores/store/redirect/___store/pt/___from_store/stata_br/uenc/aHR0cHM6Ly90aW1iZXJsYWtlLmNvL3B0L2N1c3RvbWVyL2FjY291bnQvbG9naW4vcmVmZXJlci9hSFIwY0hNNkx5OXpkR0YwWVMxaWNtRjZhV3d1WTI5dEwyTjFjM1J2YldWeUwyRmpZMjkxYm5RdmFXNWtaWGd2Lw~~/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5884 <img loading="lazy" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/portugal.png" 5885 alt="Portugal" 5886 class="w-8 aspect-square rounded-full">
5887 <span class="block text-l text-neutralGray-700"> Portugal</span> 5888 </a> 5889 </li> 5890 <li> 5891 <a href="https://stata-brazil.com/stores/store/redirect/___store/stata_es/___from_store/stata_br/uenc/aHR0cHM6Ly9zdGF0YS1zcGFpbi5jb20vY3VzdG9tZXIvYWNjb3VudC9sb2dpbi9yZWZlcmVyL2FIUjBjSE02THk5emRHRjBZUzFpY21GNmFXd3VZMjl0TDJOMWMzUnZiV1Z5TDJGalkyOTFiblF2YVc1a1pYZ3Yv/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5892 <img loading="lazy" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/spain.png" 5893 alt="Spain" 5894 class="w-8 aspect-square rounded-full"> 5895 <span class="block text-l text-neutralGray-700"> Spain</span> 5896 </a> 5897 </li> 5898 <li> 5899 <a href="https://stata-brazil.com/stores/store/redirect/___store/ae/___from_store/stata_br/uenc/aHR0cHM6Ly90aW1iZXJsYWtlLmNvL2FlL2N1c3RvbWVyL2FjY291bnQvbG9naW4vcmVmZXJlci9hSFIwY0hNNkx5OXpkR0YwWVMxaWNtRjZhV3d1WTI5dEwyTjFjM1J2YldWeUwyRmpZMjkxYm5RdmFXNWtaWGd2Lw~~/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5900 <img loading="lazy" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/uae.png" 5901 alt="UAE" 5902 class="w-8 aspect-square rounded-full"> 5903 <span class="block text-l text-neutralGray-700"> UAE</span> 5904 </a> 5905 </li> 5906 <li> 5907 <a href="https://stata-brazil.com/stores/store/redirect/___store/stata_br/___from_store/stata_br/uenc/aHR0cHM6Ly9zdGF0YS1icmF6aWwuY29tL2N1c3RvbWVyL2FjY291bnQvbG9naW4vcmVmZXJlci9hSFIwY0hNNkx5OXpkR0YwWVMxaWNtRjZhV3d1WTI5dEwyTjFjM1J2YldWeUwyRmpZMjkxYm5RdmFXNWtaWGd2Lw~~/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5908 <img loading="lazy" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/brazil.png" 5909 alt="Brazil" 5910 class="w-8 aspect-square rounded-full"> 5911 <span class="block text-l text-neutralGray-700"> Brazil</span> 5912 </a> 5913 </li> 5914 <li> 5915 <a href="https://stata-brazil.com/stores/store/redirect/___store/stata_fr/___from_store/stata_br/uenc/aHR0cHM6Ly9zdGF0YS1mcmFuY2UuY29tL2N1c3RvbWVyL2FjY291bnQvbG9naW4vcmVmZXJlci9hSFIwY0hNNkx5OXpkR0YwWVMxaWNtRjZhV3d1WTI5dEwyTjFjM1J2YldWeUwyRmpZMjkxYm5RdmFXNWtaWGd2Lw~~/" class="flex items-center gap-x-1 rounded-3xl p-2 transition-all duration-300 hover:shadow focus:shadow"> 5916 <img loading="lazy" src="https://stata-brazil.com/static/version1790944496/frontend/TimberlakeHyva/timberlake/pt_BR/images/flags/france.png" 5917 alt="France" 5918 class="w-8 aspect-square rounded-full"> 5919 <span class="block text-l text-neutralGray-700"> France</span> 5920 </a> 5921 </li> 5922 </ul> 5923 </div> 5924 </div> 5925 </div> 5926</div> 5927 </div> 5928 </div> 5929 </div> 5930</div> 5931
5932<script> 5933 function mstGeoIpProcess() { 5934 return { 5935 options: { 5936 ajaxMode: '1', 5937 urlProcess: 'https://stata-brazil.com/geo_ip/action/process/', 5938 urlResult: 'https://stata-brazil.com/geo_ip/action/save/', 5939 redirectUrls: '\u007B\u002253\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fstata\u002Dbrazil.com\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u00221\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fuk\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002247\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fbr\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002248\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fae\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002249\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fpl\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002250\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fpt\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002252\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Ftimberlake.co\u005C\u002Fus\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002254\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fstata\u002Dfrance.com\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002255\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fstata\u002Duk.com\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022,\u002257\u0022\u003A\u0022https\u003A\u005C\u002F\u005C\u002Fstata\u002Dspain.com\u005C\u002Fgeo_ip\u005C\u002Faction\u005C\u002Fredirect\u005C\u002F\u0022\u007D', 5940 5941 popupTypeNone: 'none', 5942 popupTypeNotification: 'notification', 5943 popupTypeConfirmation: 'confirmation', 5944 5945 ruleSelectorRedirect: 'redirect', 5946 ruleSelectorCurrency: 'currency', 5947 ruleSelectorRestrict: 'restrict', 5948 ruleSelectorStore: 'store', 5949 }, 5950 redirectUrl: null, 5951 storeId: null, 5952 5953 send: function (url, dataObj, successCallback) { 5954 dataObj = dataObj || {}; 5955 dataObj.form_key = hyva.getFormKey(); 5956 const body = new URLSearchParams(dataObj); 5957 5958 fetch(url, { 5959 method: 'post', 5960 body: body, 5961 headers: {contentType: 'application/x-www-form-urlencoded; charset=UTF-8'} 5962 }) 5963 .then(response => response.json()) 5964 .then(function (response) { 5965 if (successCallback) { 5966 successCallback(response); 5967 } 5968 }) 5969 }, 5970 5971 redirectHandler: function (responseData) { 5972 if (responseData.redirectUrl === undefined) { 5973 return; 5974 } 5975 5976 if (responseData.isProcessOnFirstVisit && responseData.isLocationChanged) { 5977 return; 5978 } 5979 5980 this.redirectUrl = responseData.redirectUrl; 5981 5982 switch (responseData.popupType) { 5983 case this.options.popupTypeNone: 5984 window.dispatchEvent(new Event("mstGeoIpProcessRedirectDone")); 5985 break; 5986 case this.options.popupTypeNotification: 5987 window.dispatchEvent(new CustomEvent("mstGeoIpPopupOpen", {detail: {popupTypeNotification: this.options.popupTypeNotification}})); 5988 break; 5989 case this.options.popupTypeConfirmation: 5990 if (responseData.isRequestApproved) { 5991 window.dispatchEvent(new Event("mstGeoIpProcessRedirectDone")); 5992 } else if (!responseData.isRequestRejected) { 5993 window.dispatchEvent(new CustomEvent("mstGeoIpPopupOpen", {detail: {popupTypeConfirmation: this.options.popupTypeConfirmation}})); 5994 } 5995 break; 5996 } 5997 }, 5998 5999 currencyHandler: function (responseData) { 6000 this.redirectUrl = responseData.redirectUrl; 6001 window.dispatchEvent(new Event("mstGeoIpProcessCurrencyDone")); 6002 }, 6003 6004 restrictHandler: function (responseData) { 6005 this.redirectUrl = responseData.redirectUrl; 6006 window.location.href = this.redirectUrl; 6007 }, 6008 6009 storeHandler: function (responseData) { 6010 if (responseData.redirectUrl === undefined) { 6011 return; 6012 } 6013 6014 if (responseData.storeId === undefined) { 6015 return; 6016 } 6017 6018 if (responseData.isProcessOnFirstVisit && responseData.isLocationChanged) { 6019 return; 6020 } 6021 6022 this.redirectUrl = responseData.redirectUrl; 6023 6024 switch (responseData.popupType) { 6025 case this.options.popupTypeNone: 6026 window.dispatchEvent(new Event("mstGeoIpProcessRedirectDone")); 6027 break; 6028 case this.options.popupTypeNotification: 6029 window.dispatchEvent(new CustomEvent("mstGeoIpPopupOpen", {detail: {popupTypeNotification: this.options.popupTypeNotification}})); 6030 6031 break; 6032 case this.options.popupTypeConfirmation: 6033 if (responseData.isRequestApproved) { 6034 window.dispatchEvent(new Event("mstGeoIpProcessRedirectDone")); 6035 } 6036 if (!responseData.isRequestApproved && !responseData.isRequestRejected) { 6037 this.storeId = responseData.storeId; 6038 window.dispatchEvent(new CustomEvent("mstGeoIpPopupOpen", {detail: {popupTypeConfirmation: this.options.popupTypeConfirmation}})); 6039 } 6040 break; 6041 } 6042 }, 6043 6044 mstGeoIpProcessInit() { 6045 window.addEventListener('mstGeoIpProcessCurrencyDone', function (event) { 6046 if (this.redirectUrl === undefined) { 6047 console.log('redirectUrl is empty'); 6048 return; 6049 } 6050 this.send( 6051 this.options.urlResult, 6052 { 6053 ruleSelector: this.options.ruleSelectorCurrency, 6054 result: 'done' 6055 }, 6056 function () { 6057 window.location.href = this.redirectUrl; 6058 }.bind(this) 6059 ); 6060 }.bind(this)); 6061 6062 window.addEventListener('mstGeoIpProcessRedirectDone', function (event) { 6063 if (this.redirectUrl === undefined) { 6064 console.log('redirectUrl is empty'); 6065 return; 6066 } 6067 this.send( 6068 this.options.urlResult, 6069 { 6070 ruleSelector: this.options.ruleSelectorRedirect, 6071 result: 'done' 6072 }, 6073 function () { 6074 window.location.href = this.redirectUrl; 6075 }.bind(this) 6076 ); 6077 }.bind(this)); 6078 6079 window.addEventListener('mstGeoIpProcessRedirectAccept', function (event) { 6080 if (this.redirectUrl === undefined) { 6081 console.log('redirectUrl is empty'); 6082 return; 6083 } 6084 let data = { 6085 ruleSelector: this.options.ruleSelectorRedirect, 6086 result: 'accept' 6087 }; 6088 if (this.storeId) { 6089 data.ruleSelector = this.options.ruleSelectorStore; 6090 data.storeId = this.storeId; 6091 } 6092 this.send( 6093 this.options.urlResult, 6094 data, 6095 function (resp) { 6096 if (resp['data']['status_after_save']['ruleSelector'] == this.options.ruleSelectorStore) { 6097 this.redirectUrl = resp['data']['redirectUrl']; 6098 } 6099 6100 try { 6101 let oldUrl = new URL(window.location.href); 6102 let newUrl = new URL(this.redirectUrl); 6103 if (newUrl.hostname != oldUrl.hostname) { 6104 let redirectUrl = new URL(this.options.redirectUrls[this.storeId]); 6105 redirectUrl.searchParams.append('redirectUrl', this.redirectUrl); 6106 redirectUrl.searchParams.append('storeId', this.storeId); 6107 window.location.href = redirectUrl.href; 6108 } else { 6109 window.location.href = this.redirectUrl; 6110 } 6111 } catch (e) { 6112 window.location.href = this.redirectUrl; 6113 } 6114 }.bind(this) 6115 ); 6116 }.bind(this)); 6117 6118 window.addEventListener('mstGeoIpProcessRedirectReject', function (event) { 6119 this.send( 6120 this.options.urlResult, 6121 { 6122 ruleSelector: this.options.ruleSelectorRedirect, 6123 result: 'reject' 6124 } 6125 ); 6126 }.bind(this)); 6127 6128
6129 const entries = (new URLSearchParams(window.location.search)).entries(); 6130 const urlParams = []; 6131 for (const [key, value] of entries) { 6132 urlParams[key] = value; 6133 } 6134 6135 this.send(this.options.urlProcess, { 6136 relativePageUrl: window.location.pathname + window.location.search + window.location.hash, 6137 urlParams: urlParams 6138 }, 6139 function (response) { 6140 if (response.data === undefined || response.data.ruleSelector === undefined) { 6141 return; 6142 } 6143 6144 switch (response.data.ruleSelector) { 6145 case this.options.ruleSelectorRedirect: 6146 this.redirectHandler(response.data); 6147 break; 6148 case this.options.ruleSelectorCurrency: 6149 this.currencyHandler(response.data); 6150 break; 6151 case this.options.ruleSelectorRestrict: 6152 this.restrictHandler(response.data); 6153 break; 6154 case this.options.ruleSelectorStore: 6155 this.storeHandler(response.data); 6156 break; 6157 } 6158 6159 }.bind(this) 6160 ); 6161 }, 6162 } 6163 } 6164</script>
6164 6165 6166<div x-data="mstGeoIpProcess()" x-init="mstGeoIpProcessInit()"></div> 6167</div>
6167<script> 6168 window.dataLayer = window.dataLayer || []; 6169 window.mstGtmProducts = window.mstGtmProducts || []; 6170 window.mstGtmProductVariants = window.mstGtmProductVariants || []; 6171 6172 var mstGtmStorage = window.sessionStorage.getItem('mst_gtm'); 6173 6174 mstGtmStorage = mstGtmStorage ? mstGtmStorage : []; 6175 6176 function mstGtmItemPush(item) { 6177 var gtmStorageKey = ''; 6178 6179 if (typeof item.analytics_type != 'undefined') { 6180 gtmStorageKey = gtmStorageKey + item.analytics_type + '_'; 6181 } 6182 if (typeof item.gtm_id != 'undefined') { 6183 gtmStorageKey = gtmStorageKey + item.gtm_id; 6184 } 6185 6186 if (typeof item.gtm_id != 'undefined' && !mstGtmStorage.includes(gtmStorageKey)) { 6187 window.dataLayer.push({ecommerce: null}); 6188 6189 if (typeof item.analytics_type != 'undefined' && item.analytics_type == 'fbpixel') { 6190 if (typeof fbq != 'undefined') { 6191 fbq(item[0], item[1], item[2]); 6192 } 6193 } else { 6194 if (typeof item[0] != 'undefined') { 6195 var formatedObj = {}; 6196 formatedObj[item[0]] = item[1]; 6197 formatedObj['ecommerce'] = item[2]; 6198 6199 window.dataLayer.push(formatedObj); 6200 } else { 6201 window.dataLayer.push(item); 6202 } 6203 } 6204 } else if (typeof item.event != 'undefined') { 6205 window.dataLayer.push(item); 6206 } 6207 } 6208 6209 6210 window.mstGtmProducts = []; 6211 window.mstGtmProductVariants = []; 6212 window.sessionStorage.removeItem('mst_gtm'); 6213 6214 // clear section storage data 6215 const browserStorage = hyva.getBrowserStorage(); 6216 const oldSectionData = JSON.parse(browserStorage.getItem('mage-cache-storage') || '{}') || {}; 6217 6218 if (oldSectionData && typeof oldSectionData['gtm'] != 'undefined') { 6219 delete oldSectionData['gtm']; 6220 } 6221 const privateContentEvent = new CustomEvent("private-content-loaded", { 6222 detail: { 6223 data: oldSectionData 6224 } 6225 }); 6226 6227 window.dispatchEvent(privateContentEvent); 6228 6229 browserStorage.setItem('mage-cache-storage', JSON.stringify(oldSectionData)); 6230</script>
6230 6231
6231<script> 6232 function getMstEventSelector() { 6233 return { 6234 gtmAttrRegex: /^data-gtm-(.*)/g, 6235 6236 eventAttr: 'data-gtm-event', 6237 listAttr: 'data-gtm-item_list_id', 6238 listNameAttr: 'data-gtm-item_list_name', 6239 productAttr: 'data-gtm-item_id', 6240 6241 eventSelector: '[data-gtm-event]', 6242 listSelector: '[data-gtm-item_list_id]', 6243 productSelector: '[data-gtm-item_id]', 6244 6245 sentLists: [], 6246 6247 getProductAttribute: function () { 6248 return this.productAttr; 6249 }, 6250 6251 getListAttribute: function () { 6252 return this.listAttr; 6253 }, 6254 6255 getListNameAttribute: function () { 6256 return this.listNameAttr; 6257 }, 6258 6259 getEventAttribute: function () { 6260 return this.eventAttr; 6261 }, 6262 6263 getEventSelector: function () { 6264 return this.eventSelector; 6265 }, 6266 6267 getListSelector: function () { 6268 return this.listSelector; 6269 }, 6270 6271 getProductSelector: function () { 6272 return this.productSelector; 6273 }, 6274 6275 getAttributeRegex: function () { 6276 return this.gtmAttrRegex; 6277 } 6278 } 6279 } 6280</script>
6280
6280<script> 6281 function getMstAbstractEvent() { 6282 return { 6283 gtmAttrRegex: /^data-gtm-(.*)/g, 6284 6285 eventAttr: 'data-gtm-event', 6286 listAttr: 'data-gtm-item_list_id', 6287 listNameAttr: 'data-gtm-item_list_name', 6288 productAttr: 'data-gtm-item_id', 6289 6290 eventSelector: '', 6291 listSelector: '', 6292 productSelector: '', 6293 6294 sentLists: [], 6295 6296 initialize: function () { 6297 this.gtmAttrRegex = getMstEventSelector().getAttributeRegex(); 6298 this.eventAttr = getMstEventSelector().getEventAttribute(); 6299 this.listAttr = getMstEventSelector().getListAttribute(); 6300 this.listNameAttr = getMstEventSelector().getListNameAttribute(); 6301 this.productAttr = getMstEventSelector().getProductAttribute(); 6302 this.listSelector = getMstEventSelector().getListSelector(); 6303 this.productSelector = getMstEventSelector().getProductSelector(); 6304 6305 this.initEventSelector(); 6306 6307 window.dataLayer = window.dataLayer || []; 6308 6309 this.listeners(); 6310 6311 return this; 6312 }, 6313 6314 initEventSelector: function () { 6315 this.eventSelector = getMstEventSelector().getEventSelector(); 6316 }, 6317 6318 listeners: function () { 6319 6320 }, 6321 6322 sendData: function ($el) { 6323 6324 }, 6325 6326 setGaData: function ($listEl, productIds) { 6327 6328 }, 6329 6330 isVisible: function ($el) { 6331 if (!$el.is(":visible")) { 6332 return false; 6333 } 6334 6335 const $win = $(window); 6336 6337 const elementTop = $el.offset().top; 6338 const elementBottom = elementTop + $el.outerHeight(); 6339 6340 const viewportTop = $win.scrollTop(); 6341 const viewportBottom = viewportTop + $win.height(); 6342 6343 return elementBottom > viewportTop && elementTop < viewportBottom; 6344 }, 6345 6346 getProductAttribute: function () { 6347 return this.productAttr; 6348 }, 6349 6350 getProductSelector: function () { 6351 return this.productSelector; 6352 } 6353 } 6354 } 6355 window.addEventListener('alpine:init', () => Alpine.data('getMstAbstractEvent', getMstAbstractEvent), { once: true }); 6356</script>
6356 6357
6357<script> 6358 function initMstViewItemSwatchers() { 6359 const abstractEvent = getMstAbstractEvent(); 6360 6361 return { 6362 ...abstractEvent, 6363 6364 listeners: function () { 6365 window.addEventListener('configurable-selection-changed', e => { 6366 if (!e.detail || !e.detail.productIndex) { 6367 return 6368 } 6369 6370 const productID = e.detail.productIndex 6371 6372 if (typeof window.mstGtmProductVariants[productID] == 'undefined') return 6373 6374 window.mstGtmProductVariants[productID].forEach(item => { 6375 mstGtmItemPush(item) 6376 }) 6377 }) 6378 } 6379 } 6380 } 6381 window.addEventListener('alpine:init', () => Alpine.data('initMstViewItemSwatchers', initMstViewItemSwatchers), {once: true}); 6382</script>
6382 6383
6383<script> 6384 function initMstSelectItem() { 6385 const abstractEvent = getMstAbstractEvent(); 6386 6387 return { 6388 ...abstractEvent, 6389 6390 redirectUrl: '', 6391 6392 listeners: function () { 6393 const products = document.querySelectorAll(this.productSelector); 6394 6395 if (products.length) { 6396 products.forEach(function (product) { 6397 product.querySelectorAll('a').forEach(function (productLink) { 6398 productLink.addEventListener('click', function (e) { 6399 e.preventDefault(); 6400 6401 let $currentEl = e.currentTarget; 6402 let $productEl = e.currentTarget.closest(this.productSelector); 6403 let $listEl = $productEl.closest(this.listSelector); 6404 6405 this.redirectUrl = $currentEl.attr('href'); 6406 6407 let productIds = []; 6408 6409 if ($productEl && $listEl.length) { 6410 let productId = parseInt($productEl.getAttribute(this.productAttr)); 6411 6412 if (productId) { 6413 productIds.push(productId); 6414 6415 this.setGaData($listEl, productIds); 6416 } 6417 } 6418 6419 window.location = this.redirectUrl; 6420 }.bind(this)) 6421 }.bind(this)); 6422 }.bind(this)); 6423 } 6424 }, 6425 6426 setGaData: function ($listEl, productIds) { 6427 let listId = $listEl.getAttribute(this.listAttr); 6428 let listName = $listEl.getAttribute(this.listNameAttr); 6429 6430 let productId = productIds[0]; 6431 6432 window.dataLayer.push({ecommerce: null}); // Clear the previous ecommerce object. 6433 if (typeof gtag != 'undefined') { 6434 gtag('event', 'select_item', { 6435 item_list_id: listId, 6436 item_list_name: listName, 6437 items: [window.mstGtmProducts[productId]] 6438 }) 6439 } else { 6440 var formatedObj = {}; 6441 formatedObj['event'] = 'select_item'; 6442 formatedObj['ecommerce'] = { 6443 item_list_id: listId, 6444 item_list_name: listName, 6445 items: [window.mstGtmProducts[productId]] 6446 }; 6447 6448 window.dataLayer.push(formatedObj); 6449 } 6450 } 6451 } 6452 } 6453</script>
6453 6454
6454<script> 6455 function initMstItemList() { 6456 const abstractEvent = getMstAbstractEvent(); 6457 6458 return { 6459 ...abstractEvent, 6460 6461 isLoading: false, 6462 6463 initEventSelector: function () { 6464 this.eventSelector = '[' + this.eventAttr + '="view_item_list"]'; 6465 }, 6466 6467 listeners: function () { 6468 document.addEventListener('mst-gtm-init-products', function() { 6469 document.querySelectorAll(this.eventSelector).forEach(function (el) { 6470 if (this.isVisible(el)) { 6471 this.sendData(el); 6472 } 6473 }.bind(this)); 6474 }.bind(this)); 6475 }, 6476 6477 sendData: function ($el) { 6478 let $listEl = $el.querySelector(this.listSelector); 6479 let $productEls = $el.querySelectorAll(this.productSelector); 6480 6481 if (!$listEl && $el.hasAttribute(this.listAttr)) { 6482 $listEl = $el; 6483 } 6484 6485 let productIds = []; 6486 6487 $productEls.forEach(function (productEl) { 6488 let productId = parseInt(productEl.getAttribute(this.productAttr)); 6489 6490 if (productId) { 6491 productIds.push(productId); 6492 } 6493 }.bind(this)); 6494 6495 if (productIds.length) { 6496 this.setGaData($listEl, productIds); 6497 } 6498 }, 6499 6500 setGaData: function ($listEl, productIds) { 6501 let listId = $listEl.getAttribute(this.listAttr); 6502 let listName = $listEl.getAttribute(this.listNameAttr); 6503 6504 if (typeof this.sentLists[listId] == 'undefined' || !this.sentLists[listId]) { 6505 this.sentLists[listId] = true; 6506 6507 let currency = ''; 6508 6509 let items = []; 6510 for (var i in productIds) { 6511 items.push(window.mstGtmProducts[productIds[i]]); 6512 6513 if (typeof window.mstGtmProducts[productIds[i]].currency != 'undefined') { 6514 currency = window.mstGtmProducts[productIds[i]].currency; 6515 } 6516 } 6517 6518 window.dataLayer.push({ecommerce: null}); // Clear the previous ecommerce object. 6519 window.dataLayer.push('event', 'view_item_list', { 6520 item_list_id: listId, 6521 item_list_name: listName, 6522 items: [items] 6523 } 6524 ); 6525 } 6526 } 6527 } 6528 } 6529</script>
6529 6530
6530<script> 6531 function initMstSelectPromotion() { 6532 const abstractEvent = getMstAbstractEvent(); 6533 6534 return { 6535 ...abstractEvent, 6536 6537 creativeNameAttr: 'data-gtm-creative_name', 6538 creativeSlotAttr: 'data-gtm-creative_slot', 6539 6540 promolistIdAttr: 'data-gtml-promo-list-id', 6541 6542 itemIdAttr: 'data-gtm-item_id', 6543 itemNameAttr: 'data-gtm-item_name', 6544 6545 initEventSelector: function () { 6546 this.eventSelector = '[' + this.eventAttr + '="view_promotion"]'; 6547 }, 6548 6549 listeners: function () { 6550 let itemIdSelector = '[' + this.itemIdAttr + ']', 6551 itemNameSelector = '[' + this.itemNameAttr + ']'; 6552 6553 document.addEventListener('DOMContentLoaded', function () { 6554 const eventIdItems = document.querySelectorAll(this.eventSelector + ' ' + itemIdSelector); 6555 6556 if (eventIdItems.length) { 6557 eventIdItems.forEach(function (item) { 6558 item.addEventListener('click', function (e) { 6559 this.sendData(e.currentTarget); 6560 }.bind(this)); 6561 }.bind(this)); 6562 } 6563 6564 const eventNameItems = document.querySelectorAll(this.eventSelector + ' ' + itemNameSelector); 6565 6566 if (eventNameItems.length) { 6567 eventNameItems.forEach(function (item) { 6568 item.addEventListener('click', function (e) { 6569 this.sendData(e.currentTarget); 6570 }.bind(this)); 6571 }.bind(this)); 6572 } 6573 }.bind(this)); 6574 }, 6575 6576 sendData: function ($el) { 6577 this.setGaData($el, null); 6578 }, 6579 6580 setGaData: function ($listEl, productIds) { 6581 let $itemEl = $listEl; 6582 let $eventEl = $itemEl.closest(this.eventSelector); 6583 6584 let items = []; 6585 6586 let item = []; 6587 6588 $itemEl.attributes.forEach(function (attr) { 6589 if (attr.name.match(this.gtmAttrRegex)) { 6590 let attrName = attr.name.replace(this.gtmAttrRegex, '$1'); 6591 6592 item[attrName] = attr.value; 6593 } 6594 }.bind(this)); 6595 6596 items.push(item); 6597 6598 let eventItems = {items: items}; 6599 6600 $eventEl.attributes.forEach(function (attr) { 6601 if (attr.name.match(this.gtmAttrRegex)) { 6602 let attrName = attr.name.replace(this.gtmAttrRegex, '$1'); 6603 6604 eventItems[attrName] = attr.value; 6605 } 6606 }.bind(this)); 6607 6608 window.dataLayer.push({ecommerce: null}); // Clear the previous ecommerce object. 6609 if (typeof gtag != 'undefined') { 6610 gtag('event', 'select_promotion', eventItems); 6611 } else { 6612 var formatedObj = {}; 6613 formatedObj['event'] = 'select_promotion'; 6614 formatedObj['ecommerce'] = eventItems; 6615 6616 window.dataLayer.push(formatedObj); 6617 } 6618 } 6619 } 6620 } 6621</script>
6621 6622
6622<script> 6623 function initMstViewPromotion() { 6624 const abstractEvent = getMstAbstractEvent(); 6625 6626 return { 6627 ...abstractEvent, 6628 6629 creativeNameAttr: 'data-gtm-creative_name', 6630 creativeSlotAttr: 'data-gtm-creative_slot', 6631 6632 promolistIdAttr: 'data-gtml-promo-list-id', 6633 6634 itemIdAttr: 'data-gtm-item_id', 6635 itemNameAttr: 'data-gtm-item_name', 6636 6637 initEventSelector: function () { 6638 this.eventSelector = '[' + this.eventAttr + '="view_promotion"]'; 6639 }, 6640 6641 listeners: function () { 6642 document.addEventListener('DOMContentLoaded', function () { 6643 const eventItems = document.querySelectorAll(this.eventSelector); 6644 6645 this.sendData(eventItems); 6646 6647 // if (eventItems.length) { 6648 // eventItems.forEach(function (item) { 6649 // if (this.isVisible(item)) { 6650 // this.sendData(item); 6651 // } 6652 // }.bind(this)); 6653 // } 6654 }.bind(this)); 6655 6656 window.addEventListener('scroll', function () { 6657 const eventItems = document.querySelectorAll(this.eventSelector); 6658 this.sendData(eventItems, null); 6659 }.bind(this)); 6660 6661 // $('body').on('contentUpdated', function () { 6662 // this.sendData($(this.eventSelector), null); 6663 // }.bind(this)); 6664 }, 6665 6666 sendData: function ($el) { 6667 $el.forEach(function (eventEl, i) { 6668 if (!eventEl.getAttribute(this.promolistIdAttr)) { 6669 eventEl.setAttribute(this.promolistIdAttr, i); 6670 } 6671 6672 if (this.isVisible(eventEl)) { 6673 this.setGaData(eventEl, null); 6674 } 6675 }.bind(this)); 6676 }, 6677 6678 setGaData: function ($listEl, productIds) { 6679 let itemIdSelector = '[' + this.itemIdAttr + ']', 6680 itemNameSelector = '[' + this.itemNameAttr+ ']'; 6681 6682 let $eventEl = $listEl; 6683 let $itemIdEls = $eventEl.querySelectorAll(itemIdSelector); 6684 let $itemNameEls = $eventEl.querySelectorAll(itemNameSelector); 6685 6686 let listId = $eventEl.getAttribute(this.promolistIdAttr); 6687 6688 let $itemsEls; 6689 if ($itemIdEls.length) { 6690 $itemsEls = $itemIdEls; 6691 } else { 6692 $itemsEls = $itemNameEls; 6693 } 6694 6695 if (typeof this.sentLists[listId] == 'undefined' || !this.sentLists[listId]) { 6696 this.sentLists[listId] = true; 6697 6698 let items = []; 6699 6700 $itemsEls.forEach(function ($el) { 6701 let item = []; 6702 6703 $el.attributes.forEach(function (attr) { 6704 if (attr.name.match(this.gtmAttrRegex)) { 6705 let attrName = attr.name.replace(this.gtmAttrRegex, '$1'); 6706 6707 item[attrName] = attr.value; 6708 } 6709 }.bind(this)); 6710 6711 items.push(item); 6712 }.bind(this)); 6713 6714 let eventItems = {items: items}; 6715 6716 $eventEl[0].attributes.forEach(function (attr) { 6717 if (attr.name.match(this.gtmAttrRegex)) { 6718 let attrName = attr.name.replace(this.gtmAttrRegex, '$1'); 6719 6720 eventItems[attrName] = attr.value; 6721 } 6722 }.bind(this)); 6723 6724 window.dataLayer.push({ecommerce: null}); // Clear the previous ecommerce object. 6725 if (typeof gtag != 'undefined') { 6726 gtag('event', 'view_promotion', eventItems); 6727 } else { 6728 var formatedObj = {}; 6729 formatedObj['event'] = 'view_promotion'; 6730 formatedObj['ecommerce'] = eventItems; 6731 6732 window.dataLayer.push(formatedObj); 6733 } 6734 } 6735 } 6736 } 6737 } 6738</script>
6738 6739 <div x-data="initGtmProductStorage" @private-content-loaded.window="initialize"></div> 6740
6741<script> 6742 function initGtmProductStorage() { 6743 return { 6744 isLoading: false, 6745 isInitEvents: false, 6746 itemInfoUrl: BASE_URL + '/mst_gtm/item/info/', 6747 6748 initialize: function () { 6749 setInterval(this.updateProducts.bind(this), 200); 6750 }, 6751 6752 getProductData: function (id) { 6753 return window.mstGtmProducts[id]; 6754 }, 6755 6756 updateProducts: function () { 6757 if (this.isLoading) { 6758 return; 6759 } 6760 6761 let $productEls = document.querySelectorAll(getMstEventSelector().getProductSelector()); 6762 6763 let missedIds = []; 6764 6765 if ($productEls.length) { 6766 $productEls.forEach(function (productEl) { 6767 let productId = parseInt(productEl.getAttribute(getMstEventSelector().getProductAttribute())); 6768 6769 if (!productId || typeof window.mstGtmProducts[productId] == 'undefined') { 6770 missedIds.push(productEl.getAttribute(getMstEventSelector().getProductAttribute())); 6771 } 6772 }.bind(this)); 6773 } 6774 6775 if (missedIds.length) { 6776 this.isLoading = true; 6777 6778 const data = new FormData(); 6779 6780 data.append('product_ids', missedIds); 6781 6782 fetch(this.itemInfoUrl + '?form_key=' + hyva.getFormKey(), { 6783 method: 'post', 6784 body: data, 6785 headers: {contentType: 'application/json'} 6786 }).then(response => { 6787 if (response.ok) { 6788 return response.json(); 6789 } else { 6790 console.warn("GET request failed", response); 6791 } 6792 }).then(response => { 6793 if (response) { 6794 if (typeof response.data != 'undefined' && response.data.length) { 6795 for (var i in response.data) { 6796 window.mstGtmProducts[response.data[i]['product_id']] = response.data[i]; 6797 } 6798 } 6799 this.isLoading = false; 6800 6801 // instead of $(document).ready() 6802 document.dispatchEvent(new CustomEvent('mst-gtm-init-products')); 6803 } 6804 }); 6805 } 6806 } 6807 }; 6808 } 6809 window.addEventListener('alpine:init', () => Alpine.data('initGtmProductStorage', initGtmProductStorage), { once: true }); 6810</script>
6810 6811 <div x-data="initGtmLayer" x-init="initLayer" x-ref="layerHandler"></div> 6812
6813<script> 6814 function initGtmLayer() { 6815 return { 6816 initLayer: function (data) { 6817 if (data && data.gtm && data.gtm.push) { 6818 const gtm = data.gtm; 6819 6820 this.onUpdate(gtm); 6821 } 6822 }, 6823 6824 onUpdate: function (data) { 6825 data.push.forEach(item => { 6826 if (item) { 6827 mstGtmItemPush(item) 6828 } 6829 }); 6830 } 6831 } 6832 } 6833 window.addEventListener('alpine:init', () => Alpine.data('initGtmLayer', initGtmLayer), { once: true }); 6834 document.addEventListener("private-content-loaded", (event) => { 6835 const layerHandler = document.querySelector('[x-ref="layerHandler"]'); 6836 if (layerHandler && layerHandler.__x) { 6837 layerHandler.__x.initialize(event.detail.data); 6838 } 6839 }); 6840</script>
6840 6841 <div x-data="initMstAddToCart" @private-content-loaded.window="initialize"></div> 6842
6842<script> 6843 function initMstAddToCart() { 6844 return { 6845 initialize: function () { 6846 const data = this.$event.detail.data; 6847 if (data["mst-tm-addtocart"] && Object.keys(data["mst-tm-addtocart"]).length) { 6848 const gtm = data["mst-tm-addtocart"] 6849 this.onUpdate(gtm) 6850 } 6851 }, 6852 6853 onUpdate: function (data) { 6854 data.push.forEach(item => mstGtmItemPush(item)); 6855 } 6856 } 6857 } 6858 window.addEventListener('alpine:init', () => Alpine.data('initMstAddToCart', initMstAddToCart), {once: true}); 6859 </script>
6859 6860 <div x-data="initMstGtmEvents" @private-content-loaded.window="initialize"></div>
6861<script> 6862 function initMstGtmEvents() { 6863 return { 6864 initialize: function () { 6865 initMstSelectItem().initialize(); 6866 initMstItemList().initialize(); 6867 initMstSelectPromotion().initialize(); 6868 initMstViewPromotion().initialize(); 6869 initMstViewItemSwatchers().initialize(); 6870 } 6871 } 6872 } 6873 window.addEventListener('alpine:init', () => Alpine.data('initMstGtmEvents', initMstGtmEvents), { once: true }); 6874</script>
6874 6875 <div x-data="initGtmToolbar" @private-content-loaded.window="initToolbar"></div>
6876<script> 6877 function initGtmToolbar() { 6878 return { 6879 cookieName: 'mst_gtm_debug', 6880 debugOn: 'gtm', 6881 6882 wrapperClassList: 'mst-gtm__toolbar fixed left-4 bottom-4 card p-0 rounded-none text-sm w-80', 6883 titleClassList: 'btn btn-primary rounded-none text-center block font-semibold', 6884 bodyClassList: 'mst-gtm__toolbar-body overflow-y-auto', 6885 eventClassList: 'mst-gtm__toolbar-event card m-2 p-2 border-grey-200 border-2 relative cursor-pointer', 6886 idxClassList: 'bg-blue-600 px-2 py-1 mr-3 text-white font-normal', 6887 linkClassList: 'float-right text-gray-400 mr-2 underline', 6888 extraClassList: 'mst-gtm__toolbar-extra fixed bottom-4 card rounded-none text-xs', 6889 preClassList: 'overflow-auto p-2 whitespace-pre-wrap leading-5', 6890 6891 initToolbar: function () { 6892 const currentUrl = new URL(window.location); 6893 6894 if (currentUrl.searchParams.get('debug') === this.debugOn) { 6895 if (hyva.getCookie(this.cookieName) === this.debugOn) { 6896 hyva.setCookie(this.cookieName, '', 1); 6897 } else { 6898 hyva.setCookie(this.cookieName, this.debugOn, 1); 6899 } 6900 } 6901 6902 if (hyva.getCookie(this.cookieName) === this.debugOn) { 6903 const elements = document.getElementsByClassName('mst-gtm__toolbar'); 6904 while (elements.length > 0) { 6905 elements[0].parentNode.removeChild(elements[0]); 6906 } 6907 6908 document.body.appendChild(this.getWrapperHtml()); 6909 6910 this.$toolbarBody = document.querySelector('.mst-gtm__toolbar-body'); 6911 6912 let len = 0; 6913 setInterval(function () { 6914 if (window.dataLayer.length !== len) { 6915 this.updateToolbar(); 6916 6917 len = window.dataLayer.length; 6918 } 6919 }.bind(this), 1000); 6920 } 6921 }, 6922 6923 updateToolbar: function () { 6924 this.$toolbarBody.innerHTML = ''; 6925 6926 let index = 1; 6927 6928 window.dataLayer.forEach(function (data) { 6929 if (typeof data.event != 'undefined') { 6930 const $displayData = this.createToolbarElement('pre', false, this.preClassList); 6931 const $code = this.createToolbarElement('code', JSON.stringify(data, undefined, 4)); 6932 6933 $displayData.appendChild($code); 6934 6935 const $event = this.createToolbarElement('div', false, this.eventClassList); 6936 6937 $event.appendChild(this.createToolbarElement('strong', '#' + index, this.idxClassList)); 6938 $event.appendChild(this.createToolbarElement('span', 'Event: ' + data.event)); 6939 $event.appendChild(this.createToolbarElement('span', 'Open', this.linkClassList)); 6940 6941 $event.addEventListener('click', function () { 6942 this.displayData($displayData); 6943 }.bind(this)); 6944 6945 this.$toolbarBody.appendChild($event); 6946 6947 index++; 6948 } 6949 }.bind(this)); 6950 }, 6951 6952 getWrapperHtml: function () { 6953 const $wrapper = this.createToolbarElement('div', false, this.wrapperClassList); 6954 const $title = this.createToolbarElement('strong', 'Google Tag Manager', this.titleClassList); 6955 const $body = this.createToolbarElement('div', false, this.bodyClassList); 6956 6957 $wrapper.appendChild($title); 6958 $wrapper.appendChild($body); 6959 6960 return $wrapper; 6961 }, 6962 6963 displayData: function ($data) { 6964 const toolbarExtra = document.querySelector('body .mst-gtm__toolbar-extra'); 6965 6966 if (toolbarExtra) { 6967 toolbarExtra.parentNode.removeChild(toolbarExtra); 6968 } 6969 6970 const $t = this.createToolbarElement('div', false, this.extraClassList); 6971 $t.appendChild($data); 6972 6973 document.body.appendChild($t); 6974 }, 6975 6976 createToolbarElement: function (tagName, data, classList) { 6977 const element = document.createElement(tagName); 6978 6979 if (data) { 6980 element.innerHTML = data; 6981 } 6982 6983 if (classList) { 6984 classList = classList.split(' '); 6985 classList.forEach(function (classItem) { 6986 element.classList.add(classItem); 6987 }); 6988 } 6989 6990 return element; 6991 } 6992 }; 6993 } 6994 6995 window.addEventListener('alpine:init', () => Alpine.data('initGtmToolbar', initGtmToolbar), { once: true }); 6996</script>
6996 6997
6997<script>(function(){function c(){var b=a.contentDocument||(a.contentWindow&&a.contentWindow.document);if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a4811f769cd913eb',t:'MTc5MTU4ODA5OQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script>
6997</body> 6998</html>
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.