1<!DOCTYPE html><html lang="en"><head><meta name="description" content="Solidarity between peoples. Sovereignty among nations. Join us."> 2<meta property="og:title" content="Panamerican Congress"> 3<meta property="og:description" content="Solidarity between peoples. Sovereignty among nations."> 4<meta property="og:image" content="https://htmlpub.com/api/library/nth7dao9bno7wbjoueecqzg7"> 5<meta property="og:image:width" content="1200"> 6<meta property="og:image:height" content="630"> 7<meta property="og:url" content="https://panamericancongress.org/panam_mdeo_declaration_en"> 8<meta name="twitter:url" content="https://panamericancongress.org/panam_mdeo_declaration_en"> 9<meta property="og:type" content="website"> 10<meta property="og:site_name" content="panamericancongress.org"> 11<meta property="og:locale" content="en_US"> 12<meta property="fb:app_id" content="4198265810445529"> 13<meta name="twitter:card" content="summary_large_image"> 14<meta name="twitter:title" content="Panamerican Congress"> 15<meta name="twitter:description" content="Solidarity between peoples. Sovereignty among nations."> 16<meta name="twitter:image" content="https://htmlpub.com/api/library/nth7dao9bno7wbjoueecqzg7"> 17<meta name="twitter:image:width" content="1200"> 18<meta name="twitter:image:height" content="630"> 19<meta name="robots" content="index, follow"> 20<link rel="canonical" href="https://panamericancongress.org/panam_mdeo_declaration_en"> 21<link rel="icon" href="https://panamericancongress.org/api/library/gm5ryasqae7cr4bej6u9dpiu"> 22<title>Panamerican Congress</title> 23 <meta charset="utf-8"> 24 <!-- BUILT WITH LEADPAGES https://www.leadpages.com --> 25 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> 26 <meta name="viewport" content="width=device-width, initial-scale=1"> 27 28 <meta name="keywords" content=""> 29 30 31 32 33 34 <meta property="og:image:type" content="image/png"> 35 36 37 <meta name="leadpages-served-by" content="leadpages"> 38 <meta name="leadpages-serving-domain" content="panamericancongress.org"> 39 <meta name="leadpages-legacy-pixel-domain" content="https://my.leadpages.net"> 40 <meta name="leadpages-meta-id" content="BjB8QSSjTtjFQnZfmxEXc2"> 41 <meta name="leadpages-edition" content="iAC73Veh7xKc2YxpFfyWfh"> 42 43 <link rel="stylesheet" href="https://classic-assets.leadpages.com/static-leadpages-net/fonts/font-awesome/6.4.2/css/all.min.css" referrerpolicy="no-referrer"> 44 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin=""> 45 <link rel="preload" as="style" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Condensed:300,400,500,700"> 46 <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Condensed:300,400,500,700" type="text/css" referrerpolicy="no-referrer" media="print" onload="this.media='all'"> 47 48 49 50 51 <style data-id="run-styles"> 52 /*! normalize.css v3.0.2 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*,*::before,*::after{box-sizing:border-box}html{height:100%;width:100%}html{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;background-color:#fff;box-sizing:border-box;color:#000;font-family:Roboto,sans-serif;font-size:1em;line-height:1.5;min-height:100%;position:relative}html.is-leadbox{background-color:transparent}body{min-height:100%}h1,h2,h3,h4,h1.jumbo{margin:0}p{margin:0}a{font-size:inherit}img{max-width:100%;width:100%}section{position:relative;transition:opacity .5s ease-in,min-height .5s ease-in,height .5s ease-in}.container{width:100%}.row-compose,.widget-row,.layout,.inner-column,.column{position:relative}.site-header .layout{align-items:center;min-height:64px}.column{display:flex;flex-direction:column}.inner-column{flex:1 1 auto}.inner-column:not(.area-placeholder){min-height:1px}.widget{word-wrap:break-word;padding:1vw;padding:1cqw}.leadbox .widget{padding:1vw;padding:1cqw}.bar .widget{padding:1vw;padding:1cqw}.has-background-image{background-position:center center;background-repeat:no-repeat}.has-background-size-cover{background-size:cover}.has-background-size-center{background-size:contain}.has-background-size-repeat{background-repeat:repeat}.flex-display{display:flex}.flex-direction-column{flex-direction:column}.flex-direction-column .container{min-height:1px}.flex-direction-row{flex-direction:row}.flex-justify-flex-start{justify-content:flex-start}.flex-justify-center{justify-content:center}.flex-justify-flex-end{justify-content:flex-end}[class*=section-arrow--]::before{border:solid transparent;border-color:rgba(0,0,0,0);content:"";height:0;pointer-events:none;position:absolute;width:0;z-index:1}.section-arrow--top::before{border-bottom-color:inherit;border-width:0 30px 18px;bottom:100%;left:50%;transform:translateX(-50%)}.section-arrow--bottom::before{border-top-color:inherit;border-width:18px 30px 0;left:50%;
52top:100%;transform:translateX(-50%)}.section-arrow--left::before{border-bottom-color:inherit;border-width:0 30px 24px;bottom:100%;right:50%;transform:translateX(50%)}@media(min-width: 48em){.section-arrow--left::before{border-bottom-color:transparent;border-right-color:inherit;border-width:30px 24px 30px 0;bottom:0;right:100%;top:50%;transform:translateY(-50%) translateX(0)}}.section-arrow--right::before{border-top-color:inherit;border-width:24px 30px 0;left:50%;top:100%;transform:translateX(-50%)}@media(min-width: 48em){.section-arrow--right::before{border-left-color:inherit;border-top-color:transparent;border-width:30px 0 30px 24px;left:100%;top:50%;transform:translateY(-50%) translateX(0)}}.page .is-delayed{min-height:0;height:0;opacity:0;overflow:hidden;padding-bottom:0;padding-top:0}.is-visible{height:auto;opacity:1;overflow:visible}.lp-text a,.lp-text-react a,.lp-headline a{color:inherit;text-decoration:underline}.lp-text a>span,.lp-text-react a>span,.lp-headline a>span{color:inherit;text-decoration:underline}.lp-text a:hover,.lp-text a:active,.lp-text-react a:hover,.lp-text-react a:active,.lp-headline a:hover,.lp-headline a:active{text-decoration:none}.lp-text a:hover>span,.lp-text a:active>span,.lp-text-react a:hover>span,.lp-text-react a:active>span,.lp-headline a:hover>span,.lp-headline a:active>span{text-decoration:none}.lp-blog-feed a{text-decoration:none}.lp-blog-feed a:hover,.lp-blog-feed a:active{text-decoration:none}.lp-blog-feed a:hover>span,.lp-blog-feed a:active>span{text-decoration:none}.lp-blog-feed a.pagination-arrow{color:inherit;margin:auto 40px}.lp-blog-feed a.pagination-arrow.disabled{color:inherit;pointer-events:none;opacity:.3}.lp-blog-post a{color:inherit;text-decoration:none}.lp-blog-post a>span{color:inherit;text-decoration:none}.lp-blog-post a:hover,.lp-blog-post a:active{text-decoration:none}.lp-blog-post a:hover>span,.lp-blog-post a:active>span{text-decoration:none}.lp-blog-post a.pagination-arrow{margin:auto 40px}.lp-blog-post a.pagination-arrow.disabled{pointer-events:none;opacity:.3}.lp-post-body p{min-height:18px;margin:20px 0}.lp-post-body h1,.lp-post-body h2,.lp-post-body h3,.lp-post-body h4,.lp-post-body h5,.lp-post-body h6{margin:24px 0}.lp-post-body img{width:auto}.widget-widget>iframe{max-width:100%;width:100%}.inner-composite{display:flex}.page grammarly-btn{display:none}.page .lp-form__input+span,.page .lp-form-react__input+span{display:none !important}@media(max-width: 480px){.hidden-mobile{display:none !important}}@media(min-width: 481px)and (max-width: 768px){.hidden-tablet{display:none !important}}@media(min-width: 769px){.hidden-desktop{display:none !important}}.hide-section{display:none}form .widget-column{padding-top:1vw;padding-bottom:1vw;padding-top:1cqw;padding-bottom:1cqw}form .widget-column .widget{padding-bottom:0;padding-top:0}form .widget-column .widget .lp-button-react-wrapper{margin-top:12px}form[data-form-id] button:disabled{opacity:.5;pointer-events:none;transition:opacity 7.5s ease}@keyframes animation-circular-rotate{0%{transform-origin:50% 50%}100%{transform:rotate(360deg)}}@-webkit-keyframes animation-circular-rotate{0%{transform-origin:50% 50%}100%{transform:rotate(360deg)}}@-webkit-keyframes animation-circular-progress{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px}}@keyframes animation-circular-progress{0%{stroke-dasharray:1px,200px;stroke-dashoffset:0px}50%{stroke-dasharray:100px,200px;stroke-dashoffset:-15px}100%{stroke-dasharray:100px,200px;stroke-dashoffset:-125px}}.container{margin-left:auto;margin-right:auto;max-width:1140px}.container--fluid{max-width:none}.flex{display:flex;flex-direction:row;flex-wrap:wrap;margin-left:0;margin-right:0;max-width:100%}[class*=flex__]{flex:0 0 auto;min-height:1px;padding-left:0;padding-right:0}.flex--12 .flex__item--xs-1{flex-basis:8.3333333333%;max-width:8.3333333333%}.flex--12 .flex__item--xs-2{flex-basis:16.6666666667%;max-width:16.6666666667%}.flex--12 .flex__item--xs-3{flex-basis:25%;max-width:25%}.flex--12 .flex__item--xs-4{flex-basis:33.3333333333%;max-width:33.3333333333%}.flex--12 .flex__item--xs-5{flex-basis:41.6666666667%;max-width:41.6666666667%}.flex--12 .flex__item--xs-6{flex-basis:50%;max-width:50%}.flex--12 .flex__item--xs-7{flex-basis:58.3333333333%;max-width:58.3333333333%}.flex--12 .flex__item--xs-8{flex-basis:66.6666666667%;max-width:66.6666666667%}.flex--12 .flex__item--xs-9{flex-basis:75%;max-width:75%}.flex--12 .flex__item--xs-10{flex-basis:83.3333333333%;max-width:83.3333333333%}.flex--12 .flex__item--xs-11{flex-basis:91.6666666667%;max-width:91.6666666667%}.flex--12 .flex__item--xs-12{flex-basis:100%;max-width:100%}.flex--12 .flex__offset--xs-1{margin-left:8.3333333333%}.flex--12 .flex__offset--xs-2{margin-left:16.6666666667%}.flex--12 .flex__offset--xs-3{margin-left:25%}.flex--12 .flex__offset--xs-4{margin-left:33.3333333333%}.flex--12 .flex__offset--xs-5{margin-left:41.6666666667%}.flex--12 .flex__offset--xs-6{margin-left:50%}.flex--12 .flex__offset--xs-7{margin-left:58.3333333333%}.flex--12 .flex__offset--xs-8{margin-left:66.6666666667%}.flex--12 .flex__offset--xs-9{margin-left:75%}.flex--12 .flex__offset--xs-10{margin-left:83.3333333333%}.flex--12 .flex__offset--xs-11{margin-left:91.6666666667%}.flex--10 .flex__item--xs-1{flex-basis:10%;max-width:10%}.flex--10 .flex__item--xs-2{flex-basis:20%;max-width:20%}.flex--10 .flex__item--xs-3{flex-basis:30%;max-width:30%}.flex--10 .flex__item--xs-4{flex-basis:40%;max-width:40%}.flex--10 .flex__item--xs-5{flex-basis:50%;max-width:50%}.flex--10 .flex__item--xs-6{flex-basis:60%;max-width:60%}.flex--10 .flex__item--xs-7{flex-basis:70%;max-width:70%}.flex--10 .flex__item--xs-8{flex-basis:80%;max-width:80%}.flex--10 .flex__item--xs-9{flex-basis:90%;max-width:90%}.flex--10 .flex__item--xs-10{flex-basis:100%;max-width:100%}.flex--10 .flex__offset--xs-1{margin-left:10%}.flex--10 .flex__offset--xs-2{margin-left:20%}.flex--10 .flex__offset--xs-3{margin-left:30%}.flex--10 .flex__offset--xs-4{margin-left:40%}.flex--10 .flex__offset--xs-5{margin-left:50%}.flex--10 .flex__offset--xs-6{margin-left:60%}.flex--10 .flex__offset--xs-7{margin-left:70%}.flex--10 .flex__offset--xs-8{margin-left:80%}.flex--10 .flex__offset--xs-9{margin-left:90%}.flex--xs-start{justify-content:flex-start}.flex--xs-center{justify-content:center}.flex--xs-end{justify-content:flex-end}.flex--xs-around{justify-content:space-around}.flex--xs-between{justify-content:space-between}.flex--xs-top{align-items:flex-start}.flex--xs-middle{align-items:center}.flex--xs-bottom{align-items:flex-end}.flex--xs-first{order:-1}.flex--xs-last{order:1}.flex__item--xs-auto{flex:1 1 auto}.flex__item--xs-grow{flex-grow:1}.flex__item--xs-no-grow{flex-grow:0}.flex__item--xs-shrink{flex-shrink:1}.flex__item--xs-no-shrink{flex-shrink:0}.flex__item--xs-none{flex:none}.flex--xs-inline-flex{display:inline-flex}.flex--xs-flex-nowrap{flex-wrap:nowrap}.flex--xs-flex-wrap-rev{flex-wrap:wrap-reverse}.flex--xs-horizontal-rev{flex-direction:column-reverse}.flex--xs-vertical{flex-direction:column}.flex--xs-vertical-rev{flex-direction:row-reverse}@media(min-width: 480px){.flex--12 .flex__item--sm-1{flex-basis:8.3333333333%;max-width:8.3333333333%}.flex--12 .flex__item--sm-2{flex-basis:16.6666666667%;max-width:16.6666666667%}.flex--12 .flex__item--sm-3{flex-basis:25%;max-width:25%}.flex--12 .flex__item--sm-4{flex-basis:33.3333333333%;max-width:33.3333333333%}.flex--12 .flex__item--sm-5{flex-basis:41.6666666667%;max-width:41.6666666667%}.flex--12 .flex__item--sm-6{flex-basis:50%;max-width:50%}.flex--12 .flex__item--sm-7{flex-basis:58.3333333333%;max-width:58.3333333333%}.flex--12 .flex__item--sm-8{flex-basis:66.6666666667%;max-width:66.6666666667%}.flex--12 .flex__item--sm-9{flex-basis:75%;max-width:75%}.flex--12 .flex__item--sm-10{flex-basis:83.3333333333%;max-width:83.3333333333%}.flex--12 .flex__item--sm-11{flex-basis:91.6666666667%;max-width:91.6666666667%}.flex--12 .flex__item--sm-12{flex-basis:100%;max-width:100%}.flex--12 .flex__offset--sm-1{margin-left:8.3333333333%}.flex--12 .flex__offset--sm-2{margin-left:16.6666666667%}.flex--12 .flex__offset--sm-3{margin-left:25%}.flex--12 .flex__offset--sm-4{margin-left:33.3333333333%}.flex--12 .flex__offset--sm-5{margin-left:41.6666666667%}.flex--12 .flex__offset--sm-6{margin-left:50%}.flex--12 .flex__offset--sm-7{margin-left:58.3333333333%}.flex--12 .flex__offset--sm-8{margin-left:66.6666666667%}.flex--12 .flex__offset--sm-9{margin-left:75%}.flex--12 .flex__offset--sm-10{margin-left:83.3333333333%}.flex--12 .flex__offset--sm-11{margin-left:91.6666666667%}.flex--10 .flex__item--sm-1{flex-basis:10%;max-width:10%}.flex--10 .flex__item--sm-2{flex-basis:20%;max-width:20%}.flex--10 .flex__item--sm-3{flex-basis:30%;max-width:30%}.flex--10 .flex__item--sm-4{flex-basis:40%;max-width:40%}.flex--10 .flex__item--sm-5{flex-basis:50%;max-width:50%}.flex--10 .flex__item--sm-6{flex-basis:60%;max-width:60%}.flex--10 .flex__item--sm-7{flex-basis:70%;max-width:70%}.flex--10 .flex__item--sm-8{flex-basis:80%;max-width:80%}.flex--10 .flex__item--sm-9{flex-basis:90%;max-width:90%}.flex--10 .flex__item--sm-10{flex-basis:100%;max-width:100%}.flex--10 .flex__offset--sm-1{margin-left:10%}.flex--10 .flex__offset--sm-2{margin-left:20%}.flex--10 .flex__offset--sm-3{margin-left:30%}.flex--10 .flex__offset--sm-4{margin-left:40%}.flex--10 .flex__offset--sm-5{margin-left:50%}.flex--10 .flex__offset--sm-6{margin-left:60%}.flex--10 .flex__offset--sm-7{margin-left:70%}.flex--10 .flex__offset--sm-8{margin-left:80%}.flex--10 .flex__offset--sm-9{margin-left:90%}.flex--sm-start{justify-content:flex-start}.flex--sm-center{justify-content:center}.flex--sm-end{justify-content:flex-end}.flex--sm-around{justify-content:space-around}.flex--sm-between{justify-content:space-between}.flex--sm-top{align-items:flex-start}.flex--sm-middle{align-items:center}.flex--sm-bottom{align-items:flex-end}.flex--sm-first{order:-1}.flex--sm-last{order:1}
52.flex__item--sm-auto{flex:1 1 auto}.flex__item--sm-grow{flex-grow:1}.flex__item--sm-no-grow{flex-grow:0}.flex__item--sm-shrink{flex-shrink:1}.flex__item--sm-no-shrink{flex-shrink:0}.flex__item--sm-none{flex:none}.flex--sm-inline-flex{display:inline-flex}.flex--sm-flex-nowrap{flex-wrap:nowrap}.flex--sm-flex-wrap-rev{flex-wrap:wrap-reverse}.flex--sm-horizontal-rev{flex-direction:column-reverse}.flex--sm-vertical{flex-direction:column}.flex--sm-vertical-rev{flex-direction:row-reverse}}@media(min-width: 768px){.flex--12 .flex__item--md-1{flex-basis:8.3333333333%;max-width:8.3333333333%}.flex--12 .flex__item--md-2{flex-basis:16.6666666667%;max-width:16.6666666667%}.flex--12 .flex__item--md-3{flex-basis:25%;max-width:25%}.flex--12 .flex__item--md-4{flex-basis:33.3333333333%;max-width:33.3333333333%}.flex--12 .flex__item--md-5{flex-basis:41.6666666667%;max-width:41.6666666667%}.flex--12 .flex__item--md-6{flex-basis:50%;max-width:50%}.flex--12 .flex__item--md-7{flex-basis:58.3333333333%;max-width:58.3333333333%}.flex--12 .flex__item--md-8{flex-basis:66.6666666667%;max-width:66.6666666667%}.flex--12 .flex__item--md-9{flex-basis:75%;max-width:75%}.flex--12 .flex__item--md-10{flex-basis:83.3333333333%;max-width:83.3333333333%}.flex--12 .flex__item--md-11{flex-basis:91.6666666667%;max-width:91.6666666667%}.flex--12 .flex__item--md-12{flex-basis:100%;max-width:100%}.flex--12 .flex__offset--md-1{margin-left:8.3333333333%}.flex--12 .flex__offset--md-2{margin-left:16.6666666667%}.flex--12 .flex__offset--md-3{margin-left:25%}.flex--12 .flex__offset--md-4{margin-left:33.3333333333%}.flex--12 .flex__offset--md-5{margin-left:41.6666666667%}.flex--12 .flex__offset--md-6{margin-left:50%}.flex--12 .flex__offset--md-7{margin-left:58.3333333333%}.flex--12 .flex__offset--md-8{margin-left:66.6666666667%}.flex--12 .flex__offset--md-9{margin-left:75%}.flex--12 .flex__offset--md-10{margin-left:83.3333333333%}.flex--12 .flex__offset--md-11{margin-left:91.6666666667%}.flex--10 .flex__item--md-1{flex-basis:10%;max-width:10%}.flex--10 .flex__item--md-2{flex-basis:20%;max-width:20%}.flex--10 .flex__item--md-3{flex-basis:30%;max-width:30%}.flex--10 .flex__item--md-4{flex-basis:40%;max-width:40%}.flex--10 .flex__item--md-5{flex-basis:50%;max-width:50%}.flex--10 .flex__item--md-6{flex-basis:60%;max-width:60%}.flex--10 .flex__item--md-7{flex-basis:70%;max-width:70%}.flex--10 .flex__item--md-8{flex-basis:80%;max-width:80%}.flex--10 .flex__item--md-9{flex-basis:90%;max-width:90%}.flex--10 .flex__item--md-10{flex-basis:100%;max-width:100%}.flex--10 .flex__offset--md-1{margin-left:10%}.flex--10 .flex__offset--md-2{margin-left:20%}.flex--10 .flex__offset--md-3{margin-left:30%}.flex--10 .flex__offset--md-4{margin-left:40%}.flex--10 .flex__offset--md-5{margin-left:50%}.flex--10 .flex__offset--md-6{margin-left:60%}.flex--10 .flex__offset--md-7{margin-left:70%}.flex--10 .flex__offset--md-8{margin-left:80%}.flex--10 .flex__offset--md-9{margin-left:90%}.flex--md-start{justify-content:flex-start}.flex--md-center{justify-content:center}.flex--md-end{justify-content:flex-end}.flex--md-around{justify-content:space-around}.flex--md-between{justify-content:space-between}.flex--md-top{align-items:flex-start}.flex--md-middle{align-items:center}.flex--md-bottom{align-items:flex-end}.flex--md-first{order:-1}.flex--md-last{order:1}.flex__item--md-auto{flex:1 1 auto}.flex__item--md-grow{flex-grow:1}.flex__item--md-no-grow{flex-grow:0}.flex__item--md-shrink{flex-shrink:1}.flex__item--md-no-shrink{flex-shrink:0}.flex__item--md-none{flex:none}.flex--md-inline-flex{display:inline-flex}.flex--md-flex-nowrap{flex-wrap:nowrap}.flex--md-flex-wrap-rev{flex-wrap:wrap-reverse}.flex--md-horizontal-rev{flex-direction:column-reverse}.flex--md-vertical{flex-direction:column}.flex--md-vertical-rev{flex-direction:row-reverse}}@media(min-width: 1024px){.flex--12 .flex__item--lg-1{flex-basis:8.3333333333%;max-width:8.3333333333%}.flex--12 .flex__item--lg-2{flex-basis:16.6666666667%;max-width:16.6666666667%}.flex--12 .flex__item--lg-3{flex-basis:25%;max-width:25%}.flex--12 .flex__item--lg-4{flex-basis:33.3333333333%;max-width:33.3333333333%}.flex--12 .flex__item--lg-5{flex-basis:41.6666666667%;max-width:41.6666666667%}.flex--12 .flex__item--lg-6{flex-basis:50%;max-width:50%}.flex--12 .flex__item--lg-7{flex-basis:58.3333333333%;max-width:58.3333333333%}.flex--12 .flex__item--lg-8{flex-basis:66.6666666667%;max-width:66.6666666667%}.flex--12 .flex__item--lg-9{flex-basis:75%;max-width:75%}.flex--12 .flex__item--lg-10{flex-basis:83.3333333333%;max-width:83.3333333333%}.flex--12 .flex__item--lg-11{flex-basis:91.6666666667%;max-width:91.6666666667%}.flex--12 .flex__item--lg-12{flex-basis:100%;max-width:100%}.flex--12 .flex__offset--lg-1{margin-left:8.3333333333%}.flex--12 .flex__offset--lg-2{margin-left:16.6666666667%}.flex--12 .flex__offset--lg-3{margin-left:25%}.flex--12 .flex__offset--lg-4{margin-left:33.3333333333%}.flex--12 .flex__offset--lg-5{margin-left:41.6666666667%}.flex--12 .flex__offset--lg-6{margin-left:50%}.flex--12 .flex__offset--lg-7{margin-left:58.3333333333%}.flex--12 .flex__offset--lg-8{margin-left:66.6666666667%}.flex--12 .flex__offset--lg-9{margin-left:75%}.flex--12 .flex__offset--lg-10{margin-left:83.3333333333%}.flex--12 .flex__offset--lg-11{margin-left:91.6666666667%}.flex--10 .flex__item--lg-1{flex-basis:10%;max-width:10%}.flex--10 .flex__item--lg-2{flex-basis:20%;max-width:20%}.flex--10 .flex__item--lg-3{flex-basis:30%;max-width:30%}.flex--10 .flex__item--lg-4{flex-basis:40%;max-width:40%}.flex--10 .flex__item--lg-5{flex-basis:50%;max-width:50%}.flex--10 .flex__item--lg-6{flex-basis:60%;max-width:60%}.flex--10 .flex__item--lg-7{flex-basis:70%;max-width:70%}.flex--10 .flex__item--lg-8{flex-basis:80%;max-width:80%}.flex--10 .flex__item--lg-9{flex-basis:90%;max-width:90%}.flex--10 .flex__item--lg-10{flex-basis:100%;max-width:100%}.flex--10 .flex__offset--lg-1{margin-left:10%}.flex--10 .flex__offset--lg-2{margin-left:20%}.flex--10 .flex__offset--lg-3{margin-left:30%}.flex--10 .flex__offset--lg-4{margin-left:40%}.flex--10 .flex__offset--lg-5{margin-left:50%}.flex--10 .flex__offset--lg-6{margin-left:60%}.flex--10 .flex__offset--lg-7{margin-left:70%}.flex--10 .flex__offset--lg-8{margin-left:80%}.flex--10 .flex__offset--lg-9{margin-left:90%}.flex--lg-start{justify-content:flex-start}.flex--lg-center{justify-content:center}.flex--lg-end{justify-content:flex-end}.flex--lg-around{justify-content:space-around}.flex--lg-between{justify-content:space-between}.flex--lg-top{align-items:flex-start}.flex--lg-middle{align-items:center}.flex--lg-bottom{align-items:flex-end}.flex--lg-first{order:-1}.flex--lg-last{order:1}.flex__item--lg-auto{flex:1 1 auto}.flex__item--lg-grow{flex-grow:1}.flex__item--lg-no-grow{flex-grow:0}.flex__item--lg-shrink{flex-shrink:1}.flex__item--lg-no-shrink{flex-shrink:0}.flex__item--lg-none{flex:none}.flex--lg-inline-flex{display:inline-flex}.flex--lg-flex-nowrap{flex-wrap:nowrap}.flex--lg-flex-wrap-rev{flex-wrap:wrap-reverse}.flex--lg-horizontal-rev{flex-direction:column-reverse}.flex--lg-vertical{flex-direction:column}.flex--lg-vertical-rev{flex-direction:row-reverse}}@media(min-width: 1280px){.flex--12 .flex__item--xl-1{flex-basis:8.3333333333%;max-width:8.3333333333%}.flex--12 .flex__item--xl-2{flex-basis:16.6666666667%;max-width:16.6666666667%}.flex--12 .flex__item--xl-3{flex-basis:25%;max-width:25%}.flex--12 .flex__item--xl-4{flex-basis:33.3333333333%;max-width:33.3333333333%}.flex--12 .flex__item--xl-5{flex-basis:41.6666666667%;max-width:41.6666666667%}.flex--12 .flex__item--xl-6{flex-basis:50%;max-width:50%}.flex--12 .flex__item--xl-7{flex-basis:58.3333333333%;max-width:58.3333333333%}.flex--12 .flex__item--xl-8{flex-basis:66.6666666667%;max-width:66.6666666667%}.flex--12 .flex__item--xl-9{flex-basis:75%;max-width:75%}.flex--12 .flex__item--xl-10{flex-basis:83.3333333333%;max-width:83.3333333333%}.flex--12 .flex__item--xl-11{flex-basis:91.6666666667%;max-width:91.6666666667%}.flex--12 .flex__item--xl-12{flex-basis:100%;max-width:100%}.flex--12 .flex__offset--xl-1{margin-left:8.3333333333%}.flex--12 .flex__offset--xl-2{margin-left:16.6666666667%}.flex--12 .flex__offset--xl-3{margin-left:25%}.flex--12 .flex__offset--xl-4{margin-left:33.3333333333%}.flex--12 .flex__offset--xl-5{margin-left:41.6666666667%}.flex--12 .flex__offset--xl-6{margin-left:50%}.flex--12 .flex__offset--xl-7{margin-left:58.3333333333%}.flex--12 .flex__offset--xl-8{margin-left:66.6666666667%}.flex--12 .flex__offset--xl-9{margin-left:75%}.flex--12 .flex__offset--xl-10{margin-left:83.3333333333%}.flex--12 .flex__offset--xl-11{margin-left:91.6666666667%}.flex--10 .flex__item--xl-1{flex-basis:10%;max-width:10%}.flex--10 .flex__item--xl-2{flex-basis:20%;max-width:20%}.flex--10 .flex__item--xl-3{flex-basis:30%;max-width:30%}.flex--10 .flex__item--xl-4{flex-basis:40%;max-width:40%}.flex--10 .flex__item--xl-5{flex-basis:50%;max-width:50%}.flex--10 .flex__item--xl-6{flex-basis:60%;max-width:60%}.flex--10 .flex__item--xl-7{flex-basis:70%;max-width:70%}.flex--10 .flex__item--xl-8{flex-basis:80%;max-width:80%}.flex--10 .flex__item--xl-9{flex-basis:90%;max-width:90%}.flex--10 .flex__item--xl-10{flex-basis:100%;max-width:100%}.flex--10 .flex__offset--xl-1{margin-left:10%}.flex--10 .flex__offset--xl-2{margin-left:20%}.flex--10 .flex__offset--xl-3{margin-left:30%}.flex--10 .flex__offset--xl-4{margin-left:40%}.flex--10 .flex__offset--xl-5{margin-left:50%}.flex--10 .flex__offset--xl-6{margin-left:60%}.flex--10 .flex__offset--xl-7{margin-left:70%}.flex--10 .flex__offset--xl-8{margin-left:80%}.flex--10 .flex__offset--xl-9{margin-left:90%}.flex--xl-start{justify-content:flex-start}.flex--xl-center{justify-content:center}.flex--xl-end{justify-content:flex-end}.flex--xl-around{justify-content:space-around}.flex--xl-between{justify-content:space-between}.flex--xl-top{align-items:flex-start}.flex--xl-middle{align-items:center}.flex--xl-bottom{align-items:flex-end}.flex--xl-first{order:-1}.flex--xl-last{order:1}.flex__item--xl-auto{flex:1 1 auto}.flex__item--xl-grow{flex-grow:1}.flex__item--xl-no-grow{flex-grow:0}.flex__item--xl-shrink{flex-shrink:1}.flex__item--xl-no-shrink{flex-shrink:0}.flex__item--xl-none{flex:none}.flex--xl-inline-flex{display:inline-flex}.flex--xl-flex-nowrap{flex-wrap:nowrap}.flex--xl-flex-wrap-rev{flex-wrap:wrap-reverse}.flex--xl-horizontal-rev{flex-direction:column-reverse}.flex--xl-vertical{flex-direction:column}.flex--xl-vertical-rev{flex-direction:row-reverse}}.font-scale-1{font-size:.5625rem}.font-scale-2{font-size:.625rem}.font-scale-3{font-size:.75rem}.font-scale-4{font-size:.875rem}.font-scale-5{font-size:1rem}.font-scale-6{font-size:1.125rem}.font-scale-7{font-size:1.3125rem}.font-scale-8{font-size:1.5rem}.font-scale-9{font-size:1.6875rem}.font-scale-10{font-size:1.875rem}.font-scale-11{font-size:2.0625rem}.font-scale-12{font-size:2.25rem}.font-scale-13{font-size:2.5rem}.font-scale-14{font-size:2.75rem}.font-scale-15{font-size:3rem}.font-scale-16{font-size:3.25rem}.font-scale-17{font-size:3.5rem}.font-scale-18{font-size:3.75rem}@media(min-width: 480px){.font-scale-1{font-size:.5625rem}.font-scale-2{font-size:.625rem}.font-scale-3{font-size:.75rem}.font-scale-4{font-size:.875rem}.font-scale-5{font-size:1rem}.font-scale-6{font-size:1.125rem}.font-scale-7{font-size:1.3125rem}.font-scale-8{font-size:1.5rem}.font-scale-9{font-size:1.75rem}.font-scale-10{font-size:2rem}.font-scale-11{font-size:2.375rem}.font-scale-12{font-size:2.75rem}.font-scale-13{font-size:3.125rem}.font-scale-14{font-size:3.5rem}.font-scale-15{font-size:3.875rem}.font-scale-16{font-size:4.25rem}.font-scale-17{font-size:4.625rem}.font-scale-18{font-size:5rem}}@media(min-width: 768px){.font-scale-1{font-size:.625rem}.font-scale-2{font-size:.75rem}.font-scale-3{font-size:.875rem}.font-scale-4{font-size:1rem}.font-scale-5{font-size:1.125rem}.font-scale-6{font-size:1.25rem}.font-scale-7{font-size:1.5rem}.font-scale-8{font-size:1.75rem}.font-scale-9{font-size:2rem}.font-scale-10{font-size:2.5rem}.font-scale-11{font-size:3rem}.font-scale-12{font-size:3.5rem}.font-scale-13{font-size:4rem}.font-scale-14{font-size:4.5rem}.font-scale-15{font-size:5rem}.font-scale-16{font-size:5.5rem}.font-scale-17{font-size:6rem}.font-scale-18{font-size:6.5rem}}.line-height-scale-1{line-height:.875}.line-height-scale-2{line-height:1}.line-height-scale-3{line-height:1.125}.line-height-scale-4{line-height:1.25}.line-height-scale-5{line-height:1.375}.line-height-scale-6{line-height:1.5}.line-height-scale-7{line-height:1.625}.line-height-scale-8{line-height:1.75}.line-height-scale-9{line-height:1.875}.line-height-scale-10{line-height:2}.lp-text-react p,.lp-text-react h1,.lp-text-react h2,.lp-text-react h3{min-height:1em;white-space:pre-wrap}.lp-text-react p:empty:before,.lp-text-react h1:empty:before,.lp-text-react h2:empty:before,.lp-text-react h3:empty:before{content:" ";white-space:pre}p.gutter-bottom-1,.lp-list.gutter-bottom-1{margin-bottom:0em}p.gutter-bottom-2,.lp-list.gutter-bottom-2{margin-bottom:0.25em}p.gutter-bottom-3,.lp-list.gutter-bottom-3{margin-bottom:0.4375em}
52p.gutter-bottom-4,.lp-list.gutter-bottom-4{margin-bottom:0.5em}p.gutter-bottom-5,.lp-list.gutter-bottom-5{margin-bottom:0.5625em}p.gutter-bottom-6,.lp-list.gutter-bottom-6{margin-bottom:0.625em}p.gutter-bottom-7,.lp-list.gutter-bottom-7{margin-bottom:0.6875em}p.gutter-bottom-8,.lp-list.gutter-bottom-8{margin-bottom:0.75em}p.gutter-bottom-9,.lp-list.gutter-bottom-9{margin-bottom:0.8125em}p.gutter-bottom-10,.lp-list.gutter-bottom-10{margin-bottom:0.875em}p.gutter-bottom-11,.lp-list.gutter-bottom-11{margin-bottom:0.9375em}p.gutter-bottom-12,.lp-list.gutter-bottom-12{margin-bottom:1em}p.gutter-bottom-13,.lp-list.gutter-bottom-13{margin-bottom:1.25em}p.gutter-bottom-14,.lp-list.gutter-bottom-14{margin-bottom:1.5em}h1.gutter-bottom-1,h2.gutter-bottom-1,h3.gutter-bottom-1{padding-bottom:0em}h1.gutter-bottom-2,h2.gutter-bottom-2,h3.gutter-bottom-2{padding-bottom:0.25em}h1.gutter-bottom-3,h2.gutter-bottom-3,h3.gutter-bottom-3{padding-bottom:0.4375em}h1.gutter-bottom-4,h2.gutter-bottom-4,h3.gutter-bottom-4{padding-bottom:0.5em}h1.gutter-bottom-5,h2.gutter-bottom-5,h3.gutter-bottom-5{padding-bottom:0.5625em}h1.gutter-bottom-6,h2.gutter-bottom-6,h3.gutter-bottom-6{padding-bottom:0.625em}h1.gutter-bottom-7,h2.gutter-bottom-7,h3.gutter-bottom-7{padding-bottom:0.6875em}h1.gutter-bottom-8,h2.gutter-bottom-8,h3.gutter-bottom-8{padding-bottom:0.75em}h1.gutter-bottom-9,h2.gutter-bottom-9,h3.gutter-bottom-9{padding-bottom:0.8125em}h1.gutter-bottom-10,h2.gutter-bottom-10,h3.gutter-bottom-10{padding-bottom:0.875em}h1.gutter-bottom-11,h2.gutter-bottom-11,h3.gutter-bottom-11{padding-bottom:0.9375em}h1.gutter-bottom-12,h2.gutter-bottom-12,h3.gutter-bottom-12{padding-bottom:1em}h1.gutter-bottom-13,h2.gutter-bottom-13,h3.gutter-bottom-13{padding-bottom:1.25em}h1.gutter-bottom-14,h2.gutter-bottom-14,h3.gutter-bottom-14{padding-bottom:1.5em}.lp-button{text-decoration:none}.is-bold{font-weight:700}.is-italic{font-style:italic}.is-strikethrough{text-decoration:line-through}.is-underline,.is-underline label{text-decoration:underline}.is-strikethrough.is-underline{text-decoration:line-through underline}.text-align-left{text-align:left}.text-align-right{text-align:right}.text-align-center{text-align:center}.lp-list{list-style:none;margin:0;padding:0}.lp-list.text-align-left li{padding-left:24px}.lp-list.text-align-left li::before{position:absolute}.lp-list.text-align-left.lp-list--numbered li{padding-left:30px}.lp-list.text-align-left.lp-list--icon li{padding-left:1.5em}.lp-list li{position:relative;width:100%;white-space:pre-wrap}.lp-list li:not(:last-child){margin-bottom:.5em}.lp-list li::before{display:inline-block;font-size:1em;font-weight:700}.lp-list--numbered{counter-reset:numbered}.lp-list--numbered.text-align-left li::before{left:-3px;top:1px}.lp-list--numbered.text-align-center li::before,.lp-list--numbered.text-align-right li::before{margin-right:10px}.lp-list--numbered li{counter-increment:numbered}.lp-list--numbered li::before{content:counter(numbered)}.lp-list--bullet.text-align-center li,.lp-list--bullet.text-align-right li{padding-left:12px}.lp-list--bullet li::before{content:"â¢";text-align:center;transform:scale(1.5);transform-origin:center right}.lp-list--checkmark.text-align-left li{padding-left:20px}.lp-list--checkmark.text-align-left li::before{left:2px;top:2px}.lp-list--checkmark.text-align-center li::before,.lp-list--checkmark.text-align-right li::before{transform:translateY(-3px)}.lp-list--checkmark li::before{content:"ï";font-family:"Font Awesome 5 Free";font-weight:900;transform:scale(0.85)}.lp-list--icon.text-align-center li::before,.lp-list--icon.text-align-right li::before{transform:translateY(-3px)}.lp-list--checkmark.text-align-left.font-scale-1 li{padding-left:15px}.lp-list--checkmark.text-align-left.font-scale-1 li::before{left:-4px}.lp-list--checkmark.text-align-left.font-scale-2 li{padding-left:15px}.lp-list--checkmark.text-align-left.font-scale-2 li::before{left:-4px}.lp-list--checkmark.text-align-left.font-scale-3 li{padding-left:15px}.lp-list--checkmark.text-align-left.font-scale-3 li::before{left:-4px}.lp-list--checkmark.text-align-left.font-scale-4 li::before{left:-6px}.lp-list--checkmark.text-align-left.font-scale-5 li::before{left:-6px}.lp-list--checkmark.text-align-left.font-scale-6 li::before{left:-6px}.lp-list--checkmark.text-align-left.font-scale-7 li{padding-left:25px}.lp-list--checkmark.text-align-left.font-scale-7 li::before{left:-10px}.lp-list--checkmark.text-align-left.font-scale-8 li{padding-left:25px}.lp-list--checkmark.text-align-left.font-scale-8 li::before{left:-10px}.lp-list--checkmark.text-align-left.font-scale-9 li{padding-left:25px}.lp-list--checkmark.text-align-left.font-scale-9 li::before{left:-10px}.lp-list--checkmark.text-align-left.font-scale-10 li{padding-left:25px}.lp-list--checkmark.text-align-left.font-scale-10 li::before{left:-10px}.lp-list--checkmark.text-align-left.font-scale-10 li{padding-left:35px}.lp-list--checkmark.text-align-left.font-scale-11 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-11 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-12 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-12 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-13 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-13 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-14 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-14 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-15 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-15 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-16 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-16 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-17 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-17 li::before{left:-0.1em}.lp-list--checkmark.text-align-left.font-scale-18 li{padding-left:1.05em}.lp-list--checkmark.text-align-left.font-scale-18 li::before{left:-0.1em}.lp-list--bullet.text-align-left.font-scale-1 li{padding-left:15px}.lp-list--bullet.text-align-left.font-scale-1 li::before{top:2px;left:-2px}.lp-list--bullet.text-align-left.font-scale-2 li{padding-left:15px}.lp-list--bullet.text-align-left.font-scale-2 li::before{top:2px;left:-2px}.lp-list--bullet.text-align-left.font-scale-3 li{padding-left:15px}.lp-list--bullet.text-align-left.font-scale-3 li::before{top:2px;left:-2px}.lp-list--bullet.text-align-left.font-scale-4 li{padding-left:20px}.lp-list--bullet.text-align-left.font-scale-4 li::before{left:0}.lp-list--bullet.text-align-left.font-scale-5 li{padding-left:20px}.lp-list--bullet.text-align-left.font-scale-5 li::before{left:0}.lp-list--bullet.text-align-left.font-scale-6 li{padding-left:20px}.lp-list--bullet.text-align-left.font-scale-6 li::before{left:0}.lp-list--bullet.text-align-left.font-scale-7 li::before{left:2px}.lp-list--bullet.text-align-left.font-scale-8 li::before{left:2px}.lp-list--bullet.text-align-left.font-scale-9 li::before{left:2px}.lp-list--bullet.text-align-left.font-scale-10 li{padding-left:35px}.lp-list--bullet.text-align-left.font-scale-10 li::before{left:6px}.lp-list--bullet.text-align-left.font-scale-11 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-11 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-12 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-12 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-13 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-13 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-14 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-14 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-15 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-15 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-16 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-16 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-17 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-17 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--bullet.text-align-left.font-scale-18 li{padding-left:1.05em}.lp-list--bullet.text-align-left.font-scale-18 li::before{left:.25em;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-1 li{padding-left:15px}.lp-list--numbered.text-align-left.font-scale-1 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-1 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-2 li{padding-left:15px}.lp-list--numbered.text-align-left.font-scale-2 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-2 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-3 li{padding-left:15px}.lp-list--numbered.text-align-left.font-scale-3 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-3 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-4 li{padding-left:20px}.lp-list--numbered.text-align-left.font-scale-4 li:nth-child(n+10){padding-left:30px}.lp-list--numbered.text-align-left.font-scale-4 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-5 li{padding-left:20px}.lp-list--numbered.text-align-left.font-scale-5 li:nth-child(n+10){padding-left:30px}.lp-list--numbered.text-align-left.font-scale-5 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-6 li{padding-left:20px}.lp-list--numbered.text-align-left.font-scale-6 li:nth-child(n+10){padding-left:30px}.lp-list--numbered.text-align-left.font-scale-6 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-7 li{padding-left:25px}.lp-list--numbered.text-align-left.font-scale-7 li:nth-child(n+10){padding-left:45px}.lp-list--numbered.text-align-left.font-scale-7 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-8 li{padding-left:25px}.lp-list--numbered.text-align-left.font-scale-8 li:nth-child(n+10){padding-left:45px}.lp-list--numbered.text-align-left.font-scale-8 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-9 li{padding-left:25px}.lp-list--numbered.text-align-left.font-scale-9 li:nth-child(n+10){padding-left:45px}.lp-list--numbered.text-align-left.font-scale-9 li::before{left:-3px}.lp-list--numbered.text-align-left.font-scale-10 li{padding-left:35px}.lp-list--numbered.text-align-left.font-scale-10 li:nth-child(n+10){padding-left:60px}.lp-list--numbered.text-align-left.font-scale-10 li::before{left:-2px}.lp-list--numbered.text-align-left.font-scale-11 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-11 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-11 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-12 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-12 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-12 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-13 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-13 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-13 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-14 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-14 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-14 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-15 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-15 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-15 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-16 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-16 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-16 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-17 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-17 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-17 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--numbered.text-align-left.font-scale-18 li{padding-left:1.05em}.lp-list--numbered.text-align-left.font-scale-18 li:nth-child(n+10){padding-left:1.625em}.lp-list--numbered.text-align-left.font-scale-18 li::before{left:-2px;line-height:.75em;top:.18em}.lp-list--icon.text-align-left li::before{left:-6px}.lp-list--icon.text-align-left.font-scale-1 li{padding-left:20px}.lp-list--icon.text-align-left.font-scale-2 li{padding-left:20px}.lp-list--icon.text-align-left.font-scale-3 li{padding-left:20px}.lp-list--icon.text-align-left.font-scale-7 li{padding-left:40px}.lp-list--icon.text-align-left.font-scale-8 li{padding-left:40px}.lp-list--icon.text-align-left.font-scale-9 li{padding-left:40px}.lp-list--icon.text-align-left.font-scale-10 li{padding-left:40px}.lp-list--icon.text-align-left.font-scale-10 li{padding-left:55px}.lp-list--icon.text-align-left.font-scale-11 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-12 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-13 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-14 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-15 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-16 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-17 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-18 li::before{left:-5px}@media(max-width: 480px){.lp-list--checkmark.text-align-left.font-scale-7 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-8 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-9 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-10 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-11 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-12 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-13 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-14 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-15 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-16 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-17 li::before{left:-5px}.lp-list--checkmark.text-align-left.font-scale-18 li::before{left:-5px}.lp-list--numbered.text-align-left.font-scale-1 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-2 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-3 li:nth-child(n+10){padding-left:20px}.lp-list--numbered.text-align-left.font-scale-4 li:nth-child(n+10){padding-left:25px}.lp-list--numbered.text-align-left.font-scale-5 li:nth-child(n+10){padding-left:25px}.lp-list--numbered.text-align-left.font-scale-6 li:nth-child(n+10){padding-left:25px}.lp-list--numbered.text-align-left.font-scale-7 li:nth-child(n+10){padding-left:35px}.lp-list--numbered.text-align-left.font-scale-8 li:nth-child(n+10){padding-left:35px}.lp-list--numbered.text-align-left.font-scale-9 li:nth-child(n+10){padding-left:35px}.lp-list--numbered.text-align-left.font-scale-10 li:nth-child(n+10){padding-left:40px}.lp-list--icon.text-align-left.font-scale-7 li{padding-left:28px}.lp-list--icon.text-align-left.font-scale-7 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-8 li{padding-left:28px}.lp-list--icon.text-align-left.font-scale-8 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-9 li{padding-left:28px}.lp-list--icon.text-align-left.font-scale-9 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-10 li{padding-left:35px}.lp-list--icon.text-align-left.font-scale-11 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-11 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-12 li{padding-left:1.25em}.lp-l
52ist--icon.text-align-left.font-scale-12 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-13 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-13 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-14 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-14 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-15 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-15 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-16 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-16 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-17 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-17 li::before{left:-5px}.lp-list--icon.text-align-left.font-scale-18 li{padding-left:1.25em}.lp-list--icon.text-align-left.font-scale-18 li::before{left:-5px}}[data-widget-type=lp-image-text] .composite-box,[data-widget-type=lp-calendar-text] .composite-box{align-items:stretch}[data-widget-type=lp-image-text] .composite-column-compose,[data-widget-type=lp-calendar-text] .composite-column-compose{display:flex}[data-widget-type=lp-image-text] .layout-TC .composite-column-compose,[data-widget-type=lp-image-text] .layout-BC .composite-column-compose,[data-widget-type=lp-calendar-text] .layout-TC .composite-column-compose,[data-widget-type=lp-calendar-text] .layout-BC .composite-column-compose{flex-direction:column}[data-widget-type=lp-image-text] .layout-TR .composite-row-compose,[data-widget-type=lp-image-text] .layout-CR .composite-row-compose,[data-widget-type=lp-image-text] .layout-BR .composite-row-compose,[data-widget-type=lp-image-text] .layout-TL .composite-row-compose,[data-widget-type=lp-image-text] .layout-CL .composite-row-compose,[data-widget-type=lp-image-text] .layout-BL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-TR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-CR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-BR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-TL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-CL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-BL .composite-row-compose{flex:1 1 100%;flex-direction:row}[data-widget-type=lp-image-text] .layout-TR .composite-row-compose,[data-widget-type=lp-image-text] .layout-TL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-TR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-TL .composite-row-compose{align-items:flex-start}[data-widget-type=lp-image-text] .layout-CR .composite-row-compose,[data-widget-type=lp-image-text] .layout-CL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-CR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-CL .composite-row-compose{align-items:center}[data-widget-type=lp-image-text] .layout-BR .composite-row-compose,[data-widget-type=lp-image-text] .layout-BL .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-BR .composite-row-compose,[data-widget-type=lp-calendar-text] .layout-BL .composite-row-compose{align-items:flex-end}@media(max-width: 767px){.section .composite{padding:8px}}.leadbox .section,.leadbox .page>section{padding:initial}@media(max-width: 479px){.inner-column{padding:8px}}@media(min-width: 480px)and (max-width: 767px){.inner-column{padding:12px}}/*# sourceMappingURL=page-styles.css.map *//*!* animate.css - https://animate.style/* Version - 4.1.5* Licensed under the MIT license - https://opensource.org/licenses/MIT** Copyright (c) 2024 Animate.css*/:root{--animate-duration:1s;--animate-delay:1s;--animate-repeat:1}.lp-animate__animated{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-duration:var(--animate-duration);animation-duration:var(--animate-duration);-webkit-animation-fill-mode:both;animation-fill-mode:both}.lp-animate__animated.lp-animate__infinite{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.lp-animate__animated.lp-animate__repeat-1{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-iteration-count:var(--animate-repeat);animation-iteration-count:var(--animate-repeat)}.lp-animate__animated.lp-animate__repeat-2{-webkit-animation-iteration-count:2;animation-iteration-count:2;-webkit-animation-iteration-count:calc(var(--animate-repeat)*2);animation-iteration-count:calc(var(--animate-repeat)*2)}.lp-animate__animated.lp-animate__repeat-3{-webkit-animation-iteration-count:3;animation-iteration-count:3;-webkit-animation-iteration-count:calc(var(--animate-repeat)*3);animation-iteration-count:calc(var(--animate-repeat)*3)}.lp-animate__animated.lp-animate__delay-1s{-webkit-animation-delay:1s;animation-delay:1s;-webkit-animation-delay:var(--animate-delay);animation-delay:var(--animate-delay)}.lp-animate__animated.lp-animate__delay-2s{-webkit-animation-delay:2s;animation-delay:2s;-webkit-animation-delay:calc(var(--animate-delay)*2);animation-delay:calc(var(--animate-delay)*2)}
52.lp-animate__animated.lp-animate__delay-3s{-webkit-animation-delay:3s;animation-delay:3s;-webkit-animation-delay:calc(var(--animate-delay)*3);animation-delay:calc(var(--animate-delay)*3)}.lp-animate__animated.lp-animate__delay-4s{-webkit-animation-delay:4s;animation-delay:4s;-webkit-animation-delay:calc(var(--animate-delay)*4);animation-delay:calc(var(--animate-delay)*4)}.lp-animate__animated.lp-animate__delay-5s{-webkit-animation-delay:5s;animation-delay:5s;-webkit-animation-delay:calc(var(--animate-delay)*5);animation-delay:calc(var(--animate-delay)*5)}.lp-animate__animated.lp-animate__faster{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-duration:calc(var(--animate-duration)/2);animation-duration:calc(var(--animate-duration)/2)}.lp-animate__animated.lp-animate__fast{-webkit-animation-duration:.8s;animation-duration:.8s;-webkit-animation-duration:calc(var(--animate-duration)*.8);animation-duration:calc(var(--animate-duration)*.8)}.lp-animate__animated.lp-animate__slow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-duration:calc(var(--animate-duration)*2);animation-duration:calc(var(--animate-duration)*2)}.lp-animate__animated.lp-animate__slower{-webkit-animation-duration:3s;animation-duration:3s;-webkit-animation-duration:calc(var(--animate-duration)*3);animation-duration:calc(var(--animate-duration)*3)}@media (prefers-reduced-motion:reduce),print{.lp-animate__animated{-webkit-animation-duration:1ms!important;animation-duration:1ms!important;-webkit-animation-iteration-count:1!important;animation-iteration-count:1!important;-webkit-transition-duration:1ms!important;transition-duration:1ms!important}.lp-animate__animated[class*=Out]{opacity:0}}@-webkit-keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes pulse{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}50%{-webkit-transform:scale3d(1.05,1.05,1.05);transform:scale3d(1.05,1.05,1.05)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.lp-animate__pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes headShake{0%{-webkit-transform:translateX(0);transform:translateX(0)}6.5%{-webkit-transform:translateX(-6px) rotateY(-9deg);transform:translateX(-6px) rotateY(-9deg)}18.5%{-webkit-transform:translateX(5px) rotateY(7deg);transform:translateX(5px) rotateY(7deg)}31.5%{-webkit-transform:translateX(-3px) rotateY(-5deg);transform:translateX(-3px) rotateY(-5deg)}43.5%{-webkit-transform:translateX(2px) rotateY(3deg);transform:translateX(2px) rotateY(3deg)}50%{-webkit-transform:translateX(0);transform:translateX(0)}}.lp-animate__headShake{-webkit-animation-name:headShake;animation-name:headShake;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes heartBeat{0%{-webkit-transform:scale(1);transform:scale(1)}14%{-webkit-transform:scale(1.3);transform:scale(1.3)}28%{-webkit-transform:scale(1);transform:scale(1)}42%{-webkit-transform:scale(1.3);transform:scale(1.3)}70%{-webkit-transform:scale(1);transform:scale(1)}}.lp-animate__heartBeat{-webkit-animation-duration:1.3s;animation-duration:1.3s;-webkit-animation-duration:calc(var(--animate-duration)*1.3);animation-duration:calc(var(--animate-duration)*1.3);-webkit-animation-name:heartBeat;animation-name:heartBeat;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}@-webkit-keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}
5260%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes wobble{0%{-webkit-transform:translateZ(0);transform:translateZ(0)}15%{-webkit-transform:translate3d(-25%,0,0) rotate(-5deg);transform:translate3d(-25%,0,0) rotate(-5deg)}30%{-webkit-transform:translate3d(20%,0,0) rotate(3deg);transform:translate3d(20%,0,0) rotate(3deg)}45%{-webkit-transform:translate3d(-15%,0,0) rotate(-3deg);transform:translate3d(-15%,0,0) rotate(-3deg)}60%{-webkit-transform:translate3d(10%,0,0) rotate(2deg);transform:translate3d(10%,0,0) rotate(2deg)}75%{-webkit-transform:translate3d(-5%,0,0) rotate(-1deg);transform:translate3d(-5%,0,0) rotate(-1deg)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__wobble{-webkit-animation-name:wobble;animation-name:wobble}@-webkit-keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.lp-animate__flash{-webkit-animation-name:flash;animation-name:flash}@-webkit-keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes rubberBand{0%{-webkit-transform:scaleX(1);transform:scaleX(1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}to{-webkit-transform:scaleX(1);transform:scaleX(1)}}.lp-animate__rubberBand{-webkit-animation-name:rubberBand;animation-name:rubberBand}@-webkit-keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes bounceIn{0%,20%,40%,60%,80%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}to{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}.lp-animate__bounceIn{-webkit-animation-duration:.75s;animation-duration:.75s;-webkit-animation-duration:calc(var(--animate-duration)*.75);animation-duration:calc(var(--animate-duration)*.75);-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0) scaleY(3);transform:translate3d(0,-3000px,0) scaleY(3)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0) scaleY(.9);transform:translate3d(0,25px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,-10px,0) scaleY(.95);transform:translate3d(0,-10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,5px,0) scaleY(.985);transform:translate3d(0,5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInDown{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,-3000px,0) scaleY(3);transform:translate3d(0,-3000px,0) scaleY(3)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0) scaleY(.9);transform:translate3d(0,25px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,-10px,0) scaleY(.95);transform:translate3d(0,-10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,5px,0) scaleY(.985);transform:translate3d(0,5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__bounceInDown{-webkit-animation-name:bounceInDown;animation-name:bounceInDown}@-webkit-keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0) scaleX(3);transform:translate3d(-3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0) scaleX(1);transform:translate3d(25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(-10px,0,0) scaleX(.98);transform:translate3d(-10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(5px,0,0) scaleX(.995);transform:translate3d(5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInLeft{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(-3000px,0,0) scaleX(3);transform:translate3d(-3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0) scaleX(1);transform:translate3d(25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(-10px,0,0) scaleX(.98);transform:translate3d(-10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(5px,0,0) scaleX(.995);transform:translate3d(5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__bounceInLeft{-webkit-animation-name:bounceInLeft;animation-name:bounceInLeft}@-webkit-keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0) scaleX(3);transform:translate3d(3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0) scaleX(1);transform:translate3d(-25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(10px,0,0) scaleX(.98);transform:translate3d(10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(-5px,0,0) scaleX(.995);transform:translate3d(-5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInRight{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(3000px,0,0) scaleX(3);transform:translate3d(3000px,0,0) scaleX(3)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0) scaleX(1);transform:translate3d(-25px,0,0) scaleX(1)}75%{-webkit-transform:translate3d(10px,0,0) scaleX(.98);transform:translate3d(10px,0,0) scaleX(.98)}90%{-webkit-transform:translate3d(-5px,0,0) scaleX(.995);transform:translate3d(-5px,0,0) scaleX(.995)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__bounceInRight{-webkit-animation-name:bounceInRight;animation-name:bounceInRight}@-webkit-keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0) scaleY(5);transform:translate3d(0,3000px,0) scaleY(5)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,10px,0) scaleY(.95);transform:translate3d(0,10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-5px,0) scaleY(.985);transform:translate3d(0,-5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes bounceInUp{0%,60%,75%,90%,to{-webkit-animation-timing-function:cubic-bezier(.215,.61,.355,1);animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;-webkit-transform:translate3d(0,3000px,0) scaleY(5);transform:translate3d(0,3000px,0) scaleY(5)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0) scaleY(.9);transform:translate3d(0,-20px,0) scaleY(.9)}75%{-webkit-transform:translate3d(0,10px,0) scaleY(.95);transform:translate3d(0,10px,0) scaleY(.95)}90%{-webkit-transform:translate3d(0,-5px,0) scaleY(.985);transform:translate3d(0,-5px,0) scaleY(.985)}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__bounceInUp{-webkit-animation-name:bounceInUp;animation-name:bounceInUp}@-webkit-keyframes fadeIn{0%{opacity:0}
52to{opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.lp-animate__fadeIn{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__fadeInDown{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__fadeInLeft{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__fadeInRight{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}to{opacity:1;-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__fadeInUp{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}@-webkit-keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInDown{0%{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__slideInDown{-webkit-animation-name:slideInDown;animation-name:slideInDown}@-webkit-keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInLeft{0%{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__slideInLeft{-webkit-animation-name:slideInLeft;animation-name:slideInLeft}@-webkit-keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInRight{0%{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__slideInRight{-webkit-animation-name:slideInRight;animation-name:slideInRight}@-webkit-keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}@keyframes slideInUp{0%{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0);visibility:visible}to{-webkit-transform:translateZ(0);transform:translateZ(0)}}.lp-animate__slideInUp{-webkit-animation-name:slideInUp;animation-name:slideInUp}@-webkit-keyframes backInDown{0%{opacity:.7;-webkit-transform:translateY(-1200px) scale(.7);transform:translateY(-1200px) scale(.7)}80%{opacity:.7;-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes backInDown{0%{opacity:.7;-webkit-transform:translateY(-1200px) scale(.7);transform:translateY(-1200px) scale(.7)}80%{opacity:.7;-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.lp-animate__backInDown{-webkit-animation-name:backInDown;animation-name:backInDown}@-webkit-keyframes backInLeft{0%{opacity:.7;-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7)}80%{opacity:.7;-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes backInLeft{0%{opacity:.7;-webkit-transform:translateX(-2000px) scale(.7);transform:translateX(-2000px) scale(.7)}80%{opacity:.7;-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.lp-animate__backInLeft{-webkit-animation-name:backInLeft;animation-name:backInLeft}@-webkit-keyframes backInRight{0%{opacity:.7;-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7)}80%{opacity:.7;-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes backInRight{0%{opacity:.7;-webkit-transform:translateX(2000px) scale(.7);transform:translateX(2000px) scale(.7)}80%{opacity:.7;-webkit-transform:translateX(0) scale(.7);transform:translateX(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.lp-animate__backInRight{-webkit-animation-name:backInRight;animation-name:backInRight}@-webkit-keyframes backInUp{0%{opacity:.7;-webkit-transform:translateY(1200px) scale(.7);transform:translateY(1200px) scale(.7)}80%{opacity:.7;-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes backInUp{0%{opacity:.7;-webkit-transform:translateY(1200px) scale(.7);transform:translateY(1200px) scale(.7)}80%{opacity:.7;-webkit-transform:translateY(0) scale(.7);transform:translateY(0) scale(.7)}to{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.lp-animate__backInUp{-webkit-animation-name:backInUp;animation-name:backInUp}/* User Created Custom CSS */.css-ayfcnk {/* Junta ligeramente las letras en los párrafos */letter-spacing: -1px;line-height: 30%;/* Ajusta el espacio entre las palabras */word-spacing: 4px;}/* End Custom CSS */ 53 </style> 54 <meta name="page-analytics-property" content="9RTgfvkJ8wrkXvsbGehCBV-default-prop"> 55 56
56<script type="text/javascript"> 57 (function(a,c,d,b,e,f){a[d]=b;a[b]||(a[b]=function(){a[b].q=a[b].q||[];a[b].q.push(arguments)},d=c.createElement(e),d.async=!0,d.src=f,c=c.getElementsByTagName(e)[0],c.parentNode.insertBefore(d,c))})(window,document,"LeadPagesCenterObject","center","script","https://js.center.io/center.js"); 58 center('create', '9RTgfvkJ8wrkXvsbGehCBV-default-prop', '9RTgfvkJ8wrkXvsbGehCBV-default-prop', {customId: 'lp-BjB8QSSjTtjFQnZfmxEXc2'}); 59 center('send', 'view', 'leadpage', 'BjB8QSSjTtjFQnZfmxEXc2'); 60 </script>
60 61 62 <style id="htmlpub-migrated-fonts"> 63@font-face{font-family:'DrukTextWide';src:url(/api/library/wdiya6kfnfkydgp6fa235lpj) format('woff2'),url(/api/library/nvn1eudafkhkfy30o4qy3h2o) format('woff');font-weight:400;font-style:normal;font-display:swap;} 64@font-face{font-family:'NHaasGroteskDSPro';src:url(/api/library/sdpf7eoa2z22lhd194a1xlri) format('woff2'),url(/api/library/vf98p83ashwapb04cej4x7p0) format('woff');font-weight:400;font-style:normal;font-display:swap;} 65@font-face{font-family:'NHaasGroteskDSPro';src:url(/api/library/h9j9l3e25p8iq21zgnukdt4q) format('woff2'),url(/api/library/ta4cwfn0bfk1car3oiqe6fm7) format('woff');font-weight:700;font-style:normal;font-display:swap;} 66@font-face{font-family:'DrukTextWide';src:url(/api/library/wdiya6kfnfkydgp6fa235lpj) format('woff2'),url(/api/library/nvn1eudafkhkfy30o4qy3h2o) format('woff');font-weight:400;font-style:normal;font-display:swap;} 67@font-face{font-family:'DrukTextWide';src:url(/api/library/wdiya6kfnfkydgp6fa235lpj) format('woff2'),url(/api/library/nvn1eudafkhkfy30o4qy3h2o) format('woff');font-weight:400;font-style:normal;font-display:swap;} 68</style> 69</head> 70 <body><a href="https://pages.lpcontent.net/cdn-cgi/content?id=MqY63mN2CdC8ksHkIWLl1nMOkD.yEPWXkrpjUektEzg-1790961631.5307314-1.2.1.1-uXr7iGzdZI4JXNtM_8ElF.Qx1tjdxFs8T3x0A211zyNQRgC7Xno3sjOGx1fDc5Kc" aria-hidden="true" rel="nofollow noopener" style="display: none !important; visibility: hidden !important"></a> 71 72 <div class="page-background has-background-image" data-background="/api/library/cpkc1uqn7ekefxv999mcxlpy"></div> 73 <style data-emotion-css="9cvixd r2ag0e 119qg5r 2jofpk 15c2jr8 1k461u6">.page-background{position:fixed;height:100vh;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:rgb(0,0,0);background-size:cover;background-position:center center;background-size:cover;background-position:center center;background-repeat:no-repeat;background-image:linear-gradient(rgba(0,0,0,0), rgba(0,0,0,0)),url(/api/library/cpkc1uqn7ekefxv999mcxlpy);-webkit-transform:translateZ(0);-ms-transform:translateZ(0);transform:translateZ(0);}section{margin:0 auto;}.container{max-width:1140px;}@media (min-width:calc(1140px / 16)em){.widget{padding:calc(1140px / 100);}}h1{color:rgba(0,0,0,1);font-family:"Roboto",sans-serif;font-weight:bold;font-style:normal;}h2{color:rgba(0,0,0,1);font-family:"Roboto",sans-serif;font-weight:normal;font-style:normal;}h3{color:rgba(0,0,0,1);font-family:"Roboto Condensed",sans-serif;font-weight:bold;font-style:normal;}p{color:rgba(0,0,0,1);font-family:"Roboto",sans-serif;font-weight:normal;font-style:normal;}ul{color:rgba(0,0,0,1);font-family:"Roboto",sans-serif;font-weight:normal;font-style:normal;}h1{font-size:2.5rem;}h2{font-size:1.5rem;}h3{font-size:1rem;}p{font-size:1.125rem;}ul{font-size:1.125rem;}.lp-list.lp-list--bullet.text-align-left li::before{left:0;}.lp-list.lp-list--bullet.text-align-left li{padding-left:20px;}.lp-list.lp-list--numbered.text-align-left li::before{left:-3px;}.lp-list.lp-list--numbered.text-align-left li{padding-left:20px;}.lp-list.lp-list--numbered.text-align-left li:nth-child(n + 10){padding-left:30px;}@media only screen and (max-width:480px){.lp-list.lp-list--numbered.text-align-left li:nth-child(n + 10){padding-left:25px;}}.lp-list.lp-list--icon.text-align-left li::before{left:-6px;}.lp-list.lp-list--checkmark.text-align-left li::before{left:-6px;}h1{padding-bottom:0.5625em;}h2{padding-bottom:0.4375em;}h3{padding-bottom:0em;}p{margin-bottom:0em;}p,.lp-list{margin-bottom:0em;}ul{margin-bottom:0em;}h1{line-height:1.125;}h2{line-height:1.375;}h3{line-height:1.125;}p{line-height:1.125;}ul{line-height:1.125;}@media (min-width:480px){h1{font-size:2rem;}}@media (min-width:768px){h1{font-size:2.5rem;}}@media (min-width:480px){h2{font-size:1.3125rem;}}@media (min-width:768px){h2{font-size:1.5rem;}}@media (min-width:480px){h3{font-size:0.875rem;}}@media (min-width:768px){h3{font-size:1rem;}}@media (min-width:480px){p{font-size:1rem;}}@media (min-width:768px){p{font-size:1.125rem;}}@media (min-width:480px){ul{font-size:1rem;}}@media (min-width:768px){ul{font-size:1.125rem;}}.lp-alert,.lp-calendar-react .date,.lp-calendar-react .month,.lp-form-v2-input-react{font-family:"Roboto",sans-serif;}.lp-form-v2-input-react{color:rgba(0,0,0,1);}</style><style data-emotion-css="1o3acgz">.css-1o3acgz{background-image:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0)),url(undefined);}</style><div class="page css-1o3acgz"><style data-emotion-css="o1b4gw">.css-o1b4gw{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-o1b4gw > .container{padding-top:2vw;padding-right:8vw;padding-bottom:2vw;padding-left:8vw;padding-top:2cqw;padding-right:8cqw;padding-bottom:2cqw;padding-left:8cqw;}.site-header .css-o1b4gw > .container{padding-top:5px;padding-right:0;padding-bottom:5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-o1b4gw{padding:0 50px;}@media (max-width:23.75em){.bar .css-o1b4gw{padding:0 25px;}}@media (min-width:71.25em){.css-o1b4gw > .container{padding-top:22.8px;padding-right:91.2px;padding-bottom:22.8px;padding-left:91.2px;}}</style><section class="hidden-mobile section css-o1b4gw" data-guid="b8af5668-5098-8648-9ad7-20892348a6ad"><div class="container" id="about-1-copy-copy-copy-copy-copy-copy"><div class="layout flex flex--12" data-guid="8aa3cf38-7cd5-92cc-bdb8-2d9dd6b87358"><style data-emotion-css="vfaad">.css-vfaad{padding-top:0vw;padding-right:0vw;padding-bottom:0vw;padding-left:0vw;padding-top:0cqw;padding-right:0cqw;padding-bottom:0cqw;padding-left:0cqw;}@media(min-width:71.25em){.css-vfaad.column{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}.css-vfaad.column > .inner-column{padding-top:11.4px;padding-right:11.4px;padding-bottom:11.4px;padding-left:11.4px;}}</style><div class="column flex__item--md-12 flex__item--xs-12 css-vfaad" data-guid="9e921758-91b3-00a8-87bd-e77821aabde7"><style data-emotion-css="eeduzr">.css-eeduzr{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);border-radius:0px;background-size:cover;background-position:center center;background-repeat:no-repeat;padding-top:1vw;padding-right:1vw;padding-bottom:1vw;padding-left:1vw;padding-top:1cqw;padding-right:1cqw;padding-bottom:1cqw;padding-left:1cqw;}.bar .css-eeduzr{padding-top:0;padding-bottom:0;}</style><div class="inner-column css-eeduzr"><style data-emotion-css="47r3vg">.section--center-widgets .css-47r3vg{-webkit-box-pack:center;
73-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;}@media (max-width:767px){.bar .css-47r3vg{-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;}}</style><div class="row flex flex--10 css-47r3vg"><style data-emotion-css="8x0d4x">.section--center-widgets .css-8x0d4x{-webkit-flex-basis:auto;-ms-flex-preferred-size:auto;flex-basis:auto;max-width:100%;}</style><div class="composite flex__item--md-2 flex__item--xs-10 css-8x0d4x"><div class="inner-composite flex flex--2"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="82b86b69-741b-9698-2b38-51f8d46df8a8" class="widget"><style data-emotion-css="y13kug">.css-y13kug{position:relative;z-index:0;text-align:center;}</style><div class="lp-button-react-wrapper css-y13kug" data-widget-type="LpButtonReact"><style data-emotion-css="ayfcnk">.css-ayfcnk{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;border-style:solid;border-width:1px;text-align:center;font-family:'Lato',sans-serif;text-shadow:none;-webkit-transition:color 0.2s linear,background 0.2s linear,border-color 0.2s linear, text-shadow 0.2s linear;transition:color 0.2s linear,background 0.2s linear,border-color 0.2s linear, text-shadow 0.2s linear;-webkit-text-decoration:none;text-decoration:none;position:relative;width:100%;font-weight:bold;min-height:36px;min-width:72px;padding:8px 18px;font-family:"DrukTextWide",sans-serif;border-radius:10000px;}.css-ayfcnk::before{border-radius:10000px;}.css-ayfcnk,.css-ayfcnk:focus,.css-ayfcnk:active{border-color:rgb(255,206,0);background:rgb(255,206,0);color:rgb(0,0,0);}.css-ayfcnk:hover{background-color:rgb(204,165,0);border-color:rgb(204,165,0);color:rgb(0,0,0);}</style><a data-widget-link="true" href="https://panamericancongress.org/panam_en" target="_top" data-link-type="external" class="lp-button-react w-82b86b69-741b-9698-2b38-51f8d46df8a8 lp-button-react--full is-bold lp-button-react--small lp-button-react--flat lp-btn-flat font-scale-3 line-height-scale-1 css-ayfcnk" contenteditable="false">HOME</a></div></div></div></div></div></div></div><div class="composite flex__item--md-2 flex__item--xs-10 css-8x0d4x"><div class="inner-composite flex flex--2"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="999c5238-2046-406d-f852-f648d418bdc8" class="widget"><div class="lp-button-react-wrapper css-y13kug" data-widget-type="LpButtonReact"><a data-widget-link="true" href="https://panamericancongress.org/panam_about_en/" target="_top" data-link-type="external" class="lp-button-react w-999c5238-2046-406d-f852-f648d418bdc8 lp-button-react--full is-bold lp-button-react--small lp-button-react--flat lp-btn-flat font-scale-3 line-height-scale-2 css-ayfcnk" contenteditable="false">ABOUT</a></div></div></div></div></div></div></div><div class="composite flex__item--md-2 flex__item--xs-10 css-8x0d4x"><div class="inner-composite flex flex--2"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="5a8c8f42-6628-aeb8-43c1-bab8c6587254" class="widget"><div class="lp-button-react-wrapper css-y13kug" data-widget-type="LpButtonReact"><a data-widget-link="true" href="https://panamericancongress.org/panam_editions_en/" target="_top" data-link-type="external" class="lp-button-react w-5a8c8f42-6628-aeb8-43c1-bab8c6587254 lp-button-react--full is-bold lp-button-react--small lp-button-react--flat lp-btn-flat font-scale-3 line-height-scale-2 css-ayfcnk" contenteditable="false">EDITIONS</a></div></div></div></div></div></div></div><div class="composite flex__item--md-2 flex__item--xs-10 css-8x0d4x"><div class="inner-composite flex flex--2"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="0c78aa78-ca58-52e8-e4cb-4688ccf28cd9" class="widget"><div class="lp-button-react-wrapper css-y13kug" data-widget-type="LpButtonReact"><a data-widget-link="true" href="https://panamericancongress.org/panam_initiatives_en/" target="_top" data-link-type="external" class="lp-button-react w-0c78aa78-ca58-52e8-e4cb-4688ccf28cd9 lp-button-react--full is-bold lp-button-react--small lp-button-react--flat lp-btn-flat font-scale-3 line-height-scale-2 css-ayfcnk" contenteditable="false">EVENTS</a></div></div></div></div></div></div></div><div class="composite flex__item--md-2 flex__item--xs-10 css-8x0d4x"><div class="inner-composite flex flex--2"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="c62f6d99-f4bd-7668-aaf8-aab8f75d1279" class="widget"><div class="lp-button-react-wrapper css-y13kug" data-widget-type="LpButtonReact"><style data-emotion-css="gca2dc">.css-gca2dc{-webkit-align-items:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;
73-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;border-style:solid;border-width:1px;text-align:center;font-family:'Lato',sans-serif;text-shadow:none;-webkit-transition:color 0.2s linear,background 0.2s linear,border-color 0.2s linear, text-shadow 0.2s linear;transition:color 0.2s linear,background 0.2s linear,border-color 0.2s linear, text-shadow 0.2s linear;-webkit-text-decoration:none;text-decoration:none;position:relative;width:100%;font-weight:bold;min-height:36px;min-width:72px;padding:8px 18px;font-family:"DrukTextWide",sans-serif;border-radius:10000px;}.css-gca2dc::before{border-radius:10000px;}.css-gca2dc,.css-gca2dc:focus,.css-gca2dc:active{border-color:rgb(0,223,0);background:rgb(0,223,0);color:rgb(0,0,0);}.css-gca2dc:hover{background-color:rgb(0,172,0);border-color:rgb(0,172,0);color:rgb(0,0,0);}</style><a data-widget-link="true" href="#LB-w6nnei6XKB4SRFuVY6SuWD" target="_top" data-link-type="leadbox" data-leadbox-popup="w6nnei6XKB4SRFuVY6SuWD" data-leadbox-domain="panamericancongress.org" class="lp-button-react w-c62f6d99-f4bd-7668-aaf8-aab8f75d1279 lp-button-react--full is-bold lp-button-react--small lp-button-react--flat lp-btn-flat font-scale-4 line-height-scale-2 css-gca2dc" contenteditable="false" data-persist-popup-target="classic-popup-w6nnei6XKB4SRFuVY6SuWD">ES / PT</a></div></div></div></div></div></div></div></div></div></div></div></div></section><style data-emotion-css="1yazq5l">.css-1yazq5l{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-1yazq5l > .container{padding-top:4vw;padding-right:1vw;padding-bottom:1vw;padding-left:1vw;padding-top:4cqw;padding-right:1cqw;padding-bottom:1cqw;padding-left:1cqw;}.site-header .css-1yazq5l > .container{padding-top:15px;padding-right:0;padding-bottom:15px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-1yazq5l{padding:0 50px;}@media (max-width:23.75em){.bar .css-1yazq5l{padding:0 25px;}}@media (min-width:71.25em){.css-1yazq5l > .container{padding-top:45.6px;padding-right:11.4px;padding-bottom:11.4px;padding-left:11.4px;}}</style><section class="hidden-desktop hidden-tablet section css-1yazq5l" data-guid="108a23e8-8c96-c278-8a01-23f895c6070b"><div class="container" id="menu"><div class="layout flex flex--12" data-guid="e0251aaf-c30a-e028-7018-0dd43ad8520e"><div class="column flex__item--md-12 flex__item--xs-12 css-vfaad" data-guid="4f523048-d921-ba58-e176-b3cbd1f87aa8"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="a3ec6c18-51c8-e05d-5f07-c388ff623ee4" class="widget"><style data-emotion-css="1yltisf">.css-1yltisf{text-align:center;}</style><div class="css-1yltisf"><div><a data-widget-link="true" href="#LB-XcEz2X2aw3gfaXrWpPy3Ah" target="_top" data-link-type="leadbox" data-leadbox-popup="XcEz2X2aw3gfaXrWpPy3Ah" data-leadbox-domain="panamericancongress.org" class="lp-image-react-container lp-icon-react__icon--linked" contenteditable="false" data-persist-popup-target="classic-popup-XcEz2X2aw3gfaXrWpPy3Ah"><style data-emotion-css="1its1x0">.css-1its1x0{display:inline-block;vertical-align:middle;max-width:625px;}@media (max-width:530px){.site-header .composite .widget .css-1its1x0{max-width:calc(100% - 80px);}}</style><img class="lp-image-react w-a3ec6c18-51c8-e05d-5f07-c388ff623ee4 css-1its1x0" src="/api/library/mkkt4xba5hdyydetgv7c49tx" data-image-upload-source="builder3" alt="" style="width:10%"></a></div></div></div></div></div></div></div></div></div></div></div></div></div></section><style data-emotion-css="1m5yryu">.css-1m5yryu{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);background-image:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0)),url("/api/library/iok7qm7p9q6xv3ndphrgbb54");background-size:contain;background-position:center bottom;background-repeat:repeat-x;}.css-1m5yryu > .container{padding-top:0vw;padding-right:2vw;padding-bottom:0vw;padding-left:2vw;padding-top:0cqw;padding-right:2cqw;padding-bottom:0cqw;padding-left:2cqw;}.site-header .css-1m5yryu > .container{padding-top:-5px;padding-right:0;
73padding-bottom:-5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-1m5yryu{padding:0 50px;}@media (max-width:23.75em){.bar .css-1m5yryu{padding:0 25px;}}@media (min-width:71.25em){.css-1m5yryu > .container{padding-top:0px;padding-right:22.8px;padding-bottom:0px;padding-left:22.8px;}}</style><section class="has-background-image has-background-size-contain section css-1m5yryu" data-guid="776822d9-5fd8-8428-5135-9638bc069fb6" data-background="/api/library/iok7qm7p9q6xv3ndphrgbb54"><div class="container" id="hero-copy"><div class="layout flex flex--12" data-guid="2b8696c8-ff23-d3d9-eca8-67f6f5f849ba"><div class="column flex__item--md-12 flex__item--xs-12 css-vfaad" data-guid="aca82e01-fd48-7f08-c6a8-6e1845585be8"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="a4e80de9-a8a3-69f9-9ec8-f46846987cbf" class="widget"><style data-emotion-css="v1i7mk">.css-v1i7mk{height:6px;}@media (min-width:48em){.css-v1i7mk{height:95px;}}</style><div class="lp-space-react w-a4e80de9-a8a3-69f9-9ec8-f46846987cbf css-v1i7mk" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="79181178-aa48-9828-bf28-435819eb1968" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-center font-scale-10 line-height-scale-2"><span style="color: rgb(249, 245, 242);"><span style="font-family: "DrukTextWide", sans-serif;">MONTEVIDEO<br>DECLARATION</span></span></p></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="420aefab-8878-ab68-47d3-7be8e0a5f948" class="widget"><style data-emotion-css="1myyf8b">.css-1myyf8b{height:6px;}@media (min-width:48em){.css-1myyf8b{height:39px;}}</style><div class="lp-space-react w-420aefab-8878-ab68-47d3-7be8e0a5f948 css-1myyf8b" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div></div></div></div></div></section><style data-emotion-css="1jyljul">.css-1jyljul{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-1jyljul > .container{padding-top:0vw;padding-right:4vw;padding-bottom:0vw;padding-left:4vw;padding-top:0cqw;padding-right:4cqw;padding-bottom:0cqw;padding-left:4cqw;}.site-header .css-1jyljul > .container{padding-top:-5px;padding-right:0;padding-bottom:-5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-1jyljul{padding:0 50px;}@media (max-width:23.75em){.bar .css-1jyljul{padding:0 25px;}}@media (min-width:71.25em){.css-1jyljul > .container{padding-top:0px;padding-right:45.6px;padding-bottom:0px;padding-left:45.6px;}}</style><section class="section css-1jyljul" data-guid="6bfdbb93-8e58-c018-1e28-78b8d44d9668"><div class="container" id="hero-copy-copy-copy"><div class="layout flex flex--12" data-guid="e76de618-e3b8-22d8-c398-4188d7481b28"><div class="column flex__item--md-12 flex__item--xs-12 css-vfaad" data-guid="14a86a48-8b58-2408-af6a-21184b5846f8"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="7aa854a8-c7c8-0118-0acc-7ef802f705a8" class="widget"><style data-emotion-css="157w624">.css-157w624{height:6px;}
73@media (min-width:48em){.css-157w624{height:24px;}}</style><div class="lp-space-react w-7aa854a8-c7c8-0118-0acc-7ef802f705a8 css-157w624" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="2b7824b8-5d2c-5498-b4e8-107871c289e8" class="widget"><div class="css-1yltisf"><div><style data-emotion-css="ro8sr6">.css-ro8sr6{display:inline-block;vertical-align:middle;max-width:2610px;}@media (max-width:530px){.site-header .composite .widget .css-ro8sr6{max-width:calc(100% - 80px);}}</style><img class="lp-image-react w-2b7824b8-5d2c-5498-b4e8-107871c289e8 css-ro8sr6" src="/api/library/y2nirxncouartfpfnqtqwinb?w=1064&fit=scale-down&format=auto&quality=82" data-image-upload-source="builder3" alt="" style="width:100%; height:auto" fetchpriority="high" srcset="/api/library/y2nirxncouartfpfnqtqwinb?w=320&fit=scale-down&format=auto&quality=82 320w, /api/library/y2nirxncouartfpfnqtqwinb?w=480&fit=scale-down&format=auto&quality=82 480w, /api/library/y2nirxncouartfpfnqtqwinb?w=640&fit=scale-down&format=auto&quality=82 640w, /api/library/y2nirxncouartfpfnqtqwinb?w=960&fit=scale-down&format=auto&quality=82 960w, /api/library/y2nirxncouartfpfnqtqwinb?w=1064&fit=scale-down&format=auto&quality=82 1064w" sizes="100vw" width="2610" height="1680"></div></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="b098a278-019a-8b71-5aad-16681bbdb238" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">The Panamerican Congress,</span></span></p><p class="text-align-left font-scale-8"><br></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Gathering</strong></em> in Montevideo, two hundred years after BolÃvar summoned the American republics to Panama, seeking solidarity between peoples, sovereignty among nations;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Stressing</strong></em> that the doctrine of domination of which he warned has now returned in full force, with a renewed claim to spread liberty while laying siege to entire nations, suï¬ocating their societies, debilitating their economies, and subordinating their democracies;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Repudiating</strong></em> the application of military actions and unilateral coercive measures that violate international law and menace the âZone of Peaceâ, such as the kidnapping of heads of state and the bombing of civilians in the Caribbean;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Denouncing</strong></em> the diverse forms of legal warfare that have been deployed to disqualify elected oï¬cials â from President Cristina Fernández de Kirchner to Vice President Jorge Glas to President Gustavo Petro â through methods that undermine popular sovereignty;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Reaï¬rming</strong></em> our commitment to the Bogotá and Mexico City Declarations, and our determination to advance their implementation alongside the commitments we make today before the peoples of the Americas;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Echoing</strong></em> the testimonies brought to this Congress of territories such as Puerto Rico and Las Malvinas still held under colonial rule, which not only remind us of the unfinished struggle to decolonize the Americas, but oï¬er a dire warning for what may come from its recolonization;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Condemning</strong></em> without reservation the economic, commercial, and financial blockade that for more than sixty
73years has besieged the people of Cuba, a policy of collective punishment that denies them the right to decide their own destiny;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Aï¬rming</strong></em> that our América will be neither complicit in genocide nor intimidated from actions to detain it, whether in the case of the Palestinian people on the Gaza Strip or in the present eï¬orts to export these annihilationist tactics back our hemisphere;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Commemorating</strong></em> the lives already claimed by the old doctrine of domination: children in hospitals, fisherfolk at sea, migrants in ICE detention, indigenous peoples on their ancestral lands, and social and political leaders persecuted as "terrorists" across the American continent simply because of their beliefs;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Celebrating</strong></em> the resilience and resistance of our peoples, who organize in unions, in courts, in parliaments, and in our streets, answering coercion with coordination and meeting campaigns of fear with campaigns to strengthen solidarity;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Stressing</strong></em> that unity is victory, and that this renewed doctrine of domination can be defeated only by a new architecture of hemispheric cooperation, built by the legislators gathered here in collaboration with the communities they represent;</span></span></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Expressing</strong></em> our gratitude to the Frente Amplio and the people of Uruguay for hosting the third edition of the Panamerican Congress, a people that oï¬ers a shining example of democratic renewal and that keeps alive the memory of the horrors of dictatorship;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">Calls to:</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Renew</strong></em> our democracies in service of the needs of our peoples, defending the</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">principle of popular sovereignty against the doctrine of unilateral supremacy;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Protect</strong></em> the democratic rights and freedoms won by centuries of struggle, combating the criminalization of protest and the press, and defending the legislatures whose mandates are seized by force rather than won at the ballot;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Fight</strong></em> for the immediate and unconditional end of the cruel and criminal blockade of Cuba, upholding the inalienable right of the Cuban people to decide their destiny free of foreign interference;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Combat</strong></em> organized crime through democratic means, protecting our communities by redressing the root causes of their insecurity such as the production of arms in the United States and the absence of welfare services that militate against drug addiction, while strengthening regional cooperation to prosecute the financial networks that sustain criminal organizations;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Build</strong></em> a sovereign and shared prosperity, breaking with decades of policy that mistook austerity for destiny, defending the right of every nation to plan its own industry, tax its own wealth, and protect its own workers, and rejecting trade relations dictated by a class of transnational capital that answers to no one;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Promote</strong></em> greater productive integration, stronger regional value chains, quality</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">employment, technological development, and industrial and energy strategies</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">capable of sustaining a just ecological transition;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Govern</strong></em> the technologies controlled today by a handful of corporations, aï¬rming the principle of digital sovereignty to protect the privacy of our citizens and the</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">development of our economies, and rejecting the reproduction, in digital form, of</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">resource extraction carried out to enrich servers and shareholders abroad;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Strengthen</strong></em>
73 public and regional digital infrastructure, scientific and technological capacities, and democratic frameworks for the governance of digital platforms and artificial intelligence, while narrowing digital divides and protecting children and young people within these environments;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Weave</strong></em> a new social pact of shared dignity, recognizing that caring for one another is a collective responsibility and not a private burden, and rebuilding the public capacities that decades of deliberate deregulation have dismantled, so that health, housing, and a dignified old age are guaranteed rights rather than rationed goods;</span></span></p><p class="text-align-left font-scale-8"><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Reclaim</strong></em> the sovereign equality of nations, rejecting every form of coercion, economic, judicial, electoral, or military, used to subordinate the weak to the strong, and defending the right of every people in this hemisphere to determine its own future without foreign tutelage;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Forge</strong></em> a solidarity that transcends borders, making the demands of one nation the demands of all, and upholding the conviction that the liberation of any one of our peoples is inseparably bound to the liberation of the rest.</span></span><br></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">Today, 23 August 2026, we therefore unite to:</span></span></p><p class="text-align-left font-scale-8"><br></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Combat</strong></em> the renewed doctrine of domination in all its forms, defending the rights and freedoms won across centuries of struggle for self-determination;</span></span><br></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Collaborate</strong></em> from our respective legislatures to advance our own vision of</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">hemispheric cooperation, based on solidarity between peoples and sovereignty</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">among nations;</span></span></p><p class="text-align-left font-scale-8"></p><p class="text-align-left font-scale-8"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><em><strong>Convene</strong></em> the Fourth Panamerican Congress in Brazil, in August 2027, carrying</span></span><br><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;">forward, two hundred years later, the unfinished work BolÃvar began in Panama.</span></span></p><p class="text-align-left font-scale-8"></p></div></div></div></div></div></div></div></div></div></div></div></div></section><style data-emotion-css="1so66sb">.css-1so66sb{background-color:rgba(249,245,242,1);border-color:rgba(249,245,242,1);background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-1so66sb > .container{padding-top:0vw;padding-right:0vw;padding-bottom:0vw;padding-left:3vw;padding-top:0cqw;padding-right:0cqw;padding-bottom:0cqw;padding-left:3cqw;}.site-header .css-1so66sb > .container{padding-top:-5px;padding-right:0;
73padding-bottom:-5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-1so66sb{padding:0 50px;}@media (max-width:23.75em){.bar .css-1so66sb{padding:0 25px;}}@media (min-width:71.25em){.css-1so66sb > .container{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:34.2px;}}</style><section class="hidden-desktop hidden-tablet section css-1so66sb" data-guid="c1956228-a1b8-9bf8-7f68-31e4b6538511"><div class="container" id="contact-copy-copy-copy"><div class="layout flex flex--12" data-guid="5cd25838-6778-5ab8-d118-9b5891f83648"><div class="column flex__item--md-6 flex__item--xs-12 css-vfaad" data-guid="c7982b65-d7c8-1be3-2f68-c458dd68ef6f"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="69e6dd84-2348-54b8-a267-6bddfc1d8696" class="widget"><style data-emotion-css="15kihin">.css-15kihin{height:6px;}@media (min-width:48em){.css-15kihin{height:7px;}}</style><div class="lp-space-react w-69e6dd84-2348-54b8-a267-6bddfc1d8696 css-15kihin" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="5008cf88-971d-f051-2216-c3e90d223ad3" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-left font-scale-10"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "DrukTextWide", sans-serif;"><span style="font-style: normal"><u>CONTACT</u></span></span></span></p></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="03116758-98d7-57bb-2fa8-11ffba0177a7" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-left font-scale-6"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><span style="font-style: normal">For all inquiries, please write to </span></span><a href="mailto: [email protected]" target="_top" data-link-type="external"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><span style="font-style: normal">[email protected]</span></span></a></span></p></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="61ed1f98-27aa-29b8-13c8-bd686e58cb82" class="widget"><style data-emotion-css="1w95p3t">.css-1w95p3t{height:6px;}@media (min-width:48em){.css-1w95p3t{height:-12px;}}</style><div class="lp-space-react w-61ed1f98-27aa-29b8-13c8-bd686e58cb82 css-1w95p3t" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div></div></div><div class="column flex__item--md-6 flex__item--xs-12 css-vfaad" data-guid="8c5ee508-8068-e648-8468-b8884c982a08"><div class="inner-column css-eeduzr"></div></div></div></div></section><style data-emotion-css="eporc3">.css-eporc3{background-color:rgba(0,0,0,0);border-color:rgba(0,0,0,0);background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-eporc3 > .container{padding-top:0vw;padding-right:0vw;padding-bottom:0vw;padding-left:0vw;padding-top:0cqw;padding-right:0cqw;padding-bottom:0cqw;padding-left:0cqw;}.site-header .css-eporc3 > .container{padding-top:-5px;padding-right:0;
73padding-bottom:-5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-eporc3{padding:0 50px;}@media (max-width:23.75em){.bar .css-eporc3{padding:0 25px;}}@media (min-width:71.25em){.css-eporc3 > .container{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}}</style><section class="hidden-mobile section css-eporc3" data-guid="f8d920f5-8d88-b1c8-223f-b5f84b9d3a02"><div class="container" id="contact-copy-copy"><div class="layout flex flex--12" data-guid="ad186b9e-4a39-1fa8-91fa-de780ae869d8"><div class="column flex__item--md-6 flex__item--xs-12 css-vfaad" data-guid="7288355d-cdc8-3f0f-4e4e-ccab91f81e37"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="8fd80df7-4a08-67bd-9ea8-465851579171" class="widget"><div class="lp-space-react w-8fd80df7-4a08-67bd-9ea8-465851579171 css-15kihin" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="9e182ac2-115c-31bf-32c8-46e89595deb8" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-left font-scale-10"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "DrukTextWide", sans-serif;"><span style="font-style: normal"><u>CONTACT</u></span></span></span></p></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="8baccee8-2df8-55e2-dd74-691e25aca6dd" class="widget"><div class="lp-text-react lp-headline-react" data-widget-type="LpTextReact"><p class="text-align-left font-scale-7"><span style="color: rgba(0, 0, 0, 1);"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><span style="font-style: normal">For all inquiries, please write to </span></span><a href="mailto: [email protected]" target="_top" data-link-type="external"><span style="font-family: "NHaasGroteskDSPro", sans-serif;"><span style="font-style: normal">[email protected]</span></span></a></span></p></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="7b8b302a-6d2d-2498-120d-570878967778" class="widget"><div class="lp-space-react w-7b8b302a-6d2d-2498-120d-570878967778 css-1w95p3t" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div></div></div><div class="column flex__item--md-6 flex__item--xs-12 css-vfaad" data-guid="8ff8a6da-c8c8-f458-e04b-e7a8e7a8e968"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="e6d4e193-563d-fd8a-63a8-6523d319aea1" class="widget"><div class="lp-space-react w-e6d4e193-563d-fd8a-63a8-6523d319aea1 css-15kihin" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="46fb46a3-4818-8459-cb18-35c8da97c6e8" class="widget"><style data-emotion-css="889chh">.css-889chh{text-align:right;}</style><div class="css-889chh"><div><style data-emotion-css="1qlbiyf">.css-1qlbiyf{display:inline-block;vertical-align:middle;max-width:1000px;}@media (max-width:530px){.site-header .composite .widget .css-1qlbiyf{max-width:calc(100% - 80px);}}</style><img class="lp-image-react w-46fb46a3-4818-8459-cb18-35c8da97c6e8 css-1qlbiyf" src="/api/library/ihuua7kbfb9xi98rlcix2yl4?w=1064&fit=scale-down&format=auto&quality=82" data-image-upload-source="builder3" alt="" style="width:6
735%; height:auto" loading="lazy" srcset="/api/library/ihuua7kbfb9xi98rlcix2yl4?w=320&fit=scale-down&format=auto&quality=82 320w, /api/library/ihuua7kbfb9xi98rlcix2yl4?w=480&fit=scale-down&format=auto&quality=82 480w, /api/library/ihuua7kbfb9xi98rlcix2yl4?w=640&fit=scale-down&format=auto&quality=82 640w, /api/library/ihuua7kbfb9xi98rlcix2yl4?w=960&fit=scale-down&format=auto&quality=82 960w, /api/library/ihuua7kbfb9xi98rlcix2yl4?w=1064&fit=scale-down&format=auto&quality=82 1064w" sizes="auto, 100vw" width="1000" height="489"></div></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="b09b70c1-b748-ea28-f17c-9e38a46811e2" class="widget"><div class="lp-space-react w-b09b70c1-b748-ea28-f17c-9e38a46811e2 css-15kihin" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div></div></div></div></div></section><style data-emotion-css="yh1pn2">.css-yh1pn2{background-color:rgba(255,128,84,1);border-color:rgba(255,128,84,1);background-image:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,0)),url("/api/library/ruz8qptt3csp1cmysc51pvpd");background-size:cover;background-position:center center;background-repeat:no-repeat;}.css-yh1pn2 > .container{padding-top:0vw;padding-right:0vw;padding-bottom:0vw;padding-left:0vw;padding-top:0cqw;padding-right:0cqw;padding-bottom:0cqw;padding-left:0cqw;}.site-header .css-yh1pn2 > .container{padding-top:-5px;padding-right:0;padding-bottom:-5px;padding-left:0;-webkit-transition:padding 0.03s ease;transition:padding 0.03s ease;}.bar .css-yh1pn2{padding:0 50px;}@media (max-width:23.75em){.bar .css-yh1pn2{padding:0 25px;}}@media (min-width:71.25em){.css-yh1pn2 > .container{padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;}}</style><section class="hidden-mobile has-background-image has-background-size-cover section css-yh1pn2" data-guid="9f1d441c-0f9f-d568-c9dd-b1b478cd0118" data-background="/api/library/ruz8qptt3csp1cmysc51pvpd"><div class="container" id="footer-copy-copy"><div class="layout flex flex--12" data-guid="6eb8f122-7f7a-9538-a203-071872af1ed8"><div class="column flex__item--md-12 flex__item--xs-12 css-vfaad" data-guid="4968ffc8-e108-c85f-5791-6dd64bb81ffa"><div class="inner-column css-eeduzr"><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="6e4eabb8-8608-0466-e9e8-6f58c488d538" class="widget"><style data-emotion-css="pdcc3p">.css-pdcc3p{height:6px;}@media (min-width:48em){.css-pdcc3p{height:25px;}}</style><div class="lp-space-react w-6e4eabb8-8608-0466-e9e8-6f58c488d538 css-pdcc3p" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div><div class="row flex flex--12 css-47r3vg"><div class="composite flex__item--md-12 flex__item--xs-12 css-8x0d4x"><div class="inner-composite flex flex--12"><div class="widget-column flex__item--md-12 flex__item--xs-12"><div class="widget-row flex flex--12"><div class="flex__item--md-12 flex__item--xs-12"><div data-widget-id="836cd3c8-e155-d0d8-62b8-0b09cb187188" class="widget"><style data-emotion-css="1klih5i">.css-1klih5i{height:6px;}@media (min-width:48em){.css-1klih5i{height:48px;}}</style><div class="lp-space-react w-836cd3c8-e155-d0d8-62b8-0b09cb187188 css-1klih5i" data-widget-type="LpSpaceReact"></div></div></div></div></div></div></div></div></div></div></div></div></section></div> 74 75 76 77
78<script type="text/javascript" data-scriptname="TAILOR">(function(){var exports={};var module={exports: exports};"use strict";function initFunc(){console.assert(window.sup&&window.sup.Tailor,"tailor successfully loaded")}Object.defineProperty(exports,"__esModule",{value:!0}),function(t){function e(t,s){if(!t||!t.parentElement)return null;if(t.parentElement)var i=t.parentElement.querySelectorAll(s);if(i&&1===Array.prototype.filter.call(i,function(e){return e===t}).length)return t;return e(t.parentElement,s)}function s(t){var e;for(e in this.rules=[],this.readQueue=[],this.writeQueue=[],this.opts={parentSelector:"[data-widget-id]"},t)this.opts[e]=t[e]}function i(t){return parseInt(t,10)}function r(t,e){return function(s){return t(s)?e:""}}function n(t,e,s){return s=Math.round(s),(!t||s>=t)&&(!e||s<=e)}s.prototype.register=function(t){if(t&&this.isValid(t.el)){for(var e in t.classFunctions=this.parseBreakPoints(t.breakPoints),t.classNames=[],t.breakPoints)t.classNames.push(t.breakPoints[e]);this.rules.push(t),this.triggerReCalcClassNames()}},s.prototype.isValid=function(t){return!!(t&&e(t,this.opts.parentSelector))},s.prototype.parseBreakPoints=function(t){var e,s=[];for(var a in t){var o=t[a];switch(a.charAt(0)){case"<":e=n.bind(this,null,parseInt(a.slice(1),10));break;case">":e=n.bind(this,parseInt(a.slice(1),10),null);break;default:var u=a.split("-").map(i);e=n.bind(this,u[0],u[1])}s.push(r(e,o))}return s},s.prototype.triggerReCalcClassNames=function(){this.timeout&&clearTimeout(this.timeout),this.timeout=setTimeout(this.reCalcClassNames.bind(this),150)},s.prototype.stillValid=function(t){return!!this.isValid(t.el)||(this.remove(t),!1)},s.prototype.makeTasks=function(s){var i={},r=[];return i.el=s.el,i.add=s.classFunctions.reduce(function(s,n){var a,o=e(i.el,this.opts.parentSelector);a=function(e){var s=t.getComputedStyle(e,null),i=s.getPropertyValue("padding-left"),r=s.getPropertyValue("padding-right");return parseFloat(i)+parseFloat(r)}(o);var u=n(o.offsetWidth-a<t.innerWidth?o.offsetWidth-a:t.innerWidth);return u&&(r.push(u),i.el.classList.contains(u)||s.push(u)),s}.bind(this),[]),i.remove=s.classNames.filter(function(t){return-1===r.indexOf(t)&&i.el.classList.contains(t)},this),i},s.prototype.reCalcClassNames=function(){this.readQueue=this.rules.slice(0),this.writeQueue=this.readQueue.filter(this.stillValid,this).map(this.makeTasks,this),this.writeClassNames()},s.prototype.writeClassNames=function(){for(;this.writeQueue.length;){var t=this.writeQueue.pop();t.add.forEach(function(e){t.el.classList.add(e)}),t.remove.forEach(function(e){t.el.classList.remove(e)})}},s.prototype.remove=function(t){this.rules=this.rules.filter(function(e){return e!==t})},t.sup=t.sup||{},t.sup.Tailor=s,t.sup.tailor=new s,t.addEventListener("resize",t.sup.tailor.triggerReCalcClassNames.bind(t.sup.tailor))}(window),exports.default=initFunc;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 78
78
79<script type="text/javascript" data-scriptname="MAPPER">(function(){var exports={};var module={exports: exports};"use strict";function unwrapExports(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function createCommonjsModule(e,r){return e(r={exports:{}},r.exports),r.exports}Object.defineProperty(exports,"__esModule",{value:!0});var _typeof_1=createCommonjsModule(function(e){function r(t){return e.exports=r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,r(t)}e.exports=r,e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(_typeof_1);var toPrimitive_1=createCommonjsModule(function(e){var r=_typeof_1.default;e.exports=function(e,t){if("object"!=r(e)||!e)return e;var o=e[Symbol.toPrimitive];if(void 0!==o){var n=o.call(e,t||"default");if("object"!=r(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(toPrimitive_1);var toPropertyKey_1=createCommonjsModule(function(e){var r=_typeof_1.default;e.exports=function(e){var t=toPrimitive_1(e,"string");return"symbol"==r(t)?t:t+""},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(toPropertyKey_1);var defineProperty=createCommonjsModule(function(e){e.exports=function(e,r,t){return(r=toPropertyKey_1(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e},e.exports.__esModule=!0,e.exports.default=e.exports}),_defineProperty=unwrapExports(defineProperty),arrayWithHoles=createCommonjsModule(function(e){e.exports=function(e){if(Array.isArray(e))return e},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(arrayWithHoles);var iterableToArrayLimit=createCommonjsModule(function(e){e.exports=function(e,r){var t=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=t){var o,n,u,i,a=[],s=!0,p=!1;try{if(u=(t=t.call(e)).next,0===r){if(Object(t)!==t)return;s=!1}else for(;!(s=(o=u.call(t)).done)&&(a.push(o.value),a.length!==r);s=!0);}catch(e){p=!0,n=e}finally{try{if(!s&&null!=t.return&&(i=t.return(),Object(i)!==i))return}finally{if(p)throw n}}return a}},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(iterableToArrayLimit);var arrayLikeToArray=createCommonjsModule(function(e){e.exports=function(e,r){(null==r||r>e.length)&&(r=e.length);for(var t=0,o=Array(r);t<r;t++)o[t]=e[t];return o},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(arrayLikeToArray);var unsupportedIterableToArray=createCommonjsModule(function(e){e.exports=function(e,r){if(e){if("string"==typeof e)return arrayLikeToArray(e,r);var t={}.toString.call(e).slice(8,-1);return"Object"===t&&e.constructor&&(t=e.constructor.name),"Map"===t||"Set"===t?Array.from(e):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?arrayLikeToArray(e,r):void 0}},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(unsupportedIterableToArray);var nonIterableRest=createCommonjsModule(function(e){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports});unwrapExports(nonIterableRest);var slicedToArray=createCommonjsModule(function(e){e.exports=function(e,r){return arrayWithHoles(e)||iterableToArrayLimit(e,r)||unsupportedIterableToArray(e,r)||nonIterableRest()},e.exports.__esModule=!0,e.exports.default=e.exports}),_slicedToArray=unwrapExports(slicedToArray);function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};
79r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function getLocationSearch(){return window.location.search||""}function getQueryString(){return getLocationSearch().replace("?","")}function serializeQueryString(e){return Object.keys(e).map(function(r){return"".concat(encodeURIComponent(r),"=").concat(encodeURIComponent(e[r]))}).join("&")}function deserializeQueryString(e){return e.split("&").reduce(function(e,r){var t=e,o=r.split("="),n=_slicedToArray(o,2),u=n[0],i=void 0===u?"":u,a=n[1],s=void 0===a?"":a;return""!==i&&""!==s&&(t[decodeURIComponent(i)]=decodeURIComponent(s)),t},{})}function getQueryValue(e){return deserializeQueryString(getQueryString())[e]}function appendToQuery(e,r){return serializeQueryString(_objectSpread(_objectSpread({},deserializeQueryString(e)),r))}function addQueriesToUrl(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(0===Object.keys(r).length)return e;var t=e.split("?"),o=_slicedToArray(t,2),n=o[0],u=o[1],i=void 0===u?"":u;if(!i)return[n].concat(serializeQueryString(r)).join("?");var a=i.split("#"),s=_slicedToArray(a,2),p=s[0],c=s[1],l=void 0===c?"":c;return p=appendToQuery(p,r),l&&(p="".concat(p,"#").concat(l)),"".concat(n,"?").concat(p)}function module$1(){window.sup||(window.sup={}),window.sup.widgetTypes||(window.sup.widgetTypes={}),window.sup.widgets||(window.sup.widgets=[]),window.sup.register=function(e,r){window.sup.widgetTypes[e]=r,window.sup.scan(e)},window.sup.scan=function(e){var r=window.sup.widgetTypes[e];if(r&&"function"==typeof r){var t=document.querySelectorAll('[data-widget-type="'.concat(e,'"]'));Array.prototype.forEach.call(t,function(e){window.sup.widgets.push(r(e))})}};var e=getQueryValue("customerToken");if(e){var r=document.querySelectorAll("[data-widget-link]");Array.prototype.forEach.call(r,function(r){r.href=addQueriesToUrl(r.href,{customerToken:e})})}}exports.default=module$1;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 79
79
80<script type="text/javascript" data-scriptname="IFRAME">(function(){var exports={};var module={exports: exports};"use strict";function initFunc(){if(window.FB||/(marketplace\/template|suppress_hero=true)/.test(window.location.href)){var e=document.querySelectorAll(".section");Array.prototype.slice.call(e).forEach(function(e){var t=e;if(t.style.minHeight&&-1!==t.style.minHeight.indexOf("vh")){var i=10*parseInt(t.style.minHeight,10);t.style.minHeight="".concat(i,"px")}})}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=initFunc;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 80
80
81<script type="text/javascript" data-scriptname="INTERSECTION_OBSERVER">(function(){var exports={};var module={exports: exports};"use strict";function initFunc(){}Object.defineProperty(exports,"__esModule",{value:!0}),function(t,e){function n(t){this.time=t.time,this.target=t.target,this.rootBounds=t.rootBounds,this.boundingClientRect=t.boundingClientRect,this.intersectionRect=t.intersectionRect||{top:0,bottom:0,left:0,right:0,width:0,height:0},this.isIntersecting=!!t.intersectionRect;var e=this.boundingClientRect,n=e.width*e.height,o=this.intersectionRect,i=o.width*o.height;this.intersectionRatio=n?Number((i/n).toFixed(4)):this.isIntersecting?1:0}function o(t,e){var n,o,i,r=e||{};if("function"!=typeof t)throw new Error("callback must be a function");if(r.root&&1!=r.root.nodeType)throw new Error("root must be an Element");this._checkForIntersections=(n=this._checkForIntersections.bind(this),o=this.THROTTLE_TIMEOUT,i=null,function(){i||(i=setTimeout(function(){n(),i=null},o))}),this._callback=t,this._observationTargets=[],this._queuedEntries=[],this._rootMarginValues=this._parseRootMargin(r.rootMargin),this.thresholds=this._initThresholds(r.threshold),this.root=r.root||null,this.rootMargin=this._rootMarginValues.map(function(t){return t.value+t.unit}).join(" ")}function i(t,e,n,o){"function"==typeof t.addEventListener?t.addEventListener(e,n,o||!1):"function"==typeof t.attachEvent&&t.attachEvent("on"+e,n)}function r(t,e,n,o){"function"==typeof t.removeEventListener?t.removeEventListener(e,n,o||!1):"function"==typeof t.detatchEvent&&t.detatchEvent("on"+e,n)}function s(t){var e;try{e=t.getBoundingClientRect()}catch(t){}return e?(e.width&&e.height||(e={top:e.top,right:e.right,bottom:e.bottom,left:e.left,width:e.right-e.left,height:e.bottom-e.top}),e):{top:0,bottom:0,left:0,right:0,width:0,height:0}}function h(t,e){for(var n=e;n;){if(n==t)return!0;n=c(n)}return!1}function c(t){var e=t.parentNode;return e&&11==e.nodeType&&e.host?e.host:e&&e.assignedSlot?e.assignedSlot.parentNode:e}"IntersectionObserver"in t&&"IntersectionObserverEntry"in t&&"intersectionRatio"in t.IntersectionObserverEntry.prototype?"isIntersecting"in t.IntersectionObserverEntry.prototype||Object.defineProperty(t.IntersectionObserverEntry.prototype,"isIntersecting",{get:function(){return this.intersectionRatio>0}}):(o.prototype.THROTTLE_TIMEOUT=100,o.prototype.POLL_INTERVAL=null,o.prototype.USE_MUTATION_OBSERVER=!0,o.prototype.observe=function(t){if(!this._observationTargets.some(function(e){return e.element==t})){if(!t||1!=t.nodeType)throw new Error("target must be an Element");this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},o.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter(function(e){return e.element!=t}),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},o.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},o.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},o.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter(function(t,e,n){if("number"!=typeof t||isNaN(t)||t<0||t>1)throw new Error("threshold must be a number between 0 and 1 inclusively");return t!==n[e-1]})},o.prototype._parseRootMargin=function(t){var e=(t||"0px").split(/\s+/).map(function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error("rootMargin must be specified in pixels or percent");return{value:parseFloat(e[1]),unit:e[2]}});return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},o.prototype._monitorIntersections=function(){this._monitoringIntersections||(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(i(t,"resize",this._checkForIntersections,!0),i(e,"scroll",this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&&"MutationObserver"in t&&(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},o.prototype._unmonitorIntersections=function(){this._monitoringIntersections&&(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,r(t,"resize",this._checkForIntersections,!0),r(e,"scroll",this._checkForIntersections,!0),this._domObserver&&(this._domObserver.disconnect(),this._domObserver=null))},o.prototype._checkForIntersections=function(){var e=this._rootIsInDom(),o=e?this._getRootRect():{top:0,bottom:0,left:0,right:0,width:0,height:0};
81this._observationTargets.forEach(function(i){var r=i.element,h=s(r),c=this._rootContainsTarget(r),u=i.entry,a=e&&c&&this._computeTargetAndRootIntersection(r,o),l=i.entry=new n({time:t.performance&&performance.now&&performance.now(),target:r,boundingClientRect:h,rootBounds:o,intersectionRect:a});u?e&&c?this._hasCrossedThreshold(u,l)&&this._queuedEntries.push(l):u&&u.isIntersecting&&this._queuedEntries.push(l):this._queuedEntries.push(l)},this),this._queuedEntries.length&&this._callback(this.takeRecords(),this)},o.prototype._computeTargetAndRootIntersection=function(n,o){if("none"!=t.getComputedStyle(n).display){for(var i,r,h,u,a,l,p,d,g=s(n),f=c(n),_=!1;!_;){var v=null,m=1==f.nodeType?t.getComputedStyle(f):{};if("none"==m.display)return;if(f==this.root||f==e?(_=!0,v=o):f!=e.body&&f!=e.documentElement&&"visible"!=m.overflow&&(v=s(f)),v&&(i=v,r=g,h=void 0,u=void 0,a=void 0,l=void 0,p=void 0,d=void 0,h=Math.max(i.top,r.top),u=Math.min(i.bottom,r.bottom),a=Math.max(i.left,r.left),l=Math.min(i.right,r.right),d=u-h,!(g=(p=l-a)>=0&&d>=0&&{top:h,bottom:u,left:a,right:l,width:p,height:d})))break;f=c(f)}return g}},o.prototype._getRootRect=function(){var t;if(this.root)t=s(this.root);else{var n=e.documentElement,o=e.body;t={top:0,left:0,right:n.clientWidth||o.clientWidth,width:n.clientWidth||o.clientWidth,bottom:n.clientHeight||o.clientHeight,height:n.clientHeight||o.clientHeight}}return this._expandRectByRootMargin(t)},o.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map(function(e,n){return"px"==e.unit?e.value:e.value*(n%2?t.width:t.height)/100}),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},o.prototype._hasCrossedThreshold=function(t,e){var n=t&&t.isIntersecting?t.intersectionRatio||0:-1,o=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==o)for(var i=0;i<this.thresholds.length;i++){var r=this.thresholds[i];if(r==n||r==o||r<n!=r<o)return!0}},o.prototype._rootIsInDom=function(){return!this.root||h(e,this.root)},o.prototype._rootContainsTarget=function(t){return h(this.root||e,t)},o.prototype._registerInstance=function(){},o.prototype._unregisterInstance=function(){},t.IntersectionObserver=o,t.IntersectionObserverEntry=n)}(window,document),exports.default=initFunc;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
81 82
83<script type="text/javascript" data-scriptname="CONVERSION_CLICK">(function(){var exports={};var module={exports: exports};"use strict";function setup(){var e=document.querySelector('meta[name="leadpages-meta-id"]').content,t=document.querySelector('meta[name="active-route"]'),n=document.querySelectorAll("a[data-widget-link][data-conversion-click]");Array.prototype.forEach.call(n,function(n){var o="external"===n.dataset.linkType&&"_top"===n.target;n.addEventListener("click",function(c){if(window.center&&window.center.loaded){var a=t&&t.content?{customId:"site-".concat(e,":").concat(t.content)}:{};(o=o&&!n.getAttribute("data-standalone-leadbox"))&&(c.preventDefault(),a.callback=function(){window.top.location.href=n.href});try{window.center("get","identity",function(){return window.center("send","conversion",null,null,null,a)})}catch(e){o&&(window.top.location.href=n.href)}}})})}function initFunc(){"complete"===document.readyState?setup():window.addEventListener("DOMContentLoaded",setup)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=initFunc,exports.setup=setup;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 83
83
84<script type="text/javascript" data-scriptname="POWERED_BY">(function(){var exports={};var module={exports: exports};"use strict";function addPoweredBy(){var e='\n <div id="powered-by-container" class="powered-by__container">\n <div class="powered-by__sub_container">\n <div class="powered-by__top_container">\n <svg height="24" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg" style="margin-right:6px">\n <g clip-path="url(#paint0_angular_26_506_clip_path)"><g transform="matrix(-0.00960912 0.00960912 -0.0100269 -0.0100269 19.0863 8.76573)"><foreignObject x="-1608.46" y="-1608.46" width="3216.92" height="3216.92"><div xmlns="http://www.w3.org/1999/xhtml" style="background:conic-gradient(from 90deg,rgba(255, 255, 255, 1) 0deg,rgba(255, 255, 255, 0.8) 216deg,rgba(255, 255, 255, 0) 360deg);height:100%;width:100%;opacity:1"></div></foreignObject></g></g><path fill-rule="evenodd" clip-rule="evenodd" d="M11.8138 0.000976562C10.0343 0.000976562 8.5918 1.44349 8.5918 3.22293V8.59277H19.3317V19.3326H11.8138C10.0343 19.3326 8.5918 17.8901 8.5918 16.1107V16.1108C8.5918 17.8902 10.0343 19.3327 11.8137 19.3327H24.7016C26.481 19.3327 27.9236 17.8902 27.9236 16.1108V0.000976562H11.8138Z"/>\n <g clip-path="url(#paint1_angular_26_506_clip_path)"><g transform="matrix(0.00960912 -0.00960912 0.0100269 0.0100269 10.4945 17.3575)"><foreignObject x="-1608.46" y="-1608.46" width="3216.92" height="3216.92"><div xmlns="http://www.w3.org/1999/xhtml" style="background:conic-gradient(from 90deg,rgba(255, 255, 255, 1) 0deg,rgba(255, 255, 255, 0.9) 144deg,rgba(255, 255, 255, 0.8) 216deg,rgba(255, 255, 255, 0) 360deg);height:100%;width:100%;opacity:1"></div></foreignObject></g></g><path fill-rule="evenodd" clip-rule="evenodd" d="M3.22 8.59277C1.44164 8.59277 0 10.0344 0 11.8128V24.7026C0 26.482 1.44251 27.9245 3.22195 27.9245H16.1118C17.8901 27.9245 19.3318 26.4829 19.3318 24.7045V8.59277H19.3317V19.3326H11.8138C10.0344 19.3326 8.59186 17.8901 8.59186 16.1107V8.59277H3.22Z"/>\n <defs><clipPath id="paint0_angular_26_506_clip_path"><path fill-rule="evenodd" clip-rule="evenodd" d="M11.8138 0.000976562C10.0343 0.000976562 8.5918 1.44349 8.5918 3.22293V8.59277H19.3317V19.3326H11.8138C10.0343 19.3326 8.5918 17.8901 8.5918 16.1107V16.1108C8.5918 17.8902 10.0343 19.3327 11.8137 19.3327H24.7016C26.481 19.3327 27.9236 17.8902 27.9236 16.1108V0.000976562H11.8138Z"/></clipPath><clipPath id="paint1_angular_26_506_clip_path"><path fill-rule="evenodd" clip-rule="evenodd" d="M3.22 8.59277C1.44164 8.59277 0 10.0344 0 11.8128V24.7026C0 26.482 1.44251 27.9245 3.22195 27.9245H16.1118C17.8901 27.9245 19.3318 26.4829 19.3318 24.7045V8.59277H19.3317V19.3326H11.8138C10.0344 19.3326 8.59186 17.8901 8.59186 16.1107V8.59277H3.22Z"/></clipPath></defs>\n </svg>\n <div class="powered-by__top_text">\n Powered by Leadpages\n </div>\n </div>\n <div class="powered-by__bottom_container">\n <div class="powered-by__bottom_header">Turn Clicks into Customers</div>\n <div class="powered-by__bottom_body">Create your own code-free websites, landing pages, and conversion tools with a free, 14-day trial.</div>\n <div class="powered-by__bottom_link"><a href="https://lp.leadpages.com/powered-by-leadpages/?utm_source=Leadpages&utm_medium=customerpages&utm_campaign=powered_by" target="_blank">Get Started â</a></div>\n </div>\n </div>\n </div>\n ',n='\n <link\n rel="preload"\n href="https://classic-assets.leadpages.com/static-leadpages-net/fonts/opensans/OpenSans-Regular.woff2"\n as="font"\n type="font/woff2"\n crossorigin\n />\n <link\n rel="preload"\n href="https://classic-assets.leadpages.com/static-leadpages-net/fonts/opensans/OpenSans-Bold.woff2"\n as="font"\n type="font/woff2"\n crossorigin\n />\n <link\n href="https://classic-assets.leadpages.com/static-leadpages-net/fonts/opensans_typeset.css"\n rel="stylesheet"\n type="text/css"\n />\n <style id="powered-by-style">\n .powered-by__container {\n position: relative;\n min-height: 36px;\n background-color: #000;\n transition: all 1s ease-in;\n }\n .powered-by__sub_container {\n justify-content: flex-start;\n flex-direction: column;\n position: absolute;\n transition: top .2s ease-in;\n background-color: #000;\n overflow: hidden;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n }\n .powered-by__container:hover .powered-by__sub_container {\n top: -142px;\n }\n .powered-by__container:hover .powered-by__top_container {\n min-height: 66px;\n }\n .powered-by__bottom_container {\n flex-direction: column;\n text-align: center;\n }\n .powered-by__top_container,\n .powered-by__bottom_container,\n .powered-by__bottom_top_bar,\n .powered-by__container {\n display: flex;\n width: 100%;\n justify-content: center;\n align-items: center;\n font-family: "Open Sans", "Segoe UI", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 12px;\n color: #FFF;\n }\n .powered-by__bottom_top_bar {\n padding-bottom: 24px;\n }\n .powered-by__top_container {\n transition: all .1s ease-in .1s;\n min-height: 36px;\n }\n .powered-by__top_text {\n cursor: default;\n }\n .powered-by__bottom_header {\n flex-direction: column;\n text-align: center;\n margin-bottom: 8px;\n font-weight: 700;\n }\n .powered-by__bottom_body {\n flex-direction: column;\n text-align: center;\n line-height: 18px;\n letter-spacing: 0;\n width: 350px;\n margin-bottom: 18px;\n }\n .powered-by__bottom_link a {\n font-weight: 700;\n font-size: 16px;\n color: #FFF;\n text-decoration: none;\n }\n </style>\n ',t=document.getElementById("powered-by-style");t?t.outerHTML=n:document.head.insertAdjacentHTML("beforeend",n);var o=document.getElementById("powered-by-container");
84o?o.outerHTML=e:document.body.insertAdjacentHTML("beforeend",e)}function setup(){var e=!!document.cookie.split("; ").find(function(e){return"lpPoweredBy=1"===e});if(!1===e)try{e="1"===new URLSearchParams(window.location.search).get("lpPoweredBy")}catch(e){}!0===e&&addPoweredBy()}function init(){"complete"===document.readyState?setup():window.addEventListener("DOMContentLoaded",setup)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=init;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 84
84
85<script type="text/javascript" data-scriptname="REDUCE_MOTION">(function(){var exports={};var module={exports: exports};"use strict";function toggleThumbnail(e){document.querySelectorAll("iframe").forEach(function(t){var n=t.getAttribute("src");if(n){var o=t.parentElement.querySelector('[data-qa-selector="background-video-thumbnail"]'),c=function(e,t){e&&(e.style.display=t)},a=function(e){t.setAttribute("src","".concat(e,"&cb=").concat((new Date).getTime()))};n.includes("youtube.com")&&o?(c(o,e?"block":"none"),c(t,e?"none":"block")):n.includes("wistia.net")?a(n.replace(/autoPlay=(true|false)/,"autoPlay=".concat(!e))):n.includes("vimeo.com")&&a(n.replace("autoplay=".concat(e?1:0),"autoplay=".concat(e?0:1)))}})}function handleMotionPreference(){toggleThumbnail(window.matchMedia("(prefers-reduced-motion: reduce)").matches)}"undefined"!=typeof window&&(document.addEventListener("DOMContentLoaded",handleMotionPreference),window.matchMedia("(prefers-reduced-motion: reduce)").addEventListener("change",handleMotionPreference));;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
vendor: 1 bytes, line 85
85
86<script type="text/javascript" data-scriptname="DELAY_SCRIPT">"use strict";!function(){var e=document.querySelectorAll("[data-delay-display-seconds]");[].forEach.call(e,function(e){var s=e.getAttribute("data-delay-display-seconds");setTimeout(function(){e.classList.add("is-visible"),e.classList.remove("is-delayed"),e.classList.remove("hide-section"),window.sup.tailor.triggerReCalcClassNames()},1e3*s)})}();</script>
vendor: 1 bytes, line 86
86
87<script type="text/javascript" data-scriptname="IMAGE_CLICKGUARD_SCRIPT">"use strict";window.addEventListener("contextmenu",function(t){var e=t.target.getAttribute("data-image-upload-source");"shutterstock_api"!==e&&"getty_api"!==e||t.preventDefault()});</script>
vendor: 1 bytes, line 87
87
88<script type="text/javascript" data-scriptname="ANIMATE">(function(){var exports={};var module={exports: exports};"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var animateCSS=function(e,t){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"lp-animate__";if(window.matchMedia("(prefers-reduced-motion: reduce)").matches)e.style.visibility="visible";else{var a="".concat(n).concat(t);e.parentElement.style.overflow="visible",e.setAttribute("style","visibility: hidden !important;"),i?setTimeout(function(){e.style.visibility="visible"},1e3*i):e.style.visibility="visible",e.classList.add("".concat(n,"animated"),a),e.addEventListener("animationend",function(t){t.stopPropagation(),e.classList.remove("".concat(n,"animated"),a),e.parentElement.overflow=""},{once:!0})}},handleChange=function(e,t){e.filter(function(e){return e.isIntersecting}).forEach(function(e){var i=e.intersectionRatio,n=(void 0===e.boundingClientRect.height?window.innerHeight:e.boundingClientRect.height)/window.innerHeight;if(n>1||n>.33&&i>=.5||i>=.9){var a=e.target;t.unobserve(a);var o=a.dataset.lpAnimateSection||a.dataset.lpAnimateWidget,r=Number(a.dataset.lpAnimateDelayWidget);animateCSS(a,o,r)}})},makeObserver=function(e,t){var i=new IntersectionObserver(handleChange,{root:null,rootMargin:"0px",threshold:t}),n=i.observe.bind(i),a=document.querySelectorAll(e);Array.prototype.forEach.call(a,function(e){n(e)})},setup=function(){makeObserver("[data-lp-animate-section]",[.075,.5,.9]),makeObserver("[data-lp-animate-widget]",[.075,.5,.9])},init=function(){"complete"===document.readyState?setup():window.addEventListener("DOMContentLoaded",setup)};exports.default=init;;var i=module.exports.default||module.exports;return typeof i==="function"?i.apply(null, arguments):void 0;}());</script>
88 89
89<script type="text/javascript"> 90 (function(){performance&&performance.timing&&window.addEventListener("load",function(){return setTimeout(function(){var e=document.querySelector("meta[name='leadpages-serving-domain']");if(e||e.content!==location.hostname){var t=performance.timing;(new Image).src="https://api.leadpages.io/analytics/v1/observations/capture?version=1.7.13&origin=page-speed&kind=timer,timer,timer,timer,timer,timer,timer,timer,timer,timer&label=domain-lookup,connect,request,ttfb,response,loading,interactive,content-loaded,complete,load&value="+[t.domainLookupEnd-t.domainLookupStart,t.connectEnd-t.connectStart,t.responseStart-t.requestStart,t.responseStart-t.fetchStart,t.responseEnd-t.responseStart,t.domLoading-t.fetchStart,t.domInteractive-t.fetchStart,t.domContentLoadedEventEnd-t.fetchStart,t.domComplete-t.fetchStart,(t.loadEventEnd||t.loadEventStart)-t.fetchStart].join(",")}},0)})}()); 91 </script>
91 92 93 94 95
96<script>(function(){function show(o){o.style.display="block";document.body.style.overflow="hidden";}function hide(o){o.style.display="none";document.body.style.overflow="";}document.addEventListener("click",function(e){var t=e.target.closest("[data-leadbox-popup]");if(!t)return;if(t.getAttribute("data-htmlpub-popup-target")||/^#(?:popup|modal|dialog)-/.test(t.getAttribute("href")||""))return;e.preventDefault();var id=t.getAttribute("data-leadbox-popup");var o=document.getElementById("lp-classic-box-"+id);if(o)show(o);});document.addEventListener("keydown",function(e){if(e.key==="Escape"){var ifs=document.querySelectorAll(".lp-classic-leadbox-iframe");for(var i=0;i<ifs.length;i++){if(ifs[i].style.display!=="none")hide(ifs[i]);}}});window.addEventListener("message",function(e){if(!e||!e.data||e.data.type!=="htmlpub:leadbox-close"||!e.source)return;var ifs=document.querySelectorAll(".lp-classic-leadbox-iframe");for(var i=0;i<ifs.length;i++){if(ifs[i].contentWindow===e.source){hide(ifs[i]);return;}}});})();</script>
96<div id="classic-popup-XcEz2X2aw3gfaXrWpPy3Ah" data-persist-popup="classic-popup-XcEz2X2aw3gfaXrWpPy3Ah" data-persist-popup-chrome="none" data-persist-popup-classic-uuid="XcEz2X2aw3gfaXrWpPy3Ah" style="display:none"><iframe src="/api/serve-classic-popup/XcEz2X2aw3gfaXrWpPy3Ah" title="Pop-up" style="position:fixed;inset:0;width:100%;height:100%;border:0;background:transparent"></iframe></div><div id="classic-popup-w6nnei6XKB4SRFuVY6SuWD" data-persist-popup="classic-popup-w6nnei6XKB4SRFuVY6SuWD" data-persist-popup-chrome="none" data-persist-popup-classic-uuid="w6nnei6XKB4SRFuVY6SuWD" style="display:none"><iframe src="/api/serve-classic-popup/w6nnei6XKB4SRFuVY6SuWD" title="Pop-up" style="position:fixed;inset:0;width:100%;height:100%;border:0;background:transparent"></iframe></div>
96<script data-htmlpub-analytics> 97(function(){ 98var PID="bthr9fgjr4tunfrsf2zhq0ba"; 99var EXP_ID=""; 100var EXP_VARIANT=""; 101var API="/collect"; 102var APP_ORIGIN="https://htmlpub.com"; 103var FLUSH_INTERVAL=5000; 104var FLUSH_MAX=20; 105 106// HP-4568 consent gate. Runs onGranted() at most once, only when analytics 107// storage is permitted. See app/src/lib/analytics-consent-gate.ts. 108function hpConsent(onGranted){ 109var started=false; 110function start(){if(started)return;started=true;try{onGranted();}catch(e){}} 111 112// Browser-level objection (Global Privacy Control / legacy Do-Not-Track) is 113// terminal: it is the visitor speaking directly, so no later CMP "accept all" 114// re-enables tracking for this page view. Mirrors the Customers.ai pixel gate. 115try{ 116if(navigator.globalPrivacyControl===true)return; 117var dnt=navigator.doNotTrack||window.doNotTrack||navigator.msDoNotTrack; 118if(dnt==="1"||dnt===1||dnt===true)return; 119}catch(e){} 120 121// Analytics/statistics consent per whichever CMP the page carries: 122// 1 granted / 0 denied / -1 present but undecided / null no CMP detected 123function hpConsentState(){ 124// Google consent mode v2 first: vendor-neutral, so a CMP writing it (directly 125// or via GTM) is authoritative even before its own JS API initialises. Last 126// write wins, matching gtag's 'default' then 'update'. 127try{ 128var dl=window.dataLayer; 129if(dl&&dl.length){ 130var seen=null; 131for(var i=0;i<dl.length;i++){ 132var entry=dl[i]; 133if(!entry||entry[0]!=="consent"||!entry[2])continue; 134var mode=entry[2].analytics_storage; 135if(mode==="granted")seen=1;else if(mode==="denied")seen=0; 136} 137if(seen!==null)return seen; 138} 139}catch(e){} 140// Cookiebot. Its object appears only once uc.js has run, so fall back to the 141// script tag it is installed as to tell "undecided" from "absent". 142try{ 143var cb=window.Cookiebot||window.CookieConsent; 144if(cb&&cb.consent)return cb.consent.statistics?1:(cb.hasResponse?0:-1); 145if(document.getElementById("Cookiebot")||document.querySelector("script[src*='consent.cookiebot.com'],script[src*='consentcdn.cookiebot.com']"))return -1; 146}catch(e){} 147// OneTrust: statistics is the reserved C0002 group. OneTrust comma-pads the 148// list itself, so the delimited match cannot hit C00020. Every runtime signal 149// it exposes appears only after otSDKStub.js runs, so without the script-tag 150// fallback a blocked or async stub reads as "no CMP" and we would track â the 151// exact bug, on the pages most likely to care. 152try{ 153var groups=window.OptanonActiveGroups||window.OnetrustActiveGroups; 154if(typeof groups==="string"&&groups)return groups.indexOf(",C0002,")>-1?1:0; 155if(window.OneTrust||window.Optanon||document.getElementById("onetrust-consent-sdk")||document.querySelector("script[src*='cookielaw.org'],script[src*='onetrust.com']"))return -1; 156}catch(e){} 157// CookieYes 158try{ 159if(typeof window.getCkyConsent==="function"){ 160var cky=window.getCkyConsent(); 161if(cky&&cky.categories)return cky.categories.analytics?1:0; 162} 163if(document.querySelector("script[src*='cookieyes.com'],script[src*='cookie-script.com']"))return -1; 164}catch(e){} 165// Iubenda: purpose 4 is measurement. 166try{ 167var iub=window._iub; 168if(iub&&iub.cs&&iub.cs.consent&&iub.cs.consent.purposes)return iub.cs.consent.purposes[4]?1:0;
169if(iub||document.querySelector("script[src*='iubenda.com']"))return -1; 170}catch(e){} 171return null; 172} 173 174var state=hpConsentState(); 175if(state===null||state===1){start();return;} 176 177// CMP present, analytics not granted: write nothing, send nothing, and listen 178// for a later grant. The poll is a catch-all for CMPs whose event names we do 179// not know; it stops after 60s rather than running forever. 180function recheck(){if(hpConsentState()===1)start();} 181var EVENTS=["CookiebotOnAccept","CookiebotOnConsentReady","CookieConsentDeclaration","cookieyes-consent-update","consent.onetrust","OneTrustGroupsUpdated","iubenda-consent-given","hp-analytics-consent"]; 182for(var evt=0;evt<EVENTS.length;evt++){try{window.addEventListener(EVENTS[evt],recheck,false);}catch(e){}} 183var polls=0; 184var timer=setInterval(function(){recheck();if(started||++polls>=120)clearInterval(timer);},500); 185} 186 187// Everything below mints an identifier or sends a beacon, so all of it waits 188// for consent. window.__hpupPushEvent is the exception: it binds synchronously 189// here and only forwards once consent arrives. Binding it late would let the 190// popup embed bundle's fallback shim (app/src/lib/popups/embed-bundle.ts, 191// registered under the same "if not already defined" test) claim the name first 192// and reroute pop-up events. Pre-consent calls are dropped, not queued â they 193// have no visitorId. SYNC with app/src/lib/analytics-tracking-script.ts. 194var hpPush=null; 195if(!window.__hpupPushEvent){window.__hpupPushEvent=function(t,p){try{if(hpPush)hpPush(t,p);}catch(e){}};} 196hpConsent(function(){ 197 198function uuid(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=Math.random()*16|0;return(c==="x"?r:(r&3|8)).toString(16)});} 199function getOrSet(store,key){try{var v=store.getItem(key);if(v)return v;v=uuid();store.setItem(key,v);return v;}catch(e){return uuid();}} 200 201var visitorId=getOrSet(localStorage,"_hp_vid"); 202var sessionId=getOrSet(sessionStorage,"_hp_sid"); 203 204var params=new URLSearchParams(location.search); 205var utmSource=params.get("utm_source")||undefined; 206var utmMedium=params.get("utm_medium")||undefined; 207var utmCampaign=params.get("utm_campaign")||undefined; 208// Ad-platform click IDs (conversion feedback loop) â captured like the UTMs. 209// SYNC with canonical at app/src/lib/analytics-tracking-script.ts. 210var gclid=params.get("gclid")||undefined; 211var fbclid=params.get("fbclid")||undefined; 212var msclkid=params.get("msclkid")||undefined; 213 214var vw=window.innerWidth||0; 215var vh=window.innerHeight||0; 216var ua=navigator.userAgent||""; 217var isMobileUA=/Android|iPhone|iPod|iPad|webOS|BlackBerry|IEMobile|Opera Mini/i.test(ua); 218var maxScreenDim=Math.max(screen.width||0,screen.height||0); 219var deviceType=isMobileUA?(maxScreenDim<=812||vw<768?"mobile":"tablet"):"desktop"; 220 221function detectBrowser(){ 222if(ua.indexOf("Edg/")>-1)return"Edge"; 223if(ua.indexOf("Chrome/")>-1)return"Chrome"; 224if(ua.indexOf("Safari/")>-1&&ua.indexOf("Chrome/")===-1)return"Safari"; 225if(ua.indexOf("Firefox/")>-1)return"Firefox"; 226return"Other"; 227} 228function detectOS(){ 229if(ua.indexOf("iPhone")>-1||ua.indexOf("iPad")>-1)return"iOS"; 230if(ua.indexOf("Android")>-1)return"Android"; 231if(ua.indexOf("Mac OS")>-1)return"macOS"; 232if(ua.indexOf("Windows")>-1)return"Windows"; 233if(ua.indexOf("Linux")>-1)return"Linux"; 234return"Other"; 235} 236var browserFamily=detectBrowser(); 237var osFamily=detectOS(); 238 239var buffer=[]; 240function makeEvent(type,payload){ 241return{pageId:PID,eventType:type,visitorId:visitorId,sessionId:sessionId,payload:payload||undefined,referrer:document.referrer||undefined,utmSource:utmSource,utmMedium:utmMedium,utmCampaign:utmCampaign,gclid:gclid,fbclid:fbclid,msclkid:msclkid,deviceType:deviceType,browserFamily:browserFamily,osFamily:osFamily,viewportWidth:vw,viewportHeight:vh,experimentId:EXP_ID||undefined,experimentVariant:EXP_VARIANT||undefined,timestamp:Date.now()}; 242} 243function pushEvent(type,payload){buffer.push(makeEvent(type,payload));if(buffer.length>=FLUSH_MAX)flush();} 244 245// HP-1557 â expose a single-arg helper so the popups runtime (separate IIFE, 246// no shared closure with analytics) can feed events into the same buffer. 247// Defensive: only set if not already defined so a future second analytics 248// injection doesn't clobber an in-flight handler. HP-4568: the name is bound 249// above, outside the consent gate; this is where it starts forwarding. 250hpPush=pushEvent; 251// NOTE (HP-3461): this copy deliberately does NOT register window.__hpTrack, even 252// though the app copy registers both names. checkout-script.ts guards on 253// __hpTrack, and inject.ts appends that script to every edge-served page, so 254// adding the name here would start writing checkout_started for the entire edge 255// fleet (pubhtml.com + all custom domains) where that beacon has always been a 256// no-op â beginning an ecommerce event series mid-history, and moving the derived 257// checkout_abandoned with it, from a change about page engagement. It is a real 258// gap and wants its own change with a backfill story. 259// (No backticks anywhere in this file: it is one big template literal, so a 260// backtick in a comment terminates the string. This exact comment did it once.) 261 262function readMmuid(){try{var v=localStorage.getItem("mmuid");return v&&v.length<=128?v:undefined;}catch(e){return undefined;}} 263 264function flush(){ 265if(buffer.length===0)return; 266var batch=buffer.splice(0,FLUSH_MAX); 267var payload={events:batch}; 268var mmuid=readMmuid(); 269if(mmuid)payload.mmuid=mmuid; 270try{navigator.sendBeacon(API,JSON.stringify(payload));}catch(e){} 271} 272 273// Engaged time-on-page (HP-3592) â count a second only while the tab is 274// visible AND the visitor was active in the last 30s; emit the accrued DELTA 275// every 30 engaged seconds and on hide/pagehide. Registered BEFORE the flush 276// handlers below so the final delta lands in the buffer before the last 277// beacon fires (listener registration order = firing order). 278// SYNC with canonical at app/src/lib/analytics-tracking-script.ts. 279var dwellSec=0,dwellSent=0,dwellLastActive=Date.now(); 280var DWELL_IDLE_MS=30000,DWELL_EMIT_SEC=30,DWELL_CAP_SEC=1800; 281function dwellActive(){dwellLastActive=Date.now();} 282document.addEventListener("scroll",dwellActive,{passive:true}); 283document.addEventListener("mousemove",dwellActive,{passive:true}); 284document.addEventListener("keydown",dwellActive,true); 285document.addEventListener("touchstart",dwellActive,{passive:true}); 286document.addEventListener("click",dwellActive,true); 287function dwellEmit(){var d=dwellSec-dwellSent;if(d>0){dwellSent=dwellSec;pushEvent("dwell",{seconds:d});}} 288var dwellTimer=setInterval(function(){ 289if(document.visibilityState!=="visible")return; 290if(Date.now()-dwellLastActive>DWELL_IDLE_MS)return; 291dwellSec++; 292if(dwellSec-dwellSent>=DWELL_EMIT_SEC)dwellEmit(); 293if(dwellSec>=DWELL_CAP_SEC){dwellEmit();clearInterval(dwellTimer);} 294},1000); 295document.addEventListener("visibilitychange",function(){if(document.visibilityState==="hidden")dwellEmit();}); 296window.addEventListener("pagehide",dwellEmit); 297 298setInterval(flush,FLUSH_INTERVAL); 299document.addEventListener("visibilitychange",function(){if(document.visibilityState==="hidden")flush();}); 300window.addEventListener("pagehide",flush); 301 302pushEvent("page_view"); 303 304// On-platform conversion goal ("a thank-you page I own"): report the current 305// pageId plus the visitor's experiment assignments (_hp_exp_<id> cookies) so the 306// server can count this page-view as a conversion. Fires once per session per 307// page. HP-2925 Layer 1: must fire on EVERY page, not just experiment 308// participants â a standalone "Offsite event" goal has no experiment cookie, so 309// gating on cookies means the server never gets to attribute it. The server 310// no-ops cheaply when the page is neither an experiment nor a goal target. 311// SYNC with canonical at app/src/lib/analytics-tracking-script.ts. 312(function(){ 313try{ 314if(!APP_ORIGIN)return; 315var guard="_hp_goal:"+PID; 316if(sessionStorage.getItem(guard))return; 317sessionStorage.setItem(guard,"1"); 318var exps=[];var ck=document.cookie.split(";"); 319for(var i=0;i<ck.length;i++){var kv=ck[i].split("=");var k=(kv[0]||"").trim();if(k.indexOf("_hp_exp_")===0){exps.push({id:k.slice(8),variant:decodeURIComponent((kv[1]||"").trim())});}} 320var body=JSON.stringify({pageId:PID,visitorId:visitorId,sessionId:sessionId,experiments:exps}); 321var url=APP_ORIGIN+"/api/experiments/onsite-conversion"; 322if(navigator.sendBeacon){navigator.sendBeacon(url,new Blob([body],{type:"text/plain"}));} 323else{fetch(url,{method:"POST",headers:{"Content-Type":"application/json"},body:body,keepalive:true}).catch(function(){});} 324}catch(e){} 325})(); 326 327// HP-3461 â milestones reached WITHOUT the visitor scrolling carry {auto:1}. 328// checkScroll runs on a 1s timer regardless of input and at scrollY=0 pct is 329// just winH/docH, so any page under ~4 screens tall banked scroll_depth:25 from 330// every visitor who did nothing (a page fitting the viewport banked 100). Those
331// rows mark the session engaged in the rollup, which pushed the bounce rate of 332// every short page toward zero and inflated avgScrollDepth the same way. The 333// events still fire (that depth WAS visible, and the scroll funnel wants it); 334// the stamp lets the bounce query demand a real interaction. 335// SYNC with app/src/lib/analytics-tracking-script.ts. 336var scrollMilestones={25:false,50:false,75:false,100:false}; 337var scrollUserMoved=false; 338function checkScroll(){ 339var docH=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight); 340var scrollY=window.scrollY||window.pageYOffset; 341var winH=window.innerHeight; 342if(docH<=winH){if(!scrollMilestones[100]){scrollMilestones[100]=true;pushEvent("scroll_depth",{depth:100,auto:1});}return;} 343var pct=Math.round(((scrollY+winH)/docH)*100); 344[25,50,75,100].forEach(function(m){if(pct>=m&&!scrollMilestones[m]){scrollMilestones[m]=true;pushEvent("scroll_depth",scrollUserMoved?{depth:m}:{depth:m,auto:1});}}); 345} 346window.addEventListener("scroll",function(){scrollUserMoved=true;checkScroll();},{passive:true}); 347setTimeout(checkScroll,1000); 348 349// HP-1557 â when a click/submit happens inside a pop-up, add the popup's id + 350// name to the payload. Customers track conversions on the standard form_submit / 351// element_click types; this is just attribution metadata so the analytics surface 352// can say "this conversion came from the Welcome offer pop-up". Matches the 353// canonical data-persist-popup marker and the legacy data-htmlpub-popup one. 354function popupAttribution(node){ 355var p=node&&node.closest&&node.closest("[data-persist-popup],[data-htmlpub-popup]"); 356if(!p)return null; 357var nm=p.getAttribute("data-persist-popup-name");if(nm===null)nm=p.getAttribute("data-htmlpub-popup-name"); 358return{popupId:p.getAttribute("id")||"",popupName:(nm||"").replace(/^\s+|\s+$/g,"")}; 359} 360 361document.addEventListener("click",function(e){ 362var el=e.target; 363if(!el||!el.tagName)return; 364var tag=el.tagName.toLowerCase(); 365if(!(tag==="a"||tag==="button"||tag==="input"||tag==="select"||tag==="textarea"||el.getAttribute("role")==="button"||el.closest("a,button,[role=button]")))return; 366var docH=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,1); 367var rect=el.getBoundingClientRect(); 368var payload={x:Math.min(1,Math.max(0,(rect.left+rect.width/2)/(document.documentElement.clientWidth||1))),y:Math.min(1,Math.max(0,(rect.top+rect.height/2+(window.scrollY||0))/docH)),selector:el.id?"#"+el.id:tag+(el.className&&typeof el.className==="string"?"."+el.className.trim().split(/\s+/).slice(0,2).join("."):""),viewportWidth:vw,viewportHeight:vh}; 369// HP-3227 â toggling "count clicks as conversions" on a button stamps 370// data-lp-conversion="<configId>" on that element, and both the rollup worker 371// and the dashboard read match a click goal by that id. This tracker never 372// reported it, so a goal whose stored selector is the placeholder 373// a[data-lp-conversion] had nothing to match on and counted zero conversions 374// forever, no matter how many buttons were toggled on. Read from the closest 375// stamped ancestor, since the click target is often an inner <span> of the CTA. 376// SYNC with app/src/lib/analytics-tracking-script.ts. 377var lpConvEl=el.closest?el.closest("[data-lp-conversion]"):null; 378var lpConvId=lpConvEl?lpConvEl.getAttribute("data-lp-conversion"):null; 379if(lpConvId)payload.lpConversion=lpConvId; 380// HP-1557 â only attribute element_click to a pop-up when the actual 381// click target is a button-shaped CTA. A click on the email input 382// inside a lead-capture popup would otherwise inflate the popup's 383// "Button clicks" count on the dashboard. 384var isCtaClick=(tag==="a"||tag==="button"||el.getAttribute("role")==="button"||(el.closest&&el.closest("a,button,[role=button]"))); 385if(isCtaClick){var pa=popupAttribution(el);if(pa){payload.popupId=pa.popupId;payload.popupName=pa.popupName;}} 386// HP-3461 â two NON-IDENTIFYING facts about the clicked anchor: the host it leaves 387// for (external only) and the file extension. The selector above records only "#id" 388// or "tag.class", so a PDF link and any other button were indistinguishable and no 389// past click can be reclassified. The full href is NOT stored: pathnames carry 390// customer identity and this is the highest-volume table (see absUrl). 391// SYNC with app/src/lib/analytics-tracking-script.ts. 392var hrefEl=tag==="a"?el:(el.closest&&el.closest("a[href]")); 393var clickUrl=hrefEl?absUrl(hrefEl):null; 394var clickFacts=clickUrl?linkFacts(clickUrl):null; 395if(clickFacts&&clickFacts.external)payload.linkHost=clickFacts.host; 396if(clickFacts&&clickFacts.ext)payload.linkExt=clickFacts.ext;
397var clickKey=clickUrl?linkClickKey(clickUrl):null; 398if(clickKey)payload.linkKey=clickKey; 399pushEvent("element_click",payload); 400// Classify into a micro-conversion. Emitted ALONGSIDE the element_click, never 401// instead of it, so a classification we later decide was wrong can be re-derived. 402if(hrefEl)classifyLinkClick(hrefEl,clickUrl); 403// HP-2811 â same-tab anchor navigation races the page unload before the 5s 404// flush timer; visibilitychange/pagehide flushes are unreliable (esp. iOS 405// Safari, same-tab nav), so element_click goals for outbound CTAs (e.g. a 406// HubSpot Meetings link) see 0 conversions despite real clicks. Mirror the 407// form_submit flush pattern for anchors that will navigate this tab. 408var navAnchor=tag==="a"?el:(el.closest&&el.closest("a[href]")); 409if(navAnchor&&navAnchor.getAttribute("target")!=="_blank"&&!e.ctrlKey&&!e.metaKey&&!e.shiftKey){ 410var navHref=(navAnchor.getAttribute("href")||"").replace(/^\s+/,""); 411if(navHref&&navHref.charAt(0)!=="#"&&navHref.slice(0,11).toLowerCase()!=="javascript:")flush(); 412} 413},true); 414 415document.addEventListener("submit",function(e){ 416var f=e.target; 417if(!f||f.tagName!=="FORM")return; 418var payload={formIdentifier:f.id||f.getAttribute("name")||"form-"+([].indexOf.call(document.forms,f))}; 419var pa=popupAttribution(f); 420if(pa){payload.popupId=pa.popupId;payload.popupName=pa.popupName;} 421pushEvent("form_submit",payload); 422flush();// send now â a thank-you-page redirect may navigate away before the 5s timer, dropping the experiment conversion 423},true); 424 425// âââ HP-3461 on-page micro-conversions ââââââââââââââââââââââââââââââââââââââ 426// Kinds + classification rules mirror app/src/lib/analytics/page-engagement-kinds.ts 427// (the server-side reference). Literal here because this compiles to an inline 428// string and cannot import; page-engagement-kinds.test.ts asserts both script 429// copies only ever emit registered kinds. 430// SYNC with app/src/lib/analytics-tracking-script.ts. 431 432// Resolve an anchor for RULE MATCHING only â the url itself is never sent. Only 433// host + extension are reported (linkFacts): customer delivery links routinely put 434// identity in the PATH (/thank-you/jane-doe, /download/lead/8842/Invoice-Jane-Doe.pdf), 435// and AnalyticsEvent is the highest-volume table with no redaction pass and no 436// consent gate, so a stored pathname is PII a DSAR erase cannot reach. 437function absUrl(a){ 438try{ 439var raw=(a.getAttribute("href")||"").replace(/^\s+/,""); 440if(!raw||raw.charAt(0)==="#"||raw.slice(0,11).toLowerCase()==="javascript:")return null; 441var u=new URL(raw,location.href); 442if(u.protocol!=="http:"&&u.protocol!=="https:")return null; 443return u; 444}catch(e){return null;} 445} 446// Host + extension, derived from the WHOLE url (never a truncated copy) so a long 447// signed URL cannot lose its extension to a length cap and read as plain navigation. 448function linkFacts(u){ 449var p=u.pathname.toLowerCase(); 450var dot=p.lastIndexOf("."); 451var ext=dot<0?"":p.slice(dot+1); 452if(ext.length>8)ext=""; 453return{host:u.hostname.toLowerCase(),ext:ext,external:u.hostname!==location.hostname}; 454} 455// Stable join key for WHICH link was clicked: FNV-1a hash of the canonicalized 456// URL (lowercase host, no fragment, no trailing slash, query kept minus our own 457// runtime decoration params). The raw href is still never stored (HP-3461) â 458// the dashboard re-derives each key from the page's OWN html and joins on the 459// hash (app/src/lib/analytics/link-click-key.ts, the reference implementation; 460// its test extracts this copy and asserts they agree). 461// SYNC with app/src/lib/analytics-tracking-script.ts and lib/analytics/link-click-key.ts. 462function linkClickKey(u){ 463try{ 464var c=new URL(u.toString()); 465c.hash=""; 466c.hostname=c.hostname.toLowerCase(); 467if(c.pathname.length>1&&c.pathname.slice(-1)==="/")c.pathname=c.pathname.slice(0,-1); 468if(c.search){ 469var strip=["lp_click_id","lp_page_id","lp_ts","_exp","_var","_vid","_pvar","client_reference_id"]; 470var kept=new URLSearchParams(); 471c.searchParams.forEach(function(v,k){if(strip.indexOf(k)<0)kept.append(k,v);}); 472var q=kept.toString(); 473c.search=q?"?"+q:""; 474} 475var t=c.toString(); 476var h=0x811c9dc5; 477for(var i=0;i<t.length;i++){h^=t.charCodeAt(i);h=Math.imul(h,0x01000193);} 478var x=(h>>>0).toString(16); 479while(x.length<8)x="0"+x; 480return x; 481}catch(e){return null;} 482} 483 484var DL_EXT=["pdf","epub","zip","csv","xlsx","xls","docx","doc","pptx","ppt","mp3","wav"]; 485// calendar.google.com is deliberately ABSENT: the standard add-to-calendar button 486// is not a booking, and host-only matching cannot tell them apart, so including it
487// reported bookings on pages where nobody booked. Host entries only â this copy 488// matches on hostname, so a host/path entry could never match here. 489var BOOK_HOSTS=["calendly.com","cal.com","acuityscheduling.com"]; 490 491// Every kind counts at most once PER PAGE LOAD: three clicks on the same PDF is one 492// download, and a scrubbed video cannot re-bank a quartile. 493// 494// IN-MEMORY, and it must stay that way. This used to consult sessionStorage and 495// return true from its catch block, so wherever storage throws (sandboxed iframe, 496// "block all cookies", in-app webviews, full quota) every timeupdate re-emitted 497// three quartiles â 12+/sec, which trips the collect route's 30-req/min-per-IP 498// limit and then 429s that visitor's REAL page_view / form_submit / conversion 499// beacons. A session-scoped key also outlived the page load, so a batch lost to a 500// 429 or a closed tab could never be re-reported. The server counts DISTINCT 501// SESSIONS per kind, so duplicates across page views are deduped there anyway. 502var microFired={}; 503function latch(kind,id){ 504var k=kind+":"+(id||""); 505if(microFired[k])return false; 506microFired[k]=true; 507return true; 508} 509function microEvent(kind,id){ 510if(!latch(kind,id))return; 511pushEvent("page_engagement",id?{kind:kind,id:id}:{kind:kind}); 512} 513 514function classifyLinkClick(a,u){ 515try{ 516if(!u)return; 517var f=linkFacts(u); 518if((a.hasAttribute&&a.hasAttribute("download"))||(f.ext&&DL_EXT.indexOf(f.ext)>-1)){ 519// id is the EXTENSION, not the file name: "Invoice-Jane-Doe.pdf" is as 520// identifying as the path we refuse to store, and phase 1 renders only an 521// aggregate count. 522microEvent("file_download",f.ext||undefined); 523return; 524} 525if(!f.external)return; 526for(var i=0;i<BOOK_HOSTS.length;i++){ 527var b=BOOK_HOSTS[i]; 528if(f.host===b||f.host.slice(-(b.length+1))==="."+b){microEvent("booking_open",b);return;} 529} 530}catch(e){} 531} 532 533// <video> only. YouTube/Vimeo/Loom/Wistia are cross-origin iframes whose 534// playback is invisible without the provider's JS API plus an embed-URL rewrite, 535// both deferred out of phase 1 â a page whose only video is an embed reports NO 536// video kinds, which the read side must treat as "not measurable", not as 0%. 537function videoId(v){ 538try{ 539if(v.id)return v.id.slice(0,128); 540var src=v.currentSrc||v.getAttribute("src")||""; 541if(!src)return undefined; 542var seg=src.split("?")[0].split("/"); 543return (seg[seg.length-1]||"").slice(0,128)||undefined; 544}catch(e){return undefined;} 545} 546// Autoplay policy only lets a video start by itself while MUTED, so "muted and the 547// visitor has never touched the page" is the signature of decorative playback. 548// A <video autoplay muted loop playsinline> hero fires 'play' on every load, so 549// counting it would report "100% played the video" on exactly the pages most likely 550// to have a hero video. Unmuted playback always counts: it needs a gesture. 551// mousedown as well as pointerdown: a path delivering only mouse events would 552// otherwise never set this, silently disabling the feature with nothing in the logs. 553var userGestured=false; 554function markGesture(){userGestured=true;} 555document.addEventListener("pointerdown",markGesture,true); 556document.addEventListener("mousedown",markGesture,true); 557document.addEventListener("keydown",markGesture,true); 558document.addEventListener("touchstart",markGesture,{passive:true,capture:true}); 559// Decide ONCE at 'play' and LATCH on the element. Re-checking the live flag on every 560// timeupdate was a real bug found in Chrome: a decorative muted autoplay correctly 561// suppressed video_start, then one unrelated trusted keystroke flipped userGestured 562// and every later timeupdate passed â banking p25/p50/p75 for a video nobody chose 563// to watch, with NO video_start, leaving the read side dividing by a zero 564// denominator. Unmuted playback always counts: it cannot start without a gesture. 565function decidePlay(v){ 566var intent=(!v.muted)||userGestured; 567try{v.__hpIntent=intent?1:0;}catch(e){} 568return intent; 569} 570// Undefined = never saw this element's 'play' (script injected mid-playback): fail 571// closed, since crediting is the direction that corrupts the headline percentage. 572function countedPlay(v){return v.__hpIntent===1;} 573// Unmuting a decorative video IS intent, and no 'play' fires for it, so re-decide. 574// Emitting video_start keeps the stream coherent: a start precedes its quartiles. 575function onVideoVolume(e){ 576var v=e.target; 577if(!v||v.tagName!=="VIDEO")return; 578if(v.muted||v.paused||v.__hpIntent===1)return; 579v.__hpIntent=1; 580microEvent("video_start",videoId(v)); 581} 582function onVideoTime(e){ 583var v=e.target; 584if(!v||v.tagName!=="VIDEO")return; 585// Consult the LATCHED decision, never the live flag â see decidePlay. 586if(!countedPlay(v))return; 587var d=v.duration; 588// Live streams / metadata not yet loaded report 0, NaN or Infinity â a quartile 589// of an unknown duration is meaningless, so report the play and nothing more. 590if(!isFinite(d)||d<=0)return; 591var pct=(v.currentTime/d)*100; 592var id=videoId(v); 593if(pct>=25)microEvent("video_p25",id); 594if(pct>=50)microEvent("video_p50",id); 595if(pct>=75)microEvent("video_p75",id); 596// p100 comes from 'ended', not a threshold: the last timeupdate can land a 597// fraction short of duration, so a full watch would never bank it. 598} 599document.addEventListener("play",function(e){var v=e.target;if(v&&v.tagName==="VIDEO"&&decidePlay(v))microEvent("video_start",videoId(v));},true); 600document.addEventListener("timeupdate",onVideoTime,true); 601document.addEventListener("volumechange",onVideoVolume,true); 602// SYNC-START embed-video-listeners (app/edge twins pinned by page-engagement-kinds.test.ts) 603// âââ Embedded video: Vimeo (HP-3461) ââââââââââââââââââââââââââââââââââââââââ 604// <video> is handled above by reading the element directly. A Vimeo embed is a 605// CROSS-ORIGIN iframe, so its state is unreadable â but the player reports its own 606// progress over postMessage, and needs NO change to the embed URL. A plainly pasted 607// Vimeo embed becomes measurable as-is. (YouTube is different: it is silent unless 608// enablejsapi=1 is on the URL. Handled separately.) 609// 610// Verified against live players, and two details cost an attempt each: 611// 1. SUBSCRIBE ON THE PLAYER'S ready MESSAGE, not the iframe's load event.
612// Subscribing on load races the player's own init: the addEventListener calls 613// are silently dropped, no ACK comes back, and no timeupdate ever arrives â it 614// looks exactly like "Vimeo does not work". 615// 2. ATTRIBUTE BY e.source, not player_id. Vimeo only echoes a player_id if the 616// embed URL carries one, and a customer's pasted embed has none. 617// 618// Vimeo sends OBJECTS (YouTube sends JSON strings), and timeupdate carries 619// data.percent as a 0..1 fraction, so quartiles need no arithmetic of our own. 620function vimeoHostOk(origin){ 621try{ 622var h=new URL(origin).hostname.toLowerCase(); 623return h==="player.vimeo.com"||h==="vimeo.com"||h.slice(-10)===".vimeo.com"; 624}catch(e){return false;} 625} 626// Low-cardinality, non-identifying label: the numeric video id off the embed URL, 627// prefixed so it cannot collide with a <video> filename in the tally. 628function vimeoLabel(f){ 629try{ 630var m=(f.getAttribute("src")||"").match(/vimeo\.com\/video\/(\d+)/); 631return m?"vimeo:"+m[1]:"vimeo"; 632}catch(e){return "vimeo";} 633} 634function vimeoFrameFor(src){ 635try{ 636var fr=document.querySelectorAll("iframe"); 637for(var i=0;i<fr.length;i++){if(fr[i].contentWindow===src)return fr[i];} 638}catch(e){} 639return null; 640} 641function vimeoSubscribe(f){ 642try{ 643var w=f.contentWindow; 644var evs=["play","timeupdate","ended"]; 645for(var i=0;i<evs.length;i++)w.postMessage({method:"addEventListener",value:evs[i]},"*"); 646}catch(e){} 647} 648window.addEventListener("message",function(e){ 649try{ 650if(!vimeoHostOk(e.origin))return; 651var d=e.data; 652if(!d||typeof d!=="object")return; 653var f=vimeoFrameFor(e.source); 654if(!f)return; 655if(d.event==="ready"){vimeoSubscribe(f);return;} 656var id=vimeoLabel(f); 657if(d.event==="play"){ 658// Same intent rule as <video>, minus the muted check we cannot read through an 659// iframe: browser policy only permits unprompted autoplay while MUTED, so 660// "playback began before the visitor touched anything" is the decorative case. 661if(!userGestured)return; 662f.__hpEmbedCounted=1; 663microEvent("video_start",id); 664return; 665} 666if(f.__hpEmbedCounted!==1)return; 667if(d.event==="timeupdate"){ 668var pct=d.data&&typeof d.data.percent==="number"?d.data.percent*100:-1; 669if(pct<0)return; 670if(pct>=25)microEvent("video_p25",id); 671if(pct>=50)microEvent("video_p50",id); 672if(pct>=75)microEvent("video_p75",id); 673// p100 comes from 'ended', as with <video>: the last timeupdate lands short. 674}else if(d.event==="ended"){ 675microEvent("video_p25",id);microEvent("video_p50",id);microEvent("video_p75",id);microEvent("video_p100",id); 676} 677}catch(err){} 678}); 679 680// âââ Embedded video: YouTube (HP-3461) ââââââââââââââââââââââââââââââââââââââ 681// YouTube is SILENT unless the embed URL carries enablejsapi=1 â verified live: a 682// plain embed answers nothing, even if we send it the handshake. So this listener 683// only hears players whose URL has that flag; adding it to customer HTML at serve 684// time is a separate commit, deliberately, because that mutates what visitors load. 685// 686// With the flag, the protocol is: post a listening message, then the player streams 687// infoDelivery with playerState, currentTime and duration. 688// 689// The handshake repeats on a timer, and the honest reason is that it catches frames 690// that appear after load (a tab, an accordion, a script-mounted embed). Whether a 691// player also STOPS streaming when we stop asking was not established: repeats are 692// answered "alreadyInitialized", which suggests the first one is what arms it. The 693// polling stays because the version with polling is the one verified to work end to 694// end, and trading that for an unverified optimisation would risk silently losing 695// every embed metric. The steady-state cost is one postMessage per api-enabled 696// frame every 2s. 697// 698// Unlike Vimeo, YouTube sends JSON STRINGS, so the payload needs parsing before it 699// looks like anything. 700// 701// playerState is YouTube's enum: -1 unstarted, 0 ended, 1 playing, 2 paused, 702// 3 buffering, 5 cued. 703function ytHostOk(origin){ 704try{ 705var h=new URL(origin).hostname.toLowerCase(); 706return h==="www.youtube.com"||h==="youtube.com"||h==="www.youtube-nocookie.com"||h==="youtube-nocookie.com"; 707}catch(e){return false;} 708} 709function ytLabel(f){ 710try{ 711var m=(f.getAttribute("src")||"").match(/\/embed\/([A-Za-z0-9_-]{11})/); 712return m?"youtube:"+m[1]:"youtube"; 713}catch(e){return "youtube";} 714} 715function ytFrameFor(src){ 716try{ 717var fr=document.querySelectorAll("iframe"); 718for(var i=0;i<fr.length;
718i++){if(fr[i].contentWindow===src)return fr[i];} 719}catch(e){} 720return null; 721} 722// Ask every api-enabled YouTube frame to start reporting, and keep asking. Cheap: a 723// postMessage to a frame that is not a YouTube player is simply ignored. 724function ytListen(){ 725try{ 726var fr=document.querySelectorAll('iframe[src*="enablejsapi=1"]'); 727for(var i=0;i<fr.length;i++){ 728try{fr[i].contentWindow.postMessage('{"event":"listening","id":"hp","channel":"widget"}',"*");}catch(e){} 729} 730}catch(e){} 731} 732setTimeout(ytListen,1200); 733setInterval(ytListen,2000); 734window.addEventListener("message",function(e){ 735try{ 736if(!ytHostOk(e.origin))return; 737var d=e.data; 738// YouTube sends strings; anything else is not its API talking. 739if(typeof d!=="string")return; 740try{d=JSON.parse(d);}catch(x){return;} 741if(!d||typeof d!=="object"||d.event!=="infoDelivery")return; 742var info=d.info; 743if(!info||typeof info!=="object")return; 744var f=ytFrameFor(e.source); 745if(!f)return; 746var id=ytLabel(f); 747var state=info.playerState; 748// Same intent rule as Vimeo and <video>, but YouTube hands us no discrete 'play' 749// event: infoDelivery repeats playerState 1 for the WHOLE of playback. So the 750// decision is made on the TRANSITION into playing and latched there, never 751// re-read. Re-reading it is precisely the bug decidePlay documents, and it is 752// reachable here in a way it is not for <video>: a muted autoplay is correctly 753// suppressed, then one unrelated trusted click (the form, alt-tab, a screenshot) 754// flips userGestured and the next state-1 update promotes a video nobody chose 755// into a counted play, quartiles and all. Latching on the transition also keeps 756// the <video> semantics that a chosen REPLAY after a decorative autoplay counts, 757// because that arrives as 2 then 1. 758var prev=f.__hpYtPrev; 759f.__hpYtPrev=state; 760if(state===1&&prev!==1){ 761f.__hpEmbedCounted=userGestured?1:0; 762if(f.__hpEmbedCounted===1)microEvent("video_start",id); 763} 764if(f.__hpEmbedCounted!==1)return; 765if(state===0){ 766// Ended implies every quartile, even if a throttled tab skipped an update. 767microEvent("video_p25",id);microEvent("video_p50",id);microEvent("video_p75",id);microEvent("video_p100",id); 768return; 769} 770var dur=info.duration,cur=info.currentTime; 771// A live stream reports duration 0, and a quartile of an unknown length is 772// meaningless â report the play and nothing more. 773if(typeof dur!=="number"||typeof cur!=="number"||!isFinite(dur)||dur<=0)return; 774var pct=(cur/dur)*100; 775if(pct>=25)microEvent("video_p25",id); 776if(pct>=50)microEvent("video_p50",id); 777if(pct>=75)microEvent("video_p75",id); 778// p100 comes from playerState 0, not a threshold: the final update lands short. 779}catch(err){} 780}); 781// SYNC-END embed-video-listeners 782document.addEventListener("ended",function(e){ 783var v=e.target; 784if(!v||v.tagName!=="VIDEO")return; 785if(!countedPlay(v))return; 786var id=videoId(v); 787// Watched to the end implies every quartile, even if a throttled background tab 788// skipped a timeupdate. 789microEvent("video_p25",id);microEvent("video_p50",id);microEvent("video_p75",id);microEvent("video_p100",id); 790},true); 791 792// âââ Scheduler widgets (HP-3461 phase 3) ââââââââââââââââââââââââââââââââââââ 793// An inline Calendly/Cal.com embed is a CROSS-ORIGIN iframe, so we cannot see a 794// click inside it â which is why booking_open (a click on an outbound scheduling 795// link) is absent on exactly the pages most likely to take bookings. The widget 796// broadcasts its own progress to the parent window, so we get told instead of 797// guessing. No SDK needed; Calendly posts these regardless. 798// 799// SECURITY: any frame can post a message claiming to be a booking, and this ships 800// on every published page, so the sender's ORIGIN must be a recognised scheduling 801// host AND the message must match the provider's shape. Everything else is ignored. 802// PRIVACY: only WHICH STEP is read. event.data.payload (invitee details on 803// event_scheduled) is never touched. 804// SYNC with app/src/lib/analytics-tracking-script.ts. 805function schedulerOrigin(origin){ 806try{ 807var h=new URL(origin).hostname.toLowerCase(); 808for(var i=0;i<BOOK_HOSTS.length;i++){ 809var b=BOOK_HOSTS[i]; 810if(h===b||h.slice(-(b.length+1))==="."+b)return b; 811} 812}catch(e){} 813return null; 814} 815// calendly.profile_page_viewed is deliberately ignored: it fires for a profile
816// listing rather than a bookable calendar, so it would inflate the funnel's top. 817window.addEventListener("message",function(e){ 818try{ 819var host=schedulerOrigin(e.origin); 820if(!host)return; 821var d=e.data; 822if(!d||typeof d!=="object")return; 823// Calendly's vocabulary reads off d.event and is prefixed; Cal.com's reads off 824// d.type and is not. Verified against live widgets on both, plus Cal.com's own 825// EventDataMap in packages/embeds/embed-core/src/sdk-action-manager.ts. 826// calendly.profile_page_viewed is ignored: it fires for a profile listing rather 827// than a bookable calendar, so it would inflate the top of the funnel. 828// 829// Cal.com HAS NO time-selection event. Its full enum (27 keys) contains nothing for 830// picking a date or slot -- availabilityLoaded and slotsFetched are the widget 831// LOADING options, not a visitor choosing one. So Cal.com reports 2 of the 3 steps, 832// and booking_time_selected is left ABSENT for it rather than synthesised from the 833// booking. Fabricating it would make every Cal.com page show a flat 100% from 834// "selected" to "completed" -- a number that looks measured and is not. Absent 835// already means "not measurable here" everywhere else in this feature (see the 836// video quartiles), and the read side honours that. 837// 838// Emissions are LITERALS, one branch per step, so the sync seam in 839// page-engagement-kinds.test.ts can see them -- it caught booking_completed going 840// unverifiable when this was table-driven. 841var name=typeof d.event==="string"?d.event:(typeof d.type==="string"?d.type:null); 842if(!name)return; 843if(host==="calendly.com"){ 844if(name==="calendly.event_scheduled"){ 845microEvent("booking_viewed",host); 846microEvent("booking_time_selected",host); 847microEvent("booking_completed",host); 848// The booking is the outcome this exists to catch and the visitor usually leaves 849// for the confirmation, so flush rather than wait out the 5s timer. 850flush(); 851}else if(name==="calendly.date_and_time_selected"){ 852microEvent("booking_viewed",host); 853microEvent("booking_time_selected",host); 854}else if(name==="calendly.event_type_viewed"){ 855microEvent("booking_viewed",host); 856} 857}else if(host==="cal.com"){ 858// bookingSuccessfulV2 deprecates bookingSuccessful and both are still in the enum, 859// so accept either -- customers sit on different embed versions. 860if(name==="bookingSuccessfulV2"||name==="bookingSuccessful"){ 861// NOTE: no booking_time_selected here. Cal.com cannot report it. 862microEvent("booking_viewed",host); 863microEvent("booking_completed",host); 864flush(); 865}else if(name==="bookerViewed"){ 866microEvent("booking_viewed",host); 867} 868} 869// No acuityscheduling.com branch, and there never can be one. Its embed script 870// exchanges only sizing/load/scrollTo/scrollBy/gaMeasurementId with the parent and 871// takes a Google Analytics client id INWARD â there is no booking message to hear. 872// Acuity reports outward only through its webhooks (HP-4041's inbound conversion 873// webhook is the route). A branch here would be dead code. See lib/scheduling-hosts. 874// Its origin stays accepted by the gate above, which costs nothing: an origin that 875// never speaks simply never matches. 876}catch(err){} 877}); 878 879// Consent usually arrives seconds after load, so a bare load listener would 880// never fire and rum_timing would vanish from every CMP-gated page. The 881// navigation/paint entries report the same absolute numbers whenever read. 882function hpRumTiming(){ 883setTimeout(function(){ 884try{ 885var perf=performance.getEntriesByType("navigation")[0]; 886if(perf){ 887var ev=makeEvent("rum_timing",{loadTimeMs:Math.round(perf.loadEventEnd-perf.startTime),ttfbMs:Math.round(perf.responseStart-perf.startTime),fcpMs:undefined}); 888var paintEntries=performance.getEntriesByType("paint"); 889for(var i=0;i<paintEntries.length;i++){if(paintEntries[i].name==="first-contentful-paint"){ev.payload.fcpMs=Math.round(paintEntries[i].startTime);break;}} 890buffer.push(ev); 891} 892}catch(e){} 893},2000); 894} 895if(document.readyState==="complete")hpRumTiming();else window.addEventListener("load",hpRumTiming); 896}); 897})(); 898</script>
898<script data-page-id="bthr9fgjr4tunfrsf2zhq0ba" data-page-slug="panam_mdeo_declaration_en" data-api-url="https://htmlpub.com" data-turnstile-key="0x4AAAAAAD7Sp6X7R_qRx-Cz" data-htmlpub-forms> 899(function(){ 900var s=document.querySelector("script[data-htmlpub-forms]"); 901var pageId=s.getAttribute("data-page-id"); 902var slug=s.getAttribute("data-page-slug"); 903var api=s.getAttribute("data-api-url")+"/api/forms/submit"; 904// Owner-mode: editor previews and the in-app shell load this script with 905// data-owner="1". We still listen for submits (the editor surfaces success 906// state to the user via the toolbar), but we MUST NOT fire conversion 907// pixels â that would pollute the customer's Meta / TikTok pixel data 908// with editor test traffic indistinguishable from real visitors. 909var _hpIsOwner=s.getAttribute("data-owner")==="1"; 910// Preview-mode: the editor's Preview loads owner-gated (draft access + no pixel 911// pollution) but must show the true visitor experience. _hpIsPreview lets visitor-UX 912// blocks (multi-step paging) run even though _hpIsOwner is set; pixel/submission gates 913// stay owner-only. 914var _hpIsPreview=s.getAttribute("data-preview")==="1"; 915var _hpAutomaticConversionEventsEnabled=s.getAttribute("data-automatic-conversion-events")!=="0"; 916var _hpTurnstileKey=s.getAttribute("data-turnstile-key")||""; 917// data-persist-hidden: fields hidden via the inspector â hidden from visitors on 918// the live page but still submitted (attribution/UTM). The edit canvas (owner, NOT 919// preview) skips the rule so the inspector keeps them visible with a "Hidden" chip; 920// Preview applies it so it matches the published page. 921if(!_hpIsOwner||_hpIsPreview){try{var _hpHideStyle=document.createElement("style");_hpHideStyle.setAttribute("data-htmlpub-forms-hide","");_hpHideStyle.textContent="[data-persist-hidden]{display:none!important}";(document.head||document.documentElement).appendChild(_hpHideStyle);}catch(e){}} 922// Multiple-choice radio/checkbox width normalization is NOT injected at runtime. 923// The editor bakes an inline width:auto onto each option input (idempotently), so the 924// fix persists in the saved HTML and follows the normal draft -> publish flow instead 925// of overriding every served form's checkboxes/radios on every page load. 926// A field hidden from visitors (data-persist-hidden -> display:none) that ALSO carries native 927// required cannot be focused, so on a single-step form native constraint validation would 928// silently abort submit on it (the multi-step path already skips hidden fields via 929// _hpValidatable). Drop the required attribute from hidden controls on the served page so 930// submission is never blocked by a field the visitor can't see; the field still submits its value. 931if(!_hpIsOwner||_hpIsPreview){try{var _hpHidReq=document.querySelectorAll("[data-persist-hidden][required],[data-persist-hidden] [required]");for(var _hphr=0;_hphr<_hpHidReq.length;_hphr++)_hpHidReq[_hphr].removeAttribute("required");}catch(e){}} 932// The form's real submit button â never one of the authored multi-step nav buttons 933// (data-persist-ms-back/next), which may be type-less if hand-authored. 934function _hpFindSubmit(form){return form.querySelector("[type=submit]:not([data-persist-ms-back]):not([data-persist-ms-next]),button[type=submit]:not([data-persist-ms-back]):not([data-persist-ms-next]),button:not([type]):not([data-persist-ms-back]):not([data-persist-ms-next])");} 935// A checkbox group marked required-as-a-group (data-persist-group-required) is satisfied when 936// AT LEAST ONE member is checked â native required on each box would wrongly demand ALL. 937// Returns true if every such group within the given scope is satisfied; otherwise reports validity on 938// the first empty group (clearing on the next change) and returns false. 939function _hpGroupReqOK(scope){ 940var boxes=scope.querySelectorAll('input[type="checkbox"][data-persist-group-required]'); 941var groups={}; 942for(var i=0;i<boxes.length;i++){var n=boxes[i].name||("__hp"+i);if(!groups[n])groups[n]=[];groups[n].push(boxes[i]);} 943for(var nm in groups){if(!Object.prototype.hasOwnProperty.call(groups,nm))continue; 944var g=groups[nm],any=false,first=null; 945for(var j=0;j<g.length;j++){if(g[j].closest&&g[j].closest("[data-persist-hidden]"))continue;if(!first)first=g[j];if(g[j].checked)any=true;} 946if(first&&!any){try{first.setCustomValidity("Please select at least one option.");
946if(first.reportValidity)first.reportValidity();var _clr=function(){try{first.setCustomValidity("");}catch(e){}for(var k=0;k<g.length;k++)g[k].removeEventListener("change",_clr);};for(var k2=0;k2<g.length;k2++)g[k2].addEventListener("change",_clr);}catch(e){}return false;}} 947return true; 948} 949// Pick a Turnstile theme (light/dark) from the first opaque background behind the form, so the 950// widget matches the PAGE rather than defaulting to the visitor's system theme ("auto"). Parses 951// the rgb() string without a regex escape (template-literal safe). Falls back to "auto". 952function _hpPickTheme(el){ 953try{ 954var n=el; 955while(n&&n.nodeType===1){ 956var bg=window.getComputedStyle(n).backgroundColor||""; 957if(bg.indexOf("rgb")===0){ 958var p=bg.replace(/[^0-9.,]/g,"").split(","); 959var a=p.length>3?parseFloat(p[3]):1; 960if(a>0.1){var lum=(0.299*+p[0]+0.587*+p[1]+0.114*+p[2])/255;return lum>0.5?"light":"dark";} 961} 962n=n.parentElement; 963} 964}catch(e){} 965return "auto"; 966} 967// Inject the Turnstile widget on a spam-protected form via the platform-origin bridge iframe. 968// The widget CANNOT render inline on a customer's custom domain: Turnstile binds a widget to a 969// hostname allowlist (Enterprise caps at 200, no wildcards), so customer domains can't be listed. 970// Instead we embed /turnstile-bridge served from data-api-url (a platform origin that IS on the 971// allowlist); it renders the widget there and postMessages the token back (see the listener below). 972// Placed ABOVE the submit's outermost row so on a multi-step footer nav it sits on its own line. 973// Starts 0px (interaction-only is invisible); the bridge posts a resize only if a challenge appears. 974// Idempotent; no-op without the feature flag or inside a sandboxed iframe (the /p shell renders its 975// own widget on the app origin). 976function _hpInjectCaptcha(f){ 977if(!_hpTurnstileKey||inSandbox||!f||f.querySelector("iframe[data-hp-turnstile]"))return; 978var base=(s.getAttribute("data-api-url")||""); 979if(base&&base.charAt(base.length-1)==="/")base=base.slice(0,-1); 980if(!base)return; 981var fr=document.createElement("iframe"); 982fr.setAttribute("data-hp-turnstile",""); 983fr.setAttribute("title","Spam protection"); 984fr.setAttribute("scrolling","no"); 985fr.style.cssText="width:100%;max-width:320px;height:0;border:0;display:block;overflow:hidden;"; 986fr.src=base+"/turnstile-bridge?theme="+encodeURIComponent(_hpPickTheme(f)); 987var sb=_hpFindSubmit(f); 988if(sb){var row=sb;while(row.parentNode&&row.parentNode!==f)row=row.parentNode;if(row.parentNode===f)f.insertBefore(fr,row);else if(sb.parentNode)sb.parentNode.insertBefore(fr,sb);else f.appendChild(fr);}else f.appendChild(fr); 989} 990// Receive the Turnstile token from the platform-origin bridge iframe. Origin-checked against 991// data-api-url. Stores the token on the owning form for the submit path; resizes the iframe when 992// Managed mode shows an actual challenge (invisible/auto-pass stays 0px). One listener serves 993// every captcha form on the page. 994(function(){ 995var _hpBO="";try{_hpBO=new URL(s.getAttribute("data-api-url")||"",location.href).origin;}catch(e){} 996window.addEventListener("message",function(e){ 997if(!_hpBO||e.origin!==_hpBO)return; 998var d=e.data;if(!d||d.source!=="hp-turnstile")return; 999var frs=document.querySelectorAll("iframe[data-hp-turnstile]"),host=null; 1000for(var i=0;i<frs.length;i++){if(frs[i].contentWindow===e.source){host=frs[i];break;}} 1001if(!host)return; 1002var form=host.closest?host.closest("form"):null; 1003if(d.type==="token"){if(form){form.__hpCaptchaToken=(d.token||"");form.__hpCaptchaError=false;}} 1004else if(d.type==="expired"){if(form)form.__hpCaptchaToken="";} 1005// A terminal bridge error (misconfigured/unreachable widget, keys mismatch) means no token can 1006// ever be produced; flag it so the submit gate fails OPEN rather than trapping the visitor forever 1007// (the server still fails open for the same unconfigured case). Distinct from expired (retr
1007yable). 1008else if(d.type==="error"){if(form){form.__hpCaptchaToken="";form.__hpCaptchaError=true;}} 1009else if(d.type==="resize"){var h=+d.height||0;host.style.height=(h>0?h:0)+"px";host.style.margin=(h>0?"12px 0":"0");} 1010}); 1011})(); 1012// Bounded wait for a Turnstile token, with a single re-challenge (decided fail policy #1/#2). 1013// The bridge delivers the token via postMessage, which can land slightly AFTER the visitor 1014// clicks submit (invisible challenge still resolving). Give it a bounded window; if none 1015// arrives, force ONE fresh challenge (reload the bridge iframe) and wait a final window; if 1016// STILL none, proceed anyway â the server accepts the lead and flags it unverified rather 1017// than dropping it. done() runs exactly once: as soon as a token appears, the bridge reports 1018// a terminal error, or the budget is spent. 1019function _hpWaitForCaptcha(f,done){ 1020var WAIT=3000,STEP=100,called=false; 1021function finish(){if(called)return;called=true;done();} 1022function poll(deadline,onExpire){ 1023if((f.__hpCaptchaToken||"")!==""||f.__hpCaptchaError){finish();return;} 1024if(Date.now()>=deadline){onExpire();return;} 1025setTimeout(function(){poll(deadline,onExpire);},STEP); 1026} 1027poll(Date.now()+WAIT,function(){ 1028if((f.__hpCaptchaToken||"")!==""||f.__hpCaptchaError){finish();return;} 1029try{var fr=f.querySelector("iframe[data-hp-turnstile]");if(fr)fr.src=fr.src;}catch(e){} 1030poll(Date.now()+WAIT,finish); 1031}); 1032} 1033// reCAPTCHA enforcement (HP-1475): only pages whose owner opted in emit this 1034// flag. It gates the client-side submit block below so pages that merely carry 1035// a decorative widget (the pre-HP-1475 status quo) keep working unchanged. 1036var _hpRecaptchaEnforced=s.getAttribute("data-recaptcha-enforced")==="1"; 1037var corrId=0; 1038var pendingCallbacks={}; 1039 1040// Detect if we're in a sandboxed iframe 1041var inSandbox=false; 1042try{inSandbox=window!==window.parent;}catch(e){inSandbox=true;} 1043 1044function cleanKey(s){return s.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"").substring(0,30);} 1045// SYNC: mirror worker-pages/src/scripts/forms.ts and app/src/lib/extract-form-fields.ts 1046function looksLikeRawId(s){return /^[a-f0-9]{32}$/i.test(s)||/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i.test(s)||/^[a-f0-9]{32}-[A-Za-z0-9_-]{20,40}$/.test(s);} 1047function fieldKey(el,idx){ 1048if(el.name&&!looksLikeRawId(el.name))return el.name; 1049if(el.id&&!looksLikeRawId(el.id))return el.id; 1050var df=el.getAttribute("data-field")||el.getAttribute("data-name"); 1051if(df&&!looksLikeRawId(df))return df; 1052// Type-based semantic hint. <input type="email"> without an explicit name 1053// should still be identified as "email" so the lead-capture extractor can 1054// find the address. Same for tel/url. Critical when the page builder 1055// (HTMLPub editor / Sacca's offers.leadpages.com pages) emits inputs 1056// without name attributes â without this, the email field gets keyed off 1057// its placeholder ("alex_at_youragency_com") and no lead is extracted. 1058if(el.type==="email")return "email"; 1059if(el.type==="tel")return "phone"; 1060if(el.type==="url")return "url"; 1061// Sibling label pattern: <label>Foo</label><input ...> inside a wrapper. 1062// Common in modern form layouts. The existing closest(label) check below 1063// only catches WRAPPING labels, not sibling ones. 1064var prev=el.previousElementSibling; 1065if(prev&&prev.tagName==="LABEL"&&prev.textContent){var pk=cleanKey(prev.textContent);if(pk)return pk;} 1066if(el.placeholder){var ck=cleanKey(el.placeholder);if(ck)return ck;} 1067var al=el.getAttribute("aria-label"); 1068if(al){var ck2=cleanKey(al);if(ck2)return ck2;} 1069if(el.id){var lbl=document.querySelector('label[for="'+el.id+'"]');if(lbl&&lbl.textContent){var ck3=cleanKey(lbl.textContent);if(ck3)return ck3;}} 1070var par=el.closest?el.closest("label"):null; 1071if(par&&par.textContent){var ck4=cleanKey(par.textContent);if(ck4)return ck4;} 1072return (el.type||"field")+"_"+idx; 1073} 1074// Known third-party tracking field patterns to ignore 1075var _blocklist=/^(lp[_s]?plan|ub[_s]?plan|gtrans|__hstc|__hssc|__hsfp|hutk|_mkto_trk|_biz_uid|_biz_nA|_biz_pendingA|_biz_flagsA|mkt_tok|li_fat_id|_ga|_gid|_fbp|_fbc|_uetsid|_uetvid|mc_cid|mc_eid|_drip_client_|__ss|__ss_referrer|ss_campaign|ss_source|ss_cid|siq_|sq_|_uc_|tl|sl|vote|query|_hp_vid|g-recaptcha-response)$/i; 1076function _isInjected(el){
1077// Skip hidden inputs not present in the original page HTML. 1078// Third-party scripts (Customers.ai, HubSpot, etc.) inject hidden fields 1079// at runtime. We detect these by checking if they were present at DOMContentLoaded. 1080if(el.type==="hidden"&&!el.hasAttribute("data-hp-original"))return true; 1081return false; 1082} 1083function collect(f){ 1084var d={}; 1085var els=f.elements||f.querySelectorAll("input,textarea,select"); 1086var used={}; 1087var hasVisibleValue=false; 1088for(var i=0;i<els.length;i++){ 1089var el=els[i]; 1090if(el.type==="file"||el.type==="submit"||el.type==="button")continue; 1091if((el.type==="checkbox"||el.type==="radio")&&!el.checked)continue; 1092if(_isInjected(el))continue; 1093// International-phone controls: the visible national input (data-hp-phone-nat) and 1094// the injected country <select> (data-hp-phone-cc) are NOT collected â the hidden 1095// E.164 companion carries the value under the field's name. The national input still 1096// counts toward hasVisibleValue so a phone-only form isn't treated as empty. 1097if(el.hasAttribute&&el.hasAttribute("data-hp-phone-nat")){if(el.value&&el.value.trim())hasVisibleValue=true;continue;} 1098if(el.hasAttribute&&el.hasAttribute("data-hp-phone-cc"))continue; 1099// Empty URL-param inputs are dropped from the payload so direct-traffic 1100// submissions from a form with data-persist-capture-utms (or hand-authored 1101// data-persist-url-param inputs) don't ship 7 blank attribution columns 1102// into every submission, integration webhook, CSV export, and CAPI event. 1103// Author-provided value="direct" (or any non-empty default) still ships. 1104if(el.type==="hidden"&&!(el.value||"").trim()&&el.hasAttribute("data-persist-url-param"))continue; 1105var key=fieldKey(el,i); 1106if(_blocklist.test(key))continue; 1107if(used[key]){key=key+"_"+i;} 1108used[key]=true; 1109d[key]=el.value; 1110if(el.type!=="hidden"&&el.value&&el.value.trim())hasVisibleValue=true; 1111} 1112// Require at least one visible field with a value â pure hidden-field submissions are noise 1113if(!hasVisibleValue)return {}; 1114return d; 1115} 1116 1117// Generate a UUID v4 (browser-side). Used as the eventID that ties the 1118// fbq/ttq browser event to the matching CAPI event the server sends via 1119// the integration queue â provider workflow, so pixel platforms can dedup. 1120function _hpUuid(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(c){var r=Math.random()*16|0;return(c==="x"?r:(r&3|8)).toString(16);});} 1121 1122// Fire the canonical "Lead" event on every installed pixel platform. Only 1123// platforms that booted (window.fbq, window.ttq, window.gtag, window.dataLayer) 1124// receive a call â others no-op cleanly. The eventID is threaded into the 1125// provider-specific dedup parameter (Meta: eventID, TikTok: event_id). 1126function _hpFireLead(formIdent,data,eventId){ 1127 if(_hpIsOwner||!_hpAutomaticConversionEventsEnabled)return; 1128 var em=null,ph=null,fn=null,ln=null; 1129 for(var k in data){ 1130 if(!Object.prototype.hasOwnProperty.call(data,k))continue; 1131 var v=(data[k]||"").toString().trim(); 1132 if(!v)continue; 1133 var kl=k.toLowerCase(); 1134 if(!em&&/email/.test(kl)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v))em=v; 1135 else if(!ph&&/phone|tel|mobile/.test(kl))ph=v; 1136 else if(!fn&&/first.?name|fname/.test(kl))fn=v; 1137 else if(!ln&&/last.?name|lname/.test(kl))ln=v; 1138 } 1139 var custom={};if(em)custom.em=em;if(ph)custom.ph=ph;if(fn)custom.fn=fn;if(ln)custom.ln=ln; 1140 try{if(window.fbq)window.fbq("track","Lead",custom,{eventID:eventId});}catch(e){} 1141 try{if(window.ttq&&window.ttq.track)window.ttq.track("SubmitForm",custom,{event_id:eventId});}catch(e){} 1142 try{if(window.gtag)window.gtag("event","generate_lead",{event_id:eventId,lp_form_id:formIdent});}catch(e){} 1143 try{if(window.dataLayer&&window.dataLayer.push)window.dataLayer.push({event:"lp_form_submit",lp_event_id:eventId,lp_form_id:formIdent});}catch(e){} 1144} 1145 1146// First-interaction hook: when the visitor focuses any form field for the 1147// first time on this page, fire the platform's "started a form" event. 1148// Once per form per page (debounced via _hpFiredInitFocus). 1149var _hpFiredInitFocus={}; 1150function _hpFireInitiateCheckout(formIdent){ 1151 if(_hpIsOwner||!_hpAutomaticConversionEventsEnabled)return; 1152 if(_hpFiredInitFocus[formIdent])return; 1153 _hpFiredInitFocus[formIdent]=true; 1154 var eid=_hpUuid(); 1155 try{if(window.fbq)window.fbq("track","InitiateCheckout",{}
1155,{eventID:eid});}catch(e){} 1156 try{if(window.ttq&&window.ttq.track)window.ttq.track("InitiateCheckout",{},{event_id:eid});}catch(e){} 1157 try{if(window.gtag)window.gtag("event","form_start",{event_id:eid,lp_form_id:formIdent});}catch(e){} 1158 try{if(window.dataLayer&&window.dataLayer.push)window.dataLayer.push({event:"lp_form_start",lp_event_id:eid,lp_form_id:formIdent});}catch(e){} 1159} 1160// HP-3461 â the same first-interaction moment, reported to OUR analytics. It has 1161// been detected here all along and told to Facebook, TikTok, Google and GTM 1162// (above) while our own funnel never heard about it, so "169 started the form, 17 1163// finished" was unanswerable from first-party data. 1164// 1165// Deliberately NOT inside _hpFireInitiateCheckout: that is gated on 1166// _hpAutomaticConversionEventsEnabled, the customer's AD-PIXEL preference, and 1167// switching off automatic ad conversion events must not blind our own analytics. 1168// 1169// Requires a real visitor gesture. A focusin alone is not evidence of intent: 1170// <input autofocus>, a popup that focuses its email field on open, and browser 1171// autofill all fire it with nobody touching the keyboard, which would report a 1172// form_start for ~every session and make the abandonment number this feature 1173// exists to answer ("169 started, 17 finished") read as a 100% start rate on a 1174// page nobody typed into. _hpFireInitiateCheckout above has always had this bug; 1175// it only ever fed ad pixels, so nobody noticed. 1176// 1177// Owner previews self-gate: analyticsTrackingScript returns on data-owner="1" 1178// BEFORE registering window.__hpupPushEvent, so this finds no bridge and no-ops. 1179// (The edge serves only public traffic, so the same code is correct on both 1180// hosts. Known gap, pre-existing and not widened by form_start: the Nova page 1181// switcher omits ?token=, so isOwnerForAnalytics misses it and page_view / 1182// scroll_depth / element_click already report from that path.) 1183// SYNC with worker-pages/src/scripts/forms.ts â these files must stay byte-identical. 1184var _hpFormStartGesture=false; 1185function _hpMarkFormGesture(){_hpFormStartGesture=true;} 1186document.addEventListener("pointerdown",_hpMarkFormGesture,true); 1187document.addEventListener("keydown",_hpMarkFormGesture,true); 1188document.addEventListener("touchstart",_hpMarkFormGesture,{passive:true,capture:true}); 1189// Object.create(null), not {}: the key is formId(), i.e. the author-controlled 1190// id/name attribute. With a bare object a form named "constructor" or "toString" 1191// reads as already-fired on its very first focus and never reports at all, and 1192// "__proto__" cannot even be latched â the page would show submissions with no 1193// starts whatsoever. 1194var _hpFiredFormStart=Object.create(null); 1195function _hpReportFormStart(formIdent){ 1196 if(!_hpFormStartGesture)return; 1197 var k=String(formIdent||""); 1198 if(_hpFiredFormStart[k])return; 1199 _hpFiredFormStart[k]=true; 1200 try{if(window.__hpupPushEvent)window.__hpupPushEvent("page_engagement",{kind:"form_start",id:k.slice(0,128)});}catch(e){} 1201} 1202document.addEventListener("focusin",function(e){ 1203 var el=e.target; 1204 if(!el||(el.tagName!=="INPUT"&&el.tagName!=="TEXTAREA"&&el.tagName!=="SELECT"))return; 1205 if(el.type==="hidden"||el.type==="submit"||el.type==="button")return; 1206 var f=el.closest&&(el.closest("form")||el.closest("[data-htmlpub-fake-form]")); 1207 if(!f)return; 1208 _hpReportFormStart(formId(f)); 1209 _hpFireInitiateCheckout(formId(f)); 1210},true); 1211 1212// Set _hp_email cookie when we find an email in form data (for CRM personalization) 1213function setEmailCookie(data){ 1214var email=null; 1215for(var k in data){ 1216if(!data.hasOwnProperty(k))continue; 1217var v=(data[k]||"").toString(); 1218if(/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(v.trim())){email=v.trim();break;} 1219} 1220if(email){ 1221try{var enc=btoa(email.toLowerCase().trim());document.cookie="_hp_email="+encodeURIComponent(enc)+";path=/;max-age=31536000;SameSite=Lax;Secure";}catch(e){} 1222} 1223} 1224 1225// Read _hpid from URL and set cookie for future visits 1226(function(){ 1227var p=new URLSearchParams(window.location.search); 1228var hpid=p.get("_hpid"); 1229if(hpid){ 1230try{var decoded=atob(hpid);if(decoded.indexOf("@")!==-1){document.cookie="_hp_email="+encodeURIComponent(hpid)+";path=/;max-age=31536000;SameSite=Lax;Secure";}}catch(e){} 1231} 1232})(); 1233 1234// URL-parameter auto-populate. Any input/textarea/select with 1235// data-persist-url-param="<name>" gets its value set from 1236// URLSearchParams(location.search).get(<name>) on script boot. Enables UTM / 1237// gclid / fbclid / any-custom-param capture into form submissions without a
1238// custom head script. An author (or the AI builder) drops 1239// <input type="hidden" name="utm_source" data-persist-url-param="utm_source"> 1240// and the runtime fills it in from ?utm_source=... on page load. Runs 1241// BEFORE the data-hp-original tagging pass below so the populated hidden 1242// inputs get stamped and pass _isInjected. utm_* names are not on 1243// _blocklist. Missing params leave any pre-existing value intact so authors 1244// can specify a fallback via a plain value="" on the input. Selector is 1245// scoped to form fields so a stray attribute on a non-form element is a 1246// no-op rather than a silent property write. Repeated params 1247// (?utm_source=a&utm_source=b) resolve to the first value ("a") per the 1248// URLSearchParams.get() spec. 1249try{ 1250var _hpUrlParams=new URLSearchParams(window.location.search); 1251document.querySelectorAll("input[data-persist-url-param],textarea[data-persist-url-param],select[data-persist-url-param]").forEach(function(el){ 1252var pname=el.getAttribute("data-persist-url-param"); 1253if(!pname)return; 1254var pv=_hpUrlParams.get(pname); 1255if(pv!==null&&pv!=="")el.value=pv; 1256}); 1257}catch(e){} 1258 1259// Standard-UTM auto-capture. A form with data-persist-capture-utms gets the 1260// seven standard attribution params (utm_source, utm_medium, utm_campaign, 1261// utm_term, utm_content, gclid, fbclid, msclkid) auto-injected as hidden inputs + 1262// populated from URLSearchParams if the URL carries them. Editor UI toggles 1263// the attribute; runtime does the injection. Idempotent by name, so a form 1264// with a pre-existing named hidden input (author-written or AI-authored) 1265// keeps its own definition and is only value-populated by the URL-param 1266// pass above. Runs BEFORE the data-hp-original tagging pass below so the 1267// injected inputs get stamped and pass _isInjected on submission. 1268try{ 1269var _HP_STD_UTMS=["utm_source","utm_medium","utm_campaign","utm_term","utm_content","gclid","fbclid","msclkid"]; 1270document.querySelectorAll("form[data-persist-capture-utms]").forEach(function(f){ 1271_HP_STD_UTMS.forEach(function(n){ 1272if(f.querySelector('input[name="'+n+'"]'))return; 1273var inp=document.createElement("input"); 1274inp.type="hidden"; 1275inp.name=n; 1276inp.setAttribute("data-persist-url-param",n); 1277var v=_hpUrlParams.get(n); 1278if(v!==null&&v!=="")inp.value=v; 1279f.appendChild(inp); 1280}); 1281}); 1282}catch(e){} 1283 1284// Cloudflare Turnstile CAPTCHA. A form with data-persist-captcha gets the bridge iframe 1285// injected before its submit control when the feature flag is set. TOP-LEVEL path only â in 1286// the sandboxed /p/ iframe the parent shell renders the widget (opaque origin can't run 1287// Turnstile). Owner/editor previews skip it. The bridge posts the token back (listener near 1288// _hpInjectCaptcha), stashed on the form and read by submitData as the top-level captchaToken. 1289if(!_hpIsOwner&&!inSandbox){try{ 1290document.querySelectorAll("form[data-persist-captcha]").forEach(function(f){ 1291// Multi-step forms defer injection to the LAST step (see the multi-step render), so the 1292// widget renders fresh + visible next to the submit and never appears on an earlier step. 1293if(f.hasAttribute("data-persist-multistep"))return; 1294_hpInjectCaptcha(f); 1295}); 1296}catch(e){}} 1297 1298// Authored multi-step progress indicator â a real [data-persist-ms-progress] element the 1299// editor builds as page content (variant "text" | "bar" | "dots"), so the author restyles it 1300// like anything else on the page. Only its STATE is written here; the structure is authored 1301// markup and is never rebuilt, or a restyle would be thrown away on every step. MIRROR of 1302// syncMsProgressState in visual-editor/iframe-script/utils.ts, which does the same for the 1303// edit canvas â that file cannot be imported from here (this script is a self-contained twin 1304// of a separate Cloudflare-worker package; see form-scripts-sync.test.ts), so the two copies 1305// must agree on every attribute name below. Not to be confused with the TRANSIENT 1306// data-htmlpub-ms-progress line further down, injected only for a form with no authored nav. 1307function _hpMsProgress(f,cur,total){ 1308var p=f.querySelector("[data-persist-ms-progress]"); 1309if(!p)return; 1310var t=p.querySelector("[data-persist-ms-progress-text]"); 1311if(t)t.textContent="Step "+(cur+1)+" of "+total; 1312var fill=p.querySelector("[data-persist-ms-progress-fill]"); 1313if(fill)fill.style.width=(total>0?((cur+1)/total)*100:100)+"%"; 1314var dots=p.querySelectorAll("[data-persist-ms-progress-dot]"); 1315for(var i=0;i<dots.length;i++)dots[i].style.opacity=(i<=cur?"1":"0.25"); 1316// A connector counts as travelled only once the step AFTER it is reached. 1317var lines=p.querySelectorAll("[data-persist-ms-progress-line]"); 1318for(var j=0;j<lines.length;j++)lines[j].style.opacity=(j<cur?"1":"0.25"); 1319} 1320 1321// ââ Multi-step forms ââ a form[data-persist-multistep] shows one [data-persist-step] 1322// container at a time, and validates the current step's required fields before advancing. 1323// Navigation uses the AUTHORED, page-styled buttons the editor creates â
1324// [data-persist-ms-next] (advance) + [data-persist-ms-back] (retreat) â with the real submit 1325// shown only on the last step. Legacy / hand-authored forms with no such buttons get a 1326// transient injected Back/Next + progress line (data-htmlpub-*, never saved) so they still 1327// work. The controller is stashed on the form as __hpMultiStep so the submit handler advances 1328// instead of submitting until the last step. The edit canvas (owner, NOT preview) skips this 1329// so every field stays visible for editing; Preview (data-preview="1") runs it. 1330if(!_hpIsOwner||_hpIsPreview){try{ 1331document.querySelectorAll("form[data-persist-multistep]").forEach(function(f){ 1332var steps=[].slice.call(f.querySelectorAll("[data-persist-step]")); 1333if(steps.length<2){ 1334// A single-step form has no navigation â hide any authored Back/Next so they don't render 1335// as dead buttons; the submit stays as the only action. 1336var _hpDead=f.querySelectorAll("[data-persist-ms-back],[data-persist-ms-next]"); 1337for(var _hpd=0;_hpd<_hpDead.length;_hpd++)_hpDead[_hpd].style.display="none"; 1338// Same reasoning for an authored progress indicator: with no steps to advance through it 1339// would sit there reading "Step 1 of 1". 1340var _hpProg1=f.querySelector("[data-persist-ms-progress]"); 1341if(_hpProg1)_hpProg1.style.display="none"; 1342// A degenerate multi-step form (0 or 1 real steps) behaves like a plain form, but the boot-time 1343// captcha pass skipped it (it carries data-persist-multistep) and the last-step inject below 1344// never runs. Inject the widget here â otherwise the server enforces a token this page never 1345// produces and every submission is rejected (100% lead loss), while the editor still shows the 1346// placeholder. Mirrors the non-multistep boot path (owner/preview skip via !_hpIsOwner). 1347if(!_hpIsOwner&&f.hasAttribute("data-persist-captcha"))_hpInjectCaptcha(f); 1348return; 1349} 1350steps.sort(function(a,b){return (parseInt(a.getAttribute("data-persist-step"),10)||0)-(parseInt(b.getAttribute("data-persist-step"),10)||0);}); 1351// Suppress native whole-form constraint validation: a required field in a 1352// not-yet-reached (display:none) step would otherwise abort submission and block 1353// Enter-to-advance. We validate each step in JS instead (validateStep on every hop 1354// + the last step on final submit), so required fields are still enforced. 1355f.noValidate=true; 1356// Exclude the authored nav buttons so a type-less [data-persist-ms-*] button is never picked as the submit. 1357var submit=_hpFindSubmit(f); 1358var submitDisp=submit?submit.style.display:""; 1359var cur=0; 1360// Prefer the authored nav buttons; fall back to injecting them for legacy forms. 1361var next=f.querySelector("[data-persist-ms-next]"); 1362var back=f.querySelector("[data-persist-ms-back]"); 1363var prog=null; 1364if(!next){ 1365// Skipped when the form carries an AUTHORED indicator: the transient one exists only to 1366// stand in for a form that has none, and rendering both reads as a duplicate. 1367if(!f.querySelector("[data-persist-ms-progress]")){ 1368prog=document.createElement("div"); 1369prog.setAttribute("data-htmlpub-ms-progress",""); 1370prog.style.cssText="font-family:system-ui,sans-serif;font-size:13px;opacity:0.7;margin-bottom:8px;"; 1371if(steps[0].parentNode)steps[0].parentNode.insertBefore(prog,steps[0]); 1372} 1373var nav=document.createElement("div"); 1374nav.setAttribute("data-htmlpub-ms-nav",""); 1375nav.style.cssText="display:flex;gap:8px;margin-top:8px;"; 1376// Reuse an authored Back if the form has one (only Next was missing) â don't inject a duplicate. 1377if(!back){back=document.createElement("button");back.type="button";back.setAttribute("data-htmlpub-ms-back","");back.textContent="Back";} 1378next=document.createElement("button");next.type="button";next.setAttribute("data-htmlpub-ms-next","");next.textContent="Next"; 1379if(submit&&submit.className){next.className=submit.className;if(!back.className)back.className=submit.className;} 1380nav.appendChild(back);nav.appendChild(next); 1381var lastStep=steps[steps.length-1]; 1382if(lastStep.parentNode)lastStep.parentNode.insertBefore(nav,lastStep.nextSibling); 1383} 1384var nextDisp=next?next.style.display:""; 1385var backDisp=back?back.style.display:""; 1386function render(){ 1387for(var i=0;i<steps.length;i++)steps[i].style.display=(i===cur?"":"none"); 1388if(prog)prog.textContent="Step "+(cur+1)+" of "+steps.length; 1389_hpMsProgress(f,cur,steps.length); 1390var last=cur===steps.length-1; 1391if(back)back.style.display=cur>0?backDisp:"none"; 1392if(next)next.style.display=last?"none":nextDisp; 1393if(submit)submit.style.display=last?submitDisp:"none"; 1394// Spam protection: inject the Turnstile widget the moment the visitor reaches the last step 1395// (fresh + visible so its token populates reliably â hiding it via display:none does not). 1396if(last&&!_hpIsOwner&&f.hasAttribute("data-persist-captcha"))_hpInjectCaptcha(f); 1397} 1398function _hpValidatable(c){ 1399// Skip fields the visitor can't see/act on â a data-persist-hidden (display:none) or 1400// disabled required field can't show a validation bubble and would silently trap them. 1401if(c.disabled)return false;
1402if(c.closest&&c.closest("[data-persist-hidden]"))return false; 1403return typeof c.checkValidity==="function"; 1404} 1405function validateStep(){ 1406var ctrls=steps[cur].querySelectorAll("input,select,textarea"); 1407for(var i=0;i<ctrls.length;i++){ 1408if(_hpValidatable(ctrls[i])&&!ctrls[i].checkValidity()){ 1409if(typeof ctrls[i].reportValidity==="function")ctrls[i].reportValidity(); 1410return false; 1411} 1412} 1413return _hpGroupReqOK(steps[cur]); 1414} 1415function validateOutside(){ 1416// Required controls authored OUTSIDE any step container are never in validateStep's scope; 1417// f.noValidate is on form-wide, so validate them on final submit or they'd submit empty. 1418var all=f.querySelectorAll("input,select,textarea"); 1419for(var i=0;i<all.length;i++){ 1420var c=all[i]; 1421if(c.closest&&c.closest("[data-persist-step]"))continue; 1422if(_hpValidatable(c)&&!c.checkValidity()){ 1423if(typeof c.reportValidity==="function")c.reportValidity(); 1424return false; 1425} 1426} 1427return true; 1428} 1429function advance(){if(cur<steps.length-1&&validateStep()){cur++;render();}} 1430if(next)next.addEventListener("click",function(e){if(e&&e.preventDefault)e.preventDefault();advance();}); 1431if(back)back.addEventListener("click",function(e){if(e&&e.preventDefault)e.preventDefault();if(cur>0){cur--;render();}}); 1432// validate() re-checks the CURRENT step + any required controls outside all steps â the 1433// submit handler calls it on the last step before sending (native validation is off). 1434f.__hpMultiStep={isLast:function(){return cur>=steps.length-1;},advance:advance,validate:function(){return validateStep()&&validateOutside();}}; 1435render(); 1436}); 1437}catch(e){}} 1438 1439// ââ International phone ââ input[type=tel][data-persist-phone] gets a country 1440// dial-code <select> injected before it + a hidden E.164 companion that carries the 1441// real submitted value (+<dial><national digits>) under the field's name. The visible 1442// tel input keeps the national number for display and is excluded from collect() 1443// (data-hp-phone-nat); the <select> is excluded too (data-hp-phone-cc). On every 1444// input / country change the E.164 is reassembled and validated â E.164 spec (7â15 1445// total digits) plus a GENEROUS per-country national-length range where the length is 1446// well known â via setCustomValidity, so native validation blocks a malformed submit 1447// on single-step forms and validateStep() enforces it on multi-step ones. Runs BEFORE 1448// the data-hp-original tagging pass so the hidden companion is stamped and collected. 1449// Runs in owner mode too so the editor preview shows the selector (the validity flag 1450// is harmless there â owner previews don't submit real leads). data-persist-phone / 1451// data-persist-phone-country are persistent (never stripped from the AI diff); the 1452// injected select + companion are data-hp-* (transient) and never saved. 1453try{ 1454var _HP_PHONE=[["US","United States","1",10,10,0],["CA","Canada","1",10,10,0],["GB","United Kingdom","44",9,10,0],["AU","Australia","61",9,9,0],["DE","Germany","49",0,0,0],["FR","France","33",9,9,0],["IN","India","91",10,10,0],["BR","Brazil","55",10,11,0],["MX","Mexico","52",10,10,0],["ES","Spain","34",9,9,0],["IT","Italy","39",9,11,1],["NL","Netherlands","31",9,9,0],["AE","United Arab Emirates","971",9,9,0],["SG","Singapore","65",8,8,0],["JP","Japan","81",9,11,0],["CN","China","86",8,11,0],["ZA","South Africa","27",9,9,0],["NG","Nigeria","234",10,10,0],["IE","Ireland","353",7,9,0],["NZ","New Zealand","64",8,10,0],["AR","Argentina","54",0,0,0],["AT","Austria","43",0,0,0],["BE","Belgium","32",0,0,0],["BD","Bangladesh","880",0,0,0],["BG","Bulgaria","359",0,0,0],["BH","Bahrain","973",8,8,0],["BO","Bolivia","591",0,0,0],["CH","Switzerland","41",9,9,0],["CL","Chile","56",0,0,0],["CO","Colombia","57",8,10,0],["CR","Costa Rica","506",8,8,0],["CY","Cyprus","357",8,8,0],["CZ","Czechia","420",9,9,0],["DK","Denmark","45",8,8,0],["DO","Dominican Republic","1",10,10,0],["EC","Ecuador","593",0,0,0],["EG","Egypt","20",0,0,0],["EE","Estonia","372",0,0,0],["FI","Finland","358",0,0,0],["GR","Greece","30",10,10,0],["GT","Guatemala","502",8,8,0],["HK","Hong Kong","852",8,8,0],["HR","Croatia","385",0,0,0],["HU","Hungary","36",0,0,0],["ID","Indonesia","62",0,0,0],["IL","Israel","972",8,9,0],["JO","Jordan","962",0,0,0],["KE","Kenya","254",0,0,0],["KR","South Korea","82",0,0,0],["KW","Kuwait","965",8,8,0],["LK","Sri Lanka","94",9,9,0],["LT","Lithuania","370",8,8,0],["LU","Luxembourg","352",0,0,0],["LV","Latvia","371",8,8,0],["MA","Morocco","212",9,9,0],["MY","Malaysia","60",0,0,0],["NO","Norway","47",8,8,0],["OM","Oman","968",8,8,0],["PA","Panama","507",0,0,0],["PE","Peru","51",9,9,0],["PH","Philippines","63",9,10,0],["PK","Pakistan","92",10,10,0],["PL","Poland","48",9,9,0],["PT","Portugal","351",9,9,0],["PY","Paraguay","595",0,0,0],["QA","Qatar","974",8,8,0],["RO","Romania","40",9,9,0],["RS","Serbia","381",0,0,0],["RU","Russia","7",10,10,0],["SA","Saudi Arabia","966",9,9,0],["SE","Sweden","46",0,0,0],["SK","Slovakia","421",9,9,0],["SI","Slovenia","386",0,0,0],["TH","Thailand","66",9,9,0],["TN","Tunisia","216",8,8,0],["TR","Turkey","90",10,10,0],["TW","Taiwan","886",0,0,0],["UA","Ukraine","380",9,9,0],["UY","Uruguay","598",0,0,0],["VE","Venezuela","58",0,0,0],["VN","Vietnam","84",0,0,0]]; 1455var _hpPhoneByIso={};for(var _hppi=0;_hppi<_HP_PHONE.length;_hppi++){_hpPhoneByIso[_HP_PHONE[_hppi][0]]=_HP_PHONE[_hppi];} 1456var _hpDigits=function(s){return (s||"").replace(/[^0-9]/g,"");}; 1457var _hpFlag=function(iso){try{return String.fromCodePoint(0x1F1E6+(iso.charCo
1457deAt(0)-65))+String.fromCodePoint(0x1F1E6+(iso.charCodeAt(1)-65));}catch(e){return "";}}; 1458// Reduce the typed digits to the country's national significant number (NSN): strip a 1459// user-typed country code (guarded by the expected NSN length so a valid number is never 1460// shortened) and a national trunk prefix "0" (guarded so it never drops below the country 1461// minimum; suppressed for keepLeadingZero countries like Italy). Lead-safe: each strip 1462// fires only when it yields a still-plausible NSN, so "07911 123456", "06 12 34 56 78" and 1463// "1 (415) 555-2671" all assemble to correct E.164 and pass validation. 1464var _hpNSN=function(nat,cur){ 1465var dial=cur[2],min=cur[3],max=cur[4],keep0=cur[5]; 1466if(dial&&nat.length>dial.length&&nat.substring(0,dial.length)===dial){ 1467var rest=nat.substring(dial.length); 1468var restT=(!keep0&&rest.charAt(0)==="0")?rest.replace(/^0+/,""):rest; 1469if(min&&max){ 1470// Known national length: keep whichever candidate fits the country's range. 1471if(restT.length>=min&&restT.length<=max)nat=restT; 1472else if(rest.length>=min&&rest.length<=max)nat=rest; 1473} 1474// Variable-length country (min/max unknown): do NOT strip the leading dial-code digits â 1475// for those countries a real national number can legitimately begin with its own dial 1476// code, and chopping it corrupts the number (F4). "+"-prefixed input is handled before 1477// _hpNSN, so this only affects the ambiguous no-"+" case; keep the digits as typed. 1478} 1479if(!keep0&&nat.charAt(0)==="0"){var s=nat.replace(/^0+/,"");if(!min||s.length>=min)nat=s;} 1480// Russia/Kazakhstan (dial 7) use "8" as the national trunk prefix, not "0". Strip a lone 1481// leading "8", guarded by the country minimum so a valid NSN is never shortened (F3). 1482if(dial==="7"&&nat.charAt(0)==="8"){var s8=nat.replace(/^8/,"");if(!min||s8.length>=min)nat=s8;} 1483return nat; 1484}; 1485document.querySelectorAll('input[type="tel"][data-persist-phone]').forEach(function(inp){ 1486if(inp.getAttribute("data-hp-phone-on")==="1")return; 1487inp.setAttribute("data-hp-phone-on","1"); 1488// Key the E.164 companion the SAME way collect()/extract-form-fields key a plain tel 1489// input (name -> id -> data-field -> "phone"), computed BEFORE any DOM mutation so 1490// enabling international never changes which lead column the number lands in. 1491var nm=fieldKey(inp,0); 1492var iso=(inp.getAttribute("data-persist-phone-country")||"US").toUpperCase(); 1493if(!_hpPhoneByIso[iso])iso="US"; 1494// Custom country combobox. A native <select> can't show a compact "flag +dial" when 1495// CLOSED and full country names when OPEN: its closed text IS the selected option's 1496// text, and a same-value close fires no event to swap it back. So we build a small 1497// self-contained combobox â a styled trigger button showing "flag +dial" + a panel 1498// listing full country names. curIso tracks the selection for E.164 assembly. Lay it 1499// out side by side with the number in a flex row (standard international-phone layout); 1500// the trigger copies the number input's border/radius/padding/font/colors so it matches 1501// whatever the page's forms look like (align-items:stretch matches their heights). 1502var curIso=iso; 1503// Brand accent for the selected-row tint + checkmark, sampled from the form's primary 1504// (submit) button background so the dropdown matches the page. A light tint keeps the 1505// dark option text legible. Falls back to a neutral blue; transparent / near-white 1506// buttons are ignored so the accent stays visible. 1507var _hpAccent="#2563eb",_hpAccentTint="rgba(37,99,235,0.12)"; 1508try{ 1509var _hpBtnForm=inp.closest?inp.closest("form"):null; 1510var _hpBtn=_hpBtnForm?_hpFindSubmit(_hpBtnForm):null; 1511if(_hpBtn){ 1512var _bg=window.getComputedStyle(_hpBtn).backgroundColor||""; 1513var _pp=_bg.replace(/[^0-9,.]/g,"").split(","); 1514var _rr=parseInt(_pp[0],10),_gg=parseInt(_pp[1],10),_bb=parseInt(_pp[2],10),_aa=_pp.length>3?parseFloat(_pp[3]):1; 1515if(!isNaN(_rr)&&!isNaN(_gg)&&!isNaN(_bb)&&_aa>0.1&&(_rr+_gg+_bb)<720){_hpAccent="rgb("+_rr+","+_gg+","+_bb+")";_hpAccentTint="rgba("+_rr+","+_gg+","+_bb+",0.12)";} 1516} 1517}catch(e){} 1518// Use the AUTHORED wrapper (data-persist-phone-field) that the editor saved, so the 1519// published layout is identical to the edit canvas. Create one only as a fallback for 1520// legacy pages saved before the authored wrapper existed (served pages aren't re-saved, 1521// so a runtime-created wrapper is harmless there). 1522var wrap=inp.closest?inp.closest("[data-persist-phone-field]"):null; 1523if(!wrap){ 1524wrap=document.createElement("span"); 1525wrap.setAttribute("data-persist-phone-field",""); 1526wrap.style.cssText="display:flex;align-items:stretch;gap:6px;width:100%;position:relative;"; 1527if(inp.parentNode)inp.parentNode.insertBefore(wrap,inp); 1528wrap.appendChild(inp); 1529} 1530if(!wrap.style.position)wrap.style.position="relative"; 1531// A <span role=button>, NOT a <button>: the widget sits inside the field's <label>, and 1532// a <label> forwards clicks to its first LABELABLE descendant. A <button> would become 1533// that control, so clicking a list item fires a synthetic click on the trigger and 1534// re-opens the panel. A <span> isn't labelable, so the label keeps targeting the number 1535// input; preventDefault on the trigger/list clicks stops any residual label forwarding. 1536var trig=document.createElement("span"); 1537trig.setAttribute("role","button"); 1538trig.setAttribute("tabindex","0"); 1539trig.setAttribute("data-hp-phone-cc",""); 1540trig.setAttribute("aria-haspopup","listbox");
1541trig.setAttribute("aria-expanded","false"); 1542trig.setAttribute("aria-label","Country calling code"); 1543trig.style.cssText="flex:0 0 auto;display:inline-flex;align-items:center;gap:6px;cursor:pointer;white-space:nowrap;-webkit-user-select:none;user-select:none;box-sizing:border-box;"; 1544try{ 1545var _cs=window.getComputedStyle(inp); 1546var _cp=["fontFamily","fontSize","fontWeight","color","backgroundColor","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","borderTopStyle","borderRightStyle","borderBottomStyle","borderLeftStyle","borderTopColor","borderRightColor","borderBottomColor","borderLeftColor","borderTopLeftRadius","borderTopRightRadius","borderBottomRightRadius","borderBottomLeftRadius","paddingTop","paddingBottom","paddingLeft","paddingRight","boxSizing","lineHeight"]; 1547for(var _cpi=0;_cpi<_cp.length;_cpi++){try{if(_cs[_cp[_cpi]])trig.style[_cp[_cpi]]=_cs[_cp[_cpi]];}catch(e){}} 1548}catch(e){} 1549var trigLabel=document.createElement("span"); 1550trig.appendChild(trigLabel); 1551var trigCaret=document.createElement("span");trigCaret.textContent="â¾";trigCaret.style.cssText="opacity:0.55;font-size:0.8em;"; 1552trig.appendChild(trigCaret); 1553var panel=document.createElement("ul"); 1554panel.setAttribute("role","listbox"); 1555panel.setAttribute("data-hp-phone-list",""); 1556panel.style.cssText="display:none;position:absolute;top:100%;left:0;z-index:2147483000;margin:4px 0 0;padding:4px 0;list-style:none;max-height:260px;overflow-y:auto;min-width:240px;background:#fff;color:#111;border:1px solid rgba(0,0,0,0.15);border-radius:8px;box-shadow:0 8px 28px rgba(0,0,0,0.18);font-family:system-ui,-apple-system,sans-serif;font-size:14px;text-align:left;"; 1557// Hover + selected-item styling (one shared, id-guarded stylesheet â inline styles can't 1558// express :hover / ::after). Injected on the live page only; never touches the editor. 1559if(!document.getElementById("hp-phone-cc-style")){var _phSt=document.createElement("style");_phSt.id="hp-phone-cc-style";_phSt.textContent="ul[data-hp-phone-list] li[role=option]:hover{background:rgba(0,0,0,0.06);}ul[data-hp-phone-list] li[aria-selected=true]{font-weight:600;background:var(--hp-accent-tint,rgba(37,99,235,0.12));}ul[data-hp-phone-list] li[aria-selected=true]::after{content:'â';float:right;margin-left:12px;color:var(--hp-accent,#2563eb);}";(document.head||document.documentElement).appendChild(_phSt);} 1560panel.style.setProperty("--hp-accent",_hpAccent); 1561panel.style.setProperty("--hp-accent-tint",_hpAccentTint); 1562for(var pci=0;pci<_HP_PHONE.length;pci++){ 1563var pc=_HP_PHONE[pci]; 1564var li=document.createElement("li"); 1565li.setAttribute("role","option"); 1566li.setAttribute("data-iso",pc[0]); 1567li.setAttribute("data-dial",pc[2]); 1568li.setAttribute("aria-selected",pc[0]===iso?"true":"false"); 1569li.textContent=_hpFlag(pc[0])+" "+pc[1]+" +"+pc[2]; 1570li.style.cssText="padding:7px 14px;cursor:pointer;white-space:nowrap;"; 1571panel.appendChild(li); 1572} 1573var renderTrig=function(){var c=_hpPhoneByIso[curIso];trigLabel.textContent=_hpFlag(curIso)+" +"+(c?c[2]:"");}; 1574var closePanel=function(){panel.style.display="none";trig.setAttribute("aria-expanded","false");}; 1575var openPanel=function(){panel.style.display="block";trig.setAttribute("aria-expanded","true");}; 1576inp.style.flex="1"; 1577inp.style.minWidth="0"; 1578wrap.insertBefore(trig,inp); // trigger sits before the number input (input already in the wrap) 1579wrap.appendChild(panel); 1580var hid=document.createElement("input"); 1581hid.type="hidden"; 1582hid.name=nm; 1583hid.setAttribute("data-hp-phone-e164",""); 1584wrap.appendChild(hid); 1585inp.setAttribute("data-hp-phone-nat",""); 1586inp.removeAttribute("name"); 1587var _hpSyncPhone=function(){ 1588var raw=(inp.value||"").trim(); 1589var cur=_hpPhoneByIso[curIso]; 1590var dial=cur?cur[2]:""; 1591var e164="",nsnLen=0,isIntl=false; 1592if(raw.charAt(0)==="+"){e164="+"+_hpDigits(raw);isIntl=true;} 1593else{var nsn=_hpNSN(_hpDigits(raw),cur);nsnLen=nsn.length;e164=nsn?("+"+dial+nsn):"";} 1594hid.value=e164; 1595var msg=""; 1596if(raw){ 1597var total=_hpDigits(e164).length; 1598// Hard rules only: E.164 spec (7-15 total digits) + a per-country MINIMUM NSN length 1599// (catches a genuinely incomplete number, e.g. a US local number with no area code). No 1600// per-country maximum -> an over-long entry (usually the visitor including extra 1601// country/trunk digits) is accepted, never rejected. A "+"-prefixed entry skips the 1602// per-country floor entirely (the visitor owns their own format). 1603if(total<7||total>15)msg="Enter a valid phone number."; 1604else if(!isIntl&&nsnLen&&cur&&cur[3]&&nsnLen<cur[3])msg="Enter a valid "+cur[1]+" phone number."; 1605} 1606if(typeof inp.setCustomValidity==="function")inp.setCustomValidity(msg); 1607};
1608var selectIso=function(newIso){if(_hpPhoneByIso[newIso])curIso=newIso;for(var _si=0;_si<panel.children.length;_si++){var _c=panel.children[_si];if(_c.getAttribute&&_c.getAttribute("role")==="option")_c.setAttribute("aria-selected",_c.getAttribute("data-iso")===curIso?"true":"false");}renderTrig();closePanel();_hpSyncPhone();}; 1609panel.addEventListener("click",function(e){var t=e.target;while(t&&t!==panel&&!(t.getAttribute&&t.getAttribute("role")==="option"))t=t.parentNode;if(t&&t.getAttribute&&t.getAttribute("role")==="option"){e.preventDefault();selectIso(t.getAttribute("data-iso"));try{inp.focus();}catch(_e){}}}); 1610trig.addEventListener("click",function(e){e.preventDefault();if(panel.style.display==="block")closePanel();else openPanel();}); 1611trig.addEventListener("keydown",function(e){if(e.key==="Escape"){closePanel();}else if(e.key==="ArrowDown"||e.key==="Enter"||e.key===" "){e.preventDefault();openPanel();}}); 1612document.addEventListener("click",function(e){if(!wrap.contains(e.target))closePanel();}); 1613inp.addEventListener("input",_hpSyncPhone); 1614inp.addEventListener("blur",_hpSyncPhone); 1615renderTrig(); 1616_hpSyncPhone(); 1617}); 1618}catch(e){} 1619 1620// Tag all hidden inputs present in the original HTML so we can distinguish 1621// them from ones injected later by third-party scripts (Customers.ai, etc.) 1622document.querySelectorAll('input[type="hidden"]').forEach(function(el){el.setAttribute("data-hp-original","1");}); 1623 1624function showNotice(f,text,ok){ 1625var m=document.createElement("div"); 1626m.textContent=text; 1627m.style.cssText="padding:12px 16px;margin:8px 0;border-radius:6px;font-family:system-ui,sans-serif;font-size:14px;"+(ok?"background:#f0fdf4;color:#166534;border:1px solid #bbf7d0":"background:#fef2f2;color:#991b1b;border:1px solid #fecaca"); 1628f.parentNode.insertBefore(m,f.nextSibling); 1629setTimeout(function(){m.remove()},5000); 1630} 1631// showMsg wraps showNotice; the optional 3rd arg lets callers override the default success/error 1632// copy (e.g. the Turnstile "still verifying" gate). Omit it for the standard success/error notices. 1633function showMsg(f,ok,msg){showNotice(f,msg||(ok?(f.getAttribute("data-success-message")||"Thank you! Your submission has been received."):"Something went wrong. Please try again."),ok);} 1634// reCAPTCHA v2 (HP-1475). The response token lives in a hidden 1635// <textarea name="g-recaptcha-response"> that grecaptcha creates inside the 1636// widget's container; scoping the lookup to the submitted form/container picks 1637// the right token when a page renders more than one widget. 1638function _hpCaptchaToken(f){ 1639try{var ta=f.querySelector&&f.querySelector('textarea[name="g-recaptcha-response"]');return ta&&ta.value?ta.value:"";}catch(e){return "";} 1640} 1641 1642function formId(f){ 1643if(f.tagName==="FORM")return f.id||f.getAttribute("name")||"form-"+([].indexOf.call(document.forms,f)); 1644return f.id||"section-"+([].indexOf.call(document.querySelectorAll("[data-htmlpub-fake-form]"),f)); 1645} 1646 1647// Listen for postMessage responses from parent shell 1648if(inSandbox){ 1649window.addEventListener("message",function(e){ 1650var d=e.data; 1651if(d&&d.type==="htmlpub-form-submit-result"&&d.correlationId){ 1652var cb=pendingCallbacks[d.correlationId]; 1653if(cb){ 1654delete pendingCallbacks[d.correlationId]; 1655cb(d.success,d.captchaRequired,d.error); 1656} 1657} 1658}); 1659} 1660 1661function isSafeRedirectUrl(url){ 1662if(!url)return false; 1663if(/^https?:\/\//i.test(url))return true; 1664if(url.charAt(0)==="/"&&url.charAt(1)!=="/")return true; 1665return false; 1666} 1667// Migrated Builder3 site headers use relative hrefs that break on trailing-slash landing URLs; drop the trailing slash on same-origin targets (/thank-you/ -> /thank-you). 1668function stripTrailingSlash(url){ 1669try{var u=new URL(url,window.location.origin);if(u.origin===window.location.origin&&u.pathname.length>1&&u.pathname.charAt(u.pathname.length-1)==="/")return u.pathname.replace(/\/+$/,"")+u.search+u.hash;}catch(e){} 1670return url; 1671} 1672function maybeRedirectUrl(url){ 1673if(window.htmlpubEditorMode)return; 1674if(!isSafeRedirectUrl(url))return; 1675if(/\/api\/forms\/submit$/.test(url))return; 1676setTimeout(function(){window.location.href=stripTrailingSlash(url);},600); 1677} 1678function maybeRedirect(f){maybeRedirectUrl(f.getAttribute("action"));} 1679function reportFail(kind,status,fident){ 1680try{if(window.__hpupPushEvent)window.__hpupPushEvent("form_submit_failed",{failureKind:kind,httpStatus:status||0,host:location.host,path:location.pathname,apiBase:s.getAttribute("data-api-url")||"",formIdentifier:fident,pageId:pageId,pageSlug:slug});}catch(e){} 1681} 1682function submitData(f,data){
1683var btn=_hpFindSubmit(f); 1684if(btn)btn.disabled=true; 1685 1686// Generate one eventID per submission, threaded through three places: 1687// (a) the JSON payload to /api/forms/submit â integration queue 1688// (b) the postMessage to the parent shell (which forwards to the same API) 1689// (c) the browser pixel events fired on success below 1690// Both browser and server emit the SAME id to the same downstream provider 1691// so Meta / TikTok dedup them as a single conversion. 1692var eventId=_hpUuid(); 1693var fident=formId(f); 1694// Per-form Turnstile token â delivered by the bridge iframe via postMessage (see the listener 1695// near _hpInjectCaptcha) and stashed on the form element. 1696var _hpCapTok=(f.__hpCaptchaToken||""); 1697// stable editor-stamped form id â native lead-magnet routing; "" when unbound 1698var fkey=f.getAttribute("data-persist-form-id")||""; 1699// Classic form uuid re-stamped on migrated forms â per-form scope for carried Classic Zaps 1700var fsrc=f.getAttribute("data-persist-form-source-id")||""; 1701 1702// reCAPTCHA gate (HP-1475): when the page enforces reCAPTCHA but the visitor 1703// hasn't solved the challenge, block the submit with an inline error instead 1704// of POSTing an unverifiable payload the server will reject anyway. Gated on 1705// the enforcement flag (not mere widget presence) so pages with a decorative 1706// widget are unaffected. The server remains the security boundary â it 1707// re-verifies the token against Google. A form that opts into per-form Turnstile 1708// (data-persist-captcha) is handled by the Turnstile gate below instead â skip it here so a 1709// Turnstile form on a reCAPTCHA-enforced page isn't blocked for lacking a reCAPTCHA token 1710// (mirrors the server, which skips its reCAPTCHA block for forms in captchaFormIds). 1711var captchaToken=_hpCaptchaToken(f); 1712if(_hpRecaptchaEnforced&&!captchaToken&&!(f.hasAttribute&&f.hasAttribute("data-persist-captcha"))){ 1713if(btn)btn.disabled=false; 1714showNotice(f,"Please complete the reCAPTCHA challenge before submitting.",false); 1715reportFail("captcha_required",0,fident); 1716return; 1717} 1718 1719if(inSandbox){ 1720var id="fs-"+(++corrId); 1721var timer=setTimeout(function(){ 1722delete pendingCallbacks[id]; 1723if(btn)btn.disabled=false; 1724reportFail("timeout",0,fident);showMsg(f,false); 1725},10000); 1726 1727pendingCallbacks[id]=function(success,captchaRequired,errMsg){ 1728clearTimeout(timer); 1729if(btn)btn.disabled=false; 1730if(success){setEmailCookie(data);_hpFireLead(fident,data,eventId);showMsg(f,true);if(typeof f.reset==="function")f.reset();maybeRedirect(f);} 1731else if(captchaRequired){showMsg(f,false,"Spam protection is still verifying â please wait a moment and submit again.");} 1732else{reportFail("relay_error",0,fident);showMsg(f,false,errMsg||undefined);} 1733}; 1734 1735var vid="";try{vid=localStorage.getItem("_hp_vid")||"";}catch(e){} 1736parent.postMessage({type:"htmlpub-form-submit",correlationId:id,pageId:pageId,pageSlug:slug,formIdentifier:fident,formKey:fkey,classicFormUuid:fsrc,data:data,visitorId:vid,eventId:eventId,captchaToken:(_hpCapTok||captchaToken),formNeedsCaptcha:!!(f.hasAttribute&&f.hasAttribute("data-persist-captcha"))},"*"); 1737}else{ 1738// Send in top-level (direct fetch) mode. Wrapped in _hpProceed so it can be deferred 1739// until the Turnstile token has had a bounded chance to arrive (see _hpWaitForCaptcha). 1740function _hpProceed(){ 1741var vid2="";try{vid2=localStorage.getItem("_hp_vid")||"";}catch(e){} 1742// The captcha token rides EVERY attempt (not just the first). It is single-use, 1743// but the server checks its verified-eventId cache before re-verifying, so a 1744// re-sent already-spent token short-circuits to pass, while a token that was never 1745// spent (attempt 0 failed at the transport / rate-limit layer before verify) still 1746// verifies on retry. Stripping it from retries silently dropped leads on captcha 1747// forms whenever attempt 0 hit a 429/5xx/network error. [HP-2467] Prefer the per-form 1748// Turnstile token; fall back to the reCAPTCHA token (a form uses one mechanism). Read 1749// the FRESHEST token here â it may have arrived via postMessage during the bounded wait, 1750// after _hpCapTok was snapshotted at the top of submitData. 1751var _capTok=(f.__hpCaptchaToken||"")||_hpCapTok||captchaToken; 1752var _hpBody=JSON.stringify({pageId:pageId,pageSlug:slug,formIdentifier:fident,formKey:fkey,classicFormUuid:fsrc,data:data,visitorId:vid2,eventId:eventId,captchaToken:_capTok}); 1753// Retry transient failures so a network blip / 5xx / 429 doesn't silently lose 1754// a lead. Every attempt reuses the same eventId, so the server dedups to 1755// exactly one row + one set of side-effects. Backoff: immediate, 15s, 30s, 1756// 2min, then give up. Failed submits don't redirect, so the page stays open 1757// and the delayed retries can run. The submit button stays disabled across 1758// retries to prevent a manual re-submit (which would mint a new eventId). [HP-2467] 1759var _hpDelays=[0,15000,30000,120000]; 1760function _hpAttempt(n){ 1761fetch(api,{method:"POST",keepalive:true,headers:{"Content-Type":"application/json"},body:_hpBody}).then(function(r){ 1762if(r.ok){if(btn)btn.disabled=false;setEmailCookie(data);_hpFireLead(fident,data,eventId);showMsg(f,true);if(typeof f.reset==="function")f.reset(); 1763// The Turnstile token is single-use; after a successful submit clear it and reload the bridge 1764// iframe so a subsequent submit on the same (non-reset / non-redirected) form gets a FRESH token 1765// instead of re-sending the spent one and being rejected. 1766try{f.__hpCaptchaToken="";f.__hpCaptchaError=false;var _hpCf=f.querySelector("iframe[data-hp-turnstile]");if(_hpCf)_hpCf.src=_hpCf.src;}catch(e){} 1767maybeRedirect(f);return;} 1768if((r.status>=500||r.status===429)&&n<_hpDelays.length){setTimeout(function(){_hpAttempt(n+1);},_hpDelays[n]);return;} 1769if(btn)btn.disabled=false;reportFail("http_error",r.status,fident); 1770// A 403 on a captcha-protected form means the token was spent/invalid â refresh the widget 1771// so a retry gets a fresh one (otherwise "try again" resends the same rejected token).
1772try{if(r.status===403){f.__hpCaptchaToken="";f.__hpCaptchaError=false;var _hpCfe=f.querySelector("iframe[data-hp-turnstile]");if(_hpCfe)_hpCfe.src=_hpCfe.src;}}catch(e){} 1773// Surface the server's specific message (e.g. "CAPTCHA verification failed") instead of a 1774// generic one; fall back to the generic message when the body isn't JSON. 1775try{r.json().then(function(d){showMsg(f,false,(d&&d.error)||undefined);},function(){showMsg(f,false);});}catch(e){showMsg(f,false);} 1776}).catch(function(){ 1777if(n<_hpDelays.length){setTimeout(function(){_hpAttempt(n+1);},_hpDelays[n]);return;} 1778if(btn)btn.disabled=false;reportFail("network",0,fident);showMsg(f,false); 1779}); 1780} 1781_hpAttempt(0); 1782} 1783// Spam-protected form whose Turnstile widget exists but hasn't produced a token yet 1784// (fast submit, or the challenge is still loading). Per the decided fail policy, give the 1785// widget a bounded window plus ONE re-challenge, then submit anyway (the server accepts + 1786// flags unverified â never lose a lead) instead of the old "please submit again" dead end. 1787// Skip the wait when: owner preview (widget is owner-gated), a token is already in hand, the 1788// bridge reported a TERMINAL error (no token could ever come), or no widget is present (site 1789// key unconfigured â nothing to wait for, server fails open). The button stays disabled 1790// during the (sub-second-typical, 6s-worst-case) wait so the visitor can't double-submit. 1791if(_hpIsOwner||_hpCapTok!==""||f.__hpCaptchaError||!f.querySelector("iframe[data-hp-turnstile]")){ 1792_hpProceed(); 1793}else{ 1794_hpWaitForCaptcha(f,_hpProceed); 1795} 1796} 1797} 1798 1799// Snapshot forms in the server-rendered HTML at init; third-party embeds (ConvertKit/ActiveCampaign) inject their <form> later, so they're excluded. 1800var _hpNativeForms=(function(){try{return new WeakSet([].slice.call(document.querySelectorAll("form")));}catch(e){return null;}})(); 1801document.addEventListener("submit",function(e){ 1802var f=e.target; 1803if(f.tagName!=="FORM")return; 1804if(_hpNativeForms&&!_hpNativeForms.has(f)){reportFail("skipped_non_native",0,formId(f));return;}// injected after init (popup/third-party) â don't hijack it; telemeter so silently-dropped non-native submits are visible [HP-2467] 1805e.preventDefault(); 1806// Multi-step: if this form is split into steps and the visitor isn't on the last 1807// one yet, advance (validate current step + Next) instead of submitting. Captures 1808// Enter-in-field and any early submit so a partial lead is never sent. On the last 1809// step, validate it in JS first (the form is novalidate, so nothing else does). [P3] 1810if(f.__hpMultiStep){ 1811if(!f.__hpMultiStep.isLast()){f.__hpMultiStep.advance();return;} 1812if(f.__hpMultiStep.validate&&!f.__hpMultiStep.validate())return; 1813} 1814// "Select at least one" enforcement for required checkbox groups (single-step forms have no 1815// __hpMultiStep validate pass, and it's a cheap final guard for multi-step too). 1816if(!_hpGroupReqOK(f))return; 1817var data=collect(f); 1818if(Object.keys(data).length===0){if(f.querySelector&&f.querySelector("input,textarea,select"))reportFail("skipped_empty",0,formId(f));return;}// nothing collected â telemeter only when the form actually has fields (real form, nothing captured) [HP-2467] 1819submitData(f,data); 1820},true); 1821 1822// --- Fake form interception (inputs outside <form>) --- 1823var lastFakeSubmit=0; 1824// Walk up from the clicked element to find a "form-like" container: 1825// - has 1-20 inputs/textareas/selects (excluding hidden/submit/button types) 1826// - has â¤4 button-like descendants (more = page scaffolding, not a form) 1827// - the clicked element sits AFTER the last input in document order 1828// (real submits sit below fields; uses DOCUMENT_POSITION_PRECEDING = 2) 1829// Walk depth capped at 3 â further up is <section>, <main>, or <body>. 1830function findFormLikeContainer(t){ 1831var cur=t.parentElement; 1832for(var depth=0;cur&&depth<3;depth++){ 1833if(cur.tagName==="FORM")return null;// real form, skip 1834var inputs=cur.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button]),textarea,select"); 1835if(inputs.length>=1&&inputs.length<=20){ 1836var ctas=cur.querySelectorAll("button,a[href],[role=button],input[type=submit]"); 1837if(ctas.length<=4){ 1838return (t.compareDocumentPosition(inputs[inputs.length-1])&2)?cur:null; 1839} 1840} 1841cur=cur.parentElement; 1842} 1843return null; 1844} 1845// <a> with a real href is navigation, never a submit. Allow empty href / "#" / 1846// no href (button-styled anchors). <button type="button"> is explicitly non-submit. 1847function isPlausibleSubmit(t){ 1848if(t.tagName==="A"){ 1849var href=t.getAttribute("href"); 1850if(href!==null){ 1851href=(href+"").trim(); 1852if(href!==""&&href!=="#")return false;
1853} 1854} 1855if(t.tagName==="BUTTON"&&t.getAttribute("type")==="button")return false; 1856return true; 1857} 1858document.addEventListener("click",function(e){ 1859var t=e.target.closest?e.target.closest("button,a,[role=button],input[type=submit]"):null; 1860if(!t)return; 1861if(t.closest("form"))return;// inside a real form, native handler covers it 1862// Third-party consent-management (CMP) dialogs (Cookiebot/OneTrust/Osano/ 1863// TrustArc/CookieYes) inject a body-level dialog whose "Accept" button + single 1864// pre-checked "necessary" checkbox otherwise look form-like. Cheap early-exit 1865// for known vendors; the lead-field guard below is the load-bearing check. 1866// Vendor tokens are boundary-anchored (CookieYes cky-* matched as whole class 1867// tokens; TrustArc truste-/truste_/trustarc) so they never collide with 1868// sticky-*/trusted* names. [HP-3292] 1869try{if(t.closest("[id*='Cookiebot' i],[id*='CybotCookiebot' i],[id*='onetrust' i],[id*='osano' i],[id*='truste-' i],[id*='truste_' i],[id*='trustarc' i],[class*='cookie-consent' i],[class*='cookieconsent' i],[class^='cky-' i],[class*=' cky-' i]"))return;}catch(e){} 1870if(!isPlausibleSubmit(t))return; 1871var now=Date.now(); 1872if(now-lastFakeSubmit<2000)return; 1873var container=findFormLikeContainer(t); 1874if(!container)return; 1875// A genuine lead always carries at least one typed (non checkbox/radio) field 1876// with a value. A form-like container whose only populated field is a 1877// checkbox/radio is a consent/cookie dialog, not a form â never fire a lead for 1878// it. Keys off DOM field TYPE, never payload values, so real leads whose data 1879// merely contains vendor-name substrings are unaffected. [HP-3292] 1880var _leadFields=container.querySelectorAll("input:not([type=hidden]):not([type=submit]):not([type=button]):not
1880([type=checkbox]):not([type=radio]),textarea,select"); 1881var _hasLeadField=false; 1882for(var _lf=0;_lf<_leadFields.length;_lf++){if((_leadFields[_lf].value||"").trim()){_hasLeadField=true;break;}} 1883if(!_hasLeadField)return; 1884var data=collect(container); 1885if(Object.keys(data).length===0)return; 1886// Skip if all field values are empty (button click near empty form fields) 1887var hasAnyValue=Object.keys(data).some(function(k){return data[k]&&String(data[k]).trim();}); 1888if(!hasAnyValue)return; 1889lastFakeSubmit=now; 1890container.setAttribute("data-htmlpub-fake-form",""); 1891submitData(container,data); 1892// Notify analytics script about this fake form submission 1893try{document.dispatchEvent(new CustomEvent("htmlpub:form-submit",{detail:{formIdentifier:formId(container)}}));}catch(e){} 1894},true); 1895 1896// Always report form count to parent (even for non-owner views) 1897function reportFormCount(){ 1898var forms=document.querySelectorAll("form"); 1899var count=forms.length; 1900var labels=[]; 1901for(var i=0;i<forms.length;i++){ 1902var ff=forms[i]; 1903var label=ff.getAttribute("aria-label")||ff.getAttribute("name")||ff.getAttribute("id")||""; 1904if(!label){ 1905var heading=ff.querySelector("h1,h2,h3,h4,h5,h6,label,legend"); 1906if(heading) label=heading.textContent.trim().substring(0,50); 1907} 1908labels.push(label||("Form "+(i+1))); 1909} 1910// needsCaptcha tells the parent shell (sandbox path) to render a Turnstile 1911// widget on its own origin: the sandboxed iframe has an opaque origin so it 1912// can't run Turnstile itself. Owner previews never require the token. 1913var _hpNeedsCaptcha=!_hpIsOwner&&!!document.querySelector("form[data-persist-captcha]"); 1914if(inSandbox) parent.postMessage({type:"htmlpub-form-count",count:count,labels:labels,needsCaptcha:_hpNeedsCaptcha},"*"); 1915} 1916function initFormCount(){ 1917reportFormCount(); 1918if(typeof MutationObserver!=="undefined"){ 1919new MutationObserver(function(){reportFormCount();}).observe(document.body||document.documentElement,{childList:true,subtree:true}); 1920} 1921} 1922if(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",initFormCount);} 1923else{initFormCount();} 1924 1925// Leadbox/leadbar iframe form bridge. SYNC with worker-pages/src/scripts/forms.ts. 1926window.addEventListener("message",function(e){ 1927if(!e||!e.data||e.data.type!=="htmlpub:iframe-form-submit")return; 1928var fid=String(e.data.formIdentifier||"iframe-form").slice(0,255); 1929var fsid=e.data.formSourceId?String(e.data.formSourceId).slice(0,255):""; 1930var raw=e.data.data; 1931if(!raw||typeof raw!=="object")return; 1932var clean={}; 1933for(var k in raw){ 1934if(!Object.prototype.hasOwnProperty.call(raw,k))continue; 1935if(looksLikeRawId(k))continue; 1936if(_blocklist.test(k))continue; 1937clean[k]=raw[k]; 1938} 1939var redirect=typeof e.data.redirect==="string"?e.data.redirect:""; 1940var relayCaptcha=typeof e.data.captchaToken==="string"?e.data.captchaToken:undefined; 1941fetch(api,{method:"POST",keepalive:true,headers:{"Content-Type":"application/json"},body:JSON.stringify({pageId:pageId,pageSlug:slug,formIdentifier:fid,formSourceId:fsid,data:clean,captchaToken:relayCaptcha})}).then(function(r){if(r.ok){if(redirect)maybeRedirectUrl(redirect);}else{reportFail("http_error",r.status,fid);}}).catch(function(){reportFail("network",0,fid);}); 1942},false); 1943})(); 1944</script>
1944<script data-htmlpub-popups> 1945(function(){ 1946"use strict"; 1947 1948var SCOPE = "pathname"; 1949var PAGE_ID = "bthr9fgjr4tunfrsf2zhq0ba"; 1950 1951var DEFAULTS = { 1952 overlay: { color: "#000000", opacity: 0.5, clickToClose: true }, 1953 close: { enabled: true, position: "top-right", escapeToClose: true }, 1954 animation: { open: "fade", close: "fade", durationMs: 250 }, 1955 frequency: { visitsBefore: 0, daysCooldown: 0 } 1956}; 1957 1958function parseJsonAttr(raw, fallback) { 1959 if (!raw) return fallback; 1960 try { 1961 var p = JSON.parse(raw); 1962 if (p && typeof p === "object") return p; 1963 } catch(e) {} 1964 return fallback; 1965} 1966 1967// Back-compat: pages published before the data-persist-popup* rename carry the 1968// legacy data-htmlpub-popup* names. Read canonical first, fall back to legacy. 1969// suffix is "" for the marker, "-name", "-overlay", "-target", etc. 1970function pAttr(el, suffix) { 1971 var v = el.getAttribute("data-persist-popup" + suffix); 1972 return v !== null ? v : el.getAttribute("data-htmlpub-popup" + suffix); 1973} 1974 1975function readConfig(el) { 1976 var overlay = parseJsonAttr(pAttr(el, "-overlay"), {}); 1977 var closeCfg = parseJsonAttr(pAttr(el, "-close"), {}); 1978 var anim = parseJsonAttr(pAttr(el, "-animation"), {}); 1979 var triggers = parseJsonAttr(pAttr(el, "-triggers"), {}); 1980 var frequency = parseJsonAttr(pAttr(el, "-frequency"), {}); 1981 return { 1982 overlay: { 1983 color: typeof overlay.color === "string" ? overlay.color : DEFAULTS.overlay.color, 1984 opacity: typeof overlay.opacity === "number" ? overlay.opacity : DEFAULTS.overlay.opacity, 1985 clickToClose: overlay.clickToClose !== false 1986 }, 1987 close: { 1988 enabled: closeCfg.enabled !== false, 1989 position: closeCfg.position === "top-left" ? "top-left" : "top-right", 1990 escapeToClose: closeCfg.escapeToClose !== false 1991 }, 1992 animation: { 1993 open: typeof anim.open === "string" ? anim.open : DEFAULTS.animation.open, 1994 close: typeof anim.close === "string" ? anim.close : DEFAULTS.animation.close, 1995 durationMs: typeof anim.durationMs === "number" ? anim.durationMs : DEFAULTS.animation.durationMs 1996 }, 1997 triggers: triggers, 1998 frequency: { 1999 visitsBefore: typeof frequency.visitsBefore === "number" ? frequency.visitsBefore : 0, 2000 daysCooldown: typeof frequency.daysCooldown === "number" ? frequency.daysCooldown : 0 2001 }, 2002 // "none" = the marker's content owns its own chrome, so this runtime paints none of it. 2003 // Migrated Classic pop-ups: the marker holds an <iframe> whose document already draws the 2004 // mask, centring, card and close button. Nova-authored pop-ups never set it. 2005 chrome: pAttr(el, "-chrome") === "none" ? "none" : "default" 2006 }; 2007} 2008 2009// ââ LocalStorage helpers â scoped per pathname so two pages on the same 2010// origin track their popups independently. Wrapped in try/catch because 2011// Safari private mode + iframe sandboxing can throw on access. 2012var STORE_PREFIX = SCOPE === "popup-id" ? "_hpup:popup:" : ("_hpup:" + (location.pathname || "/") + ":"); 2013function lsGet(key) { 2014 try { return localStorage.getItem(STORE_PREFIX + key); } catch(e) { return null; } 2015} 2016function lsSet(key, value) { 2017 try { localStorage.setItem(STORE_PREFIX + key, value); } catch(e) {} 2018} 2019 2020// Bump the visit counter once per pageload. Used by visitsBefore. In embed 2021// (popup-id) scope callers pass the popup id as a suffix so each standalone 2022// popup tracks its own visit count â a busy host page with two embedded popups 2023// must not let one popup's pageviews satisfy another's visitsBefore gate. 2024function recordVisit(suffix) { 2025 var key = "visits" + (suffix ? ":" + suffix : ""); 2026 var prev = parseInt(lsGet(key) || "0", 10); 2027 if (!isFinite(prev) || prev < 0) prev = 0; 2028 lsSet(key, String(prev + 1)); 2029 return prev + 1; 2030} 2031 2032function isEligible(cfg, popupId, currentVisit) { 2033 // visitsBefore: 0 = show on first visit. So eligible iff currentVisit > visitsBefore. 2034 if (cfg.frequency.visitsBefore > 0 && currentVisit <= cfg.frequency.visitsBefore) return false; 2035 // daysCooldown: don't reshow until N days have passed since last close. 2036 if (cfg.frequency.daysCooldown > 0) { 2037 var last = parseInt(lsGet("close:" + popupId) || "0", 10); 2038 if (last > 0) { 2039 var elapsedMs = Date.now() - last; 2040 if (elapsedMs < cfg.frequency.daysCooldown * 86400000) return false;
2041 } 2042 } 2043 return true; 2044} 2045 2046function composeRgba(color, opacity) { 2047 var hex = color.match(/^#([0-9a-f]{6})$/i); 2048 if (hex) { 2049 var n = parseInt(hex[1], 16); 2050 return "rgba(" + ((n >> 16) & 0xff) + "," + ((n >> 8) & 0xff) + "," + (n & 0xff) + "," + opacity + ")"; 2051 } 2052 var rgb = color.match(/^rgb(?:a)?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/); 2053 if (rgb) return "rgba(" + rgb[1] + "," + rgb[2] + "," + rgb[3] + "," + opacity + ")"; 2054 return "rgba(0,0,0," + opacity + ")"; 2055} 2056 2057function animStart(kind) { 2058 if (kind === "slide-up") return { opacity: 0, transform: "translate(-50%, -40%)" }; 2059 if (kind === "slide-down") return { opacity: 0, transform: "translate(-50%, -60%)" }; 2060 if (kind === "zoom") return { opacity: 0, transform: "translate(-50%, -50%) scale(0.92)" }; 2061 if (kind === "none") return { opacity: 1, transform: "translate(-50%, -50%)" }; 2062 return { opacity: 0, transform: "translate(-50%, -50%)" }; // fade 2063} 2064function animEnd() { 2065 return { opacity: 1, transform: "translate(-50%, -50%) scale(1)" }; 2066} 2067 2068// Body scroll lock â refcounted because two popups can technically be in 2069// the open state at once (different triggers firing back-to-back). The 2070// first lock saves the body's prior overflow + padding-right and replaces 2071// them; subsequent locks just bump the count. We only restore once every 2072// popup that locked has closed, so a still-open popup keeps the page held. 2073// padding-right compensates for the scrollbar disappearing â without it, 2074// the dimmed page behind the overlay shifts right at the moment of open. 2075var _hpupLockCount = 0; 2076var _hpupSavedOverflow = ""; 2077var _hpupSavedPaddingRight = ""; 2078function lockBodyScroll() { 2079 if (_hpupLockCount === 0) { 2080 var scrollbarWidth = window.innerWidth - document.documentElement.clientWidth; 2081 _hpupSavedOverflow = document.body.style.overflow || ""; 2082 _hpupSavedPaddingRight = document.body.style.paddingRight || ""; 2083 if (scrollbarWidth > 0) document.body.style.paddingRight = scrollbarWidth + "px"; 2084 document.body.style.overflow = "hidden"; 2085 } 2086 _hpupLockCount++; 2087} 2088function unlockBodyScroll() { 2089 if (_hpupLockCount === 0) return; 2090 _hpupLockCount--; 2091 if (_hpupLockCount === 0) { 2092 if (_hpupSavedOverflow) document.body.style.overflow = _hpupSavedOverflow; 2093 else document.body.style.removeProperty("overflow"); 2094 if (_hpupSavedPaddingRight) document.body.style.paddingRight = _hpupSavedPaddingRight; 2095 else document.body.style.removeProperty("padding-right"); 2096 } 2097} 2098 2099// Build the overlay backdrop. Returns the element. Wired with the right 2100// pointer behaviour for the popup's clickToClose setting. 2101function buildOverlay(cfg, onOverlayClick) { 2102 var ov = document.createElement("div"); 2103 ov.setAttribute("data-htmlpub-popup-backdrop", ""); 2104 ov.style.cssText = "position:fixed;inset:0;background:" + composeRgba(cfg.overlay.color, cfg.overlay.opacity) + 2105 ";z-index:2147483646;opacity:0;transition:opacity " + cfg.animation.durationMs + "ms ease;"; 2106 if (cfg.overlay.clickToClose) ov.addEventListener("click", onOverlayClick); 2107 return ov; 2108} 2109 2110// Inject a close â button if the popup doesn't already have one. We mark our 2111// injected button so re-show calls don't duplicate it. 2112function ensureCloseButton(el, cfg, onClose) { 2113 if (el.querySelector("[data-htmlpub-popup-close-btn]")) return; 2114 if (!cfg.close.enabled) return; 2115 var btn = document.createElement("button"); 2116 btn.setAttribute("type", "button"); 2117 btn.setAttribute("aria-label", "Close pop-up"); 2118 btn.setAttribute("data-htmlpub-popup-close-btn", ""); 2119 var posStyle = cfg.close.position === "top-left" ? "left:12px;" : "right:12px;"; 2120 btn.style.cssText = "position:absolute;top:12px;" + posStyle + 2121 "width:28px;height:28px;border-radius:9999px;border:0;background:rgba(0,0,0,0.45);color:#fff;" + 2122 "font:16px/1 system-ui,-apple-system,sans-serif;cursor:pointer;display:flex;align-items:center;" + 2123 "justify-content:center;z-index:1;padding:0;"; 2124 btn.textContent = "Ã"; 2125 btn.addEventListener("click", function(e){ e.preventDefault(); e.stopPropagation(); onClose(); }); 2126 // Ensure the popup itself is a positioning context so absolute close button 2127 // anchors to it. Cheap: only sets if not already positioned. 2128 var pos = getComputedStyle(el).position; 2129 if (pos === "static" || !pos) el.style.position = "relative"; 2130 el.appendChild(btn); 2131} 2132 2133// ââ Per-popup wiring ââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2134// Each popup gets its own controller closing over its element + config + 2135// trigger cleanup so we can tear down listeners on close. 2136 2137// HP-1557 â fire an analytics event for this popup. Hands off to the 2138// analytics.ts buffer via window.__hpupPushEvent (registered there). If 2139// analytics isn't loaded for some reason we silently no-op rather than 2140// breaking the popup runtime. 2141function emitPopupEvent(eventType, popup, extras) { 2142 if (typeof window.__hpupPushEvent !== "function") return; 2143 var payload = { 2144 popupId: popup.getAttribute("id") || "", 2145 popupName: (pAttr(popup, "-name") || "").replace(/^\s+|\s+$/g, "") 2146 }; 2147 // Standalone-embed pop-ups carry their page id via data-hp-popup-cuid (set by 2148 // the embed bundle) so analytics can attribute to a specific pop-up; the DOM 2149 // id in popupId is a shared name-slug. In-page pop-ups have no cuid so this 2150 // stays absent. 2151 var _hpCuid = popup.getAttribute("data-hp-popup-cuid"); 2152 if (_hpCuid) payload.popupCuid = _hpCuid; 2153 if (extras && typeof extras === "object") { 2154 for (var k in extras) { 2155 if (Object.prototype.hasOwnProperty.call(extras, k)) payload[k] = extras[k]; 2156 } 2157 } 2158 window.__hpupPushEvent(eventType, payload); 2159} 2160 2161// Single-open invariant: only one popup may be visible at a time. 2162// show() force-closes whatever is up before painting itself. 2163var _hpupCurrentOpen = null; 2164 2165function wirePopup(el, currentVisit) { 2166 var cfg = readConfig(el); 2167 var popupId = el.getAttribute("id") || ""; 2168 if (!popupId) return; 2169 // The editor stores popups hidden via inline display:none. We never strip 2170 // that â we toggle it at show/close time so a never-shown popup stays 2171 // invisible (matching its rendered state in the DOM). 2172 var originalDisplay = el.style.display || ""; 2173 var isOpen = false;
2174 var overlay = null; 2175 var keyListener = null; 2176 var sizeObserver = null; 2177 var cleanups = []; // trigger listener removers; called on first show 2178 2179 function cleanupTriggers() { 2180 for (var i = 0; i < cleanups.length; i++) { 2181 try { cleanups[i](); } catch(e) {} 2182 } 2183 cleanups = []; 2184 } 2185 2186 // Why a popup was opened â informs the parent analytics event so the 2187 // dashboard can distinguish "fired by timer" vs. "explicit user click". 2188 // Updated by callers before show() and reset to null after emit. 2189 var lastShowReason = null; 2190 2191 // HP-4147 â the overflow choice in show() is a measurement, and measurements 2192 // go stale. Content can grow AFTER open: an inline checkout's Stripe Payment 2193 // Element progressively reveals card fields and then a "Save your info" 2194 // section as the buyer types. A popup that opened short (overflow:visible, so 2195 // its shadow paints) and then grows past maxHeight spills below the viewport 2196 // instead of scrolling, and because show() locked the body scroll there is 2197 // nothing left for a touch drag to move â the Pay button becomes unreachable 2198 // and closing + reopening is the only way out (reopening re-runs show(), which 2199 // re-measures against the now-tall content and lands on "auto"). So re-decide 2200 // on every resize â but only ever upgrade to "auto", never back to "visible". 2201 // 2202 // One-way on purpose. Reverting to "visible" when content shrinks back under 2203 // maxHeight sounds harmless (it hands HP-3771 its shadow back) but it 2204 // re-releases horizontal spill that "auto" had been containing, so a wide 2205 // child paints outside the popup over the page, and it discards scrollTop, 2206 // bouncing the buyer to the top of the form. Both were measured in Chromium 2207 // at a Pixel viewport. Staying in "auto" costs only the shadow, and only for 2208 // the rest of an open in which content already exceeded the viewport: "auto" 2209 // paints no scrollbar once content fits again, it merely clips. close() 2210 // strips every inline style, so the next open re-decides from scratch. 2211 function syncOverflow() { 2212 if (!isOpen) return; 2213 // Guarded on a real change. Toggling overflow lays out a scrollbar, which 2214 // resizes content, which re-enters this observer â an unguarded write there 2215 // is a feedback loop that never settles. 2216 if (el.scrollHeight > el.clientHeight + 1 && el.style.overflow !== "auto") { 2217 el.style.overflow = "auto"; 2218 } 2219 } 2220 2221 function observeSize() { 2222 if (sizeObserver || typeof ResizeObserver === "undefined") return; 2223 sizeObserver = new ResizeObserver(syncOverflow); 2224 // Observing el catches the growth that crosses maxHeight, since its own box 2225 // tracks content right up to the clamp. Observing its element children 2226 // catches growth that continues past the clamp, where el's box is pinned and 2227 // reports no resize at all â content 1px under maxHeight that then expands 2228 // would otherwise never re-decide. 2229 sizeObserver.observe(el); 2230 for (var childIndex = 0; childIndex < el.children.length; childIndex++) { 2231 sizeObserver.observe(el.children[childIndex]); 2232 } 2233 } 2234 2235 function unobserveSize() { 2236 if (!sizeObserver) return; 2237 sizeObserver.disconnect(); 2238 sizeObserver = null; 2239 } 2240 2241 function show(reason) { 2242 if (isOpen) return; 2243 if (_hpupCurrentOpen && _hpupCurrentOpen !== el && typeof _hpupCurrentOpen._hpupClose === "function") { 2244 _hpupCurrentOpen._hpupClose("replaced", true); 2245 } 2246 _hpupCurrentOpen = el; 2247 isOpen = true; 2248 lastShowReason = reason || "explicit"; 2249 cleanupTriggers(); 2250 lockBodyScroll(); 2251 // chrome:none â the content paints its own â (Classic's .js-close, inside the iframe). 2252 var bare = cfg.chrome === "none"; 2253 if (!bare) ensureCloseButton(el, cfg, function(){ close("close_button"); }); 2254 2255 var start = animStart(cfg.animation.open); 2256 var end = animEnd(); 2257 2258 // Centered fixed positioning with a high z-index so we float above any 2259 // page content + checkout / chat widgets. 2260 el.style.display = "block"; 2261 el.style.position = "fixed"; 2262 el.style.zIndex = "2147483647"; 2263 2264 if (bare) { 2265 // Full-viewport shell. An <iframe> has no intrinsic content height (~150px, and it never 2266 // reports its content size to the parent), so the shrink-wrapped-card model below cannot 2267 // measure it â centring, the maxHeight/maxWidth clamps and the overflow logic all assume a 2268 // box that sizes to its content. Reproduce CDA's model instead: the frame fills the 2269 // viewport and the Classic document inside owns mask, centring and card. 2270 // 2271 // No transform either: every animStart transform carries translate(-50%,-50%), which 2272 // centres a card and would shove a full-viewport shell off screen. Opacity alone. 2273 el.style.top = "0"; 2274 el.style.left = "0"; 2275 el.style.width = "100%"; 2276 el.style.height = "100%"; 2277 el.style.opacity = String(start.opacity); 2278 el.style.transition = "opacity " + cfg.animation.durationMs + "ms ease"; 2279 openClassicFrame(el); 2280 } else { 2281 el.style.top = "50%"; 2282 el.style.left = "50%"; 2283 el.style.transform = start.transform; 2284 el.style.opacity = String(start.opacity); 2285 el.style.maxHeight = "calc(100vh - 32px)"; 2286 el.style.maxWidth = "calc(100vw - 32px)"; 2287 // HP-3771 â "auto" clips any box-shadow set on the popup's own content: 2288 // box-shadow doesn't affect layout size, so this element shrink-wraps to its 2289 // content and its own overflow then clips the shadow it should cast. 2290 // 2291 // But "visible" unconditionally is not safe either. This element is 2292 // position:fixed and centred, so content taller than maxHeight does not 2293 // clip â it spills past the viewport with no scrollbar and nothing can 2294 // reach it. A lead-capture form taller than the viewport would lose its 2295 // submit button. So decide per popup, after layout: overflow stays "auto" 2296 // only when the content genuinely overflows (scrolling wins), and is 2297 // "visible" otherwise (shadow wins). Short popups are the overwhelmingly 2298 // common case, so the shadow renders for almost everyone. 2299 //
2300 // syncOverflow re-applies this same rule for the rest of the open (HP-4147). 2301 el.style.overflow = "visible"; 2302 syncOverflow(); 2303 el.style.transition = "opacity " + cfg.animation.durationMs + "ms ease, transform " + cfg.animation.durationMs + "ms ease"; 2304 } 2305 2306 if (!el.parentNode) document.body.appendChild(el); 2307 if (!bare) { 2308 // Backdrop. Inserted before the popup so the popup naturally paints on top. 2309 // chrome:none skips it â the Classic document paints its own .js-leadbox-mask, and a second 2310 // backdrop would darken the page twice. 2311 overlay = buildOverlay(cfg, function(){ close("overlay_click"); }); 2312 (el.parentNode || document.body).insertBefore(overlay, el); 2313 2314 // Started only once el is attached, so the observer's first delivery measures 2315 // real geometry rather than the 0x0 of a detached node. 2316 observeSize(); 2317 } 2318 2319 // Force reflow so the next style change animates from start, not jumps. 2320 /* eslint-disable-next-line no-unused-expressions */ void el.offsetWidth; 2321 2322 el.style.opacity = String(end.opacity); 2323 if (!bare) el.style.transform = end.transform; 2324 if (overlay) overlay.style.opacity = "1"; 2325 2326 if (cfg.close.escapeToClose) { 2327 keyListener = function(e) { if (e.key === "Escape") close("escape"); }; 2328 document.addEventListener("keydown", keyListener); 2329 } 2330 2331 emitPopupEvent("popup_view", el, { reason: lastShowReason }); 2332 lastShowReason = null; 2333 } 2334 2335 function close(reason, hard) { 2336 if (!isOpen) return; 2337 isOpen = false; 2338 emitPopupEvent("popup_dismiss", el, { reason: reason || "unknown" }); 2339 var start = animStart(cfg.animation.close); 2340 el.style.opacity = String(start.opacity); 2341 // Same reason as show(): the close transform centres a card, and applying it to a 2342 // full-viewport shell would slide it off screen instead of fading it out. 2343 if (cfg.chrome !== "none") el.style.transform = start.transform; 2344 if (overlay) overlay.style.opacity = "0"; 2345 2346 if (keyListener) { 2347 document.removeEventListener("keydown", keyListener); 2348 keyListener = null; 2349 } 2350 2351 var afterAnim = function() { 2352 if (_hpupCurrentOpen === el) _hpupCurrentOpen = null; 2353 unobserveSize(); 2354 el.style.display = originalDisplay || "none"; 2355 el.style.removeProperty("position"); 2356 el.style.removeProperty("top"); 2357 el.style.removeProperty("left"); 2358 el.style.removeProperty("transform"); 2359 el.style.removeProperty("opacity"); 2360 el.style.removeProperty("z-index"); 2361 el.style.removeProperty("max-height"); 2362 el.style.removeProperty("max-width"); 2363 // Only the chrome:none branch sets these, and teardown must remove exactly what this show 2364 // set â a marker can legitimately carry an author's own inline width/height, and stripping 2365 // it on close would resize the pop-up the second time it opens. 2366 if (cfg.chrome === "none") { 2367 el.style.removeProperty("width"); 2368 el.style.removeProperty("height"); 2369 } 2370 el.style.removeProperty("overflow"); 2371 el.style.removeProperty("transition"); 2372 if (overlay && overlay.parentNode) overlay.parentNode.removeChild(overlay); 2373 overlay = null; 2374 // Tear down the close button â its click handler closes over THIS 2375 // show's overlay reference. Leaving it across opens means a second 2376 // show's X would call the previous close() with a stale overlay and 2377 // leave the current overlay floating. 2378 var existingBtn = el.querySelector("[data-htmlpub-popup-close-btn]"); 2379 if (existingBtn && existingBtn.parentNode) existingBtn.parentNode.removeChild(existingBtn); 2380 // Release the scroll lock only after the popup is fully torn down so 2381 // the page doesn't pop back to scrollable while the close animation 2382 // is still painting. 2383 unlockBodyScroll(); 2384 lsSet("close:" + popupId, String(Date.now())); 2385 }; 2386 if (hard || cfg.animation.close === "none") afterAnim(); 2387 else setTimeout(afterAnim, cfg.animation.durationMs); 2388 } 2389 2390 // ââ Triggers ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2391 // Only wire if the popup is eligible to show this pageload (frequency 2392 // rules). Click-to-open via [data-htmlpub-popup-target] always works, 2393 // regardless of eligibility â it's an explicit user action. 2394 var eligible = isEligible(cfg, popupId, currentVisit); 2395 2396 if (eligible) { 2397 var t = cfg.triggers || {}; 2398
2399 if (t.timed && typeof t.timed.delaySec === "number") { 2400 var delayMs = Math.max(0, t.timed.delaySec) * 1000; 2401 var timer = setTimeout(function(){ show("timed"); }, delayMs); 2402 cleanups.push(function(){ clearTimeout(timer); }); 2403 } 2404 2405 if (t.exitIntent === true) { 2406 // Mobile / touch devices don't have a meaningful "exit toward chrome" 2407 // gesture. Standard heuristic: skip if no mouse pointer is available. 2408 if (!matchMedia("(pointer: coarse)").matches) { 2409 var onMove = function(e) { 2410 if (e.clientY < 8) show("exit_intent"); 2411 }; 2412 document.addEventListener("mousemove", onMove); 2413 cleanups.push(function(){ document.removeEventListener("mousemove", onMove); }); 2414 } 2415 } 2416 2417 if (typeof t.scrollPercent === "number" && t.scrollPercent > 0) { 2418 var threshold = Math.max(1, Math.min(100, t.scrollPercent)); 2419 var onScroll = function() { 2420 var doc = document.documentElement; 2421 var scrolled = (window.scrollY || doc.scrollTop || 0); 2422 var max = (doc.scrollHeight - doc.clientHeight) || 1; 2423 var pct = (scrolled / max) * 100; 2424 if (pct >= threshold) show("scroll"); 2425 }; 2426 window.addEventListener("scroll", onScroll, { passive: true }); 2427 cleanups.push(function(){ window.removeEventListener("scroll", onScroll); }); 2428 } 2429 } 2430 2431 // Note: in-popup form submits and CTA clicks are NOT emitted as separate 2432 // popup_* events. They already fire as form_submit / element_click via 2433 // analytics.ts's global listeners, which now attach popupId + popupName 2434 // to the payload so customers can still see which pop-up the conversion 2435 // came from while continuing to track the standard goal types. 2436 2437 // Expose the show function on the element so [data-htmlpub-popup-target] 2438 // clicks (wired globally below) can find and trigger it without re-parsing 2439 // the config. _hpupShow / _hpupClose are deliberately namespaced + ugly to 2440 // avoid colliding with user code. 2441 el._hpupShow = show; 2442 el._hpupClose = close; 2443 // Returned so boot() can flush unfired trigger listeners on pagehide. 2444 return cleanupTriggers; 2445} 2446 2447// A served Classic leadbox renders INACTIVE: its controller only adds js-active to the dialog 2448// and mask when it receives an "open" message, so a frame nobody tells to open is a full-viewport 2449// sheet showing nothing. 2450// 2451// TWO WIRE FORMATS, because there are two leadbox builds in the corpus and they do NOT agree â 2452// measured across all 462 live clones on 2026-09-09, not inferred from one of them (D71): 2453// 2454// · newer build (410 of 462): a handleMessage controller that accepts EITHER the bare string 2455// "open" or {type:"open"}. 2456// · OLDER build (52 of 462): a hand-rolled listener whose whole test is 2457// window.addEventListener('message', function(e){ e && e.data && 'open' === e.data && j.open() }) 2458// read verbatim out of the served bundle. The test 'open' === e.data is a STRING identity check, so 2459// an object payload fails it silently and that pop-up never opens. 2460// 2461// This function used to post ONLY {type:"open"}, and the comment here used to assert both builds 2462// took it. They do not: every old-build pop-up rendered a full-viewport dark sheet with an 2463// invisible modal â no error, no console message, and zero lead capture. So post BOTH forms. The 2464// duplicate is harmless in each direction: the old build ignores the object, and the newer one's 2465// open() just re-adds the class and refocuses. 2466// 2467// The string form is also what Classic's own embed.js sent, which is why the defect stayed hidden 2468// on the two pages that still carried embed.js â its copy opened correctly beside our blank one. 2469// (The close relay below had this right already: it reads Classic's bare-string "close leadbox" 2470// off the wire. Open is the direction that was guessed.) 2471// 2472// Posted on both paths because the ordering is not ours to control: if the frame is already 2473// loaded the immediate post lands, and if it is not, the load listener catches it. Opening twice 2474// is harmless â open() just re-adds the class and refocuses. 2475function openClassicFrame(el) { 2476 var frame = el.querySelector("iframe"); 2477 if (!frame) return; 2478 var post = function() { 2479 // targetOrigin "*": the frame is served sandboxed, so its origin is opaque and cannot be 2480 // named. The payload is a bare open signal carrying nothing worth protecting. 2481 try { 2482 if (!frame.contentWindow) return; 2483 // String FIRST: it is the format the old build needs, and the one that was missing. 2484 frame.contentWindow.postMessage("open", "*"); 2485 frame.contentWindow.postMessage({ type: "open" }, "*"); 2486 } catch(e) {} 2487 }; 2488 post(); 2489 frame.addEventListener("load", post); 2490} 2491 2492// Global close relay. A chrome:none pop-up's â lives INSIDE its iframe (Classic's .js-close), so 2493// the click is invisible to this document â the frame posts htmlpub:leadbox-close instead and we 2494// close the marker holding it. Without this the Classic card hides itself and the full-viewport 2495// iframe stays put, covering the page with an invisible sheet that swallows every click. 2496// 2497// Identify the marker by matching iframe.contentWindow against e.source, NOT by the message's 2498// uuid: a page can carry several migrated pop-ups, and a uuid can be placed more than once. This 2499// is the technique CDA's own injected handler used. 2500function handleCloseRelay(e) { 2501 if (!e || !e.data) return; 2502 // Classic's own leadbox controller posts the bare STRING "close leadbox" to window.parent when 2503 // it closes (300ms after the fade, from its close() method) â read out of the served bundle, not 2504 // guessed. It is already the wire format, so nothing needs injecting into the frame. The 2505 // namespaced form is accepted too, for anything we serve ourselves later. 2506 var type = typeof e.data === "string" ? e.data : e.data.type; 2507 if (type !== "close leadbox" && type !== "htmlpub:leadbox-close") return; 2508 var frames = document.querySelectorAll("[data-persist-popup] iframe, [data-htmlpub-popup] iframe"); 2509 for (var i = 0; i < frames.length; i++) { 2510 if (frames[i].contentWindow !== e.source) continue; 2511 var marker = frames[i].closest("[data-persist-popup], [data-htmlpub-popup]"); 2512 if (marker && typeof marker._hpupClose === "function") marker._hpupClose("close_relay"); 2513 return; 2514 } 2515} 2516 2517// The migrated pop-up runs in a sandboxed cross-origin iframe and cannot read this page's anal
2517ytics 2518// session/visitor ids (opaque origin blocks its storage). Hand them over when the in-frame capture 2519// script asks â matching e.source to one of our own pop-up iframes so we only answer our own frames. 2520// The ids exist only once analytics consent has minted them, so with no consent nothing is sent and 2521// the ingest keeps the lead but skips the conversion event (there is no page_view session to join). 2522// The page id rides along either way, so the lead files under the page that was served, whatever 2523// URL the browser reports. 2524function handleSessionReq(e) { 2525 if (!e || !e.data || e.data.type !== "hp-popup-session-req" || !e.source) return; 2526 var frames = document.querySelectorAll("[data-persist-popup] iframe, [data-htmlpub-popup] iframe"); 2527 var mine = false; 2528 for (var i = 0; i < frames.length; i++) { if (frames[i].contentWindow === e.source) { mine = true; break; } } 2529 if (!mine) return; 2530 var sid = null, vid = null; 2531 try { sid = sessionStorage.getItem("_hp_sid"); } catch(err) {} 2532 try { vid = localStorage.getItem("_hp_vid"); } catch(err) {} 2533 try { e.source.postMessage({ type: "hp-popup-session", sid: sid, vid: vid, pid: PAGE_ID }, "*"); } catch(err) {} 2534} 2535 2536// Global click-to-open dispatcher. Targets carry [data-persist-popup-target] 2537// (or legacy [data-htmlpub-popup-target]) or href="#popup-â¦" (for plain anchors 2538// that the link picker auto-generated). 2539function handleTargetClick(e) { 2540 var t = e.target; 2541 if (!t || !t.closest) return; 2542 var hit = t.closest("[data-persist-popup-target], [data-htmlpub-popup-target], a[href^='#popup-'], a[href^='#modal-'], a[href^='#dialog-']"); 2543 if (!hit) return; 2544 var id = pAttr(hit, "-target"); 2545 if (!id) { 2546 var href = hit.getAttribute("href") || ""; 2547 if (href.charAt(0) === "#") id = href.slice(1); 2548 } 2549 if (!id) return; 2550 var popup = document.getElementById(id); 2551 if (!popup || pAttr(popup, "") === null) return; 2552 e.preventDefault(); 2553 if (typeof popup._hpupShow === "function") popup._hpupShow("click_target"); 2554} 2555 2556// ââ Boot ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 2557 2558function flushTeardowns(list) { 2559 for (var j = 0; j < list.length; j++) { 2560 try { list[j](); } catch(e) {} 2561 } 2562} 2563 2564function boot() { 2565 if (SCOPE === "popup-id") { 2566 // Embed mode: each standalone popup ships its OWN copy of this runtime, so 2567 // a single global boot guard would make a second embedded popup bail. Wire 2568 // each popup once via a per-element marker, count visits per popup id, and 2569 // attach the global click / pagehide listeners only once across copies. 2570 var list = document.querySelectorAll("[data-persist-popup],[data-htmlpub-popup]"); 2571 if (!list.length) return; 2572 if (!window.__hpupTeardowns) window.__hpupTeardowns = []; 2573 for (var n = 0; n < list.length; n++) { 2574 var pel = list[n]; 2575 if (pel.__hpupWired) continue; 2576 pel.__hpupWired = true; 2577 var pt = wirePopup(pel, recordVisit(pel.getAttribute("id") || "")); 2578 if (typeof pt === "function") window.__hpupTeardowns.push(pt); 2579 } 2580 if (!window.__hpupClickWired) { 2581 window.__hpupClickWired = true; 2582 document.addEventListener("click", handleTargetClick, false); 2583 window.addEventListener("message", handleCloseRelay, false); 2584 window.addEventListener("message", handleSessionReq, false); 2585 window.addEventListener("pagehide", function(){ flushTeardowns(window.__hpupTeardowns || []); }); 2586 } 2587 return; 2588 } 2589 2590 // In-page mode: one runtime per page wires every popup. Guard against 2591 // double-injection (HMR, accidental double-include). 2592 if (window.__hpupBooted) return; 2593 window.__hpupBooted = true; 2594 var popups = document.querySelectorAll("[data-persist-popup],[data-htmlpub-popup]"); 2595 if (!popups.length) return; 2596 var visit = recordVisit(); 2597 var teardowns = []; 2598 for (var i = 0; i < popups.length; i++) { 2599 var t = wirePopup(popups[i], visit); 2600 if (typeof t === "function") teardowns.push(t); 2601 } 2602 document.addEventListener("click", handleTargetClick, false); 2603 window.addEventListener("message", handleCloseRelay, false); 2604 window.addEventListener("message", handleSessionReq, false); 2605 // Flush unfired trigger listeners on pagehide. 2606 window.addEventListener("pagehide", function(){ flushTeardowns(teardowns); }); 2607} 2608 2609if (document.readyState === "loading") { 2610 document.addEventListener("DOMContentLoaded", boot); 2611} else { 2612 boot(); 2613} 2614 2615})(); 2616</script>
2616<script data-htmlpub-countdown-runtime> 2617(function(){ 2618var nodes=document.querySelectorAll('[data-htmlpub-countdown]'); 2619if(!nodes.length)return; 2620function pad(n){n=String(n);return n.length<2?'0'+n:n;} 2621function setDigit(root,sel,val){var el=root.querySelector(sel);if(el)el.textContent=pad(val);} 2622function tick(node,endMs){ 2623var diff=Math.max(0,endMs-Date.now()); 2624var s=Math.floor(diff/1000); 2625var d=Math.floor(s/86400);s-=d*86400; 2626var h=Math.floor(s/3600);s-=h*3600; 2627var m=Math.floor(s/60);s-=m*60; 2628setDigit(node,'.countdown-days',d); 2629setDigit(node,'.countdown-hours',h); 2630setDigit(node,'.countdown-minutes',m); 2631setDigit(node,'.countdown-seconds',s); 2632if(diff===0){ 2633var redirect=node.getAttribute('data-redirect'); 2634var inFrame=false;try{inFrame=window!==window.top;}catch(e){inFrame=true;} 2635if(redirect&&!inFrame){try{window.location.href=redirect;}catch(e){}} 2636return true; 2637} 2638return false; 2639} 2640function endMsFor(node){ 2641var mode=node.getAttribute('data-htmlpub-countdown'); 2642if(mode==='fixed'){ 2643var target=node.getAttribute('data-target'); 2644var t=target?Date.parse(target):NaN; 2645return isNaN(t)?0:t; 2646} 2647if(mode==='evergreen'){ 2648var dur=parseInt(node.getAttribute('data-duration')||'0',10); 2649if(!dur)return 0; 2650var idx=Array.prototype.indexOf.call(nodes,node); 2651var base='htmlpub_cd_'+(node.getAttribute('data-persist-countdown-id')||node.id||(location.pathname+'|'+dur+'|'+idx)); 2652var ver=parseInt(node.getAttribute('data-persist-countdown-reset')||'0',10)||0; 2653var key=ver>0?base+'|v'+ver:base; 2654if(ver>0){try{for(var li=localStorage.length-1;li>=0;li--){var lk=localStorage.key(li);if(!lk)continue;if(lk===base){localStorage.removeItem(lk);continue;}if(lk.indexOf(base+'|v')===0){var lv=lk.slice(base.length+2);if(/^[0-9]+$/.test(lv)&&parseInt(lv,10)<ver){localStorage.removeItem(lk);}}}}catch(e){}} 2655var first=null; 2656try{first=localStorage.getItem(key);}catch(e){} 2657if(!first){first=String(Date.now());try{localStorage.setItem(key,first);}catch(e){}} 2658return parseInt(first,10)+dur*1000; 2659} 2660return 0; 2661} 2662for(var i=0;i<nodes.length;i++){(function(node){ 2663var endMs=endMsFor(node); 2664if(!endMs)return; 2665if(tick(node,endMs))return; 2666var iv=setInterval(function(){if(tick(node,endMs))clearInterval(iv);},1000); 2667})(nodes[i]);} 2668})(); 2669</script>
2669<script data-text-anim-runtime> 2670(function(){ 2671var nodes=document.querySelectorAll('[data-persist-text-anim]'); 2672if(!nodes.length)return; 2673try{if(window.matchMedia('(prefers-reduced-motion: reduce)').matches)return;}catch(e){} 2674var KEYFRAMES={ 2675fadeIn:[{opacity:0},{opacity:1}], 2676slideUp:[{opacity:0,transform:'translateY(32px)'},{opacity:1,transform:'translateY(0)'}], 2677slideDown:[{opacity:0,transform:'translateY(-32px)'},{opacity:1,transform:'translateY(0)'}], 2678slideLeft:[{opacity:0,transform:'translateX(32px)'},{opacity:1,transform:'translateX(0)'}], 2679slideRight:[{opacity:0,transform:'translateX(-32px)'},{opacity:1,transform:'translateX(0)'}], 2680zoomIn:[{opacity:0,transform:'scale(0.85)'},{opacity:1,transform:'scale(1)'}], 2681blurIn:[{opacity:0,filter:'blur(8px)'},{opacity:1,filter:'blur(0)'}], 2682bounceIn:[{offset:0,opacity:0,transform:'translateY(40px)'},{offset:0.55,opacity:1,transform:'translateY(-8px)'},{offset:0.8,transform:'translateY(4px)'},{offset:1,transform:'translateY(0)'}] 2683}; 2684var DEFAULTS={duration:600,delay:0,easing:'ease-out'}; 2685function readInt(el,attr,fallback,min){ 2686var n=parseInt(el.getAttribute(attr)||'',10); 2687if(!isFinite(n)||n<min)return fallback; 2688return n; 2689} 2690function arm(el){ 2691var type=el.getAttribute('data-persist-text-anim')||'fadeIn'; 2692var frames=KEYFRAMES[type]; 2693if(!frames)return null; 2694var duration=readInt(el,'data-persist-text-anim-duration',DEFAULTS.duration,1); 2695var delay=readInt(el,'data-persist-text-anim-delay',DEFAULTS.delay,0); 2696var easing=el.getAttribute('data-persist-text-anim-easing')||DEFAULTS.easing; 2697try{ 2698var anim=el.animate(frames,{duration:duration,delay:delay,easing:easing,fill:'both'}); 2699anim.pause(); 2700anim.currentTime=0; 2701return anim; 2702}catch(e){return null;} 2703} 2704if('IntersectionObserver' in window){ 2705var io=new IntersectionObserver(function(entries){ 2706for(var i=0;i<entries.length;i++){ 2707var en=entries[i]; 2708if(!en.isIntersecting)continue; 2709io.unobserve(en.target); 2710var armed=en.target._hpTextAnim; 2711if(!armed)continue; 2712en.target._hpTextAnim=null; 2713try{armed.play();}catch(e){} 2714} 2715},{threshold:0.15}); 2716for(var j=0;j<nodes.length;j++){ 2717var pending=arm(nodes[j]); 2718if(!pending)continue; 2719nodes[j]._hpTextAnim=pending; 2720io.observe(nodes[j]); 2721} 2722}else{ 2723for(var k=0;k<nodes.length;k++){ 2724var immediate=arm(nodes[k]); 2725if(immediate)try{immediate.play();}catch(e){} 2726} 2727} 2728})(); 2729</script>
2729<script data-htmlpub-nav> 2730(function(){ 2731"use strict"; 2732 2733function closeAllSubmenus(except) { 2734 var panels = document.querySelectorAll('[data-persist-nav-submenu-panel]'); 2735 for (var i = 0; i < panels.length; i++) { 2736 var panel = panels[i]; 2737 if (panel === except) continue; 2738 panel.classList.remove('is-open'); 2739 var trigger = panel.__hpNavTrigger; 2740 if (trigger) trigger.setAttribute('aria-expanded', 'false'); 2741 } 2742} 2743 2744function wireSubmenus() { 2745 var triggers = document.querySelectorAll('[data-persist-nav-submenu]'); 2746 if (!triggers.length) return; 2747 for (var i = 0; i < triggers.length; i++) { 2748 (function(trigger) { 2749 if (trigger.__hpNavWired) return; 2750 trigger.__hpNavWired = true; 2751 var panelId = trigger.getAttribute('data-persist-nav-submenu'); 2752 var panel = panelId ? document.getElementById(panelId) : (trigger.parentElement ? trigger.parentElement.querySelector('[data-persist-nav-submenu-panel]') : null); 2753 if (!panel) return; 2754 panel.__hpNavTrigger = trigger; 2755 trigger.setAttribute('aria-haspopup', 'true'); 2756 trigger.setAttribute('aria-expanded', 'false'); 2757 trigger.addEventListener('click', function(e) { 2758 var isOpen = panel.classList.contains('is-open'); 2759 e.preventDefault(); 2760 e.stopPropagation(); 2761 closeAllSubmenus(isOpen ? null : panel); 2762 panel.classList.toggle('is-open', !isOpen); 2763 trigger.setAttribute('aria-expanded', isOpen ? 'false' : 'true'); 2764 }); 2765 })(triggers[i]); 2766 } 2767 document.addEventListener('click', function(e) { 2768 var t = e.target; 2769 if (t && t.closest && t.closest('[data-persist-nav-submenu-panel], [data-persist-nav-submenu]')) return; 2770 closeAllSubmenus(null); 2771 }); 2772} 2773 2774function wireMobileMenu() { 2775 var toggles = document.querySelectorAll('[data-persist-nav-mobile-toggle], [data-persist-nav-tablet-toggle]'); 2776 if (!toggles.length) return; 2777 for (var i = 0; i < toggles.length; i++) { 2778 (function(toggle) { 2779 if (toggle.__hpNavWired) return; 2780 toggle.__hpNavWired = true; 2781 var isTablet = toggle.hasAttribute('data-persist-nav-tablet-toggle'); 2782 var targetId = isTablet ? toggle.getAttribute('data-persist-nav-tablet-toggle') : toggle.getAttribute('data-persist-nav-mobile-toggle'); 2783 var panelSelector = isTablet ? '[data-persist-nav-tablet-panel]' : '[data-persist-nav-mobile-panel]'; 2784 var panel = targetId ? document.getElementById(targetId) : (toggle.parentElement ? toggle.parentElement.querySelector(panelSelector) : null); 2785 if (!panel) return; 2786 toggle.setAttribute('aria-expanded', 'false'); 2787 toggle.addEventListener('click', function(e) { 2788 var isOpen = panel.classList.contains('is-open'); 2789 e.preventDefault(); 2790 e.stopPropagation(); 2791 if (isOpen) panel.classList.remove('is-open'); else panel.classList.add('is-open'); 2792 toggle.setAttribute('aria-expanded', isOpen ? 'false' : 'true'); 2793 }); 2794 })(toggles[i]); 2795 } 2796} 2797 2798function wireScrollBackground() { 2799 // Every nav this system manages, not just ones with scroll-bg/blur 2800 // currently set â a page published while an OLDER build still applied 2801 // blur directly to nav carries that inline backdrop-filter baked into 2802 // its served HTML even after blur is later turned off, so the self-heal 2803 // below has to run regardless of the CURRENT attribute state. 2804 var navs = document.querySelectorAll('[data-persist-nav-id]'); 2805 if (!navs.length) return; 2806 for (var i = 0; i < navs.length; i++) { 2807 (function(nav) { 2808 // Self-heal: strip a stale inline backdrop-filter baked into a page 2809 // saved before this fix (HP-3558 round 15 follow-up) â see the 2810 // dedicated blur-layer comment below for why it must never live on 2811 // nav itself. 2812 if (nav.style.getPropertyValue('backdrop-filter') || nav.style.getPropertyValue('-webkit-backdrop-filter')) { 2813 nav.style.removeProperty('backdrop-filter'); 2814 nav.style.removeProperty('-webkit-backdrop-filter'); 2815 } 2816 // "Transparent" (data-persist-nav-always-transparent, HP-3558 round 2817 // 16) â the non-sticky counterpart of scroll-bg above. "Useful over a 2818 // hero image" only holds if nav visually overlaps whatever follows 2819 // it, so lift it out of flow the same way Sticky's own 2820 // position:fixed/sticky already does, rather than leaving it 2821 // position:static (which just reveals blank page background above 2822 // the hero, not the hero itself â see iframe-script/utils.ts's
2823 // ensureNavScrollBackground for the matching editor-side comment). 2824 var alwaysTransparent = nav.hasAttribute('data-persist-nav-always-transparent'); 2825 if (alwaysTransparent) { 2826 var navCsForOverlay = window.getComputedStyle(nav); 2827 if (!navCsForOverlay || (navCsForOverlay.position !== 'fixed' && navCsForOverlay.position !== 'sticky')) { 2828 nav.style.position = 'absolute'; 2829 nav.style.top = '0px'; 2830 nav.style.left = '0px'; 2831 nav.style.right = '0px'; 2832 if (!nav.style.zIndex) nav.style.zIndex = '1000'; 2833 } 2834 } 2835 // Blur needs no scroll-reactivity â a blurred OPAQUE background 2836 // looks identical to an unblurred one, so it's simplest and correct 2837 // to apply it once, unconditionally, regardless of scroll state. 2838 // Applied to a dedicated decorative layer BEHIND nav's real 2839 // content, never to nav itself â backdrop-filter promotes whatever 2840 // element carries it into a new containing block for any 2841 // position:fixed descendant, which silently shrank the full-screen/ 2842 // bottom-drawer hamburger panel (both position:fixed) down to nav's 2843 // own small box instead of the viewport when it lived on nav 2844 // directly (HP-3558 round 15 follow-up: "the full-screen hamburger 2845 // menu... ended up being covered by the next section"). 2846 var blur = nav.getAttribute('data-persist-nav-scroll-blur'); 2847 if (blur) { 2848 var blurLayer = nav.querySelector('[data-persist-nav-scroll-blur-layer]'); 2849 if (!blurLayer) { 2850 blurLayer = document.createElement('div'); 2851 blurLayer.setAttribute('data-persist-nav-scroll-blur-layer', ''); 2852 // z-index:-1 required â without it, backdrop-filter's own 2853 // compositing samples nav's LATER siblings (logo/links/CTA) too, 2854 // visibly blurring them despite painting after this layer in 2855 // plain DOM order. Safe from escaping behind nav's own box into 2856 // the page below because Sticky header always sets an explicit, 2857 // non-auto nav.style.zIndex â position:fixed/sticky + a non-auto 2858 // z-index already makes nav its own stacking context. 2859 blurLayer.style.cssText = 'position:absolute;inset:0;pointer-events:none;z-index:-1;'; 2860 nav.insertBefore(blurLayer, nav.firstChild); 2861 var navCs = window.getComputedStyle(nav); 2862 if (!navCs || navCs.position === 'static' || !navCs.position) nav.style.position = 'relative'; 2863 } 2864 // Self-heal a layer saved before the z-index fix landed (see 2865 // iframe-script/utils.ts's ensureNavScrollBackground for the 2866 // matching editor-side comment). 2867 if (blurLayer.style.zIndex !== '-1') blurLayer.style.zIndex = '-1'; 2868 blurLayer.style.setProperty('backdrop-filter', 'blur(' + blur + ')', 'important'); 2869 blurLayer.style.setProperty('-webkit-backdrop-filter', 'blur(' + blur + ')', 'important'); 2870 } 2871 if (alwaysTransparent) { 2872 nav.style.setProperty('background-color', 'transparent', 'important'); 2873 return; 2874 } 2875 var color = nav.getAttribute('data-persist-nav-scroll-bg'); 2876 if (!color || nav.__hpNavScrollWired) return; 2877 nav.__hpNavScrollWired = true; 2878 function sync() { 2879 nav.style.setProperty('background-color', window.scrollY > 24 ? color : 'transparent', 'important'); 2880 } 2881 window.addEventListener('scroll', sync, { passive: true }); 2882 sync(); 2883 })(navs[i]); 2884 } 2885} 2886 2887function boot() { 2888 wireSubmenus(); 2889 wireMobileMenu(); 2890 wireScrollBackground(); 2891} 2892 2893if (document.readyState === "loading") { 2894 document.addEventListener("DOMContentLoaded", boot); 2895} else { 2896 boot(); 2897} 2898 2899})(); 2900</script>
2900<script data-htmlpub-dtr> 2901(function(){ 2902if(false)return; 2903var params=new URLSearchParams(location.search); 2904if(!params.toString())return; 2905function run(){ 2906var MAX=500; 2907var replacements=[]; 2908function strip(s){return s.replace(/<[^>]*>/g,"");} 2909function clean(s){try{s=decodeURIComponent(s);}catch(e){}s=strip(s);if(s.length>MAX)s=s.slice(0,MAX);return s;} 2910function replace(el,val,param){ 2911if(!el||!val)return; 2912var orig=el.textContent||""; 2913var cleaned=clean(val); 2914if(cleaned===orig)return; 2915el.setAttribute("data-dtr-original",orig); 2916el.textContent=cleaned; 2917replacements.push({param:param,target:el.tagName.toLowerCase()+(el.id?"#"+el.id:""),original:orig,replacement:cleaned}); 2918} 2919// 1. Explicit data-dtr attributes 2920var dtrMap={headline:"utm_headline",subheadline:"utm_subheadline",cta:"utm_cta"}; 2921var explicitFound={}; 2922for(var key in dtrMap){ 2923var pv=params.get(dtrMap[key]); 2924if(pv){ 2925var els=document.querySelectorAll('[data-dtr="'+key+'"]'); 2926if(els.length>0){ 2927explicitFound[key]=true; 2928for(var i=0;i<els.length;i++)replace(els[i],pv,dtrMap[key]); 2929} 2930} 2931} 2932// 2. Custom data-dtr-param attributes 2933var customEls=document.querySelectorAll("[data-dtr-param]"); 2934for(var j=0;j<customEls.length;j++){ 2935var pn=customEls[j].getAttribute("data-dtr-param"); 2936if(pn){var cv=params.get(pn);if(cv)replace(customEls[j],cv,pn);} 2937} 2938// 3. Auto-detect fallback for standard params (only if no explicit match) 2939if(!explicitFound.headline){ 2940var hv=params.get("utm_headline"); 2941if(hv){var h1=document.querySelector("h1");if(h1)replace(h1,hv,"utm_headline");} 2942} 2943if(!explicitFound.subheadline){ 2944var sv=params.get("utm_subheadline"); 2945if(sv){var sub=document.querySelector("h2")||document.querySelector(".subtitle")||document.querySelector(".subheadline");if(sub)replace(sub,sv,"utm_subheadline");} 2946} 2947if(!explicitFound.cta){ 2948var cv2=params.get("utm_cta"); 2949if(cv2){var btn=document.querySelector('a.cta,button.cta,a[class*="cta"],button[class*="cta"]')||document.querySelector("a.btn,button.btn,a.button,button[type=submit]")||document.querySelector('a[href]:not([href^="#"]):not([href^="mailto"]):not([href^="tel"])>span,a[href]:not([href^="#"]):not([href^="mailto"]):not([href^="tel"])')||document.querySelector("button");if(btn)replace(btn,cv2,"utm_cta");} 2950} 2951// 4. Generic dtr_* prefix params 2952params.forEach(function(val,key){ 2953if(key.indexOf("dtr_")===0){ 2954var slug=key.slice(4); 2955var targets=document.querySelectorAll('[data-dtr-param="'+key+'"]'); 2956if(targets.length>0){for(var k=0;k<targets.length;k++)replace(targets[k],val,key);} 2957} 2958}); 2959// Fire analytics event 2960if(replacements.length===0)return; 2961var PID="bthr9fgjr4tunfrsf2zhq0ba"; 2962var API="https://htmlpub.com"+"/api/analytics/collect"; 2963function vid(){try{return localStorage.getItem("_hp_vid")||""}catch(e){return""}} 2964function sid(){try{return sessionStorage.getItem("_hp_sid")||""}catch(e){return""}} 2965var ev={pageId:PID,eventType:"dtr_applied",visitorId:vid(),sessionId:sid(),payload:{replacements:replacements},timestamp:Date.now()}; 2966var body=JSON.stringify({events:[ev]}); 2967try{if(navigator.sendBeacon){navigator.sendBeacon(API,new Blob([body],{type:"text/plain"}));} 2968else{fetch(API,{method:"POST",headers:{"Content-Type":"application/json"},body:body,keepalive:true}).catch(function(){});}}catch(e){} 2969} 2970if(document.readyState==="loading"){document.addEventListener("DOMContentLoaded",run);}else{run();} 2971})(); 2972</script>
2972<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:'a44560d508bff60a',t:'MTc5MDk2MTYzMQ=='};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>
2972</body></html><!-- v5.1.13 -->
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.