PageSourceSearch

https://platform.heyo.com/register

html heyo.com collected 2026-09-25 02:55:13 UTC 26,634 bytes, 517 lines download raw bytes

1<!DOCTYPE html>
2<html lang="en">
3<head>
4  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  <meta charset="utf-8">
5  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6  <title>Heyo Platform Register</title>
7  <meta name="Description" content="The Heyo Platform enables brands, small businesses, agencies and publishes to create, publish and run social media promotions including photo contests, video contests, sweepstakes and other promotions apps for Facebook that enable our clients to engage customers on Facebook and other social media networks." />
8  <meta name="keywords" content="video contest, video contests, photo contest, photo contests, sweepstakes, promotions apps for Facebook, self-service promotions platform, build promotions, Facebook promotions, viral promotions, create promotions, publish promotions, promotions apps" />
9  <link rel="icon" type="image/x-icon" href="https://d29lj5hr15j4oc.cloudfront.net/Heyo.Favicon.410.ico?v=1527588575">
10  <!-- Bootstrap 5 CSS -->
11  <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
12  <!-- Font Awesome -->
13  <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.2/css/all.min.css" rel="stylesheet">
14  <!-- flatpickr -->
15  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
16  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/themes/material_green.css">
17  <!-- Custom CSS (versioned) -->
18  <link rel="stylesheet" type="text/css" href="https://dcveehzef7grj.cloudfront.net/css/common/socialcommentapp.css?v=1790304913" />
19    <link rel="stylesheet" type="text/css" href="https://dcveehzef7grj.cloudfront.net/css/common/heyo.css?v=1790304913" />
20        <style type="text/css">
21        html, body#login_users, body#resetpassword_users{height:100%;}
22        body.unified-social-platform{display:flex;flex-direction:column;background-color:#f8f9fa;}
23        main.main-content{flex-grow:1;display:flex;align-items:center;justify-content:center;padding:2rem;}
24
25        .containerwrap{width:100%;}
26        .containerwrap .contcard{border:1px solid #e2e8f0;border-radius:0.75rem;box-shadow:0 4px 6px -1px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.1);padding:2rem;background-color:#ffffff;}
27        .containerwrap .headertxt{font-size:24px;font-weight:700;color:#1e293b;}
28        .containerwrap .subheadertxt{font-size:14px;color:rgb(75, 85, 99);margin-bottom:1.5rem;}
29        .containerwrap .form-label{font-weight:500;color:#334155;}
30        .containerwrap .form-label .text-danger{font-weight:normal;}
31        .containerwrap .password-wrapper{position:relative;}
32        .containerwrap #togglePassword{position:absolute;top:50%;right:1rem;transform:translateY(-50%);cursor:pointer;color:#64748b;}
33        .containerwrap #UserPswd{padding-right:2.5rem;}
34        .containerwrap .btn-primary{background:var(--inner-btns-bg);border:none;font-size:14px;font-weight:500;padding:0.75rem;}
35        .containerwrap .btn-primary:hover{opacity:0.9;background:var(--inner-btns-bg);}
36        .containerwrap .btn.disabled, .containerwrap .btn:disabled{background:var(--inner-btns-bg);}
37        .containerwrap .anchlink,.containerwrap .registerLnk a{font-size:14px;font-weight:500;}
38        .containerwrap .registerLnk{font-size:14px;text-align:center;}
39        .containerwrap #flashMessage.message{padding:1rem;margin-bottom:1.5rem;border:1px solid #ffecb5;border-radius:0.5rem;color:#664d03;background-color:#fff3cd;text-align:left;}
40
41        .captchaerr,.errorspan{font-size:13px;color:#FF0000;padding-top:5px;}
42
43        .form-grid{display:grid;grid-template-columns:repeat(2, 1fr);column-gap:16px;}
44        .form-grid .fullwid{grid-column:span 2;}
45        @media (max-width: 576px) {
46            main.main-content {
47                padding: 1rem;
48            }
49            .containerwrap .contcard {
50                padding: 1.5rem;
51            }
52        }
53        @media (min-width: 448px) {
54            .containerwrap{width:448px;}
55        }
56        @media (min-width: 810px) {
57            .reg-container{width:810px;}
58        }
59    </style>
60      <style>
61    body {
62      font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
63    }
64    .footer {
65      background-color: #ffffff;
66      padding: 1.5rem 0;
67      font-size: 14px;
68      color: #6c757d;
69      border-top: 1px solid #e9ecef;
70    }
71    .footer a {
72        text-decoration: underline;
73        margin: 0 0.5rem;
74    }
75    .footer a:hover {
76        text-decoration: underline;
77    }
78    .gdpr-compliant {
79        display: inline-flex;
80        align-items: center;
81    }
82    .gdpr-compliant .fa-shield-halved {
83        margin-right: 0.5rem;
84        color: #334155;
85    }
86    .campaign-title-standalone h2 strong {
87        font-weight: 700;
88    }
89    .type-badge-alt.retweet,
90    .type-badge-alt.repost,
91    .type-badge-alt.retweets,
92    .type-badge-alt.quoted_tweet,
93     .type-badge-alt.quoted_post,
94    .type-badge-alt.quotes {
95        background-color: #f3f4f6; /* gray-100 */
96        color: #374151; /* gray-700 */
97    }
98
99    .type-badge-alt.reply,
100    .type-badge-alt.replies {
101        background-color: #f3f4f6; /* gray-100 */
102        color: #374151; /* gray-700 */
103    }
104    .type-badge-alt.comment, .type-badge-alt.comments {
105        background-color: #e0f2fe; /* sky-100 */
106        color: #0c4a6e; /* sky-800 */
107    }
108    .type-badge-alt.reaction, .type-badge-alt.reactions {
109        background-color: #dbeafe; /* blue-100 */
110        color: #1e40af; /* blue-800 */
111    }
112    .type-badge-alt.like, .type-badge-alt.likes {
113        background-color: #fee2e2; /* red-100 */
114        color: #991b1b; /* red-800 */
115    }
116    .twitter-stats-grid .stat-item {
117        border-bottom: none;
118        padding-top: 0.25rem;
119        padding-bottom: 0.25rem;
120    }
121    .stat-item:last-child {
122        border-bottom: none;
123    }
124    .tooltip.tooltip-wide {
125      --bs-tooltip-max-width: 350px;
126    }
127  </style>
128    <!-- Google Tag Manager -->
129    
129<script>
vendor: 343 bytes, lines 129-133
129(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
130    new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
131    j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
132    'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
133    })(window,document,'script','dataLayer','
133GTM-MMSF64TX
vendor: 3 bytes, line 133
133');
133</script>
133
134    <!-- End Google Tag Manager -->
135  </head>
136<body class="unified-social-platform" id="add_users">
137    <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 137-138
137
138    <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
138GTM-MMSF64TX
vendor: 91 bytes, lines 138-140
138"
139    height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
140    
140<!-- End Google Tag Manager (noscript) -->
141        <div class="navheader">
142      <div class="header-bar">
143          <!-- Left: Logo -->
144          <div class="header-left">
145              <a href="/campaigns" class="brandlogo">
146                                        <img src="/img/heyo/heyo_icon_orange.png?v=1" alt="" class="prebrandlogoimg me-2" role="presentation">
147                                        <img src="/img/heyo/logo_heyo.png?v=1" alt="Heyo" class="brandlogoimg">
148              </a>
149          </div>
150          
151                </div>
152    </div>
153        <!-- Main content card comes below (handled in view) -->
154    <main class="main-content">
155        	
156<div class="reg-container containerwrap">
157    <div class="card reg-card contcard">
158                <div class="text-center mb-4">
159            <h1 class="reg-header headertxt">Create Your Account</h1>
160            <p class="reg-subheader subheadertxt d-none">Access your dashboard and campaigns</p>
161        </div>
162        <form action="/register" autocomplete="off" id="UserAddForm" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="POST"/><input type="hidden" name="data[_Token][key]" value="ee6946e21676dac27492d537a47a697ef9765d20f44f94cddf71adda899c1d9fa20e2e1d6febfded97f41d416d9f77461f987ae2afed3189ed01d73786341a94" id="Token437888663" autocomplete="off"/></div>            <div class="d-none hiddeninputs">
163                <input type="hidden" value="register" id="origin" name="origin">
164                <input type="hidden" value="409" id="UserPlan1" name="data[User][plan]">
165                <input type="hidden" name="data[User][cemail]" type="text" id="UserCemail"/><input type="hidden" name="data[User][cpswd]" type="password" id="UserCpswd"/><input type="hidden" name="data[Contestantfield][field1]" type="text" id="ContestantfieldField1"/>            </div>
166            <div class="form-grid">
167                <div class="mb-3">
168                    <label for="UserFirstName" class="form-label">First Name<span class="text-danger">*</span></label>
169                    <input name="data[User][first_name]" class="form-control" required="required" type="text" id="UserFirstName"/>                </div>
170                <div class="mb-3">
171                    <label for="UserLastName" class="form-label">Last Name<span class="text-danger">*</span></label>
172                    <input name="data[User][last_name]" class="form-control" required="required" type="text" id="UserLastName"/>                </div>
173                <div class="mb-3">
174                    <label for="UserEmail" class="form-label">Email Address<span class="text-danger">*</span></label>
175                    <input name="data[User][email]" class="form-control" required="required" maxlength="255" type="email" id="UserEmail"/>                </div>
176                <div class="mb-3">
177                    <label for="UserPswd" class="form-label">Password<span class="text-danger">*</span></label>
178                    <div class="password-wrapper">
179                        <input name="data[User][pswd]" class="form-control" required="required" id="UserPswd" type="password"/>                        <i class="fa-regular fa-eye-slash" id="togglePassword"></i>
180                    </div>
181                </div>
182                                <div class="mb-3">
183                    <label for="ContestantfieldField10" class="form-label">How did you hear about HEYO?<span class="text-danger">*</span></label>
184                    <select name="data[Contestantfield][field10]" class="form-select" required="required" id="ContestantfieldField10">
185<option value="">Select</option>
186<option value="Blog">Blog</option>
187<option value="Search">Search</option>
188<option value="Word of mouth">Word of mouth</option>
189<option value="From a promotion or campaign">From a promotion or campaign</option>
190</select>                </div>
191                <div class="mb-3">
192                    <label for="ContestantfieldField11" class="form-label">What is your budget?<span class="text-danger">*</span></label>
193                    <select name="data[Contestantfield][field11]" class="form-select" required="required" id="ContestantfieldField11">
194<option value="">Select</option>
195<option value="Less than $250">Less than $250</option>
196<option value="$250 - $500">$250 - $500</option>
197<option value="$500 - $1,000">$500 - $1,000</option>
198<option value="$1,000 - $10,000">$1,000 - $10,000</option>
199<option value="Over $10,000">Over $10,000</option>
200</select>                </div>
201                <div class="mb-3 fullwid" id="cmpgTyp">
202                    <label for="ContestantfieldField12" class="form-label">Which campaign type are you interested in running?<span class="text-danger">*</span></label>
203                    <select name="data[Contestantfield][field12]" class="form-select" required="required" id="ContestantfieldField12">
204<option value="">Select</option>
205<option value="Want to Enter Sweepstakes">I want to enter a Sweepstakes</option>
206<option value="Sweepstakes">Sweepstakes</option>
207<option value="Photo Contest">Photo Contest</option>
208<option value="Video Contest">Video Contest</option>
209<option value="Quiz">Quiz</option>
210<option value="Poll">Poll</option>
211<option value="Landing Page">Landing Page</option>
212<option value="Other Campaign Type">Other Campaign type</option>
213</select>                </div>
214                <div class="mb-3 d-none" id="othCmpgTyp">
215                    <label for="ContestantfieldField13" class="form-label">Other Campaign Type<span class="text-danger">*</span></label>
216                    <input name="data[Contestantfield][field13]" class="form-control" type="text" id="ContestantfieldField13"/>                    <span class="errorspan d-none">Please enter a value to proceed.</span>
217                </div>
218                            </div>
219            <!-- Captcha Section -->
220                            <div class="mb-3" id="captcha-section">
221                                            <label class="form-label">Verification <span class="text-danger">*</span></label>
222                        <div class="d-flex justify-content-start">
223                            <div class="h-captcha" data-sitekey="3071b2a1-e62d-4d3e-8fbb-fa9548651567"></div>
224                        </div>
225                        
225<script src='https://js.hcaptcha.com/1/api.js' async defer></script>
225
226                                        <span class="captchaerr d-none">Please solve the captcha.</span>
227                </div>
228                        <div class="mb-3">
229                <div class="form-check">
230                    <input type="hidden" name="data[User][optin]" id="UserOptin_" value="0"/><input type="checkbox" name="data[User][optin]" class="form-check-input border border-dark" value="1" id="UserOptin"/>    				<label for="UserOptin" class="form-label">Get the latest news and updates from Heyo.</label>
231                    <div class="fs12px w-100">
232                        Your data will only be used for the administration of the campaigns you create on Heyo. Specifically, it will be used to notify you of new entries in a contest, sweepstakes or other interactive marketing campaign. If you opt-in to receive email marketing from Heyo, you are agreeing to receive further marketing emails from us. We promise we will never share or sell your data with 3rd parties.
233                    </div>
234                </div>
235            </div>
236            <div class="mb-3">
237                <div class="form-check">
238                    <input type="hidden" name="data[User][tos]" id="UserTos_" value="0"/><input type="checkbox" name="data[User][tos]" class="form-check-input border border-dark" required="required" value="1" id="UserTos"/>                    <label for="UserTos" class="form-label">
239                        I agree to the Heyo <a href='https://www.heyo.com/terms' target='_blank'>Terms of Service</a> and <a href='https://www.heyo.com/privacy' target='_blank'>Privacy Policy</a>.                    </label>
240                </div>
241            </div>
242            <div class="d-flex justify-content-center my-3">
243                 <button type="submit" class="btn btn-primary btn-lg text-white">
244                    <i class="fa-solid fa-user-plus me-2"></i>Create Your Account
245                </button>
246            </div>
247            <div class="text-center">
248                <a href="/login" class="login-link anchlink">Back to Login</a>
249            </div>
250            <hr class="my-3">
251            <div class="text-center text-muted small" style="font-size: 12px;">
252                <span class="text-danger">*</span> Required field
253            </div>
254        <div style="display:none;"><input type="hidden" name="data[_Token][fields]" value="1c179d0396d6b25b752a5928e90f1f03a8184a67%3AContestantfield.field1%7CUser.cemail%7CUser.cpswd" id="TokenFields996942662" autocomplete="off"/><input type="hidden" name="data[_Token][unlocked]" value="" id="TokenUnlocked1905775866" autocomplete="off"/></div></form>    </div>
255</div>
256<script type="text/javascript" src="https://dcveehzef7grj.cloudfront.net/js/libs/fp2_2.1.0.min.js?v=700"></script>
vendor: 1 bytes, line 256
256
257<script type="text/javascript">
258    document.addEventListener('DOMContentLoaded', function() {
259        const togglePassword = document.querySelector('#togglePassword');
260        const password = document.querySelector('#UserPswd'); // Updated selector for CakePHP ID
261
262        if(togglePassword && password) {
263            togglePassword.addEventListener('click', function (e) {
264                // toggle the type attribute
265                const type = password.getAttribute('type') === 'password' ? 'text' : 'password';
266                password.setAttribute('type', type);
267                // toggle the icon
268                this.classList.toggle('fa-eye-slash');
269                this.classList.toggle('fa-eye');
270            });
271        }
272
273        document.querySelector('#UserAddForm').addEventListener('submit', function(event) {
274            event.preventDefault();
275            const UserAddForm = event.target;
276
277            document.querySelector("#captcha-section .captchaerr").classList.add("d-none");
278            if(document.querySelector("textarea[name='g-recaptcha-response']").value == ""){
279                event.preventDefault();
280                document.querySelector("#captcha-section .captchaerr").classList.remove("d-none");
281                return false;
282            }
283
284                        const campaignType = document.querySelector("#ContestantfieldField12");
285            if(campaignType.value == "Other Campaign Type" && document.querySelector("#ContestantfieldField13").value == ""){
286                event.preventDefault();
287                document.querySelector("#othCmpgTyp .errorspan").classList.remove("d-none");
288                return false;
289            }
290            
291            UserAddForm.querySelector("#UserCemail").value = UserAddForm.querySelector("#UserEmail").value;
292            UserAddForm.querySelector("#UserCpswd").value = UserAddForm.querySelector("#UserPswd").value;
293
294            UserAddForm.querySelector('button[type=submit]').setAttribute('disabled', 'disabled');
295            UserAddForm.submit();
296        });
297
298        document.addEventListener("visibilitychange", function () {
299            if (document.visibilityState === 'visible') {
300                // The page is becoming visible again (e.g., back button or tab switch)
301                document.querySelector('#UserAddForm button[type=submit]').removeAttribute('disabled');
302            }
303        });
304
305                const campaignType = document.querySelector("#ContestantfieldField12");
306        toggleOtherCampaignType(campaignType);
307
308        campaignType.addEventListener("change", function(){
309            toggleOtherCampaignType(campaignType);
310        });
311            });
312
313        function toggleOtherCampaignType(campaignType){
314        const campaignTypeCont      = document.querySelector("#cmpgTyp");
315        const otherCampaignTypeCont = document.querySelector("#othCmpgTyp");
316
317        campaignTypeCont.classList.add('fullwid');
318        otherCampaignTypeCont.classList.add('d-none');
319
320        if(campaignType.value == "Other Campaign Type"){
321            campaignTypeCont.classList.remove('fullwid');
322            otherCampaignTypeCont.classList.remove('d-none');
323        }
324    }
325    
326    let _ipAddress = "";
327            function getIP() {
328            fetch('/getip.php', {
329                method: 'GET',
330                headers: {
331                    'Accept': 'application/json'
332                },
333                cache: 'no-store'
334            })
335            .then(response => response.json())
336            .then(ipAddress => {
337                // Handle undefined ipAddress
338                if (typeof ipAddress === 'undefined') {
339                    ipAddress = { ip: '181.215.65.70' };
340                } else {
341                    // If memCacheCaptchaKey exists, perform actions
342                    if (typeof ipAddress['memCacheCaptchaKey'] !== 'undefined') {
343                        const captchaElement = document.getElementById('PsYhx4s9B');
344                        if (captchaElement) {
345                            captchaElement.value = ipAddress['memCacheCaptchaKey'];
346                            uniqueKeyIdentifier = ipAddress['memCacheCaptchaKey'];
347                            refreshCaptcha();
348                        }
349                    }
350                }
351
352                // Handle the vtg_vck cookie
353                if (!getCookie("vtg_vck")) {
354                    let tmpCkValue = Date.now();
355                    if (ipAddress.vtgVck !== undefined) {
356                        tmpCkValue = ipAddress.vtgVck;
357                    }
358
359                    // Set the cookie
360                    setCookie("vtg_vck", tmpCkValue, 1); // expires in 1 day
361                }
362
363                _ipAddress = ipAddress['ip'];
364                setIPforFingerPrint();
365            })
366            .catch(error => {
367                console.log("Error fetching IP: ", error);
368            });
369        }
370
371        // Function to get a cookie value by name
372        function getCookie(name) {
373            const value = `; ${document.cookie}`;
374            const parts = value.split(`; ${name}=`);
375            if (parts.length === 2) return parts.pop().split(';').shift();
376            return null;
377        }
378
379        // Function to set a cookie with a specific name, value, and expiry in days
380        function setCookie(name, value, days) {
381            const d = new Date();
382            d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000)); // Set expiry time
383            const expires = "expires=" + d.toUTCString();
384            document.cookie = `${name}=${value}; ${expires}; path=/`;
385        }
386
387        document.addEventListener('DOMContentLoaded', function() {
388            getIP();
389        });
390    
391    function setIPforFingerPrint(){
392        if (window.requestIdleCallback) {
393            requestIdleCallback(function () {
394                initFP();
395            });
396        } else {
397            setTimeout(function () {
398                initFP();
399            }, 500);
400        }
401    }
402
403    function  initFP(){
404    	const options = {
405    		extraComponents : [{key: 'ip',
406    			getData: function (done, options) {
407    				done(_ipAddress);
408				}
409			}]
410		};
411		Vtgfp2.get(options,function (components) {
412			const result = Vtgfp2.x64hash128(components.map(function (pair) { return pair.value }).join(), 31);
413            fetch("/sections/encryptfingerprint/"+result, {
414                method: 'POST',
415                headers: {
416                    'Content-Type': 'application/json',
417                    'X-Requested-With': 'XMLHttpRequest'
418                },
419                cache: 'no-cache',
420            })
421            .then(response => response.json())
422            .then(data => {
423                console.log("success.");
424            })
425            .catch(error => {
426                console.log('Oops, something bad happened and the fetch call failed!');
427            });
428		});
429	}
430</script>
430    </main>
431    <footer class="footer mt-auto">
432        <div class="container text-center">
433                            <span class="copy mb-2 d-inline-block">2010 - 2026 All Rights Reserved, a Votigo Company</span><br />
434                <a href="https://www.heyo.com/" target="_blank">heyo</a> &middot;
435                <a href="https://blog.heyo.com/" target="_blank">blog</a> &middot;
436                <a href="https://www.heyo.com/terms" target="_blank">tos</a> &middot;
437                <a href="https://www.heyo.com/privacy" target="_blank">privacy</a> &middot;
438                <a href="https://www.heyo.com/eula" target="_blank">eula</a>
439                        <div class="mt-2">
440                <div class="gdpr-compliant d-inline-flex align-items-center">
441                    <i class="fa-solid fa-shield-halved me-2"></i>
442                    <span>GDPR Compliant</span>
443                </div>
444            </div>
445        </div>
446    </footer>
447    <!-- Bootstrap 5 JS Bundle -->
448    
448<script src="https://dcveehzef7grj.cloudfront.net/js/2.0/bootstrap.bundle.min.js"></script>
448
449    <!-- Zepto.js -->
450    
450<script src="https://dcveehzef7grj.cloudfront.net/js/2.0/zepto.min.js"></script>
450
451    <!-- Process readyQueue -->
452    
452<script>
453    $(function() {
454        if (window.readyQueue) {
455            for (var i = 0; i < window.readyQueue.length; i++) {
456                window.readyQueue[i]();
457            }
458        }
459    });
460    </script>
460
461    <!-- flatpickr -->
462    
462<script src="https://dcveehzef7grj.cloudfront.net/js/2.0/flatpickr.js"></script>
462
463    <!-- Custom JS (versioned) -->
464    
464<script src="https://dcveehzef7grj.cloudfront.net/js/socialcommentapp.js?v=1790304913"></script>
464
465            
465<script>
466        // Mobile navigation toggle
467        function toggleMobileNav() {
468            const mobileNav = document.getElementById('mobileNav');
469            mobileNav.classList.toggle('show');
470        }
471        // Active state management for sub-navigation
472        document.addEventListener('DOMContentLoaded', function() {
473            const subNavLinks = document.querySelectorAll('.sub-nav .nav-link');
474            subNavLinks.forEach(link => {
475                link.addEventListener('click', function(e) {
476                    e.preventDefault();
477                    // Remove active class from all links
478                    subNavLinks.forEach(l => l.classList.remove('active'));
479                    // Add active class to clicked link
480                    this.classList.add('active');
481                });
482            });
483            // Main navigation hover effects
484            const mainNavLinks = document.querySelectorAll('.nav-link-custom');
485            mainNavLinks.forEach(link => {
486                link.addEventListener('mouseenter', function() {
487                    this.style.transform = 'translateY(-1px)';
488                });
489                link.addEventListener('mouseleave', function() {
490                    this.style.transform = 'translateY(0)';
491                });
492            });
493            
494        });
495    </script>
495
496          <!-- DataLayer Events -->
497     
497<script>
498        // Initialize dataLayer before GTM loads
499        window.dataLayer = window.dataLayer || [];
500        
501        // Push a page_view event with custom parameters.
502        // For these to be usable in GA4 reports, they must be registered
503        // as "Custom Definitions" in the Google Analytics UI.
504        dataLayer.push({
505            'event': 'page_view',
506            'partner_id': '410',
507            'partner_name': 'heyo',
508            'page_title': 'Platform Register',
509            'page_url': '/register',
510            'user_type': 'guest'
511        });
512
513        // Debug output
514        //console.log('GTM Data Layer:', JSON.stringify(window.dataLayer, null, 2));
515    </script>
515
516</body>
517</html>

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