PageSourceSearch

https://app.aclsnow.com/addons/default/themes/cpraed/js/cp-tracker.js?v=1

js aclsnow.com collected 2026-09-29 21:52:30 UTC 6,801 bytes, 171 lines download raw bytes

1(function () {
2    const COOKIE_NAME = 'cp_tracking';
3    const ORIGIN_HOST = window.location.origin;
4    let TRACKING_API_URL = 'https://app.cpraedcourse.com/track_visit';
5    if (ORIGIN_HOST.indexOf('gitview.net') !== -1) {
6        TRACKING_API_URL = `${ORIGIN_HOST}/track_visit`;
7    }
8
9    function generateUUID() {
10        return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, c =>
11            (c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)
12        );
13    }
14
15    function getCookie(name) {
16        const value = `; ${document.cookie}`;
17        const parts = value.split(`; ${name}=`);
18        if (parts.length === 2) return decodeURIComponent(parts.pop().split(';').shift());
19    }
20
21    function setCookie(name, value, days = 7) {
22        const expires = new Date(Date.now() + days * 864e5).toUTCString();
23        document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax`;
24    }
25
26    function parseDeviceInfo() {
27        const ua = navigator.userAgent;
28        let browser = 'Unknown', version = '', os = 'Unknown', device = 'Desktop';
29
30        if (/Chrome/.test(ua)) {
31            browser = 'Chrome';
32            version = ua.match(/Chrome\/([\d.]+)/)?.[1];
33        } else if (/Firefox/.test(ua)) {
34            browser = 'Firefox';
35            version = ua.match(/Firefox\/([\d.]+)/)?.[1];
36        } else if (/Safari/.test(ua) && !/Chrome/.test(ua)) {
37            browser = 'Safari';
38            version = ua.match(/Version\/([\d.]+)/)?.[1];
39        } else if (/Edge/.test(ua)) {
40            browser = 'Edge';
41            version = ua.match(/Edg\/([\d.]+)/)?.[1];
42        }
43
44        if (/Windows/.test(ua)) os = 'Windows';
45        else if (/Mac/.test(ua)) os = 'MacOS';
46        else if (/Android/.test(ua)) os = 'Android';
47        else if (/iPhone|iPad|iPod/.test(ua)) os = 'iOS';
48
49        if (/Mobi|Android/i.test(ua)) device = 'Mobile';
50        else if (/iPad/.test(ua)) device = 'Tablet';
51
52        return {browser, version, os, device};
53    }
54
55    const safeCheckValue = (v) => {
56        if (v === null || v === undefined || v === '') return null;
57        return v;
58    };
59
60    let tracking = {};
61    let utm_data = JSON.parse(getCookie('utm_data') || '{}');
62    if (typeof utm_data === 'object' && utm_data !== null) {
63        tracking.utm_source = safeCheckValue(utm_data.utm_source);
64        tracking.utm_medium = safeCheckValue(utm_data.utm_medium);
65        tracking.utm_campaign = safeCheckValue(utm_data.utm_campaign);
66        tracking.utm_term = safeCheckValue(utm_data.utm_term);
67        tracking.utm_content = safeCheckValue(utm_data.utm_content);
68        tracking.gclid = safeCheckValue(utm_data.gclid);
69        tracking.fbclid = safeCheckValue(utm_data.fbclid);
70    }
71    try {
72        tracking = JSON.parse(getCookie(COOKIE_NAME) || '{}');
73    } catch (e) {
74    }
75
76    if (!tracking.tracking_id) {
77        tracking.tracking_id = generateUUID();
78        tracking.is_first_visit = 1;
79        tracking.send_status = false;
80        tracking.user_id = null;
81        tracking.user_id_saved = false;
82
83        const urlParams = new URLSearchParams(window.location.search);
84        const deviceInfo = parseDeviceInfo();
85
86        tracking.utm_source = urlParams.get('utm_source') ? urlParams.get('utm_source') : safeCheckValue(tracking.utm_source);
87        tracking.utm_medium = urlParams.get('utm_medium') ? urlParams.get('utm_medium') : safeCheckValue(tracking.utm_medium);
88        tracking.utm_campaign = urlParams.get('utm_campaign') ? urlParams.get('utm_campaign') : safeCheckValue(tracking.utm_campaign);
89        tracking.utm_term = urlParams.get('utm_term') ? urlParams.get('utm_term') : safeCheckValue(tracking.utm_term);
90        tracking.utm_content = urlParams.get('utm_content') ? urlParams.get('utm_content') : safeCheckValue(tracking.utm_content);
91        tracking.gclid = urlParams.get('gclid') ? urlParams.get('gclid') : safeCheckValue(tracking.gclid);
92        tracking.fbclid = urlParams.get('fbclid') ? urlParams.get('fbclid') : safeCheckValue(tracking.fbclid);
93        tracking.landing_page = window.location.href;
94        tracking.referrer = document.referrer || '';
95        tracking.browser = deviceInfo.browser;
96        tracking.browser_version = deviceInfo.version;
97        tracking.os = deviceInfo.os;
98        tracking.os_version = '';
99        tracking.device_type = deviceInfo.device;
100        tracking.screen_resolution = `${screen.width}x${screen.height}`;
101        tracking.user_agent = navigator.userAgent;
102        tracking.language = navigator.language;
103
104        const safeGet = (k) => {
105            const v = urlParams.get(k);
106            if (v === null) return undefined;
107            const s = String(v).trim().toLowerCase();
108            if (s === '' || s === 'null' || s === 'undefined') return undefined;
109            return v;
110        };
111
112        tracking.utm_source   = safeGet('utm_source');
113        tracking.utm_medium   = safeGet('utm_medium');
114        tracking.utm_campaign = safeGet('utm_campaign');
115        tracking.gclid        = safeGet('gclid');
116        tracking.fbclid       = safeGet('fbclid');
117
118        Object.keys(tracking).forEach(k => {
119            if (tracking[k] === null || tracking[k] === undefined || tracking[k] === '') {
120                delete tracking[k];
121            }
122        });
123
124        setCookie(COOKIE_NAME, JSON.stringify(tracking));
125    }
126
127    if (!tracking.send_status) {
128        const query = new URLSearchParams(tracking).toString();
129        const img = new Image();
130        img.onload = function () {
131            tracking.send_status = true;
132            setCookie(COOKIE_NAME, JSON.stringify(tracking));
133            trySyncUserId();
134        };
135        img.onerror = function () {
136            console.warn('Tracking pixel failed to load');
137        };
138        img.src = `${TRACKING_API_URL}?${query}`;
139    }
140
141    function trySyncUserId() {
142
143        if (typeof obj !== 'object' || !obj.ruid) return;
144
145        try {
146            tracking = JSON.parse(getCookie(COOKIE_NAME) || '{}');
147        } catch (e) {
148        }
149
150        if (!tracking.tracking_id || tracking.user_id_saved || !tracking.send_status) return;
151
152        fetch(`${TRACKING_API_URL}`, {
153            method: 'POST',
154            headers: {'Content-Type': 'application/json'},
155            body: JSON.stringify({
156                tracking_id: tracking.tracking_id,
157                user_id: obj.ruid
158            })
159        }).then(res => res.json())
160            .then(res => {
161                if (res.status === 'ok') {
162                    tracking.user_id = obj.ruid;
163                    tracking.user_id_saved = true;
164                    setCookie(COOKIE_NAME, JSON.stringify(tracking));
165                }
166            })
167            .catch(console.warn);
168    }
169
170    trySyncUserId();
171})();

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.